我正在设置一个自动安装程序系统,以将定制的 Ubuntu 12 和其他操作系统安装到磁盘上,这些操作系统将被删除,然后永久安装到新计算机中。
问题在于生成 grub 配置——如果我grub-mkconfig
在安装程序系统上运行,那么它将输入安装程序系统磁盘的 UUID,而不是目标磁盘。有没有办法告诉 grub-mkconfig 我要将哪个磁盘用作 root?如果我 chroot 到新系统,它会使用该文件系统似乎所在的任何 UUID 吗?或者我必须求助于sed
替换search
grub.cfg 中的命令?
答案1
是的,chroot
会很好的,然而,确保您chroot
来自的系统适合您chroot
进入的系统。
用于chroot
将操作系统移动到新磁盘,而无需重新启动、安装操作系统以及执行其他需要安装新文件系统的任务。
如何chroot
正确挂载,将当前系统(内核)与新文件系统相对应。安装和设置 GRUB 2 并可能执行更多任务。
1) 挂载您的正常系统分区。X 是驱动器号。Y 是分区号:
sudo mount /dev/sdXY /mnt
2) 如果您使用单独的启动磁盘或分区,则必须挂载它(其中 sdXY 是 /boot 分区名称):
sudo mount /dev/sdXY /mnt/boot
3)挂载关键虚拟文件系统(内核):
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
4)Chroot 到新的文件系统:
sudo chroot /mnt
5) 在 BIOS 设置为启动的驱动器上安装 GRUB 2。如果驱动器是 RAID 设置的一部分,请使用阵列中使用的所有驱动器号重复该命令。
(仅指定驱动器号,因为主引导记录的安装方式非常特殊):
grub-install /dev/sdX
6)生成GRUB 2菜单文件(grub.cfg):
update-grub
7)执行其他任务,如更新、安装应用程序、配置等:
...
8)退出 chroot:
CTRL-D
在键盘上
https://help.ubuntu.com/community/Grub2/Installing#via_ChRoot
答案2
我最终使用 chroot 来执行此操作,但首先我在目标磁盘上的 grub.cfg 中手动更改了目标磁盘的 UUID。我使用命令blkdev
找出目标磁盘分区的 UUID。它看起来像这样 ($targetdir 是挂载的目标文件系统,$diskdev 是从主机系统看到的磁盘设备,例如 /dev/sdb,$partitiondev 是磁盘分区,例如 /dev/sdb1)。此时,我已经对磁盘进行了分区、执行了 mkfs、挂载了它,然后将新文件系统的所需内容复制到磁盘。
targetuuid=`blkid -s UUID -o value $partitiondev`
test -n "$targetuuid" || error "Could not determine UUID for $partitiondev"
sed --in-place=orig 's/search .*/search --no-floppy --fs-uuid --set=root $targetuuid/' $targetdir/boot/grub/gub.cfg || error "Error setting correct UUID in $targetdir/boot/grub/grub.cfg"
mount -o bind /dev $targetdir/dev
# could also bind other pseudo-filesystems like /proc as in Diblo Dk's answer.
chroot $targetdir grub-install --no-floppy --recheck $diskdev
umount $targetdir/dev # don't forget to unmount this first otherwise you can't unmount $targetdir later
[顺便说一句,以防其他人遇到我在执行此操作时遇到的一些无关问题——我使用“buildroot”工具在 initramfs 中创建了一个最小的 Linux 系统,以便从网络启动 (pxe) 加载。如果您启用 util-linux和在“安装实用程序”下选择 mount/umount,然后会安装一个稍微有问题的 mount 版本(替换 busybox 中的内置 mount 命令),该版本似乎总是崩溃。此外,我必须在内核配置中启用 devtmpfs,并在 buildroot 中选择 devtmpfs,这样重新绑定 /dev 文件系统才会起作用——我猜在我拥有的 busybox 版本中,mount 的绑定选项似乎只有在重新绑定文件系统而不是文件系统内的目录时才有效。所有这些都与 buildroot 版本 2013.05 有关,它使用 busybox 版本 1.21.1、util-linux 2.22.2。也许这些问题已经修复了。]