将Debian从Legacy切换为UEFI启动模式,debianuefi


作者:Jens Getreu
原文为英文,译文由有道翻译及谷歌翻译提供。
警告:由于文章由翻译工具翻译,仅供参考。并不能保证其准确性。
目录

  1. 启动活动系统
  2. 准备硬盘(I.备份您的数据;II.识别Debian的“/boot”分区;III.创建GPT分区表;IV.创建UEFI分区)
  3. 安装Debain文件系统(I.挂载未加密的根文件系统;II.挂载加密的根文件系统;III.挂载剩余的文件系统)
  4. 更新debians目录/etc/fstab
  5. 在切换为root的环境中(I.准备;II.安装grub-efi)
  6. 验证UEFI BIOS中的Debian引导程序
  7. 参考文献

本说明解释了如何将Legacy引导Debian/Ubuntu系统切换到UEFI引导系统。典型用例:

  • 将旧式引导安装切换到UEFI。
  • 在Debian 7、Debian 8或Debian 9上重新安装一个坏掉的UEFI引导加载程序。

本手册已在Debian 7 Wheezy,Debian 8 Jessie和Debian 9 Stretch上测试过。
1.启动活动系统
I.在BIOS中启用UEFI
II.通过USB或DVD引导最近的Debian活动系统
2.准备硬盘
I.备份您的数据
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月)。
(文章内容有改动)

相关内容