2020年10月25日 星期日

修改/客製 initrd.img

Linux 開機時最早載入的兩個檔案是 vmlinuz (kernel) 及 initrd.img。 較舊的 initrd.img 是一個單純的壓縮過的 cpio 檔; 但較新的 initrd.img (我拿 ulyana 實驗) 則是在主要壓縮檔的前面還放了兩個未壓縮的 cpio 檔, 裡面分別包含了 kernel/x86/microcode/AuthenticAMD.bin 跟 early2/kernel/x86/microcode/GenuineIntel.bin 兩個檔案, 所以如果用 cpio -idv < .../initrd.img 只會看到 AuthenticAMD.bin 。 查到最接近有用的答案是 這個

不過後來想起來/查到有更簡單的方法: mkdir /tmp/initrd/ ; unmkinitramfs .../initrd.img /tmp/initrd/ 這會在 /tmp/initrd/ 裡面解出 early、 early2、 main 三個目錄, 其中 main 才是主要的內容。

會想要改 initrd.img 主要是因為想要讓 ulyana 可以 透過 pxe 從網路開機, 但是 ulyana 原先的 initrd 裡面並沒有 tftp client 執行檔。 所以我用相同的方式分別解開 ulyana 及 grml 兩版的 initrd.img , 再把 grml 裡面的 /usr/bin/tftp 複製到 ulyana 的對應位置去。 [註: 曾試過在 ulyana 底下用 apt install tftp 安裝所得到的執行檔, 但這個版本的執行檔很小很廢完全不能用。]

改完之後並不是用 mkinitramfs 指令打包, 而是要 手動打包 (<== 大推):

# 假設原先在 /tmp/initrd/main 裡面
find . | cpio --create --format=newc | xz --format=lzma > /tmp/main.img
cd ../initrd/early
find . -print0 | cpio --null --create --format=newc > /tmp/early.img
cd ../early2
find . -print0 | cpio --null --create --format=newc > /tmp/early2.img
cd /tmp
cat early.img early2.img main.img > .../initrd.img

可以用 lsinitramfs .../initrd.img 檢查修改完的新版本確認。

沒有留言:

張貼留言

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。