逻辑卷轴管理员 (Logical Volume Manager)
想像一个情况,你在当初规划主机的时候将 /home 只给他 50G ,等到使用者众多之后导致这个 filesystem 不够大, 此时你能怎么作?
多数的朋友都是这样:再加一颗新硬盘,然后重新分割、格式化,将 /home 的数据完整的复制过来, 然后将原本的 partition 卸载重新挂载新的 partition 。啊!好忙碌啊!若是第二次分割却给的容量太多!导致很多磁碟容量被浪费了! 你想要将这个 partition 缩小时,又该如何作?
将上述的流程再搞一遍!唉~烦死了,尤其复制很花时间ㄟ~有没有更简单的方法呢? 有的!那就是我们这个小节要介绍的 LVM 这玩意儿!
LVM 的重点在於『可以弹性的调整 filesystem 的容量!』而并非在於效能与数据保全上面。 需要文件的读写效能或者是数据的可靠性,请参考前面的 RAID 小节。 LVM 可以整合多个实体 partition 在一起, 让这些 partitions 看起来就像是一个磁碟一样!而且,还可以在未来新增或移除其他的实体 partition 到这个 LVM 管理的磁碟当中。 如此一来,整个磁碟空间的使用上,实在是相当的具有弹性啊!
在讲解之前,先说一个问题,当我们新插入一块硬盘时,系统是无法辨识的,
一般情况下需要重启操作系统来识别。
Linux主机对磁盘设备进行重新配置的方式包括:
?重启系统
?卸载并重新加载HBA驱动模块
?Echo /proc下的SCSI设备列表
?通过/sys下的属性设置运行SCSI扫描
?通过HBA厂商脚本运行SCSI扫描
在此说下非重启的方法让系统辨识新硬盘。
这里的硬盘使用的是scsi方式
1. 第一种方法 Echo /proc下的SCSI设备列表
列出已经发现的SCSI磁盘
[root@localhost /]# cat /proc/scsi/scsi
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: VMware, Model: VMware Virtual S Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 02
Host: scsi2 Channel: 00 Id: 01 Lun: 00
Vendor: VMware, Model: VMware Virtual S Rev: 1.0
Type: Direct-Access
[root@localhost /]#echo "scsi add-single-device a b c d">/proc/scsi/scsi
a是硬盘所在SCSI控制器号(我的VM有2个SCSI控制器,所以就是1);
b是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
c是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
d是硬盘的lun号(默认情况都是0)
2.第二种方法 通过/sys下的属性设置运行SCSI扫描
/sys下SCSI扫描
2.6内核中,HBA驱动将SCAN功能导出至/sys目录下,可用来重新扫描该接口下的SCSI磁盘设备。命令如下:
[root@localhost /]# cd /sys/class/scsi_host/
[root@localhost scsi_host]# ls
host0 host1 host2
各自扫描一次
[root@localhost scsi_host]# echo "- - -">host0/scan
[root@localhost scsi_host]# echo "- - -">host1/scan
[root@localhost scsi_host]# echo "- - -">host2/scan
‘- - -’代表channel,target和LUN编号。以上命令会导致分区下所有channel,target以及可见LUN被扫描。
RHEL5 或SUSE10:
echo ‘- - -’ > /sys/class/scsi_host/host0/scan
/sys/class/scsi_host/ 下面有几个host 就扫描几次
RHEL4 或SUSE9:
echo 1 >> /sys/class/scsi_host/host0/issue_lip
同样是/sys/class/scsi_host/ 下面有几个host 就执行几次
echo ‘- - -’ >> /sys/class/scsi_host/host0/scan
什么是 LVM: PV, PE, VG, LV 的意义
LVM 的全名是 Logical Volume Manager,中文可以翻译作逻辑卷轴管理员。之所以称为『卷轴』可能是因为可以将 filesystem 像卷轴一样伸长或缩短之故吧!LVM 的作法是将几个实体的 partitions (或 disk) 透过软件组合成为一块看起来是独立的大磁碟 (VG) ,然后将这块大磁碟再经过分割成为可使用分割槽 (LV), 最终就能够挂载使用了。但是为什么这样的系统可以进行 filesystem 的扩充或缩小呢?其实与一个称为 PE 的项目有关! 底下我们就得要针对这几个项目来好好聊聊!
- Physical Volume, PV, 实体卷轴
我们实际的 partition 需要调整系统识别码 (system ID) 成为 8e (LVM 的识别码),然后再经过 pvcreate 的命令将他转成 LVM 最底层的实体卷轴 (PV) ,之后才能够将这些 PV 加以利用! 调整 system ID 的方是就是透过 fdisk 啦!
- Volume Group, VG, 卷轴群组
所谓的 LVM 大磁碟就是将许多 PV 整合成这个 VG !所以 VG 就是 LVM 组合起来的大磁碟!这么想就好了。 那么这个大磁碟最大可以到多少容量呢?这与底下要说明的 PE 有关喔~因为每个 VG 最多仅能包含 65534 个 PE 而已。 如果使用 LVM 默认的参数,则一个 VG 最大可达 256GB 的容量啊!(参考底下的 PE 说明)
- Physical Extend, PE, 实体延伸区块
LVM 默认使用 4MB 的 PE 区块,而 LVM 的 VG 最多仅能含有 65534 个 PE ,因此默认的 LVM VG 会有 4M*65534/(1024M/G)=256G。 这个 PE 很有趣喔!他是整个 LVM 最小的储存区块,也就是说,其实我们的文件数据都是藉由写入 PE 来处理的。 简单的说,这个 PE 就有点像文件系统里面的 block 大小啦。 这样说应该就比较好理解了吧?所以调整 PE 会影响到 VG 的最大容量!
- Logical Volume, LV, 逻辑卷轴
最终的 VG 还会被切成 LV,这个 LV 就是最后可以被格式化使用的类似分割槽的咚咚了!那么 LV 是否可以随意指定大小呢? 当然不可以!既然 PE 是整个 LVM 的最小储存单位,那么 LV 的大小就与在此 LV 内的 PE 总数有关。 为了方便使用者利用 LVM 来管理其系统,因此 LV 的装置档名通常指定为『 /dev/vgname/lvname 』的样式!
此外,我们刚刚有谈到 LVM 可弹性的变更 filesystem 的容量,那是如何办到的?其实他就是透过『交换 PE 』来进行数据转换, 将原本 LV 内的 PE 移转到其他装置中以降低 LV 容量,或将其他装置的 PE 加到此 LV 中以加大容量! VG、LV 与 PE 的关系有点像下图:
- 实作流程
通过 PV, VG, LV 的规划之后,再利用 mkfs 就可以将你的 LV 格式化成为可以利用的文件系统了!而且这个文件系统的容量在未来还能够进行扩充或减少, 而且里面的数据还不会被影响!
如此一来,我们就可以利用 LV 这个玩意儿来进行系统的挂载了。不过,你应该要觉得奇怪的是, 那么我的数据写入这个 LV 时,到底他是怎么写入硬盘当中的?依据写入机制的不同,而有两种方式:
- 线性模式 (linear):假如我将 /dev/hda1, /dev/hdb1 这两个 partition 加入到 VG 当中,并且整个 VG 只有一个 LV 时,那么所谓的线性模式就是:当 /dev/hda1 的容量用完之后,/dev/hdb1 的硬盘才会被使用到, 这也是我们所建议的模式。
- 交错模式 (triped):那什么是交错模式?很简单啊,就是我将一笔数据拆成两部分,分别写入 /dev/hda1 与 /dev/hdb1 的意思,感觉上有点像 RAID 0 啦!如此一来,一份数据用两颗硬盘来写入,理论上,读写的效能会比较好。
基本上,LVM 最主要的用处是在实现一个可以弹性调整容量的文件系统上, 而不是在创建一个效能为主的磁碟上,所以,我们应该利用的是 LVM 可以弹性管理整个 partition 大小的用途上,而不是著眼在效能上的。因此, LVM 默认的读写模式是线性模式啦! 如果你使用 triped 模式,要注意,当任何一个 partition 损坏时,所有的数据都会『损毁』的! 所以啦,不是很适合使用这种模式啦!如果要强调效能与备份,那么就直接使用 RAID 即可, 不需要用到 LVM 。
LVM 必需要核心有支持且需要安装 lvm2 这个软件,CentOS 与其他较新的 distributions 已经默认将 lvm 的支持与软件都安装妥当了!
我的要求有点像这样:
- 先分割出 4 个 partition ,每个 partition 的容量均为 1.5GB 左右,且 system ID 需要为 8e;
- 全部的 partition 整合成为一个 VG,VG 名称配置为 vbirdvg;且 PE 的大小为 16MB;
- 全部的 VG 容量都丢给 LV ,LV 的名称配置为 vbirdlv;
- 最终这个 LV 格式化为 ext3 的文件系统,且挂载在 /mnt/lvm 中
(注意:修改系统识别码请使用 t 这个 fdisk 内的命令来处理即可)
[root@www ~]# fdisk /dev/hda <==其他流程请自行参考第八章处理 [root@www ~]# partprobe <==别忘记这个动作了!粉重要! [root@www ~]# fdisk -l Disk /dev/hda: 41.1 GB, 41174138880 bytes 255 heads, 63 sectors/track, 5005 cylinders Units = cylinders of 16065 * 512 = 8225280 bytesDevice 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 Linux LVM /dev/hda7 2236 2418 1469916 8e Linux LVM /dev/hda8 2419 2601 1469916 8e Linux LVM /dev/hda9 2602 2784 1469916 8e Linux LVM |
上面的 /dev/hda{6,7,8,9} 这四个分区就是我们的实体分区! 注意看,那个 8e 的出现会导致 system 变成『 Linux LVM 』!其实没有配置成为 8e 也没关系, 不过某些 LVM 的侦测命令可能会侦测不到该 partition 就是了!接下来,就一个一个的处理各流程吧!
- PV 阶段
要创建 PV 其实很简单,只要直接使用 pvcreate 即可!
- pvcreate :将实体 partition 创建成为 PV ;
- pvscan :搜寻目前系统里面任何具有 PV 的磁碟;
- pvdisplay :显示出目前系统上面的 PV 状态;
- pvremove :将 PV 属性移除,让该 partition 不具有 PV 属性。
那就直接来瞧一瞧吧!
# 1. 检查有无 PV 在系统上,然后将 /dev/hda6~/dev/hda9 创建成为 PV 格式 [root@www ~]# pvscanNo matching physical volumes found <==找不到任何的 PV 存在喔![root@www ~]# pvcreate /dev/hda{6,7,8,9}Physical volume "/dev/hda6" successfully createdPhysical volume "/dev/hda7" successfully createdPhysical volume "/dev/hda8" successfully createdPhysical volume "/dev/hda9" successfully created # 这个命令可以一口气创建这四个 partition 成为 PV 啦!注意大括号的用途[root@www ~]# pvscanPV /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] # 这就分别显示每个 PV 的资讯与系统所有 PV 的资讯。尤其最后一行,显示的是: # 整体 PV 的量 / 已经被使用到 VG 的 PV 量 / 剩余的 PV 量# 2. 更详细的列示出系统上面每个 PV 的个别资讯: [root@www ~]# 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 <==是否已被分配,结果是 NOPE Size (KByte) 0 <==在此 PV 内的 PE 大小Total PE 0 <==共分割出几个 PEFree PE 0 <==没被 LV 用掉的 PEAllocated PE 0 <==尚可分配出去的 PE 数量PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN ....(底下省略).... # 由於 PE 是在创建 VG 时才给予的参数,因此在这里看到的 PV 里头的 PE 都会是 0 # 而且也没有多余的 PE 可供分配 (allocatable)。 |
- VG 阶段
创建 VG 及 VG 相关的命令也不少,我们来看看:
- vgcreate :就是主要创建 VG 的命令啦!他的参数比较多,等一下介绍。
- vgscan :搜寻系统上面是否有 VG 存在?
- vgdisplay :显示目前系统上面的 VG 状态;
- vgextend :在 VG 内添加额外的 PV ;
- vgreduce :在 VG 内移除 PV;
- vgchange :配置 VG 是否启动 (active);
- vgremove :删除一个 VG 啊!
与 PV 不同的是, VG 的名称是自订的!我们知道 PV 的名称其实就是 partition 的装置档名, 但是这个 VG 名称则可以随便你自己取啊!在底下的例子当中,我将 VG 名称取名为 vbirdvg 。创建这个 VG 的流程是这样的:
[root@www ~]# vgcreate [-s N[m | g | t ]] VG名称 PV名称 选项与参数: -s :后面接 PE 的大小 (size) ,单位可以是 m, g, t (大小写均可)# 1. 将 /dev/hda6-8 创建成为一个 VG,且指定 PE 为 16MB 喔! [root@www ~]# vgcreate -s 16M vbirdvg /dev/hda{6,7,8}Volume group "vbirdvg" successfully created[root@www ~]# vgscanReading all physical volumes. This may take a while...Found volume group "vbirdvg" using metadata type lvm2 # 确实存在这个 vbirdvg 的 VG 啦![root@www ~]# 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 没被用掉![root@www ~]# vgdisplay--- Volume group ---VG Name vbirdvgSystem IDFormat lvm2Metadata Areas 3Metadata Sequence No 1VG Access read/writeVG Status resizableMAX LV 0Cur LV 0Open LV 0Max PV 0Cur PV 3Act PV 3VG Size 4.17 GB <==整体的 VG 容量有这么大PE Size 16.00 MB <==内部每个 PE 的大小 Total PE 267 <==总共的 PE 数量共有这么多!Alloc PE / Size 0 / 0Free PE / Size 267 / 4.17 GBVG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO # 最后那三行指的就是 PE 能够使用的情况!由於尚未切出 LV,因此所有的 PE # 均可自由使用。 |
这样就创建一个 VG 了!假设我们要添加这个 VG 的容量,因为我们还有 /dev/hda9 :
# 2. 将剩余的 PV (/dev/hda9) 加给 vbirdvg 吧! [root@www ~]# vgextend vbirdvg /dev/hda9Volume group "vbirdvg" successfully extended[root@www ~]# vgdisplay ....(前面省略)....VG Size 5.56 GBPE Size 16.00 MB Total PE 356Alloc PE / Size 0 / 0Free PE / Size 356 / 5.56 GBVG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO # 基本上,不难吧!这样就可以抽换整个 VG 的大小啊! |
我们多了一个装置!接下来为这个 vbirdvg 进行分割吧!透过 LV 功能来处理!
- LV 阶段
创造出 VG 这个大磁盘之后,再来就是要创建分区啦!这个分区就是所谓的 LV !假设我要将刚刚那个 vbirdvg 磁盘,分割成为 vbirdlv ,整个 VG 的容量都被分配到 vbirdlv 里面去!先来看看能使用的命令
- lvcreate :创建 LV ;
- lvscan :查询系统上面的 LV ;
- lvdisplay :显示系统上面的 LV 状态!
- lvextend :在 LV 里面添加容量!
- lvreduce :在 LV 里面减少容量;
- lvremove :删除一个 LV !
- lvresize :对 LV 进行容量大小的调整!
[root@www ~]# lvcreate [ -L N [ m | g | t ]] [-n LV名称] VG名称 [root@www ~]# lvcreate [-l N] [-n LV名称] VG名称 选项与参数: -L :后面接容量,容量的单位可以是 M,G,T 等,要注意的是,最小单位为 PE,因此这个数量必须要是 PE 的倍数,若不相符,系统会自行计算最相近的容量。 -l :后面可以接 PE 的『个数』,而不是数量。若要这么做,得要自行计算 PE 数。 -n :后面接的就是 LV 的名称啦! 更多的说明应该可以自行查阅吧! man lvcreate # 1. 将整个 vbirdvg 通通分配给 vbirdlv 啊,要注意, PE 共有 356 个。 [root@www ~]# lvcreate -l 356 -n vbirdlv vbirdvgLogical volume "vbirdlv" created # 由於本案例中每个 PE 为 16M ,因此上述的命令也可以使用如下的方式来创建: # lvcreate -L 5.56G -n vbirdlv vbirdvg[root@www ~]# ll /dev/vbirdvg/vbirdlv lrwxrwxrwx 1 root root 27 Mar 11 16:49 /dev/vbirdvg/vbirdlv -> /dev/mapper/vbirdvg-vbirdlv # 看见了没有啊!这就是我们最重要的一个玩意儿了![root@www ~]# lvdisplay--- Logical volume ---LV Name /dev/vbirdvg/vbirdlv <==这个才是 LV 的全名!VG Name vbirdvgLV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0LV Write Access read/writeLV Status available# open 0LV Size 5.56 GB <==这个 LV 的容量这么大!Current LE 356Segments 4Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:0 |
如此一来,整个 partition 也准备好啦!接下来,就是针对这个 LV 来处理啦!要特别注意的是, VG 的名称为 vbirdvg , 但是 LV 的名称必须使用全名!亦即是 /dev/vbirdvg/vbirdlv 才对! 后续的处理都是这样的!这点初次接触 LVM 的朋友很容易搞错!
- 文件系统阶段
# 1. 格式化、挂载与观察我们的 LV 吧! [root@www ~]# mkfs -t ext3 /dev/vbirdvg/vbirdlv<==注意 LV 全名! [root@www ~]# mkdir /mnt/lvm [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm [root@www ~]# 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-vbirdlv5741020 142592 5306796 3% /mnt/lvm [root@www ~]# cp -a /etc /var/log /mnt/lvm |
其实 LV 的名称建置成为 /dev/vbirdvg/vbirdlv 是为了让使用者直觉式的找到我们所需要的数据, 实际上 LVM 使用的装置是放置到 /dev/mapper/ 目录下的!所以你才会看到上表当中的特殊字体部分。 透过这样的功能,我们现在已经建置好一个 LV 了!你可以自由的应用 /mnt/lvm 内的所有资源!
放大 LV 容量
如果要放大 LV 的容量时, 该如何进行完整的步骤呢?你只要这样做即可:
扩展操作可以在线执行。
- 用 fdisk 配置新的具有 8e system ID 的 partition
- 利用 pvcreate 建置 PV
- 利用 vgextend 将 PV 加入我们的 vbirdvg
- 利用 lvresize 将新加入的 PV 内的 PE 加入 vbirdlv 中
- 透过 resize2fs 将文件系统的容量确实添加!
其中最后一个步骤最重要!我们在第八章当中知道, 整个文件系统在最初格式化的时候就创建了 inode/block/superblock 等资讯,要改变这些资讯是很难的! 不过因为文件系统格式化的时候建置的是多个 block group ,因此我们可以透过在文件系统当中添加 block group 的方式来增减文件系统的量!而增减 block group 就是利用 resize2fs 啦!所以最后一步是针对文件系统来处理的, 前面几步则是针对 LVM 的实际容量大小!
# 1. 处理出一个 3GB 的新的 partition ,在我的系统中应该是 /dev/hda10 [root@www ~]# fdisk /dev/hda <==其他的动作请自行处理 [root@www ~]# partprobe [root@www ~]# fdisk -lDevice Boot Start End Blocks Id System ....(中间省略).... /dev/hda10 2785 3150 2939863+ 8e Linux LVM # 这个就是我们要的新的 partition 罗!# 2. 创建新的 PV: [root@www ~]# pvcreate /dev/hda10Physical volume "/dev/hda10" successfully created [root@www ~]# pvscanPV /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] # 可以看到 /dev/hda10 是新加入并且尚未被使用的喔!# 3. 加大 VG ,利用 vgextend 功能! [root@www ~]# vgextend vbirdvg /dev/hda10Volume group "vbirdvg" successfully extended [root@www ~]# vgdisplay--- Volume group ---VG Name vbirdvgSystem IDFormat lvm2Metadata Areas 5Metadata Sequence No 4VG Access read/writeVG Status resizableMAX LV 0Cur LV 1Open LV 1Max PV 0Cur PV 5Act PV 5 VG Size 8.36 GBPE Size 16.00 MBTotal PE 535Alloc PE / Size 356 / 5.56 GB Free PE / Size 179 / 2.80 GBVG UUID 4VU5Jr-gwOq-jkga-sUPx-vWPu-PmYm-dZH9EO # 不但整体 VG 变大了!而且剩余的 PE 共有 179 个,容量则为 2.80G # 4. 放大 LV 吧!利用 lvresize 的功能来添加! [root@www ~]# lvresize -l +179 /dev/vbirdvg/vbirdlvExtending logical volume vbirdlv to 8.36 GBLogical volume vbirdlv successfully resized # 这样就添加了 LV 了喔!lvresize 的语法很简单,基本上同样透过 -l 或 -L 来添加! # 若要添加则使用 + ,若要减少则使用 - !详细的选项请参考 man lvresize 罗![root@www ~]# lvdisplay--- Logical volume ---LV Name /dev/vbirdvg/vbirdlvVG Name vbirdvgLV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0LV Write Access read/writeLV Status available# open 1 LV Size 8.36 GBCurrent LE 535Segments 5Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:0[root@www ~]# df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv5741020 261212 5188176 5% /mnt/lvm |
看到了吧?最终的结果中 LV 真的有放大到 8.36GB 喔!但是文件系统却没有相对添加! 而且,我们的 LVM 可以线上直接处理,并不需要特别给他 umount 哩!真是人性化! 但是还是得要处理一下文件系统的容量啦!开始观察一下文件系统,然后使用 resize2fs 来处理一下吧!
# 5.1 先看一下原本的文件系统内的 superblock 记录情况吧! [root@www ~]# dumpe2fs /dev/vbirdvg/vbirdlv dumpe2fs 1.39 (29-May-2006) ....(中间省略).... Block count: 1458176 <==这个filesystem的 block 总数 ....(中间省略).... Blocks per group: 32768 <==多少个 block 配置成为一个 block group Group 0: (Blocks 0-32767) <==括号内为 block 的号码 ....(中间省略).... Group 44: (Blocks 1441792-1458175) <==这是本系统中最后一个 group ....(后面省略)....# 5.2 resize2fs 的语法 [root@www ~]# resize2fs [-f] [device] [size]选项与参数: -f :强制进行 resize 的动作! [device]:装置的文件名称; [size] :可以加也可以不加。如果加上 size 的话,那么就必须要给予一个单位,譬如 M, G 等等。如果没有 size 的话,那么默认使用『整个 partition』的容量来处理!# 5.3 完整的将 LV 的容量扩充到整个 filesystem 吧! [root@www ~]# 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. # 可怕吧!这一版的 lvm 竟然还可以线上进行 resize 的功能哩!真好![root@www ~]# df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv8628956 262632 7931368 4% /mnt/lvm [root@www ~]# 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 # 刚刚复制进去的数据可还是存在的喔!并没有消失不见! |
嘿嘿!真的放大了吧!而且如果你已经有填数据在 LVM 磁区当中的话!这个数据是不会死掉的喔!还是继续存在原本的磁区当中啦! 整个动作竟然这么简单就完成了!原本的数据还是一直存在而不会消失~您说, LVM 好不好用啊!
此外,如果你再以 dumpe2fs 来检查 /dev/vbirdvg/vbirdlv 时,就会发现后续的 Group 添加了!
root@www ~]# lvextend -L +10G /dev/vg001/lv001 增加lv空间 [root@www ~]# resize2fs /dev/vg001/lv001 更新文件系统[root@www ~]# [root@www ~]# |
上一小节我们谈到的是放大容量,现在来谈到的是缩小容量!假设我们想将 /dev/hda6 抽离出来! 那该如何处理啊?就让上一小节的流程倒转过来即可!
# 1. 先找出 /dev/hda6 的容量大小,并尝试计算文件系统需缩小到多少 [root@www ~]# pvdisplay--- Physical volume ---PV Name /dev/hda6VG Name vbirdvg PV Size 1.40 GB / not usable 11.46 MBAllocatable yes (but full)PE Size (KByte) 16384 Total PE 89Free PE 0Allocated PE 89PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN # 从这里可以看出 /dev/hda6 有多大,而且含有 89 个 PE 的量喔! # 那如果要使用 resize2fs 时,则总量减去 1.40GB 就对了![root@www ~]# pvscanPV /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 ] # 从上面可以发现如果扣除 /dev/hda6 则剩余容量有:1.39*3+2.8=6.97# 2. 就直接降低文件系统的容量吧! [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv 6900M resize2fs 1.39 (29-May-2006) Filesystem at /dev/vbirdvg/vbirdlv is mounted on /mnt/lvm; on-line resizing On-line shrinking from 2191360 to 1766400 not supported. # 容量好像不能够写小数点位数,因此 6.9G 是错误的,鸟哥就使用 6900M 了。 # 此外,放大可以线上直接进行,缩小文件系统似乎无法支持!所以要这样做:[root@www ~]# umount /mnt/lvm [root@www ~]# resize2fs /dev/vbirdvg/vbirdlv 6900M resize2fs 1.39 (29-May-2006) Please run 'e2fsck -f /dev/vbirdvg/vbirdlv' first. # 他要我们先进行磁碟检查!不罗唆!那就直接进行吧![root@www ~]# e2fsck -f /dev/vbirdvg/vbirdlv e2fsck 1.39 (29-May-2006) 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/vbirdvg/vbirdlv: 2438/1087008 files (0.1% non-contiguous), [root@www ~]# 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. # 再来 resize2fs 一次就能够成功了!如上所示啊![root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm [root@www ~]# df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv6955584 262632 6410328 4% /mnt/lvm |
然后再来就是将 LV 的容量降低!要注意的是,我们想要抽离的是 /dev/hda6,这个 PV 有 89 个 PE (上面的 pvdisplay 查询到的结果)。所以要这样进行:
# 3. 降低 LV 的容量,同时我们知道 /dev/hda6 有 89 个 PE
[root@www ~]# lvresize -l -89 /dev/vbirdvg/vbirdlvWARNING: Reducing active and open logical volume to 6.97 GBTHIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce vbirdlv? [y/n]: yReducing logical volume vbirdlv to 6.97 GBLogical volume vbirdlv successfully resized
# 会有警告信息!但是我们的实际数据量还是比 6.97G 小,所以就 y 下去吧![root@www ~]# lvdisplay--- Logical volume ---LV Name /dev/vbirdvg/vbirdlvVG Name vbirdvgLV UUID 8vFOPG-Jrw0-Runh-ug24-t2j7-i3nA-rPEyq0LV Write Access read/writeLV Status available# open 1
LV Size 6.97 GBCurrent LE 446Segments 5Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:0
|
很简单吧!这样就将 LV 缩小了!接下来就要将 /dev/hda6 移出 vbirdvg 这个 VG 之外罗! 我们得要先确定 /dev/hda6 里面的 PE 完全不被使用后,才能够将 /dev/hda6 抽离! 所以得要这样进行:
# 4.1 先确认 /dev/hda6 是否将 PE 都移除了!
[root@www ~]# pvdisplay--- Physical volume ---PV Name /dev/hda6VG Name vbirdvgPV Size 1.40 GB / not usable 11.46 MBAllocatable yes (but full)PE Size (KByte) 16384Total PE 89
Free PE 0Allocated PE 89PV UUID Z13Jk5-RCls-UJ8B-HzDa-Gesn-atku-rf2biN
....(中间省略)....--- Physical volume ---PV Name /dev/hda10VG Name vbirdvgPV Size 2.80 GB / not usable 6.96 MBAllocatable yesPE Size (KByte) 16384Total PE 179
Free PE 89Allocated PE 90PV UUID 7MfcG7-y9or-0Jmb-H7RO-5Pa5-D3qB-G426Vq
# 搞了老半天,没有被使用的 PE 竟然在 /dev/hda10 !此时得要搬移 PE 罗![root@www ~]# pvmove /dev/hda6 /dev/hda10
# pvmove 来源PV 目标PV ,可以将 /dev/hda6 内的 PE 通通移动到 /dev/hda10
# 尚未被使用的 PE 去 (Free PE)。# 4.2 将 /dev/hda6 移出 vbirdvg 中!
[root@www ~]# vgreduce vbirdvg /dev/hda6Removed "/dev/hda6" from volume group "vbirdvg"[root@www ~]# pvscanPV /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][root@www ~]# pvremove /dev/hda6Labels on physical volume "/dev/hda6" successfully wiped
|
很有趣吧!这样你的文件系统以及实际的 LV 与 VG 通通变小了,而且那个 /dev/hda6 还真的可以拿出来! 可以进行其他的用途啦!非常简单吧!
将上述用过的一些命令汇整一下,提供参考:
任务 | PV 阶段 | VG 阶段 | LV 阶段 |
搜寻(scan) | pvscan | vgscan | lvscan |
创建(create) | pvcreate | vgcreate | lvcreate |
列出(display) | pvdisplay | vgdisplay | lvdisplay |
添加(extend) | vgextend | lvextend (lvresize) | |
减少(reduce) | vgreduce | lvreduce (lvresize) | |
删除(remove) | pvremove | vgremove | lvremove |
改变容量(resize) | lvresize | ||
改变属性(attribute) | pvchange | vgchange | lvchange |
至於文件系统阶段 (filesystem 的格式化处理) 部分,还需要以 resize2fs 来修订文件系统实际的大小才行啊! ^_^ 。
至於虽然 LVM 可以弹性的管理你的磁碟容量,但是要注意,如果你想要使用 LVM 管理您的硬盘时,那么在安装的时候就得要做好 LVM 的规划了, 否则未来还是需要先以传统的磁碟添加方式来添加后,移动数据后,才能够进行 LVM 的使用啊!
会玩 LVM 还不行!你必须要会移除系统内的 LVM 喔!因为你的实体 partition 已经被使用到 LVM 去, 如果你还没有将 LVM 关闭就直接将那些 partition 删除或转为其他用途的话,系统是会发生很大的问题的! 所以罗,你必须要知道如何将 LVM 的装置关闭并移除才行!会不会很难呢?其实不会啦! 依据以下的流程来处理即可:
- 先卸载系统上面的 LVM 文件系统 (包括快照与所有 LV);
- 使用 lvremove 移除 LV ;
- 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
- 使用 vgremove 移除 VG:
- 使用 pvremove 移除 PV;
- 最后,使用 fdisk 修改 ID 回来啊!
好吧!那就实际的将我们之前创建的所有 LVM 数据给删除吧!
[root@www ~]# umount /mnt/lvm [root@www ~]# umount /mnt/snapshot [root@www ~]# lvremove /dev/vbirdvg/vbirdss <==先处理快照 Do you really want to remove active logical volume "vbirdss"? [y/n]: yLogical volume "vbirdss" successfully removed [root@www ~]# lvremove /dev/vbirdvg/vbirdlv <==再处理原系统 Do you really want to remove active logical volume "vbirdlv"? [y/n]: yLogical volume "vbirdlv" successfully removed[root@www ~]# vgchange -a n vbirdvg0 logical volume(s) in volume group "vbirdvg" now active[root@www ~]# vgremove vbirdvgVolume group "vbirdvg" successfully removed[root@www ~]# pvremove /dev/hda{6,7,8,9,10}Labels on physical volume "/dev/hda6" successfully wipedLabels on physical volume "/dev/hda7" successfully wipedLabels on physical volume "/dev/hda8" successfully wipedLabels on physical volume "/dev/hda9" successfully wipedLabels on physical volume "/dev/hda10" successfully wiped |
最后再用 fdisk 将磁碟的 ID 给他改回来 83 就好啦!整个过程就这样的啦! ^_^
现在你知道 LVM 的好处咯,未来如果你有想要添加某个 LVM 的容量时,就可以透过这个放大、缩小的功能来处理。 那么 LVM 除了这些功能之外,还有什么能力呢?其实他还有一个重要的能力,那就是系统快照 (snapshot)。 什么是系统快照啊?快照就是将当时的系统资讯记录下来,就好像照相记录一般! 未来若有任何数据更动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。 用讲的好像很难懂,我们用图解说明一下好了:
图 3.5.1、LVM 系统快照区域的备份示意图(虚线为文件系统,长虚线为快照区)
左图为最初建置系统快照区的状况,LVM 会预留一个区域 (左图的左侧三个 PE 区块) 作为数据存放处。 此时快照区内并没有任何数据,而快照区与系统区共享所有的 PE 数据, 因此你会看到快照区的内容与文件系统是一模一样的。 等到系统运行一阵子后,假设 A 区域的数据被更动了 (上面右图所示),则更动前系统会将该区域的数据移动到快照区, 所以在右图的快照区被占用了一块 PE 成为 A,而其他 B 到 I 的区块则还是与文件系统共享!
照这样的情况来看,LVM 的系统快照是非常棒的『备份工具』,因为他只有备份有被更动到的数据, 文件系统内没有被变更的数据依旧保持在原本的区块内,但是 LVM 快照功能会知道那些数据放置在哪里, 因此『快照』当时的文件系统就得以『备份』下来,且快照所占用的容量又非常小!所以您说,这不是很棒的工具又是什么?
那么快照区要如何创建与使用呢?首先,由於快照区与原本的 LV 共享很多 PE 区块,因此快照区与被快照的 LV 必须要在同一个 VG 上头。但是我们刚刚将 /dev/hda6 移除 vbirdvg 了,目前 vbirdvg 剩下的容量为 0 !因此,在这个小节里面我们得要再加入 /dev/hda6 到我们的 VG 后, 才能继续创建快照区罗!底下的动作赶紧再来玩玩看!
- 快照区的创建
底下的动作主要在添加需要的 VG 容量,然后再透过 lvcreate -s 的功能创建快照区
# 1. 先观察 VG 还剩下多少剩余容量 [root@www ~]# vgdisplay--- Volume group ---VG Name vbirdvg ....(其他省略)....VG Size 6.97 GBPE Size 16.00 MBTotal PE 446Alloc PE / Size 446 / 6.97 GB Free PE / Size 0 / 0 <==没有多余的 PE 可用!# 2. 将刚刚移除的 /dev/hda6 加入这个 VG 吧! [root@www ~]# pvcreate /dev/hda6Physical volume "/dev/hda6" successfully created [root@www ~]# vgextend vbirdvg /dev/hda6Volume group "vbirdvg" successfully extended [root@www ~]# vgdisplay--- Volume group ---VG Name vbirdvg ....(其他省略)....VG Size 8.36 GBPE Size 16.00 MBTotal PE 535Alloc PE / Size 446 / 6.97 GB Free PE / Size 89 / 1.39 GB <==多出了 89 个 PE 可用罗!# 3. 利用 lvcreate 创建系统快照区,我们取名为 vbirdss,且给予 60 个 PE [root@www ~]# lvcreate -l 60 -s -n vbirdss /dev/vbirdvg/vbirdlvLogical volume "vbirdss" created # 上述的命令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意! # -n 后面接快照区的装置名称, /dev/.... 则是要被快照的 LV 完整档名。 # -l 后面则是接使用多少个 PE 来作为这个快照区使用。[root@www ~]# lvdisplay--- Logical volume ---LV Name /dev/vbirdvg/vbirdssVG Name vbirdvgLV UUID K2tJ5E-e9mI-89Gw-hKFd-4tRU-tRKF-oeB03aLV Write Access read/writeLV snapshot status active destination for /dev/vbirdvg/vbirdlvLV 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 KBSegments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:1 |
您看看!这个 /dev/vbirdvg/vbirdss 快照区就被创建起来了!而且他的 VG 量竟然与原本的 /dev/vbirdvg/vbirdlv 相同!也就是说,如果你真的挂载这个装置时,看到的数据会跟原本的 vbirdlv 相同喔!我们就来测试看看:
[root@www ~]# mkdir /mnt/snapshot [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot [root@www ~]# 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-vbirdlv6955584 262632 6410328 4% /mnt/lvm /dev/mapper/vbirdvg-vbirdss6955584 262632 6410328 4% /mnt/snapshot # 有没有看到!这两个咚咚竟然是一模一样喔!我们根本没有动过 # /dev/vbirdvg/vbirdss 对吧!不过这里面会主动记录原 vbirdlv 的内容![root@www ~]# umount /mnt/snapshot # 最后将他卸载!我们准备来玩玩有趣的东西! |
- 利用快照区复原系统
首先,我们来玩一下,如何利用快照区复原系统吧!不过你要注意的是,你要复原的数据量不能够高於快照区所能负载的实际容量。由於原始数据会被搬移到快照区, 如果你的快照区不够大,若原始数据被更动的实际数据量比快照区大,那么快照区当然容纳不了,这时候快照功能会失效喔! 所以上面的案例中鸟哥才给予 60 个 PE (共 900MB) 作为快照区存放数据用。
我们的 /mnt/lvm 已经有 /mnt/lvm/etc, /mnt/lvm/log 等目录了,接下来我们将这个文件系统的内容作个变更, 然后再以快照区数据还原看看:
# 1. 先将原本的 /dev/vbirdvg/vbirdlv 内容作些变更,增增减减一些目录吧! [root@www ~]# df /mnt/lvm Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv6955584 262632 6410328 4% /mnt/lvm[root@www ~]# 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[root@www ~]# rm -r /mnt/lvm/log [root@www ~]# cp -a /boot /lib /sbin /mnt/lvm [root@www ~]# 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 # 看起来数据已经不一样了![root@www ~]# lvdisplay /dev/vbirdvg/vbirdss--- Logical volume ---LV Name /dev/vbirdvg/vbirdssVG Name vbirdvg ....(中间省略).... Allocated to snapshot 12.22% ....(底下省略).... # 从这里也看得出来,快照区已经被使用了 12.22% !因为原始的文件系统有异动过!# 2. 利用快照区将原本的 filesystem 备份 [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot [root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdlv6955584 370472 6302488 6% /mnt/lvm /dev/mapper/vbirdvg-vbirdss6955584 262632 6410328 4% /mnt/snapshot # 看吧!两者确实不一样了!开始将快照区内容复制出来吧![root@www ~]# mkdir -p /backups <==确认真的有这个目录! [root@www ~]# cd /mnt/snapshot [root@www snapshot]# tar -jcv -f /backups/lvm.tar.bz2 * # 此时你就会有一个备份数据,亦即是 /backups/lvm.tar.bz2 了! |
为什么要备份呢?为什么不可以直接格式化 /dev/vbirdvg/vbirdlv 然后将 /dev/vbirdvg/vbirdss 直接复制给 vbirdlv 呢? 要知道 vbirdss 其实是 vbirdlv 的快照,因此如果你格式化整个 vbirdlv 时,原本的文件系统所有数据都会被搬移到 vbirdss。 那如果 vbirdss 的容量不够大 (通常也真的不够大),那么部分数据将无法复制到 vbirdss 内,数据当然无法全部还原啊! 所以才要在上面表格中制作出一个备份文件的!了解乎?
而快照还有另外一个功能,就是你可以比对 /mnt/lvm 与 /mnt/snapshot 的内容,就能够发现到最近你到底改了啥咚咚! 这样也是很不赖啊!您说是吧! ^_^!接下来让我们准备还原 vbirdlv 的内容吧!
# 3. 将 vbirdss 卸载并移除 (因为里面的内容已经备份起来了) [root@www ~]# umount /mnt/snapshot [root@www ~]# lvremove /dev/vbirdvg/vbirdss Do you really want to remove active logical volume "vbirdss"? [y/n]: yLogical volume "vbirdss" successfully removed[root@www ~]# umount /mnt/lvm [root@www ~]# mkfs -t ext3 /dev/vbirdvg/vbirdlv [root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm [root@www ~]# tar -jxv -f /backups/lvm.tar.bz2 -C /mnt/lvm [root@www ~]# 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 # 是否与最初的内容相同啊!这就是透过快照来还原的一个简单的方法罗! |
- 利用快照区进行各项练习与测试的任务,再以原系统还原快照
换个角度来想想,我们将原本的 vbirdlv 当作备份数据,然后将 vbirdss 当作实际在运行中的数据, 任何测试的动作都在 vbirdss 这个快照区当中测试,那么当测试完毕要将测试的数据删除时,只要将快照区删去即可! 而要复制一个 vbirdlv 的系统,再作另外一个快照区即可!这样是否非常方便啊? 这对於教学环境中每年都要帮学生制作一个练习环境主机的测试,非常有帮助呢!
Tips: 以前鸟哥老是觉得使用 LVM 的快照来进行备份不太合理,因为还要制作一个备份档!后来仔细研究并参考徐秉义老师的教材(注3)后,才发现 LVM 的快照实在是一个棒到不行的工具!尤其是在虚拟机器当中建置多份给同学使用的测试环境, 你只要有一个基础的环境保持住,其他的环境使用快照来提供即可。即时同学将系统搞烂了,你只要将快照区删除, 再重建一个快照区!这样环境就恢复了!天呐!实在是太棒了! ^_^ |
# 1. 创建一个大一些的快照区,让我们将 /dev/hda6 的 PE 全部给快照区! [root@www ~]# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlvLogical volume "vbirdss" created[root@www ~]# lvdisplay /dev/vbirdvg/vbirdss--- Logical volume ---LV Name /dev/vbirdvg/vbirdssVG Name vbirdvgLV UUID as0ocQ-KjRS-Bu7y-fYoD-1CHC-0V3Y-JYsjj1LV Write Access read/writeLV snapshot status active destination for /dev/vbirdvg/vbirdlvLV Status available# open 0LV Size 6.97 GBCurrent LE 446 COW-table size 1.39 GBCOW-table LE 89Allocated to snapshot 0.00%Snapshot chunk size 4.00 KBSegments 1Allocation inheritRead ahead sectors auto- currently set to 256Block device 253:1 # 如何!这个快照区不小吧!# 2. 隐藏 vbirdlv 挂载 vbirdss [root@www ~]# umount /mnt/lvm [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot [root@www ~]# df /mnt/snapshot Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vbirdvg-vbirdss7192504 265804 6561340 4% /mnt/snapshot# 3. 开始恶搞! [root@www ~]# rm -r /mnt/snapshot/etc /mnt/snapshot/log [root@www ~]# cp -a /boot /lib /sbin /mnt/snapshot/ [root@www ~]# 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 <==与原本数据有差异了[root@www ~]# mount /dev/vbirdvg/vbirdlv /mnt/lvm [root@www ~]# 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 # 不论你在快照区恶搞啥咚咚,原本的 vbirdlv 里面的数据安好如初啊! # 假设你将 vbirdss 搞烂了!里面的数据不再需要!那该如何是好?# 4. 还原原本快照区的数据,回到与原文件系统相同的资讯 [root@www ~]# umount /mnt/snapshot [root@www ~]# lvremove /dev/vbirdvg/vbirdss Do you really want to remove active logical volume "vbirdss"? [y/n]: yLogical volume "vbirdss" successfully removed[root@www ~]# lvcreate -s -l 89 -n vbirdss /dev/vbirdvg/vbirdlv [root@www ~]# mount /dev/vbirdvg/vbirdss /mnt/snapshot [root@www ~]# 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 # 数据这样就复原了! |
老实说,上面的测试有点无厘头~因为快照区损毁了就删除再建一个就好啦!何必还要测试呢? 不过,为了让您了解到快照区也能够这样使用,上面的测试还是需要存在的啦!未来如果你有接触到虚拟机器, 再回到这里来温习一下肯定会有收获的!