Lvm逻辑卷
Lvm逻辑卷管理(logical volume manager):
Lvm是Linux系统中对磁盘分区进行管理的一种逻辑卷机制,他是建立在硬盘和分区之上,文件系统之下的逻辑层,在建立系统时屏蔽了下层的磁盘分区布局,能够在保持现有数据不变的情况下动态调整磁盘容量,从而提高磁盘管理的灵活性。
普通的分区在容量用完以后,是不能在扩展的,但是lvm却可以,它可以是多个硬盘组成一个lvm来用。
注意:Boot文件最好放到普通分区里,不能放进lvm里面,因为lvm就是基于内核来运行的,而内核就放在boot文件中。
逻辑卷经过的几个步骤:
磁盘分区——>PV——>VG——>LV——>格式化,最后再挂载
创建物理卷(pv)
物理卷里有PE(基本单元,用于记录lvm属性,默认4m)
物理卷,需要在磁盘的基础上进行创建。所以需要先对磁盘进行分区,让磁盘可以正常使用。
[root@bogon ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。
更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。
Device does not contain a recognized partition table
使用磁盘标识符 0xd5fcc7f2 创建新的 DOS 磁盘标签。
命令(输入 m 获取帮助):n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p):
Using default response p
分区号 (1-4,默认 1):
起始 扇区 (2048-62914559,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-62914559,默认为 62914559):+7G
分区 1 已设置为 Linux 类型,大小设为 7 GiB
命令(输入 m 获取帮助):N
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
分区号 (2-4,默认 2):
起始 扇区 (14682112-62914559,默认为 14682112):
将使用默认值 14682112
Last 扇区, +扇区 or +size{K,M,G} (14682112-62914559,默认为 62914559):+7G
分区 2 已设置为 Linux 类型,大小设为 7 GiB
命令(输入 m 获取帮助):N
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
分区号 (3,4,默认 3):
起始 扇区 (29362176-62914559,默认为 29362176):
将使用默认值 29362176
Last 扇区, +扇区 or +size{K,M,G} (29362176-62914559,默认为 62914559):+7G
分区 3 已设置为 Linux 类型,大小设为 7 GiB
命令(输入 m 获取帮助):N
Partition type:
p primary (3 primary, 0 extended, 1 free)
e extended
Select (default e): P
已选择分区 4
起始 扇区 (44042240-62914559,默认为 44042240):
将使用默认值 44042240
Last 扇区, +扇区 or +size{K,M,G} (44042240-62914559,默认为 62914559):+7G
分区 4 已设置为 Linux 类型,大小设为 7 GiB
命令(输入 m 获取帮助):p
磁盘 /dev/sdb:32.2 GB, 32212254720 字节,62914560 个扇区
Units = 扇区 of 1 * 512 = 512 bytes
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:dos
磁盘标识符:0xd5fcc7f2
设备 Boot Start End Blocks Id System
/dev/sdb1 2048 14682111 7340032 83 Linux
/dev/sdb2 14682112 29362175 7340032 83 Linux
/dev/sdb3 29362176 44042239 7340032 83 Linux
/dev/sdb4 44042240 58722303 7340032 83 Linux
命令(输入 m 获取帮助):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
正在同步磁盘。
创建物理卷(pv)
[root@bogon ~]# pvcreate /dev/sdb[1234]
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdb3" successfully created.
Physical volume "/dev/sdb4" successfully created.
创建卷组(vg)
由一个或多个物理卷组成一个整体,即称之为卷组
这里把pv加入vg此处引入PE的概念
由于vg是多个PE(块)组成的,而去每个vg块的PE最大数量是65534。默认每个PE的大小是4m。
也就是说默认的每个vg最大也就是4m乘65534=356G,因此PE块的大小决定了最终vg的大小。
如果我们将PE的大小改为8m或者16m,那么vg的大小就又可以增大了。
如下命令:(更改PE的大小)
vgcreate –s 16M vgname 分区
[root@bogon ~]# vgcreate -s 16M myvg /dev/sdb[1234]
[root@bogon ~]# vgdisplay myvg
--- Volume group ---
VG Name myvg
System ID
Format lvm2
Metadata Areas 4
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 4
Act PV 4
VG Size <27.94 GiB
PE Size 16.00 MiB
Total PE 1788 //经过一块PE(16m)计算出来的vg PE数量
Alloc PE / Size 0 / 0
Free PE / Size 1788 / <27.94 GiB
VG UUID u2m7cQ-Poi1-0ecI-HydD-s1b3-I90Z-t8G2sF
创建逻辑卷(lv)
从卷组中分割出一块空间,用于创建逻辑卷
卷组也可以根据PE的数量来创建:
[root@bogon ~]# vgcreate -s 16M myvg /dev/sdb[1234]
Volume group "myvg" successfully created
[root@bogon mylv_bak]# lvdisplay /dev/myvg/mylv
--- Logical volume ---
LV Path /dev/myvg/mylv
LV Name mylv
VG Name myvg
LV UUID RSsJFf-7dW6-74z5-Fl1O-Wml7-Izd0-0N2Jvf
LV Write Access read/write
LV Creation host, time bogon, 2019-04-09 19:18:27 +0800
LV snapshot status source of
mylv_bak [active]
LV Status available
# open 1
LV Size 20.31 GiB
Current LE 1300
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:3
将逻辑卷格式化,然后再挂载
[root@bogon ~]# mkfs.xfs /dev/myvg/mylv
meta-data=/dev/myvg/mylv isize=512 agcount=4, agsize=1331200 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=5324800, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2600, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
挂载:
[root@bogon ~]# mkdir -p /backup/mylv
[root@bogon ~]# mount /dev/myvg/mylv /backup/mylv
创建数据:
[root@bogon mylv]# dd if=/dev/zero of=/backup/mylv/etst bs=1M count=500
记录了500+0 的读入
记录了500+0 的写出
524288000字节(524 MB)已复制,6.75637 秒,77.6 MB/秒
逻辑卷快照
LVM快照功能--我们知道LVM能够通过增减PE的数量来弹性调整文件系统的大小,除此之外,LVM还有另外一个重要的功能,LV磁盘快照,就是通过快照的功能将此时的文件系统信息记录下来,以后对该文件系统操作的时候,当该文件系统的数据变化的时候,我们可以利用快照将文件系统恢复至当时的状态。
LV的快照(snapshot)原理
左边的图表示,LVM会在VG上预留一定的区域作为快照区,原本lv中存放着数据,同时快照区存放着lv中元数据,因此快照区大小不需要和原始lv一样的大小。在刚创建snapshot的时候,快照区中并不会真实地拷贝原始lv中的数据,只是记录了整个原始lv中的元数据,所以这个时间点快照区和原始lv共享文件系统的数据,即两边的数据一样。
右边的图表示,当原始lv中的数据发生改变的时候,原始lv中的发生变化的PE的数据更新之前,会将数据真实地备份至快照区的一个PE中,如图中,A->new A之前,先将A备份至快照区的一个PE,然后lv中A才更新为new A,这样快照区会保存lv中PE发生变化之前的数据,这时候我们再访问快照区的内容仍然为创建snapshot那个时间点的时候lv中的数据,因此我们可以利用快照区进行备份和恢复。
需要注意的是,由于快照区也有容量的限制,所以呢,当原始lv中发生变化的PE的数量超过快照区的PE的数量的时候,该快照就会立即失效。
我们在创建快照区的时候,要考虑将来lv数据的变化量,以此来指定快照区的大小,一种解决办法是刚创建完快照之后,立即把快照区中的内容进行备份,这样就不用时刻考虑快照区会失效了,因为我们已经把他的数据备份走了。还有一种简单粗暴的方法就是创建一个和原始lv一样大小的快照区,这样就不用担心数据变化量的因素了。
上面逻辑卷已经创建好了,并且也往里面添加了数据,我们基于上面的环境来做快照。
创建lv快照
[root@localhost ~]# lvcreate -s -l 100 -n mylv /dev/myvg/mylv
Logical volume "mylv" created.
-s 关键选项,创建快照snap的意思
-l 后面跟快照包含多少个PE的数量
-n 后面跟创建的快照的名字
-p r 由于快照大多为只读,改选项为为修改权限位只读(r)
[root@bogon ~]# lvcreate -s -l 488 -n mylv_bak /dev/myvg/mylv
Logical volume "mylv_bak" created.
挂载快照:(注意,快照不需要格式化)
[root@bogon ~]# mkdir /backup/mylv_bak
[root@bogon ~]# mount /dev/myvg/mylv_bak /backup/mylv_bak/ -onouuid,ro
注意:如果快照源逻辑卷使用的是xfs的文件系统,挂载的时候需要加入-onouuid,ro选项
且创建快照的时候不能指定-p r 选项。
查看数据信息:
[root@bogon mylv_bak]# ls
etst
[root@bogon mylv_bak]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 40137576 4244908 35892668 11% /
devtmpfs 481844 0 481844 0% /dev
tmpfs 498976 0 498976 0% /dev/shm
tmpfs 498976 14356 484620 3% /run
tmpfs 498976 0 498976 0% /sys/fs/cgroup
/dev/sr0 4364408 4364408 0 100% /media/cdrom
/dev/sda1 1038336 160460 877876 16% /boot
/dev/mapper/centos-home 19593216 42792 19550424 1% /home
tmpfs 99796 0 99796 0% /run/user/0
/dev/mapper/myvg-mylv 21288800 544944 20743856 3% /backup/mylv
/dev/mapper/myvg-mylv_bak 21288800 544944 20743856 3% /backup/mylv_bak
可以看见两个数据一样。
快照恢复
当利用快照恢复系统的时候,不能使得要复原的数据量大于快照区所能承受的最大范围
① 修改原始lvm中的内容
[root@bogon mylv]# dd if=/dev/zero of=/backup/mylv/test bs=1M count=1000
记录了500+0 的读入
记录了500+0 的写出
524288000字节(524 MB)已复制,23.2335 秒,22.6 MB/秒
两个目录的使用率发生变化
[root@bogon mylv]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 40137576 4244888 35892688 11% /
devtmpfs 481844 0 481844 0% /dev
tmpfs 498976 0 498976 0% /dev/shm
tmpfs 498976 14356 484620 3% /run
tmpfs 498976 0 498976 0% /sys/fs/cgroup
/dev/sr0 4364408 4364408 0 100% /media/cdrom
/dev/sda1 1038336 160460 877876 16% /boot
/dev/mapper/centos-home 19593216 42792 19550424 1% /home
tmpfs 99796 0 99796 0% /run/user/0
/dev/mapper/myvg-mylv 21288800 1056944 20231856 5% /backup/mylv
/dev/mapper/myvg-mylv_bak 21288800 512176 20776624 3% /backup/mylv_bak
② 对快照区的数据进行打包压缩并备份
[root@bogon mylv_bak]#tar zcf test.tar.gz test
卸载原始lv重新格式化,再挂载
[root@bogon ~]#umount /dev/myvg/mylv
[root@bogon ~]#mkfs.xfs /dev/myvg/mylv
[root@bogon ~]#mount /dev/myvg/mylv /backup/mylv
③ 对原始lv进行数据恢复
[root@bogon mylv_bak]#tar zxf test.tar.gz –C /backup/mylv
④ 始lv恢复至原样
[root@bogon mylv_bak]# df
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/centos-root 40137576 4244908 35892668 11% /
devtmpfs 481844 0 481844 0% /dev
tmpfs 498976 0 498976 0% /dev/shm
tmpfs 498976 14356 484620 3% /run
tmpfs 498976 0 498976 0% /sys/fs/cgroup
/dev/sr0 4364408 4364408 0 100% /media/cdrom
/dev/sda1 1038336 160460 877876 16% /boot
/dev/mapper/centos-home 19593216 42792 19550424 1% /home
tmpfs 99796 0 99796 0% /run/user/0
/dev/mapper/myvg-mylv 21288800 544944 20743856 3% /backup/mylv
/dev/mapper/myvg-mylv_bak 21288800 544944 20743856 3% /backup/mylv_bak