以使用者身份解包、修改和打包 initrd
我在
initrd
以使用者身份重建圖像時遇到問題。首先,當我嘗試“解包”原始initrd
圖像時:cpio -idm < initrd-base cpio: dev/tty8: Cannot mknod: Operation not permitted cpio: dev/tty3: Cannot mknod: Operation not permitted cpio: dev/zero: Cannot mknod: Operation not permitted cpio: dev/loop0: Cannot mknod: Operation not permitted cpio: dev/loop4: Cannot mknod: Operation not permitted cpio: dev/loop7: Cannot mknod: Operation not permitted cpio: dev/loop5: Cannot mknod: Operation not permitted cpio: dev/loop2: Cannot mknod: Operation not permitted cpio: dev/tty9: Cannot mknod: Operation not permitted cpio: dev/tty4: Cannot mknod: Operation not permitted cpio: dev/null: Cannot mknod: Operation not permitted cpio: dev/loop6: Cannot mknod: Operation not permitted cpio: dev/loop1: Cannot mknod: Operation not permitted cpio: dev/console: Cannot mknod: Operation not permitted cpio: dev/loop3: Cannot mknod: Operation not permitted cpio: dev/tty1: Cannot mknod: Operation not permitted 133336 blocks
我怎樣才能擺脫這些警告?
其次 - 我不確定如何處理文件所有權。在我解壓後,似乎一切都屬於目前使用者。
initrd
重新包裝後會怎樣?我寧願不改變標準訪問權限。
由於您使用的是 cpio,因此您實際上是在製作initramfs,而不是initrd。initrd 將儲存為文件系統映像,而不是 cpio 存檔。initrd 和 initramfs 在 Linux 啟動過程中具有相似的作用,提供一些在真正的根文件系統之前可用的文件(並且用於掛載真正的根文件系統);它們在引擎蓋下以相當不同的方式處理,但這在這裡無關緊要。Initrd 較舊,有些被棄用,取而代之的是 initramfs。許多建構系統仍然使用該文件名
initrd
,即使它們已將內容切換到 initramfs。根映像通常包含需要特定權限的設備節點和文件。該
cpio
命令只能根據文件系統中存在的文件生成存檔,並且您需要 root 權限才能創建設備節點或屬於 root 的文件。核心原始碼包含一個工具usr/gen_init_cpio
和一個包裝腳本scripts/gen_initramfs_list.sh
,它們被精確地提供用於生成 initramfs,而無需在文件系統上創建所有文件,因此無需任何特權即可生成 initramfs。這些程序記錄在核心原始碼樹中,在Documentation/filesystems/ramfs-rootfs-initramfs.txt
和Documentation/early-userspace/README
.建構 initramfs 的正常方法在
ramfs-rootfs-initramfs.txt
“填充 initramfs”部分中進行了描述。您編寫一個文本文件,其中包含要創建的路徑列表及其類型(目錄、正常、設備節點等)、權限和其他屬性。對於正常文件,您可以提供包含內容的本地文件的名稱。然後usr/gen_init_cpio
在這個文件上執行。在建構核心時,如果將CONFIG_INITRAMFS_SOURCE
選項設置為文件名,則會通過呼叫usr/gen_init_cpio
該文件生成 initramfs。如果你已經有一個 initramfs 鏡像並且想要修改它,使用它
cpio -tv
來列出它,並在此基礎上重建 ramfs 描述文件。如果可能,請從原始核心源中獲取 initramfs 描述文件,以節省您的工作量。僅在某個目錄中提取正常文件的內容。然後修改正常文件和ramfs描述文件,最後執行usr/gen_init_cpio
生成新的initramfs。
出現這些錯誤是因為您的使用者沒有創建節點的權限。只有 root 可以創建除 fifos 和套接字以外的節點(參見mknod文件
EPERM
)當您再次重新打包 initrd 時,那些特殊文件不會在那裡。要重新打包 initrd,有一個名為的選項
--owner
可用於設置所有文件的所有者。但是,只有 root 可以使用此選項。我看到的唯一方法是將 initrd 複製到另一個系統,在那裡您具有 root 訪問權限並在那裡執行操作。之後複製回來。