内核dm模块:device mapper--->内核的一个管理模块,将一个或多个底层的块设备组织成 一个逻辑设备块。 具有以下功能 linear:类似Jbod,能够将多个磁盘的存储空间拼接在一块,当做一个磁盘来使用。 mirror:类似于镜像。 Snapshot:快照 Multipath:多路径,服务器节点和存储设备之间配置多条IO路径但仍视为一个单一存储设备。 lvm2: logic Volume Manager Version 2,支持动态缩减逻辑大小。
1. LVM2:
基本概念: PV : Physical Volume 物理卷,物理层面磁盘组成的磁盘卷,磁盘分区(或整个磁盘); VG : Volume Group 卷组,从多个PV中抽象出来的卷组,大小由取决于PV(物理卷)组合的大小; PE : PhysicalExtend,VG将PV所提供的容量再次以“块”的形式对外提供,逻辑存储单位; LV : Logical Volume 逻辑卷,可供挂载使用的设备文件,文件位置如下: /dev/dm-# ; /dev/mapper/VG-name-LV-name; /dev/VG_name/LV_name LVM的缺点 : 扩展风险低,缩减高; 数据损坏时,比较耗时; 使用物理磁盘越多,损坏的几率越高,必须有物理冗余配置。 pv管理工具: 对象: 可以是单个分区,磁盘,RAID pvs : 查看创建的pv pvcreate /dev/device :创建pv pvdispaly :查看pv的详细信息 pvscan :查看当前主机的pv pvmove /dev/device : 将一个pv中的数据移到其他的pv中 pvremove /dev/device : 删掉pv VG管理工具: 对象: VG vgs : 查看创建的vg vgcreate VGname /dev/device(建立了pv的设备): 创建卷组 -s 指定PE的大小,默认是4M vgdisplay : 查看vg的详细信息 vgremove VGname /dev/device(建立了pv的设备) : 移除vg ,移除前先要做pvmove vgreduce : 缩减一个vg vgextend : 扩展vg LV管理工具: lvs : 查看创建的lv lvdisplay : 查看创建的lv的详细信息 lvcreate -L #[MGT] -n LVname VGname: 创建逻辑卷组 lvremove /dev/VG_name/LV_name :移除一个逻辑卷 lvextend -L [+]#[MGT] /dev/VG_name/LV_name 扩展逻辑卷,可用+表示增加,不带+表示增加到; mkfs.ext4 /dev/VG_name/LV_name :逻辑卷创建文件系统 resize2fs /dev/VG_name/LV_name : 扩展文件系统,此命令只针对etfs文件系统;要求绝对路径 xfs_growfs /dev/VG_name/LV_name : 扩展文件系统,此命令只针对xfs文件系统; 要求绝对路径 注意,xfs_growfs不支持缩容。 缩减逻辑卷(存在风险) # umount /dev/VG_name/LV_name -----卸载,不能在线缩减 # e2fsck -f /dev/VG_name/LV_name ----检查 # resize2fs /dev/VG_name/LV_name #[MGT] ----文件系统缩减 # lvreduce -L [-]#[MGT] /dev/VG_name/LV_name ---逻辑卷缩减 # mount /dev/VG_name/LV_name -----挂回去
例子:把一个分区制成lv:
[root@localhost mnt]# fdisk -l /dev/sdb ---sdb1为83 ... Device Boot Start End Blocks Id System /dev/sdb1 2048 411647 204800 83 Linux [root@localhost mnt]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created. [root@localhost mnt]# vgcreate VG_data /dev/sdb1 Volume group "VG_data" successfully created [root@localhost mnt]# lvcreate -L 100M -n vg_data_lvdata VG_data Logical volume "vg_data_lvdata" created.
此时/dev下面多了dm-0文件,VG_data文件夹及mapper文件夹: vg_data_lvdata -> ../dm-0
[root@localhost mnt]# mkfs.ext4 /dev/VG_data/vg_data_lvdata .... [root@localhost /]# df -h Filesystem Size Used Avail Use% Mounted on .... /dev/mapper/VG_data-vg_data_lvdata 93M 1.6M 85M 2% /mydata [root@localhost mnt]# fdisk -l /dev/sdb ---sdb1为83,不是8e ... Device Boot Start End Blocks Id System /dev/sdb1 2048 411647 204800 83 Linux
将一个磁盘加入上述的lv:
[root@localhost mydata]# pvcreate /dev/sdc Physical volume "/dev/sdc" successfully created. [root@localhost mydata]# vgextend VG_data /dev/sdc Volume group "VG_data" successfully extended [root@localhost mydata]# vgs VG #PV #LV #SN Attr VSize VFree VG_data 2 1 0 wz--n- <2.19g <2.09g [root@localhost mydata]# lvextend -L 2.1G /dev/VG_data/vg_data_lvdata Rounding size to boundary between physical extents: 2.10 GiB. Size of logical volume VG_data/vg_data_lvdata changed from 100.00 MiB (25 extents) to 2.10 GiB (538 extents). Logical volume VG_data/vg_data_lvdata successfully resized. [root@localhost mydata]# resize2fs /dev/VG_data/vg_data_lvdata resize2fs 1.42.9 (28-Dec-2013) Filesystem at /dev/VG_data/vg_data_lvdata is mounted on /mydata; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 17 The filesystem on /dev/VG_data/vg_data_lvdata is now 2203648 blocks long. [root@localhost mydata]# df -h Filesystem Size Used Avail Use% Mounted on ... /dev/mapper/VG_data-vg_data_lvdata 2.1G 2.9M 2.0G 1% /mydata
2.快照:snapshot
条件:要求在同一卷组(VG)中 写时复制”(copy on write) 的实现方法(快照的一种实现方式): 数据不变时--->快照提供另一个访问路径访, 当一个snapshot创建的时候,仅拷贝原始卷里数据的元数据(meta- data); 原始卷上有写操作执行时---> snapshot跟踪原始卷块的改变,将要改变的数据在改变之前被拷贝到snapshot预留的空间里; 文件系统和设备驱动之间增加了一个cow层: file I/0 —>filesystem — >CoW –> block I /O 命令:lvcreate -L #[MGT] -n snapshot_lv -s original_lv 要求绝对路径 snapshot的大小考虑: (1). 与业务有关,保证业务周期内能够容纳改变的数据; (2). 一旦记录满了,就被释放变为无效,一定要在snapshot的生命周期里,完成需要的作业任务。 (3). 若大于原始卷,则生命周期几乎无限。 创建的快照包含了源卷的文件系统,应该是自动默认了跟原卷一样的文件系统。
[root@localhost mydata]# vgs VG #PV #LV #SN Attr VSize VFree VG_data 2 1 0 wz--n- <2.19g 88.00m [root@localhost mydata]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert vg_data_lvdata VG_data -wi-ao---- 2.10g [root@localhost mydata]# lvcreate -L 80M -n ss_lvdata -s /dev/VG_data/vg_data_lvdata Logical volume "ss_lvdata" created. [root@localhost mydata]# lvdisplay --- Logical volume --- LV Path /dev/VG_data/ss_lvdata LV Name ss_lvdata VG Name VG_data LV UUID 4ZpF80-c01c-QVjD-1Jen-tw61-1Yl0-Z4ysxr LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-07-27 03:12:34 -0700 LV snapshot status active destination for vg_data_lvdata LV Status available # open 0 LV Size 2.10 GiB Current LE 538 COW-table size 80.00 MiB COW-table LE 20 Allocated to snapshot 0.01% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3
在/mydata文件夹中复制17M一个文件,再查询ss_lvdata的使用情况:
[root@localhost mydata]# ll -lh total 34M -rw-r--r--. 1 root root 17M Jul 27 03:01 kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm -rw-r--r--. 1 root root 17M Jul 27 03:16 kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm.bak drwx------. 2 root root 12K Jul 27 02:25 lost+found -rw-r--r--. 1 root root 0 Jul 27 02:36 onefile.txt [root@localhost mydata]# lvdisplay --- Logical volume --- LV Path /dev/VG_data/ss_lvdata LV Name ss_lvdata VG Name VG_data LV UUID 4ZpF80-c01c-QVjD-1Jen-tw61-1Yl0-Z4ysxr LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-07-27 03:12:34 -0700 LV snapshot status active destination for vg_data_lvdata LV Status available # open 0 LV Size 2.10 GiB Current LE 538 COW-table size 80.00 MiB COW-table LE 20 Allocated to snapshot 21.08% Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3
如何恢复快照: (1). 要先卸载原始卷,再使用--merge(合并)恢复(此时快照snapshot_lv再恢复后自动删除),再mount回去。 命令 lvconvert --merge /dev/VG_name/snapshot_lv
[root@localhost /]# lvconvert --merge /dev/VG_data/ss_lvdata Merging of volume VG_data/ss_lvdata started. VG_data/vg_data_lvdata: Merged: 94.97% VG_data/vg_data_lvdata: Merged: 100.00% [root@localhost /]# mount /dev/VG_data/vg_data_lvdata /mydata [root@localhost mydata]# ls kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm lost+found onefile.txt
(2). 创建了快照后,出现快照逻辑卷,可以挂载该卷进行直接拷贝(不能直接拷贝回原始卷,要先找第三方存放) 拷贝一个大于80M的文件到原始卷,建立一个80M的快照卷,进行测试:
[root@localhost mydata]# ll -h total 1.1G -rw-r--r--. 1 root root 17M Jul 27 03:01 kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm drwx------. 2 root root 12K Jul 27 02:25 lost+found -rw-r--r--. 1 root root 0 Jul 27 02:36 onefile.txt -rwxr--r--. 1 root root 1020M Jul 27 07:57 wls1036_generic.jar [root@localhost mydata]# lvcreate -L 80M -n data_snap -s /dev/VG_data/vg_data_lvdata Logical volume "data_snap" created. [root@localhost mydata]# ll /dev/VG_data/ ----出现了data_sanp卷 total 0 lrwxrwxrwx. 1 root root 7 Jul 27 08:07 data_snap -> ../dm-3 lrwxrwxrwx. 1 root root 7 Jul 27 08:07 vg_data_lvdata -> ../dm-0 [root@localhost mapper]# ll total 0 crw-------. 1 root root 10, 236 Jul 24 07:03 control lrwxrwxrwx. 1 root root 7 Jul 27 08:30 VG_data-data_snap -> ../dm-3 lrwxrwxrwx. 1 root root 7 Jul 27 08:30 VG_data-data_snap-cow -> ../dm-2 ---有多个逻辑卷! lrwxrwxrwx. 1 root root 7 Jul 27 08:51 VG_data-vg_data_lvdata -> ../dm-0 lrwxrwxrwx. 1 root root 7 Jul 27 08:30 VG_data-vg_data_lvdata-real -> ../dm-1
快照是一个逻辑卷,就可以挂载:
[root@localhost mydata]# mount /dev/VG_data/data_snap /mydata_snap/ [root@localhost mydata]# ls kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm onefile.txt lost+found wls1036_generic.jar [root@localhost mydata_snap]# df -h ----原始卷和快照的一模一样 Filesystem Size Used Avail Use% Mounted on ... /dev/mapper/VG_data-vg_data_lvdata 2.1G 1.1G 953M 53% /mydata /dev/mapper/VG_data-data_snap 2.1G 1.1G 953M 53% /mydata_snap [root@localhost mydata]# lvdisplay .... --- Logical volume --- LV Path /dev/VG_data/data_snap LV Name data_snap VG Name VG_data LV UUID KzY5E2-N24d-ZkB1-8zwr-b4Yf-gQfx-A3UpOo LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-07-27 08:07:34 -0700 LV snapshot status active destination for vg_data_lvdata LV Status available # open 0 LV Size 2.10 GiB Current LE 538 COW-table size 80.00 MiB COW-table LE 20 Allocated to snapshot 0.01%
将大文件删除,查询快照卷的状态:
[root@localhost mydata]# rm wls1036_generic.jar rm: remove regular file ‘wls1036_generic.jar’? y [root@localhost mydata]# lvdisplay /dev/VG_data/data_snap --- Logical volume --- LV Path /dev/VG_data/data_snap LV Name data_snap VG Name VG_data LV UUID A66CrY-uHMs-X5I7-xu5q-zsC3-ebnS-PgMdjC LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-07-27 08:30:55 -0700 LV snapshot status active destination for vg_data_lvdata ----删除文件还是没问题的,因为没有写入 LV Status available # open 1 LV Size 2.10 GiB Current LE 538 COW-table size 80.00 MiB COW-table LE 20 Allocated to snapshot 0.47% ----删除文件只是很少的变化, Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3 [root@localhost mydata_snap]# df -h ----对比原始卷与快照的使用空间 Filesystem Size Used Avail Use% Mounted on .... /dev/mapper/VG_data-vg_data_lvdata 2.1G 20M 2.0G 1% /mydata /dev/mapper/VG_data-data_snap 2.1G 1.1G 953M 53% /mydata_snap
现在的情况是,原始卷的文件被删除了(没有写入数据,只是删除了文件的元数据),但快照卷保留了被删除文件的元数据。
[root@localhost mydata_snap]# dd if=/dev/VG_data/data_snap of=/dev/VG_data/vg_data_lvdata dd: error reading ‘/dev/VG_data/data_snap’: Input/output error ---爆了,这样拷贝不符合逻辑 335560+0 records in 335560+0 records out 171806720 bytes (172 MB) copied, 34.2349 s, 5.0 MB/s [root@localhost mydata]# ll ls: cannot access onefile.txt: No such file or directory ls: cannot access wls1036_generic.jar: No such file or directory total 17176 -rw-r--r--. 1 root root 17574084 Jul 27 03:01 kernel-devel-3.10.0-957.21.3.el7.x86_64.rpm drwx------. 2 root root 12288 Jul 27 02:25 lost+found -?????????? ? ? ? ? ? onefile.txt ---这文件扑街了! -?????????? ? ? ? ? ? wls1036_generic.jar [root@localhost mydata]# lvdisplay /dev/VG_data/data_snap --- Logical volume --- LV Path /dev/VG_data/data_snap LV Name data_snap VG Name VG_data LV UUID A66CrY-uHMs-X5I7-xu5q-zsC3-ebnS-PgMdjC LV Write Access read/write LV Creation host, time localhost.localdomain, 2019-07-27 08:30:55 -0700 LV snapshot status INACTIVE destination for vg_data_lvdata ---不可用的快照, LV Status available # open 1 LV Size 2.10 GiB Current LE 538 COW-table size 80.00 MiB COW-table LE 20 Snapshot chunk size 4.00 KiB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 8192 Block device 253:3
这种情况下,只能先通过快照卷将原始卷的数据拷贝到其它位置(不在原始卷范围内),然后拷贝回原始卷才能进行恢复; lsremove /dev/VG_data/data_snap 失败,要先用lsof命令核查原始卷和快照卷使用的进程kill掉; 另外,用第一种方法也不行,出现下面的信息,看来还是备份最可靠。
[root@localhost ~]# lvconvert --merge /dev/VG_data/data_snap Delaying merge since origin is open. Merging of snapshot VG_data/data_snap will occur on next activation of VG_data/lvdata.
从snapshot的实现思路,反向操作,操作快照不操作原始卷,是不是可以实现制作lv模板(原始卷)来创建虚拟机呢? 只要快照可以挂载和读写。 (1).虚拟机安装在一个lvm上,然后暂停虚拟机(原始卷成为模板); (2).做一个可读写的快照; (3).挂载快照卷启动并配置,在其上进行操作,生成一个新的虚拟机; 重复2~3可以创建多个虚拟机。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69934036/viewspace-2652012/ ,如需转载,请注明出处,否则将追究法律责任。