为什么某会想到要使用lvm呢,因为家里的主力下载机是一台PC,她又是某的主要平时使用的机子(除开mac姬外),经常要对下载那个分区进行整理,装个游戏,压制点视频音乐有时候分区会很紧张,然而跨分区是很复杂的操作。这就让某想到了linux下面的lvm功能。

什么是lvm

lvm是Linux核心提供的逻辑卷轴管理功能,主要应用在磁盘分区上;传统的计算机使用磁盘主要通过管理分区,在常见的MBR磁盘上最多只可以使用4个主分区,或者任意个逻辑分区;虽然在GPT分区上可以实现使用任意分区数量,但是分区大小总是有限制的,即使很多文件系统工具提供了对分区大小进行热操作,仍旧不是很方便。lvm则可以通过让系统核心支持真正的逻辑卷管理,达到物理分区的虚拟化。可以随时对逻辑卷进行大小的修改。

使用

更加系统的讲解请参考LVM-HOWTO

注意我们使用的lvm2版本,主要区别,可以查看这里

某下面的演示,主要基于gentoo,安装的时候livecd里已经带了lvm工具。

解释一些lvm里使用的名词,先给一张图

+-- Volume Group --------------------------------+
|                                                |
|    +----------------------------------------+	 |
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |	 |
|    +----------------------------------------+	 |
|      .       	  .    	     . 	      .	       	 |
|      .          .    	     .        .	         |
|    +----------------------------------------+	 |
| LV | LE |  LE | LE | LE | LE | LE | LE | LE |	 |
|    +----------------------------------------+	 |
|            .          .        .     	   .     |
|            . 	        .        .     	   .     |
|    +----------------------------------------+	 |
| PV | PE |  PE | PE | PE | PE | PE | PE | PE |	 |
|    +----------------------------------------+	 |
|                                                |
+------------------------------------------------+
  • volume group (VG): lvm中使用的最高层次的抽象对象,它把(物理上的)逻辑和主分区划为管理单元
  • physical volume (PV): 一个pv可以是一块磁盘,或者是看起来磁盘设备 (例如/dev/sda1)
  • logical volume (LV): 和非lvm系统中的逻辑分区一样,一个lv看起来就像是普通的块设备,而它可以包含文件系统(例如/home)
  • physical extend (PE): 每个pv都被分为几部分数据,它们就是pe,对于lvm来说,它们和le大小一样。
  • logical extend (LE): 类似PE

最后,更加直观地理解,可以看下图,


    hda1   hdc1      (PV:s on partitions or whole disks)
       \   /
        \ /
       diskvg        (VG)
       /  |  \
      /   |   \
  usrlv rootlv varlv (LV:s)
    |      |     |
 ext2  reiserfs  xfs (filesystems)

要求

  1. 使用lvm,至少需要2.4.x的kernel
  2. 安装了lvm

配置

背景

这里解释的是在gentoo安装过程中将两块磁盘中的分区配置成使用lvm的过程。

主要参考了gentoo的lvm手册

假设,我现在有两块SATA硬盘,将其物理分区安排如下

/dev/sda1  -> /boot
/dev/sda2  -> (swap)
/dev/sda3  -> /
/dev/sda4  -> 将使用lvm
/dev/sdb1  -> 将使用lvm

请注意操作的安全性,一个错误的操作可能会导致整个分区的数据丢失!!

安装

  • 使用fdisk或者你喜欢的分区工具分区
  • 启动lvm服务,在gentoo下使用/etc/init.d/lvm start,livecd里默认已经启动
  • 配置lvm,打开/etc/lvm/lvm.conf,修改如下信息

    # a表示add添加,r表示reject忽略
    # 语法类似正则,表示把/dev/sda与/dev/sdb里的分区都加入到lvm的识别里
    filter = [ "a|/dev/sd[ab]|", "r/.*/" ]
    
    # 使之前配置的vg都生效
    vgscan
    vgchange -a y
    

把分区准备好

pvcreate /dev/sda4 /dev/sdb1

我们这个例子里,/dev/sda1/dev/sda2/dev/sda3分别是/boot,swap/

极其不推荐在/etc, /lib, /mnt, /proc, /sbin, /dev, and /root上使用lvm,可能会导致某些目录无法访问!!

  • 创建并扩展一个vg

    vgcreate vg /dev/sad4
    vgextend vg /dev/sdb1
    
  • 创建最终要使用的lv

    lvcreate -L10G -nusr vg # 在vg里创建一个大小为10G的lv,名字是usr
    lvcreate -L5G -nhome vg # 在vg里创建一个大小为5G的lv,名字是home
    lvcreate -L10G -nvar vg # 在vg里创建一个大小为10G的lv,名字是var
    
    lvextend -L+5G /dev/vg/home # 举例,给home这个lv增加5G容量
    
  • 在lv上创建文件系统,并挂载

    mkfs.reiserfs /dev/vg/usr
    mkfs.reiserfs /dev/vg/home
    mkfs.reiserfs /dev/vg/var
    
    # 在这之前先挂载必要分区,请参考gentoo安装手册
    mkdir /mnt/gentoo/usr
    mount /dev/vg/usr /mnt/gentoo/usr
    mkdir /mnt/gentoo/home
    mount /dev/vg/usr /mnt/gentoo/home
    mkdir /mnt/gentoo/var
    mount /dev/vg/usr /mnt/gentoo/var
    
  • 下面继续gentoo的安装过程,chroot一直到配置kernel

  • 配置kernel,打开lvm的支持选项

  • 2.4.x的kernel

    Multi-device support (RAID and LVM)  --->
    [*] Multiple devices driver support (RAID and LVM)
    < >  RAID support
    (注意这里不选择LVM是有意的,它的意思是支持LVM1)
    < >  Logical volume manager (LVM) support
    <M>  Device-mapper support
    < >   Mirror (RAID-1) support
    
    • 2.6.x以及之后版本的kernel

      Device Drivers  --->
      Multiple devices driver support (RAID and LVM) --->
      [*] Multiple devices driver support (RAID and LVM)
      < >   RAID support
      <M>   Device mapper support
      

编译完成后的模块名字叫dm-mod.ko

请注意,务必让/usr/src/linux指向您正在使用的kernel核心源代码,因为lvm的ebuild会根据路径查找device-mapper的依赖性

  • 配置chroot里的lvm.conf,和外层一致

  • 配置/etc/fstab,根据需要配置lvm的分区

    /dev/sda1     /boot        ext2       defaults      1 2
    /dev/sda2     none         swap       sw            0 0
    /dev/sda3     /            reiserfs   noatime       0 1
    /dev/cdrom    /mnt/cdrom   auto       noauto,ro     0 0
    # Logical Volumes
    /dev/vg/usr   /usr         reiserfs   noatime       0 2
    /dev/vg/home  /home        reiserfs   noatime       0 2
    /dev/vg/var   /var         reiserfs   noatime       0 2
    
  • 继续其他安装配置,一直到退出chroot前

  • 安装lvm,并将其设置为启动

    emerge -v lvm2
    rc-update add lvm boot
    
  • 退出chroot,重启前,关闭所有lvm分区

    vgchange -a n
    

如果中途有重启

如果在安装过程中因为某些原因需要重启,需要按以下操作重新激活lvm分区

vgscan --mknodes

而一些比较旧的安装CD里需要按照以下顺序激活

# 先关闭所有vg
vgchange -a n
# 导出所有vg
vgexport -a
# 导入所有vg
vgimport -a
# 重新激活所有vg
vgchange -a y

使用

如果没有意外,那么重启后系统可以成功boot进入新安装的gentoo系统

某的gentoo box的磁盘情况如下

lvm

其实也是这个某才知道前阵子上线的一台服务器上/dev/mapper,原来其实就是lvm啊XDDD

__END__