Yocto · Bài 9/9

Bài 9: Build image cho Raspberry Pi Zero W bằng Yocto

2 lượt đọc4 phút đọc

Sau khi chạy thử trên QEMU, bước tiếp theo là đưa hệ điều hành lên một bo mạch thật. Bài này hướng dẫn build image cho Raspberry Pi Zero W bằng Yocto nhánh scarthgap, ghi vào thẻ nhớ và khởi động. Phần cuối giới thiệu công cụ repo để quản lý các layer gọn gàng hơn.

1.Chuẩn bị

Phần cứng và phần mềm cần có:

  • Máy build chạy Ubuntu (máy thật hoặc máy ảo), trống ổ cứng từ 100 GB trở lên.
  • Một board Raspberry Pi Zero W.
  • Thẻ nhớ microSD từ 16 GB trở lên, và đầu đọc thẻ.

Cài các gói cần thiết trên máy build:

bash
sudo apt update
sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 python3-subunit zstd liblz4-tool file locales libacl1
sudo locale-gen en_US.UTF-8

2.Tải Poky và layer cho Raspberry Pi

bash
mkdir -p ~/yocto && cd ~/yocto
git clone git://git.yoctoproject.org/poky -b scarthgap
git clone git://git.yoctoproject.org/meta-raspberrypi -b scarthgap

meta-raspberrypi là layer phần cứng chứa cấu hình machine, bootloader, kernel cho các dòng Raspberry Pi. Điều quan trọng là hai kho phải cùng nhánh, ở đây đều là scarthgap.

3.Thiết lập môi trường build

Tạo thư mục build riêng cho Raspberry Pi, để không lẫn với thư mục build QEMU:

bash
cd ~/yocto/poky
source oe-init-build-env build-rpi

Thêm layer

bash
bitbake-layers add-layer ../../meta-raspberrypi
bitbake-layers show-layers

Nếu có layer nào chưa thấy trong danh sách, kiểm tra lại đường dẫn. Layer meta-raspberrypi cần có mặt trong conf/bblayers.conf.

Chọn máy đích

Mở conf/local.conf và sửa dòng MACHINE:

bash
MACHINE ??= "raspberrypi0-wifi"

Tên raspberrypi0-wifi dành riêng cho Raspberry Pi Zero W (bản Zero không có Wi-Fi dùng raspberrypi0).

4.Build

bash
bitbake core-image-minimal

Lần build đầu mất khá lâu. Sau khi xong, các tệp image nằm trong:

bash
cd ~/yocto/poky/build-rpi/tmp/deploy/images/raspberrypi0-wifi/
ls

Bạn sẽ thấy tệp có đuôi .rootfs.wic.bz2 (hoặc .wic.bz2) kèm các tệp kernel, thiết bị. Tên chính xác có chứa ngày giờ build nên sẽ khác trên máy bạn.

5.Ghi image vào thẻ nhớ

Cắm thẻ vào máy build và xác định tên thiết bị của nó:

bash
lsblk

Thường thẻ sẽ là /dev/sdb, nhưng hãy kiểm tra kỹ dung lượng để chắc chắn đúng thẻ.

Giải nén một bản sao của image rồi ghi:

bash
cp core-image-minimal-raspberrypi0-wifi.rootfs.wic.bz2 temp.wic.bz2
bzip2 -d temp.wic.bz2
sudo dd if=/dev/zero of=/dev/sdb bs=512 count=1
sudo dd if=temp.wic of=/dev/sdb bs=4M status=progress
sync

Giải thích:

  • Dòng dd đầu xóa 512 byte đầu thẻ, tức bảng phân vùng cũ.
  • Dòng dd thứ hai ghi toàn bộ image vào thẻ.
  • sync đảm bảo dữ liệu đã được ghi hết trước khi bạn rút thẻ.

Nếu muốn nhanh và an toàn hơn, bạn có thể dùng công cụ bmaptool (nếu có tệp .wic.bmap đi kèm), chỉ ghi những khối có dữ liệu thật.

6.Khởi động Raspberry Pi

Rút thẻ ra, cắm vào Raspberry Pi Zero W, cấp nguồn. Nếu có màn hình, nối vào để xem quá trình khởi động. Nếu không có màn hình, bạn có thể dùng cáp USB-TTL nối vào các chân UART để xem console.

7.Mẹo: quản lý layer bằng công cụ repo

Cách tải layer bằng git clone thủ công dễ sót và lệch phiên bản khi dự án có nhiều layer. Công cụ repo đọc một tệp "manifest" liệt kê mọi layer cần có, kèm nhánh hoặc commit cụ thể, rồi tải hết một lần.

Cài công cụ repo (trên Ubuntu có thể dùng sudo apt install repo). Tạo thư mục làm việc và thư mục chứa manifest:

bash
mkdir -p ~/yocto/manifests
cd ~/yocto/manifests

Tạo tệp manifests.xml:

bash
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote name="yocto" fetch="git://git.yoctoproject.org"/>

  <project name="poky"
           remote="yocto"
           revision="scarthgap"
           path="sources/poky"/>

  <project name="meta-raspberrypi"
           remote="yocto"
           revision="scarthgap"
           path="sources/meta-raspberrypi"/>
</manifest>

Khi làm dự án thật, nên ghim revision vào mã commit hoặc tên tag cụ thể thay vì tên nhánh, để mọi người trong nhóm build ra cùng một kết quả.

Đưa manifest vào git, rồi khởi tạo repo và tải mã:

bash
cd ~/yocto/manifests
git init
git add manifests.xml
git -c user.name="Your Name" -c user.email="[email protected]" commit -m "Add manifest"

cd ~/yocto
repo init -u file://$HOME/yocto/manifests -m manifests.xml
repo sync

Sau repo sync, thư mục sources/ chứa poky và meta-raspberrypi đúng như khai báo. Các bước tiếp theo (thiết lập môi trường, thêm layer, chọn machine, build) giống hệt các bước ở trên, chỉ cần sửa đường dẫn cho khớp.

8.Kết luận

Bạn đã đi từ build trên máy ảo đến build cho phần cứng thật: tải đúng nhánh của Poky và layer phần cứng, chọn machine, build, ghi thẻ nhớ và khởi động. Khi dự án có nhiều layer, hãy dùng repo hoặc công cụ tương tự để mọi người luôn dùng cùng một bộ phiên bản.