今天 brtfs 崩潰了债沮。。本鸣。疫衩。原因是 APT 鎖住了,我強(qiáng)制重啟荣德,然后文件系統(tǒng)就崩了(進(jìn)入 initramfs 模式)闷煤。于是嘗試修復(fù)文件系統(tǒng)。
分以下幾個(gè)部份說(shuō)明:
一涮瞻、開(kāi)機(jī)出現(xiàn) grub rescue 指令模式
二鲤拿、開(kāi)機(jī)出現(xiàn)grub指令模式
三、可見(jiàn)到grub menu饲宛,但無(wú)法開(kāi)機(jī)
四、開(kāi)機(jī)進(jìn)入initramfs模式
五嗜价、處理grub的異常狀況
第5是前面四種錯(cuò)誤處理完后艇抠,進(jìn)入系統(tǒng)該接著處理的事情。不然下次開(kāi)機(jī)仍會(huì)發(fā)生一樣的問(wèn)題久锥。
解決方法一般是3步:
啟動(dòng)盤開(kāi)機(jī),chroot 到硬盤系統(tǒng),執(zhí)行 update-grub.
一家淤、開(kāi)機(jī)出現(xiàn) grub rescue 指令模式
假如看到grub rescue,表示mbr (master boot record)的資料瑟由,完全對(duì)應(yīng)不上磁盤的狀況絮重,所以無(wú)法辨別系統(tǒng)的所有分區(qū),更不用說(shuō)連grub menu都無(wú)法讀入歹苦。所以青伤,處理的方法就是幫他找到grub的設(shè)置。
grub rescue>ls
(hd0), (hd0,msdos3), (hd0,msdos2), (hd0,msdos1)
ls可以列出所有的硬碟與分區(qū)殴瘦,(hd0)是第一個(gè)硬碟狠角,(hd0,msdos1)是第一顆硬碟的第一個(gè)分區(qū)。以此類推蚪腋。輸入指令時(shí)丰歌,可以簡(jiǎn)寫成(hd0,1)表示。若是GPT分割屉凯,出現(xiàn)的會(huì)是(hd0,gpt0)的格式立帖。
接下來(lái)我們必須了解各分區(qū),到底是什麼分區(qū)悠砚?所以我們可以用ls列出文件列表判斷晓勇,格式如下:
grub recue> ls (hd0,1)/
grub recue> ls (hd0,2)/
grub recue> ls (hd0,3)/
確定各個(gè)分區(qū)那個(gè)是 / ,哪個(gè)是/boot,哪個(gè)是swap后宵蕉,就可以開(kāi)始繼續(xù)處理≡途玻現(xiàn)在假設(shè) / 是(hd0,3),/boot 是(hd0,2)羡玛。
額外說(shuō)明一下别智,(hd0,2)/grub下的i386-pc或者x86_64-efi目錄,是放置grub模組所在:前者出現(xiàn)在以mbr開(kāi)機(jī)的系統(tǒng)稼稿,后者出現(xiàn)在efi開(kāi)機(jī)的系統(tǒng) 薄榛。你可以嘗試 ls 看看,會(huì)發(fā)現(xiàn)列出一堆.mod檔让歼,這是開(kāi)機(jī)所需要的文件敞恋,稍候我們也會(huì)需要其中一個(gè)模組。
接下來(lái)是正式設(shè)置谋右,其實(shí)只有四行指令:
grub rescue> set root=(hd0,3)
grub rescue> set prefix=(hd0,2)/grub
grub rescue> insmod normal
grub rescue> normal
第一行指令:設(shè)置根目錄所在的分區(qū)
第二行指令:設(shè)置grub目錄硬猫。這樣他才知道哪里去找模組。此行設(shè)置錯(cuò)誤改执,第三行指令執(zhí)行時(shí)啸蜜,就無(wú)法載入模組。假如你的 /boot 沒(méi)有額外分割辈挂,那這行就要寫成 set prefix=(hd0,3)/boot/grub
第三行指令:載入normal模組
第四行指令:執(zhí)行normal模組
normal模組作用是什麼衬横?他會(huì)把一些指令,文件系統(tǒng)模組终蒂,及其他需要的模組自動(dòng)呼叫進(jìn)來(lái)蜂林。
假如你的grub.cfg沒(méi)有問(wèn)題,應(yīng)該就可以看見(jiàn)grub菜單了拇泣。提醒一點(diǎn)噪叙,這模式下,指令只要打錯(cuò)霉翔,只能開(kāi)機(jī)重來(lái)构眯,無(wú)法重打一次覆蓋之前的命令。
進(jìn)入系統(tǒng)后早龟,記得 處理grub的異常狀況
附注:我利用fdisk的expert mode重新變更分區(qū)的順序惫霸,產(chǎn)生這樣的問(wèn)題。
二葱弟、開(kāi)機(jī)出現(xiàn)grub指令模式
這類問(wèn)題通常發(fā)生在壹店,mbr可以找到對(duì)應(yīng)的磁盤與各分區(qū),卻無(wú)法找到可用有效的grub.cfg芝加。
這時(shí)候硅卢,相關(guān)的模組已經(jīng)載入射窒,所以比grub rescue好處理,打錯(cuò)可以重打一次覆蓋之前的命令将塑,也可以用上下鍵重復(fù)之前的命令脉顿。
同樣用 ls 找出相關(guān)的分區(qū),并檢查哪個(gè)分區(qū)是根目錄点寥,哪個(gè)分區(qū)是 /boot 艾疟,方法與之前的grub rescue相同。現(xiàn)在假設(shè) / 是(hd0,3)敢辩,/boot 是(hd0,2)
命令有四行:
grub> set root=(hd0,3)
grub> linux (hd0,2)/vmlinuz-3.11.0-18-generic root=/dev/sda3
grub> initrd (hd0,2)/initrd.img-3.11.0-18-generic
grub> boot
第一行:設(shè)置根目錄所在的分區(qū)
第二行:設(shè)置核心所在蔽莱,并設(shè)置根目錄所在分區(qū)
第三行:設(shè)置虛擬系統(tǒng)啟動(dòng)核心所在。
第四行:開(kāi)機(jī)
我怎麼知道核心的完整名稱為何戚长?用ls去查一下就可以了盗冷。
假如你的 /boot 沒(méi)有額外分割,第二行要改成 (hd0,3)/boot/vmlinuz-3.11.0-18-generic同廉,且后面指定root=/dev/sda3可以省略仪糖;第三行要改成(hd0,3)/boot/initrd.img-3.11.0-18-generic。
假如你系統(tǒng)的其他部份沒(méi)有問(wèn)題迫肖,應(yīng)該就會(huì)進(jìn)入系統(tǒng)了锅劝。不會(huì)見(jiàn)到grub菜單。
進(jìn)入系統(tǒng)后咒程,記得 處理grub的異常狀況
注:我刪除grub.cfg來(lái)重現(xiàn)這種錯(cuò)誤鸠天。
三讼育、可見(jiàn)到grub menu帐姻,但無(wú)法開(kāi)機(jī)
系統(tǒng)可以找到grub.cfg,但是上頭的資料有問(wèn)題奶段,無(wú)法找到核心饥瓷。常發(fā)生在變更分割表后,因grub無(wú)法辨識(shí)uuid或者label造成.
在grub menu可選擇'e'痹籍,對(duì)menuentry進(jìn)行修改
修改前呢铆,大約會(huì)如下:
setparams 'Ubuntu'
recordfail
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd1,msdos2'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos2 --hint-baremetal=ahci1,msdos2 1ad522f5-2d6f-4a74-b827-245e168e8b35
else
search --no-floppy --fs-uuid --set=root 1ad522f5-2d6f-4a74-b827-245e168e8b35
fi
echo'Loading Linux 3.11.0-18 ...'
linux/boot/vmlinuz-3.11.0-18-generic root=UUID=1ad522f5-2d6f-4a74-b827-245e168e8b35 ro quiet splash $vt_handoff
echo'Loading initial ramdisk ...'
initrd/boot/initrd.img-3.11.0-18-generic
可以把他修改成最基本的樣式:
setparams 'Ubuntu'
set root=(hd0,3)
linux (hd0,2)/vmlinuz-3.11.0-18-generic root=/dev/sda3
initrd (hd0,2)/initrd.img-3.11.0-18-generic
輸入完成后,按Ctrl-x或者F10開(kāi)機(jī)蹲缠。
是不是很像 開(kāi)機(jī)出現(xiàn)grub指令模式 的處理方法棺克?因?yàn)閮烧叨际莋rub.cfg的異常所造成,所以必須告訴grub核心在哪里线定。
還有一個(gè)小技巧娜谊,其實(shí)兩者的處理方式可以一模一樣:按下Ctrl-c或者F2,就會(huì)進(jìn)入指令模式斤讥,與 開(kāi)機(jī)出現(xiàn)grub指令模式 的處理方法 完全相同纱皆。若是你搞不清楚哪個(gè)分區(qū)是/boot?哪個(gè)是根目錄?指令模式會(huì)比較好用派草。
進(jìn)入系統(tǒng)后搀缠,記得 處理grub的異常狀況。
注:我修改grub.cfg來(lái)造成這樣的問(wèn)題近迁。
四艺普、開(kāi)機(jī)進(jìn)入initramfs模式
假如開(kāi)機(jī)過(guò)程,一直到載入核心都沒(méi)問(wèn)題钳踊,但是其他的文件系統(tǒng)卻無(wú)法正常掛載衷敌,導(dǎo)致開(kāi)機(jī)失敗,就會(huì)進(jìn)入initramfs模式拓瞪。
什麼是initramfs缴罗?就是initrd.img,他其實(shí)就是一個(gè)核心的內(nèi)存版祭埂,開(kāi)機(jī)過(guò)程中面氓,直接放上內(nèi)存,形成一個(gè)虛擬的系統(tǒng)蛆橡,然后再把其他的文件系統(tǒng)掛載進(jìn)來(lái)舌界,換成真正的核心來(lái)控制。
所以你可以 ls 看一下泰演,就會(huì)發(fā)現(xiàn)就是一個(gè)類似linux系統(tǒng)的文件結(jié)構(gòu)呻拌。
但他真的很簡(jiǎn)陋,你可以到bin與sbin下看看睦焕,就知道這個(gè)系統(tǒng)有多簡(jiǎn)陋藐握。所以我們必須把原有磁盤中的文件系統(tǒng)掛載進(jìn)來(lái)。其實(shí)這個(gè)過(guò)程垃喊,就跟真的開(kāi)機(jī)過(guò)程類似猾普。小心,initramfs下不會(huì)顯示所在的目錄本谜,小心「迷路」初家。
blkid可以檢視有哪些磁盤與分區(qū)(沒(méi)有fdisk可用...),我們可以利用mount掛載進(jìn)來(lái)看乌助。我們假設(shè)你已經(jīng)確認(rèn):/ 在/dev/sda3溜在,/boot在/dev/sda2
mkdir mnt
mount /dev/sda3 /mnt
mount /dev/sda2 /mnt/boot
這兩個(gè)順序不要顛倒,因?yàn)?boot是在根目錄之下的
接著需要把一些必要設(shè)備檔他托、系統(tǒng)檔掖肋、與內(nèi)存掛載到真實(shí)的根目錄去,以提供真實(shí)的根目錄使用上祈。
mount --bind /dev /mnt/dev
mount --bind /sys /mnt/sys
mount -t proc proc /mnt/porc
假如你還有其他分區(qū)培遵,也要一并掛載到相對(duì)應(yīng)的目錄浙芙。
再來(lái)就要把根目錄切換到真實(shí)的根目錄去了:
chroot /mnt
好了,現(xiàn)在你應(yīng)該看到每行最前面的initramfs已經(jīng)變成root@(none)籽腕,你已經(jīng)開(kāi)始使用真實(shí)的根目錄嗡呼,很多工具也回來(lái)了。如果你對(duì)系統(tǒng)夠了解皇耗,加載模組南窗,連上網(wǎng)路都是可行的。
稍微解釋一下chroot郎楼。這個(gè)指令會(huì)把你的根目錄切換到你指定的地方万伤,切換過(guò)去后,你會(huì)從這里開(kāi)始你的root身份呜袁,在這里你擁有所有的權(quán)限敌买。這個(gè)技巧很重要,不僅用在修復(fù)系統(tǒng)阶界。到目前為止虹钮,你所作的事,就跟真實(shí)的開(kāi)機(jī)流程類似膘融。有興趣的人芙粱,不妨多了解一點(diǎn)。
不過(guò)現(xiàn)在首要的事情氧映,是 處理grub的異常狀況(請(qǐng)看第五段)春畔,因?yàn)槟阋呀?jīng)進(jìn)入系統(tǒng)了,雖然功能不全岛都,但已經(jīng)足以讓你處理問(wèn)題了律姨。
這里額外提供一個(gè)技巧,blkid可以查看磁盤分區(qū)的uuid疗绣,比對(duì) /etc/fstab 后线召,可能你會(huì)需要修改 /etc/fstab 里的數(shù)據(jù)铺韧。為了方便修改多矮,你可以先把查詢的結(jié)果放在 /etc/fstab 的后面:
blkid >> /etc/fstab
上下比對(duì)修改應(yīng)該不會(huì)太難。最后記得把舊的設(shè)置哈打,前面加上'#'塔逃,這樣才不會(huì)沖突。存檔料仗。鍵入sync湾盗。重新開(kāi)機(jī)。(因?yàn)楹芏嗄=M沒(méi)有掛上立轧,你無(wú)法reboot或shutdown格粪,只能直接電源鍵關(guān)機(jī)躏吊。)
假如都正常了,應(yīng)該就會(huì)進(jìn)入系統(tǒng)帐萎。大多數(shù)的狀況下比伏,不需要額外的處理。因?yàn)槟阋呀?jīng)處理完了疆导。
注:我利用tune2fs修改分區(qū)的uuid赁项,來(lái)造成這樣的問(wèn)題。
五澈段、處理grub的異常狀況
會(huì)出現(xiàn)grub異常狀況悠菜,幾乎都與掛載設(shè)置,grub設(shè)置败富,或磁盤開(kāi)機(jī)區(qū)有關(guān)悔醋,所以請(qǐng)?zhí)幚硪韵氯拢?/p>
檢查并修改 /etc/fstab :
/etc/fstab 是系統(tǒng)掛載分區(qū)的必要文件。請(qǐng)確認(rèn)里面的uuid是否與實(shí)際狀況相符兽叮?實(shí)際的uuid可以藉由sudo blkid取得篙顺。若有不符的狀況,請(qǐng)修改〕湓瘢現(xiàn)在ubuntu已經(jīng)默認(rèn)使用uuid來(lái)辨識(shí)分區(qū)德玫,這種辨識(shí)方式,可以避免系統(tǒng)的混淆椎麦。當(dāng)然他仍支持以往用設(shè)備名稱辨識(shí)的方法宰僧。更新 /boot/grub/grub.cfg :
sudo update-grub
- 重新安裝grub到磁盤開(kāi)頭的開(kāi)機(jī)區(qū)
sudo grub-install /dev/sda
若有問(wèn)題,可能需要強(qiáng)制安裝
sudo grub-install /dev/sda --force
若不是/dev/sda观挎,請(qǐng)自行修改琴儿。
以下三個(gè)參數(shù)要注意,必要時(shí)要特別加入
--boot-directory=[path]
--efi-directory=[path]
--uefi-secure-boot
詳情請(qǐng)man grub-install
轉(zhuǎn)載:http://tieba.baidu.com/p/2910461207