เสียบฮาร์ดดิสก์ลูกใหม่เข้าเครื่องแล้ว… ทำไมยังเก็บไฟล์ไม่ได้? บทนี้จะพาคุณเปลี่ยน “ดิสก์เปล่าๆ ที่ไร้ประโยชน์” ให้กลายเป็นพื้นที่เก็บข้อมูลที่ใช้งานได้จริง และอยู่ถาวรแม้รีบูตเครื่อง
🌱 บทนี้เขียนเพื่อคนที่ไม่เคยแตะ Linux มาก่อนเลยหลายคนคิดว่าพอเสียบฮาร์ดดิสก์ลูกใหม่เข้าเครื่อง ก็น่าจะเก็บไฟล์ได้เลย — แต่ความจริงไม่ใช่ ดิสก์ที่เพิ่งมาใหม่เปรียบเหมือน “ก้อนพื้นที่ดิบๆ” ที่ระบบยังไม่รู้จะเอาไปทำอะไร ต้องผ่าน 3 ขั้นตอน ก่อน ถึงจะเก็บไฟล์ได้:
นึกถึงคุณซื้อ ที่ดินเปล่า มาผืนหนึ่ง:
• แบ่งพาร์ติชัน = แบ่งที่ดินเป็นแปลงๆ ปักหมุดเขตให้ชัด (แปลง A, แปลง B)
• สร้าง filesystem = สร้างตัวบ้าน วางผังห้อง ติดตั้งชั้นวางของในแต่ละแปลง ให้เก็บของได้จริง
• mount = ทำประตู/ทางเข้าเชื่อมจากถนนหลัก (ระบบ) เข้าไปในบ้าน เพื่อให้เดินเข้าไปใช้งานได้
ถ้าไม่ทำทางเข้า (ไม่ mount) ต่อให้บ้านสวยแค่ไหน คุณก็เข้าไปเก็บของไม่ได้ — ดิสก์ก็เหมือนกัน
การสร้างพาร์ติชัน, ฟอร์แมต, และ mount ถาวรผ่าน /etc/fstab เป็นโจทย์ที่ ออกสอบเกือบทุกครั้ง และที่ร้ายกว่านั้นคือ — ถ้าทำ fstab ผิด เครื่องอาจบูตไม่ขึ้นเลย ผู้ตรวจรีบูตเครื่องแล้วเข้าไม่ได้ = คุณเสียคะแนนทั้งข้อ ดังนั้นต้องทำให้แม่นจริงๆ
ใน Windows ดิสก์ถูกเรียกว่า C: D: แต่ Linux เรียกดิสก์เป็น “ไฟล์” อยู่ในโฟลเดอร์ /dev (ย่อมาจาก device = อุปกรณ์) ชื่อจะเป็นแบบนี้:
sdb (ตัวเลขต่อท้าย = ลำดับพาร์ติชัน)sdbคิดง่ายๆ ว่า sdb คือทั้งตึก ส่วน sdb1, sdb2 คือห้องในตึก เลขท้ายก็คือเลขห้องนั่นเอง
ก่อนจะทำอะไร ต้องรู้ก่อนว่าเครื่องมีดิสก์ลูกไหน ขนาดเท่าไร — คำสั่งที่ใช้บ่อยที่สุดคือ lsblk
[root@server1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part / sdb 8:16 0 5G 0 disk ← ดิสก์ลูกใหม่ ยังว่าง ไม่มีพาร์ติชัน
lsblk“list block devices” — แสดงดิสก์และพาร์ติชันแบบต้นไม้ อ่านง่ายที่สุดSIZEขนาดของดิสก์/พาร์ติชันMOUNTPOINTSถ้ามีค่า = พาร์ติชันนั้นถูก mount อยู่ ถ้าว่าง = ยังไม่ได้ใช้สังเกตว่า sdb ยังไม่มีลูก (ไม่มี sdb1) แปลว่ายังเป็นดิสก์เปล่าที่รอเราแบ่งพาร์ติชัน อีกคำสั่งที่ใช้ดูได้ละเอียดคือ fdisk -l (ต้องเป็น root):
[root@server1 ~]# fdisk -l /dev/sdb Disk /dev/sdb: 5 GiB, 5368709120 bytes, 10485760 sectors Units: sectors of 1 * 512 = 512 bytes Disklabel type: dos
ก่อนแบ่งพาร์ติชัน ดิสก์ต้องมี “สารบัญ” ที่จดว่ามีพาร์ติชันอะไรบ้าง อยู่ตรงไหน — เรียกว่า ตารางพาร์ติชัน (partition table) มี 2 แบบหลักที่ต้องรู้จัก:
| แบบ | จุดเด่น / ข้อจำกัด |
|---|---|
| MBR (dos) | แบบเก่า รองรับดิสก์สูงสุด 2 TB และมีพาร์ติชันหลัก (primary) ได้แค่ 4 อัน — fdisk เรียกมันว่า dos |
| GPT | แบบใหม่ รองรับดิสก์ขนาดใหญ่มาก (เกิน 2 TB) และมีพาร์ติชันได้ถึง 128 อัน — เครื่องสมัยใหม่ใช้แบบนี้ |
ถ้าโจทย์ไม่ได้สั่งเจาะจง ใช้ค่าตั้งต้นของเครื่องมือไปได้เลย — fdisk สร้าง MBR, ส่วน parted ถ้าจะใช้ GPT ก็สั่ง mklabel gpt ก่อน สิ่งที่สำคัญกว่าคือ “สร้างพาร์ติชันให้ได้ขนาดตามโจทย์” มากกว่าเลือกชนิดตาราง
fdisk เป็นเครื่องมือแบ่งพาร์ติชันแบบ “เมนูโต้ตอบ” — พิมพ์ตัวอักษรสั่งงานทีละขั้น สั่งผิดก็ยังไม่เกิดอะไรขึ้นจนกว่าจะกด w เพื่อบันทึก ดังนั้นกล้าลองได้ ตัวคำสั่งหลักที่ต้องจำ:
| กด | ทำอะไร |
|---|---|
p | print — ดูพาร์ติชันที่มีตอนนี้ |
n | new — สร้างพาร์ติชันใหม่ |
d | delete — ลบพาร์ติชัน |
t | type — เปลี่ยนชนิดพาร์ติชัน (เช่นเปลี่ยนเป็น swap) |
w | write — บันทึกแล้วออก (ก่อนหน้านี้ยังไม่มีอะไรเปลี่ยนจริง) |
q | quit — ออกโดยไม่บันทึก (เผื่อทำพลาด อยากยกเลิก) |
[root@server1 ~]# fdisk /dev/sdb Welcome to fdisk. Changes will remain in memory only, until you decide to write them. Command (m for help): n ← สร้างใหม่ Partition type p primary / e extended Select (default p): p ← เลือก primary Partition number (1-4, default 1): ⏎ ← กด Enter รับค่า default (1) First sector (... default 2048): ⏎ ← Enter รับค่าเริ่มต้น Last sector (...): +1G ← พิมพ์ +1G = ขนาด 1GB Created a new partition 1 of type 'Linux' and of size 1 GiB. Command (m for help): p ← ดูผลก่อนบันทึก /dev/sdb1 2048 2099199 2097152 1G 83 Linux Command (m for help): w ← บันทึกจริงแล้วออก The partition table has been altered.
+1Gวิธีบอกขนาดที่ง่ายที่สุด — ใส่ +ขนาด เช่น +500M, +1G, +2G ไม่ต้องคำนวณ sector เอง⏎หมายถึงกดปุ่ม Enter เพื่อรับค่าเริ่มต้น (default) ส่วนใหญ่ค่า default ใช้ได้เลยwสำคัญที่สุด — ถ้าไม่กด w ทุกอย่างที่ทำมาจะหายไปทันทีเมื่อออกจาก fdiskparted ทำงานคล้ายกัน แต่สั่งงานเป็นบรรทัดเดียวได้ และรองรับ GPT ตรงๆ ตัวอย่างสร้าง GPT แล้วแบ่งพาร์ติชันขนาด 1GB:
[root@server1 ~]# parted /dev/sdb mklabel gpt ← วางตารางแบบ GPT [root@server1 ~]# parted /dev/sdb mkpart primary 1MiB 1025MiB [root@server1 ~]# parted /dev/sdb print ← ดูผล
mkpart primary 1MiB 1025MiB = สร้างพาร์ติชันเริ่มที่ตำแหน่ง 1MiB จบที่ 1025MiB (กว้างราว 1GB) ต่างจาก fdisk ตรงที่ parted ใช้ “ตำแหน่งเริ่ม–จบ” ไม่ใช่ขนาด
ก่อนสั่ง fdisk หรือ parted ให้เช็ก lsblk ทุกครั้งว่าเรากำลังทำกับ /dev/sdb จริงๆ — ถ้าเผลอไปทำกับ /dev/sda (ดิสก์ที่ลงระบบ) คุณอาจพังทั้งเครื่อง!
บางครั้งหลังสร้างพาร์ติชันเสร็จ ระบบ (kernel) ยัง “ไม่รู้” ว่ามีพาร์ติชันใหม่เกิดขึ้น เพราะมันยังจำตารางพาร์ติชันเดิมอยู่ในหัว ผลคือคุณจะหา /dev/sdb1 ไม่เจอ คำสั่งที่บอกให้ kernel “อ่านตารางพาร์ติชันใหม่อีกครั้ง” คือ:
[root@server1 ~]# partprobe /dev/sdb [root@server1 ~]# lsblk /dev/sdb NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sdb 8:16 0 5G 0 disk └─sdb1 8:17 0 1G 0 part ← เห็น sdb1 แล้ว!
ถ้าทำตามขั้นตอนแล้วยังไม่เห็นพาร์ติชันใหม่ — partprobe คือคำตอบ จำไว้เลยว่า “สร้างพาร์ติชันเสร็จแล้วหาไม่เจอ → partprobe”
เหมือนคุณแก้เบอร์โทรในสมุดโทรศัพท์ แต่เพื่อนยังจำเบอร์เก่าได้ขึ้นใจ partprobe ก็เหมือนบอกเพื่อนว่า “เปิดสมุดดูใหม่นะ เบอร์เปลี่ยนแล้ว”
ตอนนี้เรามีพาร์ติชัน /dev/sdb1 แล้ว แต่มันยังเป็น “ห้องเปล่าที่ไม่มีชั้นวางของ” — เก็บไฟล์ไม่ได้ ต้องวาง filesystem (ระบบจัดเก็บไฟล์) ลงไปก่อน ขั้นนี้คนทั่วไปเรียกว่า “ฟอร์แมต” คำสั่งคือตระกูล mkfs (make filesystem)
[root@server1 ~]# mkfs.xfs /dev/sdb1 meta-data=/dev/sdb1 isize=512 agcount=4 ... Done.
mkfs.xfs วางระบบไฟล์แบบ XFS ลงในพาร์ติชัน — XFS เป็นค่ามาตรฐานของ RHEL 9 เร็วและทนทาน เหมาะกับข้อมูลขนาดใหญ่
[root@server1 ~]# mkfs.ext4 /dev/sdb1 Creating filesystem with 262144 4k blocks ...
| Filesystem | ใช้เมื่อไร |
|---|---|
xfs | ค่าเริ่มต้นของ RHEL — ถ้าโจทย์ไม่ระบุชนิด ใช้ตัวนี้ ขยายเพิ่มได้ แต่ ลดขนาดไม่ได้ |
ext4 | ระบบไฟล์คลาสสิกที่ใช้กันกว้าง ขยายและลดขนาดได้ โจทย์มักระบุชัดถ้าต้องใช้ตัวนี้ |
การ mkfs ทับพาร์ติชันที่มีข้อมูลอยู่ = ลบทุกอย่างในนั้นทันที และกู้คืนแทบไม่ได้ ตรวจให้แน่ใจเสมอว่ากำลัง mkfs พาร์ติชันที่ถูกต้อง (/dev/sdb1 ไม่ใช่ /dev/sda1)
มีบ้านมีชั้นวางของแล้ว แต่ยัง “เข้าไปไม่ได้” เพราะยังไม่มีทางเข้า — การ mount คือการผูกพาร์ติชันเข้ากับโฟลเดอร์หนึ่ง (เรียกว่า mount point) พอ mount เสร็จ ทุกอย่างที่เราเขียนลงโฟลเดอร์นั้นจะไปอยู่บนดิสก์ลูกใหม่
[root@server1 ~]# mkdir /mnt/data ← สร้างโฟลเดอร์ไว้เป็นทางเข้า [root@server1 ~]# mount /dev/sdb1 /mnt/data [root@server1 ~]# df -h ← ดูว่า mount สำเร็จไหม Filesystem Size Used Avail Use% Mounted on /dev/sdb1 1.0G 40M 961M 5% /mnt/data ← เห็นแล้ว = mount สำเร็จ
mkdir /mnt/dataสร้างโฟลเดอร์ว่างไว้ก่อน เพื่อใช้เป็น “จุดเข้า” (mount point)mount A Bผูกพาร์ติชัน A (/dev/sdb1) เข้ากับโฟลเดอร์ B (/mnt/data)df -h“disk free” — ดูพื้นที่ว่างและรายการที่ mount อยู่ (-h = แสดงหน่วยอ่านง่าย G/M)umount /mnt/dataถอด mount ออก (สังเกตว่าสะกด umount ไม่มี n)การ mount ด้วยคำสั่งตรงๆ แบบนี้จะหายไปทันทีเมื่อ รีบูตเครื่อง! ถ้าอยากให้ดิสก์ติดมาทุกครั้งที่บูต ต้องไปเขียนใน /etc/fstab — ซึ่งคือหัวใจของหัวข้อถัดไป
ไฟล์ /etc/fstab (filesystem table) คือ “รายการสั่งงาน” ที่ระบบอ่าน ทุกครั้งที่บูต เพื่อ mount ดิสก์ต่างๆ ให้อัตโนมัติ ถ้าเราเพิ่มบรรทัดที่ถูกต้องลงไป ดิสก์ลูกใหม่ก็จะ mount เองทุกครั้ง ไม่ต้องสั่งมือ
แต่ละบรรทัดในไฟล์มี 6 ช่อง คั่นด้วยช่องว่าง เรียงตามนี้:
| คอลัมน์ | คือ |
|---|---|
| 1. อุปกรณ์ | พาร์ติชันที่จะ mount — แนะนำให้ใช้ UUID (เดี๋ยวอธิบาย) |
| 2. จุด mount | โฟลเดอร์ที่จะให้เข้าไป เช่น /mnt/data |
| 3. ชนิด fs | ชนิด filesystem เช่น xfs, ext4, swap |
| 4. options | ตัวเลือกการ mount — ส่วนใหญ่ใช้ defaults |
| 5. dump | เกี่ยวกับการ backup รุ่นเก่า — ใส่ 0 |
| 6. pass | ลำดับการตรวจ filesystem ตอนบูต — root ใส่ 1, อื่นๆ ใส่ 2, swap ใส่ 0 |
ชื่ออย่าง /dev/sdb1 ขึ้นอยู่กับ “ลำดับ” ที่ระบบเจอดิสก์ — ถ้าวันหนึ่งคุณเสียบดิสก์เพิ่ม หรือถอดสายสลับช่อง ดิสก์ที่เคยเป็น sdb อาจกลายเป็น sdc ผลคือ fstab ชี้ผิดที่ และ บูตไม่ขึ้น ทางแก้คือใช้ UUID — รหัสประจำตัวที่ติดกับพาร์ติชันนั้นไปตลอด ไม่เปลี่ยนตามลำดับ
/dev/sdb1 เหมือนเรียกคนด้วย “คนที่ยืนคนที่สองจากซ้าย” — พอมีคนมาแทรกหรือสลับที่ ก็ชี้ผิดคนทันที ส่วน UUID เหมือน “เลขบัตรประชาชน” ติดตัวคนนั้นไปตลอด ยืนตรงไหนก็เรียกถูกคน
[root@server1 ~]# blkid /dev/sdb1 /dev/sdb1: UUID="a1b2c3d4-5678-90ef-1234-567890abcdef" TYPE="xfs"
blkid แสดง UUID และชนิด filesystem ของแต่ละพาร์ติชัน เคล็ดลับห้องสอบ: ส่ง UUID เข้าไฟล์ตรงๆ ด้วย blkid /dev/sdb1 >> /etc/fstab แล้วค่อยจัดบรรทัดให้ถูก จะได้ไม่พิมพ์ UUID ยาวๆ ผิด
# <อุปกรณ์> <จุด mount> <ชนิด> <options> <dump> <pass> UUID=a1b2c3d4-5678-90ef-1234-567890abcdef /mnt/data xfs defaults 0 2
6 ช่องเรียงครบ: UUID → จุด mount → ชนิด → options → dump → pass ตามตารางด้านบนเป๊ะ
หลังแก้ /etc/fstab ห้ามรีบูตทันที ให้รันคำสั่งทดสอบก่อน:
[root@server1 ~]# systemctl daemon-reload ← ให้ systemd อ่าน fstab ใหม่ [root@server1 ~]# mount -a ← ลอง mount ทุกบรรทัดใน fstab
mount -a จะลอง mount ทุกบรรทัดใน fstab — ถ้า ไม่มี error ขึ้น = ปลอดภัย รีบูตได้ แต่ถ้า fstab ผิดและคุณ ไม่ทดสอบ แล้วรีบูตเลย → เครื่องจะค้างตอนบูต เข้าระบบไม่ได้ ต้องไปกู้ด้วยวิธีในบท M7 (Boot & Recovery) ซึ่งเสียเวลามาก
แก้ fstab → systemctl daemon-reload → mount -a → ดู df -h ว่าขึ้นถูก → ถ้าไม่มี error ถึงค่อยรีบูตได้อย่างมั่นใจ
Swap คือพื้นที่บนดิสก์ที่ระบบเอามาใช้ “แทน RAM ชั่วคราว” เมื่อ RAM (หน่วยความจำหลัก) เริ่มเต็ม ระบบจะย้ายข้อมูลที่ไม่ค่อยใช้ออกมาพักไว้ที่ swap เพื่อเอา RAM ไปทำงานเร่งด่วน — ช้ากว่า RAM มาก แต่ช่วยกันไม่ให้เครื่องล่มตอนหน่วยความจำหมด
RAM เหมือน โต๊ะทำงาน ที่กว้างจำกัด ของที่ใช้บ่อยวางบนโต๊ะ พอโต๊ะเต็ม คุณก็เอาของที่ไม่ค่อยใช้ไปวางที่ ชั้นเก็บของหลังห้อง (swap) ก่อน — หยิบช้ากว่า แต่โต๊ะไม่รก ทำงานต่อได้
ขั้นตอนสร้าง swap คล้ายการทำ filesystem แต่ใช้คำสั่งคนละชุด สมมติเราแบ่ง /dev/sdb2 ไว้แล้ว:
[root@server1 ~]# fdisk /dev/sdb ← สร้าง sdb2 แล้วกด t เปลี่ยน type เป็น swap (รหัส 82) [root@server1 ~]# mkswap /dev/sdb2 ← จัดเตรียมพาร์ติชันให้เป็น swap Setting up swapspace ... UUID=f9e8d7c6-... [root@server1 ~]# swapon /dev/sdb2 ← เปิดใช้งาน swap เดี๋ยวนี้ [root@server1 ~]# swapon --show ← ดูว่ามี swap ทำงานอยู่ไหม NAME TYPE SIZE USED PRIO /dev/sdb2 partition 1G 0B -2
t (ใน fdisk)เปลี่ยนชนิดพาร์ติชันเป็น Linux swap (รหัส 82 สำหรับ MBR)mkswap“ฟอร์แมต” พาร์ติชันให้เป็น swap (เทียบได้กับ mkfs ของ filesystem ปกติ)swaponเปิดใช้ swap ทันที / swapoff = ปิดfree -hดูภาพรวม RAM และ swap ที่ใช้อยู่ทั้งหมดUUID=f9e8d7c6-... none swap defaults 0 0
swap ไม่มี “จุด mount” จริง จึงใส่ช่องที่ 2 ว่า none, ชนิดเป็น swap, และ pass (ช่องสุดท้าย) ใส่ 0 เพราะไม่ต้องตรวจตอนบูต
เพิ่มบรรทัด swap ใน fstab แล้ว ทดสอบด้วย swapon -a (เปิด swap ทุกบรรทัดใน fstab) ถ้าไม่ error แล้วค่อยมั่นใจว่าจะติดตอนบูต
mount -a ก่อนรีบูตเสมอ ถ้ามี error ให้แก้ให้หมดก่อน/dev/sdX อาจสลับ ทำให้ fstab ชี้ผิด — ใช้ UUID จาก blkid เสมอจะปลอดภัยกว่า/dev/sdb1 ไม่เจอ ทำอะไรต่อไม่ได้ — รัน partprobe เพื่อให้ kernel เห็นพาร์ติชันใหม่mkfs.xfs (หรือ ext4) ให้เสร็จก่อนเสมอq = ไม่มีอะไรถูกบันทึก ต้องกด w เพื่อเขียนตารางพาร์ติชันจริงfdisk /dev/sda หรือ mkfs ทับดิสก์ระบบ = พังทั้งเครื่อง เช็ก lsblk ทุกครั้งก่อนลงมือ| คำสั่ง | ทำอะไร |
|---|---|
lsblk | ดูดิสก์และพาร์ติชันทั้งหมดแบบต้นไม้ |
fdisk -l | ดูรายละเอียดดิสก์ |
fdisk /dev/sdb | เข้าเมนูแบ่งพาร์ติชัน (n สร้าง, p ดู, d ลบ, t type, w บันทึก, q ออก) |
parted /dev/sdb | แบ่งพาร์ติชันแบบบรรทัดเดียว / รองรับ GPT |
partprobe /dev/sdb | บอก kernel ให้อ่านตารางพาร์ติชันใหม่ |
mkfs.xfs /dev/sdb1 | สร้าง filesystem XFS (ค่าเริ่มต้น RHEL) |
mkfs.ext4 /dev/sdb1 | สร้าง filesystem ext4 |
mount /dev/sdb1 /mnt/data | mount ชั่วคราว (หายเมื่อรีบูต) |
umount /mnt/data | ถอด mount ออก |
df -h | ดูพื้นที่ว่างและรายการที่ mount อยู่ |
blkid | หา UUID และชนิด fs ของพาร์ติชัน |
mount -a | ทดสอบ fstab — mount ทุกบรรทัด (รันก่อนรีบูตเสมอ!) |
systemctl daemon-reload | ให้ systemd อ่าน fstab ที่แก้ใหม่ |
mkswap /dev/sdb2 | เตรียมพาร์ติชันให้เป็น swap |
swapon /dev/sdb2 | เปิดใช้ swap / swapoff = ปิด |
swapon --show | ดู swap ที่ทำงานอยู่ |
free -h | ดูภาพรวม RAM และ swap |
เห็นดิสก์เปล่า (lsblk) → แบ่งพาร์ติชัน (fdisk + partprobe) → สร้าง filesystem (mkfs.xfs) → mount ชั่วคราวลองดู (mount + df -h) → ทำให้ถาวรด้วย UUID ใน /etc/fstab แล้ว ทดสอบด้วย mount -a ก่อนรีบูต → และสร้าง swap ได้ครบวงจร เท่านี้คุณก็จัดการ storage พื้นฐานของ RHCSA ได้แล้ว!