更新grub2没有硬件访问(例如在chroot中)?

我正在编写一个脚本,需要一个主KVM映像,将其转换为VDI,对其进行一些更改,然后提供下载。

我需要更新一些新创build的映像的内核启动参数。 通常情况下,编辑/ etc / default / grub中的GRUB_CMDLINE_LINUX_DEFAULT设置,然后运行update-grub。 当然,我只能在chroot中执行这个操作,失败了:'/ usr / sbin / grub-probe:error:找不到/(是/ dev挂载的)设备。

将正在运行的系统的安装/ dev绑定到chroot中,允许update-grub运行,但是会导致grub.cfg中断(从映像的angular度看错误的根设备)。

如果我只是使用sed来添加我需要的内核参数,它将启动映像,但后续运行的update-grub(从现在运行的映像中)会造成麻烦。

所以我现在的解决scheme是:

  1. 编辑/ etc / default / grub中的参数
  2. 将/ dev挂载到chroot中
  3. 在chroot中运行update-grub
  4. 使用sed修复/boot/grub/grub.cfg中的错误设备节点

请告诉我有一个更好的方法。

正确的答案是将/ dev安装到chroot中,并使用$ chroot / boot / grub / device.map文件来告诉grub(hd0)(从映像的angular度来看)实际上就是您已经分区的环回文件“(然后用kpartx和c安装到你的chroot中)。

# generate grub configs and install it to the generated blockdev chroot $MR update-grub 2> /dev/null chroot $MR grub-mkconfig -o /boot/grub/grub.cfg 2> /dev/null cat > $MR/boot/grub/device.map <<EOF (hd0) ${LOOPDEV} EOF chroot $MR grub-install ${LOOPDEV} 2> /dev/null 

在完成将grub安装到loopdev的“mbr”之后,您应该rm device.map文件,因为一旦实际启动,从映像的angular度来看,它将不准确。

我有一个脚本,为Ubuntu 13.10 saucy x64在这里构build完整的qcow2图像:

https://github.com/sneak/kvm-ubuntu-imagebuilder/blob/master/buildimage.sh#L211

祝你好运。

请注意,这个答案假设你的磁盘是分区的。

潜行的答案适用于运行grub 1.99的Debian wheezy,但不适用于grub2。 您将需要使用UUID(如grub devs所推荐 )来引用设备/分区。
问题是:kpartx(用于映射分区的工具)不会在/dev/disk/by-uuid创build符号链接,在生成configuration时,grub会使用它来validation是否可以使用检测到的UUID,到设备path。 ( ln -s /dev/sdX /dev/disk/by-uuid/$(blkid -s UUID -o value /dev/sdX) )来纠正这个问题。

我希望这会有所帮助,如果不是,那么也许是像我这样做了这个问题的其他人,因为找出这个问题的人花了相当长的时间。