Sửa lỗi Driver Nvidia và VirtualBox bị chặn bởi Secure Boot: Hướng dẫn ký tên (Sign) Kernel Module

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

Bạn vừa “đập hộp” bản Ubuntu 22.04 hoặc Fedora mới nhất, cài xong driver Nvidia để làm AI hay đồ họa. Nhưng sau khi khởi động lại, driver vẫn không nhận, màn hình thì độ phân giải thấp tè. Chạy lệnh lsmod | grep nvidia không ra kết quả, còn dmesg thì báo lỗi đỏ lòm: “Required key not available”.

Thủ phạm chính là Secure Boot. Đây là lớp bảo mật ở tầng BIOS/UEFI giúp chặn đứng mã độc nạp vào nhân hệ điều hành. Nó chỉ cho phép các Kernel Module đã được ký số bởi Microsoft hoặc nhà sản xuất (OEM) khởi chạy.

Driver Nvidia hoặc VirtualBox thường được biên dịch (build) trực tiếp trên máy bạn ngay khi cài đặt. Vì tự build tại chỗ, chúng thiếu chữ ký số hợp lệ. Thay vì tắt Secure Boot làm máy tính kém an toàn, chúng ta sẽ tự tạo một bộ khóa riêng và yêu cầu hệ thống tin tưởng nó. Kỹ thuật này sử dụng MOK (Machine Owner Key).

Tại sao phải ký tên thủ công?

Thông thường, các distro như Ubuntu sẽ tự xử lý việc này nếu bạn dùng driver từ kho lưu trữ chính thức. Tuy nhiên, nếu bạn cài driver bản mới nhất từ trang chủ Nvidia hoặc dùng module đặc thù, hệ thống sẽ bỏ qua bước ký tên.

Thực tế cho thấy, khoảng 90% người dùng Dual Boot Windows và Linux trên các dòng laptop gaming đời mới (như ASUS ROG, Dell XPS) đều dính lỗi này. Việc tự ký tên biến bạn thành một “nhà phát hành” tin cậy trên chính thiết bị của mình.

Bước 1: Cài đặt công cụ quản lý khóa

Đầu tiên, bạn cần bộ công cụ để tạo và quản lý chứng chỉ MOK. Trên Ubuntu/Debian, hãy mở Terminal và chạy:

sudo apt update
sudo apt install openssl mokutil shim-signed

Đối với anh em dùng Fedora hoặc RHEL, lệnh tương ứng là:

sudo dnf install openssl mokutil

Bước 2: Tạo cặp khóa Machine Owner Key (MOK)

Chúng ta sẽ tạo một cặp khóa gồm: khóa bí mật (private key) để ký và chứng chỉ công khai (public certificate) để nạp vào BIOS.

Để bảo mật, hãy lưu khóa trong thư mục của root:

sudo mkdir -p /root/mok-keys
cd /root/mok-keys

# Tạo khóa RSA 2048-bit có thời hạn 100 năm
sudo openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=My Linux Driver Key/"

Sau khi chạy, bạn sẽ thấy file MOK.privMOK.der. Đừng bao giờ để lộ file .priv nếu không muốn hệ thống bị xâm nhập.

Bước 3: Đăng ký khóa với hệ thống (Import)

Bây giờ, hãy đưa chứng chỉ công khai vào danh sách chờ xác nhận của hệ thống:

sudo mokutil --import MOK.der

Hệ thống sẽ yêu cầu bạn đặt một mật khẩu. Hãy ghi nhớ nó. Bạn chỉ dùng mật khẩu này một lần duy nhất khi khởi động lại máy ở bước tiếp theo.

Bước 4: Xác nhận trong màn hình xanh (MOK Manager)

Đây là bước then chốt. Hãy khởi động lại máy. Ngay sau logo nhà sản xuất, một màn hình xanh (thường là giao diện text) mang tên Perform MOK management sẽ hiện ra.

  1. Chọn Enroll MOK.
  2. Chọn View key 0: Kiểm tra xem có đúng tên “My Linux Driver Key” bạn vừa tạo không.
  3. Chọn Continue -> Yes để xác nhận.
  4. Nhập mật khẩu bạn đã đặt ở Bước 3 (lưu ý: bàn phím có thể ở chế độ US mặc định).
  5. Chọn Reboot.

Nếu lỡ tay chọn “Continue boot” mà chưa Enroll, driver sẽ vẫn bị chặn. Lúc đó bạn phải thực hiện lại lệnh mokutil --import.

Bước 5: Tiến hành ký tên cho Driver

Khi máy đã vào lại Linux, chúng ta dùng khóa đã tạo để “đóng dấu” lên các file driver (đuôi .ko). Trước hết, cần tìm vị trí script ký tên của Kernel:

# Tìm đường dẫn file sign-file
KBUILD_DIR=$(find /lib/modules/$(uname -r) -name "sign-file" | head -n 1)

Bây giờ, hãy ký cho các module của Nvidia. Lệnh dưới đây sẽ tự động tìm đường dẫn module và thực hiện ký:

sudo perl "$KBUILD_DIR" sha256 /root/mok-keys/MOK.priv /root/mok-keys/MOK.der $(modinfo -n nvidia)

Với VirtualBox, bạn cần ký cho 4 module chính (vboxdrv, vboxnetadp, vboxnetflt, vboxpci):

sudo perl "$KBUILD_DIR" sha256 /root/mok-keys/MOK.priv /root/mok-keys/MOK.der $(modinfo -n vboxdrv)

Bước 6: Kiểm tra kết quả

Thử nạp lại module bằng lệnh modprobe. Nếu không có thông báo lỗi nào hiện ra, bạn đã thành công:

sudo modprobe nvidia
# Kiểm tra chữ ký đã được gắn chưa
modinfo nvidia | grep signature

Mẹo nhỏ: Tự động hóa với DKMS

Mỗi khi Linux cập nhật Kernel mới (ví dụ từ 6.5 lên 6.8), driver sẽ bị xóa sạch chữ ký. Để tránh việc phải ký tay hàng tuần, bạn nên cấu hình DKMS.

Trên các bản Ubuntu mới, nếu bạn copy cặp khóa vào /var/lib/shim-signed/mok/, DKMS sẽ tự động ký tên mỗi khi build module mới. Điều này giúp hệ thống luôn ổn định mà không cần can thiệp thủ công.

Secure Boot không phải là kẻ thù. Khi đã làm chủ được MOK, bạn vừa có thể chạy driver hiệu năng cao, vừa giữ được hàng rào bảo mật vững chắc cho máy tính.

Share: