重建initrd镜像(Linux)

时间:2020-03-21 11:46:44  来源:igfitidea点击:

有时内核会由于创建不正确的initrd镜像而无法引导,例如:在LVM上使用根卷时,尝试将'/dev/VolGroup00/LogVol00'挂载到'/sysroot'。

三行nash代码有时可以为我们节省Dexter的时间。

快速方法

本文假定我们要修改的initrd文件为'/boot/initrd.img-3.4.89'。

复制并提取initrd镜像

# IMG=initrd.img-3.4.89
# cp -v /boot/"$IMG" /tmp/"$IMG".gz && gunzip /tmp/"$IMG".gz
# mkdir /tmp/"$IMG"_dir && cd /tmp/"$IMG"_dir && cpio -i < ../"$IMG"

根据需要修改initrd镜像。

创建一个新图像

# find ./| cpio -H newc -o > /tmp/"$IMG".cpio
# gzip /tmp/"$IMG".cpio && mv -v /tmp/"$IMG".cpio.gz /boot/"$IMG"-new
# cd ~ && rm /tmp/"$IMG"* -Rf

不要忘记更新Grub配置以使用新的initrd文件(如果我们覆盖了旧的initrd文件,请忽略此行)。

详细方法

复制并提取initrd镜像

Initrd镜像通常是gzip压缩的cpio存档。

# file -b /boot/initrd.img-3.4.89
gzip compressed data, from Unix, last modified: Mon Jan 12 15:09:33 2014

复制initrd图像文件并展开它:

# cp /boot/initrd.img-3.4.89 /tmp/initrd.img-3.4.89.gz
# gunzip /tmp/initrd.img-3.4.89.gz

展开的文件是cpio归档文件:

# file -b /tmp/initrd.img-3.4.89
ASCII cpio archive (SVR4 with no CRC)

创建一个临时目录以其中工作:

# mkdir /tmp/1 && cd /tmp/1

提取initrd存档:

# cpio -i < ../initrd.img-3.4.89
908760 blocks

不再需要旧的initrd存档文件,将其删除:

# rm ../initrd.img-3.4.89

修改initrd图像。

创建initrd镜像

创建一个新的cpio归档文件并将其压缩:

# find ./| cpio -H newc -o > /tmp/initrd.img-3.4.89.cpio
# gzip /tmp/initrd.img-3.4.89.cpio
# file -b  /tmp/initrd.img-3.4.89.cpio.gz
gzip compressed data, was "initrd.img-3.4.89.cpio", from Unix, last modified: Tue May  8 18:21:05 2014

将新的initrd镜像移至“/boot”文件夹:

# mv /tmp/initrd.img-3.4.89.cpio.gz /boot/initrd.img-3.4.89-new

确保我们适当地更新了Grub配置。