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