Yocto · Bài 1/9

Bài 1: Giới thiệu về Yocto Project và build image đầu tiên với scarthgap

10 lượt đọc5 phút đọc

Yocto Project là bộ công cụ mã nguồn mở giúp bạn tự xây dựng một hệ điều hành Linux riêng cho thiết bị nhúng. Nó không phải là một bản phân phối Linux có sẵn như Ubuntu. Nó là công cụ và quy trình để tạo ra hệ điều hành đúng với phần cứng của bạn, từ bootloader, kernel, hệ thống tập tin đến các ứng dụng đi kèm.

Bài này mở đầu cho chuỗi bài về Yocto. Bạn sẽ hiểu Yocto giải quyết vấn đề gì, các thành phần chính là gì, rồi tự build thử một image đầu tiên bằng nhánh scarthgap (phiên bản 5.0, bản hỗ trợ dài hạn LTS) và chạy nó trên máy ảo QEMU.

1.Vì sao ngành nhúng cần Yocto?

Phần cứng nhúng rất đa dạng. Mỗi bo mạch có CPU, bộ nhớ, ngoại vi khác nhau, và sản phẩm nào cũng chỉ cần một phần nhỏ của Linux. Yocto giúp bạn giải quyết bốn việc:

  • Linh hoạt: tùy chỉnh được từ bootloader, kernel đến user space.
  • Tái sử dụng: dùng lại các thành phần mã nguồn mở đã có, tiết kiệm thời gian.
  • Chia lớp rõ ràng: nhờ layer và recipe, mỗi phần của hệ thống nằm đúng chỗ, dễ mở rộng.
  • Tự động hóa: build được trong hệ thống CI/CD để kiểm tra mỗi lần thay đổi.
Poky, bản phân phối tham chiếu của Yocto Project

2.Các thành phần chính

BitBake

BitBake là công cụ thực hiện việc build. Nó đọc các recipe, tải mã nguồn, biên dịch, đóng gói và tạo ra image. BitBake cũng tự tính thứ tự build dựa trên quan hệ phụ thuộc giữa các thành phần.

Recipe

Recipe là tệp có đuôi .bb, mô tả cách lấy, biên dịch và cài đặt một phần mềm. Một recipe thường có nguồn mã (SRC_URI), cách biên dịch (do_compile) và cách cài đặt (do_install).

Layer

Layer (hay meta-layer) là một thư mục gom các recipe, bản vá và cấu hình cùng một chủ đề. Ví dụ meta-raspberrypi chứa mọi thứ cho Raspberry Pi. Layer có độ ưu tiên, nên layer của bạn có thể ghi đè hoặc mở rộng layer khác.

Tệp cấu hình

Hai tệp quan trọng nằm trong thư mục build/conf:

  • local.conf: thiết lập máy đích, số luồng build, các gói thêm vào image.
  • bblayers.conf: danh sách layer mà BitBake dùng.

Class, bbappend và package

  • Class (.bbclass) chứa đoạn mã dùng chung cho nhiều recipe, ví dụ autotools.bbclass.
  • bbappend (.bbappend) cho phép bổ sung hoặc sửa một recipe có sẵn mà không phải chép lại cả recipe.
  • Package là kết quả sau khi biên dịch, có thể ở dạng .ipk, .deb hoặc .rpm.

OpenEmbedded và Poky

OpenEmbedded là khung nền (framework) mà Yocto dùng, cung cấp rất nhiều recipe sẵn. Poky là bản tham chiếu gom BitBake, OpenEmbedded và các layer cơ bản để bạn bắt đầu ngay.

Các thành phần chính của Yocto Project

3.Luồng build tổng quát

Nhìn sơ đồ dưới đây, bạn thấy đầu vào là mã nguồn và cấu hình, hệ thống build lấy mã, vá, biên dịch, tách gói, kiểm tra chất lượng, rồi tạo ra gói, image và SDK.

Luồng làm việc của Yocto

4.Thực hành: build image đầu tiên với scarthgap

Chuẩn bị máy build

  • Hệ điều hành host: Ubuntu 22.04 hoặc 24.04 (hoặc Debian 11, 12, Fedora). Máy ảo cũng được.
  • Ổ cứng trống: nên có từ 100 GB trở lên. Tài liệu chính thức ghi mức 140 GB cho bản build đầy đủ.
  • RAM: từ 8 GB trở lên.
  • Kết nối Internet ổn định, vì lần build đầu phải tải rất nhiều mã nguồn.

Cài các gói cần thiết:

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

Tải Poky nhánh scarthgap

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

Nếu git:// bị chặn trên mạng của bạn, dùng địa chỉ https://git.yoctoproject.org/poky thay thế.

Thiết lập môi trường và build

bash
source oe-init-build-env

Lệnh này tạo thư mục build/ và đưa bạn vào đó. Mặc định máy đích là qemux86-64, một máy ảo x86 64 bit. Bắt đầu build:

bash
bitbake core-image-minimal

Lần build đầu mất từ vài chục phút đến vài giờ, tùy máy và mạng. Các lần sau nhanh hơn rất nhiều nhờ bộ nhớ đệm (sstate cache).

Chạy thử trên QEMU

bash
runqemu qemux86-64 nographic

Đăng nhập bằng tài khoản root (không có mật khẩu). Thoát QEMU bằng cách nhấn Ctrl+A rồi nhấn X.

Kiểm tra phiên bản kernel:

bash
uname -a

5.Một vài thư mục nên biết

  • build/conf/: chứa local.conf và bblayers.conf.
  • build/tmp/deploy/images/: nơi có image sau khi build xong.
  • build/tmp/work/: nơi từng recipe được biên dịch, rất hữu ích khi tìm lỗi.
  • build/downloads/ và build/sstate-cache/: mã nguồn đã tải và kết quả build đã lưu để dùng lại.

6.Kết luận

Yocto cho bạn quyền kiểm soát toàn bộ hệ điều hành nhúng, đổi lại bạn cần hiểu các khái niệm nền: BitBake, recipe, layer, cấu hình. Bài sau sẽ giải thích kỹ hơn các thuật ngữ quan trọng, rồi chúng ta tạo layer đầu tiên.