Skip to content
ติดตั้งระบบและสร้าง boot chain

ติดตั้งระบบและสร้าง boot chain

pacstrap → fstab → chroot → ตั้งค่าพื้นฐาน → initramfs (hop 3) → systemd-boot (hop 2) → NVRAM (hop 1)
Install base system and build every hop of the boot chain by hand

ใช้ทำอะไร (Purpose)

ขั้นสร้าง hop ไหน
pacstrapขน kernel + โปรแกรมลง hop 3–4
genfstabแผนที่ mount ของ hop 4
mkinitcpioinitramfs ที่เปิด LUKS ได้ (hop 3)
bootctl + entriessystemd-boot (hop 2)
efibootmgrป้ายใน NVRAM ชี้ไป hop 2 (hop 1)

ขั้นตอน (Setup)

1. pacstrap

pacstrap -K /mnt base linux linux-lts linux-firmware intel-ucode btrfs-progs cryptsetup networkmanager neovim sudo zsh man-db
  • -K = สร้างคลังกุญแจ GPG ใหม่ให้ระบบใหม่
  • ลืม networkmanager = บูตแล้วไม่มีเน็ต (พลาดคลาสสิก)
  • initramfs ที่ pacstrap สร้าง ยังเปิด LUKS ไม่ได้ → ต้องสร้างใหม่ในข้อ 5

2. fstab

genfstab -U /mnt >> /mnt/etc/fstab    # รันครั้งเดียว (>> ต่อท้าย)
cat /mnt/etc/fstab

ตรวจ: UUID btrfs ทั้ง 5 บรรทัด, ESP แบบ XXXX-XXXX, ไม่มีบรรทัดซ้ำ, 0 0 / 0 2

3. chroot + ตั้งค่าพื้นฐาน

arch-chroot /mnt                      # จากนี้ไม่ต้องพิมพ์ /mnt นำหน้า
ln -sf /usr/share/zoneinfo/Asia/Bangkok /etc/localtime
date                                  # ต้องเห็น +07
hwclock --systohc                     # RTC เป็น UTC + สร้าง /etc/adjtime
printf 'en_US.UTF-8 UTF-8\nth_TH.UTF-8 UTF-8\n' >> /etc/locale.gen
locale-gen
echo 'LANG=en_US.UTF-8' > /etc/locale.conf
echo 'p15' > /etc/hostname
  • ระบบภาษาอังกฤษ = error ค้นหาบนเน็ตได้ (ภาษาไทยในการพิมพ์ไม่ขึ้นกับ locale)
  • hostname กลางๆ (รั่วผ่าน DHCP / BT / mDNS)

4. user + sudo + root

useradd -m -G wheel -s /bin/zsh green
passwd green
echo '%wheel ALL=(ALL:ALL) ALL' > /etc/sudoers.d/10-wheel
visudo -c                             # เจอ bad permissions
chmod 440 /etc/sudoers.d/10-wheel
visudo -c                             # parsed OK ทั้งสองบรรทัด
passwd                                # รหัส root สำหรับ emergency mode
systemctl enable NetworkManager
  • -G wheel = แก้บทเรียน T440p (journal อ่านไม่ได้เพราะไม่อยู่ใน wheel)
  • -s /bin/zsh = ไม่ต้อง chsh ทีหลัง
  • รหัส root = console port ตอนระบบล่ม (emergency mode ไม่มี sudo)

5. initramfs (hop 3)

grep '^HOOKS' /etc/mkinitcpio.conf
sed -i 's/^HOOKS=.*/HOOKS=(base systemd autodetect microcode modconf keyboard sd-vconsole block sd-encrypt filesystems fsck)/' /etc/mkinitcpio.conf
echo 'KEYMAP=us' > /etc/vconsole.conf
mkinitcpio -P
base → systemd → autodetect → microcode → modconf → keyboard → sd-vconsole → block → sd-encrypt → filesystems → fsck
                                                    ↑ ต้องก่อนถามรหัส          ↑ เปิด LUKS   ↑ mount
  • ลบ kms: กัน nouveau แย่งการ์ด NVIDIA ตั้งแต่บูต
  • microcode ทำ “Early uncompressed CPIO” = แพตช์ CPU ก่อน kernel ทำงาน

ตรวจไส้ initramfs:

for i in /boot/initramfs-linux*.img; do echo "== $i"; lsinitcpio "$i" | grep -E 'systemd-cryptsetup$|btrfs\.ko'; done
for d in /usr/lib/modules/*/; do echo "== $d"; grep btrfs "$d/modules.builtin"; find "$d" -name 'btrfs.ko*'; done

ผล: มี systemd-cryptsetup แต่ ไม่มี btrfs.ko → เพราะ btrfs built-in ใน kernel (ไม่ใช่ปัญหา)

6. systemd-boot (hop 2)

bootctl install
printf 'default arch.conf\ntimeout 3\nconsole-mode max\neditor no\n' > /boot/loader/loader.conf
blkid -s UUID -o value /dev/nvme0n1p2          # UUID ของ LUKS
cat > /boot/loader/entries/arch.conf <<EOF
title   Arch Linux
linux   /vmlinuz-linux
initrd  /initramfs-linux.img
options rd.luks.name=$(blkid -s UUID -o value /dev/nvme0n1p2)=cryptroot root=/dev/mapper/cryptroot rootflags=subvol=@ rw
EOF
sed -e 's/^title.*/title   Arch Linux (LTS)/' -e 's/vmlinuz-linux/vmlinuz-linux-lts/' -e 's/initramfs-linux\.img/initramfs-linux-lts.img/' /boot/loader/entries/arch.conf > /boot/loader/entries/arch-lts.conf
bootctl list
  • editor no = กันคนหน้าเครื่องใส่ init=/bin/bash
  • <<EOF (ไม่มีเครื่องหมายคำพูด) = shell แทนค่า $(blkid ...) ให้ ไม่ต้องพิมพ์ UUID เอง
  • entry LTS สร้างจากไฟล์ที่ตรวจแล้ว (copy config พอร์ตที่ทดสอบผ่าน แล้วแก้เฉพาะจุด)
  • ไม่ต้องมีบรรทัด intel-ucode.img (ฝังใน initramfs แล้ว)

7. NVRAM (hop 1) — ทำนอก chroot

exit
efibootmgr
efibootmgr -b 0000 -B          # ลบป้าย Windows เก่า
efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Linux Boot Manager" --loader '\EFI\systemd\systemd-bootx64.efi'
efibootmgr | grep -i linux; blkid -s PARTUUID -o value /dev/nvme0n1p1    # GUID ต้องตรงกัน
umount -R /mnt
cryptsetup close cryptroot
reboot

ทดสอบว่าใช้ได้ (Verification)

ตรวจหลักฐาน
hop 1GUID ใน HD(...) = PARTUUID ของ ESP, ขนาด 0x200000 = 1 GiB
hop 2bootctl list ไม่มีคำเตือนไฟล์หาย
hop 3lsinitcpio เจอ systemd-cryptsetup
ทั้งเส้นบูตแล้วถามรหัส LUKS → p15 login:

แผนกู้ระบบ (Recovery)

# บูต USB
cryptsetup open /dev/nvme0n1p2 cryptroot
mount -o subvol=@ /dev/mapper/cryptroot /mnt
mount /dev/nvme0n1p1 /mnt/boot
arch-chroot /mnt

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์ความจริง / บทเรียน
ทายว่าต้องลบ subvolid= ใน fstabgenfstab รุ่นใหม่ตัดให้แล้ว → ยังต้องเปิดดูทุกครั้ง (คู่มือบนเน็ตล้าสมัย)
visudo -c → bad permissionsecho > สร้างไฟล์ 0644 / sudoers ต้อง 0440
ไม่เจอ btrfs.ko ใน initramfsbtrfs built-in → “ไม่เจอ” ≠ “ระบบผิด” ต้องแยกว่าไม่มี หรืออยู่ในรูปแบบอื่น
bootctl install ไม่เขียน NVRAMอยู่ใน chroot (--graceful) → ใช้ efibootmgr นอก chroot
grep หา Linux Boot Manager “ไม่เจอ”เจอจริง แต่ copy มาไม่ครบ → ดูต้นฉบับ (log) ไม่ใช่ข้อความที่ถูกตัดตอน
terminal is not fully functionalSSH จาก kitty แต่ระบบใหม่ไม่มี terminfo → kitty-terminfo
NVRAM เก่าเก็บ “WINDOWS” + ขนาด ESP 200 MiBร่องรอยระบบที่ลบแล้ว ใช้ในงาน forensic ได้

คำถามชวนคิด

  1. ถ้าวางบรรทัด sd-encrypt ไว้ หลัง filesystems อาการตอนบูตจะเป็นอย่างไร และ log จะบอกอะไร
  2. ทำไมเครื่องนี้ยังบูตได้แม้ไม่มีป้าย NVRAM (เบาะแส: BOOTX64.EFI กับ entry NVMe0 ของ Lenovo) แล้วทำไมเรายังสร้างป้ายเอง
  3. ถ้าต้องให้คนในทีมติดตั้งเครื่องแบบเดียวกันโดยไม่มีคุณอยู่ด้วย จุดไหนในไฟล์นี้ที่เขาน่าจะพลาดมากที่สุด และคุณจะเพิ่มการตรวจอะไรกันไว้