Thêm samba server vào bản build Linux cho Raspberry PI bằng Yocto Project

Ta đã nói đến việc build một bản phân phối Linux cho Raspberry PI ở bài Tạo một bản phân phối Linux cho Raspberry PI bằng Yocto Project.

Một trong những giao thức truy cập file phổ biến nhất hiên nay là SMB, vốn ban đầu được hỗ trợ trên các máy Windows, dùng cho giao thức chia sẻ file trong mạng nội bộ. Trên Linux, để tạo một server như thế, người ta dùng Samba (cái tên cũng na ná nhỉ).

Trong bài này, sẽ trình bày cách đưa Samba vào bản phân phối Linux đã được build ở bài trước.

Trước khi bắt đầu các thao tác dưới đây, ta cần thiết lập các biến môi trường cần thiết bằng câu lệnh từ bài trước:

$source poky/oe-init-build-env build  

Thư mục build sẽ ở ngoài thư mục poky

Thêm samba server vào bản build

Yocto Project cung cấp một bộ khung cho phép thêm các phần mềm vào image được build ra. Ta có thêm bất cứ phần mềm nào, nó có thể là source tự build hoặc một phần mềm được viết kịch bản từ build để thêm vào images có từ trước.

Trường hợp của samba server, đây vốn là một phần mềm khá phổ biến khi muốn tạo một server để truy cập giống như chia sẻ file giữa các máy trên windows vậy.
Vì thế, kịch bản tải source, thực hiện các bản sửa, compiple đã có sẵn rồi.
Nó là 1 recipes (file chứa kịch bản download source đến compile) thuộc layer meta-openembedded/meta-networking/

(Để tìm hiểu thêm các khái niệm về recipelayer của Yocto Project xin hãy hỏi thầy Google)

Như một cách để confirm, ta có thể truy cập vào source code của layer trên tại:

https://github.com/openembedded/meta-openembedded/tree/master/meta-networking

Recipe của samba server nằm ở meta-networking/recipes-connectivity/samba/.

Ta bắt đầu quá trình thêm ngay bây giờ

  • Đầu tiên, ta phải tải layer trên về thư mục poky, giống như cách tải BSP ở bài trước, phiên bản mới nhất của meta-openembeddedkrogoth.
    Ta sẽ thực hiện các câu lệnh để tải về như dưới đây:
oedev@OEDEV-Ubuntu:~/raspberrypi_krogoth/poky$ pwd  
/home/oedev/raspberrypi_krogoth/poky  
oedev@OEDEV-Ubuntu:~/raspberrypi_krogoth/poky$ git clone -b krogoth git://github.com/openembedded/meta-openembedded.git  

Không mất quá thời gian để tải, ta sẽ có thư mục meta-openembedded nằm bên dưới Poky, tức là cùng thư mục với meta-raspberrypi đã tải ở phần trên.

  • Giờ ta phải thêm layer chứa samba server vào
    Để thêm layer, ta sẽ thực hiện giống như đã thêm với layer BSP ở trên thôi:
    Mở file build/conf/bblayers.conf và thêm đường dẫn của layer networking.
    Tuy nhiên, ta sẽ gặp lỗi ngay vì chỉ thêm networking sẽ không đủ, vì trong file mô tả của layer networking (đường dẫn meta-networking/conf/layer.conf) có nội dung như sau:
# We have a conf and classes directory, add to BBPATH  
BBPATH .= ":${LAYERDIR}"

# We have a packages directory, add to BBFILES  
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \  
${LAYERDIR}/recipes-*/*/*.bbappend"

BBFILE_COLLECTIONS += "networking-layer"  
BBFILE_PATTERN_networking-layer := "^${LAYERDIR}/"  
BBFILE_PRIORITY_networking-layer = "5"

# This should only be incremented on significant changes that will  
# cause compatibility issues with other layers  
LAYERVERSION_networking-layer = "1"

LAYERDEPENDS_networking-layer = "core"  
LAYERDEPENDS_networking-layer += "openembedded-layer"  
LAYERDEPENDS_networking-layer += "meta-python"

LICENSE_PATH += "${LAYERDIR}/licenses"

# used by waf-samba.bbclass  
WAF_CROSS_ANSWERS_PATH = "${LAYERDIR}/files/waf-cross-answers"  

Ta sẽ thấy 3 dòng có chữ LAYERDEPENDS, hay là các layer mà layer này phụ thuộc.
Tức là để build được layer này, ta phải build cả 2 layer kia nữa.

Vì thế, ta phải sửa file build/conf/bblayers.conf thành như sau:

# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf  
# changes incompatibly  
POKY_BBLAYERS_CONF_VERSION = "2"

BBPATH = "${TOPDIR}"  
BBFILES ?= ""

BBLAYERS ?= " \  
/home/oedev/raspberrypi_krogoth/poky/meta \  
/home/oedev/raspberrypi_krogoth/poky/meta-poky \  
/home/oedev/raspberrypi_krogoth/poky/meta-yocto-bsp \  
/home/oedev/raspberrypi_krogoth/poky/meta-raspberrypi \  
/home/oedev/raspberrypi_krogoth/poky/meta-openembedded/meta-python \  
/home/oedev/raspberrypi_krogoth/poky/meta-openembedded/meta-oe \  
/home/oedev/raspberrypi_krogoth/poky/meta-openembedded/meta-networking \  
/home/oedev/raspberrypi_krogoth/poky/meta-local \  
  • Tiếp theo, thêm samba server vào ảnh:
    Theo tài liệu [Yocto Project Development Manual] (http://www.yoctoproject.org/docs/1.8/dev-manual/dev-manual.html), có 2 cách để thêm vào image. Thứ nhất là, thêm vào biến IMAGE_INSTALL_append có trong file build/conf/local.conf. Cách thứ 2, tạo một layer mới, là layer sau cùng được build, layer chỉ chứa gói phần mềm samba mà thôi.
    Cách thứ 2 sẽ ít ảnh hưởng hơn cách thứ nhất vì ta không phải động đến file có sẵn là local.conf. Vì thế, ta sẽ làm theo cách 2.

Tạo cây thư mục với đường dẫn như sau:

poky/meta-local/  
├── conf  
│   └── layer.conf  
└── recipes-core  
└── images  
└── rpi-basic-image.bbappend  

Trong đó:
layer.conf: là file cấu hình layer local này, có có mẫu chung rồi.
trong trường này, ta sẽ sử dụng nội dung sau:

# We have a conf and classes directory, add to BBPATH  
BBPATH .= ":${LAYERDIR}"

# We have recipes-* directories, add to BBFILES  
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb ${LAYERDIR}/recipes*/*/*.bbappend"

BBFILE_COLLECTIONS += "local"  
BBFILE_PATTERN_local = "^${LAYERDIR}/"  
BBFILE_PRIORITY_local = "7"  

Ta nên để PRIOIRTY càng cao càng tốt, tức là độ ưu tiên thấp khi build.

rpi-basic-image.bbappend sẽ có nội dung như sau:

IMAGE_INSTALL += "samba \  
"  
  • Cuối cùng ta thực hiện lại lệnh build ảnh như đã build ở phần 1 thôi.
    Sau khi thực hiện xong, ta sẽ có file ảnh mới với kích thước lớn hơn hẳn
    (128MB so với 197MB thì phải)

<Một số hình ảnh kiểm chứng>