在 VM 的 LV 容器上安装 grub

在 VM 的 LV 容器上安装 grub

我在为虚拟机的 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 相关的设备节点。这样你就一定不会弄乱父母的食物。

相关内容