在本節中,我將介紹一些我需要的自訂選項。 這不是 buildroot 提供的完整列表,但它們非常實用,並且不需要幹預 buildroot 本身的文件。
使用EXTERNAL機制進行客製化
但這種方法不太方便,尤其是更新buildroot。 有一個機制可以解決這個問題 外部樹。 它的本質是你可以將board、configs、packages 和其他目錄儲存在單獨的目錄中(例如,我使用patch 目錄將補丁應用到套件中,更多詳細資訊在單獨的部分中),並且buildroot 本身會將它們添加到它的目錄。
注意:您可以一次覆蓋多個外部樹,buildroot 手冊中有一個範例
讓我們建立一個目錄 my_tree,位於 buildroot 目錄旁邊,並將我們的設定傳輸到那裡。 輸出應該是以下文件結構:
[alexey@alexey-pc my_tree]$ tree
.
├── board
│ └── my_x86_board
│ ├── bef_cr_fs_img.sh
│ ├── linux.config
│ ├── rootfs_overlay
│ └── users.txt
├── Config.in
├── configs
│ └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches
6 directories, 7 files
正如您所看到的,該結構總體上重複了 buildroot 的結構。
Каталог 板 在我們的例子中包含特定於每個板的檔案:
- bef_cr_fs_img.sh 是一個腳本,將在建置目標檔案系統之後、將其打包成映像之前執行。 我們將來會用到它
- linux.config - 核心配置
- rootfs_overlay - 覆蓋在目標檔案系統之上的目錄
- users.txt - 描述要建立的使用者的文件
Каталог CONFIGS 包含我們主機板的 defconfig。 我們只有一個。
禮包套裝 - 我們的包裝目錄。 最初,buildroot 包含用於建立有限數量的套件的描述和規則。 稍後我們將在這裡新增icewm視窗管理器和Slim圖形登入管理器。
修補程序 — 讓您方便地存放不同包的補丁。 更多詳細資訊請參閱下面的單獨部分。
現在我們需要為外部樹添加描述檔。 有 3 個檔案負責此操作:external.desc、Config.in、external.mk。
外部.desc 包含實際描述:
[alexey@alexey-pc my_tree]$ cat external.desc
name: my_tree
desc: My simple external-tree for article
第一行是標題。 在將來的buildroot中建立一個變數 $(BR2_EXTERNAL_MY_TREE_PATH),應在配置程序集時使用。 例如,使用者檔案的路徑可以設定如下:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt
第二行是簡短的、人類可讀的描述。
配置.in、外部.mk — 描述已新增的套件的檔案。 如果您不添加自己的包,那麼這些文件可以留空。 現在,這就是我們要做的。
現在我們已經準備好外部樹,其中包含板的 defconfig 及其所需的檔案。 讓我們進入buildroot目錄並指定使用external-tree:
[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig
在第一個命令中我們使用參數 BR2_EXTERNAL=../my_tree/,表示使用外部樹,可以指定同時使用多個外部樹,此時只需要執行一次,之後會建立一個檔案output/.br-external.mk,儲存有關所使用的外部樹的資訊:
[alexey@alexey-pc buildroot]$ cat output/.br-external.mk
#
# Automatically generated file; DO NOT EDIT.
#
BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES =
BR2_EXTERNAL_DIRS =
BR2_EXTERNAL_MKS =
BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = My simple external-tree for article
重要的! 該文件中的路徑將是絕對路徑!
選單中出現了一個外部選項項目:
此子選單將包含外部樹中的套件。 該部分目前為空。
現在對我們來說更重要的是重寫必要的路徑以使用外部樹。
請注意,在「建置選項」→「儲存建置根配置的位置」部分中,將會有一個已儲存的 defconfig 的絕對路徑。 它是在指定使用 extgernal_tree 時形成的。
我們也會更正系統配置部分中的路徑。 對於已建立使用者的表:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt
在 Kernel 部分中,變更核心配置的路徑:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config
現在,我們的外部樹中的文件將在組裝過程中使用。 當移動到另一個目錄或更新建置根目錄時,我們將遇到最少的問題。
新增 root fs 覆蓋:
這種機制允許您輕鬆地在目標檔案系統中新增/替換檔案。
如果文件位於根文件系統覆蓋中,但不在目標中,則會新增該文件
如果該檔案位於根檔案系統覆蓋層和目標中,則它將被取代。
首先,讓我們設定根檔案系統覆蓋目錄的路徑。 這是在系統設定 → 根檔案系統覆蓋目錄部分中完成的:
$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/
現在讓我們建立兩個檔案。
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts
127.0.0.1 localhost
127.0.1.1 my_small_linux
8.8.8.8 google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt
This is new file from overlay
第一個檔案 (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) 將會取代已完成系統上的 /etc/hosts 檔案。 將會新增第二個檔案 (cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt)。
我們收集並檢查:
在系統組裝的不同階段執行客製化腳本
通常,在將目標檔案系統打包到映像中之前,您需要在目標檔案系統內執行一些工作。
這可以在系統配置部分完成:
前兩個腳本在目標檔案系統建置之後、打包成鏡像之前執行。 不同之處在於 fakeroot 腳本是在 fakeroot 的上下文中執行的,它模擬 root 使用者的工作。
最後一個腳本在建立系統映像後執行。 您可以在其中執行其他操作,例如,將必要的檔案複製到 NFS 伺服器或建立裝置韌體的映像。
例如,我將建立一個腳本,將版本和建置日期寫入 /etc/.
首先,我將在外部樹中指示該文件的路徑:
現在是腳本本身:
[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh
#!/bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release
組裝完成後,您可以在系統中看到該檔案。
實際上,腳本可能會變得很大。 因此,在實際專案中我採取了更高級的路線:
- 我建立了一個目錄(my_tree/board_my_x86_board/inside_fakeroot_scripts),其中有要執行的腳本,帶有序號。 例如,0001-add-my_small_linux-version.sh、0002-clear-apache-root-dir.sh
- 我編寫了一個腳本(my_tree/board_my_x86_board/run_inside_fakeroot.sh),它遍歷該目錄並順序執行其中包含的腳本
- 在系統設定 -> 要在 fakeroot 環境中執行的自訂腳本 ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh) 部分的板設定中指定此腳本
來源: www.habr.com