So sánh các phương pháp xử lý sự cố khởi động Linux
Hiếm có điều gì làm gián đoạn ngày làm việc nhanh hơn một máy chủ từ chối khởi động sau khi bảo trì định kỳ. Một bản cập nhật kernel bị lỗi, sự cố mất điện đột ngột hoặc gõ nhầm một ký tự trong cấu hình lưu trữ có thể khiến phần cứng treo ở màn hình đen hoặc kẹt tại dấu nhắc lệnh grub rescue>.
Khi hệ điều hành bị treo lúc khởi động, bạn thường có ba hướng xử lý:
| Phương pháp | Quy trình điển hình | Tốc độ khôi phục | Rủi ro sự cố |
|---|---|---|---|
| Đĩa cứu hộ tự động (vd: Boot-Repair) | Boot vào ISO desktop, nhấn nút sửa chữa tự động và để script tự suy đoán cấu hình. | 5–10 phút | Cao đối với mdadm RAID, LVM volume, mã hóa LUKS hoặc phân vùng EFI phi chuẩn. |
| Khôi phục toàn bộ từ bản sao lưu (Snapshot/Image) | Ghi đè lại image của phân vùng root hoặc rollback snapshot hypervisor/ZFS. | 30–90 phút | Chắc chắn mất toàn bộ dữ liệu giao dịch phát sinh kể từ thời điểm tạo bản backup gần nhất. |
| Chroot thủ công qua Live USB | Mount các phân vùng của host, bind các filesystem ảo và truy cập trực tiếp vào root shell. | 5–15 phút | Thấp. Từng câu lệnh được thực thi dưới toàn quyền kiểm soát của quản trị viên mà không cần đoán mò. |
Các tiện ích giao diện đồ họa tự động thường thất bại khi gặp phải mảng nhiều ổ đĩa hoặc volume group phức tạp. Rollback snapshot có hiệu quả, nhưng lại làm mất các bản ghi database gần đây và log runtime được tạo sau thời điểm snapshot. Phiên chroot (change root) loại bỏ cả hai vấn đề này. Bằng cách đăng nhập vào môi trường của ổ đĩa bị lỗi từ Live USB, bạn sẽ vận hành chính trình quản lý package gốc và công cụ của máy chủ ngay trên các file cấu hình thực tế của nó.
Ưu và nhược điểm của quy trình cứu hộ bằng Chroot
Dù chroot là kỹ năng thiết yếu của mọi quản trị viên hệ thống, nó đòi hỏi sự cẩn trọng khi thực hiện. Hãy cân nhắc các yếu tố thực tế sau trước khi mở rescue shell:
Ưu điểm
- Thực thi binary gốc: Bạn chạy trực tiếp trình quản lý package gốc của bản phân phối đã cài đặt (như
apt,dnfhoặcpacman). Hoàn toàn không lo xung đột thư viện hay lệch công cụ. - Không phụ thuộc công cụ độc quyền: Mọi ISO dung lượng nhẹ—ngay cả bản Debian netinst 700MB hay Ubuntu Server—đều hoạt động hiệu quả ngay tức thì.
- Khắc phục trúng đích: Sửa đúng thành phần hư hỏng mà không gây ảnh hưởng đến các filesystem nguyên vẹn khác. Nếu chỉ riêng
/etc/fstabbị sai UUID, bạn chỉ cần sửa dòng đó và giữ nguyên vẹn 500GB dữ liệu ứng dụng còn lại. - Kiểm soát toàn diện tiến trình: Dễ dàng kiểm tra bảng phân vùng thô, ánh xạ UUID và các biến boot EFI trước khi ghi đè dữ liệu lâu dài vào đĩa.
Nhược điểm
- Yêu cầu mount nghiêm ngặt: Quên bind các pseudo-filesystem như
/dev,/prochoặc/syssẽ khiến script grub và hook sau cài đặt kernel bị lỗi mà không để lại vết lỗi rõ ràng. - Không có cơ chế bảo vệ: Bạn thao tác với toàn quyền root không giới hạn. Một lỗi gõ nhầm với lệnh
dd,fdiskhoặcrm -rfcó thể xóa sạch vĩnh viễn các phân vùng đang hoạt động tốt. - Ràng buộc kiến trúc vi xử lý: Môi trường Live phải tương thích với kiến trúc CPU của hệ điều hành cần sửa. Bạn không thể chroot vào bản cài đặt arm64 từ một Live image x86_64 mà không cấu hình trình giả lập QEMU user.
Chuẩn bị môi trường đề xuất
Đừng chờ đến khi xảy ra sự cố mới bắt đầu tạo bộ cứu hộ. Hãy chuẩn bị sẵn một USB 32GB hoặc 64GB được cài Ventoy. Chép trực tiếp các file ISO phổ biến vào ổ đĩa: Ubuntu 24.04/22.04 LTS, Debian 12 và AlmaLinux 9. Việc chuẩn bị sẵn các ISO có khả năng boot sẽ biến sự cố kéo dài nhiều giờ thành công việc xử lý nhanh gọn chỉ trong 10 phút.
Cách tiếp cận này tiết kiệm đáng kể thời gian so với việc sử dụng mạng out-of-band tốc độ chậm. Tải một image thô 60GB qua phiên ảo hóa IPMI với kết nối 15 Mbps có thể mất hơn một giờ. Khởi động thẳng một ISO 1.5GB vào RAM cho phép bạn chẩn đoán và khắc phục sự cố máy chủ chỉ dưới 10 phút.
Hãy kiểm tra nhanh các điểm sau trước khi chạy bất kỳ lệnh sửa chữa nào:
- Xác định xem máy khởi động qua Legacy BIOS (MBR) hay UEFI. Kiểm tra xem thư mục
/sys/firmware/eficó tồn tại trong môi trường Live hay không. - Xác định sơ đồ phân vùng: định vị phân vùng root (
/), boot (/boot) và phân vùng EFI System Partition (ESP), lưu ý tính đến các cấu trúc LVM hoặc mã hóa LUKS nếu có. - Kiểm tra kết nối mạng. Nếu cần cài đặt lại các package kernel bị hỏng, hãy đảm bảo máy host Live có thể phân giải DNS và kết nối đến default gateway.
Hướng dẫn thực hiện: Cứu hộ hệ thống gặp sự cố
Bước 1: Boot vào môi trường Live và xác định các phân vùng
Cắm USB cứu hộ, boot vào live console và liệt kê tất cả các thiết bị lưu trữ dạng khối bằng lệnh lsblk:
# Hiển thị cây thiết bị cùng filesystem, dung lượng và UUID
lsblk -o NAME,FSTYPE,SIZE,FSAVAIL,FSUSE%,MOUNTPOINTS,UUID
# Kiểm tra định dạng bảng phân vùng (GPT hay DOS/MBR)
sudo parted -l
Xác định các phân vùng cần xử lý. Trong phạm vi hướng dẫn này, giả định hệ thống được cài trên ổ NVMe tại /dev/nvme0n1 (hoặc /dev/sda trên các hệ thống SATA):
/dev/nvme0n1p1: Phân vùng EFI System Partition (vfat, 512MB)/dev/nvme0n1p2: Phân vùng Boot (ext4, 1GB; có mặt trên các thiết lập tách riêng phân vùng boot)/dev/nvme0n1p3: Phân vùng Root Filesystem (ext4 hoặc xfs, ~100GB)
Bước 2: Mount các phân vùng đích và filesystem ảo
Mount phân vùng root vào /mnt. Sau đó, bind các filesystem ảo của kernel để các tiện ích hệ thống bên trong chroot jail có thể đọc được bảng phần cứng, cây tiến trình và các node thiết bị:
# 1. Mount filesystem root chính
sudo mount /dev/nvme0n1p3 /mnt
# 2. Mount /boot nếu nằm trên phân vùng riêng
sudo mount /dev/nvme0n1p2 /mnt/boot
# 3. Mount phân vùng EFI System Partition (chỉ dành cho hệ thống UEFI)
sudo mount /dev/nvme0n1p1 /mnt/boot/efi
# 4. Bind các filesystem ảo của kernel
for dir in /dev /dev/pts /proc /sys /run; do
sudo mount --bind "$dir" "/mnt$dir"
done
# 5. Sao chép cấu hình DNS của máy host để đảm bảo truy cập mạng bên trong jail
sudo cp -L /etc/resolv.conf /mnt/etc/resolv.conf
Bước 3: Đăng nhập vào môi trường Chroot
Chuyển ngữ cảnh thực thi root sang ổ đĩa vừa mount:
sudo chroot /mnt /bin/bash
# Nạp các đường dẫn thực thi chuẩn và biến môi trường
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
source /etc/profile 2>/dev/null
Hiện tại bạn đã thao tác trực tiếp bên trong hệ điều hành cần cứu hộ. Mọi thay đổi sẽ được áp dụng thẳng vào ổ cứng lưu trữ.
Bước 4: Kịch bản xử lý 1 — Sửa lỗi sai lệch UUID trong fstab
Khi các ổ đĩa được format lại hoặc chuyển sang ổ đĩa ảo mới, UUID của chúng sẽ thay đổi. Nếu /etc/fstab vẫn tham chiếu đến các ID cũ, systemd sẽ tạm dừng quá trình boot và rơi vào màn hình khẩn cấp: Timed out waiting for device /dev/disk/by-uuid/....
Kiểm tra UUID thực tế của các thiết bị so với cấu hình fstab đang mong đợi:
# Liệt kê UUID của các phân vùng đang hoạt động
blkid
# Kiểm tra các định nghĩa mount tĩnh hiện tại
cat /etc/fstab
Nếu phát hiện giá trị sai lệch, hãy mở file và cập nhật chuỗi UUID cho khớp với đầu ra hiện tại của blkid:
nano /etc/fstab
Đối với các điểm mount phụ không bắt buộc (chẳng hạn như ổ dữ liệu phụ hoặc ổ mạng NFS), hãy thêm tùy chọn mount nofail vào cột thứ tư. Bằng cách này, nếu thiếu các ổ đĩa phụ, hệ điều hành vẫn khởi động bình thường vào multi-user target mà không bị chặn lại.
Bước 5: Kịch bản xử lý 2 — Cài đặt lại và cập nhật GRUB
Nếu bộ cài dual-boot, quá trình cập nhật bị ngắt quãng hoặc việc clone đĩa làm hỏng giai đoạn bootloader, hãy tiến hành cài đặt lại GRUB sạch sẽ.
Dành cho hệ thống UEFI:
Xác nhận rằng thư mục /sys/firmware/efi tồn tại trước khi tiếp tục. Sau đó cài đặt lại binary EFI và đăng ký nó vào các mục boot trong NVRAM của bo mạch chủ:
# Cài đặt lại binary GRUB EFI vào phân vùng ESP đã mount
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck
# Tạo lại file /boot/grub/grub.cfg chuẩn
update-grub
Dành cho hệ thống Legacy BIOS (MBR):
Chỉ định thiết bị ổ đĩa gốc (như /dev/sda hoặc /dev/vda). Tuyệt đối không trỏ vào một phân vùng cụ thể như /dev/sda1:
# Ghi trực tiếp mã boot vào Master Boot Record và vùng post-MBR gap
grub-install --target=i386-pc /dev/sda
# Tạo lại menu bootloader
update-grub
Bước 6: Kịch bản xử lý 3 — Khôi phục Kernel & Initramfs bị lỗi
Nếu tiến trình cập nhật package bị ngắt quãng giữa chừng khi update kernel, file ramdisk có thể bị hỏng hoặc mất hoàn toàn. Điều này dẫn đến lỗi khởi động sớm: kernel panic - not syncing: VFS: Unable to mount root fs. Hãy tạo lại ramdisk và hoàn tất các tiến trình dpkg dở dang bên trong chroot:
# 1. Hoàn tất các tiến trình cấu hình package bị gián đoạn
dpkg --configure -a
# 2. Kiểm tra các kernel image hiện đang cài đặt
dpkg -l | grep -E 'linux-image|linux-headers'
# 3. Cài đặt lại metapackage kernel chính thức (Debian/Ubuntu)
apt-get update
apt-get install --reinstall -y linux-image-generic
# 4. Tạo lại initramfs cho tất cả các phiên bản kernel được phát hiện
update-initramfs -c -k all
# 5. Cập nhật lại cấu hình GRUB để nhận diện initrd vừa tạo
update-grub
Bước 7: Thoát an toàn và khởi động lại
Tuyệt đối không khởi động lại máy khi các phân vùng thô và filesystem ảo của kernel vẫn đang được bind vào /mnt. Reset đột ngột có thể khiến filesystem bị đánh dấu dirty hoặc làm hỏng dữ liệu trong bộ đệm ghi. Hãy thoát khỏi jail và unmount các phân vùng cẩn thận:
# Thoát khỏi shell chroot
exit
# Unmount đệ quy tất cả các điểm mount đã bind từ các mount con
sudo umount -R /mnt
# Khởi động lại hệ thống an toàn
sudo reboot
Rút ổ USB khi phần cứng bắt đầu khởi động lại. Máy chủ sẽ chuyển giao quyền thực thi mượt mà sang bootloader đã được phục hồi, tải file cấu hình /etc/fstab chuẩn xác và khởi động suôn sẻ vào initramfs vừa được biên dịch lại.

