บทนี้คือ “ฮีโร่กู้สถานการณ์” ของ RHCSA — เมื่อเครื่องบูตไม่ขึ้น หรือลืมรหัส root ขึ้นมา คุณจะรู้วิธีงัดเครื่องกลับมาให้ทำงานได้ และนี่คือเนื้อหาที่ข้อสอบ ชอบออกที่สุด
🌱 เขียนเพื่อคนที่ไม่เคยแตะ Linux มาก่อนเลย — ค่อยๆ ไปทีละขั้นถ้าให้เดิมพันว่าข้อสอบ RHCSA จะออกอะไรแน่ๆ — บทนี้คือคำตอบ เพราะข้อสอบเกือบทุกชุดมักจะมีโจทย์ประมาณนี้:
/etc/fstab ผิดข้อรีเซ็ตรหัส root เป็นข้อที่ ถ้าทำไม่ได้ คุณจะล็อกอินเข้าเครื่องไม่ได้เลย — แปลว่าข้ออื่นๆ ที่ต้องใช้ root ก็พังตามไปด้วย! ดังนั้นถ้าฝึกบทนี้ให้คล่อง คุณจะ “ปลดล็อก” คะแนนอีกหลายข้อในเวลาเดียว
ข่าวดีคือ ขั้นตอนทั้งหมดเป็นสูตรตายตัว ท่องจำลำดับให้ได้แล้วทำซ้ำๆ จนคล่อง — ไม่ต้องเข้าใจลึกระดับวิศวกรก็สอบผ่านได้
ก่อนจะกู้ระบบเป็น เราต้องเข้าใจคร่าวๆ ก่อนว่า ตั้งแต่กดปุ่มเปิดเครื่อง จนถึงหน้า login มันเกิดอะไรขึ้นบ้าง ลำดับมีดังนี้:
1. เปิดเครื่อง (กดปุ่ม power) 2. BIOS / UEFI ← เฟิร์มแวร์ในเมนบอร์ด ตรวจฮาร์ดแวร์เบื้องต้น 3. GRUB2 ← เมนูเลือกบูต (ตรงนี้แหละที่เราจะเข้าไปแก้รหัส root) 4. Kernel + initramfs ← โหลดหัวใจของระบบเข้าหน่วยความจำ 5. systemd ← ตัวจัดการ เริ่มสตาร์ตบริการต่างๆ ตาม target 6. หน้า login ← พร้อมให้เราล็อกอินเข้าใช้งาน
ลองนึกถึง ลำดับการตื่นนอนแล้วเตรียมตัวออกจากบ้าน:
• BIOS/UEFI = นาฬิกาปลุกดังขึ้น เราลืมตา เช็กว่าแขนขายังครบ (ตรวจฮาร์ดแวร์)
• GRUB2 = ยืนหน้าตู้เสื้อผ้า เลือกว่าวันนี้จะใส่ชุดไหน (เลือกว่าจะบูต kernel ตัวไหน)
• Kernel + initramfs = อาบน้ำแต่งตัว ใส่ชุดที่เลือก (โหลดระบบหลัก)
• systemd = ทำกิจวัตรเช้า เปิดไฟ ชงกาแฟ เปิดประตู (สตาร์ตบริการทีละอย่าง)
• หน้า login = พร้อมออกจากบ้านไปทำงาน (ใช้งานเครื่องได้)
คุณไม่ต้องท่องทุกขั้น แค่จำว่า GRUB2 มาก่อน → kernel → systemd และจุดที่เราจะ “แทรกแซง” เพื่อกู้รหัส root คือตอนอยู่ที่ เมนู GRUB2 (ขั้นที่ 3)
สมัยก่อน Linux ใช้คำว่า runlevel (ระดับการทำงาน เป็นตัวเลข 0–6) แต่ RHEL 9 ใช้ systemd ซึ่งเปลี่ยนมาเรียกว่า target แทน — มันคือ “โหมด” ว่าเครื่องจะเปิดบริการมากน้อยแค่ไหน
นึกถึง โหมดของโทรศัพท์: โหมดปกติ (เปิดทุกอย่าง), โหมดประหยัดแบต (เปิดเท่าที่จำเป็น), โหมดเครื่องบิน (เปิดน้อยสุด) — target ก็คือการเลือกว่าเครื่อง Linux จะ “เปิดบริการ” มากน้อยแค่ไหนนั่นเอง
target ที่ต้องรู้จักมี 4 ตัวหลัก เทียบกับ runlevel เดิมได้ตามนี้:
| Target | runlevel เดิม | ทำอะไร |
|---|---|---|
multi-user.target | 3 | โหมด text หลายผู้ใช้ ไม่มี GUI — โหมดที่เซิร์ฟเวอร์จริงใช้กันมากสุด |
graphical.target | 5 | เหมือน multi-user แต่ มีหน้าจอกราฟิก (GUI) เพิ่มเข้ามา |
rescue.target | 1 / s | โหมดกู้ระบบ — เมาต์ดิสก์ให้ มีบริการพื้นฐาน ต้องใส่รหัส root |
emergency.target | — | โหมดฉุกเฉินสุดๆ เปิดน้อยที่สุด ดิสก์เมาต์แบบอ่านอย่างเดียว ใช้ตอนระบบพังหนัก |
multi-user = ทำงานปกติแบบไม่มีจอสวย / graphical = มีจอสวย / rescue กับ emergency = ไว้กู้เครื่องเวลามีปัญหา (emergency เปิดน้อยกว่า rescue)
“target เริ่มต้น” คือโหมดที่เครื่องจะเข้าโดยอัตโนมัติทุกครั้งที่บูต เราดูและเปลี่ยนได้ด้วยคำสั่ง systemctl
[root@server1 ~]# systemctl get-default graphical.target
get-default = “ขอดูว่าโหมดเริ่มต้นคืออะไร” — ในตัวอย่างนี้เครื่องบูตเข้า GUI ทุกครั้ง
[root@server1 ~]# systemctl set-default multi-user.target Removed /etc/systemd/system/default.target. Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/multi-user.target.
set-default = “ตั้งโหมดเริ่มต้นใหม่” — หลังจากนี้เครื่องจะบูตเข้าโหมด text ทุกครั้ง (เป็นโจทย์ที่ข้อสอบชอบถาม) การเปลี่ยนนี้ ถาวร ต้องรีบูตถึงจะเห็นผลเต็มที่
[root@server1 ~]# systemctl isolate graphical.target
isolate = “สลับไปโหมดนี้เดี๋ยวนี้เลย” แต่ ไม่ถาวร — พอรีบูตจะกลับไปใช้ค่า default เดิม เหมาะเวลาอยากลองโหมดอื่นชั่วคราวโดยไม่ต้องรีบูต
set-default = ถาวร (ตั้งค่าว่าบูตครั้งหน้าจะเข้าโหมดไหน) ส่วน isolate = ชั่วคราว (สลับเดี๋ยวนี้ พอรีบูตหาย) — ข้อสอบที่บอกว่า “ให้เครื่องบูตเข้า...” มักหมายถึง set-default
นี่คือขั้นตอนที่ ต้องท่องให้ขึ้นใจ เพราะเป็นโจทย์ที่ออกสอบบ่อยที่สุด สถานการณ์คือ: คุณไม่รู้รหัส root และต้องตั้งรหัสใหม่ให้ได้ โดยไม่มีทางใช้ passwd ตามปกติ (เพราะล็อกอินเป็น root ไม่ได้ตั้งแต่แรก)
วิธีคือ แทรกเข้าไปตอนบูต เพื่อให้ได้ shell ที่เป็น root โดยไม่ต้องใส่รหัส มาทำทีละขั้น:
eรีบูตเครื่อง พอเห็นเมนู GRUB2 (มีรายการให้เลือกบูต) ให้ กดลูกศรไปที่บรรทัดบนสุด แล้วกดปุ่ม e (edit) เพื่อเข้าโหมดแก้ไข
linux แล้วเติม rd.break ต่อท้ายเลื่อนหาบรรทัดที่ขึ้นต้นด้วยคำว่า linux (จะยาวมาก) เลื่อนเคอร์เซอร์ไป ท้ายสุดของบรรทัดนั้น แล้วพิมพ์เว้นวรรคตามด้วย rd.break
ก่อนแก้: linux ($root)/vmlinuz-5.14... root=/dev/mapper/rhel-root ro crashkernel=1G หลังแก้ (เติม rd.break ต่อท้าย): linux ($root)/vmlinuz-5.14... root=/dev/mapper/rhel-root ro crashkernel=1G rd.break
rd.break = สั่งให้บูตหยุดกลางทาง (ตอนที่ initramfs ยังคุมอยู่) ก่อนที่ระบบจริงจะขึ้นมา — ทำให้เราได้ shell มาทำงานต่อโดยยังไม่ต้องใส่รหัส
Ctrl+X เพื่อบูตต่อกด Ctrl+X (บางที่เขียนว่า F10) เพื่อบูตด้วยบรรทัดที่เราเพิ่งแก้ เครื่องจะบูตแล้วหยุดที่ switch_root prompt (จะเห็นข้อความ switch_root:/#)
ตอนนี้ระบบจริงของเราถูกเมาต์ไว้ที่ /sysroot แต่เป็นแบบ อ่านอย่างเดียว เราต้องสั่งเมาต์ใหม่ให้เขียนได้ก่อน
switch_root:/# mount -o remount,rw /sysroot
remount,rw = เมาต์ /sysroot ใหม่ในโหมด rw (read-write = อ่าน-เขียนได้) ถ้าข้ามขั้นนี้ จะตั้งรหัสใหม่ไม่ได้เพราะดิสก์เขียนไม่ได้
switch_root:/# chroot /sysroot sh-5.1# _
chroot /sysroot = “ย้ายตัวเองเข้าไปอยู่ในระบบจริง” ทำให้คำสั่งที่พิมพ์ต่อจากนี้มีผลกับระบบของเราจริงๆ (สังเกตว่า prompt เปลี่ยนเป็น sh-5.1#)
sh-5.1# passwd root Changing password for user root. New password: ******** Retype new password: ******** passwd: all authentication tokens updated successfully.
passwd root = ตั้งรหัสใหม่ให้ user ชื่อ root (พิมพ์รหัสแล้วจะไม่เห็นตัวอักษรบนจอ เป็นเรื่องปกติ) พิมพ์ซ้ำ 2 ครั้งให้ตรงกัน
touch /.autorelabel — ห้ามลืมเด็ดขาด!sh-5.1# touch /.autorelabel
touch /.autorelabel = สร้างไฟล์เปล่าชื่อ .autorelabel ไว้ที่ / เพื่อ สั่งให้ SELinux ทำ relabel (ติดป้ายความปลอดภัยให้ไฟล์ใหม่ทั้งหมด) ตอนบูตครั้งหน้า
ตอนที่เราแก้รหัสด้วย passwd ไฟล์ /etc/shadow ถูกเขียนใหม่ โดยไม่มีป้าย SELinux ที่ถูกต้อง ถ้าไม่สั่ง relabel เครื่องจะบูตขึ้นมาแต่ ล็อกอินไม่ได้ (รหัสถูกแต่เข้าไม่ได้) ทำให้นึกว่าทำพลาด ทั้งที่จริงแค่ลืมบรรทัดนี้
กฎเหล็ก: รีเซ็ตรหัส root ทีไร ต้องพิมพ์ touch /.autorelabel ทุกครั้ง — ท่องให้ติดปาก!
sh-5.1# exit switch_root:/# exit (เครื่องจะบูตต่อ ทำ relabel แล้วรีบูตอีกรอบเอง — รอสักครู่)
exit ครั้งแรก = ออกจาก chroot / exit ครั้งที่สอง = ออกจาก switch_root shell แล้วบูตต่อ ระบบจะ relabel (อาจใช้เวลาสักพักและรีบูตเองอีกครั้ง) จากนั้นล็อกอินด้วยรหัสใหม่ได้เลย
GRUB กด e → เติม rd.break → Ctrl+X → mount -o remount,rw /sysroot → chroot /sysroot → passwd root → touch /.autorelabel → exit exit
ไฟล์ /etc/fstab คือรายการบอกระบบว่า “ตอนบูต ให้เมาต์ดิสก์ลูกไหน ไปไว้ที่โฟลเดอร์ไหน” (เดี๋ยวเจาะลึกในบท M8) ปัญหาคือ ถ้าเขียนผิดแม้แค่บรรทัดเดียว เช่นพิมพ์ชื่อดิสก์ผิด — เครื่องอาจบูตไม่ขึ้น แล้วตกไปที่ emergency mode
/etc/fstab เหมือน “รายการสัมภาระที่ต้องหยิบก่อนออกจากบ้าน” ถ้าในรายการเขียนว่า “หยิบกระเป๋าจากห้องที่ไม่มีอยู่จริง” คุณก็จะยืนงงหาไม่เจอ ออกจากบ้านไม่ได้ — เครื่องก็ค้างตรง emergency mode แบบเดียวกัน
เมื่อเครื่องตกไป emergency mode มันจะให้ใส่รหัส root แล้วได้ shell มา ขั้นตอนกู้คือ:
Give root password for maintenance: ******** [root@server1 ~]# mount -o remount,rw / [root@server1 ~]# vim /etc/fstab (แก้บรรทัดที่ผิด หรือใส่ # หน้าบรรทัดที่มีปัญหาเพื่อปิดมันชั่วคราว) [root@server1 ~]# systemctl daemon-reload [root@server1 ~]# mount -a [root@server1 ~]# reboot
mount -o remount,rw /เมาต์ / ใหม่ให้เขียนได้ (ตอน emergency มันเป็น read-only)vim /etc/fstabแก้บรรทัดที่เขียนผิด — เคล็ดลับ: ลองใส่ # นำหน้าบรรทัดที่สงสัยเพื่อปิดมันก่อนsystemctl daemon-reloadสั่งให้ systemd อ่าน fstab ใหม่mount -aทดสอบ! สั่งเมาต์ทุกบรรทัดใน fstab — ถ้า ไม่มี error แปลว่าแก้ถูกแล้ว บูตขึ้นแน่rebootรีบูตเพื่อยืนยันว่ากลับมาบูตได้ปกติmount -a เสมอ
การรัน mount -a คือการ “ซ้อมบูต” — ถ้ามันไม่ขึ้น error แสดงว่า fstab ถูกแล้ว ถ้ารีบูตทันทีโดยไม่ทดสอบ แล้วยังผิดอยู่ คุณจะวนกลับมา emergency mode อีกรอบ เสียเวลาสอบฟรีๆ
รายละเอียดของ /etc/fstab ว่าแต่ละช่องหมายถึงอะไร ใช้ UUID ยังไง จะอธิบายเต็มๆ ในบท M8 · Storage — ตอนนี้แค่รู้วิธี “กู้” ให้บูตกลับมาได้ก็พอ
เวลาเครื่องมีปัญหาตอนบูต เราอยากรู้ว่า “อะไรพัง” — journalctl คือเครื่องมือดู log (บันทึกเหตุการณ์) ของระบบที่ systemd เก็บไว้ให้
[root@server1 ~]# journalctl -b (แสดง log ของการบูตรอบปัจจุบันทั้งหมด) [root@server1 ~]# journalctl -xe (แสดง log ล่าสุดท้ายสุด พร้อมคำอธิบายเพิ่ม เหมาะตอนหาว่าอะไรเพิ่งพัง)
journalctl -b-b = boot — แสดง log ตั้งแต่บูตรอบนี้ ใช้ดูว่าตอนบูตมีอะไรผิดพลาดjournalctl -xe-x เพิ่มคำอธิบาย / -e กระโดดไปท้ายสุด (ล่าสุด) — ดูปัญหาที่เพิ่งเกิดได้เร็วอยู่ในหน้า journalctl แล้วออกไม่เป็น? กด q เหมือนตอนอยู่ใน man นั่นแหละ (มันใช้ตัวเลื่อนหน้าตัวเดียวกัน)
touch /.autorelabel: สาเหตุอันดับ 1 ของการสอบตกข้อรีเซ็ตรหัส! ตั้งรหัสใหม่สำเร็จ แต่บูตมาแล้ว ล็อกอินไม่ได้ เพราะ SELinux ไม่ยอม — ท่องไว้ว่ารีเซ็ตรหัสทีไร ต้อง relabel ทุกครั้งmount -o remount,rw /sysroot: ข้ามขั้นนี้แล้วรีบ passwd เลย จะตั้งรหัสไม่ได้เพราะดิสก์เป็น read-only (เขียนไม่ได้) ต้อง remount เป็น rw ก่อนเสมอchroot /sysroot: ถ้าไม่ chroot คำสั่ง passwd จะไปแก้รหัสของ initramfs ชั่วคราว ไม่ใช่ระบบจริง — รีบูตมาก็ไม่เปลี่ยน ต้อง chroot เข้าระบบจริงก่อนmulti-user แต่ดันไปใช้ isolate (ชั่วคราว) แทน set-default (ถาวร) — พอตรวจหลังรีบูต ค่าหายไปแล้ว ได้ 0 คะแนนmount -a: ถ้ายังแก้ไม่ถูก จะวนกลับมา emergency mode อีกรอบ เสียเวลา — ทดสอบด้วย mount -a ให้ผ่านก่อนค่อยรีบูต| คำสั่ง | ทำอะไร |
|---|---|
systemctl get-default | ดูว่า target เริ่มต้นคืออะไร |
systemctl set-default multi-user.target | ตั้ง target เริ่มต้นเป็น text (ถาวร) |
systemctl set-default graphical.target | ตั้ง target เริ่มต้นเป็น GUI (ถาวร) |
systemctl isolate graphical.target | สลับโหมดเดี๋ยวนี้ (ชั่วคราว ไม่ถาวร) |
| ขั้น | ทำอะไร |
|---|---|
| 1 | ที่เมนู GRUB กด e |
| 2 | ไปท้ายบรรทัด linux เติม rd.break |
| 3 | กด Ctrl+X บูตต่อ |
| 4 | mount -o remount,rw /sysroot |
| 5 | chroot /sysroot |
| 6 | passwd root (ตั้งรหัสใหม่) |
| 7 | touch /.autorelabel ⭐ ห้ามลืม |
| 8 | exit แล้ว exit (รีบูต) |
| คำสั่ง | ทำอะไร |
|---|---|
mount -o remount,rw / | เมาต์ / ใหม่ให้เขียนได้ (ใน emergency mode) |
mount -a | “ซ้อมบูต” — ทดสอบ fstab ว่าถูกไหมก่อนรีบูต |
systemctl daemon-reload | ให้ systemd อ่าน fstab ใหม่ |
journalctl -b | ดู log การบูตรอบปัจจุบัน |
journalctl -xe | ดู log ล่าสุดพร้อมคำอธิบาย |
เข้าใจลำดับการบูต (GRUB → kernel → systemd) → เปลี่ยน target เริ่มต้นได้ → รีเซ็ตรหัส root ได้คล่องโดยไม่ลืม touch /.autorelabel → และกู้ระบบที่ fstab ผิดให้กลับมาบูตได้ — ครบเครื่องสำหรับข้อสอบหมวด Boot & Recovery!