คู่มือ

การเมานต์ดิสก์ใน Linux: lsblk, การแบ่งพาร์ติชัน, mkfs, mount และ fstab

อัปเดต: · Skillaria.Top

การเมานต์ดิสก์ใน Linux คือการเชื่อมระบบไฟล์ของพาร์ติชันเข้ากับไดเรกทอรีในโครงสร้างต้นไม้ เช่น /data ดิสก์ใหม่ถูกค้นพบด้วย lsblk แบ่งพาร์ติชันด้วย fdisk หรือ parted จัดรูปแบบด้วย mkfs.ext4 แล้วเมานต์ด้วย mount /dev/sdb1 /data และเพื่อให้พาร์ติชันถูกเมานต์หลังรีบูต จึงเพิ่มบรรทัดที่มี UUID ของมันลงใน /etc/fstab และตรวจด้วย mount -a

ใน Linux ไม่มีตัวอักษรไดรฟ์ อุปกรณ์เก็บข้อมูลทั้งหมดถูกรวมเข้าเป็นโครงสร้างต้นไม้เดียวที่เริ่มจาก / การเมานต์ดิสก์ใน Linux คือการ "แขวน" ระบบไฟล์ของพาร์ติชันไว้กับไดเรกทอรีว่าง ซึ่งเรียกว่าจุดเมานต์ ขั้นตอนสำหรับดิสก์ใหม่เสมอเหมือนกัน: หาอุปกรณ์ (lsblk) แบ่งพาร์ติชัน (fdisk หรือ parted) สร้างระบบไฟล์ (mkfs) เมานต์ (mount) และกำหนดให้คงอยู่ใน /etc/fstab อธิบายทีละขั้น พร้อมวิธีดูว่าพื้นที่หายไปไหนด้วย df และ du

ดิสก์และพาร์ติชันใน Linux ทำงานอย่างไร

เคอร์เนลแทนดิสก์แต่ละตัวด้วยไฟล์อุปกรณ์ใน /dev ชื่อขึ้นอยู่กับประเภทการเชื่อมต่อ:

ชื่อคืออะไรพาร์ติชัน
/dev/sda, /dev/sdbดิสก์ SATA/SAS/USB และดิสก์เสมือนหลายชนิด/dev/sda1, /dev/sda2
/dev/vdaดิสก์ virtio ในเครื่องเสมือน KVM/dev/vda1
/dev/nvme0n1SSD แบบ NVMe/dev/nvme0n1p1
/dev/mapper/...โวลุ่มตรรกะของ LVM และโวลุ่มที่เข้ารหัส—

ดิสก์ถูกแบ่งเป็นพาร์ติชัน บนพาร์ติชันสร้างระบบไฟล์ (ext4, xfs, btrfs) แล้วจึงเมานต์ระบบไฟล์นั้นเข้าไดเรกทอรี ตราบใดที่พาร์ติชันยังไม่ถูกเมานต์ ไฟล์ในนั้นจะเข้าถึงไม่ได้ แม้ดิสก์จะเชื่อมต่ออยู่ทางกายภาพแล้วก็ตาม

ดูดิสก์ด้วย lsblk และ blkid

คำสั่งแรกเมื่อทำงานกับดิสก์คือ lsblk แสดงต้นไม้ของอุปกรณ์ ขนาด และจุดเมานต์:

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sda      8:0    0   40G  0 disk
├─sda1   8:1    0    1G  0 part /boot
└─sda2   8:2    0   39G  0 part /
sdb      8:16   0  100G  0 disk

ที่นี่เห็นได้ว่า sdb คือดิสก์ใหม่ขนาด 100 GB ที่ยังไม่มีพาร์ติชันและไม่มีจุดเมานต์ ตัวเลือกที่มีประโยชน์:

  • lsblk -f แสดงชนิดระบบไฟล์ ป้ายชื่อ และ UUID ของแต่ละพาร์ติชัน
  • lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL แสดงเฉพาะคอลัมน์ที่ต้องการ
  • sudo blkid แสดง UUID และชนิดระบบไฟล์ของทุกพาร์ติชัน
  • sudo fdisk -l แสดงตารางพาร์ติชันของทุกดิสก์พร้อมเซกเตอร์

หากเพิ่มดิสก์เข้าไปในเครื่องเสมือนขณะที่ระบบทำงานอยู่ และ lsblk ยังไม่เห็น ให้สั่งให้เคอร์เนลสแกนบัสใหม่: echo "- - -" | sudo tee /sys/class/scsi_host/host*/scan

การแบ่งพาร์ติชัน: fdisk และ parted

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

GPT หรือ MBR

สำหรับดิสก์ใหม่ให้ใช้ GPT เพราะรองรับดิสก์ที่ใหญ่กว่า 2 TB และมากถึง 128 พาร์ติชัน MBR (dos) จำเป็นเฉพาะกับระบบเก่าที่บูตผ่าน BIOS และตัวโหลดบูตต้องการ

แบ่งพาร์ติชันด้วย fdisk

fdisk รุ่นใหม่รองรับทั้ง GPT และ MBR การทำงานเป็นแบบโต้ตอบ:

$ sudo fdisk /dev/sdb
Command (m for help): g        # สร้างตาราง GPT ว่าง
Command (m for help): n        # พาร์ติชันใหม่
Partition number (1-128, default 1): Enter
First sector: Enter
Last sector, +/-sectors or +/-size{K,M,G,T,P}: Enter   # ทั้งดิสก์
Command (m for help): w        # บันทึกการเปลี่ยนแปลงและออก

จนกว่าจะกด w ยังไม่มีการเขียนอะไรลงดิสก์ จึงสามารถกด q เพื่อออกโดยไม่เปลี่ยนแปลงได้

แบ่งพาร์ติชันด้วย parted ในบรรทัดเดียว

ในสคริปต์ parted สะดวกกว่า เพราะทำงานโดยไม่มีการโต้ตอบ:

$ sudo parted -s /dev/sdb mklabel gpt
$ sudo parted -s /dev/sdb mkpart primary ext4 0% 100%
$ lsblk /dev/sdb
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
sdb      8:16   0  100G  0 disk
└─sdb1   8:17   0  100G  0 part

การกำหนดขอบเขตเป็นเปอร์เซ็นต์ให้การจัดแนวพาร์ติชันที่ถูกต้อง หากพาร์ติชันใหม่ไม่ปรากฏ ให้รัน sudo partprobe /dev/sdb เพื่อให้เคอร์เนลอ่านตารางพาร์ติชันใหม่

สร้างระบบไฟล์ด้วย mkfs

พาร์ติชันเป็นเพียงช่วงของบล็อก เพื่อเก็บไฟล์ต้องสร้างระบบไฟล์บนพาร์ติชันนั้นก่อน:

$ sudo mkfs.ext4 -L data /dev/sdb1
mke2fs 1.47.0 (5-Feb-2023)
Creating filesystem with 26214144 4k blocks and 6553600 inodes
...
Writing superblocks and filesystem accounting information: done

แฟล็ก -L กำหนดป้ายชื่อ ซึ่งช่วยให้จำพาร์ติชันได้ง่ายภายหลัง ควรเลือกระบบไฟล์ดังนี้:

ระบบไฟล์คำสั่งเหมาะเมื่อ
ext4mkfs.ext4ตัวเลือกทั่วไปเป็นค่าเริ่มต้น ลดขนาดได้
XFSmkfs.xfsไฟล์และโวลุ่มขนาดใหญ่ เป็นมาตรฐานของ RHEL แต่ขยายได้อย่างเดียว
Btrfsmkfs.btrfsสแนปชอต การบีบอัด และซับโวลุ่ม
vfat/exFATmkfs.vfat, mkfs.exfatแฟลชไดรฟ์สำหรับแลกเปลี่ยนกับ Windows และ macOS

mkfs ลบทุกอย่างที่อยู่บนพาร์ติชัน และไม่ถามยืนยันเมื่อพาร์ติชันว่าง จึงต้องตรวจชื่ออุปกรณ์อีกครั้ง

วิธีเมานต์ดิสก์ใน Linux ด้วยคำสั่ง mount

สร้างไดเรกทอรี ซึ่งเป็นจุดเมานต์ แล้วเชื่อมพาร์ติชันเข้ากับไดเรกทอรีนั้น:

$ sudo mkdir -p /data
$ sudo mount /dev/sdb1 /data
$ df -h /data
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        98G   24K   93G   1% /data

mount ตรวจชนิดระบบไฟล์เองได้ แต่ระบุได้ด้วยเช่น mount -t xfs หากไดเรกทอรี /data มีไฟล์อยู่ก่อนแล้ว ไฟล์เหล่านั้นจะไม่ถูกลบหลังเมานต์ เพียงแต่ถูกซ่อนอยู่ใต้ระบบไฟล์ใหม่ และจะกลับมาเมื่อเลิกเมานต์

ตัวเลือกการเมานต์

ตัวเลือกส่งผ่าน -o คั่นด้วยเครื่องหมายจุลภาค:

  • ro / rw อ่านอย่างเดียว หรืออ่านและเขียน
  • noatime ไม่อัปเดตเวลาการเข้าถึงทุกครั้งที่อ่าน ลดการเขียนที่ไม่จำเป็น
  • noexec ห้ามรันโปรแกรมจากพาร์ติชันนี้ มีประโยชน์กับ /tmp และไดเรกทอรีดาวน์โหลด
  • nosuid, nodev ไม่สนใจบิต SUID และไฟล์อุปกรณ์
  • remount เปลี่ยนตัวเลือกโดยไม่ต้องเลิกเมานต์: sudo mount -o remount,ro /data

ดูว่าอะไรถูกเมานต์และด้วยตัวเลือกใดได้สะดวกด้วย findmnt: findmnt /data หรือ findmnt -t ext4

สิทธิ์บนดิสก์ที่เมานต์แล้ว

รากของ ext4 ใหม่เป็นของ root ผู้ใช้ทั่วไปจึงเขียนไม่ได้ ให้มอบไดเรกทอรีให้ผู้ใช้ที่ต้องการหลังเมานต์: sudo chown alice:alice /data สำหรับ vfat และ exFAT ไม่มีสิทธิ์แบบ Unix ต้องกำหนดเจ้าของด้วยตัวเลือก uid=, gid= และ umask= ตอนเมานต์

วิธีเลิกเมานต์ดิสก์: umount และข้อผิดพลาด target is busy

การถอดออกใช้คำสั่ง umount (ไม่มีตัว n) โดยระบุอุปกรณ์หรือไดเรกทอรี:

$ sudo umount /data
umount: /data: target is busy.

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

$ sudo lsof +f -- /data
$ sudo fuser -vm /data

หยุดโปรเซสหรือออกจากไดเรกทอรีแล้วลองอีกครั้ง ทางเลือกสุดท้ายคือ umount -l (lazy) ระบบไฟล์จะถูกถอดออกจากโครงสร้างทันที และจะถูกปล่อยจริงเมื่อโปรเซสปิดไฟล์ทั้งหมด

เมานต์อัตโนมัติตอนบูต: /etc/fstab

คำสั่ง mount มีผลจนกว่าจะรีบูต หากต้องการให้ดิสก์เมานต์เองอัตโนมัติ ให้เพิ่มบรรทัดใน /etc/fstab ควรระบุพาร์ติชันด้วย UUID แทนชื่อ /dev/sdb1 เพราะชื่ออาจสลับกันเมื่อเพิ่มดิสก์ ส่วน UUID คงที่

$ sudo blkid /dev/sdb1
/dev/sdb1: LABEL="data" UUID="3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77" TYPE="ext4" PARTUUID="..."

รูปแบบของบรรทัดมีหกฟิลด์:

# <อุปกรณ์>                          <จุดเมานต์>  <ชนิด>  <ตัวเลือก>           <dump> <fsck>
UUID=3f1c9a2e-7b5d-4c1e-9a8f-2d6e4b0c1a77  /data    ext4   defaults,noatime  0      2
ฟิลด์ความหมาย
อุปกรณ์UUID=..., LABEL=... หรือพาธ
จุดเมานต์ไดเรกทอรีที่จะเมานต์ (ต้องมีอยู่ก่อน)
ชนิดext4, xfs, swap, nfs ฯลฯ
ตัวเลือกdefaults พร้อมตัวเลือกที่ต้องการ เช่น noatime, nofail
dumpเกือบทุกครั้งเป็น 0
fsckลำดับการตรวจสอบ: 1 สำหรับรูต 2 สำหรับอื่น และ 0 คือไม่ตรวจ

ตรวจ fstab ก่อนรีบูตเสมอ

ข้อผิดพลาดใน /etc/fstab อาจทำให้เซิร์ฟเวอร์เข้าสู่โหมดฉุกเฉินตอนบูต ซึ่งน่ารำคาญมากบนเครื่องคลาวด์ที่ไม่มีคอนโซล หลังแก้ไขให้รันทันที:

$ sudo findmnt --verify
$ sudo systemctl daemon-reload
$ sudo mount -a
$ findmnt /data

mount -a เมานต์ทุกอย่างใน fstab ที่ยังไม่ได้เมานต์ และแสดงข้อผิดพลาดทันที สำหรับดิสก์ถอดได้หรือดิสก์เครือข่ายให้เพิ่มตัวเลือก nofail หากไม่พบอุปกรณ์ การบูตจะดำเนินต่อโดยไม่มีอุปกรณ์นั้น ใน systemd แต่ละบรรทัดของ fstab จะกลายเป็นยูนิต .mount เช่น data.mount ดูสถานะได้ด้วย systemctl status data.mount

ดูพื้นที่ว่างด้วย df

df แสดงการใช้งานของระบบไฟล์ที่เมานต์อยู่:

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        39G   37G  1.1G  98% /
/dev/sda1       974M  180M  727M  20% /boot
/dev/sdb1        98G   24K   93G   1% /data
  • -h แสดงขนาดในหน่วยที่อ่านง่าย
  • -T เพิ่มคอลัมน์ชนิดระบบไฟล์
  • -i แสดง inode ดิสก์อาจเต็มทั้งที่ยังมีพื้นที่กิกะไบต์ว่าง หากสร้างไฟล์เล็ก ๆ จำนวนมากเกินไป
  • -x tmpfs -x devtmpfs ซ่อนระบบไฟล์เสมือน

ทำไม Size จึงไม่เท่ากับ Used + Avail: ext4 สงวนพื้นที่ประมาณ 5% ไว้ให้ root เพื่อให้ระบบทำงานได้แม้ดิสก์เกือบเต็ม บนพาร์ติชันที่มีข้อมูลผู้ใช้ สามารถลดการสงวนนี้ได้ด้วย sudo tune2fs -m 1 /dev/sdb1

พื้นที่หายไปไหน: du

df บอกว่าดิสก์เต็ม แต่ไม่บอกว่าอะไรเป็นสาเหตุ du รวมขนาดของไฟล์ในไดเรกทอรีเพื่อตอบคำถามนี้:

$ sudo du -sh /var/log
4.2G    /var/log
$ sudo du -xh --max-depth=1 / 2>/dev/null | sort -rh | head
37G     /
21G     /var
9.8G    /home
3.1G    /usr
  • -s แสดงเฉพาะผลรวมของไดเรกทอรี -a แสดงทุกไฟล์แยกกัน
  • --max-depth=1 (หรือ -d 1) ดูหนึ่งระดับ แล้วลงไปดูลึกขึ้นในไดเรกทอรีที่ใหญ่ที่สุด
  • -x ไม่ข้ามไปยังระบบไฟล์อื่น มิฉะนั้นผลรวมจะรวม /data, /proc และดิสก์เครือข่ายด้วย
  • sort -rh เรียงตามขนาดที่อ่านได้ ใหญ่สุดอยู่บนสุด

หาไฟล์ใหญ่แต่ละไฟล์สะดวกกว่าด้วย find: sudo find / -xdev -type f -size +1G -exec ls -lh {} +

df แสดงว่าดิสก์เต็ม แต่ du ไม่พบ

สถานการณ์คลาสสิกคือลบล็อกขนาดใหญ่แล้ว แต่พื้นที่ไม่ได้คืน ไฟล์ถูกลบออกจากไดเรกทอรีแล้ว แต่โปรเซส (เช่น เว็บเซิร์ฟเวอร์) ยังเปิดไฟล์นั้นค้างไว้ และบล็อกจะไม่ถูกปล่อย หาไฟล์เหล่านี้ได้ด้วย:

$ sudo lsof +L1
COMMAND  PID USER   FD   TYPE DEVICE   SIZE/OFF NLINK  NODE NAME
nginx    812 www    5w   REG    8,2 8589934592     0 13054 /var/log/nginx/access.log (deleted)

รีสตาร์ตโปรเซสหรือสั่งให้เปิดล็อกใหม่ พื้นที่จะกลับมา ในอนาคตให้ล้างล็อกที่กำลังใช้งานโดยไม่ลบไฟล์: sudo truncate -s 0 /var/log/nginx/access.log อีกสาเหตุของความต่างคือไฟล์ที่ซ่อนอยู่ใต้จุดเมานต์ ไฟล์เหล่านั้นกินพื้นที่บนรูตแต่ du มองไม่เห็นเมื่อมีระบบไฟล์อื่นเมานต์ทับอยู่

ข้อผิดพลาดที่พบบ่อยและวิธีแก้

ข้อความสาเหตุสิ่งที่ควรทำ
mount point /data does not existยังไม่มีไดเรกทอรีsudo mkdir -p /data
wrong fs type, bad option, bad superblockพาร์ติชันไม่มีระบบไฟล์ ชนิดไม่ถูกต้อง หรือยังไม่ได้ติดตั้งไดรเวอร์ตรวจด้วย lsblk -f สำหรับ exFAT/NTFS ติดตั้งแพ็กเกจ exfatprogs, ntfs-3g
only root can do thatเมานต์โดยไม่ใช้ sudoรันด้วย sudo หรือเพิ่มตัวเลือก user ใน fstab
target is busyไดเรกทอรีถูกโปรเซสใช้อยู่ใช้ lsof/fuser แล้วออกจากไดเรกทอรี
บูตเข้าสู่ emergency modeข้อผิดพลาดใน fstab หรือไม่พบดิสก์ล็อกอินเป็น root แก้ fstab และเพิ่ม nofail

ขั้นตอนตัวอย่าง: ดิสก์ใหม่สำหรับเก็บข้อมูล

  1. lsblk หาดิสก์ใหม่ เช่น /dev/sdb
  2. sudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100% แบ่งพาร์ติชัน
  3. sudo mkfs.ext4 -L data /dev/sdb1 สร้างระบบไฟล์
  4. sudo mkdir -p /data สร้างจุดเมานต์
  5. sudo blkid /dev/sdb1 ดู UUID แล้วเพิ่มบรรทัดลงใน /etc/fstab
  6. sudo mount -a && df -h /data เมานต์และตรวจสอบ
  7. sudo chown ผู้ใช้: /data มอบสิทธิ์

หากต้องการขยายพื้นที่โดยไม่หยุดบริการ หรือรวมหลายดิสก์เข้าด้วยกัน ให้ใช้ LVM แทนพาร์ติชันธรรมดา ดิสก์จะกลายเป็นวอลุ่มทางกายภาพ ซึ่งนำไปแบ่งเป็นโวลุ่มตรรกะที่ขยายได้ด้วย lvextend -r

สรุป

การเมานต์ดิสก์ใน Linux คือลำดับ lsblk → แบ่งพาร์ติชัน → mkfs → mount → /etc/fstab ระบุพาร์ติชันด้วย UUID ตรวจ fstab ด้วย mount -a ก่อนรีบูต และใช้ nofail กับดิสก์ที่ไม่จำเป็นต้องมี เมื่อพื้นที่หมด df -h บอกว่าพาร์ติชันใดเต็ม ส่วน du -xh --max-depth=1 | sort -rh และ lsof +L1 บอกว่าอะไรเป็นตัวกินพื้นที่ ดิสก์ พาร์ติชัน swap LVM และ RAID ถูกฝึกใช้จริงในหลักสูตร Linux

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

จะเมานต์แฟลชไดรฟ์ใน Linux อย่างไร?

หาด้วย lsblk (มักเป็น /dev/sdb1) สร้างไดเรกทอรี แล้วรัน sudo mount /dev/sdb1 /mnt/usb ในสภาพแวดล้อมกราฟิก แฟลชไดรฟ์จะถูกเมานต์อัตโนมัติที่ /media/ชื่อผู้ใช้ หรือ /run/media

จะเมานต์ไฟล์ ISO อย่างไร?

ใช้ sudo mount -o loop,ro image.iso /mnt/iso ตัวเลือก loop จะเชื่อมไฟล์เป็นอุปกรณ์บล็อก และเลิกเมานต์ด้วย umount ตามปกติ

จะเชื่อมโฟลเดอร์เครือข่ายผ่าน fstab อย่างไร?

สำหรับ NFS บรรทัดคือ server:/export /mnt/nfs nfs defaults,_netdev,nofail 0 0 และสำหรับ SMB คือ //server/share /mnt/smb cifs credentials=/root/.smbcred,_netdev,nofail 0 0 ตัวเลือก _netdev รอให้เครือข่ายขึ้นก่อน

UUID ต่างจาก PARTUUID อย่างไร?

UUID เป็นของระบบไฟล์และเปลี่ยนเมื่อสร้างระบบไฟล์ใหม่ด้วย mkfs ส่วน PARTUUID เป็นของพาร์ติชันในตาราง GPT และคงอยู่เมื่อฟอร์แมตใหม่ ใน fstab มักใช้ UUID

จะตรวจระบบไฟล์หาข้อผิดพลาดอย่างไร?

เลิกเมานต์พาร์ติชันก่อน แล้วรัน sudo fsck -f /dev/sdb1 สำหรับ ext4 หรือ sudo xfs_repair /dev/sdb1 สำหรับ XFS ห้ามตรวจระบบไฟล์ที่เมานต์และมีการเขียนอยู่ เพราะอาจทำให้ข้อมูลเสียหาย

เรียนหัวข้อนี้ผ่านวิดีโอ

หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Linux: с нуля до уверенного администрирования”

ไปที่คอร์ส