Yocto Project và ứng dụng trong việc phát triển các hệ thống nhúng

    Các bạn làm về nhúng và đặc biệt là các bạn làm việc với Linux trên thiết bị nhúng thì có lẽ đâu đó đã nghe nói đến Yocto. Tuy nhiên hiểu được đúng bản chất nó là gì thì có lẽ là không nhiều. Bản thân mình khi mới nghe về Yocto thì là mấy câu kiểu như “con board này chạy Yocto Linux…“, “thiết bị kia chạy Yocto bla bla…“, nói chung là rất mơ hồ, méo hiểu gì cả. Hồi đó mình cũng chưa đi sâu vaò tim hiểu, chưa làm thật liên quan đến Yocto nên cứ nghĩ nó là một phiên bản của hệ điều hành Linux (thuật ngữ là Linux distro). Tuy nhiên không phải như vậy, và trong bài viết này mình sẽ giải thích rõ Yocto thưc sự là gì, dùng để làm gì cùng với một số lầm tưởng về Yocto mà anh em hay mắc phải.

Lịch sử ra đời của Yocto

Nhìn lại những năm gần đây của lĩnh vực hệ thống nhúng, chúng ta sẽ thấy rằng mọi thứ đã thay đổi hoàn toàn. Các hệ thống nhúng đã ngày càng trở nên mạnh mẽ và có các tính năng mới hơn. Ngày nay, bạn có thể tìm thấy hệ thống nhúng với chip 4 nhân (quad-core), RAM trên 1Gb cùng với bộ nhớ lưu trữ dữ liệu cỡ vài Gb, cấu hình này có thể nói là ngang cơ với máy tính để bàn đời cũ.

Ngày nay, hệ thống nhúng với sức mạnh phần cứng như vậy không phải cái gì quá ghê gớm, nó là bình thường đối với các hệ thống yêu cầu cao về tối ưu tiêu thụ năng lượng, tăng tốc đồ họa, khả năng đa phương tiện tốt, bộ nhớ lớn, v.v.

Về mặt phần mềm, nếu chúng ta nhìn lại 18 năm trước, chúng ta sẽ nhận thấy rằng hầu hết các hệ thống nhúng chạy Linux vào thời điểm đó đều phải phát triển hoàn toàn từ đầu. Chức năng chính của Linux trong các thiết bị nhúng lúc đó là khởi động thiết bị và chạy ứng dụng cụ thể nào đó (thường không có đồ họa). Một hệ thống điển hình thời đó chứa một nhân Linux nhỏ gọn (minimal Linux kernel), một thư viện C nhỏ nhắn xinh xắn (uclibc), BusyBox (là một chương trình chứa các tiện ích) và cuối cùng là một hoặc nhiều application cụ thể.

Khi phần cứng trở nên mạnh mẽ và có nhiều tính năng hơn, các yêu cầu đối với phần mềm cũng cao hơn. Với các hệ thống nhúng đủ mạnh để chạy các Linux distro mà chủ yếu dành cho máy tính để bàn (như Debian hoặc Ubuntu), thì việc mọi chuyện không còn dễ dàng như xây dựng các software packages nhỏ (uclibc, BusyBox, …) nữa. Lúc này chúng ta cần phải lựa chọn giữa các hệ thống quản lý window khác nhau (X11, Wayland, v.v.) và các thư viện đồ họa khác nhau (CGI, Kanzi, Qt,  v.v.). Các kỹ sư phần mềm nhúng bắt đầu tìm kiếm các công cụ mới làm cho công việc của họ trở nên dễ dàng hơn cũng như tăng tốc độ phát triển. Đây là bối cảnh mà các “hệ thống build” – “build system” khác nhau của Linux bắt đầu xuất hiện.

Build system đầu tiên xuất hiện là Buildroot. Gốc của nó là dự án uClibc. Mục tiêu ban đầu của Buildroot là sử dụng để build “root filesystems” (đây là thuật ngữ của Linux OS, có thể hiểu là hệ thống thư mục, file trong hệ điều hành Linux) dựa trên thư viện uclibc cho mục đích testing. Buildroot dựa trên cấu trúc của Makefile, kconfig (công cụ cấu hình) và các bản vá lỗi cho các gói phần mềm khác nhau. Nhưng đến ngày này, ngoài việc dùng để build “root filesystems” thì Buildroot còn có thể được sử dụng để build “kernel” và “bootloader”.

Ra đời sau Buildroot không lâu là OpenEmbedded (viết tắt là OE) ra đời. Mục tiêu của nó hơi khác một chút vì nó được định nghĩa là công cụ để tạo ra các Linux distro. OpenEmbedded hoạt động dựa trên việc sử dụng BitBake để thông dịch các files được gọi là các “recipes”. BitBake là một công cụ có nguồn gốc từ portage (Gentoo’s distribution package manager). Một tính năng thú vị về OpenEmbedded là các “recipes” có thể chỉ định “phụ thuộc” – “dependencies” giữa các “gói” – “packages”,  BitBake sẽ phân tích tất cả các “recipes” và tạo ra một hàng đợi các “nhiệm vụ” – “tasks” cần phải làm theo đúng thứ tự. Hai ví dụ về Linux distro được tạo ra với OpenEmbedded là AngstromOpenMoko.

Một bản phân phối dựa trên OpenEmbedded khác là Poky Linux. Điều này có tầm quan trọng đặc biệt bởi vì nó là nguồn gốc của Yocto. Yocto Project là một dự án mã nguồn mở có mục tiêu là cung cấp các công cụ giúp xây dựng các hệ thống nhúng hoạt động trên hệ điều hành Linux. Yocto Project là được hợp thành từ nhiều dự án mã nguồn mở nhỏ hơn như Poky, BitBake và OpenEmbedded-Core. Ngoài các dự án chính này thì cón có nhiều dự án nhỏ khác nữa. Trong giai đoạn mới này, Poky (với tiền thân là một Linux distro) đã trở thành “bản phân phối tham chiếu” – “reference distribution” của Yocto Project. Poky bao gồm OpenEmbedded Build System (BitBake + OpenEmbedded-Core) và một bộ các metadata mặc định có sẵn (bao gồm các recipes, các file cấu hình…) giúp chúng ta có thể bắt đầu build các Linux software packages của riêng mình. Nhiều người thường hay bị nhầm lẫn giữa Yocto Project với Poky build system nên anh em chú ý 2 khái niệm này nhé.

Poky là một giải pháp gần như là đầy đủ dành cho các team kỹ sư phần mềm nhúng. Nó cho phép bạn tạo các Linux distro dành riêng cho phần cứng của bạn. Nó cũng cho phép bạn tạo ra một bộ công cụ hỗ trợ phát triển phần mềm (SDK – Software Development Kit) dành riêng  cho bản distro của bạn. SDK này có thể được các engineers khác sử dụng để biên dịch các ứng dụng mà sau này sẽ chạy trên hệ thống Linux của bạn.

Vậy cuối cùng thì Yocto là gì ?

Yocto là một dự án mã nguồn mở có mục tiêu là cung cấp các công cụ giúp xây dựng các hệ thống nhúng hoạt động trên hệ điều hành Linux. Tên đầy đủ là Yocto Project.

Một số điểm cần nhấn mạnh về Yocto:
  • Yocto không phải là một bản distribution của hệ điều hành Linux.
  • Yocto không phải là buid system.
  • Yocto không phải là framework.
  • Yocto không phải là tool.

Poky là gì ?

Có thể hiểu Poky là build system của Yocto Project. Poky bao gồm OpenEmbedded Build System (BitBake + OpenEmbedded-Core) và một bộ các metadata mặc định có sẵn (metadata chứa các recipes, các file cấu hình…) giúp chúng ta có thể bắt đầu xây dựng các Linux software packages của riêng mình.

                                           Poky build system

Trong một số trường hợp, các metadata có sẵn của Poky có thể là không đủ để chúng ta build các software của mình. Lúc đó chúng ta sẽ cần lấy metadata từ nguồn khác (cần phải tương thích với Yocto Project) hoặc tự phát triển.

Các Linux software packages có thể build dùng Poky bao gồm

  • Bootloader
  • Linux kernel
  • Root filesystems
  • Toolchains và Software Development Kits (SDKs)

Tài liêụ tham khảo

  • [1]  Embedded Linux Projects Using Yocto Project Cookbook

— Phạm Minh Tuấn (Shun) —