13.8. 将根文件系统转换为 LVM 1

Caution备份您的系统
 

强烈建议您在尝试将根文件系统转换为 LVM 1 之前,对您的系统进行完整备份。

Warning升级复杂性
 

在 LVM 1 上拥有根文件系统会显著增加升级过程的复杂性(取决于您的发行版),因此不应轻易尝试。 特别是,您必须考虑如何确保 LVM 1 内核模块(如果您没有将 LVM 1 编译到内核中)以及 vgscan/vgchange 工具在升级之前、期间和之后可用。

Warning恢复复杂性
 

在 LVM 1 上拥有根文件系统会显著增加损坏文件系统的恢复复杂性。 如果您丢失了 initrd,则将很难启动您的系统。 您将需要一个包含内核、LVM 1 模块和 LVM 1 工具以及任何恢复损坏文件系统所需工具的恢复盘。 请务必定期备份并拥有最新的备用启动方法,以便恢复 LVM 1。

在此示例中,整个系统安装在单个根分区中,/boot 除外。 该系统有一个 2 GB 的磁盘,分区如下:

/dev/hda1  /boot 
/dev/hda2  swap
/dev/hda3  /
        

/ 分区覆盖了 /boot 和 swap 未使用的所有磁盘空间。 此过程的一个重要先决条件是根分区小于半满(以便可以在逻辑卷中创建其副本)。 如果不是这种情况,则应使用第二个磁盘驱动器。 在这种情况下,过程类似,但无需缩小现有根分区,并且示例中应将 /dev/hda4 替换为(例如)/dev/hdb1。

要做到这一点,最简单的方法是使用 GNU parted。 此软件允许您增长和缩小包含文件系统的分区。 可以使用 resize2fs 和 fdisk 来完成此操作,但 GNU parted 使其不易出错。 它可能包含在您的发行版中,如果没有,您可以从 ftp://ftp.gnu.org/pub/gnu/parted 下载。

一旦您的系统上安装了 parted 并且您已备份系统

13.8.1. 单用户模式启动

启动到单用户模式(在 LILO 提示符下键入 linux S)。 这很重要。 以单用户模式启动可确保根文件系统以只读方式挂载,并且没有程序访问磁盘。

13.8.2. 运行 Parted

运行 parted 以缩小根分区。 这样做是为了在磁盘上有足够的空间来完整复制到逻辑卷中。 在此示例中,一个 1.8 GB 的分区被缩小到 1 GB。 这将显示磁盘上分区的大小和名称

# parted /dev/hda
(parted) p
.
.
.
          

现在调整分区大小

(parted) resize 3 145 999
          
这里的第一个数字是分区号 (hda3),第二个数字是 hda3 当前具有的相同起始位置。 请勿更改此值。 最后一个数字应使分区大约是当前大小的一半。

创建一个新分区

(parted) mkpart primary ext2 1000 1999
          
这将创建一个新分区来保存初始 LVM 1 数据。 它应该从刚刚超出新缩小的 hda3 的位置开始,并在磁盘末尾结束。

退出 parted

(parted) q
          

13.8.3. 重启

重启系统

13.8.4. 验证内核配置选项

确保您当前运行的内核与 LVM 1 兼容,并且在配置文件中设置了 CONFIG_BLK_DEV_RAM 和 CONFIG_BLK_DEV_INITRD。

13.8.5. 调整分区类型

将新创建分区上的分区类型从 Linux 更改为 LVM (8e)。 Parted 不理解 LVM 1 分区,因此必须使用 fdisk 完成此操作。

# fdisk /dev/hda
Command (m for help): t
Partition number (1-4): 4
Hex code (type L to list codes): 8e
Changed system type of partition 4 to 8e (Unknown)
Command (m for help): w
          

13.8.6. 为新方案设置 LVM 1

13.8.7. 创建文件系统

在逻辑卷中创建一个文件系统,并将根文件复制到其中。

# mke2fs /dev/vg/root
# mount /dev/vg/root /mnt/
# find / -xdev | cpio -pvmd /mnt
          

13.8.8. 更新 /etc/fstab

编辑新根目录上的 /mnt/etc/fstab,以便将 / 挂载在 /dev/vg/root 上。 例如

  /dev/hda3       /    ext2       defaults 1 1
          
变为
  /dev/vg/root    /    ext2       defaults 1 1
          

13.8.9. 创建 LVM 1 初始 RAM 磁盘

# lvmcreate_initrd
        

确保您记下 lvmcreate_initrd 调用 initrd 映像的名称。 它应该在 /boot 中。

13.8.10. 更新 /etc/lilo.conf

在 /etc/lilo.conf 中为 LVM 1 添加一个条目。 这应类似于以下内容

  image   = /boot/KERNEL_IMAGE_NAME
  label   = lvm
  root    = /dev/vg/root
  initrd  = /boot/INITRD_IMAGE_NAME
  ramdisk = 8192
          
其中 KERNEL_IMAGE_NAME 是您启用 LVM 1 的内核的名称,而 INITRD_IMAGE_NAME 是 lvmcreate_initrd 创建的 initrd 映像的名称。 如果您有大型 LVM 1 配置,则可能需要增加 ramdisk 行,但 8192 应该足以满足大多数用户。 默认的 ramdisk 大小为 4096。 如果有疑问,请检查 lvmcreate_initrd 命令的输出,其中一行显示
lvmcreate_initrd -- making loopback file (6189 kB)
          
并将 ramdisk 设置为括号中给出的大小。

您也应该将这个新的 lilo.conf 复制到新根文件系统中的 /etc 中。

# cp /etc/lilo.conf /mnt/etc/
          

13.8.11. 运行 LILO 以写入新的引导扇区

# lilo
        

13.8.12. 重启到 lvm

重启 - 在 LILO 提示符下键入 "lvm"。 系统应使用新创建的逻辑卷重启进入 Linux。

如果这有效,那么您应该通过在 /etc/lilo.conf 的第一部分中添加以下行,使 lvm 成为默认的 LILO 引导目标

default=lvm
          
在 /etc/lilo.conf 的第一部分中

如果它不起作用,则正常重启并尝试诊断问题。 这可能是 lilo.conf 中的输入错误,或者初始 RAM 磁盘或其内核中 LVM 1 不可用。 仔细检查启动时生成的消息。

13.8.13. 添加磁盘的其余部分

将磁盘的其余部分添加到 LVM 1 中。当您对这个设置感到满意时,您可以将旧的根分区添加到 LVM 1 并分布到整个磁盘上。

首先将分区类型设置为 8e (LVM)

# fdisk /dev/hda

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e
Changed system type of partition 3 to 8e (Unknown)
Command (m for help): w
          

将其转换为 PV 并将其添加到卷组

# pvcreate /dev/hda3
# vgextend vg /dev/hda3