將文件附加到 initramfs 映像 - 可靠嗎?
我正在修改來自不同 Linux 發行版的一堆
initramfs
檔案,其中通常只有一個文件被更改。我想自動化這個過程,而不需要切換到 root 使用者來提取
initramfs
圖像中的所有文件並再次打包它們。首先,我嘗試生成一個文件列表,
gen_init_cpio
而不提取存檔中的所有內容,即通過將所有權限更改為八進制並將輸出安排為所需格式的腳本initramfs
解析cpio -tvn initrd.img
(如輸出)的輸出,例如:ls -l``gen_init_cpio
dir /dev 755 0 0 nod /dev/console 644 0 0 c 5 1 slink /bin/sh busybox 777 0 0 file /bin/busybox initramfs/busybox 755 0 0
這涉及一些替換,並且腳本可能很難為我編寫,所以我找到了一種更好的方法,我在問安全和便攜性如何:
在某些發行版中,我們有一個
initramfs
包含連接部分的文件,顯然核心解析整個文件,提取包裝在 1 字節邊界中的所有部分,因此無需將每個部分填充為 512 字節的倍數。我認為這個“功能”對我很有用,可以避免在修改其中的文件時重新創建存檔。確實它有效,至少對於Debian
和CloneZilla
。例如,如果我們修改了Debian 8.2.0
/init
上的文件initrd.gz
,我們可以將其附加到initrd.gz
圖像中:$ echo ./init | cpio -H newc -o | gzip >> initrd.gz
兩個級聯檔案也是如此
initrd.gz
,原始檔案和修改檔案。讓我們看看結果binwalk
:DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 gzip compressed data, maximum compression, has original file name: "initrd", from Unix, last modified: Tue Sep 1 09:33:08 2015 6299939 0x602123 gzip compressed data, from Unix, last modified: Tue Nov 17 16:06:13 2015
它完美地工作。但它可靠嗎?
initfamfs
將數據附加到文件時我們有什麼限制?在不將原始存檔填充到 512 字節的倍數的情況下追加是否安全?哪個核心版本支持此功能?
它非常可靠,所有支持 initrd、AFAIK 的核心版本都支持它。
cpio
這是組成的檔案的一個特徵initramfs
。cpio
只是繼續提取其輸入….我們可能知道該文件是一個接一個的兩個 cpio 存檔,但 cpio 只是將其視為單個輸入流。Debian 建議使用這種方法(將另一個 cpio 附加到 initramfs)將二進制 blob 韌體添加到他們的安裝程序 initramfs。例如:
DebianInstaller / NetbootFirmware | Debian 維基
Initramfs 本質上是 gzip 壓縮的 cpio 檔案的串聯,這些檔案被提取到 ramdisk 中並被 Linux 核心用作早期使用者空間。Debian 安裝程序的 initrd.gz 實際上是一個 gzip 壓縮的 cpio 存檔,其中包含安裝程序在啟動時需要的所有文件。通過簡單地附加另一個 gzip 壓縮的 cpio 存檔 - 包含我們缺少的韌體文件 - 我們就可以上路了!