在initramfs修复 fstab
https://parrotsec-cn.org/t/initramfs/553
0x00前言
我相信,有非常多的用户在使用 Linux 的过程中时不时会遇到开机时进入 initramfs
模式的情况,例如我就遇到不少次了。一般遇到这种情况,我们束手无策,只能重装系统。可总重装也不是个办法,于是我就去问了度娘,度娘告诉我开机会进入 initramfs
的原因是
- 没正常关机导致的磁盘损坏 #大部分情况下
- 文件系统无法正常挂载 #我通常遇到的情况
0x01解决办法
1、没正常关机导致的磁盘损坏
我们需要
- Live模式启动盘一个or一个Linux系统
进入Live模式,打开终端
使用 blkid
或者 fdisk
查看你的分区
使用 fsck
来修复你的磁盘
PS:原谅我写的如此短,毕竟我没遇到过这种情况。如果有其他大佬有更详细的步骤可以找我替换。谢谢~
2、文件系统无法正常挂载
首先,使用 blkid
来查看我们有哪些磁盘和分区(因为在initramfs没有fdisk)
blkid
假设你已经知道了你的 /
在 /dev/sdb1
, /boot
在 /dev/sdb3
。我们需要新建一个文件夹并把对应分区挂载进去,注意根目录和boot目录不要挂反,boot目录是在根目录下↓的。
mkdir mnt
mount /dev/sdb1 /mnt
mount /dev/sdb3 /mnt/boot
挂载完成后我们还需要挂载一些必要文件夹以供使用
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc proc /mnt/proc
如果你还有其他分区,也需要挂载到对应挂载点
现在使用 chroot
命令切换到 /mnt
chroot /mnt
用户变成 root@(none),这时你就可以和终端一样用各种工具进行修复了。
接下来我们修改 /etc/fstab
,先把分区情况导入fstab以便对照修改
blkid >> /etc/fstab
接着用你习惯的编辑器打开对照修改 fstab
并把多余的行删除。
保存退出,键入
sync
完成后 reboot
重启电脑,你就可以进入系统了
其实你刚才所做的这些步骤和电脑真实开机流程相似
https://developer.aliyun.com/article/523465
修复/boot及/etc/fstab、自制linux、编译安装内核
实验一、破坏dev/sda 的MBR的446字节:
破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446
查看:hexdump -C -n 512 /dev/sda
发现前面的字节都为0
========================================================================================
========================================================================================
状况一、刚破坏未重启的时候修复:
可以利用grub重新生成:
grub
grub> root (hd0,0)
grub> setup (hd0)
quit退出
修复完之后使用hexdump -C -n 512 /dev/sda查看发现已经修复成功
========================================================================================
=======================================================================================
======================================================================================
状况二、破坏之后重启了,但是有MBR备份时的修复:
备份:dd if=/dev/sda of=/app/mbr bs=1 count=512
======================================================================================
=================================================================================
破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446
=================================================================================
=================================================================================
修复:
1、进入救援模式
1)在系统启动显示进度条的时候,按一下esc键
2)在弹出的页面中选择第三项Rescue
3)选择语言的都按默认的来,直接按回车,直到出现Setup Networking,可以根据自己的选择,是利用网络接口还是不用。在这里就不用,选择no
4)接下来就按默认的来,一步步回车就行,就进入shell了。默认硬盘的根被挂载到/mnt/sysimage/
2、利用备份的mbr恢复
dd if=/mnt/sysimage/app/mbr of=/dev/sda bs=1 count=446
3、保险起见,恢复完之后使用sync同步
4、reboot重启即可
状况三、破坏之后重启,但是没有MBR备份时的修复:
1、进入救援模式
2、切换根,使根/表现为硬盘的根
chroot /mnt/sysimage
3、重新生成mbr
grub-install /dev/sda
当然也可以使用状况一中的grub的方式生成mbr
4、sync同步
5、reboot重启
实验二、删除/boot下所有文件(rm -rf /boot)
恢复:
1、进入救援模式
2、切换根
chroot /mnt/sysimage
3、在/boot下生成initramfs文件
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
4、挂载光盘,将光盘的内核文件拷贝到/boot下
mount /dev/sr0 /mnt
cp /mnt/isolinux/vmlinuz /boot/
5、安装grub,生成grub文件
grub-install /dev/sda
6、创建并编辑grub.conf文件
vim /boot/grub/grub.conf
default=0
timeout=5
title centos6.9
kernel /vmlinuz root=/dev/sda2
initrd /initramfs-2.6.32-696.el6.x86_64.img
7、sync同步
8、退出切换的根,并且重启即可
exit;reboot
如果不退出,那么reboot无法使用
实验三、在分区情况下,删除/boot下所有文件,删除/etc/fstab
1、进入救援模式,但是由于没有/etc/fstab文件所以根无法自动挂载到/mnt/sysimage
2、找到根在哪个分区
建一个临时目录作为挂载点:mkdir /mnt/tmp
尝试所有sda挂载:mount /dev/sda{1,2,...} /mnt/tmp
ls /mnt/tmp 查看文件,判断哪个是根
3、挂载根
mount /dev/sda2 /mnt/tmp
4、创建fstab文件并写内容
cat > /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /app ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0
使用Ctrl+d 结束输入。不能使用Ctrl+c退出,否则会删除最后一条记录。
5、写完重启再进救援模式,就会自动挂载根到/mnt/sysimage了
6、修复/boot如实验二,或者使用如下方法
1)进去救援模式后挂载光盘
mkdir /mnt/cdrom 创建临时目录作为挂载点
mount /dev/sr0 /mnt/cdrom 挂载光盘
2)安装内核包
如果在安装内核包之前没有切换根,那么使用下面的命令来安装
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt/sysimage --force
如果已经切换根,那么使用下面的命令来安装
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force
3)在已经切换根(chroot /mnt/sysimage)的情况下,安装grub
grub-install /dev/sda 安装grub
sync 同步
4)编辑/boot/grub/grub.conf文件
vim /boot/grub/grub.conf
default=0
timeout=5
title linux
kernel /vmlinuz-2.6.32-696.el6.x86_64 root=UUID=6da11b60-dd80-460a-a00f-beb8b3373b5c
initrd /initramfs-2.6.32-696.el6.x86_64.img
说明:①UUID可以通过r!blkid /dev/sda2导入
②/vmlinuz-2.6.32-696.el6.x86_64和initrd /initramfs-2.6.32-696.el6.x86_64.img的文件名都可以通过r!ls /boot/导入 。
③不写grub.conf文件就没有菜单,会出错,不过可以在出错界面直接写kernel /vmlinuz-2.6.32-696.el6.x86_64以及initrd /initramfs-2.6.32-696.el6.x86_64.img 。临时启动了系统之后再写去编辑grub.conf文件
5)退出切换的根并且重启系统
exit;reboot
实验四、在逻辑卷环境下删除/boot下所有文件,删除/etc/fstab:
修复:
1、进入救援模式
2、激活卷组
vgchange -ay
使用lvscan查看逻辑卷状态此时是active了
3、挂载逻辑卷
blkid 查看逻辑卷名,为下面的挂载做准备
mkdir /mnt/tmp 创建目录作为挂载点
mount /dev/UolGroup/lv_root /mnt/tmp 挂载逻辑卷
4、编辑fstab文件
cat > /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/UolGroup/lv_root / ext4 defaults 0 0
/dev/UolGroup/lv_home /home ext4 defaults 0 0
/dev/UolGroup/lv_swap swap swap defaults 0 0
5、重启之后再进入救援模式来修复/boot,此后的步骤完全同实验三的修复/boot
实验五、/sbin/init故障(被移走mv /sbin/init /app):
修复:
1、在选择内核的界面按a,在UUID后面加一个参数init=/bin/bash
/bin/bash是系统自带的程序,可以使用这个先启动系统(不过起来后仅能使用部分命令)
2、系统启动后重新挂载根/为可写(启动后是只读的,不能写文件,不能挂载/app)
mount -o remount,rw /
3、挂载/app
mount /dev/sda3 /app 挂载/app对应的分区
4、将init文件移回来
mv /app/init /sbin/
如果是删除了init文件,那么可以利用光盘重装init:
1)挂载光盘
mount /dev/sr0 /mnt/
2) 重装init:
rpm -ivh /mnt/Packages/upstart-0.6.5-16.e16.x86_64.rpm --force
5、重启
实验六:自制linux:
准备工作:添加一块新硬盘,将来将自制的Linux系统放在这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?