1. 程式人生 > >Yocto開發相關筆記

Yocto開發相關筆記

https://my.oschina.net/linuxhunter/blog/736196
新增一個新的machine
新增一個新的machine需要在新加layer的conf/machine/目錄中填寫對應的配置檔案,比如:raspberrypi3.conf是樹莓派3的配置檔案。該配置檔案位於meta-raspberrypi/conf/machine/raspberrypi3.conf。

machine的配置檔案中一般都包含如下內容:

TARGET_ARCH:指出目標平臺架構名稱,如:arm

PREFERRED_PROVIDER:指出優先採用的recipe名稱。比如:PREFERRED_PROVIDER_virtual/kernel ?= “linux-raspberry”,說明對於kernel的使用,優先採用linux-raspberrypi這個recipe。

MACHINE_FEATURES:指出MACHINE支援的硬體特性,比如:MACHINE_FEATURES = “apm bluetooth wifi screen”

SERIAL_CONSOLE:指出串列埠的配置,比如:SERIAL_CONSOLE = “115200 ttyS0”

KERNEL_IMAGETYPE:指出linux核心映象的型別,比如:KERNEL_IMAGETYPE = “zImage”

IMAGE_FSTYPES:指出檔案系統映象的檔案系統型別,比如:IMAGE_FSTYPES = “tar.gz jffs2”

配置linux核心
使用menuconfig來配置核心。

    $bitbake linux-yocto -c kernel_configme -f

    $bitbake linux-yocto -c menuconfig

建立defconfig檔案來配置核心。

    defconfig檔案就是kernel的.config檔案的更名,將defconfig檔案複製到recipe目錄中,之後在.bb或.bbappend檔案中新增如下內容:

        FILESEXTRAPATHS_prepend := “${THISDIR}/${PN}: “

        SRC_URI += “file://defconfig”

建立配置分片(configuration fragments)

    可以將核心的配置項分散到多個配置檔案中,之後將配置檔案放置到recipe目錄中,最後在.bb或.bbappend檔案中新增如下內容:

        SRC_URI += “file://myconfig.cfg \

                    file://ethernet.cfg \

                    file://gfx.cfg”

    OpenEmbedded編譯系統會逐個讀取出這個分片的內容,之後新增到核心配置檔案.config中。

微調核心配置檔案

    通過呼叫do_kernel_configme和do_kernel_configcheck任務來微調核心配置檔案。

        $bitbake linux-yocto -c kernel_configme 

        $bitbake linux-yocto -c kernel_configcheck

    執行完kernel_configcheck後會輸出一系列警告或問題,解決之。之後重新執行上述兩個命令,直到滿意為止。

kernel打patch
3.1 找到當前核心原始碼路徑,即:cd ~/poky/build/tmp/work/qemux86-poky-linux/linux-yocto- P V {PV}- {PR}/linux

3.2 修改核心原始碼檔案。

3.3 使用git命令提交修改後的核心原始碼。

    $git status .

    $git add .

    $git commit -m “xxx”

3.4 建立patch檔案。

    $git format-path -1

3.5 建立自己的layer。

    配置layer的conf目錄和recipes-kernel/linux目錄

    在recipes-kernel/linux目錄下建立recipe檔案,即:linux-yocto_${PV}.bbappend。之後在檔案中新增如下內容:

        FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

             SRC_URI += "file://0001-calibrate-Add-printk-example.patch"

    在recipes-kernel/linux目錄下建立linux-yocto目錄,之後將核心patch檔案複製到該目錄中

3.6 檢查自己的layer的有效性。

    在build目錄裡的conf/bblayer.conf中檢視自己的layer是否被新增到BBLAYER變數中

3.7 重新編譯核心。

    $bitbake -c cleansstate linux-yocto    清空快取中的內容

    $bitbake -k linux-yocto            重新編譯核心

安全問題
4.1 安全問題的總體考慮。

    使用靜態分析工具掃描新增到系統中的其它程式碼;

    格外注意基於web的管理員介面;

    確保軟體的及時更新;

    釋出版本的時候確保刪除或禁用debug功能;

    確保發行版本中不會有不需要的網路監聽程式;

    刪除發行版中不必要的軟體;

    確認硬體上支援secure boot功能;

4.2 Security flags。

    若需要Security的編譯,則需要在local.conf中新增如下一行:

        require conf/distro/include/security_flags.inc

    security_flags.inc檔案中主要是包含了編譯/連結過程中的關於安全的相關選項。

4.3 其它的考慮。

    在image中去掉IMAGE_FEATURES或EXTRA_IMAGE_FEATURES=“debug-tweaks”選項

    使用extrausers類實現root使用者以及其它使用者的密碼設定

    考慮使用Mandatory Access Control(MAC),即:使用meta-selinux層

    考慮使用meta-security層

Packages相關操作
5.1 製作映象的時候刪除包。

    使用如下變數實現:

        BAD_RECOMMENDATIONS:該變數針對recommended-only包有效;

        NO_RECOMMENDATIONS:該變數用於禁止安裝所有recommend-only包;

        PACKAGE_EXCLUDE:該變數用於禁止指定包的安裝;

5.2 製作執行時動態安裝包。

    在原始碼包編譯的過程中需要在變數IMAGE_FEATURES中新增package-management;

    在伺服器端需要新增http等服務;

Initialization Manager的選擇
yocto預設使用SysVinit作為啟動器,然而yocto也支援systemd啟動方式。若選擇systemd則需要如下內容:

設定如下變數啟用systemd:

    DISTRO_FEATURES_append = “ systemd”

    VIRTUAL-RUNTIME_init_manager = “systemd”

此時系統啟動的時候預設採用systemd方式啟動,但是sysvinit指令碼也安裝到image中只不過在rescure/minimal中使用sysvinit方式啟動

刪除SysVinit指令碼:

    DISTRO_FEATURES_BACKFILL_CONSIDERED = “sysvinit”

選擇一個裝置管理器
裝置管理器用於管理/dev目錄,裝置管理器包括:靜態的和動態的。其中靜態的在編譯過程中確定/dev目錄中的內容,之後就不再變化了,而動態的則是實用devtmpfs來管理/dev目錄,由核心在啟動過程中動態的操作且在使用者態空間由udev或者busybox-mdev程序進行處理。

靜態管理:

    設定USE_DEVFS = “0”

    設定IMAGE_DEVICE_TABLES = “device_table_mymachine.txt”設定device tables檔案

動態管理:

    設定USE_DEVFS = “1”。此時核心採用devtmpfs來初始化/dev目錄(在核心配置方面要新增CONFIG_DEVTMPFS);

    所有由devtmpfs建立的裝置節點屬於root使用者且訪問許可權是0600;

    設定使用者態裝置管理程序,即:VIRTUAL-RUNTIME_dev_manager = “udev” 設定裝置管理使用者態程序為udev;