การเมานต์ดิสก์ใน Linux: lsblk, การแบ่งพาร์ติชัน, mkfs, mount และ fstab
การเมานต์ดิสก์ใน 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/nvme0n1 | SSD แบบ 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 กำหนดป้ายชื่อ ซึ่งช่วยให้จำพาร์ติชันได้ง่ายภายหลัง ควรเลือกระบบไฟล์ดังนี้:
| ระบบไฟล์ | คำสั่ง | เหมาะเมื่อ |
|---|---|---|
| ext4 | mkfs.ext4 | ตัวเลือกทั่วไปเป็นค่าเริ่มต้น ลดขนาดได้ |
| XFS | mkfs.xfs | ไฟล์และโวลุ่มขนาดใหญ่ เป็นมาตรฐานของ RHEL แต่ขยายได้อย่างเดียว |
| Btrfs | mkfs.btrfs | สแนปชอต การบีบอัด และซับโวลุ่ม |
| vfat/exFAT | mkfs.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 |
ขั้นตอนตัวอย่าง: ดิสก์ใหม่สำหรับเก็บข้อมูล
lsblkหาดิสก์ใหม่ เช่น/dev/sdbsudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100%แบ่งพาร์ติชันsudo mkfs.ext4 -L data /dev/sdb1สร้างระบบไฟล์sudo mkdir -p /dataสร้างจุดเมานต์sudo blkid /dev/sdb1ดู UUID แล้วเพิ่มบรรทัดลงใน/etc/fstabsudo mount -a && df -h /dataเมานต์และตรวจสอบ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: с нуля до уверенного администрирования”
ไปที่คอร์ส