Làm chủ Linux initramfs: Tùy chỉnh Driver và Boot Script

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Nghịch lý Bootstrap: Cầu nối giữa Phần cứng và Hệ điều hành

Hãy tưởng tượng thế này: BIOS hoặc UEFI của bạn chuyển giao quyền điều khiển cho bootloader (GRUB), sau đó GRUB kích hoạt kernel. Đột nhiên, quá trình này bị đình trệ. Kernel đối mặt với một nghịch lý: nó cần mount (gắn) filesystem gốc để truy cập driver, nhưng nó lại cần chính những driver đó để giao tiếp với ổ đĩa nơi filesystem tọa lạc. Đây là lý do chúng ta sử dụng initramfs (initial RAM filesystem).

Về mặt kỹ thuật, initramfs là một kho lưu trữ CPIO nén, thường có dung lượng từ 20MB đến 60MB. Nó đóng vai trò như một cầu nối, hoạt động như một filesystem gốc tạm thời trong RAM. Nó chứa các kernel module, script và binary thiết yếu cần thiết để tìm và mount ổ đĩa vật lý thực tế của bạn. Nhiều quản trị viên coi đây là một “chiếc hộp bí ẩn”. Tuy nhiên, làm chủ được nó chính là sự khác biệt giữa một lần sửa lỗi nhanh chóng và việc phải cài đặt lại toàn bộ hệ thống khi xử lý các vấn đề phức tạp về RAID phần cứng hoặc mã hóa LUKS.

Kinh nghiệm là một người thầy khắc nghiệt. Sau khi quản lý một cụm hơn 100 node production, tôi đã học được rằng việc sửa đổi initramfs là một thao tác không cho phép sai sót. Một lỗi đánh máy nhỏ trong script có thể khiến máy chủ của bạn bị kẹt trong shell BusyBox của (initramfs). Hãy luôn thử nghiệm trên một VM staging không quan trọng trước.

Công cụ: Các bản phân phối khác nhau, quy tắc khác nhau

Hầu hết các bản phân phối Linux đều đi kèm với các trình tạo chuyên dụng riêng. Bạn sẽ không cần tải xuống phần mềm của bên thứ ba, nhưng bạn phải sử dụng công cụ phù hợp với hệ sinh thái của mình. Có hai cái tên thống trị:

  • initramfs-tools: Tiêu chuẩn cho Debian, Ubuntu và Mint.
  • Dracut: Công cụ mạnh mẽ đứng sau RHEL, Fedora, CentOS và AlmaLinux.

Để chuẩn bị môi trường dựa trên Debian, hãy đảm bảo bạn có các tiện ích cốt lõi:

sudo apt update
sudo apt install initramfs-tools binutils

Trên các hệ thống dòng RHEL, Dracut đảm nhận các công việc nặng nhọc:

sudo dnf install dracut dracut-network

Tôi khuyên bạn nên cài đặt cpio. Nó cho phép bạn giải nén và kiểm tra image theo cách thủ công nếu các công cụ tiêu chuẩn không báo lỗi.

Cấu hình: Chèn Module và Script

Hãy cùng giải quyết hai tác vụ phổ biến nhất: ép buộc một driver còn thiếu vào trình tự khởi động và chạy một script tùy chỉnh trước khi hệ điều hành tiếp quản.

1. Thêm Kernel Module (Driver)

Hãy tưởng tượng bạn đã di chuyển một ổ đĩa vật lý sang một máy chủ mới sử dụng controller megaraid_sas hoặc ổ NVMe cao cấp. Nếu kernel không tải các driver này trong quá trình bàn giao ban đầu, quá trình khởi động sẽ thất bại. Bạn cần buộc hệ thống phải bao gồm chúng.

Trên Debian/Ubuntu:

Mở /etc/initramfs-tools/modules. Chỉ cần thêm tên module (mỗi dòng một tên), chẳng hạn như nvme hoặc megaraid_sas.

# /etc/initramfs-tools/modules
nvme
virtio_pci

Áp dụng các thay đổi bằng cách tạo lại image cho kernel hiện tại của bạn:

sudo update-initramfs -u

Trên RHEL/AlmaLinux (Dracut):

Dracut có tính module. Hãy tạo một file cấu hình trong /etc/dracut.conf.d/, ví dụ: drivers.conf:

add_drivers+=" nvme megaraid_sas "

Build lại image với flag force:

sudo dracut -f

2. Triển khai Script khởi động sớm

Bạn có thể cần chạy kiểm tra phần cứng hoặc hiển thị biểu ngữ bảo mật tùy chỉnh trước khi filesystem gốc thực sự được mount. Trên Debian, các script này được phân loại theo thời điểm chúng thực thi:

  • init-top: Thực thi trước khi bất kỳ module nào được tải.
  • local-top: Thực thi trước khi các ổ đĩa cục bộ được mount.
  • panic: Chỉ thực thi nếu quá trình khởi động thất bại, hữu ích cho việc gỡ lỗi.

Tạo một script tại /etc/initramfs-tools/scripts/init-top/startup-msg:

#!/bin/sh
PREREQ=""
prereqs() { echo "$PREREQ"; }

case $1 in
  prereqs) prereqs; exit 0 ;;
esac

. /scripts/functions
echo "Script khởi động tùy chỉnh: Đang khởi tạo môi trường bảo mật..."
sleep 1

Cấp quyền thực thi và cập nhật image:

sudo chmod +x /etc/initramfs-tools/scripts/init-top/startup-msg
sudo update-initramfs -u

Xác minh: Tin tưởng nhưng phải kiểm tra lại

Hãy nghe lời một người đã từng dành trọn 2 giờ sáng trong một trung tâm dữ liệu lạnh lẽo: đừng bao giờ reboot ngay lập tức. Bạn phải xác minh nội dung image trước. Nếu thiếu một dependency (phụ thuộc), máy chủ của bạn sẽ không thể kết nối lại mạng.

Kiểm tra kho lưu trữ

Trên Debian, sử dụng lsinitramfs để xem bên trong. Sử dụng grep để đảm bảo script hoặc module cụ thể của bạn tồn tại:

lsinitramfs /boot/initrd.img-$(uname -r) | grep "startup-msg"

Trên RHEL, sử dụng lsinitrd cho cùng mục đích:

lsinitrd | grep "megaraid_sas"

Các thao tác an toàn

Nếu bạn đang làm việc trên một VPS từ xa, hãy luôn mở sẵn console VNC hoặc Serial. Nếu mọi thứ trở nên tồi tệ, kernel sẽ đưa bạn vào BusyBox. Bạn thường có thể tìm thấy nguyên nhân trong /run/initramfs/initrd.log.

Mẹo chuyên nghiệp: luôn giữ một bản sao lưu. update-initramfs thường lưu giữ một file .bak trong /boot. Nếu image mới bị treo, hãy nhấn ‘e’ tại menu GRUB và trỏ dòng initrd vào file sao lưu của bạn. Thói quen đơn giản này đã giúp tôi tiết kiệm hàng chục giờ khôi phục hệ thống.

Bằng cách làm chủ initramfs, bạn đã tiến xa hơn việc khắc phục sự cố cơ bản. Bạn giành được toàn quyền kiểm soát vòng đời của Linux ngay từ khoảnh khắc nhấn nút nguồn.

Share: