Yocto開發相關筆記
阿新 • • 發佈:2018-12-12
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-
{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;