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-PV{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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章