Linux入门之磁盘管理(9)LVM逻辑卷案例

案例介绍阶段(1):

创建一个由两个物理卷组成的大小未20G的卷组myvg,要求其PE大小为16M;而在此卷组中创建一个大小未5G的逻辑卷lvtest,此逻辑卷要能在开机后自动挂载至/mnt/lvtest目录,且支持ACL功能。

 

1、准备工作

#这里我们分别从两个磁盘选择10G来准备组合为PV

[root@mzf ~]# fdisk -l | grep -o '/.*B'
/dev/sda: 21.5 GB
/dev/sdb: 21.5 GB
/dev/sdc: 21.5 GB
/dev/sdd: 10.7 GB
/dev/sde: 10.7 GB

#这里我们选择从sdb磁盘和sdbc磁盘中分别划分两个10G分区进行组合

[root@mzf ~]# fdisk -l | grep '^/dev/sd[bc][0-9]'
/dev/sdb1             1        1306    10490413+  8e  Linux LVM
/dev/sdc1             1        1306    10490413+  8e  Linux LVM

注意:这里使用fdisk进行的新增分区,在创建分区后,最后使用t子命令转换为8e表示分区类型为Linux LVM,表示LVM专用。

#显示刚才的210G分区

[root@mzf ~]# lsblk | grep -o 'sd[bc]1.*'
sdb1   8:17   0   10G  0 part 
sdc1   8:33   0   10G  0 part


2、创建pv物理卷

#将两个分区创建为pv物理卷

[root@mzf ~]# pvcreate /dev/sd{b,c}1
  Physical volume "/dev/sdb1" successfully created
  Physical volume "/dev/sdc1" successfully created

#查看pv物理卷

[root@mzf ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb1       lvm2 ---- 10.00g 10.00g
  /dev/sdc1       lvm2 ---- 10.00g 10.00g

#扫描pv

[root@mzf ~]# pvscan 
  PV /dev/sdb1                      lvm2 [10.00 GiB]
  PV /dev/sdc1                      lvm2 [10.00 GiB]
  Total: 2 [20.01 GiB] / in use: 0 [0   ] / in no VG: 2 [20.01 GiB]

解析:这里显示了当前pv总大小未20G,分别为两个10G pv组成,并且未使用,下面对其创建vg卷组。

 

3、创建vg组给指定pv分配PE

#指定vg组分配的PE大小每个为16M

[root@mzf ~]# vgcreate -s 16 myvg /dev/sd{b,c}1
  Volume group "myvg" successfully created

#查看当前vgmyvg中有2PV,总大小为20G

[root@mzf ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   2   0   0 wz--n- 20.00g 20.00g

#扫描为假,正在分配PE

[root@mzf ~]# vgscan 
  Reading all physical volumes.  This may take a while...
  Found volume group "myvg" using metadata type lvm2

#查看PV,以及显示被分配了VG组为myvg

[root@mzf ~]# pvs
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb1  myvg lvm2 a--u 10.00g 10.00g
  /dev/sdc1  myvg lvm2 a--u 10.00g 10.00g

#使用vgdisplay显示其分配的PE相关信息

[root@mzf ~]# vgdisplay myvg | grep -io '\(pe\|vg\).*size.*'
VG Size               20.00 GiB
PE Size               16.00 MiB
PE / Size       0 / 0   
PE / Size       1280 / 20.00 GiB

解析:这里显示每个PE占用大小为16M,总共有1280个分区,0个使用。

 

4、创建一个5G 的lv逻辑卷

#创建lv逻辑卷大小未5G,逻辑卷名称为lvtest

[root@mzf ~]# lvcreate -n lvtest -L 5G myvg
  Logical volume "lvtest" created.

#扫描LV,显示分配了5G

[root@mzf ~]# lvscan
  ACTIVE            '/dev/myvg/lvtest' [5.00 GiB] inherit

#显示lv列表

[root@mzf ~]# lvs
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest myvg -wi-a----- 5.00g

#再次查看vg列表,发现LV列中为1,表示myvg组中有1个逻辑卷,剩余15G

[root@mzf ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   2   1   0 wz--n- 20.00g 15.00g

 

6、创建文件系统,添加测试数据

#格式化为ext4文件系统

[root@mzf ~]# mke2fs -t ext4 -L lvtest /dev/myvg/lvtest

#测试是否已经被分配了UUID

[root@mzf ~]# blkid /dev/myvg/lvtest 
/dev/myvg/lvtest: LABEL="lvtest" UUID="8b5e3d38-33ed-40b3-a53b-d7b039099378" TYPE="ext4"

#挂载分区

[root@mzf ~]# mkdir /mnt/lvtest; mount /dev/myvg/lvtest /mnt/lvtest

#查看分区占用大小及总大小

[root@mzf ~]# df -Ph | grep '/mnt/lvtest'
/dev/mapper/myvg-lvtest  4.8G   10M  4.6G   1% /mnt/lvtest

#添加测试数据

[root@mzf ~]# cp /etc/issue /mnt/lvtest/
[root@mzf ~]# cat /mnt/lvtest/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m

#修改文件数据

[root@mzf ~]# echo '************' >> /mnt/lvtest/issue 
[root@mzf ~]# cat /mnt/lvtest/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************


7、设置自动挂载

#使用vim编辑/etc/fstab配置文件

[root@mzf ~]# vim /etc/fstab

wKiom1fIKpqjnbOCAAAD2udhQQw995.png 

#读出lvtestUUIDtype信息写入到文件

wKioL1fIKqPQ9QAmAAAE-0Jz2Gc478.png 

#添加额外功能acl

[root@mzf ~]# grep '/mnt/lvtest' /etc/fstab
UUID="8b5e3d38-33ed-40b3-a53b-d7b039099378" /mnt/lvtest ext4   defaults,acl  0 0

#刚才进行了挂载,因此先卸载,去重读fstab配置

[root@mzf ~]# umount /dev/myvg/lvtest

#查看lvtest逻辑卷是否已经启用了acl功能

[root@mzf ~]# mount | grep '.*lvtest'
/dev/mapper/myvg-lvtest on /mnt/lvtest type ext4 (rw,acl)

 

案例介绍阶段(2):

新建用户archlinux,要求其家目录为/mnt/lvtest/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录

 

8、添加文件及用户设置

#添加用户archlinux并设置指定目录为其家目录

[root@mzf ~]# useradd -d /mnt/lvtest/archlinux archlinux && echo "123456" | passwd --stdin archlinux
Changing password for user archlinux.
passwd: all authentication tokens updated successfully.

#切换用户

[root@mzf ~]# su - archlinux

#查看当前登录用户

[archlinux@mzf ~]$ whoami
archlinux

#查看当前所在目录

[archlinux@mzf ~]$ pwd
/mnt/lvtest/archlinux

#拷贝目录

[archlinux@mzf ~]$ cp -r /etc/pam.d/ /mnt/lvtest/archlinux/

#查看目录中的文件个数,有57

[archlinux@mzf ~]$ ls /mnt/lvtest/archlinux/pam.d/ | sed -n '$='
57

 

案例介绍阶段(3):

扩展testlv至7G,要求archlinux用户的文件不能丢失

 

准备工作:

#查看分区的占用大小,只用了11M,总4.8G,剩余4.6G

[root@mzf ~]# df -Ph | grep 'lvtest'
/dev/mapper/myvg-lvtest  4.8G   11M  4.6G   1% /mnt/lvtest

#查看lv逻辑卷总大小为5G

[root@mzf ~]# lvs /dev/myvg/lvtest 
  LV     VG   Attr  LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest myvg -wi-ao---- 5.00g

#查看myvg卷组中还预留剩余15G空间可用于扩展  

[root@mzf ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   2   1   0 wz--n- 20.00g 15.00g

进行扩展:

#扩展逻辑卷大小,由上面得知lvtest原本为5G,扩展到7G加上2G即可

[root@mzf ~]# lvextend -L +2G /dev/myvg/lvtest 
  Size of logical volume myvg/lvtest changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
  Logical volume lvtest successfully resized.

#再次查看lvtest逻辑卷大小,已经变成了5G

[root@mzf ~]# lvs /dev/myvg/lvtest 
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest myvg -wi-ao---- 7.00g

#查看物理大小,发现并未改变

[root@mzf ~]# df -Ph | grep 'lvtest'
/dev/mapper/myvg-lvtest  4.8G   11M  4.6G   1% /mnt/lvtest

#重新设置物理卷大小为扩展到7G

[root@mzf ~]# resize2fs /dev/myvg/lvtest 7G
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/myvg/lvtest is mounted on /mnt/lvtest; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/myvg/lvtest to 1835008 (4k) blocks.
The filesystem on /dev/myvg/lvtest is now 1835008 blocks long.

#再次查看,总大小6.8G,显示的一些小误差而已,已经扩展成功

[root@mzf ~]# df -Ph | grep 'lvtest'
/dev/mapper/myvg-lvtest  6.8G   12M  6.5G   1% /mnt/lvtest

#下面检查文件数据是否损坏和丢失,查看刚才修改的issue文件

[root@mzf ~]# cat /mnt/lvtest/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************

#查看拷贝的pam.d目录下的文件个数,任然是57个没有丢失

[root@mzf ~]# ls /mnt/lvtest/archlinux/pam.d | sed -n '$='
57

 

案例介绍阶段(4)

收缩testlv至3G,要求archlinux用户的文件不能丢失


准备工作

#必须先卸载,否则缩减会失败

[root@mzf ~]# umount /dev/myvg/lvtest

#必须先检查文件系统是否完好

[root@mzf ~]# e2fsck -f /dev/myvg/lvtest 
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
lvtest: 80/458752 files (0.0% non-contiguous), 64511/1835008 blocks

#上次查看得知分区剩余6.5G,占用了11M,缩减到3G,是够的,下面缩减物理卷

[root@mzf ~]# resize2fs /dev/myvg/lvtest 3G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/myvg/lvtest to 786432 (4k) blocks.
The filesystem on /dev/myvg/lvtest is now 786432 blocks long.

#缩减逻辑卷

[root@mzf ~]# lvreduce -L 3G /dev/myvg/lvtest 
  WARNING: Reducing active logical volume to 3.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce myvg/lvtest? [y/n]: y
  Size of logical volume myvg/lvtest changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).
  Logical volume lvtest successfully resized.

注意:缩减逻辑会提示警告可能会有损数据,当然准备好上面的准备工作来降低缩减失败率,最后在缩减前先将其分区中文件进行备份。

#再次查看逻辑卷大小,已经缩减到3G

[root@mzf ~]# lvs /dev/myvg/lvtest 
  LV     VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest myvg -wi-a----- 3.00g

#再次挂载

[root@mzf ~]# mount -a

#物理卷也被缩减改为3G左右

[root@mzf ~]# df -Ph | grep 'lvtest'
/dev/mapper/myvg-lvtest  2.9G  7.8M  2.7G   1% /mnt/lvtest

#检查分区中数据是否损坏和缺少,issue文件内容完整

[root@mzf ~]# cat /mnt/lvtest/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************

#查看pam.d目录中文件个数,仍然是57

[root@mzf ~]# ls /mnt/lvtest/archlinux/pam.d/ | wc -l 
57


案例介绍阶段(5)

对testlv创建快照,并尝试基于快照备份数据,验正快照的功能

 

创建快照卷

#创建一个3G大小的基于lvtest逻辑卷的快照卷,并设置为只读

[root@mzf ~]# lvcreate -n lvtest-sanp -L 3G -p r -s /dev/myvg/lvtest 
  Logical volume "lvtest-sanp" created.

#查看lvs,这里显示它们在同一个vg

[root@mzf ~]# lvs
  LV       VG   Attr      LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lvtest    myvg owi-aos---     3.00g                                                    
  lvtest-sanp  myvg sri-a-s---  3.00g      lvtest 0.00

注意:Attr属性那列中lvtest中为owi,而lvtest-sanp快照卷为sri,表示为快照


使用快照卷

#挂载快照卷

[root@mzf ~]# mkdir /mnt/lvtest-sanp && mount /dev/myvg/lvtest-sanp /mnt/lvtest-sanp 
mount:block device /dev/mapper/myvg-lvtest--sanp is write-protected, mounting read-only

#查看快照卷数据文件

[root@mzf ~]# cat /mnt/lvtest-sanp/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************

#查看pam.d目录下文件任然为57

[root@mzf ~]# ls /mnt/lvtest-sanp/archlinux/pam.d/ | grep -n $ | tail -1 | cut -d: -f1
57

#下面修改原逻辑卷中文件数据

[root@mzf ~]# echo {1..10} > /mnt/lvtest/issue
[root@mzf ~]# cat !$
cat /mnt/lvtest/issue
1 2 3 4 5 6 7 8 9 10

#删除原逻辑卷中pam.d目录下几个文件

[root@mzf ~]# rm -f /mnt/lvtest/archlinux/pam.d/c*

#原逻辑卷中pam.d文件夹只有51个文件了

[root@mzf ~]# ls /mnt/lvtest/archlinux/pam.d/ | wc -l
51

#下面查看快照卷中数据issue文件,并未改变

[root@mzf ~]# cat /mnt/lvtest-sanp/issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************

#查看快照卷中的pam.d目录是否还是57

[root@mzf ~]# ls /mnt/lvtest-sanp/archlinux/pam.d/ | wc -l
57

 

下面我们将逻辑卷中的数据还原

#备份快照卷数据

[root@mzf ~]# tar -jcf /tmp/lvtest.tar.bz2 /mnt/lvtest-sanp/
tar: Removing leading `/' from member names

#查看备份文件已经生成

[root@mzf ~]# ls -l /tmp/lvtest.tar.bz2 
-rw-r--r--. 1 root root 3849 Aug 18 22:30 /tmp/lvtest.tar.bz2

#还原文件及目录结构

[root@mzf lvtest]# tar -jxf /tmp/lvtest.tar.bz2 -C ./ 
[root@mzf lvtest]# ls
mnt
[root@mzf lvtest]# mv mnt/lvtest-sanp/* ./
[root@mzf lvtest]# rmdir mnt/lvtest-sanp/

解析:默认tar命令会保存全路径,所有要进行目录结构调整,当然也可以可以切换到指定目录下进行打包压缩,更方便使用目录结构

#查看文件内容,已经恢复到了原来逻辑卷中的数据状态

[root@mzf lvtest]# ls
archlinux  issue  lost+found  mnt
[root@mzf lvtest]# cat issue 
CentOS release 6.8 (Final)
Kernel \r on an \m
************
[root@mzf lvtest]# ls archlinux/pam.d/ | wc -l
57

解析:这里表示已经完全还原回来了,原来快照卷只从被创建,里面的文件就只是保存原本未改变的数据,如果原文件被改变,那么快照卷卷就会将原文件未改变的数据存入快照卷,实际上快照卷无需很多,里面只是存放被改变的文件后删除文件后原来的文件内容或文件结构。因此快照卷只是做了一个原数据保留。