LVM(Logical Volume Manager,逻辑卷管理),可以弹性调整分区大小。LVM将多个分区(或磁盘)整合在一起,让这些分区看起来就像是一个磁盘一样,将来可以新增或移除其他的分区到这个LVM 管理的“磁盘”当中。因此说LVM可以弹性调整分区的大小。
一:概念
LVM可以将几个分区(或磁盘),通过软件组合成为一块独立的“磁盘”(VG),然后将这块“磁盘”再分割成为可使用的“分区”(LV),最终就能够挂载使用了。它主要涉及到的概念如下:
1:物理卷(Physical Volume, PV)
实际的分区需要通过fdisk命令调整系统识别码(system ID)为“8e”(LVM的识别码),然后再通过pvcreate命令,就可以将该分区转换成LVM最底层的物理卷了。
2:卷组(Volume Group,VG)
卷组就是所谓的LVM“磁盘”,就是将多个物理卷整合成一个卷组。
3:物理块(Physical Extend, PE)
物理块是LVM最小的储存单位,类似于磁盘的扇区的概念。默认情况下,物理块大小为4MB。
4:逻辑卷(Logical Volume,LV)
卷组会被切分成逻辑卷,它类似于原来分区的概念。为了方便使用者利用LVM 来管理其系统,因此LV的名字通常指定为“/dev/vgname/lvname”。
PE是整个LVM的最小储存单位,因此LV的大小就与此LV内的PE数有关。LVM可弹性调整LV的容量,就是通过增加或减少PE实现的。将原本LV内的PE移转LV之外,就可以减少LV容量;将PE加到LV中,就可以增加LV容量。
VG、LV与PE的关系如下图:
如上图所示,VG将一定量的PE分配给LV。如果未来这个VG要扩充的话,加上其他的PV即可。而LV如果要扩充的话,是通过将VG内没有使用到的PE加入到LV来实现的。
规划好LV之后,通过mkfs命令,就可以将LV格式化成可以利用的文件系统了,再通过mount命令挂载之后,就可以使用了。
而且这个文件系统的容量在未来还能进行扩充或减少,且里面的数据还不会被影响。整个的操作流程如下:
LV的数据写入有两种方式,分别是线性模式(linear)和交错模式(triped):
线性模式(linear):若将/dev/hda1,/dev/hdb1这两个分区加入到VG中,并且整个VG只有一个LV时,那么所谓的线性模式就是,当/dev/hda1的容量用完之后,才会使用/dev/hdb1。推荐使用这种模式。
交错模式(triped):将一笔数据拆成两部分,分别写入/dev/hda1和/dev/hdb1中。
LVM最主要的用处是在实现一个可以弹性调整容量的文件系统上,而不是在创建一个效率为主的磁盘上,因此,LVM 默认的读写模式是线性模式。如果使用triped模式,则当任何一个分区挂掉时,所有的数据都会被破坏!
二:实操
使用LVM需要安装Lvm2,在ubuntu下可以使用apt安装:
# apt-get install lvm2
底下的操作,将4个物理分区整合成为一个VG,VG名为vbirdvg。PE大小为16MB,将全部的VG容量都分配给LV,LV的名称配置为vbirdlv。最终将这个LV格式化为ext3的文件系统,且挂载在/mnt/lvm 中。
首先分割出4个分区,每个分区的容量均为 1.5GB 左右,且system ID需要为 8e:
# fdisk -l Disk /dev/hda: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 13 104391 83 Linux /dev/hda2 14 1288 10241437+ 83 Linux /dev/hda3 1289 1925 5116702+ 83 Linux /dev/hda4 1926 5005 24740100 5 Extended /dev/hda5 1926 2052 1020096 82 Linux swap / Solaris /dev/hda6 2053 2235 1469916 8e LinuxLVM /dev/hda7 2236 2418 1469916 8e LinuxLVM /dev/hda8 2419 2601 1469916 8e LinuxLVM /dev/hda9 2602 2784 1469916 8e LinuxLVM
上面的/dev/hda{6,7,8,9}这四个分区,就是要用到的实体分区!ID通过fdisk命令(t: change a partition's system id)配置为 8e后,会导致system变成“LinuxLVM”。
1:PV阶段
要创建PV,只要使用pvcreate即可。与PV有关的命令如下:
pvcreate:将实体分区创建成为PV;
pvscan:搜寻目前系统里面任何具有PV的磁盘;
pvdisplay:显示出目前系统上面的PV状态;
pvremove:将PV属性移除,使分区不再具有PV属性。
首先用pvscan查看目前系统上具有PV属性的磁盘:
# pvscan No matching physical volumes found
然后将 /dev/hda6 - /dev/hda9 创建成为PV格式,并在此调用pvscan查看:
# pvcreate /dev/hda{6,7,8,9} Physical volume "/dev/hda6" successfully created Physical volume "/dev/hda7" successfully created Physical volume "/dev/hda8" successfully created Physical volume "/dev/hda9" successfully created # pvscan PV /dev/hda6 lvm2 [1.40 GB] PV /dev/hda7 lvm2 [1.40 GB] PV /dev/hda8 lvm2 [1.40 GB] PV /dev/hda9 lvm2 [1.40 GB] Total: 4 [5.61 GB] / in use: 0 [0 ] / in no VG: 4 [5.61 GB]
最后调用pvdisplay查看详细信息:
# pvdisplay "/dev/hda6" is a new physical volume of "1.40 GB" --- NEW Physical volume --- PV Name /dev/hda6 <==实际的 partition 装置名称 VG Name <==因为尚未分配出去,所以空白! PV Size 1.40 GB <==就是容量说明 Allocatable NO <==是否已被分配,结果是 NO PE Size (KByte) 0 <==在此 PV 内的 PE 大小 Total PE 0 <==共分割出几个 PE Free PE 0 <==没被 LV 用掉的 PE Allocated PE 0 <==尚可分配出去的 PE 数量 PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN ...
2:VG阶段
创建VG及VG相关的命令如下:
vgcreate:创建VG;
vgscan:搜寻系统上面是否有VG存在;
vgdisplay:显示目前系统上面的VG状态;
vgextend:在VG内添加额外的PV;
vgreduce:在VG内移除PV;
vgchange:配置VG是否启动 (active);
vgremove:删除一个VG;
PV的名称其实就是分区的名称,但是VG名称则可以自己取。下面的例子中,将VG名称取名为vbirdvg。
首先将/dev/hda6-8创建成为一个名为vbirdvg的VG,且指定PE为16M,并调用pvscan查看:
# vgcreate -s 16M vbirdvg /dev/hda{6,7,8} Volume group "vbirdvg" successfully created # vgscan Reading all physical volumes. This may take a while... Found volume group "vbirdvg" using metadata type lvm2
在此调用pvscan查看当前的状态:
# pvscan PV /dev/hda6 VG vbirdvg lvm2 [1.39 GB / 1.39 GB free] PV /dev/hda7 VG vbirdvg lvm2 [1.39 GB / 1.39 GB free] PV /dev/hda8 VG vbirdvg lvm2 [1.39 GB / 1.39 GB free] PV /dev/hda9 lvm2 [1.40 GB] Total: 4 [5.57 GB] / in use: 3 [4.17 GB] / in no VG: 1 [1.40 GB]
可见,有三个PV被用去,剩下一个 /dev/hda9 的PV没被用掉。
调用vgdisplay查看当前VG状态:
# vgdisplay --- Volume group --- VG Name vbirdvg System ID Format lvm2 Metadata Areas 3 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 3 Act PV 3 VG Size 4.17 GB <==整体的 VG 容量有这么大 PE Size 16.00 MB <==内部每个 PE 的大小 Total PE 267 <==总共的 PE 数量共有这么多! Alloc PE / Size 0 / 0 Free PE / Size 267 / 4.17 GB VG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
这样就创建好一个VG了!如果需要扩充这个VG的容量,也就是将/dev/hda9添加到VG中,可以这样:
# vgextend vbirdvg /dev/hda9 Volume group "vbirdvg" successfully extended # vgdisplay ... VG Size 5.56 GB PE Size 16.00 MB Total PE 356 Alloc PE / Size 0 / 0 Free PE / Size 356 / 5.56 GB VG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
3:LV阶段
创建好VG这个“大磁盘”之后,接下来就是进行“分区”。这个分区就是创建所谓的LV。现在需要将刚创建好的vbirdvg,分割成为vbirdlv,将整个VG的容量都分配到vbirdlv中。LV相关的命令如下:
lvcreate:创建LV;
lvscan:查询系统上面的LV;
lvdisplay:显示系统上面的LV状态;
lvextend:在LV里面添加容量;
lvreduce:在LV里面减少容量;
lvremove:删除一个LV;
lvresize:对LV进行容量大小的调整。
lvcreate用法如下:
lvcreate [-L N[mgt]] [-n LV名称] VG名称
lvcreate[-l N] [-n LV名称] VG名称
选项与参数:
-L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,这个数量必须要是PE大小的倍数,若不相符,系统会自行计算最相近的容量。
-l :后面可以接PE的个数。
-n :后面接的就是LV的名称。
首先,将整个名为vbirdvg的VG都分配给 vbirdlv,注意,PE共有356 个:
# lvcreate -l 356 -n vbirdlv vbirdvg Logical volume "vbirdlv" created # ll /dev/vbirdvg/vbirdlv lrwxrwxrwx 1 root root 27 Mar 11 16:49 /dev/vbirdvg/vbirdlv -> /dev/mapper/vbirdvg-vbirdlv
由于本例中每个PE为16M,因此上述的命令也可以使用如下的方式来创建:lvcreate-L 5.56G -n vbirdlv vbirdvg
使用lvdisplay查看状态:
# lvdisplay --- Logical volume --- LV Name /dev/vbirdvg/vbirdlv <==这个才是 LV 的全名! VG Name vbirdvg LV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0 LV Write Access read/write LV Status available # open 0 LV Size 5.56 GB <==这个 LV 的容量这么大! Current LE 356 Segments 4 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
准备好LV之后,剩下的就是格式化、挂载了。要注意的是,VG的名称为 vbirdvg,但LV的名称必须使用全名,也就是/dev/vbirdvg/vbirdlv。
4:文件系统阶段
# mkfs -t ext3 /dev/vbirdvg/vbirdlv <==注意 LV 全名! # mkdir /mnt/lvm # mount /dev/vbirdvg/vbirdlv /mnt/lvm # df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda2 9920624 3858984 5549572 42% / /dev/hda3 4956316 1056996 3643488 23% /home /dev/hda1 101086 21408 74459 23% /boot tmpfs 371332 0 371332 0% /dev/shm /dev/mapper/vbirdvg-vbirdlv 5741020 142592 5306796 3% /mnt/lvm
5:放大LV容量
要放大LV的容量, 只需要一下步骤:
a:用fdisk配置新的,system ID为8e的分区;
b:利用pvcreate创建PV
c:利用vgextend 将PV加入名为vbirdvg的VG;
d:利用lvresize,将新加入的PV内的PE加入到vbirdlv中;
e;通过resize2fs扩容文件系统。
具体步骤如下,首先找出一个3GB的新分区,也就是/dev/hda10:
# fdisk -l Device Boot Start End Blocks Id System ....(中间省略).... /dev/hda10 2785 3150 2939863+ 8e Linux LVM
然后,创建新的PV:
# pvcreate /dev/hda10 Physical volume "/dev/hda10" successfully created # pvscan PV /dev/hda6 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda7 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda8 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda9 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda10 lvm2 [2.80 GB] Total: 5 [8.37 GB] / in use: 4 [5.56 GB] / in no VG: 1 [2.80 GB]
然后,利用vgextend扩容VG:
# vgextend vbirdvg /dev/hda10 Volume group "vbirdvg" successfully extended # vgdisplay --- Volume group --- VG Name vbirdvg System ID Format lvm2 Metadata Areas 5 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 5 Act PV 5 VG Size 8.36 GB PE Size 16.00 MB Total PE 535 Alloc PE / Size 356 / 5.56 GB Free PE / Size 179 / 2.80 GB VG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO
然后,利用lvresize扩容LV:
# lvresize -l +179 /dev/vbirdvg/vbirdlv Extending logical volume vbirdlv to 8.36 GB Logical volume vbirdlv successfully resized # lvdisplay --- Logical volume --- LV Name /dev/vbirdvg/vbirdlv VG Name vbirdvg LV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0 LV Write Access read/write LV Status available # open 1 LV Size 8.36 GB Current LE 535 Segments 5 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0 # df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv 5741020 261212 5188176 5% /mnt/lvm
最终的结果中,LV放大到了8.36GB,但是文件系统却没有相对添加。这就需要使用 resize2fs命令来处理,该命令的用法如下:resize2fs [-f] [device] [size]
选项与参数:
-f:强制进行 resize;
[device]:分区的名称;
[size]:可以加也可以不加。如果加上size的话,那么就必须要给予一个单位,如M,G 等。如果没有size的话,则默认使用整个分区的容量来处理。
下面,将完整的将LV容量扩充到整个文件系统:
# resize2fs /dev/vbirdvg/vbirdlv resize2fs 1.39 (29-May-2006) Filesystem at /dev/vbirdvg/vbirdlv is mounted on /mnt/lvm; on-line resizing Performing an on-line resize of /dev/vbirdvg/vbirdlv to 2191360 (4k) blocks. The filesystem on /dev/vbirdvg/vbirdlv is now 2191360 blocks long. # df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv 8628956 262632 7931368 4% /mnt/lvm
可见,LV的容量确实增加了。所以LVM支持在线resize,而且不会丢失数据。
6:缩小LV容量
假设想将/dev/hda6从LV中抽离出来,也就是缩小LV的容量。步骤如下:
首先得到/dev/hda6的容量,尝试计算文件系统需缩小到多少:
# pvdisplay --- Physical volume --- PV Name /dev/hda6 VG Name vbirdvg PV Size 1.40 GB / not usable 11.46 MB Allocatable yes (but full) PE Size (KByte) 16384 Total PE 89 Free PE 0 Allocated PE 89 PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN # pvscan PV /dev/hda6 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda7 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda8 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda9 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda10 VG vbirdvg lvm2 [2.80 GB / 0 free] Total: 5 [8.36 GB] / in use: 5 [8.36 GB] / in no VG: 0 [0 ]
从pvdisplay可以看出/dev/hda6的大小,它有89个PE,也就是共有1.40G。从pvscan可以发现如果扣除/dev/hda6,则剩余量有:1.39*3 + 2.8,也就是6.97G。
接下来,要调用resize2fs缩小文件系统的空间。在使用resize2fs缩小空间是,需要先umount,然后才能resize2fs:
# umount /mnt/lvm # resize2fs /dev/vbirdvg/vbirdlv 6900M resize2fs 1.39 (29-May-2006) Resizing the filesystem on /dev/vbirdvg/vbirdlv to 1766400 (4k) blocks. The filesystem on /dev/vbirdvg/vbirdlv is now 1766400 blocks long.
然后,重新挂载:
# mount /dev/vbirdvg/vbirdlv /mnt/lvm [root@www ~]# df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv 6955584 262632 6410328 4% /mnt/lvm
接下来就是将LV的容量降低,要注意的是,我们想要抽离的是/dev/hda6,这个PV有89个 PE。所以要这样进行:
# lvresize -l -89 /dev/vbirdvg/vbirdlv WARNING: Reducing active and open logical volume to 6.97 GB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce vbirdlv? [y/n]: y Reducing logical volume vbirdlv to 6.97 GB Logical volume vbirdlv successfully resized # lvdisplay --- Logical volume --- LV Name /dev/vbirdvg/vbirdlv VG Name vbirdvg LV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0 LV Write Access read/write LV Status available # open 1 LV Size 6.97 GB Current LE 446 Segments 5 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:0
接下来就要将/dev/hda6移出vbirdvg这个VG之外。得要先确定/dev/hda6里面的PE完全不被使用后,才能够将/dev/hda6抽离,先通过pvdisplay查看:
# pvdisplay --- Physical volume --- PV Name /dev/hda6 VG Name vbirdvg PV Size 1.40 GB / not usable 11.46 MB Allocatable yes (but full) PE Size (KByte) 16384 Total PE 89 Free PE 0 Allocated PE 89 PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN ... --- Physical volume --- PV Name /dev/hda10 VG Name vbirdvg PV Size 2.80 GB / not usable 6.96 MB Allocatable yes PE Size (KByte) 16384 Total PE 179 Free PE 89 Allocated PE 90 PV UUID 7MfcG7-y9or-0Jmb-H7RO-5Pa5-D3qB-G426Vq
可见/dev/hda6中的Free PE为0,而没有使用的PE都在/dev/hda10上,因此需要先通过pvmove,将/dev/hda6内的PE移动到/dev/hda10上,然后调用vgreduce,将/dev/hda6从VG中移出:
# pvmove /dev/hda6 /dev/hda10 # vgreduce vbirdvg /dev/hda6 Removed "/dev/hda6" from volume group "vbirdvg"
最后,将/dev/hda6这个PV“删除”:
# pvscan PV /dev/hda7 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda8 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda9 VG vbirdvg lvm2 [1.39 GB / 0 free] PV /dev/hda10 VG vbirdvg lvm2 [2.80 GB / 0 free] PV /dev/hda6 lvm2 [1.40 GB] Total: 5 [8.37 GB] / in use: 4 [6.97 GB] / in no VG: 1 [1.40 GB] # pvremove /dev/hda6 Labels on physical volume "/dev/hda6" successfully wiped
这样,就完成了缩小LV容量的工作。
三:LVM 的系统快照
LVM除了可以动态改变分区大小之外,还具有系统快照(snapshot)的能力。系统快照就是将某一时刻的系统记录下来,未来若有任何数据变动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。如下图所示:
上图中,短虚线为文件系统,长虚线为快照区。左图为最初建立系统快照区的状况,LVM 会预留一个区域(左图的左侧三个PE区块)作为快照数据存放处。
开始时快照区与文件系统区共享所有的PE数据,因此快照区的内容与文件系统是一模一样的。等到系统运行一阵子后,假设A区域的数据变动了(右图所示),则变动前系统会将该区域的旧数据移动到快照区,所以在右图的快照区被占用了一块PE成为 A,而其他 B 到 I 的区块则还是与文件系统共享!
因此,LVM的系统快照是很好的“备份工具”,因为他只有备份有变动的数据。
1:快照区的创建
在上面的例子中,因VG把/dev/hda6移出之后,剩余的PE为0,因此,首先再次将/dev/hda6添加到VG中:
# vgdisplay --- Volume group --- VG Name vbirdvg ... VG Size 6.97 GB PE Size 16.00 MB Total PE 446 Alloc PE / Size 446 / 6.97 GB Free PE / Size 0 / 0 <==没有多余的 PE 可用! # pvcreate /dev/hda6 Physical volume "/dev/hda6" successfully created # vgextend vbirdvg /dev/hda6 Volume group "vbirdvg" successfully extended # vgdisplay --- Volume group --- VG Name vbirdvg ... VG Size 8.36 GB PE Size 16.00 MB Total PE 535 Alloc PE / Size 446 / 6.97 GB Free PE / Size 89 / 1.39 GB <==多出了 89 个 PE 可用!
然后,利用lvcreate –s针对/dev/vbirdvg/vbirdlv这个LV创建系统快照区,取名为 vbirdss,且给予60个PE:
# lvcreate -l 60 -s -n vbirdss /dev/vbirdvg/vbirdlv Logical volume "vbirdss" created # lvdisplay --- Logical volume --- LV Name /dev/vbirdvg/vbirdss VG Name vbirdvg LV UUID K2tJ5E-e9mI-89Gw-hKFd-4tRU-tRKF-oeB03a LV Write Access read/write LV snapshot status active destination for /dev/vbirdvg/vbirdlv LV Status available # open 0 LV Size 6.97 GB <==被快照的原 LV 磁碟容量 Current LE 446 COW-table size 960.00 MB <==快照区的实际容量 COW-table LE 60 <==快照区占用的 PE 数量 Allocated to snapshot 0.00% Snapshot chunk size 4.00 KB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1
通过将新建的快照进行挂载,可以看见快照/dev/mapper/vbirdvg-vbirdss与/dev/mapper/vbirdvg-vbirdlv是完全相同的:
# mkdir /mnt/snapshot # mount /dev/vbirdvg/vbirdss /mnt/snapshot # df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hda2 9920624 3859032 5549524 42% / /dev/hda3 4956316 1056996 3643488 23% /home /dev/hda1 101086 21408 74459 23% /boot tmpfs 371332 0 371332 0% /dev/shm /dev/mapper/vbirdvg-vbirdlv 6955584 262632 6410328 4% /mnt/lvm /dev/mapper/vbirdvg-vbirdss 6955584 262632 6410328 4% /mnt/snapshot
2:利用快照,进行备份和还原
接下来,就利用快照做一下系统备份和复原,首先umount快照/dev/mapper/vbirdvg-vbirdss,然后改变一下/dev/mapper/vbirdvg-vbirdlv中的内容:
# umount /mnt/snapshot # ll /mnt/lvm drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc drwxr-xr-x 17 root root 4096 Mar 11 14:17 log drwx------ 2 root root 16384 Mar 11 16:59 lost+found # rm -r /mnt/lvm/log # cp -a /boot /lib /sbin /mnt/lvm # ll /mnt/lvm drwxr-xr-x 4 root root 4096 Dec 15 16:28 boot drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc drwxr-xr-x 14 root root 4096 Sep 5 2008 lib drwx------ 2 root root 16384 Mar 11 16:59 lost+found drwxr-xr-x 2 root root 12288 Sep 5 2008 sbin # lvdisplay /dev/vbirdvg/vbirdss --- Logical volume --- LV Name /dev/vbirdvg/vbirdss VG Name vbirdvg ... Allocated to snapshot 12.22% ...
可见,将/dev/mapper/vbirdvg-vbirdlv中内容改变之后,快照区的使用率到了12.22%,说明原数据已经被复制到快照区了,也就是那60个PE中了。因此,若改动的原始数据量过大,会使快照区容纳不了。
接下来,将快照区进行备份,然后利用该备份,恢复/dev/mapper/vbirdvg-vbirdlv中的内容:
# mount /dev/vbirdvg/vbirdss /mnt/snapshot # df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv 6955584 370472 6302488 6% /mnt/lvm /dev/mapper/vbirdvg-vbirdss 6955584 262632 6410328 4% /mnt/snapshot # mkdir -p /backups # cd /mnt/snapshot # tar -jcv -f /backups/lvm.tar.bz2 * # umount /mnt/snapshot # lvremove /dev/vbirdvg/vbirdss Do you really want to remove active logical volume "vbirdss"? [y/n]: y Logical volume "vbirdss" successfully removed # umount /mnt/lvm # mkfs -t ext3 /dev/vbirdvg/vbirdlv # mount /dev/vbirdvg/vbirdlv /mnt/lvm # tar -jxv -f /backups/lvm.tar.bz2 -C /mnt/lvm # ll /mnt/lvm drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc drwxr-xr-x 17 root root 4096 Mar 11 14:17 log drwx------ 2 root root 16384 Mar 11 16:59 lost+found
可见,利用快照的备份,已经将/dev/vbirdvg/vbirdlv中的内容,恢复如初了。
这里之所以要备份,而不是直接格式化/dev/vbirdvg/vbirdlv,并将 /dev/vbirdvg/vbirdss直接复制给 vbirdlv。是因为vbirdss其实是vbirdlv的快照,如果格式化整个vbirdlv,则原本vbirdlv中的所有数据都会被搬移到vbirdss中,但是显然vbirdss是没有这么大空间的。
3:使用原系统还原快照
换个角度来想,还可以将原本的vbirdlv当作备份数据,然后将vbirdss当作实际在运行中的数据,任何测试的动作都在vbirdss这个快照区当中测试,那么当测试完毕后,只要将快照区删除,然后重新对vbirdlv作一个快照区即可。
首先创建一个新的快照区vbirdss,这次分配89个PE:
# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv Logical volume "vbirdss" created # lvdisplay /dev/vbirdvg/vbirdss --- Logical volume --- LV Name /dev/vbirdvg/vbirdss VG Name vbirdvg LV UUID as0ocQ-KjRS-Bu7y-fYoD-1CHC-0V3Y-JYsjj1 LV Write Access read/write LV snapshot status active destination for /dev/vbirdvg/vbirdlv LV Status available # open 0 LV Size 6.97 GB Current LE 446 COW-table size 1.39 GB COW-table LE 89 Allocated to snapshot 0.00% Snapshot chunk size 4.00 KB Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1
然后,将vbirdlv进行隐藏,而针对vbirdss做变动,然后,再利用vbirdlv做还原:
# umount /mnt/lvm # mount /dev/vbirdvg/vbirdss /mnt/snapshot # df /mnt/snapshot Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdss 7192504 265804 6561340 4% /mnt/snapshot # rm -r /mnt/snapshot/etc /mnt/snapshot/log # cp -a /boot /lib /sbin /mnt/snapshot/ # ll /mnt/snapshot drwxr-xr-x 4 root root 4096 Dec 15 16:28 boot drwxr-xr-x 14 root root 4096 Sep 5 2008 lib drwx------ 2 root root 16384 Mar 11 16:59 lost+found drwxr-xr-x 2 root root 12288 Sep 5 2008 sbin <==与原本数据有差异了 # mount /dev/vbirdvg/vbirdlv /mnt/lvm # ll /mnt/lvm drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc drwxr-xr-x 17 root root 4096 Mar 11 14:17 log drwx------ 2 root root 16384 Mar 11 16:59 lost+found # umount /mnt/snapshot # lvremove /dev/vbirdvg/vbirdss Do you really want to remove active logical volume "vbirdss"? [y/n]: y Logical volume "vbirdss" successfully removed # lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv # mount /dev/vbirdvg/vbirdss /mnt/snapshot # ll /mnt/snapshot drwxr-xr-x 105 root root 12288 Mar 11 16:59 etc drwxr-xr-x 17 root root 4096 Mar 11 14:17 log drwx------ 2 root root 16384 Mar 11 16:59 lost+found
四:关闭LVM
因为你的实体分区已经被用到LVM去了,若在没有将LVM关闭的情况下,就直接将那些分区删除或转为其他用途的话,系统可能会发生错误。
关闭LVM的步骤如下:
a:使用 lvremove移除 LV ;
b:使用 vgchange-a n VGname,让VGname 这个 VG 不具有 Active 的标志;
c:使用 vgremove移除 VG:
d:使用 pvremove移除 PV;
e:最后,使用 fdisk修改 ID。
整个过程如下:
# umount /mnt/lvm # umount /mnt/snapshot # lvremove /dev/vbirdvg/vbirdss <==先处理快照 Do you really want to remove active logical volume "vbirdss"? [y/n]: y Logical volume "vbirdss" successfully removed # lvremove /dev/vbirdvg/vbirdlv <==再处理原系统 Do you really want to remove active logical volume "vbirdlv"? [y/n]: y Logical volume "vbirdlv" successfully removed # vgchange -a n vbirdvg 0 logical volume(s) in volume group "vbirdvg" now active # vgremove vbirdvg Volume group "vbirdvg" successfully removed # pvremove /dev/hda{6,7,8,9,10} Labels on physical volume "/dev/hda6" successfully wiped Labels on physical volume "/dev/hda7" successfully wiped Labels on physical volume "/dev/hda8" successfully wiped Labels on physical volume "/dev/hda9" successfully wiped Labels on physical volume "/dev/hda10" successfully wiped
转自:http://vbird.dic.ksu.edu.tw/linux_basic/0420quota.php