Ads 468x60px

##EasyReadMore##

05 12月, 2017

Yocto開發相關筆記

  1. 添加一個新的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”
  1. 配置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後會輸出一系列警告或問題,解決之。之後重新執行上述兩個命令,直到滿意為止。
  1. kernel打patch
    3.1 找到當前內核源代碼路徑,即:cd ~/poky/build/tmp/work/qemux86-poky-linux/linux-yocto-${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 重新編譯內核
  1. 安全問題
    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層
  1. Packages相關操作
    5.1 製作鏡像的時候刪除包。
        使用如下變量實現:
            BAD_RECOMMENDATIONS:該變量針對recommended-only包有效;
            NO_RECOMMENDATIONS:該變量用於禁止安裝所有recommend-only包;
            PACKAGE_EXCLUDE:該變量用於禁止指定包的安裝;
    5.2 製作運行時動態安裝包。
        在源代碼包編譯的過程中需要在變量IMAGE_FEATURES中添加package-management;
        在服務器端需要添加http等服務;
  1. 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”
  1. 選擇一個設備管理器
    設備管理器用於管理/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;

下面這個網誌寫的不錯:
zybo board 開發記錄: 使用 Yocto 建立系統 | coldnew's blog - https://goo.gl/WLv3Dw


Yocto開發相關筆記 - https://goo.gl/9xwHVP

0 意見:

張貼留言

 
Blogger Templates