做者:Jens Getreunode
原文爲英文,譯文使用谷歌翻譯。linux
目錄ios
本說明解釋瞭如何將Legacy引導Debian/Ubuntu系統切換到UEFI引導系統。典型用例:數據庫
本手冊已在Debian 7 Wheezy,Debian 8 Jessie和Debian 9 Stretch上測試過。安全
1.啓動活動系統app
I.在BIOS中啓用UEFI編輯器
II.經過USB或DVD引導最近的Debian活動系統工具
2.準備硬盤測試
I.備份您的數據ui
II.識別Debian的「/boot」分區
個人Lecagy引導系統在/boot上安裝了一個243MiB ext2分區。這個分區歷來沒有加密過。它是grub文件和Linux內核駐留的地方。經過雙擊live-disk-desktop上的partition圖標進行檢查,並查看其中的內容。
# ls -l total 21399 -rw-r--r-- 1 root root 155429 Sep 28 00:59 config-3.16-0.bpo.2-amd64 drwxr-xr-x 3 root root 7168 Nov 5 08:03 grub -rw-r--r-- 1 root root 15946275 Nov 5 16:28 initrd.img-3.16-0.bpo.2-amd64 drwx------ 2 root root 12288 Nov 24 2012 lost+found -rw-r--r-- 1 root root 2664392 Sep 28 00:59 System.map-3.16-0.bpo.2-amd64 -rw-r--r-- 1 root root 3126096 Sep 28 00:48 vmlinuz-3.16-0.bpo.2-amd64
# df -h Filesystem Size Used Avail Use% Mounted on ... /dev/sdb1 234M 28M 206M 13% /media/....
正如您能夠在Debian的Legacy引導系統的下一個分區表中看到的,個人/boot分區是number 1(/dev/sdb1)。
雖然1是標準debian安裝的默認值,但最好檢查一下!
活動系統將這個分區標識爲/dev/sdb。硬盤上的debian系統能夠不一樣的方式引用它。
Debian Legacy引導系統的分區表
# fdisk -l /dev/sdb ... Device Boot Start End Blocks Id System /dev/sdb1 * 2048 499711 44032 7 HPFS/NTFS/exFAT ... /dev/sdb5 501760 976771071 488134656 83 Linux
在Legacy引導模式下,/boot分區必須設置引導標誌(*)。這證明了咱們的假設:/boot文件系統在:/dev/sdb1上。
# gdisk -l /dev/sdb GPT fdisk (gdisk) version 0.8.5 Partition table scan: MBR: MBR only BSD: not present APM: not present GPT: not present ... Number Start (sector) End (sector) Size Code Name 1 2048 499711 243.0 MiB 8300 Linux filesystem 5 501760 976771071 238.2 GiB 8300 Linux filesystem
III.建立GPT分區表
將分區表從MBR轉換爲GPT
# gdisk /dev/sdb r recovery and transformation options (experts only) f load MBR and build fresh GPT from it
IV.建立UEFI分區
gparted是一個好的GNOME圖形分區編輯器工具。利用它,能夠很方便地進行分區操做:
# gparted /dev/sdb
將/root分區縮小到200MB以便釋放43MB(見下面的分區1)。
使用帶有分區代碼EF00(efi系統)的gparted爲efi建立一個新的43MB的分區,並將其標記爲可引導的分區。使用fat32文件系統格式化分區(見下面的分區2)。
UEFI還須要另一個未格式化的1MB分區。(見下面的分區3)。
其餘分區保持不變(參見下面的分區5)。
這裏的結果:
Debian UEFI引導系統的分區表
# gdisk -l /dev/sdb GPT fdisk (gdisk) version 0.8.5 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/sdb: 976773168 sectors, 465.8 GiB ... Number Start (sector) End (sector) Size Code Name 1 2048 411647 200.0 MiB 8300 Linux filesystem 2 411648 499711 43.0 MiB EF00 Efi partition 3 499712 501759 1024.0 KiB 8300 Linux filesystem 5 501760 976771071 465.5 GiB 8300 Linux filesystem
3.安裝Debain文件系統
下一步不一樣於根文件系統是否加密。
I.掛載未加密的根文件系統
掛載/(根)文件系統。
對於非加密的根文件系統,一個簡單的掛載就能夠了。
# mount -t ext4 /dev/sdb5 /mnt
II.掛載加密的根文件系統
對於加密的根文件系統,安裝過程可能有點棘手,尤爲是當根文件系統駐留在加密的邏輯卷中時。本節演示如何掛載和卸載加密的根文件系統。
Debian 9 Stretch 安裝程序磁盤的恢復模式自動執行如下全部步驟。先試試這個。若是它不工做,請遵循本節的其他部分。
(1)找到要掛載的邏輯卷的設備和分區
①將磁盤與主機系統鏈接,並觀察/var/log/syslog中的內核消息
root@host-system:~# tail -f /var/log/syslog sd 3:0:0:0: [sdb] 976773168 512-byte logical blocks: (500 GB/465 GiB) sd 3:0:0:0: [sdb] Write Protect is of manually. sd 3:0:0:0: [sdb] Mode Sense: 43 00 00 00 sd 3:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA sdb: sdb1 sdb2 sdb3 sdb5 sd 3:0:0:0: [sdb] Attached SCSI disk
待掛載設備爲/dev/sdb。
②找到分區
root@host-system:~# gdisk -l /dev/sdb GPT fdisk (gdisk) version 0.8.5 ... Number Start (sector) End (sector) Size Code Name 1 2048 411647 200.0 MiB 8300 Linux filesystem 2 411648 494821 43.0 MiB 0700 3 494822 501759 1024.0 KiB 8300 Linux filesystem 5 501760 976771071 465.5 GiB 8300 Linux filesystem
磁盤系統要掛載的邏輯卷駐留在/dev/sdb5上。
(2)掛載邏輯加密卷
①打開解密層
root@host-system:~# lvscan ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit
邏輯卷還沒有註冊。這樣作。
root@host-system:~# cryptsetup luksOpen /dev/sdb5 sdb5_crypt Enter passphrase for /dev/sdb5:
鍵入磁盤密碼。
root@host-system:~# lvscan inactive '/dev/disk-system/root' [457.74 GiB] inherit inactive '/dev/disk-system/swap_1' [7.78 GiB] inherit ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit
磁盤系統的邏輯卷如今已註冊。它包含一個根分區(第1行)和一個交換分區(第2行)。
②啓動邏輯卷
root@host-system:~# lvchange -a y disk-system
檢查成功。
root@host-system:~# lvscan ACTIVE '/dev/disk-system/root' [457.74 GiB] inherit ACTIVE '/dev/disk-system/swap_1' [7.78 GiB] inherit ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit root@host-system:~# ls /dev/mapper control disksystem-root disksystem-swap_1 hostsystem-root hostsystem-swap_1 mymapper sdb5_crypt
③掛載邏輯卷
root@host-system:~# mount -t ext4 /dev/mapper/disksystem-root /mnt
檢查成功。
root@host-system:~# ls /mnt bin etc initrd.img.old lib64 mnt proc sbin sys var boot home lib lost+found mnt2 root selinux tmp vmlinuz dev initrd.img lib32 media opt run srv usr vmlinuz.old
(3)解除掛載邏輯加密卷
本節只是爲了完整性。跳過它。
root@host-system:~# umount /mnt root@host-system:~# lvscan ACTIVE '/dev/disk-system/root' [457.74 GiB] inherit ACTIVE '/dev/disk-system/swap_1' [7.78 GiB] inherit ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit root@host-system:~# lvchange -a n disk-system root@host-system:~# lvscan inactive '/dev/disk-system/root' [457.74 GiB] inherit inactive '/dev/disk-system/swap_1' [7.78 GiB] inherit ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit root@host-system:~# cryptsetup luksClose sdb5_crypt root@host-system:~# lvscan ACTIVE '/dev/host-system/root' [231.03 GiB] inherit ACTIVE '/dev/host-system/swap_1' [7.20 GiB] inherit
III.掛載剩餘的文件系統
不是這樣……
# mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/boot/efi # for i in /dev/ /dev/pts /proc /sys ; do mount -B $i /mnt/$i ; done
或者經過這種方式,這兩個命令執行相同的操做……
# mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/boot/efi # mount --bind /sys /mnt/sys # mount --bind /proc /mnt/proc # mount --bind /dev /mnt/dev # mount --bind /dev/pts /mnt/dev/pts
互聯網接入
切換爲root接入內部互聯網:
# cp /etc/resolv.conf /mnt/etc/resolv.conf
4.更新debians目錄/etc/fstab
更新/mnt/etc/fstab中的條目,以反映上面的分區更改。將UUID與這裏列出的進行比較:
# ls /dev/disk/by-uuid
添加新的UEFI分區(見下面/etc/fstab中的最後一行),以便將它永久地掛載到/boot/efi上。
# cat /mnt/etc/fstab # <file system> <mount point> <type> <options> <dump> <pass> /dev/mapper/koobue1-root / ext4 errors=remount-ro 0 1 # /boot was on /dev/sdb1 during installation UUID=040cdd12-8e45-48bd-822e-7b73ef9fa09f /boot ext2 defaults 0 2 /dev/mapper/koobue1-swap_1 none swap sw 0 0 /dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0 #Jens: tmpfs added for SSD tmpfs /tmp tmpfs defaults,nodev,nosuid,size=500m 0 0 tmpfs /var/lock tmpfs defaults,nodev,nosuid,noexec,mode=1777,size=100m 0 0 tmpfs /var/run tmpfs defaults,nodev,nosuid,noexec,mode=0775,size=100m 0 0 UUID=19F0-4372 /boot/efi vfat defaults 0 2
我使用/dev/mapper加密文件系統和tmpfs,由於我有一個SSD磁盤。
5.在切換爲root的環境中
I.準備
鍵入:
# chroot /mnt
檢查
# cat /etc/fstab
對於還沒有掛載的條目,手動掛載。
# mount /tmp # mount /run # mount /var/lock ...
II.安裝grub-efi
# apt-get remove grub-pc # apt-get install grub-efi
# grub-install /dev/sdb
檢查efi文件是否存在:
# file /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/debian/grubx64.efi: PE32+ executable (EFI application) x86-64 (stripped to external PDB), for MS Windows
Debian條目應該列在這裏:
# efibootmgr BootCurrent: 0000 Timeout: 0 seconds BootOrder: 0000,2001,2002,2003 Boot0000* debian Boot2001* EFI USB Device Boot2002* EFI DVD/CDROM Boot2003* EFI Network
退出root環境。
exit
從新啓動系統。
6.驗證UEFI BIOS中的Debian引導程序
默認狀況下,bios不接受引導加載程序,由於/EFI/debian/grubx64。efi不是默認路徑,由於該文件沒有微軟的簽名。
這就是爲何grubx64。必須在UEFI bios設置中手動驗證efi。在個人InsydeH2O BIOS中我選擇:
安全▸選擇一個UEFI文件做爲可信▸進入
而後瀏覽到
/EFI/debian/grubx64.efi
爲了將grub引導加載程序插入到受信任的引導加載程序bios數據庫中。
在個人宏碁E3-111上,bios菜單項默認是禁用的。爲了啓用它,我必須首先定義一個管理員密碼。
安全▸進入設置管理員密碼
7.參考文獻
Tanguy
Tanguy:Debian:切換到UEFI boot。http://tanguy.ortolo.eu/blog/article51/debian-efi。2012年4月。
Vulcan
Vulcan, Silviu:宏碁E3-111上的Linux - Aspire E3-111- c5fn。http://www.sgvulcan.com/linux-on-the-acer-e3-111-aspire-e3-111-c5fn/。09/2014。
(文章內容有改動)