我正在将我的项目从 CentOS 6 迁移到 CentOS 7,并且需要处理 CentOS 7 引入的引导要求的变化,特别是从 grub 到 grub2 的升级。问题的要点是这样的:
在我基于 CentOS 6 的工作中,我将硬盘驱动器分成不同的分区,每个分区托管一个虚拟机,通过 virt-install 进行安装。我使用了预先创建的 CentOS 6 映像,将其直接解压到托管 VM 的分区中,从而允许我使用 virt-install 的 --import 选项。每个虚拟机的分区进一步分为引导分区、交换分区和根文件系统分区。我手动创建了 device.map grub.conf 文件并运行所需的 grub 安装命令以使 VM 可启动。
在 CentOS 7 中,情况发生了一些变化。当 grub2 安装在 GPT 驱动器上时,它需要额外的“bios_grub”分区。因此,现在我的 VM 分区被细分为四个分区,而不是 CentOS 6.6 下的三个分区。例如,如果我在 /dev/sda4 下安装 VM,parted 将显示如下内容:
# parted -s /dev/sda4 print
Model: Unknown (unknown)
Disk /dev/sda4: 75.2GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB primary bios_grub
2 2097kB 136MB 134MB ext3 primary boot
3 136MB 153MB 16.8MB linux-swap(v1) primary
4 153MB 75.2GB 75.0GB ext4 primary
问题是我无法启动我创建的虚拟机。好吧,虚拟机启动了,但它们立即挂起。没有错误并且 virsh 显示它们正在运行,但没有发生从 BIOS 到 grub 的传输。我运行的安装 grub 的命令如下(再次假设虚拟机安装在 /dev/sda4 上):
# chroot /mnt/rootfs/grub2-install --force /dev/sda4
Installing for i386-pc platform.
Installation finished. No error reported.
# chroot /mnt/rootfs grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
done
VM 创建命令如下:
# virt-install --connect=qemu:///system --network bridge=br0,mac=RANDOM,model=virtio --name=vm1 --disk path=/dev/sda4,bus=virtio --force --vcpus=1 --ram=1024 --check-cpu --accelerate --hvm --nographics --noreboot --import
Starting install...
Creating domain...
Domain creation completed. You can restart your domain by running:
virsh --connect qemu:///system start vm1
不幸的是,正如我所说,虚拟机确实启动了,但它立即挂起。 BIOS 不会转换为 grub 来引导 CentOS。同样的基本方法适用于 CentOS 6,所以我假设我在这里遗漏了一些关键步骤,很可能与我如何安装 grub2 有关。如果有人在这方面有经验并有任何建议,我将不胜感激。
彼得