为不可引导的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的实用程序。 跟着这些步骤:
- 从实时Ubuntu磁盘启动并选择“尝试不安装”
-
打开终端并运行以下命令:
sudo -i add-apt-repository ppa:yannubuntu/boot-repair apt update apt install boot-repair boot-repair
-
选择推荐修理
- 您最终将看到要在终端中粘贴的代码。 这将发生两次。 打开新的终端窗口来执行此操作。
- 程序完成重启后,删除安装盘。
Boot-repair将完全重新初始化您的grub并与UEFI配合良好。