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
檢查修改完的新版本確認。
沒有留言:
張貼留言
因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。