Giới Thiệu
Quy trình khởi động Linux là một chuỗi sự kiện phức tạp nhưng thú vị, biến máy tính của bạn từ trạng thái tắt nguồn thành một hệ điều hành hoàn chỉnh và sẵn sàng hoạt động. Đối với các lập trình viên và quản trị viên hệ thống, việc hiểu quy trình này là rất quan trọng để khắc phục sự cố khởi động, tối ưu hóa việc khởi động hệ thống và có cái nhìn sâu sắc hơn về cách thức hoạt động của Linux.
Tổng Quan: Các Giai Đoạn của Quy Trình Khởi Động Linux 🚀
Quy trình khởi động có thể được chia thành nhiều giai đoạn khác nhau, mỗi giai đoạn có các nhiệm vụ cụ thể.
1. Khởi Tạo BIOS/UEFI (Firmware)
Định Nghĩa: Khi bạn bật máy tính, mã đầu tiên được thực thi không phải từ Linux mà từ firmware của hệ thống: hoặc là Basic Input/Output System (BIOS) hoặc là Unified Extensible Firmware Interface (UEFI) hiện đại hơn.
Vai Trò:
- POST (Power-On Self-Test): BIOS/UEFI thực hiện các bài kiểm tra chẩn đoán để đảm bảo rằng các thành phần phần cứng thiết yếu (CPU, RAM, bàn phím, v.v.) đang hoạt động chính xác.
- Khởi Tạo Phần Cứng: Thiết lập phần cứng cơ bản, khởi tạo các bộ điều khiển và thiết bị ngoại vi.
- Chọn Thiết Bị Khởi Động: Xác định thứ tự khởi động và xác định thiết bị có thể khởi động đầu tiên (ví dụ: ổ cứng, SSD, USB).
- Đọc MBR/GPT: BIOS đọc sector đầu tiên 512 byte của thiết bị khởi động. Nếu là đĩa MBR (Master Boot Record) truyền thống, nó tải MBR. Nếu là đĩa GPT (GUID Partition Table - thường được sử dụng với UEFI), nó hoạt động khác, thường tải một EFI System Partition (ESP).
2. Boot Loader (GRUB2)
Định Nghĩa: Sau khi BIOS/UEFI chuyển quyền điều khiển, boot loader sẽ đảm nhận. Boot loader phổ biến nhất cho các hệ thống Linux hiện nay là GRUB2 (GRand Unified Bootloader phiên bản 2).
Vai Trò:
- GRUB Stage 1 (MBR/GPT): Đoạn mã nhỏ ban đầu của GRUB (từ MBR hoặc ESP cho UEFI) được tải vào. Mục đích duy nhất của nó là tìm và tải giai đoạn tiếp theo của GRUB.
- GRUB Stage 1.5 (Core Image - cho MBR): Giai đoạn tùy chọn này, thường nằm trong khu vực ngay sau MBR, chứa các driver nâng cao hơn để đọc filesystem.
- GRUB Stage 2 (Các Thành Phần Chính): Đây là phần chính của GRUB, thường nằm trong
/boot/grub/(hoặc/boot/efi/EFI/grubcho UEFI). Nó tải tệp cấu hình GRUB (/boot/grub/grub.cfg), trình bày menu khởi động (cho phép bạn chọn hệ điều hành hoặc phiên bản kernel) và biết nơi chứa kernel và initramfs/initrd. - Tải Kernel & Initramfs: Nhiệm vụ chính của GRUB là tải hình ảnh kernel Linux và initramfs (hoặc initrd) vào bộ nhớ.
3. Khởi Tạo Kernel
Định Nghĩa: Sau khi GRUB tải kernel và initramfs vào RAM, quyền điều khiển được chuyển cho kernel Linux.
Vai Trò:
- Giải Nén: Kernel thường được nén, vì vậy bước đầu tiên là giải nén chính nó.
- Phát Hiện & Khởi Tạo Phần Cứng: Kernel phát hiện và khởi tạo tất cả các thành phần phần cứng còn lại của hệ thống, thiết lập các driver thiết bị.
- Gắn Kết Filesystem Gốc: Nó cố gắng gắn kết filesystem gốc. Đây là nơi mà initramfs/initrd đóng vai trò quan trọng.
4. Initramfs/Initrd (Initial RAM Disk)
Định Nghĩa: Initramfs (hoặc initrd cũ hơn) là một filesystem nhỏ, nén được tải vào RAM bởi boot loader cùng với kernel. Nó chứa một tập hợp tối thiểu các thư mục và thực thi.
Vai Trò:
- Filesystem Gốc Tạm Thời: Nó hoạt động như một filesystem gốc tạm thời, cung cấp các mô-đun và công cụ cần thiết để gắn kết filesystem gốc thực sự.
- Driver Phần Cứng: Nó thường chứa các driver thiết yếu (ví dụ: cho bộ điều khiển đĩa, LVM, RAID) mà kernel chính có thể chưa biên dịch trực tiếp, nhưng cần thiết để truy cập filesystem gốc thực.
- Kịch Bản Trước Khi Gắn Kết: Nó chạy các kịch bản để thực hiện các nhiệm vụ như:
- Phát hiện filesystem gốc.
- Tải các mô-đun kernel cần thiết.
- Thiết lập LVM (Logical Volume Manager) hoặc RAID nếu được sử dụng.
- Nhắc nhở mật khẩu nếu filesystem gốc được mã hóa.
- Chuyển Đổi Gốc: Khi filesystem gốc thực sự được tìm thấy và gắn kết, initramfs "chuyển đổi gốc" (sử dụng lệnh pivot_root hoặc switch_root) sang filesystem thực tế, gỡ bỏ chính nó.
5. Hệ Thống Init (systemd/SysVinit)
Định Nghĩa: Sau khi kernel thành công gắn kết filesystem gốc thực sự và chuyển sang nó, quá trình người dùng đầu tiên được khởi động. Đây là hệ thống init, lịch sử là SysVinit, nhưng hiện nay chủ yếu là systemd trong các bản phân phối Linux hiện đại. Quá trình này luôn có PID 1.
Vai Trò:
- systemd (hiện đại):
- Khởi tạo tất cả các quá trình người dùng khác.
- Quản lý dịch vụ (khởi động, dừng, khởi động lại).
- Xử lý ghi log, quản lý thiết bị, quản lý nguồn, và nhiều hơn nữa.
- Đưa hệ thống lên một "mục tiêu" cụ thể (tương đương runlevel), chẳng hạn như graphical.target (cho GUI) hoặc multi-user.target (cho dòng lệnh).
- SysVinit (truyền thống):
- Đọc tệp cấu hình runlevel (/etc/inittab).
- Thực thi các kịch bản trong /etc/rc.d/ hoặc /etc/init.d/ để khởi động các dịch vụ dựa trên runlevel mong muốn.
6. Đăng Nhập Người Dùng
Định Nghĩa: Giai đoạn cuối cùng, nơi hệ thống sẵn sàng cho tương tác của người dùng.
Vai Trò:
- Quản Lý Hiển Thị (GUI): Nếu được cấu hình cho môi trường đồ họa, systemd (hoặc SysVinit) khởi động một trình quản lý hiển thị như GDM, LightDM hoặc SDDM, trình bày màn hình đăng nhập đồ họa.
- Getty (CLI): Đối với giao diện dòng lệnh, các quy trình getty được khởi động trên các terminal ảo, nhắc người dùng nhập tên người dùng và mật khẩu.
- Shell/Môi Trường Desktop: Sau khi xác thực thành công, shell ưa thích của người dùng (đối với CLI) hoặc môi trường desktop (đối với GUI) được tải, và hệ thống hoàn toàn hoạt động.
Khắc Phục Sự Cố Quy Trình Khởi Động 🛠️
Hiểu các giai đoạn này là rất quý giá khi mọi thứ đi sai:
- Lỗi BIOS/UEFI: Vấn đề phần cứng, thứ tự khởi động không chính xác.
- Lỗi GRUB: MBR/GPT bị hỏng, grub.cfg không chính xác, thiếu tệp kernel/initramfs.
- Giải Pháp: Sử dụng CD/USB live để chroot vào hệ thống và cài đặt lại GRUB.
- Kernel panic: Thường chỉ ra một vấn đề nghiêm trọng, thường liên quan đến phần cứng, driver không tương thích, hoặc hình ảnh kernel bị hỏng.
- Giải Pháp: Thử khởi động phiên bản kernel cũ hơn từ menu GRUB.
- Lỗi Initramfs: Thường không thể tìm/gắn kết filesystem gốc. Điều này thường dẫn đến việc rơi vào shell (initramfs) hoặc dracut.
- Giải Pháp: Kiểm tra tham số kernel root= trong GRUB, đảm bảo các driver cần thiết có trong initramfs, tái tạo initramfs.
- Lỗi systemd/SysVinit: Các dịch vụ không khởi động, dẫn đến hệ thống không hoạt động hoặc hạn chế chức năng.
- Giải Pháp: Kiểm tra log (journalctl -xb cho systemd), khởi động vào chế độ cứu hộ hoặc chế độ người dùng đơn để sửa chữa cấu hình dịch vụ.
Tài Nguyên Đọc Thêm
- man boot: Cung cấp thông tin chi tiết về quy trình khởi động Linux.
- Arch Wiki - Quy trình khởi động: Tài nguyên toàn diện để hiểu thứ tự khởi động.
Hiểu rõ hành trình mà hệ thống Linux của bạn đi từ khi bật nguồn đến khi xuất hiện dấu nhắc giúp bạn chẩn đoán vấn đề hiệu quả và đánh giá kỹ thuật tinh vi đứng sau mọi thứ.
Bạn quan tâm đến khía cạnh nào của quy trình khởi động nhất?