Yocto開發相關筆記

Yocto開發相關筆記linux

  1. 添加一個新的machine

    添加一個新的machine須要在新加layer的conf/machine/目錄中填寫對應的配置文件,好比:raspberrypi3.conf是樹莓派3的配置文件。該配置文件位於meta-raspberrypi/conf/machine/raspberrypi3.conf。git

    machine的配置文件中通常都包含以下內容:web

    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」app

  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;

相關文章
相關標籤/搜索