为不可引导的UEFI zfs 16.04安装重新初始化GRUB

我有一台运行Ubuntu 16.04的物理机器,带有zfs根文件系统,按照https://github.com/zfsonlinux/zfs/wiki/Ubuntu-16.04-Root-on-ZFS上的说明安装

我按照说明安装了bootloader:

5.5b对于UEFI引导,请安装GRUB:

grub-install --target=x86_64-efi --efi-directory=/boot/efi \ --bootloader-id=ubuntu --recheck --no-floppy 

该系统已经运行了三个月,有几次重启(主要是停电造成的)。

根池是一个三向镜像:

 NAME STATE READ WRITE CKSUM rpool ONLINE 0 0 0 mirror-0 ONLINE 0 0 0 ata-SAMSUNG_HM500JI_S1WFJ90S818624-part1 ONLINE 0 0 0 ata-ST3250820AS_5QE5BVW5-part1 ONLINE 0 0 0 ata-GB0250C8045_9SF0R2RD-part1 ONLINE 0 0 0 

最初我也有一个热备用包含在游泳池中。 今天早上,我需要热备用在另一台设备出现故障的服务器上使用,所以我使用zpool remove从系统中移除热备用,断电,并物理地移除备用。

现在服务器无法启动。

我已经尝试选择所有剩余的三个物理磁盘来启动,但没有快乐。

目前,我已使用Live CD重新启动。 按照上面安装说明中的早期步骤,我可以看到所有zfs池,因此数据就在那里。 我认为下一步可能是chroot到这个zpool但不知道如何这样做,因为不同的ROOT文件系统等。

我猜测GRUB引导信息由于某种原因只安装在被指定为“备用”的磁盘上,我现在已将其删除。 有问题的磁盘现在是不同服务器上的zfs镜像的一部分,因此无法将其放回原处。

我的问题是:重新初始化GRUB以便服务器启动的最简单方法是什么? 我是否需要chroot到基于磁盘的系统或可以从live-CD环境完成? 如果是前者,我该如何正确挂载根池?

从https://github.com/zfsonlinux/zfs/wiki/Ubuntu-16.04-Root-on-ZFS上的ZFS安装说明中大量说明,以下是我用来重新运行系统的步骤。

启动修复不起作用。

第1步:准备安装环境

1.1启动Ubuntu Live CD,选择不安装试用Ubuntu,然后打开终端(按Ctrl-Alt-T)。

1.2可选:在Live CD环境中安装OpenSSH服务器:如果您有第二个系统,则可以方便地使用SSH访问目标系统。

 $ sudo apt-get --yes install openssh-server 

在“ubuntu”(Live CD用户)帐户上设置密码:

 $ passwd 

提示:您可以使用ip addr show scope global找到您的IP地址。 然后,从您的主机,连接ssh ubuntu @ IP。

1.3成为root:

 # sudo -i 

1.4在Live CD环境中安装ZFS:

 # apt-add-repository universe # apt update 

(忽略有关将旧数据库移开的错误)

 # apt install --yes debootstrap gdisk zfs-initramfs 

第2步:发现可用的ZFS池

2.1检查ZFS池是否已导入

 # zpool list # zfs list 

2.2如果是这样,我们需要导出zfs池,以便我们可以将它挂载到不同的目录中,以便我们可以chroot到它

 # zpool export rpool 

第3步:Chroot进入ZFS池

3.1导入池到非默认位置。 -N标志(不自动挂载)是必要的,因为否则rpool root和rpool / root / UBUNTU池都将尝试挂载/ mnt

 # zpool import -a -N -R /mnt 

3.2安装根系统

 # zfs mount rpool/ROOT/ubuntu 

3.3挂载剩余的文件系统

 # zfs mount -a 

3.4将虚拟文件系统从LiveCD环境绑定到新系统并将其chroot到其中:

 # mount --rbind /dev /mnt/dev # mount --rbind /proc /mnt/proc # mount --rbind /sys /mnt/sys # chroot /mnt /bin/bash --login 

注意:这是使用–rbind,而不是-bind。

步骤4:重新初始化所有根池组件上的EFI分区

4.1检查通配符是否获取正确的根池分区:

 # for i in /dev/disk/by-id/*ata*part3; do echo $i; done 

4.2为/ etc / fstab添加每个磁盘的/ boot / efi条目,以便将来进行故障转移:

 # for i in /dev/disk/by-id/*ata*part3; \ do mkdosfs -F 32 -n EFI ${i}; \ echo PARTUUID=$(blkid -s PARTUUID -o value \ ${i}) /boot/efi vfat defaults 0 1 >> /etc/fstab; done 

4.3挂载第一个磁盘

 # mount /dev/disk/by-id/scsi-SATA_disk1-part3 /boot/efi 

4.4安装grub

 # grub-install --target=x86_64-efi --efi-directory=/boot/efi \ --bootloader-id=ubuntu --recheck —no-floppy 

4.5卸载第一个分区

 # umount /boot/efi 

4.6挂载第二个磁盘

 # mount /dev/disk/by-id/scsi-SATA_disk2-part3 /boot/efi 

4.7安装grub

 # grub-install --target=x86_64-efi --efi-directory=/boot/efi \ --bootloader-id=ubuntu --recheck —no-floppy 

4.8对每个附加磁盘重复步骤4.5到4.7 4.9为了增加保险,也要对每个磁盘进行MBR安装

 # grub-install /dev/disk/by-id/scsi-SATA_disk1 # grub-install /dev/disk/by-id/scsi-SATA_disk2 

第5步:重新启动

5.1从chroot退出

 # exit 

5.2重启

 # reboot 

重新初始化grub的最简单和最好的方法是一个名为boot repair的实用程序。 跟着这些步骤:

  1. 从实时Ubuntu磁盘启动并选择“尝试不安装”
  2. 打开终端并运行以下命令:

     sudo -i add-apt-repository ppa:yannubuntu/boot-repair apt update apt install boot-repair boot-repair 
  3. 选择推荐修理

  4. 您最终将看到要在终端中粘贴的代码。 这将发生两次。 打开新的终端窗口来执行此操作。
  5. 程序完成重启后,删除安装盘。

Boot-repair将完全重新初始化您的grub并与UEFI配合良好。