本节介绍如何对LVM进行扩容。
1、扩展LV
现在假设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 20G33M 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 2bsize=4096 ascii-ci=0 ftype=1
log=internalbsize=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 25G33M 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 BlocksId System
/dev/sdc1 2048 104878075242880 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 BlocksId System
/dev/sdc1 2048 104878075242880 8e Linux LVM
/dev/sdc2 10487808 209735675242880 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 11048576 sda1
8 2 19921920 sda2
8 16 20971520 sdb
8 32 20971520 sdc
8 33 5242880 sdc1
11 0 927744 sr0
2530 17821696 dm-0
2531 2097152 dm-1
2532 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
2530 17821696 dm-0
2531 2097152 dm-1
2532 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
VGUUIDyTpx8x-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_1file_10 file_2 file_3file_4 file_5 file_6file_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/
lvol0snap_lv0
现在我们将这些文件全部删除
[root@localhost lvmpool0_mount]# ls
file_1file_10 file_2 file_3file_4 file_5 file_6file_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_1file_10 file_2 file_3file_4 file_5 file_6file_7 file_8 file_9
[root@localhost snap_point]#
看到了么,挂载快照后发现,快照完好地重现了数据删除前的场景,我们将这些文件拷贝回去即可。
因此,lvm快照可以在很大程度上避免因为认为的误操作(如误删、误写)导致的数据丢失。然而,如果是磁盘级别的故障导致的数据丢失,则快照毫无办法。数据是企业的生命,因此衍生了大量的数据备份、冗余解决方案。更有专门的存储设备厂商生产专门的存储设备、提供相关的解决方案。这些东西暂时超出了目前介绍的范畴,大家了解即可。
在主机级别上,也有着常见的解决方案—RAID。他可以在磁盘级别为我们提供数据安全(一块或多块盘坏了数据不丢失甚至业务不中断)。下一节为大家简单介绍RAID技术。
关注本公众号获取最新更新
每周一、三、五稳定更新