簡單無痛解決Linux下修改/etc/fstab導致無法啓動的問題

基本情況:

我電腦上裝了deepin+win10雙系統,平時使用Deepin,偶爾手癢想玩兩把跑跑卡丁車的時候就會切到Win10,所以爲了兩個系統共享方便,就分一個FAT32的分區,用EFI什麼的也更方便一點,所以音樂文件也放在該分區下,前不久也重裝了Deepin 15.1.1(吐槽一下:有點失望,桌面上的內容不顯示),所以也就沒有及時配置自動掛載,今天配置的時候直接搬了上面的ext4分區的參數,結果就起不來了。

不過這次文章所介紹的核心原理很簡單:把/etc/fstab改正確就行了,系統都起不來怎麼改?繼續往下看。

方案一:有root賬號的情況

有root賬號這個比較好辦,啓動不了的話,直接就會讓你輸入root密碼,登錄成功後就進入字符模式,可以直接修改/etc/fstab,然後reboot即可。

掛載失敗,讓輸入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字樣的選項會出現這樣的一個界面

恢復模式(Recovery Mode)

可以看到最上面提示filesystem state:read-only,即文件系統是隻讀的,不過這都不是問題,有了root賬號,一切都是浮雲。

選擇 root,會提示輸入root密碼,登錄後先輸入

mount -o remount,rw /        # 將根文件系統重新掛載爲讀寫狀態

不然是無法修改文件的,如果沒有任何提示信息的話用mount查看根目錄的狀態應該已經是讀寫狀態

mount | grep " / "        # 查看根文件系統是否變

重新掛載爲可寫狀態

這時就可以修改 /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返回,重新走第一步就行了。

當你出現下圖時說明成功繞過系統提供的賬號體系

ramfs啓動圖

此時輸入命令id驗證

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下,而這時候還 / 都還沒有,如此循環。。

我認爲的啓動流程

由於沒有加載我們真正的根文件系統,所以賬號密碼都沒有,但我們可以手動掛載,並以達到修改fstab的目的,是不是有一種PE的感覺呢?只想你想當然也可以乾點別的,就看你怎麼發揮了,不要拿去幹壞事喲。

該initrd.img是可以自定義的,網上有很多文章,以前做過一個,給root賬號加上密碼,用來放在U盤裏,這樣別人想使用你的 ramfs也是不行的,只不過系統提供的肯定是沒有的。



作者:怪盜kidou
鏈接:https://www.jianshu.com/p/45c05a75f140
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯繫作者獲得授權並註明出處。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章