1. Lựa chọn nhánh Kernel phù hợp với chip HackberryPi
HackberryPi CM5 sử dụng chip Broadcom BCM2837 (ARM Cortex-A53). Việc chọn đúng nhánh (branch) là bước sống còn để đảm bảo các driver nội tại (built-in) cho GPU VideoCore IV và USB controller hoạt động ngay từ khi boot.
Chúng ta sẽ sử dụng nhánh rpi-4.19.y từ kho chứa chính thức của Raspberry Pi. Đây là nhánh LTS (Long Term Support) ổn định nhất cho CM5, hỗ trợ đầy đủ các tính năng cần thiết mà không quá mới để gây lỗi driver.
(1) Làm gì: Clone kho mã nguồn kernel và checkout về tag cụ thể tương thích với CM5.
(2) Tại sao: Kernel mới nhất (mainline) có thể chưa hỗ trợ tốt các chip Broadcom cũ hoặc thiếu các patch đặc thù của Raspberry Pi Foundation. Nhánh rpi-4.19.y đã được tích hợp sẵn các patch cho hardware này.
(3) Kết quả mong đợi: Thư mục kernel chứa mã nguồn và HEAD đang trỏ vào tag 4.19.127 (hoặc version mới nhất của nhánh này).
git clone --depth 1 --branch rpi-4.19.y https://github.com/rpi-linux/linux.git /home/user/kernel-src
cd /home/user/kernel-src
git fetch --tags
git checkout v4.19.127
Verify: Kiểm tra trạng thái nhánh và tag hiện tại.
git branch --contains HEAD
git describe --tags
2. Tạo file cấu hình .config từ defconfig
Thay vì biên dịch kernel mặc định (generic), chúng ta cần một cấu hình tối ưu cho ARMv8 64-bit. Raspberry Pi cung cấp sẵn file rpi_defconfig làm nền tảng, nhưng cần điều chỉnh để phù hợp với môi trường HackberryPi.
(1) Làm gì: Sử dụng lệnh make để tạo file .config dựa trên rpi_defconfig.
(2) Tại sao: Lệnh này sẽ đọc file defconfig và sinh ra file .config ở root của thư mục source. Đây là file mà trình biên dịch Kbuild sẽ đọc để quyết định biên dịch những module nào.
(3) Kết quả mong đợi: File /home/user/kernel-src/.config được tạo ra với nội dung mặc định cho Raspberry Pi.
cd /home/user/kernel-src
make rpi_defconfig
Verify: Kiểm tra file .config đã tồn tại và chứa các dòng cấu hình cơ bản.
ls -l .config
head -n 20 .config
3. Tối ưu hóa các tùy chọn driver cho GPU và USB
Đối với HackberryPi CM5, driver GPU (V3D/Mali) và USB Controller (DWC2) phải được biên dịch trực tiếp vào Kernel (Built-in =y) thay vì module (=m) để đảm bảo hệ thống có thể khởi động vào framebuffer và nhận thiết bị USB ngay lập tức mà không cần rootfs phức tạp.
(1) Làm gì: Sử dụng scripts/config để điều chỉnh các flag cụ thể trong file .config.
(2) Tại sao: Công cụ scripts/config nhanh hơn và chính xác hơn việc chỉnh sửa file .config thủ công bằng text editor, tránh lỗi cú pháp. Chúng ta cần bật CONFIG_VIDEOCORE4 cho GPU và CONFIG_USB_DWC2 cho USB.
(3) Kết quả mong đợi: Các dòng cấu hình tương ứng trong .config chuyển từ # CONFIG_X is not set sang CONFIG_X=y.
cd /home/user/kernel-src
# Bật driver GPU Broadcom VideoCore IV (Bắt buộc cho display)
scripts/config -d CONFIG_VIDEOCORE4=y
# Bật driver USB DWC2 cho chip BCM2837 (Bắt buộc cho USB OTG/Host)
scripts/config -d CONFIG_USB_DWC2=y
scripts/config -d CONFIG_USB_DWC2_HOST=y
scripts/config -d CONFIG_USB_DWC2_PCI=y
# Bật driver SD Card (MMC) để đọc boot từ SD Card
scripts/config -d CONFIG_BCM2835_MMC=y
Verify: Xác nhận các dòng cấu hình đã được cập nhật đúng.
grep -E "CONFIG_VIDEOCORE4|CONFIG_USB_DWC2|CONFIG_BCM2835_MMC" .config
4. Tắt các tính năng không cần thiết để giảm kích thước ảnh
Để hệ điều hành chạy mượt trên HackberryPi CM5 (thường có RAM hạn chế), chúng ta cần loại bỏ các tính năng không dùng đến như: hỗ trợ CPU virtualization (KVM), driver cho các chipset khác (x86, PowerPC), hay các giao thức mạng ít dùng.
(1) Làm gì: Tắt các module ảo hóa, driver phần cứng không liên quan và các hệ thống file không cần thiết.
(2) Tại sao: Giảm kích thước file zImage và dtb, giảm thời gian boot, và giảm tiêu thụ RAM runtime. Điều này cực kỳ quan trọng cho các board SBC (Single Board Computer).
(3) Kết quả mong đợi: File .config loại bỏ các dòng CONFIG_X=y hoặc CONFIG_X=m không cần thiết.
cd /home/user/kernel-src
# Tắt KVM (Virtualization) vì HackberryPi không dùng để chạy VM
scripts/config -d CONFIG_KVM=n
# Tắt driver cho các chipset không phải Broadcom/ARMv8 để giảm bloat
scripts/config -d CONFIG_X86=n
scripts/config -d CONFIG_POWERPC=n
scripts/config -d CONFIG_MIPS=n
# Tắt các hệ thống file không cần thiết cho rootfs đơn giản (giữ lại ext4/fat)
scripts/config -d CONFIG_EXT2_FS=n
scripts/config -d CONFIG_EXT3_FS=n
scripts/config -d CONFIG_BTRFS_FS=n
scripts/config -d CONFIG_XFS_FS=n
# Tắt module NTP server và các service không cần chạy ngay khi boot
scripts/config -d CONFIG_NTP_SERVER=n
Verify: Kiểm tra xem các tính năng đã bị tắt chưa.
grep -E "CONFIG_KVM|CONFIG_X86|CONFIG_EXT2_FS" .config
5. Hoàn thiện và kiểm tra file .config cuối cùng
Sau khi đã thực hiện các thay đổi thủ công, cần chạy lệnh make olddefconfig để giải quyết các phụ thuộc (dependencies) bị thiếu do việc tắt các tính năng ở trên.
(1) Làm gì: Chạy make olddefconfig và sau đó xem file .config hoàn chỉnh.
(2) Tại sao: Khi bạn tắt một tính năng A, tính năng B phụ thuộc vào A cũng có thể bị tắt tự động. Lệnh này đảm bảo file config luôn ở trạng thái hợp lệ (valid) trước khi biên dịch.
(3) Kết quả mong đợi: Không có lỗi về dependency, và file .config được cập nhật lần cuối.
cd /home/user/kernel-src
make olddefconfig
Verify: Xem nội dung file config cuối cùng để chắc chắn các setting quan trọng vẫn còn.
cat .config | grep -E "CONFIG_VIDEOCORE4|CONFIG_USB_DWC2|CONFIG_ARCH_BCM283X"
File cấu hình hoàn chỉnh (.config) tại /home/user/kernel-src/.config sẽ có nội dung tóm tắt các mục quan trọng như sau (đây là trích xuất các dòng cốt lõi đã được cấu hình):
#
# CPU Frequency scaling
#
CONFIG_CPU_FREQ=y
CONFIG_CPU_FREQ_STAT=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
#
# Broadcom VideoCore IV (GPU)
#
CONFIG_VIDEOCORE4=y
CONFIG_VC4_DSI=y
CONFIG_FB_VC4=y
#
# USB Support
#
CONFIG_USB=y
CONFIG_USB_DWC2=y
CONFIG_USB_DWC2_HOST=y
CONFIG_USB_GADGET=y
#
# MMC/SD Card
#
CONFIG_MMC=y
CONFIG_MMC_BCM2835=y
CONFIG_MMC_SDHCI=y
#
# File Systems
#
CONFIG_EXT4_FS=y
CONFIG_FAT_FS=y
CONFIG_TMPFS=y
#
# Network
#
CONFIG_INET=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
Verify: Kiểm tra tổng thể file config đã sẵn sàng cho bước biên dịch.
make menuconfig 2>&1 | head -n 5
echo "Config file is ready for build."
Điều hướng series:
Mục lục: Series: Xây dựng hệ điều hành Linux từ source cho HackberryPi CM5
« Phần 1: Chuẩn bị môi trường phát triển và yêu cầu phần cứng
Phần 3: Xây dựng và biên dịch Kernel Linux »