我正在尝试做这样的事情:如何将 GRUB 重新安装到 EFI 分区?
但是,我看不到如何运行chroot
,因为它是一个自动化过程(使用 Ansible,但这不重要;如果可以在 Bash 中编写脚本,那对我有用),所以我遇到了grub-install
.
我的设置
运行带有第二个硬盘驱动器 ( ) 的 Ubuntu 18.04 系统,该硬盘驱动器 ( /dev/sdb
) 具有两个分区:根分区 ( /dev/sdb2
) 安装在 中/mnt/root
,EFI 分区 ( /dev/sdb1
) 安装在/mnt/root/boot/efi
. 我根据需要将运行系统中的所有内容复制到这两个分区。
然后我尝试运行它来安装 grub 并使第二个硬盘驱动器可启动:
grub-install /dev/sdb1 --efi-directory=/mnt/root/boot/efi --boot-directory=/mnt/root/boot --target=x86_64-efi
我还尝试过(另外)重新生成 grub.cfg:
grub-mkconfig -o /mnt/root/boot/grub/grub.cfg
我知道我可能需要弄乱 UUID 并告诉 GRUB 从哪个 HD 引导。目标是取出第二个硬盘驱动器并在另一台机器上自行启动(因此 GRUB 可能首先知道它为(hd1)
,但它很可能会(hd0)
在新盒子中。
对此有任何想法吗?
编辑:
我认为GRUB实际上安装成功。我被抛出一个grub>
提示,并且可以从第二个硬盘驱动器手动启动。我想这意味着我只需要一个工作grub.cfg
并且有可能/etc/fstab
完成这项工作。
我终于让它工作了,如下(最后是完整的 Ansible 剧本)。
我将原始根分区复制到新的根分区,不包括一些特殊的挂载和(更重要的是)
/boot
目录内容,所以我从头开始:rsync -ahPHAXx --delete --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/boot/*,/mnt/*,/media/*,/lost+found/*} / /mnt/root
然后安装 grub:
grub-install --efi-directory=/mnt/esp --boot-directory=/mnt/root/boot --removable --target=x86_64-efi
生成 grub 配置:
grub-mkconfig -o /mnt/root/boot/grub/grub.cfg
这不包括以后的
vmlinuz
orinitrd
图像(假设一个空的引导分区),因此将它们复制过来:rsync -ahPHAXx --exclude="*/" --delete /boot/* /mnt/root/boot
由于 UUID 不同,我需要更新
/mnt/root/boot/grub/grub.cfg
and/mnt/root/etc/fstab
,并用新 UUID 替换旧 UUID 的每个实例。我还需要编辑 ESP grub.cfg (in
/mnt/esp/EFI/BOOT/grub.cfg
) 来查看hd0
而不是hd1
.我还从 中删除了对这些
/dev/sdb
挂载的引用fstab
,所以剩下的就是挂载 ESP 的一行,以及挂载的一行/
。为我做这件事的整个 Ansible 剧本在这里:
有这些要求: