Zalo Inbox

Các lỗi thường gặp khi phát triển với Yocto Project và cách khắc phục


  • author-image

    devlinux

  • blog-tag yocto
  • blog-comment 0 Bình luận
  • blog-comment 146 Views
  • created-date 10 Apr, 2025
blog-image


Yocto Project là một công cụ mạnh mẽ để xây dựng hệ thống Linux tùy chỉnh cho các thiết bị nhúng. Tuy nhiên, do tính phức tạp và sự phụ thuộc vào nhiều thành phần, các nhà phát triển thường gặp phải nhiều loại lỗi khác nhau. Bài viết này sẽ phân tích các lỗi phổ biến nhất khi làm việc với Yocto Project và cung cấp hướng dẫn chi tiết để khắc phục chúng.

1. Lỗi thiết lập môi trường

1.1. Lỗi "Command not found" khi chạy bitbake

Triệu chứng:

$ bitbake core-image-minimal
bash: bitbake: command not found

Nguyên nhân: Môi trường Yocto chưa được thiết lập đúng cách.

Giải pháp:

$ source oe-init-build-env [build-directory]

1.2. Lỗi "Please use a locale setting which supports UTF-8"

Triệu chứng:

Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).
Python can't change the filesystem locale after loading so we need a UTF-8
locale before startup.

Nguyên nhân: Cài đặt locale không hỗ trợ UTF-8.

Giải pháp:

# Kiểm tra locale hiện tại
locale

# Thiết lập locale UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

# Nếu locale chưa được cài đặt
sudo apt-get install locales
sudo locale-gen en_US.UTF-8

1.3. Lỗi Python không tương thích

Triệu chứng:

This program requires Python 3.6.0 or greater

Nguyên nhân: Phiên bản Python không tương thích với Yocto.

Giải pháp:

# Kiểm tra phiên bản Python
python3 --version

# Cài đặt phiên bản Python phù hợp
sudo apt-get install python3.8 python3.8-dev

2. Lỗi tải mã nguồn (Fetching)

2.1. Lỗi tải mã nguồn từ Git

Triệu chứng:

ERROR: Fetcher failure: Unable to find revision abcdef1234567890 in branch master even from upstream

Nguyên nhân: Không thể tìm thấy commit cụ thể hoặc kết nối mạng có vấn đề.

Giải pháp:

# Kiểm tra kết nối đến repository
git ls-remote <repository-url>

# Cập nhật SRCREV trong recipe
SRCREV = "latest-commit-hash"

# Hoặc sử dụng AUTOREV (không nên dùng cho production)
SRCREV = "${AUTOREV}"

2.2. Lỗi tải tệp từ HTTP/FTP

Triệu chứng:

ERROR: Fetcher failure for URL: 'http://example.com/package-1.0.tar.gz'. Unable to fetch URL

Nguyên nhân: URL không tồn tại, máy chủ không phản hồi, hoặc vấn đề mạng.

Giải pháp:

# Kiểm tra URL trong trình duyệt
# Thay đổi URL trong recipe
SRC_URI = "http://mirror-site.com/package-1.0.tar.gz"

# Hoặc sử dụng bản sao cục bộ
SRC_URI = "file://local-path/package-1.0.tar.gz"

2.3. Lỗi checksum

Triệu chứng:

ERROR: Checksum mismatch for local file download:/path/to/file.tar.gz

Nguyên nhân: Tệp đã tải xuống không khớp với checksum đã khai báo.

Giải pháp:

# Cập nhật checksum trong recipe
SRC_URI[md5sum] = "new-md5-checksum"
SRC_URI[sha256sum] = "new-sha256-checksum"

# Hoặc tính toán checksum mới
md5sum file.tar.gz
sha256sum file.tar.gz

3. Lỗi biên dịch (Compilation)

3.1. Lỗi biên dịch C/C++

Triệu chứng:

ERROR: Function failed: do_compile
| /path/to/file.c:123:45: error: 'struct example' has no member named 'member'

Nguyên nhân: Lỗi cú pháp, thư viện thiếu, hoặc không tương thích.

Giải pháp:

# Kiểm tra log chi tiết
less tmp/work/<package-path>/temp/log.do_compile

# Thêm patch để sửa lỗi
SRC_URI += "file://0001-Fix-compilation-error.patch"

# Thêm cờ biên dịch
TARGET_CFLAGS += "-Ddefine_macro"

# Thêm thư viện phụ thuộc
DEPENDS += "required-library"

3.2. Lỗi autotools

Triệu chứng:

ERROR: Function failed: do_configure
| configure: error: cannot find install-sh, install.sh, or shtool

Nguyên nhân: Cấu hình autotools không chính xác.

Giải pháp:

# Thêm cờ cấu hình
EXTRA_OECONF += "--with-feature --disable-option"

# Chạy autoreconf
do_configure_prepend() {
    cd ${S}
    autoreconf -fi
}

3.3. Lỗi CMake

Triệu chứng:

ERROR: Function failed: do_configure
| CMake Error: Could not find module FindSomeLibrary.cmake

Nguyên nhân: Thiếu module CMake hoặc cấu hình không chính xác.

Giải pháp:

# Thêm cờ CMake
EXTRA_OECMAKE += "-DENABLE_FEATURE=ON -DDISABLE_OPTION=OFF"

# Cung cấp module bị thiếu
do_configure_prepend() {
    cp ${WORKDIR}/FindSomeLibrary.cmake ${S}/cmake/modules/
}

4. Lỗi cấu hình (Configuration)

4.1. Lỗi MACHINE không xác định

Triệu chứng:

ERROR: Unable to parse /path/to/conf/local.conf: Could not find a valid MACHINE assignment

Nguyên nhân: Biến MACHINE không được đặt hoặc không hợp lệ.

Giải pháp:

# Chỉnh sửa conf/local.conf
MACHINE ?= "qemux86-64"  # hoặc máy đích khác

# Kiểm tra các máy có sẵn
ls meta*/conf/machine/*.conf

4.2. Lỗi layer không tìm thấy

Triệu chứng:

ERROR: Layer 'meta-custom' not found in the repository

Nguyên nhân: Layer không tồn tại hoặc chưa được thêm vào bblayers.conf.

Giải pháp:

# Kiểm tra các layer đã cài đặt
bitbake-layers show-layers

# Thêm layer mới
bitbake-layers add-layer /path/to/meta-custom

# Hoặc chỉnh sửa conf/bblayers.conf thủ công
BBLAYERS += "/path/to/meta-custom"

4.3. Lỗi biến không xác định

Triệu chứng:

ERROR: Parsing halted due to errors. The variable UNDEFINED_VARIABLE is not defined

Nguyên nhân: Biến được sử dụng nhưng không được định nghĩa.

Giải pháp:

# Định nghĩa biến trong recipe
UNDEFINED_VARIABLE = "value"

# Hoặc trong local.conf
UNDEFINED_VARIABLE ?= "value"

5. Lỗi phụ thuộc (Dependencies)

5.1. Lỗi thiếu phụ thuộc

Triệu chứng:

ERROR: Nothing PROVIDES 'missing-dependency'

Nguyên nhân: Recipe yêu cầu một phụ thuộc không tồn tại.

Giải pháp:

# Thêm recipe cho phụ thuộc bị thiếu
# Hoặc sửa đổi DEPENDS trong recipe
DEPENDS = "existing-dependency other-dependency"

# Kiểm tra các gói có sẵn
bitbake-layers show-recipes

5.2. Lỗi xung đột phụ thuộc

Triệu chứng:

ERROR: Multiple .bb files are due to be built which each provide virtual/dependency

Nguyên nhân: Nhiều recipe cung cấp cùng một phụ thuộc ảo.

Giải pháp:

# Chỉ định phiên bản ưu tiên trong local.conf
PREFERRED_PROVIDER_virtual/dependency = "specific-recipe"

# Kiểm tra các provider
bitbake -e virtual/dependency | grep ^PREFERRED_PROVIDER

5.3. Lỗi phiên bản không tương thích

Triệu chứng:

ERROR: No compatible version found for package (wanted version X, available versions Y, Z)

Nguyên nhân: Phiên bản yêu cầu không khớp với phiên bản có sẵn.

Giải pháp:

# Chỉ định phiên bản ưu tiên
PREFERRED_VERSION_package = "X.Y.Z"

# Kiểm tra các phiên bản có sẵn
bitbake-layers show-recipes package

6. Lỗi recipe và layer

6.1. Lỗi cú pháp recipe

Triệu chứng:

ERROR: ParseError at /path/to/recipe.bb:10: Could not parse

Nguyên nhân: Lỗi cú pháp trong file recipe.

Giải pháp:

# Kiểm tra cú pháp với bitbake-diffsigs
bitbake-diffsigs recipe-name

# Sửa lỗi cú pháp
# Thường là dấu ngoặc, dấu nháy hoặc dấu phẩy bị thiếu

6.2. Lỗi LICENSE_CHECKSUM

Triệu chứng:

ERROR: Recipe uses a deprecated license file md5sum

Nguyên nhân: Checksum của file LICENSE không chính xác.

Giải pháp:

# Cập nhật checksum
LIC_FILES_CHKSUM = "file://LICENSE;md5=new-md5-checksum"

# Tính toán md5sum mới
md5sum path/to/LICENSE

6.3. Lỗi RDEPENDS

Triệu chứng:

ERROR: Recipe runtime dependency 'package' not found in any recipe

Nguyên nhân: Runtime dependency không tồn tại.

Giải pháp:

# Kiểm tra tên gói chính xác
bitbake-layers show-recipes | grep package

# Sửa RDEPENDS
RDEPENDS_${PN} = "correct-package-name"

7. Lỗi khi tạo image

7.1. Lỗi thiếu bộ nhớ

Triệu chứng:

ERROR: No space left on rootfs

Nguyên nhân: Kích thước rootfs quá nhỏ cho các gói được cài đặt.

Giải pháp:

# Tăng kích thước rootfs trong local.conf
IMAGE_ROOTFS_SIZE = "8192"  # Kích thước tính bằng KB

# Hoặc loại bỏ một số gói
IMAGE_INSTALL_remove = "large-package"

7.2. Lỗi xung đột gói

Triệu chứng:

ERROR: Package X conflicts with package Y

Nguyên nhân: Hai gói không thể cài đặt cùng nhau.

Giải pháp:

# Loại bỏ một trong các gói xung đột
IMAGE_INSTALL_remove = "conflicting-package"

# Hoặc chỉ định phiên bản không xung đột
PREFERRED_VERSION_package = "non-conflicting-version"

7.3. Lỗi thiếu gói

Triệu chứng:

ERROR: Required package X not found in any package feed

Nguyên nhân: Gói yêu cầu không có sẵn.

Giải pháp:

# Thêm recipe cho gói bị thiếu
# Hoặc thêm layer chứa gói
bitbake-layers add-layer /path/to/layer-with-package

# Kiểm tra tên gói chính xác
bitbake-layers show-recipes | grep package-name

8. Lỗi SDK

8.1. Lỗi xây dựng SDK

Triệu chứng:

ERROR: Function failed: populate_sdk

Nguyên nhân: Lỗi khi tạo SDK.

Giải pháp:

# Kiểm tra log chi tiết
less tmp/work/*/temp/log.do_populate_sdk

# Thêm các gói cần thiết vào SDK
TOOLCHAIN_HOST_TASK += "nativesdk-package"
TOOLCHAIN_TARGET_TASK += "target-package"

8.2. Lỗi cài đặt SDK

Triệu chứng:

Error: Unable to create directory /opt/poky/...

Nguyên nhân: Không có quyền ghi vào thư mục cài đặt.

Giải pháp:

# Chạy script cài đặt với sudo
sudo ./poky-glibc-x86_64-core-image-minimal-toolchain-*.sh

# Hoặc chỉ định thư mục cài đặt khác
./poky-glibc-x86_64-core-image-minimal-toolchain-*.sh -d /path/with/write/permission

8.3. Lỗi sử dụng SDK

Triệu chứng:

Error: SDK environment script not found

Nguyên nhân: Script môi trường SDK không được tìm thấy hoặc không được chạy.

Giải pháp:

# Source script môi trường
source /opt/poky/*/environment-setup-*

# Kiểm tra biến môi trường
echo $CC

9. Các công cụ gỡ lỗi

9.1. Kiểm tra log build

# Xem log của task cụ thể
bitbake -e recipe | grep ^T=
less tmp/work/*/recipe/*/temp/log.do_task

# Bật chế độ log chi tiết
bitbake recipe -v

# Xem log của task gần nhất thất bại
bitbake recipe -c task -f -v

9.2. Kiểm tra biến môi trường

# Xem tất cả các biến của recipe
bitbake -e recipe > recipe-env.txt

# Tìm biến cụ thể
bitbake -e recipe | grep ^VARIABLE=

# Kiểm tra giá trị biến trong recipe
bitbake -e recipe | grep ^S=

9.3. Chạy task thủ công

# Chạy lại task cụ thể
bitbake recipe -c task -f

# Chạy task với shell tương tác
bitbake recipe -c devshell

# Xóa trạng thái task và chạy lại
bitbake recipe -c cleansstate
bitbake recipe

9.4. Kiểm tra phụ thuộc

# Xem cây phụ thuộc
bitbake -g recipe
dot -Tpng -o deps.png task-depends.dot

# Kiểm tra các gói cung cấp phụ thuộc
bitbake -s | grep dependency

# Xem các phụ thuộc của recipe
bitbake -e recipe | grep ^DEPENDS=

10. Kết luận

Yocto Project là một hệ thống phức tạp với nhiều thành phần tương tác, do đó việc gặp lỗi là điều không thể tránh khỏi trong quá trình phát triển. Tuy nhiên, với hiểu biết về các loại lỗi phổ biến và cách khắc phục, bạn có thể giải quyết chúng một cách hiệu quả.

Một số lời khuyên chung khi gỡ lỗi trong Yocto:

  • Đọc log cẩn thận: Hầu hết các lỗi đều có thông tin chi tiết trong log. Tập trung vào dòng cuối cùng của lỗi và theo dõi ngược lại để tìm nguyên nhân.
  • Tìm kiếm trong cộng đồng: Nhiều lỗi đã được báo cáo và giải quyết trong cộng đồng Yocto. Tìm kiếm trên Yocto Project mailing list, Stack Overflow hoặc GitHub issues.
  • Phân chia vấn đề: Nếu bạn gặp nhiều lỗi cùng lúc, hãy giải quyết từng lỗi một. Bắt đầu với lỗi đầu tiên xuất hiện trong log.
  • Sử dụng các công cụ gỡ lỗi: Yocto cung cấp nhiều công cụ như bitbake -e, devshell và bitbake-layers để giúp bạn hiểu và gỡ lỗi.
  • Giữ hệ thống sạch: Thường xuyên dọn dẹp các build cũ bằng cách sử dụng bitbake -c cleansstate để tránh các lỗi do trạng thái cũ.

Với kiến thức về các lỗi phổ biến và cách khắc phục được trình bày trong bài viết này, bạn sẽ tự tin hơn khi phát triển với Yocto Project và có thể giải quyết các vấn đề một cách hiệu quả.

author_photo
devlinux

0 Bình luận