Linux Boot Process

คำถามเรื่อง Linux Boot Process เป็นคำถามวัดฐานรากความเข้าใจการทำงานร่วมกันระหว่าง Hardware, Kernel และ User-space ที่กรรมการสอบ RRK ชอบใช้ไล่ลำดับตั้งแต่ต้นจนจบ

Question: End-to-End Linux Boot Sequence & Troubleshooting

“ช่วยอธิบายขั้นตอนการบูตของ Linux Server ตั้งแต่วินาทีแรกที่กดปุ่ม Power จนกระทั่งระบบพร้อมให้บริการผู้ใช้ที่ Login Prompt หรือ Systemd Target:

  1. มีลำดับขั้นตอนหลักอะไรบ้าง ตั้งแต่ BIOS/UEFI –> Bootloader (GRUB2) –> Kernel –> Initramfs/Initrd –> Systemd (Init)?
  2. ตัว initramfs (Initial RAM Filesystem) มีหน้าที่อะไร และทำไม Kernel ถึงต้องการมันก่อนที่จะ Mount Root Filesystem (/) จริง?
  3. หากเซิร์ฟเวอร์บูตไม่ขึ้นและค้างอยู่ที่หน้าจอ Emergency Mode หรือหลุดเข้าไปในหน้าต่าง dracut:/# / (initramfs) ปัญหานี้มักเกิดจากสาเหตุใด และคุณจะแก้ปัญหาอย่างไร?”

แนวทางคำตอบและโครงสร้างเนื้อหา (Key Talking Points)

https://bytebytego.com/guides/linux-boot-process-explained

1. ลำดับการบูต 5 ขั้นตอนหลัก

  • Step 1: Hardware & Firmware (BIOS / UEFI)
    • รัน POST (Power-On Self-Test) ตรวจสอบความพร้อมของ CPU, RAM, อุปกรณ์เชื่อมต่อ
    • อ่าน Boot Priority เพื่อมองหา Bootloader:
      • Legacy BIOS: อ่าน Master Boot Record (MBR) ขนาด 512 bytes แรกของดิสก์
      • Modern UEFI: อ่านไฟล์ Bootloader (.efi) จากพาร์ทิชันพิเศษ ESP (EFI System Partition – FAT32) เช่น /EFI/BOOT/BOOTX64.EFI
  • Step 2: Bootloader (GRUB2)
    • โหลดหน้าต่างเมนูให้เลือก Kernel Version หรือใส่ Kernel Parameters (กด e เพื่อแก้ไข)
    • ทำหน้าที่โหลดไฟล์ 2 ก้อนสำคัญขึ้นสู่ RAM:
      1. vmlinuz (ตัวบีบอัดของ Linux Kernel)
      2. initramfs (หรือ initrd – อิมเมจระบบไฟล์ชั่วคราว)
    • ส่งมอบการควบคุม (Execution Control) ให้ Kernel ทำงานต่อ
  • Step 3: Kernel Initialization
    • Kernel คลายการบีบอัดตัวเองและเข้าควบคุม Hardware
    • ตรวจสอบสถาปัตยกรรม CPU, ค้นพบและ Initialize ไดรเวอร์ฮาร์ดแวร์พื้นฐานที่ Built-in อยู่ในตัวมัน
  • Step 4: The Bridge — initramfs (Initial RAM Filesystem)
    • หน้าที่สำคัญ: เป็น Root Filesystem ขนาดเล็กจำลองบน RAM ที่บรรจุ Driver โมดูลที่จำเป็น (เช่น Storage Controller Driver, NVMe, SAS/SATA RAID, LVM, Software RAID, Multipath, หรือ Network driver ในกรณี iSCSI Boot)
    • Kernel จะรันโมดูลใน initramfs เพื่อให้รู้จัก Controller และ Storage $\rightarrow$ ทำการค้นหาและ Mount Root Filesystem (/) ของจริง ที่อยู่บนดิสก์
    • เมื่อ Mount / จริงสำเร็จ จะสั่งเปลี่ยน Root ชั่วคราวด้วยคำสั่ง pivot_root หรือ switch_root ไปยังดิสก์จริง และเคลียร์ initramfs ออกจาก RAM
  • Step 5: Systemd (PID 1) & Targets
    • รันโปรเซสแม่ตัวแรกของระบบคือ /sbin/init (ซึ่งคือ Symlink ไปหา systemd)
    • โหลด Configuration จาก /etc/systemd/system/
    • ประมวลผลและสตาร์ต Service ต่างๆ แบบคู่ขนาน (Parallel execution) ไปตามลำดับ Target:
      • basic.target$\rightarrow$sysinit.target$\rightarrow$multi-user.target (โหมด Text/CLI) หรือ graphical.target (โหมด GUI)
    • รัน Service Network, SSHD และพร้อมเปิดรับ Connection

2. เจาะลึกความจำเป็นของ initramfs (คำถามวัดกึ๋น)

  • ทำไมไม่ฝัง Driver ทั้งหมดไว้ใน Kernel ตรงๆ?
    • ถ้าฝังไดรเวอร์ของฮาร์ดแวร์ทุกค่ายในโลก ขนาด Kernel จะบวมเป็นหลายร้อย MB ทำให้การบูตช้าและเปลือง RAM มหาศาล
  • บทบาทของ initramfs:
    • เก็บเฉพาะ Driver ที่เครื่องนั้นต้องใช้ในการ “อ่านดิสก์ลูกแรก” เมื่ออ่านดิสก์จริงได้แล้ว Driver ที่เหลือจะค่อยไปอ่านจาก /lib/modules บนฮาร์ดดิสก์จริง

3. การแก้ปัญหาเมื่อหลุดไปค้างที่ (initramfs) หรือ Emergency Mode

  • สาเหตุยอดฮิต:
    1. UUID ใน /etc/fstab ไม่ตรง / เปลี่ยน Disk ใหม่: เมื่อระบบหา Disk UUID ของ Root (/) ไม่เจอ จะหยุดชะงักทันที
    2. Filesystem Corrupted (ไฟล์ระบบพัง): เกิดจากการดับกะทันหัน ทำให้ Clean bit ไม่สมบูรณ์ ระบบปฏิเสธการ Mount
    3. LVM หรือ RAID ไม่ Activate: Driver คอนโทรลเลอร์ไม่โหลด หรือ Array มีปัญหาหลุด degraded
  • วิธีแก้ไขหน้างาน:
    • ใช้ lsblk -f หรือ blkid ดู UUID ของ Partition จริง เทียบกับข้อมูลที่ระบุใน boot parameter
    • รันตรวจสอบและซ่อมแซม Filesystem ด้วยตนเอง:
      Bashfsck -y /dev/sda1
    • หากติดเรื่อง Read-only ให้ Remount เพื่อเข้าไปแก้ /etc/fstab:
      Bashmount -o remount,rw / vi /etc/fstab
    • ทำการพิมพ์ exit หรือ reboot เพื่อให้ Kernel ดำเนินการบูตต่อ

โครงสรุป 30 วินาทีสำหรับตอบสัมภาษณ์

*”Linux Boot Sequence เริ่มจาก BIOS/UEFI ทำ POST และส่งต่อให้ GRUB2 โหลด Kernel (vmlinuz) และ initramfs ขึ้นสู่ RAM

ตัว initramfs มีหน้าที่โหลด Storage/RAID Driver ที่จำเป็นเพื่อค้นหาและ Mount Root Filesystem (/) จริง บนดิสก์ จากนั้นส่งต่อการทำงานให้ systemd (PID 1) เพื่อสตาร์ต Services แบบขนานตาม Target เช่น multi-user.target ครับ”*

แผนภาพ Infographic ลำดับขั้นตอนการบูตของระบบ Linux ตั้งแต่ระดับเฟิร์มแวร์ฮาร์ดแวร์จนถึงระดับ User Space และ Systemd Targets

โครงสร้างลำดับขั้นตอน (Linux Boot Sequence Pipeline)

[ 1. Firmware ]      BIOS / UEFI  ──(POST & Boot Device Search)──► ESP / MBR
                           │
                           ▼
[ 2. Bootloader ]    GRUB2        ──(Load Kernel & Initramfs to RAM)──► /boot
                           │
                           ▼
[ 3. Kernel ]        vmlinuz      ──(Decompress, Init Hardware Drivers)
                           │
                           ▼
[ 4. Temp Root ]     initramfs    ──(Load RAID/LVM/Storage Drivers ──► Mount Real `/`)
                           │
                           ▼
[ 5. Init (PID 1) ]  systemd      ──(Read /etc/systemd/system/ & Parallel Execution)
                           │
                           ▼
[ 6. Targets ]       sysinit.target ──► basic.target ──► multi-user.target / graphical.target

เจาะลึก 5 ขั้นตอนหลักในกระบวนการ

1. Hardware & Firmware Stage (BIOS / UEFI)

  • POST (Power-On Self-Test): ตรวจสอบความพร้อมของอุปกรณ์ฮาร์ดแวร์พื้นฐาน (CPU, Memory, Mainboard)
  • Boot Device Selection: ค้นหาอุปกรณ์บูตตามลำดับ Boot Priority
    • Legacy BIOS: อ่าน MBR (Master Boot Record) ขนาด 512 ไบต์แรกของดิสก์
    • UEFI: อ่านไฟล์ปฏิบัติการ .efi (เช่น shimx64.efi หรือ grubx64.efi) จาก Partition พิเศษ ESP (EFI System Partition – FAT32)

2. Bootloader Stage (GRUB2)

  • โหลดคอนฟิกูเรชันจาก /boot/grub2/grub.cfg เพื่อแสดงเมนูให้เลือก Kernel
  • โหลดไฟล์ 2 ส่วนสำคัญเข้าสู่ RAM:
    1. vmlinuz: ไบนารีเคอร์เนลของ Linux (บีบอัดอยู่)
    2. initramfs (หรือ initrd): อิมเมจระบบไฟล์ชั่วคราวบน RAM
  • ส่งมอบการประมวลผล (Control) ให้กับ Linux Kernel

3. Kernel Stage

  • เคอร์เนลทำการคลายการบีบอัดตัวเองและเข้าควบคุมเครื่อง
  • เริ่มต้นโครงสร้างข้อมูลระดับระบบของระบบปฏิบัติการ (CPU Caches, Memory Paging, Interrupt Handlers)

4. The Bridge: initramfs (Initial RAM Filesystem)

  • ทำหน้าที่เป็นระบบไฟล์รากชั่วคราวบน RAM เพื่อโหลดโมดูล/ไดรเวอร์เฉพาะทางที่จำเป็นต่อการเข้าถึง Storage:
    • เช่น Storage Driver (NVMe, SAS), Software RAID (mdadm), LVM (lvm2), Filesystem Driver (ext4, xfs) หรือ Multipath
  • ทำการค้นหาและ Mount Root Filesystem จริง (/) ที่อยู่บนดิสก์
  • รันคำสั่ง pivot_root หรือ switch_root เพื่อสลับการทำงานไปยัง Root Filesystem จริงบนดิสก์ และเคลียร์ initramfs ทิ้งจากหน่วยความจำ

5. Init System & Systemd Targets (User Space – PID 1)

  • เคอร์เนลเรียกโปรเซสผู้ใช้ตัวแรกคือ /sbin/init ซึ่งเชื่อมโยง (Symlink) ไปยัง systemd (PID 1)
  • systemd เริ่มต้นโหลด Unit Files และจัดคิวเริ่มการทำงานของ Service ต่างๆ แบบขนาน (Parallel Execution) ตามลำดับ Target:
    • sysinit.target: ตรวจสอบและ Mount Filesystem เพิ่มเติม, ตั้งค่า Swap, สตาร์ต Udev
    • basic.target: เตรียมความพร้อมระบบพื้นฐาน Socket และ Timers
    • multi-user.target: สตาร์ต Service สำคัญ เช่น Network, SSHD, Database, Nginx (เทียบเท่า Runlevel 3 เดิม)
    • graphical.target: สตาร์ต Display Manager / X11 / Wayland สำหรับเครื่องที่มี GUI (เทียบเท่า Runlevel 5 เดิม)

จุดเทียบระหว่าง System V Init (ระบบเดิม) กับ Systemd (ระบบปัจจุบัน)

System V Init (Runlevels)Systemd Equivalent (Targets)วัตถุประสงค์การใช้งาน
Runlevel 0poweroff.targetปิดเครื่อง (Halt / Shutdown)
Runlevel 1 (Single-user)rescue.targetโหมดกู้คืนระบบแบบ Minimal (ไม่มี Network)
Runlevel 3 (Multi-user Text)multi-user.targetโหมด CLI มาตรฐานสำหรับ Linux Server ทั่วไป
Runlevel 5 (Graphical)graphical.targetโหมด Desktop GUI พร้อมระบบ Network
Runlevel 6reboot.targetรีสตาร์ตระบบ

วิธีจำง่ายๆ ให้ใช้สูตรตัวย่อ “B – G – K – I – S – T” และเปรียบเทียบกับ “การขึ้นเวทีคอนเสิร์ต”

สูตรตัวย่อ: B – G – K – I – S – T

“Big Giant Kills Insects, Saves Town”

หรือท่องสั้นๆ: บอส – กรับ – เคอร์เนล – อีนิทแรม – ซิสเต็มดี – ทาร์เก็ต

ขั้นตอนตัวย่อเปรียบเหมือนคอนเสิร์ตทำหน้าที่อะไรในระบบ
1. BIOS / UEFIBยามเฝ้าประตู / ช่างไฟเช็กไฟ POST และมองหาว่าจะไปหยิบกุญแจ (Bootloader) ที่ไหน
2. GRUB2Gคนขับรถตู้ไปรับนักร้องหลัก (Kernel) กับกระเป๋าเครื่องมือ (initramfs) ขึ้นมาบนรถ (RAM)
3. KernelKนักร้องนำ (ตัวเอก)ตัวระบบปฏิบัติการ ตื่นขึ้นมาคุมฮาร์ดแวร์ แต่ยังเปิดตู้เสื้อผ้าบนดิสก์จริงไม่เป็น
4. InitramfsIกระเป๋าดอกกุญแจชั่วคราวมีไดรเวอร์ (LVM, RAID) เอาไว้ไขเปิดตู้เสื้อผ้าจริง (Mount Root /) พอเปิดได้แล้วก็ทิ้งไป
5. SystemdSผู้จัดการวง (PID 1)โปรเซสแรกที่เข้ามาจัดคิว สั่งทุกคนให้เริ่มทำงานพร้อมๆ กัน (Parallel)
6. TargetsTฉากจบของการแสดงเป้าหมายปลายทาง เช่น จบที่หน้าจอดำ CLI (multi-user) หรือหน้าจอภาพ GUI (graphical)

จุดจำ 3 รอยต่อที่ชอบใช้ออกสอบ (ไม่ต้องจำทุกคำ จำแค่ 3 คู่)

  1. BIOS –> GRUB: ฮาร์ดแวร์ส่งงานให้ Bootloader
  2. Kernel + Initramfs –> Real Root: ดึงกุญแจชั่วคราวมาเปิดอ่านดิสก์จริง (switch_root)
  3. Initramfs –> Systemd: เลิกโหมดกู้ภัย เข้าสู่การรันเซอร์วิสให้คนใช้งาน

ท่องแค่ B – G – K – I – S – T ไล่จากล่างขึ้นบน จะนึกภาพตามสเต็ปออกทันทีโดยไม่ต้องท่องจำศัพท์เทคนิคยาวๆ

Lab Section

การทำแล็บจริงบน VM (VirtualBox, VMware, KVM หรือ Proxmox) จะทำให้เห็นภาพตรงรอยต่อของแต่ละสเต็ปชัดเจนมาก เพราะถ้าอ่านแค่ทฤษฎี เราจะนึกภาพไม่ออกว่า initramfs คืออะไร หรือ Kernel มันเปลี่ยนมือไปให้ systemd ตอนไหน

แนะนำ 4 แล็บเด็ด ที่ทำได้ง่าย ปลอดภัย (ทำบน VM สำรอง) และตรงกับที่ Google ชอบถามเป๊ะๆ ค่ะ:

แล็บที่ 1: ผ่าดูไส้ในของ initramfs (ทำความเข้าใจว่ามันคืออะไร)

initramfs ไม่ใช่ไฟล์ลึกลับ แต่มันคือไฟล์บีบอัด (Archive) แบบ CPIO ที่บรรจุไดเรกทอรีรากจำลอง ลองแกะออกมาดูได้เลยบนเครื่องทดสอบ:

Bash

# 1. สร้างโฟลเดอร์ทดลอง
mkdir -p /tmp/initrd_inspect && cd /tmp/initrd_inspect

# 2. คัดลอก initramfs ของเครื่องปัจจุบันมา (ดูชื่อไฟล์ใน /boot)
cp /boot/initramfs-$(uname -r).img ./initramfs.img  # สำหรับ RHEL/CentOS
# หรือ cp /boot/initrd.img-$(uname -r) ./initramfs.img # สำหรับ Ubuntu/Debian

# 3. ใช้คำสั่ง unmkinitramfs (Debian/Ubuntu) หรือ lsinitrd (RHEL/CentOS)
# ถ้าเป็น RHEL/CentOS ดูข้างในได้เลยด้วย:
lsinitrd initramfs.img | grep -iE 'kernel/drivers/block|ext4|xfs'

# ถ้าเป็น Ubuntu/Debian แตกไฟล์ออกมาดู:
unmkinitramfs initramfs.img ./extracted/
ls -la ./extracted/main/
  • สิ่งที่จะได้เห็น: คุณจะเห็นว่าข้างในมีโครงสร้างเหมือน Linux เล็กๆ ตัวหนึ่ง มี /bin, /lib/modules ที่มีไดรเวอร์ Storage/RAID และมีสคริปต์ชื่อ init ตัวเล็กๆ ที่เตรียมรันคำสั่ง switch_root

แล็บที่ 2: จำลองวิกฤต บูตหลุดเข้า (initramfs) หรือ dracut:# (Incident ยอดฮิต)

ทดลองแกล้งทำให้ระบบหา Root Disk ไม่เจอ เพื่อฝึกแก้ปัญหาหน้างาน:

Bash

# 1. แกล้งแก้ UUID ใน /etc/fstab (พิมพ์มั่วไป 1 ตัวอักษรตรงบรรทัด /)
sudo nano /etc/fstab

# 2. สั่ง Reboot เครื่อง
sudo reboot
  • ผลลัพธ์: เครื่องจะบูตไม่ขึ้น และจะตกไปอยู่ที่หน้าจอ Emergency Mode หรือ (initramfs) prompt
  • สิ่งที่ต้องฝึกแก้:
    1. พิมพ์คำสั่ง journalctl -xb เพื่อดูว่ามันด่าบรรทัดไหน
    2. ใช้ blkid หรือ lsblk -f ดู UUID จริง
    3. สั่ง Remount disk เป็นเขียนได้: mount -o remount,rw /
    4. แก้ไข /etc/fstab ให้ถูกต้อง แล้วพิมพ์ exit หรือ reboot เพื่อให้เครื่องบูตขึ้นมาปกติ

แล็บที่ 3: แฮกเข้า Root Shell ผ่าน GRUB (Kernel Parameter Injection)

นี่คือท่ามาตรฐานที่ SysAdmin ใช้เวลาลืมรหัสผ่าน root หรือกู้ระบบที่ Service พัง:

  1. สั่ง Reboot VM แล้วกดปุ่ม Shift หรือ Esc ค้างไว้เพื่อให้เมนู GRUB ปรากฏ
  2. ไฮไลต์ที่ Kernel ตัวบนสุดแล้วกดปุ่ม e (Edit)
  3. เลื่อนลูกศรลงมาหาบรรทัดที่ขึ้นต้นด้วย linux หรือ linux16
  4. เลื่อนไปท้ายบรรทัด เว้นวรรค 1 ทีแล้วเติมคำสั่ง:
    Plaintextrd.break (หรือถ้าเป็น Ubuntu ให้ใช้ init=/bin/bash)
  5. กดปุ่ม Ctrl + X หรือ F10 เพื่อสั่ง Boot
  • ผลลัพธ์: Kernel จะหยุดทำงานทันทีหลังจากโหลด Driver เสร็จ และส่ง Shell สิทธิ์ root ให้เราก่อนที่ systemd จะเริ่มทำงานด้วยซ้ำ! คุณจะเห็นกับตาว่าจุดตัดระหว่าง Kernel กับ User-space อยู่ตรงนี้

แล็บที่ 4: ส่องดูลำดับและเวลาการบูตด้วย systemd-analyze

บนเครื่อง Linux ปกติที่บูตเสร็จแล้ว สามารถใช้คำสั่งของ systemd เพื่อดู Timeline การบูตจริงได้เลย:

Bash

# 1. ดูเวลารวมที่ใช้บูต แยกตามช่วง Kernel และ Userspace
systemd-analyze

# 2. ดูว่า Service ตัวไหนทำให้เครื่องบูตช้าสุด (เรียงลำดับเวลา)
systemd-analyze blame

# 3. สร้างภาพผังลำดับการบูต (Critical Chain)
systemd-analyze critical-chain
  • สิ่งที่จะได้เรียนรู้: คุณจะเห็นว่า Service ไหนสตาร์ตก่อน-หลัง และเห็นชัดเจนว่า Service ต่างๆ ถูกรันขึ้นมาพร้อมกันแบบขนาน (Parallel) ไม่ได้รันทีละตัวเหมือนยุค SysV init เก่า

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