前一陣子陸續將手邊的 RHEL 9.7 系統更新至 9.8 時所發生的一個插曲,發現內核版本更新後所產生的 initramfs 檔案變得相當肥大,大約從 30-40MB 擴張至 200MB 以上,會直接把 /boot 分割區塞爆……導致 initramfs 無法正常產出,而出現錯誤。再核對了一下,則發現這個情形只發生在 AWS EC2 上面的主機,其餘手邊的實體或虛擬機,相同的更新程序都沒有 initramfs 增大的情形。以及另一方面,不同於雲端主機的磁碟分割狀態,是預先分配好的情形,例如 /boot 可能會被切成僅有 500MB 大;平常自行手動安裝的 Linux 系統,自己都是選擇不切 /boot 分割區,自然也就不會有 /boot 被塞爆的狀況。
雖然直接縮減 Linux 內核版本同時存在的數目,也許是最立即可見的粗略解法。然而對於為什麼只有雲端主機會出現 initramfs 增大的情形,仍是覺得有點不解,於是循線查了一下,找到 Red Hat Customer Portal 的這份文件:Size of the initramfs for the updated kernel is very large (70MB or more)。不過這裡可能需要先註明一下,Red Hat 知識庫文件實際上是免費資源,所以不用看到它好像要求帳號登入就卻步。它只是需要你免費註冊一個 Red Hat 帳號即可,就如同於 RHEL 實際上可免費訂閱開發者授權的情形。
至於問題的肇因就在於,透過虛擬映像檔產出及部署的 RHEL 系統,可能預先安裝了一個名為 dracut-config-generic 的套件,它單純地覆寫了應已為系統預設值的 hostonly 選項,將「hostonly="no"」寫入至 /usr/lib/dracut/dracut.conf.d/02-generic-image.conf 內,致使得 dracut 指令產出的 initramfs 出現增大的情形。
所以解決方法很單純,就是移除 dracut-config-generic 套件,然後再重新執行一次 dracut 指令(或者重新安裝 kernel-core 套件也會促使 dracut 被再次執行),initramfs 大小就會復原至精簡的情形:
- dnf remove dracut-config-generic
- dracut -f --regenerate-all