Kernel

將文件附加到 initramfs 映像 - 可靠嗎?

  • March 3, 2018

我正在修改來自不同 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 字節的倍數。我認為這個“功能”對我很有用,可以避免在修改其中的文件時重新創建存檔。確實它有效,至少對於DebianCloneZilla

例如,如果我們修改了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這是組成的檔案的一個特徵initramfscpio只是繼續提取其輸入….我們可能知道該文件是一個接一個的兩個 cpio 存檔,但 cpio 只是將其視為單個輸入流。

Debian 建議使用這種方法(將另一個 cpio 附加到 initramfs)將二進制 blob 韌體添加到他們的安裝程序 initramfs。例如:

DebianInstaller / NetbootFirmware | Debian 維基

Initramfs 本質上是 gzip 壓縮的 cpio 檔案的串聯,這些檔案被提取到 ramdisk 中並被 Linux 核心用作早期使用者空間。Debian 安裝程序的 initrd.gz 實際上是一個 gzip 壓縮的 cpio 存檔,其中包含安裝程序在啟動時需要的所有文件。通過簡單地附加另一個 gzip 壓縮的 cpio 存檔 - 包含我們缺少的韌體文件 - 我們就可以上路了!

引用自:https://unix.stackexchange.com/questions/243657