我在为虚拟机的 LVM LV 容器中安装 grub 时遇到困难。这是分区表:
# parted /dev/mgtvg/linux2os print
Model: Linux device-mapper (linear) (dm)
Disk /dev/dm-7: 129GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 6469MB 6468MB primary ext3 boot
2 6469MB 11.8GB 5369MB primary xfs
3 11.8GB 17.2GB 5369MB primary xfs
4 17.2GB 129GB 112GB extended lba
5 17.2GB 22.6GB 5369MB logical xfs
分区一包含根文件系统(没有 /boot)。尝试安装grub:
# grub --device-map=/dev/null
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]
grub> device (hd0) /dev/mgtvg/linux2os
device (hd0) /dev/mgtvg/linux2os
grub> root (hd0,0)
root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup
setup
Error 1: Unrecognized device string
grub>
这是grub.conf
包含 VM 的 LV 中的文件:
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
serial --unit=1 --speeed=19200
terminal --timeout=8 console serial
title CentOS (2.6.32-279.22.1.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.22.1.el6.x86_64 ro root=/dev/sda1
initrd /initramfs-2.6.32-279.22.1.el6.x86_64.img
title CentOS (2.6.32-279.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/sda1
initrd /initramfs-2.6.32-279.el6.x86_64.img
我还需要什么?
答案1
您希望通过 LV 的名称而不是它所在的物理分区来引用它。
事物的结构如下。我有三件事:
- 物理卷 (PV)
- 卷组 (VG)
- 逻辑卷 (LV)
在我的笔记本电脑上,我有以下内容:
$ pvs
PV VG Fmt Attr PSize PFree
/dev/sda6 vg_grinchy lvm2 a- 304.22g 0
笔记:PV = /dev/sda6,VG = vg_grinchy
$ lvs
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_home vg_grinchy -wi-ao 248.53g
lv_root vg_grinchy -wi-ao 50.00g
lv_swap vg_grinchy -wi-ao 5.69g
笔记:所以我的 VG (vg_grinchy) 包含 3 个 LV(lv_home、lv_root 和 lv_swap)。
您可以使用以下命令确认这一点vgs
:
$ vgs
VG #PV #LV #SN Attr VSize VFree
vg_grinchy 1 3 0 wz--n- 304.22g 0
笔记:看到它说我们有#LV = 3,#PV = 1。
现在,如果我们使用命令lvdisplay
,我们可以看到 LV 的全名:
$ lvdisplay |grep "LV Name"
LV Name /dev/vg_grinchy/lv_root
LV Name /dev/vg_grinchy/lv_home
LV Name /dev/vg_grinchy/lv_swap
您应该使用这些名称来指定要在文件中安装哪个 LV grub.cfg
。
例子
以下是我的文件中的一节grub.cfg
。
title Fedora (2.6.35.14-106.fc14.x86_64)
root (hd0,4)
kernel /vmlinuz-2.6.35.14-106.fc14.x86_64 ro root=/dev/mapper/vg_grinchy-lv_root rd_LVM_LV=vg_grinchy/lv_root rd_LVM_LV=vg_grinchy/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=l
atarcyrheb-sun16 KEYTABLE=us rhgb quiet
initrd /initramfs-2.6.35.14-106.fc14.x86_64.img
果然你可以看到我的内核正在通过以下内容:
root=/dev/mapper/vg_grinchy-lv_root
答案2
您可能缺少这些分区的设备文件。换句话说:
kpartx -a -v /dev/mgtvg/linux2os
这应该创建类似的东西:
/dev/mapper/mgtvg-linux2os1
/dev/mapper/mgtvg-linux2os2
...
之后,你也许可以做
grub-install /dev/mapper/mgtvg-linux2os
这将依次将 (hd0,0) 或 (hd0,msdos1) 解析为 /dev/mapper/mgtvg-linux2os1,然后事情可能会真正起作用。
请注意,我也会在 chroot 中完成所有这些操作。 chroot /dev 必须具有来自父计算机以及 /proc 的与 VM 相关的设备节点。这样你就一定不会弄乱父母的食物。