1. Xác định yêu cầu phần cứng và phần mềm nền tảng
Để bắt đầu xây dựng hệ điều hành Linux từ source cho Raspberry Pi Compute Module 5 (CM5), bạn cần đảm bảo phần cứng vật lý và máy chủ build (Build Host) đáp ứng các thông số kỹ thuật nghiêm ngặt. Thiếu sót ở giai đoạn này sẽ gây lỗi ngay từ bước compile đầu tiên.
Phần cứng vật lý bao gồm bản thân CM5, một Baseboard (Carrier Board) tương thích với khe cắm 260-pin hoặc 100-pin của CM5, và nguồn điện ổn định. CM5 hỗ trợ cấp nguồn qua GPIO 5V hoặc qua Baseboard, nhưng khi build firmware và test, bạn cần một nguồn điện 5V/3A ổn định, tốt nhất là nguồn lab có thể điều chỉnh dòng điện để kiểm tra rò rỉ hoặc quá tải.
Máy chủ build cần chạy hệ điều hành Linux x86_64. Phiên bản kernel tối thiểu là 5.15, khuyến nghị dùng Ubuntu 22.04 LTS hoặc Debian 12 (Bookworm). RAM tối thiểu là 16GB, nếu sử dụng dưới mức này, quá trình compile Kernel hoặc BitBake sẽ bị OOM Killer (Out of Memory) giết chết tiến trình. Ổ cứng SSD với ít nhất 200GB dung lượng trống là bắt buộc để chứa source code, object files và cache của Yocto.
Để verify yêu cầu phần cứng, chạy lệnh kiểm tra RAM và CPU cores:
free -h && lscpu | grep "Core(s)"
Kết quả mong đợi: Tổng RAM (Available) phải lớn hơn 16GB và số lượng Core phải từ 4 trở lên để tận dụng song song khi compile.
2. Cài đặt công cụ nền tảng cho máy chủ Build
Bước tiếp theo là chuẩn bị môi trường phần mềm trên Build Host. Yocto Project yêu cầu một bộ công cụ cụ thể (build-essential, git, wget, v.v.) và các thư viện hỗ trợ để BitBake hoạt động trơn tru. Chúng ta sẽ dùng Ubuntu 22.04 LTS làm môi trường chuẩn.
Đầu tiên, cập nhật package list và cài đặt các công cụ cơ bản cần thiết cho việc build source code. Lệnh này bao gồm git để clone source, wget để tải file, gawk, chrpath, texinfo và build-essential.
sudo apt-get update && sudo apt-get install -y git wget gawk chrpath texinfo build-essential libssl-dev python3-dev python3-pip python3-distutils
Kết quả mong đợi: Không có lỗi (Errors) hoặc cảnh báo (Warnings) nghiêm trọng. Tất cả package được install thành công.
Sau đó, cài đặt SDK của Raspberry Pi (raspberrypi-userland) hoặc các công cụ liên quan đến Raspberry Pi. Tuy nhiên, với quy trình build từ source (Yocto), chúng ta cần cài đặt các công cụ hỗ trợ cross-compile và quản lý firmware. Chúng ta sẽ cài đặt `libncurses-dev` và `libreadline-dev` để tránh lỗi khi build các công cụ phụ trợ.
sudo apt-get install -y libncurses-dev libreadline-dev uuid-dev libssl-dev libudev-dev
Kết quả mong đợi: Các thư viện development được cài đặt, sẵn sàng cho việc compile kernel và bootloader.
3. Thiết lập môi trường Yocto Project và tải về nguồn code
Để build Linux cho CM5, chúng ta cần Yocto Project và các layer hỗ trợ Raspberry Pi. Chúng ta sẽ sử dụng Yocto 4.3.2 (Kirkstone) hoặc mới hơn (Mickledore) để đảm bảo tính tương thích với CM5. Trong hướng dẫn này, chúng ta dùng Yocto 4.3.2 (Kirkstone) vì đây là LTS ổn định nhất hiện tại cho các thiết bị mới.
Đầu tiên, tạo thư mục làm việc (workspace) và clone repository chính của Yocto Project.
mkdir -p ~/yocto-workspace && cd ~/yocto-workspace && git clone https://git.yoctoproject.org/git/poky -b kirkstone --depth 1
Kết quả mong đợi: Thư mục `poky` được tạo ra, chứa source code của Yocto. Quá trình clone chỉ lấy commit mới nhất (depth 1) để tiết kiệm thời gian và dung lượng.
Tiếp theo, clone repository `meta-openembedded` (OE-Core) để bổ sung các package phổ biến và công cụ cần thiết không có trong Poky mặc định.
cd ~/yocto-workspace && git clone https://git.openembedded.org/meta-openembedded -b kirkstone --depth 1
Kết quả mong đợi: Thư mục `meta-openembedded` xuất hiện bên cạnh `poky`.
Bây giờ, clone repository `meta-raspberrypi` - đây là layer quan trọng nhất chứa các file cấu hình, device tree và recipe cho Raspberry Pi. Lưu ý: CM5 dùng Broadcom BCM2712, layer này hỗ trợ đầy đủ.
cd ~/yocto-workspace && git clone https://github.com/RaspberryPiFoundation/meta-raspberrypi.git -b kirkstone --depth 1
Kết quả mong đợi: Thư mục `meta-raspberrypi` được tạo. Đây là nơi chứa các định nghĩa cho CM5.
Sau khi có đủ các layer, ta cần tải về source code của Linux Kernel và Firmware cho CM5. Thông thường, Yocto sẽ tự động tải về khi build, nhưng để chủ động và kiểm soát phiên bản, chúng ta sẽ tải sẵn Firmware từ repository của Raspberry Pi.
cd ~/yocto-workspace && git clone https://github.com/raspberrypi/firmware.git -b 1.20240101 --depth 1
Kết quả mong đợi: Thư mục `firmware` chứa các file bin, dtb, và script boot cần thiết cho BCM2712.
4. Cấu hình thư mục Build và verify môi trường
Giờ chúng ta đã có đủ source code, bước tiếp theo là cấu hình thư mục build. Chúng ta sẽ tạo một thư mục `build` mới, sau đó chạy script `source` để thiết lập các biến môi trường cho Yocto.
Tạo thư mục build và di chuyển vào đó:
cd ~/yocto-workspace && mkdir build && cd build
Kết quả mong đợi: Thư mục `build` được tạo, con trỏ shell chuyển vào thư mục này.
Cấu hình file `local.conf` để chỉ định các layer cần dùng và tên của máy ảo (machine) cho CM5. Lưu ý: CM5 thường dùng machine name là `raspberrypi5` trong layer meta-raspberrypi.
echo "MACHINE = \"raspberrypi5\"" > conf/local.conf
echo "BBPATH = \"\${TOPDIR}/../poky\";" >> conf/local.conf
echo "SOURCETREE = \"\${TOPDIR}/../poky\";" >> conf/local.conf
echo "DL_DIR = \"\${TOPDIR}/downloads\";" >> conf/local.conf
echo "TMPDIR = \"\${TOPDIR}/tmp\";" >> conf/local.conf
echo "INHERIT += \"distro-features-check\";" >> conf/local.conf
Kết quả mong đợi: File `conf/local.conf` được tạo với nội dung cấu hình cơ bản. Thư mục `conf` và các thư mục con khác được tạo tự động.
Bây giờ, chạy lệnh source để kích hoạt môi trường Yocto. Đây là bước quan trọng nhất để kích hoạt các biến môi trường và hàm `bitbake`.
source ../poky/oe-init-build-env
Kết quả mong đợi: Shell prompt thay đổi, hiển thị tên máy ảo (ví dụ: `[raspberrypi5@build build]$`). Các biến môi trường như `MACHINE`, `DISTRO` được set đúng.
Để verify toàn bộ môi trường đã sẵn sàng, chạy lệnh kiểm tra xem BitBake có nhận diện được machine và layer hay không.
bitbake -e | grep "^MACHINE=" && bitbake -e | grep "^DISTRO="
Kết quả mong đợi: Xuất hiện dòng `MACHINE="raspberrypi5"` và `DISTRO="poky"` (hoặc distro mặc định). Nếu không thấy, hãy kiểm tra lại file `local.conf`.
Thử chạy lệnh dry-run (chạy thử không build) để kiểm tra xem recipe cho CM5 có tồn tại và không bị lỗi syntax hay không.
bitbake -c cleanall linux-raspberrypi
Kết quả mong đợi: BitBake báo đã tìm thấy recipe `linux-raspberrypi` và thực hiện xóa cache (nếu có). Không có lỗi "recipe not found".
Để kiểm tra xem firmware đã được tải về chưa, hãy xem nội dung thư mục `downloads`.
ls -lh ~/yocto-workspace/build/downloads/ | grep -i firmware
Kết quả mong đợi: Có các file tar.gz hoặc git clone của firmware trong thư mục downloads. Nếu chưa có, Yocto sẽ tự động tải về khi bạn chạy lệnh build đầu tiên.
Việc verify cuối cùng là kiểm tra cấu hình device tree cho CM5. CM5 sử dụng file `.dtb` riêng biệt so với Raspberry Pi 4.
find ../meta-raspberrypi -name "*cm5*.dtb" -o -name "*bcm2712*.dtb"
Kết quả mong đợi: Danh sách các file device tree tương thích với CM5 (bcm2712-rpi-cm5.dt.b) được hiển thị. Điều này xác nhận layer meta-raspberrypi đã hỗ trợ đầy đủ cho CM5.
Điều hướng series:
Mục lục: Series: Xây dựng hệ điều hành Linux tùy biến từ source cho Raspberry Pi CM5
Phần 2: Cấu hình Yocto Project và tạo Project Layer tùy chỉnh »