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;