Loading... <p><strong><span style="font-size: 24px">目录:</span></strong></p> <p> 一、概述</p> <p> 二、LVM的相关概念</p> <p> 三、概念图</p> <p> 四、LVM基本操作</p> <p> 1.创建PV</p> <p> 2.查看PV信息</p> <p> 3.创建VG</p> <p> 4.查看VG信息</p> <p> 5.创建LV</p> <p> 6.查看LV信息</p> <p> 7.挂载LV</p> <p> 8.扩展卷组</p> <p> 9.缩减卷组</p> <p> 10.扩展逻辑卷</p> <p> 11.缩减逻辑卷</p> <p> 12.移除逻辑卷</p> <p> 13.移除卷组</p> <p> 14.移除物理卷</p> <p> 五、LVM快照实现</p> <p> 六、总结</p> <hr /> <p><span style="font-size: 24px">一、概述</span></p> <p> LVM全称是Logical Volume Manager,即逻辑卷管理器。它是Linux环境下对磁盘分区进行管理的一种机制;它可以将多个物理分区整合在一起,并且可以根据实际需要动态调整文件系统空间。另外,它还可以提供快照,快照在刚创建的时候,其内容是和原卷一模一样的,只有数据在原卷中发生变化的时候,快照会将被改动数据的原数据保存起来。</p> <p></p> <p><span style="font-size: 24px">二、LVM的相关概念</span></p> <p> 1.物理卷(Physical Volume)</p> <p> 物理卷是组成LVM的最底层的元素,即Linux上的物理分区。</p> <p> 2.卷组(Volume Group)</p> <p> 将各个独立的PV组合起来形成的一个存储空间就称为VG,VG的大小就是整个LVM的大小。</p> <p> 3.逻辑卷(Logical Volume)</p> <p> 可以被用户格式化、挂载并提供数据存储的对象就是LV。</p> <p> 4.物理扩展块(Physical Extent)</p> <p> PE相当于Linux分区中的block,它是LVM的最小存储单位,默认为4M。</p> <p></p> <p><span style="font-size: 24px">三、概念图</span></p> <p><img src="//cto.wang/usr/uploads/2016/07/20160703180449-95.jpg" title="1442622605728869.jpg" alt="lvm01.jpg" /></p> <p></p> <p><span style="font-size: 24px">四、LVM基本操作</span></p> <p> 1.创建PV</p> <p> 首先得先创建分区,并将分区的类型改为8e。在这里,我们可以按照以下方式分别创建/dev/sdb1、/dev/sdb2、/dev/sdc1、/dev/sdc2.</p> <p> 创建PV使用以下命令格式:</p> <p> pvcreate device_name</p> <p> 例如: pvcreate /dev/sdb1</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-2610, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +5G Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x05ff7b5d Device Boot Start End Blocks Id System /dev/sdb1 1 654 5253223+ 8e Linux LVM [root@localhost ~]# pvcreate /dev/sdb{1,2} /dev/sdc{1,2} Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created Physical volume "/dev/sdc1" successfully created Physical volume "/dev/sdc2" successfully created</pre> <p> 2.查看PV信息</p> <p> 使用的命令:</p> <p> (1)pvs 简要查看PV信息</p> <p> (2)pvsdisplay 详细查看PV信息。</p> <p> A.pvsdisplay 直接使用该命令,查看所有PV的信息。</p> <p> B.pvsdisplay device_name 表示查看device_name这个PV的信息。</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 lvm2 --- 5.01g 5.01g /dev/sdb2 lvm2 --- 5.01g 5.01g /dev/sdc1 lvm2 --- 5.01g 5.01g /dev/sdc2 lvm2 --- 5.01g 5.01g [root@localhost ~]# pvdisplay /dev/sdb1 "/dev/sdb1" is a new physical volume of "5.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 5.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID rZsvZG-nMf0-To7I-3k2X-fzEL-jkvk-eNFd6h</pre> <p> 3.创建VG</p> <p> 在有了PV之后,接下来我们要创建VG,创建VG使用以下命令:</p> <p> vgcreate VG_NAME PV_NAME</p> <p> -s PE:指定PE的大小</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# vgcreate testvg /dev/sd{b,c}1 Volume group "testvg" successfully created</pre> <p> 4.查看VG信息</p> <p> 查看VG使用以下命令:</p> <p> (1)vgs:简要查看VG信息。</p> <p> (2)vgdisplay:详细查看VG信息。</p> <p> A.vgdisplay: 直接使用该命令,查看所有VG的信息。</p> <p> B.vgdisplay VG_NAME: 表示查看这个VG的信息。</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 2 0 0 wz--n- 10.02g 10.02g [root@localhost ~]# vgdisplay testvg --- Volume group --- VG Name testvg System ID Format lvm2 Metadata Areas 2 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 2 Act PV 2 VG Size 10.02 GiB PE Size 4.00 MiB Total PE 2564 Alloc PE / Size 0 / 0 Free PE / Size 2564 / 10.02 GiB VG UUID zmjsxc-4KPf-LEcC-96zL-BBDY-N0Cs-buSQ6n</pre> <p> 5.创建LV</p> <p> 使用的命令:</p> <p> lvcreate -L SIZE -n LV_NAME VG_NAME</p> <p> -L 指定逻辑卷的大小</p> <p> -n 指定逻辑卷的名称</p> <p> -l PE的个数</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# lvcreate -L 5G -n mylv testvg Logical volume "mylv" created</pre> <p> 6.查看LV信息</p> <p> 查看LV使用以下命令:</p> <p> (1)lvs: 简要查看LV信息</p> <p> (2)lvdisplay 逻辑卷的设备文件名称: 详细查看LV信息</p> <p> 逻辑卷的设备文件名称路径:/dev/VG_NAME/LV_NAME 或者 /dev/mapper/VG_NAME-LV_NAME</p> <pre class="brush:bash;toolbar:false">[root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv testvg -wi-a----- 5.00g [root@localhost ~]# ll /dev/testvg/mylv lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/testvg/mylv -> ../dm-0 [root@localhost ~]# ll /dev/mapper/testvg-mylv lrwxrwxrwx 1 root root 7 Jul 24 01:19 /dev/mapper/testvg-mylv -> ../dm-0 [root@localhost ~]# lvdisplay /dev/testvg/mylv --- Logical volume --- LV Path /dev/testvg/mylv LV Name mylv VG Name testvg LV UUID cgrPIG-Zavs-GH9Z-55sR-MtSt-SFzg-SVETpG LV Write Access read/write LV Creation host, time localhost.localdomain, 2015-07-24 01:19:20 +0800 LV Status available # open 0 LV Size 5.00 GiB Current LE 1280 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0</pre> <p> 7.挂载LV</p> <p> 在挂载LV之前,我们要对LV进行格式化后再挂载,然后存放文件看是否正常。</p> <pre class="brush:bash;toolbar:false"># 格式化LV [root@localhost ~]# mke2fs -t ext4 /dev/testvg/mylv mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 327680 inodes, 1310720 blocks 65536 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=1342177280 40 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 29 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. # 挂载LV [root@localhost ~]# mount /dev/testvg/mylv /mnt # 查看挂载的分区信息 [root@localhost ~]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.1G 17G 6% / tmpfs 242M 0 242M 0% /dev/shm /dev/sda1 194M 26M 159M 14% /boot /dev/mapper/testvg-mylv 5.0G 138M 4.6G 3% /mnt # 测试存放文件 [root@localhost ~]# cp /etc/inittab /mnt/ [root@localhost mnt]# tail -4 /mnt/inittab # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault:</pre> <p> 8.扩展卷组</p> <p> 步骤:</p> <p> (1)准备好一个PV</p> <p> (2)使用vgextend命令完成扩展,命令格式:vgextend VG_NAME /PATH/TO/PV</p> <pre class="brush:bash;toolbar:false">#查看使用和未使用的PV,其中/dev/sdb2和/dev/sdc2都还未使用 [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 testvg lvm2 a-- 5.01g 8.00m /dev/sdb2 lvm2 --- 5.01g 5.01g /dev/sdc1 testvg lvm2 a-- 5.01g 5.01g /dev/sdc2 lvm2 --- 5.01g 5.01g #未扩展前的VG大小 [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 2 1 0 wz--n- 10.02g 5.02g #扩展VG [root@localhost ~]# vgextend testvg /dev/sdb2 Volume group "testvg" successfully extended #扩展后的VG大小 [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 3 1 0 wz--n- 15.02g 10.02g</pre> <p> 9.缩减卷组</p> <p> 步骤:</p> <p> (1)确定要移除的PV</p> <p> (2)将此PV上的数据转移至其他的PV</p> <p> 命令:pvmove PV_NAME</p> <p> (3)从卷组中将此PV移除</p> <p> 命令:vgreduce /PATH/TO/PV</p> <pre class="brush:bash;toolbar:false"># 查看已经使用在卷组中的PV [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 testvg lvm2 a-- 5.01g 8.00m /dev/sdb2 testvg lvm2 a-- 5.01g 5.01g /dev/sdc1 testvg lvm2 a-- 5.01g 5.01g /dev/sdc2 lvm2 --- 5.01g 5.01g # 现在确定要移除/dev/sdb1,在移除前需要将数据转移到其他PV [root@localhost ~]# pvmove /dev/sdb1 /dev/sdb1: Moved: 0.0% /dev/sdb1: Moved: 100.0% # 将PV从卷组中移除 [root@localhost ~]# vgreduce testvg /dev/sdb1 Removed "/dev/sdb1" from volume group "testvg" # 查看移除后的VG大小 [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 2 1 0 wz--n- 10.02g 5.02g</pre> <p> 10.扩展逻辑卷</p> <p> 步骤:</p> <p> (1)先确定扩展的LV大小,并确保对应卷组有足够的空间</p> <p> (2)扩展物理边界</p> <p> 使用lvextend命令:lvextend -L [+]SIZE /PATH/TO/LV</p> <p> 参数说明:</p> <p> -L [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE的容量;如果不带,表示扩展容量到SIZE,单位为"kKmMgGtT"</p> <p> -l [+]SIZE: 指定扩展的容量;如果带+号,表示扩展的容量是在原来的基础上加上SIZE个PE的容量;不带+号,表示扩展到SIZE个PE的容量</p> <p> SIZE: 表示数字</p> <p> (3)扩展逻辑边界</p> <p> 使用resize2fs /PATH/TO/DEVICE</p> <pre class="brush:bash;toolbar:false"># 确定VG的容量 [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 2 1 0 wz--n- 10.02g 5.02g # 未扩展前的LV容量 [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv testvg -wi-ao---- 5.00g # 扩展LV到8G,即物理边界 [root@localhost ~]# lvextend -L +3G /dev/testvg/mylv Size of logical volume testvg/mylv changed from 5.00 GiB (1280 extents) to 8.00 GiB (2048 extents). Logical volume mylv successfully resized # 查看挂载的LV大小,发觉还是5G,因为还没扩展逻辑边界 [root@localhost ~]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.1G 17G 6% / tmpfs 242M 0 242M 0% /dev/shm /dev/sda1 194M 26M 159M 14% /boot /dev/mapper/testvg-mylv 5.0G 139M 4.6G 3% /mnt # 扩展逻辑边界 [root@localhost ~]# resize2fs /dev/testvg/mylv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/testvg/mylv is mounted on /mnt; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/testvg/mylv to 2097152 (4k) blocks. The filesystem on /dev/testvg/mylv is now 2097152 blocks long. # 查看分区大小,文件系统大小也扩展了 [root@localhost ~]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.1G 17G 6% / tmpfs 242M 0 242M 0% /dev/shm /dev/sda1 194M 26M 159M 14% /boot /dev/mapper/testvg-mylv 7.9G 140M 7.4G 2% /mnt</pre> <p> 11.缩减逻辑卷</p> <p> 步骤:</p> <p> (1)确定缩减后的大小,至少确保缩减后能容纳原来的所有数据</p> <p> (2)执行缩减:</p> <p> A.因为缩减有风险,所以必须卸载并检测文件系统,使用e2fsck -f命令</p> <p> B.缩减逻辑边界,使用resize2fs命令</p> <p> resize2fs /path/to/device SIZE</p> <p> C.缩减物理边界,使用lvreduce命令</p> <p> lvreduce -L [-]SIZE /path/to/lv</p> <pre class="brush:bash;toolbar:false"># 卸载并强行检测 [root@localhost ~]# umount /mnt/ [root@localhost ~]# e2fsck -f /dev/testvg/mylv e2fsck 1.41.12 (17-May-2010) 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/testvg/mylv: 12/524288 files (0.0% non-contiguous), 68623/2097152 blocks # 缩减LV至3G,即逻辑边界 [root@localhost ~]# resize2fs /dev/testvg/mylv 3G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/testvg/mylv to 786432 (4k) blocks. The filesystem on /dev/testvg/mylv is now 786432 blocks long. # 缩减物理边界 [root@localhost ~]# lvreduce -L 3G /dev/testvg/mylv WARNING: Reducing active logical volume to 3.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv? [y/n]: y Size of logical volume testvg/mylv changed from 8.00 GiB (2048 extents) to 3.00 GiB (768 extents). Logical volume mylv successfully resized # 为确保安全,再次检测 [root@localhost ~]# e2fsck -f /dev/testvg/mylv e2fsck 1.41.12 (17-May-2010) 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/testvg/mylv: 12/196608 files (0.0% non-contiguous), 47100/786432 blocks # 挂载,查看分区大小并查看分区里面的文件是否正常 [root@localhost ~]# mount /dev/testvg/mylv /mnt/ [root@localhost ~]# df -lh Filesystem Size Used Avail Use% Mounted on /dev/sda3 20G 1.1G 17G 6% / tmpfs 242M 0 242M 0% /dev/shm /dev/sda1 194M 26M 159M 14% /boot /dev/mapper/testvg-mylv 3.0G 136M 2.7G 5% /mnt [root@localhost ~]# cd /mnt/ [root@localhost mnt]# tail -4 /mnt/inittab # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault:</pre> <p> 12.移除逻辑卷</p> <p> 移除逻辑卷之前,确保已经没有被挂载。此时使用lvremove /path/to/lv命令即可</p> <pre class="brush:bash;toolbar:false"># 查看逻辑卷 [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert hello_lv testvg -wi-a----- 1.00g mylv testvg owi-aos--- 3.00g # 移除hello_lv [root@localhost ~]# lvremove /dev/testvg/hello_lv Do you really want to remove active logical volume hello_lv? [y/n]: y Logical volume "hello_lv" successfully removed # 再次查看逻辑卷信息 [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv testvg owi-aos--- 3.00g</pre> <p> 13.移除卷组</p> <p> 使用vgremove VG_NAME</p> <pre class="brush:bash;toolbar:false"># 查看卷组信息 [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree testvg 2 0 0 wz--n- 10.02g 10.02g # 移除testvg [root@localhost ~]# vgremove testvg Volume group "testvg" successfully removed</pre> <p> 14.移除物理卷</p> <p> 使用pvremove PV_NAME命令</p> <pre class="brush:bash;toolbar:false"># 查看物理卷 [root@localhost ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb2 lvm2 --- 5.01g 5.01g /dev/sdc1 lvm2 --- 5.01g 5.01g /dev/sdc2 lvm2 --- 5.01g 5.01g # 移除物理卷 [root@localhost ~]# pvremove /dev/sdb2 Labels on physical volume "/dev/sdb2" successfully wiped [root@localhost ~]# pvremove /dev/sdc1 Labels on physical volume "/dev/sdc1" successfully wiped [root@localhost ~]# pvremove /dev/sdc2 Labels on physical volume "/dev/sdc2" successfully wiped</pre> <p></p> <p><span style="font-size: 24px">五、LVM快照实现</span></p> <p> 创建出来的快照卷是已经记录了原卷某个时刻所有文件的状态,在原卷没有做出修改之前,快照卷只是作为访问原卷的一个入口;一旦原卷中的文件发生改变的时候,系统会将原卷的文件复制一份到快照卷,这时的快照卷就不能作为访问原卷的入口了,快照卷里面只有原卷没有发生改变之前复制过来的文件。这时,我们就可以对快照卷里面的文件进行打包备份。</p> <p> 创建快照使用lvcreate命令,使用以下参数</p> <p> -L SIZE: 指定快照卷的大小</p> <p> -s: 表示创建快照卷</p> <p> -p r: 限制快照卷为只读访问</p> <p> -n LV_NAME: 指定快照卷的名称</p> <p> 示例:lvcreate -L SIZE -s -p r -n LV_NAME /path/to/lv</p> <pre class="brush:bash;toolbar:false"># 创建快照卷 [root@localhost mnt]# lvcreate -L 50M -s -p r -n mylv-snap /dev/testvg/mylv Rounding up size to full physical extent 52.00 MiB Logical volume "mylv-snap" created [root@localhost mnt]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv testvg owi-aos--- 3.00g mylv-snap testvg sri-a-s--- 52.00m mylv 0.02 # 挂载快照卷 [root@localhost ~]# mount -o ro /dev/testvg/mylv-snap /media/ # 查看快照卷,此时的快照卷只是作为原卷的入口,所以内容和快照卷的是一样的 [root@localhost mnt]# cd /media/ [root@localhost media]# ls inittab lost+found # 修改原卷的内容 [root@localhost mnt]# cp /etc/fstab /mnt/ [root@localhost mnt]# echo "Hello World" >> /mnt/inittab # 查看快照卷及里面的内容,发现没有新增的文件fstab,而且inittab的文件内容是和创建快照时一样 [root@localhost ~]# cd /media/ [root@localhost media]# ls inittab lost+found [root@localhost media]# tail -3 inittab # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # 打包备份 [root@localhost media]# tar zcf /tmp/backup.tar.gz /media/inittab tar: Removing leading `/' from member names [root@localhost media]# ls /tmp/backup.tar.gz /tmp/backup.tar.gz # 卸载快照卷 [root@localhost ~]# umount /media/</pre> <p></p> <p><span style="font-size: 24px">六、总结</span></p> <p> 创建LV的过程:</p> <p> 创建PV –> 创建VG –> 创建LV –> 格式化 –> 挂载</p> <p> 扩展卷组的过程:</p> <p> 准备PV –> 完成扩展</p> <p> 缩减卷组的过程:</p> <p> 确定移除的PV –> 转移移除PV的数据到别的PV –> 从卷组中移除PV</p> <p> 扩展逻辑卷的过程:</p> <p> 确定扩展大小 –> 扩展物理边界 –> 扩展逻辑边界</p> <p> 缩减逻辑卷的过程:</p> <p> 确定缩减大小 –> 卸载逻辑卷 –> 缩减逻辑边界 –> 缩减物理边界</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信