Thay thế GRUB bằng systemd-boot: Cách khởi động Linux gọn nhẹ và nhanh hơn

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

Lý do nên từ bỏ trình khởi động cồng kềnh

GRUB (Grand Unified Bootloader) là “lão làng” đáng tin cậy trong thế giới Linux. Nó linh hoạt, hỗ trợ BIOS cũ và có thể khởi động hầu hết mọi hệ điều hành. Tuy nhiên, nếu bạn đang dùng một máy tính hiện đại với UEFI, GRUB thường mang lại cảm giác “dùng dao mổ trâu để giết gà”. Nó dựa vào các đoạn mã dài hàng nghìn dòng chỉ để tạo ra một tệp grub.cfg đơn giản, gây ra gánh nặng không cần thiết mỗi khi khởi động lại.

Vài năm trước, tôi đã mất hai giờ để gỡ lỗi một máy chủ không chịu khởi động sau khi cập nhật kernel. Thủ phạm là gì? Một lỗi cú pháp nhỏ trong một đoạn mã mà tôi thậm chí còn không tự viết. Sự ức chế đó đã thôi thúc tôi tìm kiếm thứ gì đó gọn nhẹ và minh bạch hơn. Nếu bạn muốn một quy trình khởi động được thiết kế riêng cho kỷ nguyên UEFI, systemd-boot chính là câu trả lời.

Tại sao GRUB là quá mức cần thiết cho phần cứng hiện đại

Sự phức tạp của GRUB là hệ quả của lịch sử. Vì được thiết kế để lấp đầy khoảng cách giữa phần cứng cổ điển và phần mềm hiện đại, nó bao gồm các trình điều khiển (driver) riêng cho hệ thống tệp, chế độ hiển thị và thậm chí cả giao thức mạng. Khi bạn nhấn nút nguồn, GRUB thực chất sẽ chạy một hệ điều hành siêu nhỏ chỉ để tìm và tải hệ điều hành thực sự của bạn.

Trên một hệ thống UEFI, điều này là dư thừa. Firmware của bo mạch chủ đã biết cách đọc phân vùng và tải tệp. Việc giữ lại GRUB giống như đặt một người trung gian vào bên trong một người trung gian khác. Thiết lập này gây ra một số rắc rối:

  • Lãng phí thời gian: GRUB có thể tốn từ 2 đến 5 giây chỉ để khởi tạo.
  • Sự mong manh: Các tệp cấu hình được tạo bởi os-prober và các kịch bản khác, khiến việc chỉnh sửa thủ công trở thành một “cơn ác mộng”.
  • Khó tiếp cận: Các quản trị viên mới thường gặp khó khăn khi tùy chỉnh tham số khởi động vì logic cấu hình bị che lấp bởi nhiều lớp trừu tượng.

So sánh các giải pháp: GRUB đối đầu systemd-boot

Thông thường bạn có ba lựa chọn khi chọn trình quản lý khởi động. GRUB vẫn là mặc định “an toàn”, nhưng nặng nề. rEFInd cung cấp giao diện đồ họa đẹp mắt cho các hệ thống đa khởi động như macOS và Linux, nhưng thường là quá mức cần thiết cho một máy trạm chuyên dụng.

systemd-boot (trước đây là gummiboot) chọn một cách tiếp cận khác. Nó không cố gắng trở thành một hệ điều hành. Thay vào đó, nó đóng vai trò như một cổng logic đơn giản chỉ dẫn cho firmware UEFI biết kernel nào cần chạy. Trong khi nhân của GRUB có thể chiếm tới vài megabyte, tệp thực thi EFI của systemd-boot thường nhỏ hơn 500KB. Nó sử dụng các tệp cấu hình văn bản thuần túy mà bất kỳ ai cũng có thể đọc và sửa đổi trong vài giây.

Triết lý “Ít hơn là nhiều hơn”

Tôi đã chuyển máy chủ Ubuntu 22.04 đang chạy thực tế của mình sang systemd-boot và thấy sự khác biệt ngay lập tức. Bằng cách loại bỏ giai đoạn dò tìm của GRUB, quá trình chuyển đổi từ firmware sang kernel gần như diễn ra tức thì. Trên ổ cứng NVMe tiêu chuẩn, thời gian từ lúc bật máy đến màn hình đăng nhập đã giảm khoảng 3 giây.

Trước khi thực hiện chuyển đổi, hãy đảm bảo hệ thống của bạn đang ở chế độ UEFI. Quy trình này sẽ không hoạt động trên các máy dùng BIOS cũ. Chạy lệnh sau để kiểm tra:

[ -d /sys/firmware/efi ] && echo "Chế độ UEFI" || echo "Chế độ Legacy"

Nếu kết quả xác nhận “Chế độ UEFI”, bạn đã sẵn sàng để tiếp tục.

Bước 1: Chuẩn bị phân vùng EFI

systemd-boot yêu cầu các tệp kernel và initramfs phải nằm trên Phân vùng Hệ thống EFI (ESP). Hầu hết các bản phân phối gắn (mount) ESP tại /boot/efi, nhưng systemd-boot hoạt động tốt nhất nếu ESP được gắn trực tiếp tại /boot.

Kiểm tra thiết lập hiện tại của bạn bằng lệnh lsblk. Nếu phân vùng EFI của bạn chỉ có 100MB, bạn nên thay đổi kích thước lên ít nhất 500MB. Điều này đảm bảo bạn có đủ không gian để lưu trữ nhiều phiên bản kernel và các hình ảnh liên quan mà không bị hết bộ nhớ khi cập nhật.

Bước 2: Khởi tạo systemd-boot

Nếu bạn sử dụng một bản phân phối hiện đại, systemd-boot có khả năng đã có sẵn trên đĩa như một phần của gói systemd. Bạn không cần tải xuống bất kỳ thứ gì mới; bạn chỉ cần kích hoạt nó. Chạy lệnh sau để cài đặt trình quản lý vào phân vùng EFI của bạn:

sudo bootctl install

Lệnh này sao chép các tệp thực thi cần thiết và tạo một mục nhập mới trong NVRAM của bo mạch chủ. Bạn có thể kiểm tra trạng thái của các mục khởi động bằng cách chạy bootctl status.

Bước 3: Cấu hình Loader

Bây giờ bạn cần xác định cách trình khởi động hoạt động. Mở tệp cấu hình chính:

sudo nano /boot/loader/loader.conf

Dán các cài đặt sau:

default  linux.conf
timeout  3
console-mode max
editor   no

Việc đặt editor thành ‘no’ là một bước bảo mật quan trọng. Nó ngăn chặn những người dùng không được phép thay đổi các tham số kernel (như khởi động vào root shell) trực tiếp từ menu khởi động.

Bước 4: Tạo mục khởi động của bạn

Không giống như một tệp cấu hình khổng lồ duy nhất của GRUB, systemd-boot sử dụng các tệp riêng biệt cho mỗi mục khởi động. Chúng nằm trong /boot/loader/entries/. Hãy tạo một tệp cho hệ điều hành chính của bạn:

sudo nano /boot/loader/entries/linux.conf

Thêm các dòng sau, đảm bảo tên tệp khớp với các tệp thực tế đang nằm trong thư mục /boot của bạn:

title   Desktop Linux
linux   /vmlinuz-linux
initrd  /<a href="https://itnotes.dev/vi/lam-chu-linux-initramfs-tuy-chinh-driver-va-boot-script/">initramfs</a>-linux.img
options root=PARTUUID=xxxx-xxxx-xxxx rw

Để tìm PARTUUID của bạn, hãy chạy blkid -s PARTUUID -o value /dev/sdXn, thay thế đường dẫn thiết bị bằng phân vùng gốc (root) của bạn. Sử dụng PARTUUID đáng tin cậy hơn nhiều so với tên thiết bị như /dev/sda2, vốn có thể thay đổi nếu bạn cắm thêm ổ USB mới.

Bước 5: Quản lý cập nhật Kernel

Một câu hỏi thường gặp là: “Điều gì xảy ra khi kernel cập nhật?” Trên Arch Linux, tên tệp là tĩnh, vì vậy bạn không bao giờ phải chạm vào các cấu hình này. Trên Debian hoặc Ubuntu, các bản cập nhật thường bao gồm số phiên bản trong tên tệp.

Để tự động hóa việc này, bạn có thể sử dụng kernel-install, một tập lệnh đi kèm với systemd. Nó tự động chuyển các kernel sang ESP và tạo các tệp mục nhập bất cứ khi nào phiên bản mới được cài đặt. Đối với cách tiếp cận thủ công đơn giản hơn, bạn có thể tạo một đoạn mã nhỏ để tạo liên kết mềm (symlink) từ kernel mới nhất sang một tên chung như vmlinuz-linux.

Bước 6: Loại bỏ trọng lượng thừa

Sau khi bạn đã khởi động lại thành công bằng systemd-boot, bạn có thể gỡ bỏ GRUB một cách an toàn. Điều này giúp hệ thống của bạn không lãng phí tài nguyên để cập nhật một trình khởi động mà bạn không còn sử dụng nữa. Trên Ubuntu hoặc Debian, hãy chạy:

sudo apt purge grub-common grub-pc-bin grub-efi-amd64
sudo apt autoremove

Mẹo nhỏ: Luôn giữ một chiếc USB Live trong ngăn kéo trước khi xóa trình khởi động cũ. Mặc dù systemd-boot cực kỳ ổn định, việc có một công cụ phục hồi là dấu hiệu của một quản trị viên luôn có sự chuẩn bị.

Kết quả: Một quy trình khởi động minh bạch

Chuyển sang systemd-boot không chỉ là để tiết kiệm vài giây khởi động. Đó là về sự minh bạch. Bằng cách loại bỏ sự phức tạp của GRUB, bạn biến quy trình khởi động từ một “hộp đen” bí ẩn thành một phần có thể quản lý được trong hạ tầng của mình. Bạn có một danh mục các mục khởi động sạch sẽ, một tệp cấu hình duy nhất và một hệ thống tôn trọng sức mạnh phần cứng hiện đại của bạn.

Share: