重新初始化 GRUB 以进行不可启动的 UEFI zfs 16.04 安装

重新初始化 GRUB 以进行不可启动的 UEFI zfs 16.04 安装

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

我按照说明安装了引导加载程序:

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 环境中完成?如果是前者,我该如何正确挂载根池?

答案1

大部分内容摘自 ZFS 安装说明https://github.com/zfsonlinux/zfs/wiki/Ubuntu-16.04-Root-on-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 如果显示“没有可用的数据集”,则跳至步骤 3。如果上述任一命令显示了池列表,则我们需要导出 zfs 池,以便将其挂载到不同的目录中,然后 chroot 到该目录

# zpool export rpool

步骤 3:Chroot 进入 ZFS 池

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

# zpool import -N -R /mnt rpool

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 将每个磁盘的 /boot/efi 条目添加到 /etc/fstab 中,以便将来进行故障转移:

# 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-2 --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

答案2

重新初始化 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. 程序完成后重新启动,删除安装磁盘。

启动修复将完全重新初始化你的 grub 并与 UEFI 配合良好。

相关内容