续《磁盘管理-LVM(1)》

1、扩展逻辑卷

    调整逻辑卷大小的功能是LVM最有用的功能。这个部分会讨论我们怎么样扩展一个存在的逻辑卷。下面,我们将会扩展先前创建的逻辑卷‘mylv1’扩大到3G。

    注意,调整逻辑卷大小之后,也需要对文件系统调整大小进行匹配。这个额外的步骤各不相同,取决于创建文件系统的类型。命令的执行顺序是很重要的。

### lvextend - extend the size of a logical volume
# lvextend {-l|--extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}] | -L|--size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE]} LogicalVolumePath

### lvresize - resize a logical volume
# lvresize {-l|--extents [+]LogicalExtentsNumber[%{VG|LV|PVS|FREE|ORIGIN}] | -L|--size [+]LogicalVolumeSize[bBsSkKmMgGtTpPeE]} LogicalVolumePath

### lvextend,lvresize都能够满足我们的需求,这些必须注意的是如何指定逻辑卷的大小
# [ + ]
# -L 3G    ## 指定逻辑卷大小为3G
# -L +3G   ## 在原来的基础上再增加3G

### 首先卸载,当然lvm也支持在线扩展
[root@localhost ~]# umount /dev/myvg/mylv1 
# 扩展逻辑卷
[root@localhost ~]# lvextend -L 3G /dev/myvg/mylv1 
  Extending logical volume mylv1 to 3.00 GB
  Logical volume mylv1 successfully resized
### 强制检查磁盘错误
[root@localhost ~]# e2fsck -f /dev/myvg/mylv1
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv1: 11/262144 files (9.1% non-contiguous), 25406/524288 blocks
### 扩展文件系统
[root@localhost ~]# resize2fs /dev/myvg/mylv1
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/myvg/mylv1 to 786432 (4k) blocks.
The filesystem on /dev/myvg/mylv1 is now 786432 blocks long.

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/myvg/mylv1
  VG Name                myvg
  LV UUID                D1NF1V-zPl7-cvXs-hk0c-2Fbx-WKZ1-tF49Fi
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                3.00 GB    # 已经扩展到了3G
  Current LE             768
  Segments               4
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:0

那么,现在此逻辑卷可以重新被挂载了。

2、缩减逻辑卷(必须首先卸载)

    缩减与扩展的操作类似,但是值得关注的是命令的顺序。并且,下列命令对ext2/3/4文件系统同样有效。

  • 首先查看逻辑卷空间使用情况

  • 不能在线缩减,必须首先卸载

  • 确保缩小后的空间大小依然能够存储原来存储的所有数据,否则将丢失数据

  • 在缩减之前应该首先进行文件系统一致性检查

注意减少逻辑卷的大小值若小于储存的数据大小,存储在后面的数据会丢失。

### 卸载逻辑卷
[root@localhost ~]# umount /dev/myvg/mylv1 
### 强制文件系统检查 
[root@localhost ~]# e2fsck -f /dev/myvg/mylv1
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/myvg/mylv1: 11/393216 files (9.1% non-contiguous), 29518/786432 blocks
### 缩减文件系统
[root@localhost ~]# resize2fs /dev/myvg/mylv1 1G
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/myvg/mylv1 to 262144 (4k) blocks.
The filesystem on /dev/myvg/mylv1 is now 262144 blocks long.
### 缩减逻辑卷
[root@localhost ~]# lvresize -L 1G /dev/myvg/mylv1 
  WARNING: Reducing active logical volume to 1.00 GB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv1? [y/n]: y
  Reducing logical volume mylv1 to 1.00 GB
  Logical volume mylv1 successfully resized



3、扩展卷组

    当我们发现卷组空间不够时,我们如何进行扩展呢?下面就讲解如何把一个物理卷PV加入到当前的VG中。

    承接上一篇文章,我们仅用了/dev/sdb{1,2,3}创建VG,此时我想把/dev/sdb5也加入VG。

[root@localhost ~]# pvcreate /dev/sdb5        # 创建pv
  Writing physical volume data to disk "/dev/sdb5"
  Physical volume "/dev/sdb5" successfully created
[root@localhost ~]# pvs                       # 显示pv 
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1  myvg lvm2 a--  964.00M      0 
  /dev/sdb2  myvg lvm2 a--  964.00M      0 
  /dev/sdb3  myvg lvm2 a--  964.00M 844.00M
  /dev/sdb5       lvm2 a--  964.81M 964.81M    # 我们可以看到,新创建的pv不属于任何vg
[root@localhost ~]# vgextend myvg /dev/sdb5    # 扩展vg
  Volume group "myvg" successfully extended
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1  myvg lvm2 a--  964.00M      0 
  /dev/sdb2  myvg lvm2 a--  964.00M      0 
  /dev/sdb3  myvg lvm2 a--  964.00M 844.00M
  /dev/sdb5  myvg lvm2 a--  964.00M 964.00M    # OK, 已经加入myvg

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               myvg
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               1
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               3.77 GB
  PE Size               4.00 MB
  Total PE              964
  Alloc PE / Size       512 / 2.00 GB
  Free  PE / Size       452 / 1.77 GB
  VG UUID               99yTE0-Lc3f-b5rz-qa4F-d8YD-XBfM-U4DYoM

通过观察VG Size,可以看出myvg已经扩展。


4、缩减卷组

    其实缩减卷组的情况不是太常见,在缩减之前,我们必须考虑以下问题:缩减VG也就是,把PV从VG中移除。那么我们如何知道数据时存储在哪个PV上的呢?我们无从得知。所以我们在移除PV的时候,首先要做的就是把此PV上的数据转移到其他PV上去。

  • pvmove /dev/sdb1    ### 将/dev/sdb1上存储的数据转移到其他物理卷上去

  • vgreduce myvg /dev/sdb1    ### 将PV: /dev/sdb1从VG: myvg中移除

  • pvremove /dev/sdb1         ### 将/dev/sdb1从物理卷上移除

[root@localhost ~]# pvs                    # 查看pv
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1  myvg lvm2 a--  964.00M      0         #PV:/dev/sdb1空间已经被占完
  /dev/sdb2  myvg lvm2 a--  964.00M 904.00M
  /dev/sdb3  myvg lvm2 a--  964.00M 964.00M
  /dev/sdb5  myvg lvm2 a--  964.00M 964.00M
[root@localhost ~]# pvmove /dev/sdb1       # 把/dev/sdb1上的数据转移
  /dev/sdb1: Moved: 20.3%
  /dev/sdb1: Moved: 100.0%
[root@localhost ~]# vgreduce myvg /dev/sdb1    # 把/dev/sdb1从myvg中移除
  Removed "/dev/sdb1" from volume group "myvg"
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1       lvm2 a--  964.81M 964.81M
  /dev/sdb2  myvg lvm2 a--  964.00M 904.00M
  /dev/sdb3  myvg lvm2 a--  964.00M      0         #PV: 看到把/dev/sdb1的数据转移过来了
  /dev/sdb5  myvg lvm2 a--  964.00M 964.00M
[root@localhost ~]# pvremove /dev/sdb1      # 把/dev/sdb1从物理卷上移除
  Labels on physical volume "/dev/sdb1" successfully wiped
[root@localhost ~]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb2  myvg lvm2 a--  964.00M 904.00M
  /dev/sdb3  myvg lvm2 a--  964.00M      0 
  /dev/sdb5  myvg lvm2 a--  964.00M 964.00M


5、LVM实现快照,进行热备

    lvm快照可以用于实时备份(moment-in-time),即为了保持系统的一致性,我们先做一个快照冻结当前系统状态,这样快照里面的内容可暂时保持不变,系统本身继续运行,通过备份快照来实现不中断服务的的备份。

    注意合理的选择:快照的大小。否则将会导致失败

### lvcreate -s    # 创建快照
# lvcreate -s -L 30M -n mysp -p r  /dev/myvg/mylv1
# -L 快照大小    -n 快照名称    -p 权限    -s 创建快照

### 我们把/dev/myvg/mylv1挂载到/mnt目录下
[root@localhost ~]# mount /dev/myvg/mylv1  /mnt
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             8.6G  2.4G  5.8G  30% /
/dev/sda1             190M   12M  169M   7% /boot
tmpfs                  62M     0   62M   0% /dev/shm
/dev/mapper/myvg-mylv1
                      2.0G   68M  1.9G   4% /mnt
### 拷贝一个文件作为测试
[root@localhost ~]# cp install.log /mnt

### 对/dev/myvg/mylv1创建快照
[root@localhost ~]# lvcreate -s -L 30M -n my_sp -p r /dev/myvg/mylv1 
  Rounding up size to full physical extent 32.00 MB
  Logical volume "my_sp" created
[root@localhost ~]# lvs
  LV    VG   Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  my_sp myvg sri-a- 32.00M mylv1    0.04                        
  mylv1 myvg owi-ao  2.00G 
### 创建挂载目录,并把快照挂载, 注意我们并没有为该快照创建文件系统
[root@localhost ~]# mkdir /backup
[root@localhost ~]# mount /dev/myvg/my_sp /backup/
mount: block device /dev/myvg/my_sp is write-protected, mounting read-only
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             8.6G  2.4G  5.8G  30% /
/dev/sda1             190M   12M  169M   7% /boot
tmpfs                  62M     0   62M   0% /dev/shm
/dev/mapper/myvg-mylv1
                      2.0G   68M  1.9G   4% /mnt
/dev/mapper/myvg-my_sp
                      2.0G   68M  1.9G   4% /backup


### 模拟系统正在运行,向/mnt写入文件
[root@localhost ~]# cp /boot/initrd-2.6.18-308.el5.img /boot/vmlinuz-2.6.18-308.el5 /mnt

### 此时,我们可以针对/backup备份,而不会受系统动态运行的影响
[root@localhost ~]# tar zcvpf my_sp.tar.gz /backup 
tar: Removing leading `/' from member names
/backup/
/backup/lost+found/
/backup/install.log

看,实际备份的只是我们做快照时系统的状态,后来向/mnt写入文件,并不影响我们的备份。