Buildroot - 第 2 部分。建立您的主機板配置; 使用外部樹、rootfs-overlay、建置後腳本

在本節中,我將介紹一些我需要的自訂選項。 這不是 buildroot 提供的完整列表,但它們非常實用,並且不需要幹預 buildroot 本身的文件。

使用EXTERNAL機制進行客製化

在上一篇文章中 我們查看了一個簡單的範例,透過將板的 defconfig 和必要的檔案直接新增至 Buildroot 目錄來新增您自己的設定。

但這種方法不太方便,尤其是更新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

重要的! 該文件中的路徑將是絕對路徑!

選單中出現了一個外部選項項目:

Buildroot - 第 2 部分。建立您的主機板配置; 使用外部樹、rootfs-overlay、建置後腳本

此子選單將包含外部樹中的套件。 該部分目前為空。

現在對我們來說更重要的是重寫必要的路徑以使用外部樹。

請注意,在「建置選項」→「儲存建置根配置的位置」部分中,將會有一個已儲存的 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)。

我們收集並檢查:

Buildroot - 第 2 部分。建立您的主機板配置; 使用外部樹、rootfs-overlay、建置後腳本

在系統組裝的不同階段執行客製化腳本

通常,在將目標檔案系統打包到映像中之前,您需要在目標檔案系統內執行一些工作。

這可以在系統配置部分完成:

Buildroot - 第 2 部分。建立您的主機板配置; 使用外部樹、rootfs-overlay、建置後腳本

前兩個腳本在目標檔案系統建置之後、打包成鏡像之前執行。 不同之處在於 fakeroot 腳本是在 fakeroot 的上下文中執行的,它模擬 root 使用者的工作。

最後一個腳本在建立系統映像後執行。 您可以在其中執行其他操作,例如,將必要的檔案複製到 NFS 伺服器或建立裝置韌體的映像。

例如,我將建立一個腳本,將版本和建置日期寫入 /etc/.
首先,我將在外部樹中指示該文件的路徑:

Buildroot - 第 2 部分。建立您的主機板配置; 使用外部樹、rootfs-overlay、建置後腳本

現在是腳本本身:

[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

組裝完成後,您可以在系統中看到該檔案。

實際上,腳本可能會變得很大。 因此,在實際專案中我採取了更高級的路線:

  1. 我建立了一個目錄(my_tree/board_my_x86_board/inside_fakeroot_scripts),其中有要執行的腳本,帶有序號。 例如,0001-add-my_small_linux-version.sh、0002-clear-apache-root-dir.sh
  2. 我編寫了一個腳本(my_tree/board_my_x86_board/run_inside_fakeroot.sh),它遍歷該目錄並順序執行其中包含的腳本
  3. 在系統設定 -> 要在 fakeroot 環境中執行的自訂腳本 ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh) 部分的板設定中指定此腳本

來源: www.habr.com

添加評論