這篇文章主要介紹UEFI啟動(dòng)流程、Linux系統(tǒng)下的備份還原以及grub引導(dǎo)修復(fù)勋颖。
UEFI相關(guān)知識(shí)
UEFI啟動(dòng)要求硬盤上有一個(gè)特殊的分區(qū)——EFI系統(tǒng)分區(qū)剂陡。它是FAT32格式帶有efi、boot標(biāo)志的分區(qū)垃沦,大小一般在300MB到500MB之間诽偷,用來(lái)存儲(chǔ)系統(tǒng)的EFI boot loader以及啟動(dòng)時(shí)固件使用的應(yīng)用程序坤学。
Boot Loader 是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序。這段小程序可以將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài)报慕,以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境深浮。
我們看看自己電腦上的情況,先用 fdisk 找到EFI分區(qū)眠冈,再用 df 找到掛載點(diǎn)飞苇,一般是在 /boot/efi 目錄下。
$ sudo fdisk -l
Disk /dev/nvme0n1: 238.5 GiB, 256060514304 bytes, 500118192 sectors
.......
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 616447 614400 300M EFI System
/dev/nvme0n1p2 616448 23685119 23068672 11G Linux swap
/dev/nvme0n1p3 23685120 118970367 95285248 45.4G Linux filesystem
......
$ df -lh
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
/dev/nvme0n1p3 45G 9.3G 33G 22% /
/dev/nvme0n1p1 300M 32M 269M 11% /boot/efi
/dev/nvme0n1p4 89G 8.4G 77G 10% /home
.....
# 再看看這個(gè)目錄下有哪些文件
# jzc @ jzc-PC in /boot/efi/EFI [12:11:08] C:130
$ tree -L 2
.
├── boot
│ ├── bootx64.efi
│ ├── grub.cfg
│ └── grubx64.efi
├── deepin
│ ├── fbx64.efi
│ ├── grub.cfg
│ ├── grubx64.efi
│ ├── mmx64.efi
│ └── shimx64.efi
├── Microsoft
│ ├── Boot
│ └── Recovery
└── ubuntu
├── grub.cfg
└── grubx64.efi
EFI分區(qū)有一個(gè)頂層目錄——EFI文件夾蜗顽,里面有不同的操作系統(tǒng)創(chuàng)建的子文件夾(例如ubuntu deepin Windows)布卡。其中bootx64.efi是默認(rèn)的引導(dǎo)程序,grubx64.efi是grub引導(dǎo)程序雇盖,shimx64.efi是shim引導(dǎo)程序(shim用于安全啟動(dòng)Secure Boot忿等,調(diào)用grub)。一般安裝Linux的電腦會(huì)關(guān)閉Secure Boot崔挖,這樣grubx64.efi 和 shimx64.efi 就沒(méi)什么區(qū)別了贸街。
如果要啟動(dòng)Windows系統(tǒng),UEFI應(yīng)加載 EFI/Microsoft/Boot/bootmgfw.efi 狸相。
如果要啟動(dòng)deepin系統(tǒng)薛匪,UEFI應(yīng)加載 EFI/deepin/grubx64.efi 。
那么*.efi 文件是從哪里來(lái)的呢脓鹃?
操作系統(tǒng)安裝器會(huì)創(chuàng)建 /EFI/<distro> 目錄逸尖,把引導(dǎo)程序(grubx64.efi)放入其中,然后在UEFI 啟動(dòng)管理器中創(chuàng)建入口點(diǎn)(開機(jī)按下F12鍵選擇從何處啟動(dòng))将谊。
Win8安裝時(shí)會(huì)首先創(chuàng)建自己的目錄/efi/microsoft/boot,并在里面放置bootmgfw.efi 渐白,然后再把bootmgfw.efi拷一份到/efi/boot里并命名成bootx64.efi尊浓,這樣系統(tǒng)默認(rèn)就從win8啟動(dòng)了。
然后你裝ubuntu的時(shí)候纯衍,ubuntu也會(huì)創(chuàng)建/efi/ubutntu/這個(gè)目錄并放一個(gè)grubx64.efi栋齿,作用類似于win8的bootmgfw.efi。
UEFI 啟動(dòng)管理器
簡(jiǎn)單來(lái)說(shuō),你可以把 UEFI 啟動(dòng)管理器視為啟動(dòng)菜單瓦堵。例如開機(jī)按下F12鍵選擇從何處啟動(dòng)基协。
UEFI 啟動(dòng)管理器可以進(jìn)行配置,你可以向“啟動(dòng)菜單”添加項(xiàng)或者從中刪除項(xiàng)菇用。你也可以檢查啟動(dòng)菜單澜驮,確保正確無(wú)誤。我們不妨看一些典型的 efibootmgr 輸出
# jzc @ jzc-PC in /boot/efi/EFI/deepin [14:28:28]
$ efibootmgr -v
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0006,0001,0002,0003,0004,0005,0000
Boot0000* deepin PciRoot(0x0)/Pci(0x1d,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-1B-44-4A-44-45-1A-7C)/HD(1,GPT,17b7c336-6227-4abf-86e4-421c91b21775,0x800,0x96000)/File(\EFI\deepin\grubx64.efi)
Boot0001* Diskette Drive BBS(Floppy,Diskette Drive,0x0)..BO
Boot0002* USB Storage Device BBS(USB,USB Storage Device,0x0)..BO
Boot0003* CD/DVD/CD-RW Drive BBS(CDROM,CD/DVD/CD-RW Drive,0x0)..BO
Boot0004* Onboard NIC BBS(Network,IBA CL Slot 00FE v0113,0x0)..BO
Boot0005* Windows PciRoot(0x0)/Pci(0x1d,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-1B-44-4A-44-45-1A-7C)/HD(1,GPT,17b7c336-6227-4abf-86e4-421c91b21775,0x800,0x96000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)
第一行表示當(dāng)前系統(tǒng)的啟動(dòng)項(xiàng)惋鸥。BootOrder 是列表中啟動(dòng)項(xiàng)的嘗試順序杂穷。其余輸出顯示了實(shí)際的啟動(dòng)項(xiàng)。我們稍后會(huì)說(shuō)明每一個(gè)啟動(dòng)項(xiàng)具體作用卦绣。
如果正常啟動(dòng) UEFI 固件耐量,而不進(jìn)行任何調(diào)整,UEFI 固件將按照BootOrder 中列出的順序滤港,嘗試從“啟動(dòng)菜單”中的每個(gè)“項(xiàng)”進(jìn)行啟動(dòng)廊蜒。因此,在這臺(tái)計(jì)算機(jī)上溅漾,UEFI 固件將嘗試啟動(dòng)名為“deepin”的項(xiàng)山叮,如果啟動(dòng)失敗,然后再嘗試啟動(dòng)名為“Windows”的項(xiàng)樟凄。
不得不說(shuō)聘芜,現(xiàn)在UEFI功能很強(qiáng)大。不僅有圖形界面缝龄、可以使用鼠標(biāo)汰现、還能在UEFI中手動(dòng)設(shè)置引導(dǎo)項(xiàng),相當(dāng)于在Linux系統(tǒng)中使用efibootmgr命令叔壤。
UEFI啟動(dòng)模式下如何從u盤或移動(dòng)硬盤引導(dǎo)
只要u盤或移動(dòng)硬盤上有一個(gè)fat32的分區(qū)瞎饲,分區(qū)的根目錄下有個(gè)文件夾叫EFI,UEFI就會(huì)自動(dòng)去查找相應(yīng)的啟動(dòng)文件(.efi)
如果你剛制作了ubuntu(kylin)-13.04-64位的啟動(dòng)u盤炼绘,可以打開它嗅战,你會(huì)發(fā)現(xiàn)分區(qū)的文件系統(tǒng)是fat32,確實(shí)有一個(gè)EFI文件夾俺亮,進(jìn)去看看就是各種.efi引導(dǎo)文件驮捍。因此現(xiàn)在想制作可啟動(dòng)的u盤或移動(dòng)硬盤就簡(jiǎn)單了,只需要復(fù)制粘貼就行了脚曾。
UEFI啟動(dòng)流程
- 系統(tǒng)開機(jī) - 上電自檢(Power On Self Test 或 POST)东且。
- UEFI 固件被加載,并由它初始化啟動(dòng)要用的硬件本讥。
- 固件讀取其引導(dǎo)管理器以確定從何處(比如珊泳,從哪個(gè)硬盤及分區(qū))加載哪個(gè) UEFI 應(yīng)用鲁冯。
- 固件按照引導(dǎo)管理器中的啟動(dòng)項(xiàng)目,加載UEFI 應(yīng)用色查。
- 已啟動(dòng)的 UEFI 應(yīng)用還可以啟動(dòng)其他應(yīng)用(對(duì)應(yīng)于 UEFI shell 或 rEFInd 之類的引導(dǎo)管理器的情況)或者啟動(dòng)內(nèi)核及initramfs(對(duì)應(yīng)于GRUB之類引導(dǎo)器的情況)薯演,這取決于 UEFI 應(yīng)用的配置。
系統(tǒng)引導(dǎo)流程
成功引導(dǎo)系統(tǒng)秧了,需要具備以下條件:
- UEFI 固件正常
- UEFI 啟動(dòng)項(xiàng)對(duì)應(yīng)正確的 *.efi 文件
- EFI分區(qū)存在
- 引導(dǎo)器( *.efi )及其配置文件正常
- 操作系統(tǒng)相關(guān)文件正常
滿足這些條件后跨扮,系統(tǒng)啟動(dòng)的過(guò)程大致是:UEFI 根據(jù) BootOrder 加載 EFI 分區(qū)中的某個(gè)引導(dǎo)器(grubx64.efi),引導(dǎo)器加載配置文件(grub.cfg)呈現(xiàn)啟動(dòng)菜單(GRUB 菜單)示惊,用戶選擇啟動(dòng)項(xiàng)后引導(dǎo)器加載操作系統(tǒng)內(nèi)核好港。
備份
對(duì)于喜歡折騰的人來(lái)說(shuō),系統(tǒng)崩潰是常有的事米罚,所以備份系統(tǒng)就是一件不容忽視的事情钧汹。由于 Linux 系統(tǒng)本身的優(yōu)越性,系統(tǒng)的備份和還原還是比較容易的录择。主要表現(xiàn)在以下方面:
- Linux 系統(tǒng)所有的數(shù)據(jù)都以文件的形式存在拔莱,所以備份就是直接拷貝文件;硬盤分區(qū)也被當(dāng)成文件隘竭,所以可以直接克隆硬盤數(shù)據(jù)塘秦。
- Linux 系統(tǒng)自帶很多實(shí)用工具,比如 tar动看、dd尊剔、rsync 等,備份還原系統(tǒng)不需要購(gòu)買或下載第三方軟件菱皆。
- Linux 系統(tǒng)在運(yùn)行時(shí)其硬盤上的文件可以直接被覆蓋须误,所以還原系統(tǒng)的時(shí)候不需要另外的引導(dǎo)盤。(當(dāng)然仇轻,系統(tǒng)完全掛掉到無(wú)法啟動(dòng)這種情況還是需要另外的引導(dǎo)盤的京痢。)
備份Linux的策略有很多,比如dd備份磁盤篷店,dump備份文件系統(tǒng)祭椰,tar打包文件等等。
這篇文章介紹的是livecd啟動(dòng)tar打包備份系統(tǒng)的方法疲陕。之所以用livecd啟動(dòng)方淤,是為了防止運(yùn)行時(shí)需要備份的文件被修改。同時(shí)livecd方便后續(xù)恢復(fù)系統(tǒng)和修復(fù)引導(dǎo)蹄殃。如果系統(tǒng)嚴(yán)重?fù)p壞携茂,只能從livecd啟動(dòng)了。
先看看系統(tǒng)已經(jīng)掛載的磁盤
$ df -hl
文件系統(tǒng) 容量 已用 可用 已用% 掛載點(diǎn)
udev 3.8G 0 3.8G 0% /dev
tmpfs 778M 1.8M 776M 1% /run
/dev/nvme0n1p3 45G 8.4G 34G 20% /
tmpfs 3.8G 2.5M 3.8G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/nvme0n1p1 300M 32M 269M 11% /boot/efi
/dev/nvme0n1p4 89G 3.3G 82G 4% /home
tmpfs 778M 32K 778M 1% /run/user/1000
這里重點(diǎn)關(guān)注三個(gè)地方
/dev/nvme0n1p3 45G 8.4G 34G 20% /
/dev/nvme0n1p1 300M 32M 269M 11% /boot/efi
/dev/nvme0n1p4 89G 3.3G 82G 4% /home
說(shuō)明當(dāng)前系統(tǒng)依賴的文件儲(chǔ)存在nvme0n1硬盤的第一窃爷、三邑蒋、四分區(qū),這個(gè)信息很重要按厘。因?yàn)橛胠ivecd啟動(dòng)時(shí)医吊,我們需要手動(dòng)掛載這些分區(qū)到對(duì)應(yīng)的目錄,然后才能正確備份逮京。如果你在livecd里忘記掛載/dev/nvme0n1p4卿堂,那么/mnt/home目錄里是空的,你就少備份了一些數(shù)據(jù)懒棉。
這里順便說(shuō)一下/mnt和/media的區(qū)別草描,一般手動(dòng)掛載的放在/mnt(手動(dòng)建好掛載點(diǎn),再用命令掛載)策严,系統(tǒng)自動(dòng)掛載的放在/media穗慕。
從livecd啟動(dòng),開始備份之前妻导,先介紹一下tar命令逛绵。
tar [-cxtzjvfpPN] 壓縮文檔的名稱 欲備份目錄
參數(shù):
-c :建立一個(gè)壓縮文件的參數(shù)指令(create 的意思);
-x :解開一個(gè)壓縮文件的參數(shù)指令倔韭!
-t :查看 tarfile 里面的文件术浪!
注意:在參數(shù)中,c/x/t 僅能存在一個(gè)寿酌!不可同時(shí)存在胰苏!因?yàn)椴豢赡芡瑫r(shí)壓縮與解壓縮。
-z :是否同時(shí)具有 gzip 的屬性醇疼?亦即是否需要用 gzip 壓縮硕并?
-j :是否同時(shí)具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮僵腺?
-v :壓縮的過(guò)程中顯示文件鲤孵!這個(gè)常用,但不建議用在背景執(zhí)行過(guò)程辰如!
-f :使用檔名普监,請(qǐng)留意,在 f 之后要立即接檔名喔琉兜!不要再加參數(shù)凯正!
-p :使用原文件的原來(lái)屬性(屬性不會(huì)依據(jù)使用者而變)
-P :(大寫)可以使用絕對(duì)路徑來(lái)壓縮!
-N :(大寫)比后面接的日期(yyyy/mm/dd)還要新的才會(huì)被打包進(jìn)新建的文件中豌蟋!
-C:(大寫)目的目錄廊散,即切換到指定的目錄
--exclude FILE:在壓縮的過(guò)程中,不要將 FILE 打包梧疲!
--exclude參數(shù)有兩個(gè)坑
第一要注意它的位置 `tar -cvzpf [archive] --exclude=[pattern] [FILE...]`
可以 `man tar` 看看語(yǔ)法 ` tar -c [-f ARCHIVE] [OPTIONS] [FILE...]` --exclude作為option不能放在最后面允睹,否則失效运准。
第二個(gè),如果排除目錄缭受,目錄后不要加/胁澳。正確: --exclude=/home,錯(cuò)誤: --exclude=/home/
用tar備份的特點(diǎn):
- 保留權(quán)限
- 適合備份整個(gè)目錄
- 可以選擇不同的壓縮方式
- 如果選擇不壓縮還能實(shí)現(xiàn)增量備份米者,部份還原伯铣,參考man tar
如果在Linux下備份自身系統(tǒng)猾浦,需要排除一些目錄(很遺憾我們不使用這個(gè)方法槽片,我們是用livecd備份另一個(gè)系統(tǒng))
sudo tar -cvpzf /media/disk/backup.tgz --exclude=/proc --exclude=/lost+found --exclude=/tmp --exclude=/sys --exclude=/media --exclude=/home /
這些目錄是不需要備份的凄鼻。如:/proc目錄、 /tmp目錄喂分、/sys目錄锦庸,里面都是臨時(shí)文件,備份容易出錯(cuò)蒲祈,/home目錄備份容易引起"tar: 由于前面延遲的錯(cuò)誤而退出"的提示酸员。 同時(shí)確保你沒(méi)有任何東西掛載在/mnt、/media目錄內(nèi)讳嘱,否則幔嗦,會(huì)把被掛載的分區(qū)也備份在內(nèi),備份文件會(huì)很大沥潭。還要注意不要把備份文件本身也備份進(jìn)去了邀泉,也需要剔除。
開始備份
- livecd啟動(dòng)
- 命令行切換root
sudo su
- 手動(dòng)掛載原系統(tǒng)分區(qū)到/mnt /mnt/home /mnt/boot/efi 掛載備份用的移動(dòng)硬盤
#先掛載根目錄 mount /dev/nvme0n1p3 /mnt mount /dev/nvme0n1p4 /mnt/home mount /dev/nvme0n1p1 /mnt/boot/efi
- 切換工作目錄
cd /mnt
- tar備份
tar -cvpzf /media/disk-1/backup.tgz .
注解:
備份文件的存放路徑與名稱為/media/disk-1/backup.tgz
備份時(shí)沒(méi)有剔除任何目錄钝鸽,因?yàn)榱硪粋€(gè)linux沒(méi)有運(yùn)行汇恤,里面沒(méi)有臨時(shí)文件。
“cvpfz”是tar的選項(xiàng)拔恰,意思是“創(chuàng)建檔案文件”因谎、“保持權(quán)限”(保留所有東西原來(lái)的權(quán)限)、“使用gzip來(lái)減小文件尺寸”颜懊、“輸出信息”财岔。 - 記錄原系統(tǒng)數(shù)據(jù) 包括 df -hl 輸出 和 /mnt/etc/fstab 等
- 完成,可以
tar -tf backup.tgz
看看效果
還原
- livecd啟動(dòng)
- 調(diào)整磁盤分區(qū) gparted (關(guān)注ESP)
- 命令行切換root
sudo su
- 手動(dòng)掛載分區(qū)到/mnt /mnt/home /mnt/boot/efi
- 切換工作目錄
cd /mnt
- 解壓 tar -xvpzf backup.tgz
- 修復(fù)引導(dǎo)(下面重點(diǎn)討論)
調(diào)整分區(qū)
如果恢復(fù)時(shí)不需要修改分區(qū)方案河爹,可以跳過(guò)本節(jié)內(nèi)容匠璧。如果你想遷移系統(tǒng),或者是在全新的硬盤上恢復(fù)咸这,那就必須調(diào)整分區(qū)了夷恍。我推薦使用livecd上的gparted工具編輯分區(qū),能力比較強(qiáng)的可以試試gdisk或者parted命令媳维。
先對(duì)本地磁盤分區(qū)狀況有個(gè)大致了解酿雪,然后再創(chuàng)建新的分區(qū)用于還原系統(tǒng)遏暴。比如我想恢復(fù)Ubuntu系統(tǒng),新建sda4分配合適的大小指黎。再看看ESP分區(qū)正常拓挥,之后要掛載到/mnt/boot/efi 。
如果沒(méi)有ESP分區(qū)袋励,重建。
引導(dǎo)修復(fù)
成功引導(dǎo)系統(tǒng)当叭,需要具備以下條件:
- UEFI 固件正常
- UEFI 啟動(dòng)項(xiàng)對(duì)應(yīng)正確的 *.efi 文件
- EFI分區(qū)存在
- 引導(dǎo)器( *.efi )及其配置文件正常
- 操作系統(tǒng)相關(guān)文件正常
滿足這些條件后茬故,系統(tǒng)啟動(dòng)的過(guò)程大致是:UEFI 根據(jù) BootOrder 加載 EFI 分區(qū)中的某個(gè)引導(dǎo)器(grubx64.efi),引導(dǎo)器加載配置文件(grub.cfg)呈現(xiàn)啟動(dòng)菜單(GRUB 菜單)蚁鳖,用戶選擇啟動(dòng)項(xiàng)后引導(dǎo)器加載操作系統(tǒng)內(nèi)核磺芭。
既然是還原的系統(tǒng),UEFI 固件 和 操作系統(tǒng)相關(guān)文件應(yīng)該是正常的醉箕。第三點(diǎn)上面已經(jīng)講了钾腺,如果不存在就重建。最容易出問(wèn)題的是第二點(diǎn)和第四點(diǎn)讥裤。
因?yàn)閁EFI的啟動(dòng)項(xiàng) 和 引導(dǎo)器的配置文件 依賴分區(qū)的UUID放棒。還原后分區(qū)狀況很可能修改過(guò)了,UUID不一樣己英,所以引導(dǎo)失敗间螟。下面是我的UEFI啟動(dòng)項(xiàng)設(shè)置,可以看到 e08182..... 那一串東西就是UUID损肛。
$ efibootmgr -v
Boot0008* deepin PciRoot(0x0)/Pci(0x1d,0x0)/Pci(0x0,0x0)/NVMe(0x1,00-1B-44-4A-44-45-1A-7C)/HD(1,GPT,17b7c336-6227-4abf-86e4-421c91b21775,0x800,0x96000)/File(\EFI\deepin\grubx64.efi)
Boot000D* UEFI: WDC WDS256G1X0C-00ENX0, Partition 6 HD(6,GPT,a02f7983-6cff-4a88-828c-679bdcaeba4c,0x1c5b0000,0xee6b3)/File(\EFI\boot\bootx64.efi)..BO
Boot000E* backup PciRoot(0x0)/Pci(0x14,0x0)/USB(18,0)/HD(1,GPT,e0818233-4b33-483d-b3e4-54a19f9c0601,0x800,0x96000)/File(\EFI\BOOT\grubx64.efi)
grub.cfg文件節(jié)選內(nèi)容 932200a3.... 同樣是UUID
set linux_gfx_mode=
export linux_gfx_mode
menuentry 'Deepin 15.11 GNU/Linux' --class deepin --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-932200a3-ff33-48a4-a1c9-23da8cd5d964' {
...
search --no-floppy --fs-uuid --set=root 932200a3-ff33-48a4-a1c9-23da8cd5d964
else
search --no-floppy --fs-uuid --set=root 932200a3-ff33-48a4-a1c9-23da8cd5d964
如果你還原后厢破,可以進(jìn)入之前的系統(tǒng),那么你只需要 update-grub 更新一下就可以了治拿。下次啟動(dòng)時(shí)grub菜單會(huì)出現(xiàn)系統(tǒng)的引導(dǎo)項(xiàng)摩泪。update-grub 做了兩件事,1. 檢測(cè)硬盤上的系統(tǒng)劫谅,生成grub.cfg文件 2. 添加UEFI啟動(dòng)項(xiàng)
如果不能進(jìn)入系統(tǒng)见坑,需要用livecd啟動(dòng)重裝grub
livecd重裝grub 參考 https://linuxsuperuser.com/reinstall-grub2-efi-bootloader-ubuntu/
操作成功后,看到EFI分區(qū)多出了boot ubuntu目錄捏检。
重啟后成功引導(dǎo)了Ubuntu系統(tǒng)鳄梅,但沒(méi)有進(jìn)入圖形界面,進(jìn)入了緊急模式未檩。猜測(cè)是/etc/fstab配置問(wèn)題戴尸,修改UUID后成功進(jìn)入桌面!
參考資料:
https://wiki.mageia.org/en/About_EFI_UEFI
https://en.wikipedia.org/wiki/EFI_system_partition#Linux
https://en.wikipedia.org/wiki/GNU_GRUB#Startup_on_systems_using_UEFI_firmware
https://www.cnblogs.com/youxia/p/linux013.html