0Pricing
Linux Command Line & Bash Scripting Mastery · บทเรียน

การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์

ตรวจสอบอุปกรณ์บล็อก จัดการรายการใน fstab และเขียนสคริปต์สำหรับการดำเนินการกับ LVM และการเมานต์อย่างปลอดภัย

การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์ เป็นบทเรียน Linux Command Line & Bash Scripting Mastery ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Linux Command Line & Bash Scripting Mastery และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Linux Command Line & Bash Scripting Mastery มีบทเรียนทั้งหมด 4 บทเรียน

ทำความเข้าใจอุปกรณ์บล็อกด้วย lsblk และ fdisk

ก่อนทำงานดิสก์โดยอัตโนมัติ คุณต้องสามารถ ตรวจสอบว่าระบบมีอุปกรณ์บล็อกใดอยู่บ้าง เครื่องมือสำคัญสองรายการคือ lsblk และ fdisk -l

  • lsblk — แสดงรายการอุปกรณ์บล็อกในรูปแบบต้นไม้ พร้อมชื่ออุปกรณ์ ขนาด จุดเมานต์ และประเภท (ดิสก์ พาร์ทิชัน lvm)
  • fdisk -l — แสดงตารางพาร์ทิชันและรายละเอียดเซกเตอร์ (ต้องใช้สิทธิ์ root)
  • blkid — แสดง UUID และประเภทระบบไฟล์ของอุปกรณ์บล็อกแต่ละรายการ

ในสคริปต์ คุณมักต้องแยกวิเคราะห์ผลลัพธ์นี้เพื่อตรวจหาดิสก์ที่พร้อมใช้งาน ตรวจสอบว่าพาร์ทิชันได้รับการฟอร์แมตแล้วหรือไม่ หรือระบุ UUID ก่อนเมานต์

#!/usr/bin/env bash
# Inspect all block devices and their UUIDs
set -euo pipefail

echo '=== Block Device Tree ==='
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT,UUID

echo ''
echo '=== Partition Table Details ==='
sudo fdisk -l 2>/dev/null | grep -E '^Disk |^/dev/'

echo ''
echo '=== UUID Lookup via blkid ==='
sudo blkid | awk -F: '{print $1}' | while read -r dev; do
  uuid=$(sudo blkid -s UUID -o value "$dev" 2>/dev/null || echo 'N/A')
  fstype=$(sudo blkid -s TYPE -o value "$dev" 2>/dev/null || echo 'unknown')
  printf '%-20s UUID=%-38s TYPE=%s\n' "$dev" "$uuid" "$fstype"
done

ตรวจสอบพื้นที่ดิสก์ด้วย df และ du

df และ du เป็นเครื่องมือหลักสำหรับ รายงานการใช้งานระบบไฟล์และไดเรกทอรี ในสคริปต์ผู้ดูแลระบบ คุณใช้เครื่องมือเหล่านี้เพื่อเรียกใช้การแจ้งเตือน บังคับใช้โควตา หรือตัดสินใจว่าจะจัดสรรพื้นที่เพิ่มเมื่อใด

  • df -h — แสดงการใช้งานระบบไฟล์ทั้งหมดที่เมานต์อยู่ในรูปแบบที่อ่านเข้าใจง่าย
  • df -BG — แสดงผลเป็นกิกะไบต์เพื่อให้แยกวิเคราะห์ตัวเลขได้อย่างสม่ำเสมอ
  • du -sh /path — แสดงขนาดรวมของไดเรกทอรีที่ระบุ
  • du -d 1 /var — แจกแจงลึกลงไปหนึ่งระดับ (มีประโยชน์สำหรับค้นหาไดเรกทอรีย่อยที่มีขนาดใหญ่)

คอลัมน์ เปอร์เซ็นต์ที่ใช้ไป จาก df มักถูกแยกวิเคราะห์เพื่อเรียกใช้การแจ้งเตือนดิสก์เต็มในสคริปต์ตรวจติดตาม

#!/usr/bin/env bash
# Alert if any mounted filesystem exceeds a usage threshold
set -euo pipefail

THRESHOLD=80   # percent

echo 'Checking filesystem usage...'
df -h --output=source,pcent,target | tail -n +2 | while IFS= read -r line; do
  device=$(awk '{print $1}' <<< "$line")
  pct=$(awk '{print $2}' <<< "$line" | tr -d '%')
  mount=$(awk '{print $3}' <<< "$line")

  # Skip pseudo filesystems
  [[ "$device" == tmpfs* || "$device" == devtmpfs* ]] && continue

  if (( pct >= THRESHOLD )); then
    echo "WARNING: $device mounted at $mount is ${pct}% full" >&2
  else
    echo "OK: $device at $mount is ${pct}% used"
  fi
done

อ่านและแยกวิเคราะห์ /etc/fstab

/etc/fstab คือ ตารางระบบไฟล์แบบคงที่ ซึ่งกำหนดว่าอุปกรณ์ใดจะถูกเมานต์เมื่อบูต ที่เส้นทางใด และด้วยตัวเลือกใด แต่ละบรรทัดมีหกฟิลด์:

  • อุปกรณ์ — UUID=..., LABEL=... หรือ /dev/sdX
  • จุดเมานต์ — เส้นทางไดเรกทอรี
  • ประเภทระบบไฟล์ — ext4, xfs, nfs, tmpfs เป็นต้น
  • ตัวเลือก — defaults, ro, noexec, nofail เป็นต้น
  • Dump — 0 หรือ 1 (ตัวเลือกการสำรองข้อมูล)
  • Pass — 0, 1 หรือ 2 (ลำดับ fsck)

สคริปต์ที่ เพิ่มหรือตรวจสอบความถูกต้องของรายการใน fstab ต้องจัดการความคิดเห็น (บรรทัดที่ขึ้นต้นด้วย #) และบรรทัดว่างอย่างเหมาะสม ควรใช้ UUID แทนชื่ออุปกรณ์เสมอ เพื่อให้ระบบยังทำงานได้หลังรีบูตเมื่ออาจมีการเปลี่ยนลำดับอุปกรณ์

#!/usr/bin/env bash
# Parse /etc/fstab and display non-comment entries in a readable table
set -euo pipefail

FSTAB=/etc/fstab

printf '%-40s %-20s %-10s %s\n' 'DEVICE' 'MOUNTPOINT' 'FSTYPE' 'OPTIONS'
printf '%s\n' '-------------------------------------------------------------------------------------'

while IFS= read -r line; do
  # Skip blank lines and comments
  [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]] && continue

  read -r device mountpt fstype options _dump _pass <<< "$line"
  printf '%-40s %-20s %-10s %s\n' "$device" "$mountpt" "$fstype" "$options"
done < "$FSTAB"

การเพิ่มรายการใน fstab อย่างปลอดภัย

การแก้ไข /etc/fstab ด้วยตนเองมีโอกาสเกิดข้อผิดพลาดสูง รายการที่ไม่ถูกต้องอาจ ทำให้ระบบบูตไม่ได้ สคริปต์อัตโนมัติที่ปลอดภัยควรดำเนินการดังนี้:

  • ตรวจสอบว่ามีรายการดังกล่าวอยู่แล้วหรือไม่ก่อนเพิ่มรายการต่อท้าย (การทำงานซ้ำโดยให้ผลลัพธ์เดิม)
  • สำรองไฟล์ต้นฉบับก่อนการแก้ไขใด ๆ
  • ใช้ UUID แทนเส้นทางอุปกรณ์
  • เพิ่ม nofail ในตัวเลือกการเมานต์ เพื่อไม่ให้ดิสก์ที่หายไปทำให้การบูตหยุดชะงัก
  • เรียกใช้ mount -a ในโหมดจำลองการทำงานหรือเมานต์เพื่อทดสอบ เพื่อตรวจสอบความถูกต้องก่อนรีบูต

หลังเขียนรายการแล้ว ให้ตรวจสอบด้วย findmnt --verify เสมอ (คำสั่งนี้มีให้ใช้ในดิสทริบิวชันที่ใช้ systemd รุ่นใหม่) เพื่อดักจับข้อผิดพลาดทางไวยากรณ์ได้ทันที

#!/usr/bin/env bash
# Safely append a new entry to /etc/fstab (idempotent)
set -euo pipefail

DEVICE_PATH='/dev/sdb1'
MOUNTPOINT='/mnt/data'
FSTYPE='ext4'
OPTIONS='defaults,nofail'
FSTAB='/etc/fstab'

# Resolve UUID for stable identification
UUID=$(sudo blkid -s UUID -o value "$DEVICE_PATH")
if [[ -z "$UUID" ]]; then
  echo "ERROR: Could not resolve UUID for $DEVICE_PATH" >&2
  exit 1
fi

ENTRY="UUID=$UUID  $MOUNTPOINT  $FSTYPE  $OPTIONS  0  2"

# Idempotency: skip if UUID already referenced in fstab
if grep -qsF "UUID=$UUID" "$FSTAB"; then
  echo "INFO: fstab already contains UUID=$UUID — skipping."
  exit 0
fi

# Backup
cp -p "$FSTAB" "${FSTAB}.bak.$(date +%Y%m%d%H%M%S)"

# Create mountpoint if needed
sudo mkdir -p "$MOUNTPOINT"

# Append entry
echo "$ENTRY" | sudo tee -a "$FSTAB" > /dev/null
echo "INFO: Added: $ENTRY"

# Validate
sudo findmnt --verify --verbose || echo 'WARNING: findmnt verify reported issues'

การเมานต์และถอดเมานต์ระบบไฟล์ในสคริปต์

คำสั่ง mount และ umount ใช้งานไม่ซับซ้อน แต่สคริปต์ต้องรองรับกรณีพิเศษต่าง ๆ:

  • อุปกรณ์อาจ ถูกเมานต์อยู่แล้ว — การเมานต์ซ้ำจะล้มเหลว ให้ตรวจสอบด้วย findmnt หรือ mountpoint
  • จุดเมานต์อาจ กำลังถูกใช้งาน (มีไฟล์เปิดอยู่) — umount จะล้มเหลว ให้ใช้ lsof +D /mnt/target เพื่อค้นหาโปรเซสที่เป็นต้นเหตุ
  • ใช้ mount -o remount,ro /mnt/data เพื่อเปลี่ยนเป็นโหมดอ่านอย่างเดียวโดยไม่ต้องถอดเมานต์
  • ใช้ umount -l /mnt/data (แบบ lazy) เป็นทางเลือกสุดท้าย — คำสั่งจะแยกเนมสเปซออก แต่รอให้การอ้างอิงต่าง ๆ ปิดลงก่อน

ในงานอัตโนมัติ ให้ตรวจสอบรหัสการจบการทำงานของ mount เสมอ และบันทึกความล้มเหลวลง syslog ด้วย logger

#!/usr/bin/env bash
# Mount a device only if not already mounted; log outcome
set -euo pipefail

DEVICE='/dev/sdb1'
MOUNTPOINT='/mnt/data'

log() { logger -t disk-mount "$*"; echo "[$(date '+%F %T')] $*"; }

# Check if already mounted
if mountpoint -q "$MOUNTPOINT"; then
  log "INFO: $MOUNTPOINT is already mounted — nothing to do."
  exit 0
fi

# Ensure mountpoint directory exists
sudo mkdir -p "$MOUNTPOINT"

# Attempt mount
if sudo mount "$DEVICE" "$MOUNTPOINT"; then
  log "OK: Mounted $DEVICE at $MOUNTPOINT"
else
  log "ERROR: Failed to mount $DEVICE at $MOUNTPOINT"
  exit 1
fi

# Show what is now mounted there
df -h "$MOUNTPOINT"

บทนำสู่ LVM: ฟิสิคัลวอลุ่ม วอลุ่มกรุ๊ป และลอจิคัลวอลุ่ม

LVM (Logical Volume Manager) เพิ่มชั้นนามธรรมที่ยืดหยุ่นระหว่างอุปกรณ์บล็อกดิบกับระบบไฟล์ ลำดับชั้นสามระดับมีดังนี้:

  • ฟิสิคัลวอลุ่ม (PV) — ดิสก์ดิบหรือพาร์ติชันที่เริ่มต้นใช้งานด้วย pvcreate
  • วอลุ่มกรุ๊ป (VG) — PV อย่างน้อยหนึ่งรายการที่รวมพื้นที่เข้าด้วยกันด้วย vgcreate
  • ลอจิคัลวอลุ่ม (LV) — พาร์ติชันเสมือนที่แบ่งจาก VG ด้วย lvcreate ซึ่งเป็นสิ่งที่คุณจะฟอร์แมตและเมานต์

ข้อได้เปรียบสำคัญคือ คุณสามารถ ขยาย LV ขณะระบบออนไลน์ ได้โดยไม่ต้องถอดเมานต์ และเพิ่มดิสก์ใหม่ลงใน VG ได้โดยไม่ต้องฟอร์แมตใหม่ ทำให้ LVM เป็นสิ่งจำเป็นสำหรับการทำงานอัตโนมัติด้านพื้นที่จัดเก็บในระบบจริง

คำสั่งสำหรับตรวจสอบ: pvs, vgs, lvs และคำสั่งแบบละเอียดของคำสั่งเหล่านี้ ได้แก่ pvdisplay, vgdisplay, lvdisplay

การเขียนสคริปต์สร้างวอลุ่ม LVM

การตั้งค่า LVM แบบอัตโนมัติต้องทำตามลำดับที่แน่นอน: pvcreate → vgcreate → lvcreate → mkfs → mount แต่ละขั้นตอนต้องสำเร็จก่อนจึงจะเริ่มขั้นตอนถัดไปได้ ให้ใช้ set -euo pipefail และตรวจสอบผลลัพธ์ของแต่ละคำสั่ง

  • ตรวจสอบเสมอว่าดิสก์เป้าหมายไม่มีตารางพาร์ติชันเดิมก่อนเรียกใช้ pvcreate
  • ใช้แฟล็ก -y เพื่อปิดคำถามยืนยันแบบโต้ตอบในสคริปต์ที่ไม่มีผู้โต้ตอบ
  • ระบุ -L (ขนาดคงที่) หรือ -l 100%FREE เพื่อใช้พื้นที่ที่เหลือทั้งหมด
  • หลังใช้ mkfs ให้ใช้เส้นทางอุปกรณ์ของ LV: /dev/<vgname>/<lvname>
#!/usr/bin/env bash
# Automate LVM setup: PV -> VG -> LV -> mkfs -> mount
set -euo pipefail

DISK='/dev/sdc'          # raw disk, no existing partitions
VG_NAME='vg_appdata'
LV_NAME='lv_appdata'
LV_SIZE='10G'
MOUNTPOINT='/mnt/appdata'
FSTYPE='xfs'

echo "[1/6] Initializing Physical Volume on $DISK"
sudo pvcreate -y "$DISK"

echo "[2/6] Creating Volume Group: $VG_NAME"
sudo vgcreate "$VG_NAME" "$DISK"

echo "[3/6] Creating Logical Volume: $LV_NAME (${LV_SIZE})"
sudo lvcreate -y -L "$LV_SIZE" -n "$LV_NAME" "$VG_NAME"

echo "[4/6] Formatting as $FSTYPE"
sudo mkfs."$FSTYPE" "/dev/$VG_NAME/$LV_NAME"

echo "[5/6] Mounting at $MOUNTPOINT"
sudo mkdir -p "$MOUNTPOINT"
sudo mount "/dev/$VG_NAME/$LV_NAME" "$MOUNTPOINT"

echo "[6/6] Done. Disk usage:"
df -h "$MOUNTPOINT"

# Show LVM summary
vgs && lvs

การขยายลอจิคัลวอลุ่มขณะออนไลน์

หนึ่งในความสามารถที่ทรงพลังที่สุดของ LVM คือ การปรับขนาดขณะออนไลน์ — คุณสามารถขยายลอจิคัลวอลุ่มและระบบไฟล์ได้ขณะที่ระบบไฟล์นั้นเมานต์และกำลังใช้งานอยู่ ขั้นตอนมีดังนี้:

  1. ขยาย LV ด้วย lvextend (แฟล็ก -r จะปรับขนาดระบบไฟล์ในขั้นตอนเดียวกัน)
  2. หากไม่ได้ใช้ -r ให้ปรับขนาดระบบไฟล์แยกต่างหาก: ใช้ resize2fs สำหรับ ext4 และ xfs_growfs สำหรับ xfs

ข้อจำกัดสำคัญ:

  • xfs ขยายได้อย่างเดียวและย่อไม่ได้ — จึงต้องวางแผนความจุอย่างรอบคอบ
  • ext4 ย่อได้ แต่ต้องถอดเมานต์ก่อน
  • ตรวจสอบเสมอว่า VG มีพื้นที่ว่างด้วย vgdisplay -s ก่อนขยาย
#!/usr/bin/env bash
# Extend an LV and its xfs filesystem online
set -euo pipefail

VG_NAME='vg_appdata'
LV_NAME='lv_appdata'
EXTEND_BY='5G'
LV_DEV="/dev/$VG_NAME/$LV_NAME"

# Confirm VG has enough free space
FREE_GB=$(vgs --noheadings --units g -o vg_free "$VG_NAME" | tr -d ' g')
echo "VG free space: ${FREE_GB}G"
if (( $(echo "$FREE_GB < 5" | bc -l) )); then
  echo 'ERROR: Not enough free space in VG' >&2
  exit 1
fi

echo "Extending LV by $EXTEND_BY..."
sudo lvextend -L "+${EXTEND_BY}" "$LV_DEV"

echo 'Growing xfs filesystem online...'
sudo xfs_growfs "$LV_DEV"

echo 'New size:'
df -h "$LV_DEV"
lvs "$LV_DEV"

การสร้างและฟอร์แมตระบบไฟล์

หลังแบ่งพาร์ติชันหรือตั้งค่า LVM แล้ว คุณต้อง ฟอร์แมตอุปกรณ์บล็อกด้วยระบบไฟล์ ตัวเลือกที่ใช้กันทั่วไปในการดูแลระบบ Linux ได้แก่:

  • ext4 —成熟 ใช้เจอร์นัล และรองรับการย่อ ขณะเดียวกันเป็นค่าเริ่มต้นในดิสทริบิวชันจำนวนมาก (mkfs.ext4)
  • xfs — ประสิทธิภาพสูง เหมาะกับไฟล์ขนาดใหญ่และการรับส่งข้อมูลแบบขนาน เป็นค่าเริ่มต้นใน RHEL/CentOS (mkfs.xfs)
  • btrfs — ใช้การเขียนแบบคัดลอกเมื่อเขียน และมีสแนปชอตในตัว (mkfs.btrfs)
  • tmpfs — ใช้ RAM เป็นพื้นที่จัดเก็บ และระบุใน fstab โดยไม่ต้องใช้ mkfs

กำหนด ป้ายกำกับระบบไฟล์ ที่สื่อความหมายเสมอ (ด้วยแฟล็ก -L) เพื่อให้สามารถอ้างอิงอุปกรณ์ด้วย LABEL= ใน fstab เป็นทางเลือกสำรองจาก UUID

#!/usr/bin/env bash
# Format a partition and assign a label; print resulting UUID
set -euo pipefail

PARTITION='/dev/sdb1'
FSTYPE='ext4'
LABEL='appdata'

# Safety check: refuse to format a currently mounted device
if findmnt --source "$PARTITION" > /dev/null 2>&1; then
  echo "ERROR: $PARTITION is currently mounted. Unmount first." >&2
  exit 1
fi

echo "Formatting $PARTITION as $FSTYPE with label '$LABEL'..."
sudo mkfs."$FSTYPE" -L "$LABEL" -F "$PARTITION"

# Retrieve and display the new UUID
NEW_UUID=$(sudo blkid -s UUID -o value "$PARTITION")
echo "Formatted successfully."
echo "Label : $LABEL"
echo "UUID  : $NEW_UUID"
echo "Use this in fstab: UUID=$NEW_UUID  /mnt/$LABEL  $FSTYPE  defaults,nofail  0  2"

การทำเมานต์ NFS อัตโนมัติด้วย autofs

สำหรับระบบไฟล์บนเครือข่าย การเมานต์ตอนบูตด้วย fstab อาจทำให้เกิดความล่าช้าหรือความล้มเหลว หากเซิร์ฟเวอร์ NFS ไม่สามารถเข้าถึงได้ชั่วคราว autofs แก้ปัญหานี้ด้วยการเมานต์เมื่อมีการเรียกใช้ และถอดเมานต์หลังหมดเวลาที่กำหนด

  • แผนที่หลัก: /etc/auto.master — กำหนดไดเรกทอรีจุดเมานต์และไฟล์แผนที่
  • แผนที่โดยตรง: /etc/auto.nfs — ระบุตัวเลือกและเส้นทางเซิร์ฟเวอร์ NFS สำหรับแต่ละไดเรกทอรีย่อย
  • โหลดการตั้งค่าใหม่ด้วย systemctl reload autofs หลังการเปลี่ยนแปลง
  • จุดเมานต์จะปรากฏโดยอัตโนมัติภายใต้ไดเรกทอรีที่กำหนดเมื่อมีการเข้าถึง

ในสคริปต์ คุณสามารถ สร้างไฟล์แผนที่แบบไดนามิก จากรายการส่วนแบ่ง NFS แล้วโหลด autofs ใหม่ได้ ซึ่งมีประโยชน์สำหรับจัดเตรียมพื้นที่จัดเก็บร่วมกันในโฮสต์จำนวนมาก

#!/usr/bin/env bash
# Generate an autofs NFS map file from a share list and reload autofs
set -euo pipefail

NFS_SERVER='192.168.1.50'
AUTO_MAP='/etc/auto.nfs'
AUTO_MASTER='/etc/auto.master'
MOUNT_BASE='/nfs'

# Define shares: localname:remote_path
declare -A SHARES=(
  [homes]='/export/homes'
  [media]='/export/media'
  [backups]='/export/backups'
)

# Write map file
{
  echo '# Generated by disk-automation script'
  for localname in "${!SHARES[@]}"; do
    remote="${SHARES[$localname]}"
    echo "$localname  -rw,soft,timeo=30  ${NFS_SERVER}:${remote}"
  done
} | sudo tee "$AUTO_MAP" > /dev/null

echo "Wrote $AUTO_MAP"

# Ensure master map references this file
if ! grep -qF "$AUTO_MAP" "$AUTO_MASTER"; then
  echo "$MOUNT_BASE  $AUTO_MAP" | sudo tee -a "$AUTO_MASTER" > /dev/null
  echo "Updated $AUTO_MASTER"
fi

sudo systemctl reload autofs && echo 'autofs reloaded'

สแนปชอต LVM สำหรับการสำรองข้อมูลอย่างปลอดภัย

สแนปชอต ของ LVM เป็นสำเนาของลอจิคัลวอลุ่ม ณ จุดเวลาใดเวลาหนึ่ง ช่วยให้สำรองข้อมูลระบบไฟล์ที่กำลังใช้งานอยู่ได้อย่างสอดคล้องกันโดยไม่ต้องถอดเมานต์ สแนปชอตจะเก็บสถานะขณะสร้างโดยใช้การคัดลอกเมื่อเขียน

  • สร้าง: lvcreate -s -n lv_snap -L 2G /dev/vg_data/lv_data
  • เมานต์สแนปชอตแบบอ่านอย่างเดียวเพื่อสำรองข้อมูล: mount -o ro /dev/vg_data/lv_snap /mnt/snap
  • เรียกใช้ rsync หรือ tar กับจุดเมานต์ของสแนปชอต
  • ลบสแนปชอตหลังสำรองข้อมูล: umount /mnt/snap && lvremove -f /dev/vg_data/lv_snap

กำหนดขนาดสแนปชอตไว้ที่ 10-20% ของ LV ต้นทาง หากสแนปชอตเต็ม สแนปชอตจะใช้การไม่ได้ — ตรวจสอบด้วย lvs -o lv_name,snap_percent

#!/usr/bin/env bash
# Create an LVM snapshot, back up via tar, then remove snapshot
set -euo pipefail

VG='vg_appdata'
ORIGIN_LV='lv_appdata'
SNAP_LV='lv_appdata_snap'
SNAP_SIZE='2G'
SNAP_MOUNT='/mnt/snap_backup'
BACKUP_DEST='/var/backups/appdata'
DATESTAMP=$(date +%Y%m%d_%H%M%S)

trap 'sudo umount "$SNAP_MOUNT" 2>/dev/null; sudo lvremove -f "/dev/$VG/$SNAP_LV" 2>/dev/null' ERR EXIT

echo '[1] Creating snapshot...'
sudo lvcreate -s -n "$SNAP_LV" -L "$SNAP_SIZE" "/dev/$VG/$ORIGIN_LV"

echo '[2] Mounting snapshot read-only...'
sudo mkdir -p "$SNAP_MOUNT"
sudo mount -o ro "/dev/$VG/$SNAP_LV" "$SNAP_MOUNT"

echo '[3] Archiving to backup destination...'
sudo mkdir -p "$BACKUP_DEST"
sudo tar -czf "$BACKUP_DEST/appdata_${DATESTAMP}.tar.gz" -C "$SNAP_MOUNT" .

echo '[4] Cleaning up snapshot...'
sudo umount "$SNAP_MOUNT"
sudo lvremove -f "/dev/$VG/$SNAP_LV"

echo "Backup complete: $BACKUP_DEST/appdata_${DATESTAMP}.tar.gz"

แบบทดสอบความรู้: การทำงานอัตโนมัติของ fstab และการเมานต์อย่างปลอดภัย

ทดสอบความเข้าใจเกี่ยวกับแนวทางปฏิบัติที่ปลอดภัยสำหรับการทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์ที่กล่าวถึงในบทเรียนนี้

ทบทวนบทเรียน: การทำงานอัตโนมัติของดิสก์ ระบบไฟล์ และการเมานต์

ในบทเรียนนี้ คุณได้สร้างชุดเครื่องมือที่ครบถ้วนสำหรับ การจัดการดิสก์และพื้นที่จัดเก็บบนระบบ Linux อย่างปลอดภัยและเขียนสคริปต์ได้ ประเด็นสำคัญมีดังนี้:

  • ตรวจสอบก่อน: lsblk, blkid, df และ du ให้ข้อมูลที่จำเป็นก่อนเปลี่ยนแปลงใด ๆ
  • แนวปฏิบัติที่เคร่งครัดสำหรับ fstab: ใช้ UUID เสมอ เพิ่ม nofail เสมอ สำรองข้อมูลก่อนแก้ไขเสมอ และตรวจสอบด้วย findmnt --verify
  • ความปลอดภัยในการเมานต์: ตรวจสอบด้วย mountpoint -q ก่อนเมานต์ บันทึกด้วย logger และจัดการข้อผิดพลาดของอุปกรณ์ที่กำลังใช้งานด้วย lsof
  • ความสามารถของ LVM: pipeline PV → VG → LV ช่วยให้ขยายวอลุ่มขณะออนไลน์และสำรองข้อมูลด้วยสแนปชอตได้โดยไม่หยุดให้บริการ
  • การเลือกระบบไฟล์มีความสำคัญ: xfs สำหรับประสิทธิภาพ (ขยายได้อย่างเดียว), ext4 สำหรับความยืดหยุ่น (ย่อได้เมื่อออฟไลน์), btrfs สำหรับงานที่ใช้สแนปชอตเป็นหลัก
  • NFS แบบเรียกใช้เมื่อจำเป็น: autofs ช่วยหลีกเลี่ยงความล่าช้าขณะบูตด้วยการเมานต์ส่วนแบ่งเครือข่ายเมื่อมีการเข้าถึงเท่านั้น
  • การสำรองข้อมูลด้วยสแนปชอต: สแนปชอต LVM ให้ข้อมูลสำรองที่สอดคล้องกันขณะระบบทำงานอยู่ แต่ต้องตรวจสอบ snap_percent เสมอ และลบสแนปชอตทันทีหลังสำรองข้อมูล

เมื่อผสานรูปแบบเหล่านี้เข้าด้วยกัน คุณจะสามารถทำงานอัตโนมัติกับวงจรชีวิตของพื้นที่จัดเก็บทั้งหมดได้อย่างน่าเชื่อถือ ตั้งแต่การค้นหา การจัดเตรียม การเมานต์ การปรับขนาด ไปจนถึงการสำรองข้อมูล

คำถามที่พบบ่อย

บทเรียน “การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Linux Command Line & Bash Scripting Mastery ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Linux Command Line & Bash Scripting Mastery มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์”

ตรวจสอบอุปกรณ์บล็อก จัดการรายการใน fstab และเขียนสคริปต์สำหรับการดำเนินการกับ LVM และการเมานต์อย่างปลอดภัย คุณปฏิบัติ Linux Command Line & Bash Scripting Mastery ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Linux Command Line & Bash Scripting Mastery หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Linux Command Line & Bash Scripting Mastery บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Linux Command Line & Bash Scripting Mastery นี้ได้ไหม

ได้ บทเรียน Linux Command Line & Bash Scripting Mastery ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การทำงานอัตโนมัติสำหรับการจัดเตรียมผู้ใช้และกลุ่ม
  2. การควบคุมบริการ systemd และการเขียนไฟล์ยูนิต
  3. การทำงานอัตโนมัติด้านดิสก์ ระบบไฟล์ และการเมานต์
  4. การสร้างสคริปต์ตรวจสอบสุขภาพระบบและแจ้งเตือน
← กลับไปที่ Linux Command Line & Bash Scripting Mastery