LVM 逻辑卷 (logica volume manager)

逻辑卷轴管理员 (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 实作流程

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

扩展操作可以在线执行。

  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 -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 ~]#




小标题的图示缩小 LV 容量

上一小节我们谈到的是放大容量,现在来谈到的是缩小容量!假设我们想将 /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 还真的可以拿出来! 可以进行其他的用途啦!非常简单吧!




小标题的图示LVM 相关命令汇整与 LVM 的关闭

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

任务PV 阶段VG 阶段LV 阶段
搜寻(scan)pvscanvgscanlvscan
创建(create)pvcreatevgcreatelvcreate
列出(display)pvdisplayvgdisplaylvdisplay
添加(extend) vgextendlvextend (lvresize)
减少(reduce) vgreducelvreduce (lvresize)
删除(remove)pvremovevgremovelvremove
改变容量(resize)  lvresize
改变属性(attribute)pvchangevgchangelvchange

        至於文件系统阶段 (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]: 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 的容量时,就可以透过这个放大、缩小的功能来处理。 那么 LVM 除了这些功能之外,还有什么能力呢?其实他还有一个重要的能力,那就是系统快照 (snapshot)。 什么是系统快照啊?快照就是将当时的系统资讯记录下来,就好像照相记录一般! 未来若有任何数据更动了,则原始数据会被搬移到快照区,没有被更动的区域则由快照区与文件系统共享。 用讲的好像很难懂,我们用图解说明一下好了:

LVM 系统快照区域的备份示意图
图 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
# 数据这样就复原了!

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

转载于:https://www.cnblogs.com/centos2017/p/7896708.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql查询语句for xml path语法

【原地址】 for xml path作用&#xff1a;将多行的查询结果&#xff0c;根据某一些条件合并到一行。 例&#xff1a;现有一张表 执行下面语句 select Department,(SELECT Employee, FROM People b WHERE b.Departmenta.Department For XML Path()) Student from People as a g…

Android Studio打包以及Gradle配置构建

本文转载 郭霖公众号 https://mp.weixin.qq.com/s?__bizMzA5MzI3NjE2MA&mid2650241610&idx1&snb8af73f6c288b6617d9fe0ab3618118d&pass_ticketQK4j37kpmGNlsYcECWMb64HxKHEVJG5mSJubQEQguKI%3D 生成签名文件手动打包 首先生成签名文件&#xff0c;点击 Build…

java重载方法math_Java语言程序设计(十二)Math数学类,方法重载及变量作用域...

1.重载方法上一篇文章用到的max方法只能用于int型数据类型&#xff0c;但是如果需要决定两个浮点数中哪个较大&#xff0c;解决方法是创建另一个方法名相同但参数不同的方法&#xff0c;代码如下&#xff1a;public static double max(double num1, double num2){if(num1>nu…

编码(转)

https://www.zhihu.com/question/28164512 关于编码和乱码的问题&#xff0c;我简单讲一下。 通常问这类问题的人是混淆了若干个不同的概念&#xff0c;并且他们自己也没有意识到自己混淆了这些概念的。 终端显示字符的编码&#xff08;windows下终端是cmd&#xff0c;linux下是…

Spring MVC:测试简介

测试是软件开发中最重要的部分之一。 井井有条的测试有助于使应用程序代码保持良好状态&#xff0c;并且处于工作状态。 有很多不同类型的测试和方法。 在本文中&#xff0c;我想对基于Spring MVC的应用程序进行单元测试进行介绍。 不要希望在这里阅读有关Spring MVC测试的全部…

试验ConcurrentHashmap

我正在研究我最近的一个项目中的内存问题&#xff0c;该项目将数据保留在内存中以进行快速访问&#xff0c;但是应用程序的内存占用量非常大。 该应用程序大量使用CHM&#xff08;即Concurrenthashmap&#xff09; &#xff0c;因此&#xff0c;无需再费脑筋地猜测CHM是问题所…

java线程池任务失败_ThreadPoolExecutor线程池任务执行失败的时候会怎样

1. 任务执行失败时的处理逻辑1.1. WorkerWorker相当于线程池中的线程可以看到&#xff0c;Worker有几个重要的属性&#xff1a;thread &#xff1a; 这是Worker运行的线程&#xff0c;可以理解为一个Worker就是一个线程firstTask &#xff1a; 初始任务&#xff0c;可能为为n…

转:HttpModule与HttpHandler详解

ASP.NET对请求处理的过程&#xff1a;当请求一个*.aspx文件的时候&#xff0c;这个请求会被inetinfo.exe进程截获&#xff0c;它判断文件的后缀&#xff08;aspx&#xff09;之后&#xff0c;将这个请求转交给 ASPNET_ISAPI.dll&#xff0c;ASPNET_ISAPI.dll会通过http管道&…

mysql时间函数总结_MySQL 日期时间函数常用总结

获得当前日期时间(date time)1.1 函数&#xff1a;now()相关函数&#xff1a;current_timestamp()&#xff0c;localtime()&#xff0c;localtimestamp()举例说明&#xff1a;2. 获得当前日期(date)函数&#xff1a;curdate()相关函数&#xff1a;current_date()&#xff0…

Apache CXF – JAX-WS –简单教程

许多Java开发人员认为Web Service实现的任务艰巨-没人能真正责怪他们&#xff0c;尤其是在企业应用程序开发的多年中&#xff0c;这给开发和设计带来了很多复杂性。 对于某些人来说&#xff0c;了解它是构建完整的企业应用程序的下一步-Web服务-是实现面向服务设计的关键方案之…

Java StringBuilder神话被揭穿

神话 用加号运算符连接两个字符串是万恶之源 -匿名Java开发人员 注意 &#xff1a;此处讨论的测试的源代码可以在Github上找到 从大学时代起&#xff0c;我就学会了使用运算符将Java中的String连接视为致命的性能缺陷。 最近&#xff0c;在Backbase R&#xff06;D上进行了一…

java3d创建立方体_Opengl创建几何实体——四棱锥和立方体

//#include #include #include using namespace std;float rtri;float rquad;GLfloat points0[5][3] { {0,1,0},{-1,-1,1},{1,-1,1},{1,-1,-1},{-1,-1,-1} };GLfloat points1[8][3] { {1,1,-1},{-1,1,-1},{-1,1,1},{1,1,1},{1,-1,1},{-1,-1,1},{-1,-1,-1},{1,-1,-1} };//四棱…

WSO2 ESB的一种消息传递方式

正如我之前在WSO2 ESB工作时所发布的那样。 为了更好地理解此ESB&#xff0c;我一直在浏览示例 &#xff08;尚未完成所有示例 &#xff09;。 示例12是关于与ESB的单向消息传递&#xff0c;并使用TCP监视器使其可见。 我之前已经介绍过如何设置类似的工具“ TcpTunnelGUI”&am…

Eclipse-Java代码规范和质量检查插件-Checkstyle

CheckStyle是SourceForge下的一个项目&#xff0c;提供了一个帮助JAVA开发人员遵守某些编码规范的工具。它能够自动化代码规范检查过程&#xff0c;从而使得开发人员从这项重要但枯燥的任务中解脱出来。它可以根据设置好的编码规则来检查代码。比如符合规范的变量命名&#xff…

介绍一款好用 mongodb 可视化工具

最近想自己搭建一个个人博客&#xff0c;所以学了下mongodb&#xff0c;mongodb是用命令行输入的&#xff0c;有些人可能不太习惯&#xff0c;我自己找了下mongodb的一些可视化工具&#xff0c;发现了一款adminmongo很好用&#xff0c;这里介绍给你们用一下。 github地址&#…

用CSS3来代替JS实现交互

【CSS3和JS】 对于CSS了解的同学都知道&#xff0c;CSS的实现是最底层的&#xff0c;在实现方式和性能上都不是&#xff0c;JS这种提供接口的脚本可比的&#xff1b;从CSS3的动画和JS动画对比角度来看两者&#xff0c;会更清晰&#xff1b;而且随着前端框架的使用&#xff0c;…

php 如何宏定义,php – 在html中实现宏定义的方法

也许显而易见,但C预处理器可以完成这项工作.index._html#define _em(a) a #define _image(a, b) #define _list(a, b, c) a \\ b \ c \#define _theTile The Bar Title#include "head._html"_list(foo, bar, bean)This is really _em(great)_image(media/cat.jpg, …

python——函数 11、命名空间

三种名称空间1、内置名称空间&#xff1a; python解释器自带的名字,如&#xff1a;print、sum、max 当解释器启动时就会形成这个空间 2、全局名称空间&#xff1a; 执行python程序时就会产生这个空间 在每行顶端写代码 a10 def foo():print(a) foo() View Code3&…

Hadoop如何工作? HDFS案例研究

Apache Hadoop软件库是一个框架&#xff0c;该框架允许使用简单的编程模型跨计算机集群对大型数据集进行分布式处理。 它旨在从单个服务器扩展到数千台机器&#xff0c;每台机器都提供本地计算和存储。 库本身不用于依靠硬件来提供高可用性&#xff0c;而是被设计用来检测和处…

Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...

文章目录重量级锁(Mutex Lock)偏向锁(比较 ThreadID)偏向锁获取过程偏向锁的释放轻量级锁(自旋)轻量级锁的加锁过程轻量级锁的释放总结重量级锁(Mutex Lock)Synchronized 是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的 Mute…