LVM管理 快照卷 补充部分(dd  diff patch)


涉及到的命令:pvcreate、pvdisplay、pvs、pvremove、pvmove、vgcreate、vgdisplay、vgs、vgscan、vgremove、vgextend、vgreduce、lvcreate、lvdisplay、lvs、lvscan、lvresize、lvextend、lvreduce、lvremove、resize2fs、dd、diff、patch


Logical Volume Manager 逻辑卷管理

======================理论部分=====================

使用DM的机制(device mapper 设备映射)

功用:将一个或多个底层设备(包括RAID)组织一个逻辑存储空间,其边界可以动态扩展或缩减

PE

pysical  extent 物理块;LVM寻址的最小单元,默认4M,可以修改。所以物理卷是由大小相等基本单元PE组成

LE

logical  extent 逻辑块;逻辑卷LV也被划分为可被寻址的基本单位,称为LE。在同一个卷组中,LE的大小和PE是相同的,并且一一对应

三个层次组成

PV --> VG --> LV 

PV  物理卷,是lvm的基本存储逻辑块

VG  卷组,由多个物理卷(PV)组成,形成一个大的资源池

LV  逻辑卷,建立在卷组之上(VG),可以在LV之上进行建立文件系统,然后挂载使用


可以想像成多个分区创建为PV,然后一个或者多个PV组成VG,在VG中划出一定的空间给到VG,可以针对VG进行格式化文件系统,然后挂载使用


PV相关命令

pvcreate    pvdisplay    pvs    pvscan    pvremove(删除pv)    pvmove(数据移到别的pv)


VG相关命令

vgcreate    vgdisplay     vgs    vgscan     vgremove     vgextend(扩展)     vgreduce(缩小)


LV相关命令

lvcreate    lvdisplay    lvs    lvscan    lvresize    lvextend(扩展)    lvreduce(缩小)    lvremove



注意:创建块设备(分区),其ID要调整为8e  Linux LVM



创建PV:


/dev/sda6            5419        6724    10487426+  8e  Linux LVM(类型为8e Linux LVM)


[root@localhost ~]# pvcreate /dev/sda6

WARNING: software RAID md superblock detected on /dev/sda6. Wipe it? [y/n]: y

 Wiping software RAID md superblock on /dev/sda6.

 Physical volume "/dev/sda6" successfully created


  

[root@localhost ~]# pvcreate /dev/sdb1

WARNING: software RAID md superblock detected on /dev/sdb1. Wipe it? [y/n]: y

 Wiping software RAID md superblock on /dev/sdb1.

 Physical volume "/dev/sdb1" successfully created


[root@localhost ~]# pvs

 PV         VG   Fmt  Attr PSize  PFree 

 /dev/sda6       lvm2 ---  10.00g 10.00g

 /dev/sdb1       lvm2 ---  10.00g 10.00g

[root@localhost ~]# pvdisplay 

 "/dev/sda6" is a new physical volume of "10.00 GiB"

 --- NEW Physical volume ---

 PV Name               /dev/sda6

 VG Name               

 PV Size               10.00 GiB

 Allocatable           NO

 PE Size               0   

 Total PE              0

 Free PE               0

 Allocated PE          0

 PV UUID               PTLDyi-ygp9-uXlm-I5sa-j3zG-iszK-D1BvPl

  

 "/dev/sdb1" is a new physical volume of "10.00 GiB"

 --- NEW Physical volume ---

 PV Name               /dev/sdb1

 VG Name               

 PV Size               10.00 GiB

 Allocatable           NO

 PE Size               0   

 Total PE              0

 Free PE               0

 Allocated PE          0

 PV UUID               qv5k83-mgj3-UTeG-e326-3mfa-6Mqa-GVqXgU


一个或者多个PV组合创建成VG  

vgcreate   常用选项

-s    指明pe size  大小   ,如果不指明大小,默认为4M

-t    仅做测试,不实际创建

-v    显示过程

[root@localhost ~]# vgcreate test_vg /dev/sda6 /dev/sdb1

 Volume group "test_vg" successfully created

[root@localhost ~]# vgs

 VG      #PV #LV #SN Attr   VSize  VFree 

 test_vg   2   0   0 wz--n- 20.00g 20.00g

[root@localhost ~]# vgdisplay 

 --- Volume group ---

 VG Name               test_vg

 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               20.00 GiB

 PE Size               4.00 MiB

 Total PE              5120

 Alloc PE / Size       0 / 0   

 Free  PE / Size       5120 / 20.00 GiB

 VG UUID               CPb57B-VPO8-6U53-6wYn-dlrT-7O4T-RBUDB7


在VG中新建LV

LV  (注意:lv的大小必须为pv的整数倍)

格式:lvcreate    -L  #[KMGTP]  -n  lv_name    vg_name

[root@localhost ~]# lvcreate -L 10G -n test_lv test_vg

 Logical volume "test_lv" created.


 

lv创建后的路径是:/dev/vg_name/lv_name   或者  /dev/mapper/vg_name-lv_name   实际路径为:/dev/dm-#

[root@localhost ~]# ll /dev/test_vg/test_lv 

lrwxrwxrwx. 1 root root 7 10月 28 23:16 /dev/test_vg/test_lv -> ../dm-0

[root@localhost ~]# ll /dev/mapper/test_vg-test_lv 

lrwxrwxrwx. 1 root root 7 10月 28 23:16 /dev/mapper/test_vg-test_lv -> ../dm-0



=====================================================


缩减vg:通过vg中移出pv实现

注意:计划移出的pv不能包含已经存储数据的pe,如果有,需要先使用pvmove把数据移到别的pv上

pvmove /dev/some_pv

vgreduce VG_NAME  /dev/some_pv


扩展vg,向vg中添加更多的pv来实现

vgextend  VG_NAME  /dev/some_pv


=====================================================


扩展lv

可以动态的,不影响数据的情况下,在线扩展


存储设备有:物理边界  (分区大小)

文件系统有:逻辑边界


对于扩展而言,要先扩展物理边界,然后拉伸逻辑边界


扩展lv过程:

1、确定目标大小,要确保此lv中有足够的空闲空间可用

2、扩展物理边界(  如果是从2G-->4G,可以直接指定4G,或者+2G;“+”的作用)

lvextend -L [+]#[bkmgt...]  /dev/vgname/lvname

3、拉伸逻辑边界

resizee2fs  /dev/vg_name/lv_name 


缩减lv (有风险)

1、缩减要离线

2、首先要缩减文件系统大小,再缩减lv的大小


过程:

1、确定目标大小,缩减后的大小能够容纳现有数据大小

2、卸载逻辑卷,并强制做文件系统一致性检查(e2fsck -f  /dev/vg_name/lv_name)

3、缩减逻辑边界

resize2fs   /dev/vg_name/lv_name  #[bKMG...]

4、缩减物理边界

lvreduce  -L [-]#[BKMG...]   /dev/vg_name/lv_name


=====================================================

快照卷

    作用:访问原卷上数据的另一个路径,备份工具可以通过此路径完成数据备份

原因:通过原卷直接备份,可能会造成时间点不一致,通过快照卷就可以避免此问题,如果数据的时间点未发生改变,则直接从原卷上复制,原卷上的数据改变前复制一份到快照卷,数据时间点发生改变,则从快照卷中复制而不是从原卷中复制

注意:快照卷自身仅是为了备份工具提供一个时间点一致的访问路径


快照卷的生命周期:备份开始之前创建快照卷,完成之后即可删除


如何保证通过快照缩放访问到的数据的时间点一致?

    通过把那些将要发生改变的,位于原卷上的数据自动复制一份到快照卷,因此快照卷上的数据如果有效,则必须能完成存储原卷即将发生改变的所有数据的原来版本。(快照卷只读)


创建快照卷

1、快照卷要与原卷在同一卷组中,因此创建快照卷无需指定卷组

2、快照卷的大小要精心设定,另外快照卷是只读的(在复制的时间内,快照卷的大小要能保证超过原卷数据变动的大小)


lvcreate  

-s  --snapshot快照

-p  permission [r|rw]  权限只读或读写


格式:lvcreate -L  SIZE  -n  NAME  -p  r   -s  /dev/VGNAME/LVNAME


如:lvcreate -L 50M -n mylv-snapshot -p r -s /dev/myvg/mylv


复制完成以后就可以删除快照卷

umount   /MNT  挂载点

lvremove /dev/myvg/mylv-snapshot

=========================================================


补充部分


dd命令


dd if=  of=   bs=    count=

if:源文件

of:目标文件

bs:block size ,一次io的数据量

count: 复制多少个bs


如果不指定bs  count 则表示复制整个文件


两个设备文件

/dev/null     

/dev/zero    


dd  if=/dev/zero  of=/tmp/test   bs=1M  count=64   #创建一个大小为64M的文件


应用1:

可以把创建的回环文件当作swap分区文件来使用:

mkswap  /tmp/test

swapon /tmp/test


应用2:

备份MBR

dd  if=/dev/sda  of=/backup/mbr.bak  bs=512  count=1


应用3:破坏mbr

dd if=/dev/zero  of=/dev/sda   bs=512 count=1




文本比较、补丁制作及打补丁工具

diff  

    diff  -u  file1   file2  (一般把file2代表新文件,放在后面)

patch

   diff -u  file.old   file.new   >  file.patch            制作补丁文件

patch  file.old   <   file.patch      将补丁文件打到原文件上




==============================================================

练习题:

1、创建一个至少有两个物理卷组成的大小为20G的卷组,要求PE大小为8M,而在卷组中创建一个大小为5G的逻辑卷mylv1,格式化为ext4文件系统,开机自动挂载至/users目录,支持acl

A、创建两个分区,各10G,ID调整为8e Linux LVM,过程略

B、创建PV

[root@localhost ~]# pvcreate /dev/sdb2 /dev/sda7

Physical volume "/dev/sdb2" successfully created

Physical volume "/dev/sda7" successfully created

[root@localhost ~]# pvs

 PV         VG      Fmt  Attr PSize  PFree 

 /dev/sda6  test_vg lvm2 a--  10.00g     0 

 /dev/sda7          lvm2 ---  10.00g 10.00g

 /dev/sdb1  test_vg lvm2 a--  10.00g 10.00g

 /dev/sdb2          lvm2 ---  10.00g 10.00g

C、创建VG,指定PE大小为8M,命名为MYVG

[root@localhost ~]# vgcreate MYVG -s 8M /dev/sda7 /dev/sdb2

Volume group "MYVG" successfully created

D、在卷组中创建一个大小为5G的逻辑卷MYLV1

[root@localhost ~]# lvcreate -L 5G -n MYLV1 MYVG

 Logical volume "MYLV1" created.

[root@localhost ~]# lvs

 LV      VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 MYLV1   MYVG    -wi-a-----  5.00g                                                    

 test_lv test_vg -wi-ao---- 10.00g 

E、格式化为ext4文件系统,修改/etc/fstab开机自动挂载并支持acl

[root@localhost ~]# mkfs.ext4 /dev/MYVG/MYLV1 

[root@localhost ~]# blkid /dev/MYVG/MYLV1 

/dev/MYVG/MYLV1: UUID="968ea16b-f515-4b0e-a8f4-50b4c5dfc825" TYPE="ext4" 

[root@localhost ~]# mkdir /users

[root@localhost ~]# echo "UUID=968ea16b-f515-4b0e-a8f4-50b4c5dfc825  /users ext4 defaults,acl 0 0" >> /etc/fstab 

[root@localhost ~]# tail -3 /etc/fstab 

proc                    /proc                   proc    defaults        0 0

UUID=786b54c9-d523-421f-80e3-535618f88b4a /backup ext4 defaults,noatime,acl 0 0

UUID=968ea16b-f515-4b0e-a8f4-50b4c5dfc825  /users ext4 defaults,acl 0 0

[root@localhost ~]# mount -a


2、新建用户magedu,其家目录为/users/magedu,而后su切换至此用户,复制多个文件到家目录

A、新建用户,指定家目录

[root@localhost ~]# useradd -d /users/magedu magedu

[root@localhost ~]# ll /users/

总用量 20

drwx------. 2 root   root   16384 10月 29 13:54 lost+found

drwx------. 4 magedu magedu  4096 10月 29 14:01 magedu

B、su切换到magedu,复制多个文件到家目录

[root@localhost ~]# su magedu

[magedu@localhost root]$ cd

复制过程略

[magedu@localhost ~]$ ll

总用量 108

drwxr-xr-x.  2 magedu magedu  4096 10月 29 14:06 account

drwxr-xr-x. 15 magedu magedu  4096 10月 29 14:06 cache

......太多,省略

drwxr-xr-x.  6 magedu magedu  4096 10月 29 14:06 www

drwxr-xr-x.  3 magedu magedu  4096 10月 29 14:06 yp

[magedu@localhost ~]$ du -sh

398M .


3、扩展mylv1至9G,确保扩展完成后原数据完全可用

扩展可以在线扩展,不影响数据

A、先扩展LV(从5G扩展至9G 可以:lvextend -L +4G  或者lvextend -L 9G两种方式都可以)

[root@localhost ~]# lvextend -L +4G /dev/MYVG/MYLV1 

 Size of logical volume MYVG/MYLV1 changed from 5.00 GiB (640 extents) to 9.00 GiB (1152 extents).

 Logical volume MYLV1 successfully resized

B、调整文件系统大小

[root@localhost ~]# resize2fs /dev/MYVG/MYLV1 

resize2fs 1.41.12 (17-May-2010)

Filesystem at /dev/MYVG/MYLV1 is mounted on /users; on-line resizing required

old desc_blocks = 1, new_desc_blocks = 1

Performing an on-line resize of /dev/MYVG/MYLV1 to 2359296 (4k) blocks.

The filesystem on /dev/MYVG/MYLV1 is now 2359296 blocks long.


[root@localhost ~]# lvs

 LV      VG      Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert

 MYLV1   MYVG    -wi-ao----  9.00g                                                    

 test_lv test_vg -wi-ao---- 10.00g                                                    


大小没变,文件内容也正常,数据无损 

[root@localhost ~]# du -sh /users/magedu/

398M /users/magedu/



4、缩减mylv1至7G,确保缩减后数据可用

A、必须先卸载,离线进行

[root@localhost ~]# umount /users/

B、磁盘检查

[root@localhost ~]# e2fsck -f /dev/MYVG/MYLV1 

C、调整文件系统大小

[root@localhost ~]# resize2fs /dev/MYVG/MYLV1 7G

resize2fs 1.41.12 (17-May-2010)

Resizing the filesystem on /dev/MYVG/MYLV1 to 1835008 (4k) blocks.

The filesystem on /dev/MYVG/MYLV1 is now 1835008 blocks long.

D、缩减LV大小(从9G缩减至7G,可以:lvreduce -L -2G 或者lvreduce  -L 7G 是一样的)

[root@localhost ~]# lvreduce  -L -2G /dev/MYVG/MYLV1 

 WARNING: Reducing active logical volume to 7.00 GiB

 THIS MAY DESTROY YOUR DATA (filesystem etc.)

Do you really want to reduce MYLV1? [y/n]: y

 Size of logical volume MYVG/MYLV1 changed from 9.00 GiB (1152 extents) to 7.00 GiB (896 extents).

 Logical volume MYLV1 successfully resized

F、挂载后检查数据

[root@localhost ~]# mount /dev/MYVG/MYLV1 /users/

[root@localhost ~]# du -sh /users/

398M /users/

[root@localhost ~]# cat /users/magedu/fstab 


#

# /etc/fstab

# Created by anaconda on Tue Oct 27 22:23:02 2015

......内容略 


5、对mylv1创建快照,并通过备份数据,要求保留原有的属主属组等信息

A、创建快照

[root@localhost ~]# lvcreate -L 80M -n MYLV1-snapshot -p r -s /dev/MYVG/MYLV1 

Logical volume "MYLV1-snapshot" created.

可以看出,创建完后文件系统类型同快照源

[root@localhost mnt]# blkid  /dev/MYVG/MYLV1-snapshot 

/dev/MYVG/MYLV1-snapshot: UUID="968ea16b-f515-4b0e-a8f4-50b4c5dfc825" TYPE="ext4" 


B、挂载验证:

[root@localhost ~]# mount /dev/MYVG/MYLV1-snapshot /mnt/

修改一下源文件

[root@localhost mnt]# echo `date +%F-%H-%M-%S` >> /users/magedu/fstab 

[root@localhost mnt]# tail -3 /users/magedu/fstab

UUID=786b54c9-d523-421f-80e3-535618f88b4a /backup ext4 defaults,noatime,acl 0 0

UUID=968ea16b-f515-4b0e-a8f4-50b4c5dfc825  /users ext4 defaults,acl 0 0

2015-10-29-15-32-15

源文件修改后,到快照中查看发现,此文件仍是原来的样子,所以通过快照卷进行数据备份就能解决数据时间点不一致的问题

[root@localhost mnt]# tail -3 /mnt/magedu/fstab 

proc                    /proc                   proc    defaults        0 0

UUID=786b54c9-d523-421f-80e3-535618f88b4a /backup ext4 defaults,noatime,acl 0 0

UUID=968ea16b-f515-4b0e-a8f4-50b4c5dfc825  /users ext4 defaults,acl 0 0