基本情况:

我电脑上装了deepin+win10双系统,平时使用Deepin,偶尔手痒想玩两把跑跑卡丁车的时候就会切到Win10,所以为了两个系统共享方便,就分一个FAT32的分区,用EFI什么的也更方便一点,所以音乐文件也放在该分区下,前不久也重装了Deepin 15.1.1(吐槽一下:有点失望,桌面上的内容不显示),所以也就没有及时配置自动挂载,今天配置的时候直接搬了上面的ext4分区的参数,结果就起不来了。

不过这次文章所介绍的核心原理很简单:把/etc/fstab改正确就行了,系统都起不来怎么改?继续往下看。

方案一:有root账号的情况

有root账号这个比较好办,启动不了的话,直接就会让你输入root密码,登录成功后就进入字符模式,可以直接修改/etc/fstab,然后reboot即可。

webp

挂载失败,让输入root密码

当然如果你的Linux没有这个提示也可以手动进入恢复模式(Recovery Mode)

一般Linux启动菜单最少有两个选项:一个正常启动,另一个是高级模式(Advance)。而高级模式中的包含了恢复模式(基本上是放在最后,毕竟很少使用),其它的菜单都是备份内核升级前的启动菜单。

例如我的启动菜单:

Deepin 15.1.1 GNU/Linux
Advanced options for Deepin 15.1.1 GNU/Linux
    |---- Deepin 15.1.1 GNU/Linux, with Linux 4.2.0-1-amd64
    |---- Deepin 15.1.1 GNU/Linux, with Linux 4.2.0-1-amd64 (recovery mode)
    |---- 假装是其它内核的选项
Windows Boot Manager
System setup

所以我们任选带有recovery mode字样的选项会出现这样的一个界面

webp

恢复模式(Recovery Mode)

可以看到最上面提示filesystem state:read-only,即文件系统是只读的,不过这都不是问题,有了root账号,一切都是浮云。

选择 root,会提示输入root密码,登录后先输入

mount -o remount,rw /        # 将根文件系统重新挂载为读写状态

不然是无法修改文件的,如果没有任何提示信息的话用mount查看根目录的状态应该已经是读写状态

mount | grep " / "        # 查看根文件系统是否变

webp

重新挂载为可写状态

这时就可以修改 /etc/fstab 文件啦。


方案二:没有root账号(今日采用)

我的情况就比较特殊,平时没有开root账号,都是用sudo,要切换到root账号时也是直接sudo su就行了,所以启动时和恢复模式也提示root账号已被锁,所以方案一行不通。本方案的主要内容就是:如何弄出一个root账号

我们知道linux将账号密码都存在/etc/passwd/etc/shadow中,所以只要不让kernel挂载我们根文件系统就OK了。

1、重启计算机,在Grub启动菜单上按“E”进入编辑模式。
2、定位到 linux 开头的行(grub 1.x为kernel开头),如:

linux /boot/vmlinuz-4.2.0-1-amd64 root=UUID=57c612a5-984b-4b14-bd1d-6c91f528cf9e ro  splash quiet

3、删除其余的参数,主要是root参数,如下:

linux /boot/vmlinuz-4.2.0-1-amd64

4、按F10ctrl+x启动修改后的菜单。

注:这里的编辑模式不会修改文件,如果改错了按ESC返回,重新走第一步就行了。

当你出现下图时说明成功绕过系统提供的账号体系

webp

ramfs启动图

此时输入命令id验证

webp

ramfs成功使用上了root账号

需要注意的是此时kernel使用文件系统为内存模拟的磁盘,所以我们所作的任何操作不会影响我们真正的系统,要想修改我们原本系统中的文件必须挂载原系统的根目录到我们现在使用的系统下。

mkdir /tmp/root  # 创建一个目录用于挂载真正系统的根目录
mount /dev/sda3 /tmp/root # 挂载设备到我们创建的文件夹下,我系统的磁盘设备为sda3,sda1和sda2分别为ESP、MSR
vi /tmp/root/etc/fstab # 注意busybox没有提供vim,还有文件路径的变化,不在是/etc/fstab了

修改完保存后直接reboot就ok了。


方案二原理:
上面介绍方案二的时候第2步提到 “定位到 linux 开头的行”,其实在linux命令下面一般还有以initrd开头的一行,如:

linux /boot/vmlinuz root=/dev/sda3
initrd /boot/initrd.img

这里的vmlinuz就是Linux kernel内核,而initrd.img实际上是一个经过gzip或lzma压缩的cpio归档文件,initrd(initial RAM disk,初始化内存磁盘) 是最开始使用的根文件系统里面也有/etc,/bin,/usr,/dev等目录还包含了一些基本配置、驱动、命令等,等磁盘设备加载完后,再将指定的磁盘分区挂载为根文件系统,去执行该根文件系统下的初始化操作完成启动(不一定完全准确,大致流程应该是这样),不然你想想挂载要mount命今,而mount在/bin下,而这时候还 / 都还没有,如此循环。。

webp

我认为的启动流程

由于没有加载我们真正的根文件系统,所以账号密码都没有,但我们可以手动挂载,并以达到修改fstab的目的,是不是有一种PE的感觉呢?只想你想当然也可以干点别的,就看你怎么发挥了,不要拿去干坏事哟。

该initrd.img是可以自定义的,网上有很多文章,以前做过一个,给root账号加上密码,用来放在U盘里,这样别人想使用你的 ramfs也是不行的,只不过系统提供的肯定是没有的。



作者:怪盗kidou
链接:https://www.jianshu.com/p/45c05a75f140
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。