Yocto開發相關筆記linux
添加一個新的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
使用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 \
OpenEmbedded編譯系統會逐個讀取出這個分片的內容,以後添加到內核配置文件.config中。
微調內核配置文件
經過調用do_kernel_configme和do_kernel_configcheck任務來微調內核配置文件。
$bitbake linux-yocto -c kernel_configme
$bitbake linux-yocto -c kernel_configcheck
執行完kernel_configcheck後會輸出一系列警告或問題,解決之。以後從新執行上述兩個命令,直到滿意爲止。
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 從新編譯內核
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層
5.1 製做鏡像的時候刪除包。
使用以下變量實現:
BAD_RECOMMENDATIONS:該變量針對recommended-only包有效;
NO_RECOMMENDATIONS:該變量用於禁止安裝全部recommend-only包;
PACKAGE_EXCLUDE:該變量用於禁止指定包的安裝;
5.2 製做運行時動態安裝包。
在源代碼包編譯的過程當中須要在變量IMAGE_FEATURES中添加package-management;
在服務器端須要添加http等服務;
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;