在Linux中使用LVM

目录

1 前言

老早就知道有个“LVM”,印象中貌似和磁盘阵列有关,但一直不清楚它到底是什么,有什么用。前天先后在虚拟机装了CentOS 6.3和Fedora 18,发现自动分区时,竟然都会创建LVM——当然,这不是我研究它的理由。

装好系统后的第一件事是更新。更新了Fedora之后我郁闷了,虚拟机硬盘设置的太小,系统剩余空间只有900多兆了,很可能不够用。整个大的虚拟硬盘,然后重装系统?太对不起我装系统所花费的时间。可是如果不这样,添加新硬盘,把部分系统数据拷贝到新硬盘上,然后相应重新设置系统?还要考虑每个挂载点预留多少空间,麻烦。

于是,我的视线集中在了LVM上。

2 简介

2.1 什么是LVM

Linux系统中的LVM全称Logical Volume Manager,字面意思是“逻辑卷管理器”。它有两个版本,LVM1和LVM2。LVM1是2.4内核时代的版本,现在各发行版自带的都是LVM2。

2.2 为什么要使用LVM

通过LVM,系统管理员可以更加方便零活地为应用程序和用户分配存储空间。在LVM中创建的存储卷几乎能随意调整大小或随意转移。LVM还能以自定义组的方式,让管理员使用“开发”、“销售”而不是“sda”、“sdb”来管理存储卷。

对于存储空间比较小的系统,LVM可以让各个分区间的空间分配更加灵活;对于有着各种不同存储设备的大型系统,使用LVM可以方便的添加和移除存储设备。

3 LVM解析

3.1 LVM中的元素及元素间关系

卷组(volume group ,VG),物理卷(physical volume,PV),逻辑卷(logical volume,LV),物理区块(physical extent,PE),逻辑区块(logical extent ,LE)。

    sda1   sdb1      (PVs 可以在分区上,也可以在整个磁盘上)                        
       \   /                                                                    
        \ /                                                                     
       diskvg        (VG)                                                       
       /  |  \                                                                  
      /   |   \                                                                 
  usrlv rootlv varlv (LVs)
    |      |     |                                                              
 ext2  reiserfs  xfs (文件系统)

3.2 卷组(VG)

VG是LVM的最高一级抽象。他把一系列的LVs和PVs组织为一个管理单元。

3.3 物理卷(PV)

PV通常是一块硬盘,也可能是看起来像硬盘的东西(比如硬盘上的分区,或者软阵列)。

3.4 逻辑卷(LV)

LV相当于非LVM系统中的磁盘分区。它属于标准块设备,因此可以包含一个文件系统。

3.5 物理区块(PE)

每一个PV都被分成许多大小相同的数据块,这些数据块叫做PE。PE的大小和其所属VG的LE大小相同。

3.6 逻辑区块(LE)

每一个LV都被分成许多大小相同的数据块,这些数据块叫做LE。一个VG的所有LV都具有相同数据块大小。

3.7 解释这些名词的一个例子

假设我们要创建一个名为vg的卷组,它的PE大小是4M,包含/dev/sda1和/dev/sdb1两个磁盘(或分区)。这两个磁盘需要初始化为物理卷,我们不妨分别命名为pv1和pv2。每个PV都被分成许多个4M的区块,这也是vg的逻辑区块大小。两个磁盘容量不同,因此所包含的区块数量也不同,pv1有99个区块,pv2有248个区块。现在我们可以创建一个逻辑卷,它的大小可以是1区块至347(248+99)区块之间的任意数值。逻辑卷一旦创立,就定义了LE和PE间的映射关系。例如,逻辑区块1可映射为pv1的物理区块51,写入逻辑卷第一个4M区块中的内容,实际写入了pv1的第51区块。

3.8 映射模式(线性/条带化)

      1. 线性映射(Linear mapping)通常会按顺序把一定范围内的PE分配给一个LV。例如,LE 1-199 映射到PV1,LE 100-137映射到PV2。
      2. 条带化映射(Striped mapping) 会把逻辑区块内的“数据条带”(stripe,其大小可在lvcreate命令中指定)循环交错存储在每一个PV上。例如
        LE[1]的第1个条带 -> PV1,
        LE[1]的第2个条带 -> PV2,
        LE[1]的第3个条带 -> PV3,
        LE[1]的第4个条带 -> PV1,
                       ......

        通过这种方式可以从多个磁盘并行读写数据,从而改善逻辑卷的性能。

        stripe,physical extent,logical extent:在线性LV中不存在stripe,PE和LE一一对应;在条带化的LV中,LE和PE都被分为多个stripe,LE中的stripe和PE中的stripe一一对应。(查了很久,包括自己也在测试,但是无法获知stripe的具体映射方式,如果此理解有误欢迎指出。)

3.9 快照(snapshot)

快照是一种特殊的逻辑卷。假设有一个逻辑卷lv0。我们在某天的21:30:59给它创建了一个快照lv0s(lv0被称作lv0s的原始卷),其实相当于创建了lv0在21:30:59这个时刻的虚拟镜像。如果lv0包含一个文件系统,我们可以挂载并查看lv0s的内容。若lv0s创建后,lv0的数据没有变化,那么lv0s和lv0上的数据相同;若lv0s创建后lv0的数据发生变化,lv0s的内容会保持不变,还是lv0在21:30:59时的内容。通常情况下,给快照分配原始卷15%-20%的空间就够了,因为这些空间只是用来存储快照创建后原始卷上发生变化的数据块。快照的空间一旦用尽——由于已无法记录原始卷的变化——就会损坏。快照的大小可以使用lvextend和lvreduce来调整。

LVM2中的快照是可写的。快照上发生变化的数据快会被加入排除列表,今后不管原始卷上相对应的数据块如何变化,都不会被保存到快照上。

基于快照的这些特性,它通常应用在以下几种场合:

      1. 最典型的,当你需要备份一个逻辑卷的时候,可以创建一个快照。从而可以在不影响系统使用的情况下进行备份。
      2. 可以用fsck命令对快照进行检查,确定是否需要修复原始卷的文件系统。
      3. 由于快照是可读写的,你可以创建快照并在快照上测试应用程序。既是在实际环境中测试,又不会改变实际环境中的数据。
      4. 可创建供Xen虚拟机使用的卷。创建一个原始卷,然后创建它的快照,把这个快照用于一个domU实例。接着再创建另一个快照,用于另一个domU实例。由于快照的空间只是用来保存原始卷或者快照本身产生变化的数据块,可使用这种方式共享原始卷。

3.10 镜像(mirror)

镜像可在不同设备上维护相同的数据——写入第一个设备的数据同样也会写入第二个设备,也就是把数据“镜像”了。这为可能遇到的设备故障提供了一种保护措施。当镜像的一条“腿”断掉,逻辑卷会成为线性的,但仍然能被访问。

LVM可创建具有多个镜像的镜像逻辑卷(mirrored logical volume)。一旦创建了镜像逻辑卷,LVM确保写入一个PV的数据会被镜像到另一个PV。

LVM镜像通常会把被镜像的设备分为512KB的区域,并把与镜像同步的区域记录在一个小的日志中。这个日志可在内存中维护;还可存储在磁盘上,重启系统也不会消失。

               ---
               | |  逻辑卷
               ---
                ^
                |
         ---------------
         |             |  卷组
         ---------------
                ^
                |
       -------------------
       |        |        |
      ---      ---      === <--日志
      | |      | |      | |
      ---      ---      ---
     物理卷    物理卷    物理卷
   (镜像腿1)(镜像腿2)

4 常见任务

4.1 初始化磁盘或磁盘分区

磁盘或磁盘分区需要初始化为才能使用在LVM中。

      1. 初始化整个磁盘:pvcreate /dev/sdb

        注意,初始化整个磁盘之前,需要清除分区表,方法如下:

        dd if=/dev/zero of=/dev/磁盘名称 bs=512 count=1

        不建议把整个磁盘作为物理卷。因为其他操作系统可能无法识别LVM元数据,认为设备上有空余空间,导致误操作,造成数据丢失。

      2. 初始化磁盘分区:pvcreate /dev/sdb1

        对于DOS分区,需使用cfdisk或fdisk或类似软件把分区id设置为0x8e。

4.2 创建卷组

使用vgcreate命令:

vgcreate vg /dev/sda1 /dev/sdb1

这会创建一个名为vg的卷组,包含两个物理卷/dev/sda1和/dev/sdb1。默认PE为4M,可使用-s改变其大小。此外还能限制卷组可拥有的LV和PV的数量,及设置卷组的其他参数,详见vgcreate man page。

4.3 卷组的激活

所谓“激活”,即让卷组对内核可见。若卷组被取消激活,则其所有逻辑卷都无法使用。通常情况下,卷组都是激活状态。

激活一个卷组:

vgchange -ay vg

取消激活一个卷组:

vgchange -an vg

4.4 删除一个卷组

使用vgremove命令:

vgremove vg

若卷组包含逻辑卷,运行此命令会要求确认;若卷组上某逻辑卷已被挂载,需要先取消挂载。

4.5 给卷组添加物理卷

使用vgextend命令:

vgextend vg /dev/sdc1

4.6 从卷组中移除一个物理卷

使用vgreduce命令:

vgreduce vg /dev/sdc1

若物理卷仍在使用,需要先用pvmove把上面的数据迁移到另一个物理卷,详见5.5 从卷组中移除一个磁盘

4.7 创建逻辑卷

创建一个大小为1500MB(-L参数默认单位为M,还可使用K、G、T、P、E),名为“t”的逻辑卷,其专用块设备为“/dev/vg/t”:

lvcreate -L 1500m -n t vg

创建一个100 LE的逻辑卷,其有两个条带(2 stripes。条带数量同物理卷数量相等),条带大小(stripe size。最小4K,最大不能超过PE)为4KB。

lvcreate -i2 -I4 -l100 -n t vg

如果想创建使用整个VG的逻辑卷,可先用vgdisplay找到“总PE数量(Total PE)”,然后把这个数字用在lvcreate中。

# vgdisplay vg | grep "Total PE"
  Total PE              2046
# lvcreate -n t -l 2046 vg
  Logical volume "t" created

上述命令会创建一个名为“t”的LV,其占用了整个VG。

若想让逻辑卷从某些特定的物理卷开始分配,可把这些物理卷名称放在lvcreate命令的末尾。

# lvcreate -L1500 -nt vg /dev/sdd

4.8 移除逻辑卷

使用lvremove命令。

lvremove vg/t

若逻辑卷已被挂载,需要先取消挂载。

4.9 扩展逻辑卷

使用lvextend命令。可把逻辑卷扩展到指定大小,下面命令把t扩展到5G:

lvextend -L5G vg/t

还可在原有基础上加大逻辑卷,下面命令把t加大2G:

lvextend -L+2G vg/t

扩展逻辑卷后,需要相应扩展逻辑卷上的文件系统大小。ext2/3/4、xfs不需要取消挂载即可扩大,reiserfs、jfs在扩大过程中需要取消挂载。

或者可以使用-r参数,一个命令完成扩展逻辑卷和文件系统(只支持ext2/3/4、reiserfs、xfs):

lvextend -L+2G -r vg/t

扩大jfs文件系统,/mnt/vg为其挂载点:

mount -o remount,resize /mnt/vg/

4.10 缩小逻辑卷

使用lvreduce命令。缩小逻辑卷前一定要先缩小其上的文件系统,否则逻辑卷上的数据会全部丢失。

若逻辑卷上没有文件系统,把t在原有基础上缩小2G:

lvreduce -L-2G vg/t

把t缩小到5G:

lvreduce -L5G vg/t

如果逻辑卷是ext2/3/4或reiserfs文件系统,可加上-r参数,自动调整文件系统大小:

lvreduce -L-2G -r vg/t

jfs和xfs文件系统不能缩小。可行的办法是把其上的文件备份到其他地方,减小LV尺寸重新格式化,然后再把文件恢复过来。

5 LVM应用实例

5.1 在三个磁盘上创建LVM

      1. 创建物理卷:
        # pvcreate /dev/sdc /dev/sdd /dev/sde
          Physical volume "/dev/sdc" successfully created
          Physical volume "/dev/sdd" successfully created
          Physical volume "/dev/sde" successfully created
      2. 创建卷组:
        # vgcreate vg /dev/sdc /dev/sdd /dev/sde
          Volume group "vg" successfully created
      3. 确认卷组信息,主要确认Format、VG Access、VG Status、VG Size是否正确:
        # vgdisplay vg
          --- Volume group ---
          VG Name               vg
          System ID             
          Format                lvm2
          Metadata Areas        3
          Metadata Sequence No  1
          VG Access             read/write
          VG Status             resizable
          MAX LV                0
          Cur LV                0
          Open LV               0
          Max PV                0
          Cur PV                3
          Act PV                3
          VG Size               11.99 GiB
          PE Size               4.00 MiB
          Total PE              3069
          Alloc PE / Size       0 / 0   
          Free  PE / Size       3069 / 11.99 GiB
          VG UUID               wGLGaL-RT24-HLX1-Vpn8-VT6s-WQFP-8L3PD1
      4. 创建逻辑卷,逻辑卷可理解为磁盘分区,我们可根据需要进行创建。这里只创建一个4G的线性逻辑卷:
        # lvcreate -L4G -nt vg
          Logical volume "t" created
      5. 在逻辑卷上创建文件系统。这里把它格式化为ext4文件系统:
        # mkfs.ext4 /dev/vg/t 
        mke2fs 1.42.5 (29-Jul-2012)
        文件系统标签=
        OS type: Linux
        块大小=4096 (log=2)
        分块大小=4096 (log=2)
        Stride=0 blocks, Stripe width=0 blocks
        262144 inodes, 1048576 blocks
        52428 blocks (5.00%) reserved for the super user
        第一个数据块=0
        Maximum filesystem blocks=1073741824
        32 block groups
        32768 blocks per group, 32768 fragments per group
        8192 inodes per group
        Superblock backups stored on blocks: 
        	32768, 98304, 163840, 229376, 294912, 819200, 884736
        
        Allocating group tables: 完成                            
        正在写入inode表: 完成                            
        Creating journal (32768 blocks): 完成
        Writing superblocks and filesystem accounting information: 完成
      6. 挂载文件系统验证是否正常:
        # mount /dev/vg/t /mnt/vg/
        # df -h
        文件系统                 容量  已用  可用 已用% 挂载点
        devtmpfs                 487M     0  487M    0% /dev
        tmpfs                    502M  192K  502M    1% /dev/shm
        tmpfs                    502M  2.1M  500M    1% /run
        tmpfs                    502M     0  502M    0% /sys/fs/cgroup
        /dev/mapper/fedora-root  7.8G  5.2G  2.3G   70% /
        tmpfs                    502M   24K  502M    1% /tmp
        /dev/sda1                477M   57M  395M   13% /boot
        /dev/mapper/vg-t         3.9G  8.0M  3.7G    1% /mnt/vg

5.2 在三个磁盘上创建条带化逻辑卷

      1. 创建物理卷:
        # pvcreate /dev/sdc /dev/sdd /dev/sde
          Physical volume "/dev/sdc" successfully created
          Physical volume "/dev/sdd" successfully created
          Physical volume "/dev/sde" successfully created
      2. 创建卷组:
        # vgcreate vg /dev/sdc /dev/sdd /dev/sde
          Volume group "vg" successfully created
      3. 查看卷组信息:
        # vgs vg
          VG   #PV #LV #SN Attr   VSize  VFree 
          vg     3   0   0 wz--n- 11.99g 11.99g
      4. 创建逻辑卷。逻辑卷可理解为磁盘分区,我们可根据需要进行创建。这里只创建一个4G的条带化逻辑卷,其包含三个条带,条带大小为4K:
        # lvcreate -i3 -I4 -L4G -nt vg
          Rounding size (1024 extents) up to stripe boundary size (1026 extents)
          Logical volume "t" created
      5. 在逻辑卷上创建文件系统。这里把它格式化为ext4文件系统:
        # mkfs.ext4 /dev/vg/t
        mke2fs 1.42.5 (29-Jul-2012)
        文件系统标签=
        OS type: Linux
        块大小=4096 (log=2)
        分块大小=4096 (log=2)
        Stride=0 blocks, Stripe width=3 blocks
        262944 inodes, 1050624 blocks
        52531 blocks (5.00%) reserved for the super user
        第一个数据块=0
        Maximum filesystem blocks=1077936128
        33 block groups
        32768 blocks per group, 32768 fragments per group
        7968 inodes per group
        Superblock backups stored on blocks: 
        	32768, 98304, 163840, 229376, 294912, 819200, 884736
        
        Allocating group tables: 完成                            
        正在写入inode表: 完成                            
        Creating journal (32768 blocks): 完成
        Writing superblocks and filesystem accounting information: 完成
      6. 挂载文件系统验证是否正常:
        # mount /dev/vg/t /mnt/vg/
        # df -h
        文件系统                 容量  已用  可用 已用% 挂载点
        devtmpfs                 487M     0  487M    0% /dev
        tmpfs                    502M  192K  502M    1% /dev/shm
        tmpfs                    502M  2.1M  500M    1% /run
        tmpfs                    502M     0  502M    0% /sys/fs/cgroup
        /dev/mapper/fedora-root  7.8G  5.2G  2.3G   70% /
        tmpfs                    502M   28K  502M    1% /tmp
        /dev/sda1                477M   57M  395M   13% /boot
        /dev/mapper/vg-t         3.9G  8.1M  3.7G    1% /mnt/vg

5.3 在卷组中添加磁盘

      1. 查看卷组、逻辑卷、物理卷及磁盘使用情况:
        # vgs
          VG     #PV #LV #SN Attr   VSize  VFree
          fedora   2   2   0 wz--n- 15.50g 5.50g
          vg       2   1   0 wz--n-  7.99g    0
        # lvs
          LV   VG     Attr      LSize Pool Origin Data%  Move Log Copy%  Convert
          root fedora -wi-ao--- 8.04g                                           
          swap fedora -wi-ao--- 1.97g                                           
          t    vg     -wi-a---- 7.99g
        # pvscan
          PV /dev/sdc    VG vg       lvm2 [4.00 GiB / 0    free]
          PV /dev/sdd    VG vg       lvm2 [4.00 GiB / 0    free]
          PV /dev/sda2   VG fedora   lvm2 [7.51 GiB / 0    free]
          PV /dev/sdb1   VG fedora   lvm2 [8.00 GiB / 5.50 GiB free]
          Total: 4 [23.50 GiB] / in use: 4 [23.50 GiB] / in no VG: 0 [0   ]
        # df -h
        文件系统                 容量  已用  可用 已用% 挂载点
        devtmpfs                 487M     0  487M    0% /dev
        tmpfs                    502M  152K  502M    1% /dev/shm
        tmpfs                    502M  2.1M  500M    1% /run
        tmpfs                    502M     0  502M    0% /sys/fs/cgroup
        /dev/mapper/fedora-root  7.8G  5.1G  2.4G   68% /
        tmpfs                    502M   36K  502M    1% /tmp
        /dev/sda1                477M   57M  395M   13% /boot
        /dev/mapper/vg-t         7.8G   18M  7.4G    1% /mnt/vg

        假设我们需要给这台电脑上放9G左右数据,显然目前无法满足此要求。现在把眼光聚焦在卷组vg上,它只有一个逻辑卷t,占用了整个vg,同时这个逻辑卷使用率只有1%,文件放在它上面最合适。

      2. 查看/dev/vg/t使用的文件系统:
        # mount | grep /mnt/vg
        /dev/mapper/vg-t on /mnt/vg type ext4 (rw,relatime,seclabel,data=ordered)

        ext4文件系统。

      3. 初始化新添加的磁盘:
        # pvcreate /dev/sde
          Physical volume "/dev/sde" successfully created
      4. 扩展卷组vg:
        # vgextend vg /dev/sde
          Volume group "vg" successfully extended
      5. 假设我们要把/dev/sde的所有空间都分配给t,先查看/dev/sde有多少PE:
        # pvdisplay /dev/sde
          --- Physical volume ---
          PV Name               /dev/sde
          VG Name               vg
          PV Size               4.00 GiB / not usable 4.00 MiB
          Allocatable           yes 
          PE Size               4.00 MiB
          Total PE              1023
          Free PE               1023
          Allocated PE          0
          PV UUID               IwQmIt-gaA7-XBtE-uMyJ-ko9Q-v0Bc-t5grGP
      6. 扩展t及其上的文件系统:
        # lvextend -l+1023 -r vg/t
          Extending logical volume t to 11.99 GiB
          Logical volume t successfully resized
        resize2fs 1.42.5 (29-Jul-2012)
        Filesystem at /dev/mapper/vg-t is mounted on /mnt/vg; on-line resizing required
        old_desc_blocks = 1, new_desc_blocks = 1
        The filesystem on /dev/mapper/vg-t is now 3142656 blocks long.
      7. 查看扩展后的结果:
        # vgs
          VG     #PV #LV #SN Attr   VSize  VFree
          fedora   2   2   0 wz--n- 15.50g 5.50g
          vg       3   1   0 wz--n- 11.99g    0 
        # lvs
          LV   VG     Attr      LSize  Pool Origin Data%  Move Log Copy%  Convert
          root fedora -wi-ao---  8.04g                                           
          swap fedora -wi-ao---  1.97g                                           
          t    vg     -wi-ao--- 11.99g                                           
        # pvscan
          PV /dev/sdc    VG vg       lvm2 [4.00 GiB / 0    free]
          PV /dev/sdd    VG vg       lvm2 [4.00 GiB / 0    free]
          PV /dev/sde    VG vg       lvm2 [4.00 GiB / 0    free]
          PV /dev/sda2   VG fedora   lvm2 [7.51 GiB / 0    free]
          PV /dev/sdb1   VG fedora   lvm2 [8.00 GiB / 5.50 GiB free]
          Total: 5 [27.49 GiB] / in use: 5 [27.49 GiB] / in no VG: 0 [0   ]
        # df -h
        文件系统                 容量  已用  可用 已用% 挂载点
        devtmpfs                 487M     0  487M    0% /dev
        tmpfs                    502M  192K  502M    1% /dev/shm
        tmpfs                    502M  2.1M  500M    1% /run
        tmpfs                    502M     0  502M    0% /sys/fs/cgroup
        /dev/mapper/fedora-root  7.8G  5.1G  2.4G   68% /
        tmpfs                    502M   36K  502M    1% /tmp
        /dev/sda1                477M   57M  395M   13% /boot
        /dev/mapper/vg-t          12G   20M   12G    1% /mnt/vg

5.4 通过快照备份系统

      1. 借助快照,我们不需要为了备份让系统暂停运行,也不用担心在备份过程中文件发生变化。要备份的电脑有两个卷组,fedora和vg。fedora上有两个逻辑卷,7.8G(格式化后的容量,下同)的root和1.97G的swap。假设要备份系统分区/dev/fedora/root,我们先创建快照:
        # lvcreate -L500M -s -n sroot fedora/root
          Logical volume "sroot" created

        快照只是为了特定用途而存在,使用完毕后可以删掉,通常情况下其大小可设置为原始盘的15%~20%左右。当然这个不是绝对的,如果快照存在期间原始盘数据基本不会变化,那么可以把它设置的很小;相反如果快照存在期间原始盘很多数据都会发生变化,那就需要给它分配比较大的空间。拿本例来说,快照的空间用来容纳备份过程中原始盘(/dev/fedora/root)产生变化的数据。就我虚拟机目前的使用情况,500M肯定是够用的。

      2. 挂载快照:
        # mkdir -p /mnt/fedora/sroot
        # mount /dev/fedora/sroot /mnt/fedora/sroot/

        XFS文件系统需要加上nouuid参数(不使用文件系统的uuid检查文件系统的重复挂载):

        # mount -o nouuid /dev/fedora/sroot /mnt/fedora/sroot
      3. 备份。下述命令只是一个演示,你可以用更合适的方法备份:
        # tar -cf /mnt/vg/fedora_root.tar /mnt/fedora/sroot/
        tar: 从成员名中删除开头的“/”
      4. 移除快照。原始盘变化的数据都会写入快照,这会影响系统的性能。通常操作完成后,就需要移除快照卷:
        # umount /mnt/fedora/sroot
        # lvremove /dev/fedora/sroot 
        Do you really want to remove active logical volume sroot? [y/n]: y
          Logical volume "sroot" successfully removed

5.5 从卷组移除一个磁盘

      1. 先查看当前物理卷信息:
        # pvs -o+pv_used
          PV         VG     Fmt  Attr PSize PFree Used 
          /dev/sda2  fedora lvm2 a--  7.51g    0  7.51g
          /dev/sdb1  fedora lvm2 a--  8.00g 5.50g 2.50g
          /dev/sdc   vg     lvm2 a--  4.00g    0  4.00g
          /dev/sdd   vg     lvm2 a--  4.00g 1.00g 2.99g
          /dev/sde   vg     lvm2 a--  4.00g 4.00g    0 
          /dev/sdf   vg     lvm2 a--  4.00g 4.00g    0
      2. 我们要从vg中移除/dev/sdd,但在这之前,需要把它上面的PE移到其他盘。如果卷组中其他物理卷上的空余PE足够多,使用pvmove加上目标物理卷名称即可,不需要其他参数:
        # pvmove /dev/sdd
          /dev/sdd: Moved: 0.0%
          /dev/sdd: Moved: 9.1%
          /dev/sdd: Moved: 14.6%
          /dev/sdd: Moved: 20.1%
          /dev/sdd: Moved: 25.7%
          /dev/sdd: Moved: 35.8%
          /dev/sdd: Moved: 41.3%
          /dev/sdd: Moved: 100.0%

        如果要把/dev/sdd的PE移到一个新盘(假设是/dev/sdg)上,需要先在/dev/sdg上建立物理卷,把它加入vg,再把PE转移到它上面:

        # pvcreate /dev/sdg
          Physical volume "/dev/sde" successfully created
        # vgextend vg /dev/sdg
          Volume group "vg" successfully extended
        # pvmove /dev/sdd /dev/sdg
          /dev/sdd: Moved: 1.1%
          ...
          /dev/sdd: Moved: 100.0%
        
      3. 移除/dev/sdd:
        # vgreduce vg /dev/sdd
          Removed "/dev/sdd" from volume group "vg"

        现在可以把/dev/sdd用作其他用途,或者从系统中移除。

5.6 分割卷组

卷组vg由3个物理卷/dev/sdc、/dev/sdd/、/dev/sde组成,包含两个逻辑卷t和t2。在剩余空间充足的情况下,不用添加新磁盘就可以再创建一个新的物理卷。
我们打算从vg分出一个新的物理卷vg2,操作完成后vg将会由/dev/sdc、/dev/sdd组成,vg2将会由/dev/sde组成。

      1. 查看vg的物理卷使用情况:
        # pvscan | grep vg
          PV /dev/sdc    VG vg              lvm2 [4.00 GiB / 0    free]
          PV /dev/sde    VG vg              lvm2 [4.00 GiB / 1016.00 MiB free]
          PV /dev/sdd    VG vg              lvm2 [4.00 GiB / 3.51 GiB free]
      2. 把/dev/sde上的数据移动到/dev/sdd上,并查看移动后物理卷的状态:
        # pvmove /dev/sde /dev/sdd
          /dev/sde: Moved: 2.0%
          /dev/sde: Moved: 8.6%
          /dev/sde: Moved: 13.9%
          /dev/sde: Moved: 18.9%
          /dev/sde: Moved: 26.3%
          /dev/sde: Moved: 35.8%
          /dev/sde: Moved: 41.2%
          /dev/sde: Moved: 100.0%
        # pvscan | grep vg
          PV /dev/sdc    VG vg              lvm2 [4.00 GiB / 0    free]
          PV /dev/sde    VG vg              lvm2 [4.00 GiB / 4.00 GiB free]
          PV /dev/sdd    VG vg              lvm2 [4.00 GiB / 516.00 MiB free
      3. 接下来用vgsplit命令从vg中分割新的卷组vg2。分割卷组之前,需要把逻辑卷取消激活(非必需,不取消激活也能分割逻辑卷)。如果逻辑卷已挂载,要先取消挂载才能取消激活。lvchange和vgchange都可以把逻辑卷取消激活。具体操作如下:
        # lvchange -an vg/t vg/t2
        # vgsplit vg vg2 /dev/sde
          New volume group "vg2" successfully split from "vg"

        查看卷组信息:

        # vgs
          VG     #PV #LV #SN Attr   VSize  VFree  
          fedora   2   2   0 wz--n- 15.50g   5.50g
          vg       2   2   0 wz--n-  7.99g 516.00m
          vg2      1   0   0 wz--n-  4.00g   4.00g
      4. 在新卷组上创建逻辑卷2t并格式化为XFS文件系统:
        # lvcreate -n2t -L2g vg2
          Logical volume "2t" created
        # mkfs.xfs /dev/vg2/2t 
        meta-data=/dev/vg2/2t            isize=256    agcount=4, agsize=131072 blks
                 =                       sectsz=512   attr=2, projid32bit=0
        data     =                       bsize=4096   blocks=524288, imaxpct=25
                 =                       sunit=0      swidth=0 blks
        naming   =version 2              bsize=4096   ascii-ci=0
        log      =internal log           bsize=4096   blocks=2560, version=2
                 =                       sectsz=512   sunit=0 blks, lazy-count=1
        realtime =none                   extsz=4096   blocks=0, rtextents=0
      5. 激活并挂载vg的两个逻辑卷:
        # lvchange -ay vg/t vg/t2
        # mount /dev/vg/t /mnt/vg/t
        # mount /dev/vg/t2 /mnt/vg/t2

6 参考文档

6.1 LVM HOWTO by AJ Lewis

6.2 LVM Administrator's Guide by Red Hat

6.3 LVM man page

7 后记

一开始觉得一个星期内就能完成这篇文章,结果断断续续花了一个半月时间。文章的结构需要进一步调整,内容方面也还有很多没有涉及的地方,未来的某一天再完善吧。LVM的研究先告一段落。

8 改动记录

8.1 2013年4月13日,文章标题由“怎样使用LVM”改为“在Linux中使用LVM”;添加文章目录。

Visits: 1047

此条目发表在Linux分类目录,贴了, 标签。将固定链接加入收藏夹。

在Linux中使用LVM》有一条回应

  1. Ulric说:

    先给你点个赞,回头细看:)

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

7 + 13 =