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:
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-82.Tải Poky và layer cho Raspberry Pi
mkdir -p ~/yocto && cd ~/yocto
git clone git://git.yoctoproject.org/poky -b scarthgap
git clone git://git.yoctoproject.org/meta-raspberrypi -b scarthgapmeta-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:
cd ~/yocto/poky
source oe-init-build-env build-rpiThêm layer
bitbake-layers add-layer ../../meta-raspberrypi
bitbake-layers show-layersNế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:
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
bitbake core-image-minimalLần build đầu mất khá lâu. Sau khi xong, các tệp image nằm trong:
cd ~/yocto/poky/build-rpi/tmp/deploy/images/raspberrypi0-wifi/
lsBạ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ó:
lsblkThườ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:
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
syncGiải thích:
- Dòng
ddđầu xóa 512 byte đầu thẻ, tức bảng phân vùng cũ. - Dòng
ddthứ 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:
mkdir -p ~/yocto/manifests
cd ~/yocto/manifestsTạo tệp manifests.xml:
<?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ã:
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 syncSau 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.
