逻辑卷轴管理员 (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: scsi Channel: 0 Id: 0 Lun: 0

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
实作流程

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 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 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 ~]# pvscan
No matching physical volumes found <==找不到任何的 PV 存在喔! [root@www ~]# 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
# 这个命令可以一口气创建这四个 partition 成为 PV 啦!注意大括号的用途 [root@www ~]# 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]
# 这就分别显示每个 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 <==是否已被分配,结果是 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
....(底下省略)....
# 由於 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 ~]# vgscan
Reading 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 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
# 最后那三行指的就是 PE 能够使用的情况!由於尚未切出 LV,因此所有的 PE
# 均可自由使用。

这样就创建一个 VG 了!假设我们要添加这个 VG 的容量,因为我们还有 /dev/hda9 :

# 2. 将剩余的 PV (/dev/hda9) 加给 vbirdvg 吧!
[root@www ~]# vgextend vbirdvg /dev/hda9
Volume group "vbirdvg" successfully extended [root@www ~]# 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
# 基本上,不难吧!这样就可以抽换整个 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 vbirdvg
Logical 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 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

如此一来,整个 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-vbirdlv
5741020 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 的容量时, 该如何进行完整的步骤呢?你只要这样做即可:

扩展操作可以在线执行。

  1. 用 fdisk 配置新的具有 8e system ID 的 partition
  2. 利用 pvcreate 建置 PV
  3. 利用 vgextend 将 PV 加入我们的 vbirdvg
  4. 利用 lvresize 将新加入的 PV 内的 PE 加入 vbirdlv 中
  5. 透过 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 -l
Device Boot Start End Blocks Id System
....(中间省略)....
/dev/hda10 2785 3150 2939863+ 8e Linux LVM
# 这个就是我们要的新的 partition 罗!# 2. 创建新的 PV:
[root@www ~]# pvcreate /dev/hda10
Physical volume "/dev/hda10" successfully created
[root@www ~]# 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]
# 可以看到 /dev/hda10 是新加入并且尚未被使用的喔!# 3. 加大 VG ,利用 vgextend 功能!
[root@www ~]# vgextend vbirdvg /dev/hda10
Volume group "vbirdvg" successfully extended
[root@www ~]# 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
# 不但整体 VG 变大了!而且剩余的 PE 共有 179 个,容量则为 2.80G
# 4. 放大 LV 吧!利用 lvresize 的功能来添加!
[root@www ~]# lvresize -l +179 /dev/vbirdvg/vbirdlv
Extending logical volume vbirdlv to 8.36 GB
Logical volume vbirdlv successfully resized
# 这样就添加了 LV 了喔!lvresize 的语法很简单,基本上同样透过 -l 或 -L 来添加!
# 若要添加则使用 + ,若要减少则使用 - !详细的选项请参考 man lvresize 罗! [root@www ~]# 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 [root@www ~]# df /mnt/lvm
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/vbirdvg-vbirdlv
5741020 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-vbirdlv
8628956 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 ~]#

缩小
LV 容量

上一小节我们谈到的是放大容量,现在来谈到的是缩小容量!假设我们想将 /dev/hda6 抽离出来! 那该如何处理啊?就让上一小节的流程倒转过来即可!

# 1. 先找出 /dev/hda6 的容量大小,并尝试计算文件系统需缩小到多少
[root@www ~]# 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
# 从这里可以看出 /dev/hda6 有多大,而且含有 89 个 PE 的量喔!
# 那如果要使用 resize2fs 时,则总量减去 1.40GB 就对了! [root@www ~]# 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 ]
# 从上面可以发现如果扣除 /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-vbirdlv
6955584 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/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
# 会有警告信息!但是我们的实际数据量还是比 6.97G 小,所以就 y 下去吧! [root@www ~]# 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

很简单吧!这样就将 LV 缩小了!接下来就要将 /dev/hda6 移出 vbirdvg 这个 VG 之外罗! 我们得要先确定 /dev/hda6 里面的 PE 完全不被使用后,才能够将 /dev/hda6 抽离! 所以得要这样进行:

# 4.1 先确认 /dev/hda6 是否将 PE 都移除了!
[root@www ~]# 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
# 搞了老半天,没有被使用的 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/hda6
Removed "/dev/hda6" from volume group "vbirdvg" [root@www ~]# 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] [root@www ~]# pvremove /dev/hda6
Labels on physical volume "/dev/hda6" successfully wiped

很有趣吧!这样你的文件系统以及实际的 LV 与 VG 通通变小了,而且那个 /dev/hda6 还真的可以拿出来! 可以进行其他的用途啦!非常简单吧!


LVM
相关命令汇整与 LVM 的关闭

将上述用过的一些命令汇整一下,提供参考:

任务 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 的装置关闭并移除才行!会不会很难呢?其实不会啦! 依据以下的流程来处理即可:

  1. 先卸载系统上面的 LVM 文件系统 (包括快照与所有 LV);
  2. 使用 lvremove 移除 LV ;
  3. 使用 vgchange -a n VGname 让 VGname 这个 VG 不具有 Active 的标志;
  4. 使用 vgremove 移除 VG:
  5. 使用 pvremove 移除 PV;
  6. 最后,使用 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]: y
Logical volume "vbirdss" successfully removed
[root@www ~]# lvremove /dev/vbirdvg/vbirdlv <==再处理原系统
Do you really want to remove active logical volume "vbirdlv"? [y/n]: y
Logical volume "vbirdlv" successfully removed [root@www ~]# vgchange -a n vbirdvg
0 logical volume(s) in volume group "vbirdvg" now active [root@www ~]# vgremove vbirdvg
Volume group "vbirdvg" successfully removed [root@www ~]# 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

最后再用 fdisk 将磁碟的 ID 给他改回来 83 就好啦!整个过程就这样的啦! ^_^


LVM
的系统快照

现在你知道 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 GB
PE Size 16.00 MB
Total PE 446
Alloc PE / Size 446 / 6.97 GB
Free PE / Size 0 / 0 <==没有多余的 PE 可用! # 2. 将刚刚移除的 /dev/hda6 加入这个 VG 吧!
[root@www ~]# pvcreate /dev/hda6
Physical volume "/dev/hda6" successfully created
[root@www ~]# vgextend vbirdvg /dev/hda6
Volume group "vbirdvg" successfully extended
[root@www ~]# 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 可用罗! # 3. 利用 lvcreate 创建系统快照区,我们取名为 vbirdss,且给予 60 个 PE
[root@www ~]# lvcreate -l 60 -s -n vbirdss /dev/vbirdvg/vbirdlv
Logical volume "vbirdss" created
# 上述的命令中最重要的是那个 -s 的选项!代表是 snapshot 快照功能之意!
# -n 后面接快照区的装置名称, /dev/.... 则是要被快照的 LV 完整档名。
# -l 后面则是接使用多少个 PE 来作为这个快照区使用。 [root@www ~]# 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/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-vbirdlv
6955584 262632 6410328 4% /mnt/lvm
/dev/mapper/vbirdvg-vbirdss
6955584 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-vbirdlv
6955584 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/vbirdss
VG 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-vbirdlv
6955584 370472 6302488 6% /mnt/lvm
/dev/mapper/vbirdvg-vbirdss
6955584 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]: y
Logical 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/vbirdlv
Logical volume "vbirdss" created [root@www ~]# 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
# 如何!这个快照区不小吧! # 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-vbirdss
7192504 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]: y
Logical 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
# 数据这样就复原了!

老实说,上面的测试有点无厘头~因为快照区损毁了就删除再建一个就好啦!何必还要测试呢? 不过,为了让您了解到快照区也能够这样使用,上面的测试还是需要存在的啦!未来如果你有接触到虚拟机器, 再回到这里来温习一下肯定会有收获的!

LVM 逻辑卷 (logica volume manager)的更多相关文章

  1. LVM逻辑卷基本概念及LVM的工作原理

    这篇随笔将详细讲解Linux磁盘管理机制中的LVM逻辑卷的基本概念以及LVM的工作原理!!! 一.传统的磁盘管理 其实在Linux操作系统中,我们的磁盘管理机制和windows上的差不多,绝大多数都是 ...

  2. (转)Linux LVM逻辑卷配置过程详解(创建、扩展、缩减、删除、卸载、快照创建)

    一.预备知识 LVM全称为Logical Volume Manager 逻辑卷管理器,LVM是Linux环境中对磁盘分区进行管理的一种机制,是建立在硬盘和分区之上.文件系统之下的一个逻辑层,可提高磁盘 ...

  3. Linux 笔记 - 第十七章 Linux LVM 逻辑卷管理器

    一.前言 在实际生产中,有时会遇到磁盘分区空间不足的情况,这时候就需要对磁盘进行扩容,普通情况下需要新加一块磁盘,重分区.格式化.数据复制.卸载旧分区.挂载新分区等繁琐的步骤,而且有可能造成数据的丢失 ...

  4. 【转载】Linux磁盘管理:LVM逻辑卷管理

    Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理 这篇随笔将详细讲解Linux磁盘管理机制中的LVM逻辑卷的基本概念以及LVM的工作原理!!! 一. ...

  5. Linux LVM 逻辑卷管理

    使用Linux好久了,一定会意识到一个问题,某个分区容量不够用了,想要扩容怎么办?这里就涉及到LVM逻辑卷的管理了,可以动态调整Linux分区容量. LVM 概述 全称Logical Volume M ...

  6. Linux随笔 - Linux LVM逻辑卷配置过程详解[转载]

    许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据,甚至被迫重新规划分区并重装操作系统,以 ...

  7. 磁盘文件系统管理与LVM逻辑卷

    一.磁盘以及分区管理 无论是Linux系统还是Windows系统.当现有硬盘的规划不能满足当前需求时.我们就需要将其重新规划和调整 实现上述操作我们就需要用到fdisk磁盘及分区管理工具.此工具是大多 ...

  8. LINUX——LVM逻辑卷管理

    LVM: logical volumes manager LVM逻辑卷部署 物理卷—>卷组—>逻辑卷 第一步:关机添加磁盘:两个磁盘可以构成一个磁盘组. 第二步:查看磁盘 # ls /de ...

  9. 【Linux】LVM 逻辑卷管理

    LVM - 逻辑卷管理 简介 LVM(Logical Volume Manager), 即逻辑卷管理,是Linux环境下对磁盘分区进行管理的一种机制. 相关名词 PV(physical volume) ...

  10. 『学了就忘』Linux文件系统管理 — 65、LVM逻辑卷管理介绍

    目录 1.LVM逻辑卷管理的简介 2.LVM逻辑卷管理的原理 3.总结建立LVM分区的步骤 1.LVM逻辑卷管理的简介 LVM是Logical Volume Manager的简称,中文就是逻辑卷管理. ...

随机推荐

  1. 《C# 爬虫 破境之道》:概述

    第一节:写作本书的目的 关于笔者 张晓亭(Mike Cheers),1982年出生,内蒙古辽阔的大草原是我的故乡. 没有高学历,没有侃侃而谈的高谈阔论,拥有的就是那一份对技术的执著,对自我价值的追求. ...

  2. crawler碎碎念5 豆瓣爬取操作之登录练习

    import requests import html5lib import re from bs4 import BeautifulSoup s = requests.Session() #这里要提 ...

  3. Nhibernate的Session和StatelessSession性能比较

    Nhibernate的Session和StatelessSession性能比较 作者:Jesai 一个月入30K的大神有一天跟我说:我当年在你现在这个阶段,还在吊儿郎当呢!所以你努力吧! 有时候,一个 ...

  4. Java框架之SpringMVC 04-视图解析-Spring表单-JSON-上传下载

    SpringMVC 视图解析 请求处理方法(controller方法)执行完成后,最终返回一个 ModelAndView 对象,即使出现异常也会返回一个 ModelAndView 对象.对于那些返回 ...

  5. 遗传编程GP-地图路径寻路

    本文介绍的是基于GP,并非A*算法,算是另类实现吧. 先看看地图定义,在文本文件中定义如下字符串,代表30列11行大小的地图 初始位置在左上角(0,0) ,值为1的是允许走的通的路,目标位置为右下角( ...

  6. 基于javaSwing的贪食蛇游戏

    这个项目时,是我好几年前写的了.但对刚入门,或者想瞧瞧java的图形的界面swing的同学,还是有点用处的. 在这推荐给你. 涉及技术点 swing,多线程,文件读写,多媒体文件播放等 游戏简介 该游 ...

  7. maven-assembly-plugin入门

    愿文地址:https://www.jianshu.com/p/e8585a991e8e 当你使用 Maven 对项目打包时,你需要了解以下 3 个打包 plugin,它们分别是 plugin func ...

  8. NOI2.4 2011

    描述 已知长度最大为200位的正整数n,请求出2011^n的后四位. 输入 第一行为一个正整数k,代表有k组数据,k<=200接下来的k行, 每行都有一个正整数n,n的位数<=200 输出 ...

  9. Android的学习之路一

    在Android的道路上越走越远==,本着一颗童心去学习,没想到最后会成为自己的职业.看到过知乎上写的,并不是兴趣使比尔盖茨以及乔布斯他们成就斐然,而是他们真正的牛逼使得即使买大饼也能成为世界首富.然 ...

  10. 什么是Druid

    一.Druid是什么 Druid 单词来源于西方古罗马的神话人物,中文常常翻译成德鲁伊. 玩过魔兽世界,暗黑破坏神,Dota,炉石传说,Dota自走棋的朋友,对这个词一定不陌生. 本文中所介绍的Dru ...