Linux入门真经-037LVM逻辑卷扩容与快照

本节介绍如何对LVM进行扩容。

 

1、扩展LV

 

上一节我们创建了两个PV:20G的sdb和5G的sdc1,并将他们组合成一个25G的VG:vgpool1,最后在vgpool1之上创建了一个20G的LV:lvol0

现在假设lvol0的大小不够用了。我们将vgpool1中剩余的4.99G都分配给他,对该LV进行扩容。

 

[root@localhost ~]# lvextend -L +4.99G/dev/vgpool1/lvol0

 Rounding size to boundary between physical extents: 4.99 GiB.

 Size of logical volume vgpool1/lvol0 changed from 20.00 GiB (5120extents) to 24.99 GiB (6398 extents).

 Logical volume vgpool1/lvol0 successfully resized.

[root@localhost ~]#

 

此时只是LV的大小增加了,可是文件系统的大小并没有增加。

 

[root@localhost ~]# lvscan | grep lvol0

 ACTIVE           '/dev/vgpool1/lvol0' [24.99 GiB] inherit

[root@localhost ~]# df -h | grep lvol0

/dev/mapper/vgpool1-lvol0   20G  33M   20G   1% /mnt/lvmpool0_mount

[root@localhost ~]#

 

使用xfs_growfs将文件系统的容量增加(若使用的是ext系列的文件系统,则使用resize2fs)

 

[root@localhost srv]# xfs_growfs /mnt/lvmpool0_mount/

meta-data=/dev/mapper/vgpool1-lvol0isize=512    agcount=4, agsize=1310720blks

        =                      sectsz=512   attr=2, projid32bit=1

        =                       crc=1        finobt=0 spinodes=0

data    =                      bsize=4096   blocks=5242880,imaxpct=25

        =                      sunit=0      swidth=0 blks

naming  =version 2             bsize=4096   ascii-ci=0 ftype=1

log     =internal              bsize=4096   blocks=2560,version=2

        =                      sectsz=512   sunit=0 blks,lazy-count=1

realtime =none                   extsz=4096   blocks=0, rtextents=0

data blocks changed from 5242880 to 6551552

 

我们可以看到block确实增加了,使用df命令可以观察到,文件系统也确实增加了:

 

[root@localhost srv]# df -Th | grep lvol0

/dev/mapper/vgpool1-lvol0 xfs        25G  33M   25G   1% /mnt/lvmpool0_mount

 

关于LV缩容:

1、  xfs文件系统不支持缩容

2、  如果使用的是ext系列的文件系统,在e2fsck检测通过后,先用resize2fs将文件系统大小减少。然后可以使用lvreduce进行缩容(该命令用法与lvextend基本一致)。建议先备份数据,以免数据丢失。

 

2、扩展VG

 

假设现在24.99G依然不够用,由于VG的空间已经使用完了,我们可以再从sdc上分出一个5G的分区,并把它加入VG中

 

[root@localhost ~]# fdisk /dev/sdc

Welcome to fdisk (util-linux 2.23.2).

 

Changes will remain in memory only, untilyou decide to write them.

Be careful before using the write command.

 

 

Command (m for help): p

 

Disk /dev/sdc: 21.5 GB, 21474836480 bytes,41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes /512 bytes

I/O size (minimum/optimal): 512 bytes / 512bytes

Disk label type: dos

Disk identifier: 0xa8ca5dfd

 

  Device Boot      Start         End      Blocks  Id  System

/dev/sdc1            2048    10487807    5242880   8e  Linux LVM

 

Command (m for help): n

Partition type:

  p   primary (1 primary, 0 extended,3 free)

  e   extended

Select (default p): p

Partition number (2-4, default 2):

First sector (10487808-41943039, default10487808):

Using default value 10487808

Last sector, +sectors or +size{K,M,G}(10487808-41943039, default 41943039): +5G

Partition 2 of type Linux and of size 5 GiBis set

 

Command (m for help): t

Partition number (1,2, default 2): 2

Hex code (type L to list all codes): 8e

Changed type of partition 'Linux' to 'LinuxLVM'

 

Command (m for help): p

 

Disk /dev/sdc: 21.5 GB, 21474836480 bytes,41943040 sectors

Units = sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes /512 bytes

I/O size (minimum/optimal): 512 bytes / 512bytes

Disk label type: dos

Disk identifier: 0xa8ca5dfd

 

  Device Boot      Start         End      Blocks  Id  System

/dev/sdc1            2048    10487807    5242880   8e  Linux LVM

/dev/sdc2        10487808    20973567    5242880   8e  Linux LVM

 

Command (m for help): w

The partition table has been altered!

 

Calling ioctl() to re-read partition table.

 

WARNING: Re-reading the partition tablefailed with error 16: Device or resource busy.

The kernel still uses the old table. Thenew table will be used at

the next reboot or after you runpartprobe(8) or kpartx(8)

Syncing disks.

[root@localhost ~]#

 

[root@localhost ~]# ls /dev/sd*

/dev/sda /dev/sda1  /dev/sda2  /dev/sdb /dev/sdc  /dev/sdc1

 

sdc2似乎没有识别出来

 

[root@localhost ~]# cat /proc/partitions

major minor #blocks  name

 

  8        0   20971520 sda

  8        1   1048576 sda1

  8        2   19921920 sda2

  8       16   20971520 sdb

  8       32   20971520 sdc

  8       33    5242880 sdc1

 11        0     927744 sr0

 253       0   17821696 dm-0

 253       1    2097152 dm-1

 253       2   26206208 dm-2

 

我们前面讲过,可以使用partx重读分区表

 

[root@localhost ~]# partx -a /dev/sdc

partx: /dev/sdc: error adding partition 1

[root@localhost ~]# partx -a /dev/sdc

partx: /dev/sdc: error adding partitions1-2

[root@localhost ~]# cat /proc/partitions

major minor #blocks  name

 

  8        0   20971520 sda

  8        1    1048576 sda1

  8        2   19921920 sda2

  8       16   20971520 sdb

  8       32   20971520 sdc

  8       33    5242880 sdc1

  8       34    5242880 sdc2

 11        0     927744 sr0

 253       0   17821696 dm-0

 253       1    2097152 dm-1

 253       2   26206208 dm-2

[root@localhost ~]#

 

此时内核成功识别分区,

创建PV并扩展VG

 

[root@localhost ~]# pvcreate /dev/sdc2

 Physical volume "/dev/sdc2" successfully created.

[root@localhost ~]# man vgextend

[root@localhost ~]# vgextend /dev/vgpool1 /dev/sdc2

 Volume group "vgpool1" successfully extended

 

此时查看VG信息则可以发现,VG大小扩展至29.99GB(实际可能略有不足,7677*4M约为29.988G),已经分配(Alloc PE)了24.99G,剩余(free PE)约5G(1279*4M)

 

[root@localhost ~]# vgdisplay /dev/vgpool1

  ---Volume group ---

  VGName               vgpool1

 System ID            

 Format                lvm2

 Metadata Areas        3

 Metadata Sequence No  4

  VGAccess             read/write

  VGStatus             resizable

  MAXLV                0

  CurLV                1

 Open LV               1

  MaxPV                0

  CurPV                3

  ActPV                3

  VGSize               <29.99 GiB

  PESize               4.00 MiB

 Total PE              7677

 Alloc PE / Size       6398 / 24.99GiB

 Free  PE / Size       1279 / <5.00 GiB

  VGUUID              yTpx8x-z3ic-JWY2-BPTv-T5rg-NIKr-sz4LeY

 

此时VG已经扩展成功,再按需创建或者扩展LV即可,在此不再赘述。

 

3、LVM快照

 

快照是对数据备份的一种方式,是从逻辑/软件层面对数据的一种保护。

快照的建立必须快速,实时、准确地记录当前状态。(如果快照进行十分缓慢的话,快照前后的数据很容易产生不一致的现象,你可以想象:拍照片一瞬间就能记录你当前的样子,如果照片生成的特别慢,你可能最后得到的是婴儿时期的头部,少年时期的身体,老年时期的腿)。

由于实时、快速的要求,LVM的快照机制是这样的:

划出一块没有用的区域(这个过程速度很快)。划分完毕之后,只记录LV上发生变化的数据,没有发生变化的数据不记录。因此,创建快照很快(创建之初大小为0),随着数据变化增多,快照慢慢变大。

我们接下来创建一个快照,并尝试用该快照恢复文件。

首先,我们在LV上创建10个文件模拟已有的环境:

 

[root@localhost ~]# cd /mnt/lvmpool0_mount/

[root@localhost lvmpool0_mount]# for i in{1..10};do touch file_$i ;done

[root@localhost lvmpool0_mount]# ls

file_1 file_10  file_2  file_3 file_4  file_5  file_6 file_7  file_8  file_9

[root@localhost lvmpool0_mount]#

 

给lvol0这个逻辑卷创建快照,快照最大为1G,如下所示(-L选项指定大小,-s表示创建快照,-n指定名字为snap_lv0,这些选项含义从man手册中都能找到):

 

[root@localhost lvmpool0_mount]# lvcreate -L 1G -s -n snap_lv0 /dev/vgpool1/lvol0

 Logical volume "snap_lv0" created.

[root@localhost lvmpool0_mount]#

 

可以看到设备文件已经生成了。

 

[root@localhost lvmpool0_mount]# ls /dev/vgpool1/

lvol0 snap_lv0

 

现在我们将这些文件全部删除

 

[root@localhost lvmpool0_mount]# ls

file_1 file_10  file_2  file_3 file_4  file_5  file_6 file_7  file_8  file_9

[root@localhost lvmpool0_mount]# rm -f file_*

[root@localhost lvmpool0_mount]# ls

[root@localhost lvmpool0_mount]#

 

我们将快照文件挂载到某一目录,该快照可以将LV之前的文件系统还原出来:

 

[root@localhost mnt]# mount /dev/vgpool1/snap_lv0 /mnt/snap_point/

mount: wrong fs type, bad option, badsuperblock on /dev/mapper/vgpool1-snap_lv0,

       missing codepage or helper program, orother error

 

      In some cases useful info is found in syslog - try

      dmesg | tail or so.

 

报错了。查看dmesg发现,挂载的过程中产生了UUID(一种设备标识)冲突。我们之前创建的LV使用的是xfs的文件系统,该文件系统默认不允许同时挂载两个相同的UUID的块设备。而快照后快照设备的UUID与LV是相同的。因此mount时要用特殊选项-o nouuid去规避:

 

[root@localhost dev]# blkid /dev/vgpool1/lvol0

/dev/vgpool1/lvol0:UUID="47f14142-866e-4c3c-86d8-84b8c9f4c3de" TYPE="xfs"

[root@localhost dev]# blkid/dev/vgpool1/snap_lv0

/dev/vgpool1/snap_lv0: UUID="47f14142-866e-4c3c-86d8-84b8c9f4c3de"TYPE="xfs"

[root@localhost dev]#

 

[root@localhost dev]# mount -o nouuid /dev/vgpool1/snap_lv0 /mnt/snap_point/

[root@localhost dev]# cd /mnt/snap_point/

[root@localhost snap_point]# ls

file_1 file_10  file_2  file_3 file_4  file_5  file_6 file_7  file_8  file_9

[root@localhost snap_point]#

 

看到了么,挂载快照后发现,快照完好地重现了数据删除前的场景,我们将这些文件拷贝回去即可。

 

因此,lvm快照可以在很大程度上避免因为认为的误操作(如误删、误写)导致的数据丢失。然而,如果是磁盘级别的故障导致的数据丢失,则快照毫无办法。数据是企业的生命,因此衍生了大量的数据备份、冗余解决方案。更有专门的存储设备厂商生产专门的存储设备、提供相关的解决方案。这些东西暂时超出了目前介绍的范畴,大家了解即可。

在主机级别上,也有着常见的解决方案—RAID。他可以在磁盘级别为我们提供数据安全(一块或多块盘坏了数据不丢失甚至业务不中断)。下一节为大家简单介绍RAID技术。

 

关注本公众号获取最新更新

每周一、三、五稳定更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值