博客 / 詳情

返回

藍易雲cdn:Centos7.4升級7.9失敗,救援:/boot目錄下文件丟失error: file ‘/initramfs-

你遇到的報錯本質上是:啓動項裏引用了某個內核版本的 <span style="color:red;">initramfs</span>,但 <span style="color:red;">/boot</span> 裏對應文件不存在(或 <span style="color:red;">/boot</span> 分區當時沒正確掛載,導致升級過程沒把文件寫進去)。典型場景發生在 7.4→7.9 升級鏈路中:<span style="color:red;">grub</span> 還指向舊內核(如 3.10.0-957),但 <span style="color:red;">/boot</span> 只剩新內核(多為 3.10.0-1160 系列)或文件被清理。✅

順帶一句實話:CentOS Linux 7 已在 2024-06-30 結束維護,繼續長期跑生產會帶來合規與安全債務,應儘快規劃遷移。 (redhat.com)

一張表把“原因→驗證→動作”講清楚 📌

現象 高概率根因 你怎麼驗證 對應修復動作
提示 initramfs-3.10.0-957... not found <span style="color:red;">grub</span> 指向舊內核,但文件被刪/未生成 救援模式 ls /boot 看是否存在該 img 重建該版本 initramfs 或把默認啓動切到現存內核
升級後無法啓動/反覆進救援 <span style="color:red;">/boot</span> 獨立分區未掛載,升級沒寫入 lsblk -f 看 /boot 是否單獨分區 正確掛載 /boot 後 chroot 修復、重建 grub
/boot 內容異常少或讀寫報錯 <span style="color:red;">/boot</span> 文件系統損壞 fsck -f(對未掛載分區) 修復文件系統後再重建 initramfs/grub

標準救援修復流程(推薦按這個走)🛠️

1)在救援系統裏確認分區並掛載

lsblk -f
mkdir -p /mnt/sysimage
mount /dev/sdXn /mnt/sysimage
mount /dev/sdYm /mnt/sysimage/boot

解釋:

  • lsblk -f 用來“盤點資產”:你要找出根分區(通常是 xfs/ext4)以及是否存在單獨的 <span style="color:red;">/boot</span> 分區。
  • 把根分區掛到 /mnt/sysimage,再把 <span style="color:red;">/boot</span> 分區掛到 /mnt/sysimage/boot,這是後續修復的前提。很多失敗案例就是因為 <span style="color:red;">/boot</span> 沒掛載。
如果你機器是 UEFI,還需要:
mount /dev/sdZp /mnt/sysimage/boot/efi

解釋:
UEFI 機器的啓動文件在 <span style="color:red;">/boot/efi</span>,不掛載會導致 grub 修復不完整。


2)chroot 進入原系統環境(讓命令“作用在原系統”)

mount --bind /dev  /mnt/sysimage/dev
mount --bind /proc /mnt/sysimage/proc
mount --bind /sys  /mnt/sysimage/sys
mount --bind /run  /mnt/sysimage/run
chroot /mnt/sysimage

解釋:

  • --bind 是把救援環境的設備、進程、內核視圖映射進去,避免你在 chroot 裏執行 dracut/grub2-mkconfig 時缺少關鍵接口。
  • chroot 後,你執行的 yum/dracut/grub 命令才會真正修復“出問題的那套系統”。

3)核對 /boot 與已安裝內核清單(決定修復策略)

ls -lh /boot | egrep 'vmlinuz|initramfs|grub'
rpm -q kernel

解釋:

  • ls /boot 直觀看到是否缺失報錯裏提到的 <span style="color:red;">initramfs-3.10.0-957...</span>。
  • rpm -q kernel 告訴你係統“邏輯上安裝了哪些內核版本”。常見矛盾是:rpm 顯示裝了,但 /boot 文件缺失——這就要重建或重裝。

4A)如果系統裏“仍裝着 957 內核”,直接重建缺失的 initramfs(最快)

dracut -f /boot/initramfs-3.10.0-957.el7.x86_64.img 3.10.0-957.el7.x86_64

解釋:

  • <span style="color:red;">dracut</span> 是生成 initramfs 的標準工具。
  • -f 強制覆蓋生成;第二個參數是目標內核版本號,必須與目錄 /lib/modules/<版本> 對得上,否則生成會失敗。

4B)如果 957 內核“已不在系統裏”,那就安裝/重裝一個可用內核(更穩)

yum -y reinstall kernel
# 或者(更直接)安裝當前倉庫可用的最新 7.9 內核
yum -y install kernel

解釋:

  • reinstall 用於“rpm 記錄存在但文件不全”的場景,會把缺失的 /boot/vmlinuz-*initramfs-* 組件補齊。
  • install 則確保你至少有一個可啓動內核落地到 <span style="color:red;">/boot</span>。
  • 7.9 對應主線內核基於 3.10.0-1160 系列是行業共識口徑。 (docs.redhat.com)

5)重建 grub 配置並設置默認啓動項(把“戰略”寫回啓動盤)🚀

grub2-mkconfig -o /boot/grub2/grub.cfg
grub2-set-default 0

解釋:

  • grub2-mkconfig 會重新掃描 /boot 中現存的內核與 initramfs,並生成新的菜單,解決“菜單指向不存在文件”的根因。
  • grub2-set-default 0 先把默認項指向第一個菜單項(通常是最新內核)。你也可以稍後用 grub2-editenv list 精細確認。
UEFI 機型通常還需要同步一份到 EFI 路徑(按你的實際 grub 文件路徑為準):
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

解釋:
UEFI 從 EFI 分區加載 grub 配置;只修 /boot/grub2/grub.cfg 可能不生效。


6)退出並重啓

exit
reboot

解釋:
退出 chroot 回到救援環境後重啓,驗證是否恢復正常引導。


快速排雷清單(避免“修復了但又復發”)✅

  • df -h /boot:若 <span style="color:red;">/boot</span> 空間長期緊張,升級時最容易寫一半失敗;建議保留 2~3 個內核即可。
  • cat /etc/fstab:確認 <span style="color:red;">/boot</span> 的 UUID 正確,防止下次啓動“沒掛載到真正的 /boot 分區”。
  • 如果 dracut 報模塊缺失,優先檢查 /lib/modules/<版本> 是否存在;不存在就別硬生成,直接 yum install/reinstall kernel 更省時間。

修復決策流程圖(按圖執行,不容易跑偏)🧭

flowchart TD
A[救援啓動] --> B[lsblk -f 識別根分區與/boot分區]
B --> C[掛載到 /mnt/sysimage 與 /mnt/sysimage/boot]
C --> D[chroot 進入原系統]
D --> E{ /boot 是否存在目標 initramfs? }
E -->|存在| F[重建 grub2 配置並設置默認項]
E -->|不存在| G{rpm -q kernel 是否包含該版本?}
G -->|包含| H[dracut 生成對應 initramfs]
G -->|不包含| I[yum install/reinstall kernel]
H --> F
I --> F
F --> J[重啓驗證]

如果你按上面流程執行,絕大多數“升級後 <span style="color:red;">initramfs not found</span>”都能一次性閉環。你這類故障的核心 KPI 就兩條:<span style="color:red;">/boot 內容必須與 grub 啓動項一致</span>,以及 <span style="color:red;">initramfs 必須與 /lib/modules 版本一致</span>。把這兩條做到位,系統就會恢復可啓動狀態。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.