给新手的一份LVM实验笔记

JavaGG 发布于 2009/06/06 10:46
阅读 1K+
收藏 0

LVM(Logical volume manager)实验笔记:
一:What is LVM?
即为逻辑卷管理
为了传统的磁盘管理开销设计的逻辑卷管理平台,他方便对你的存储磁盘管理如:增加和减少容量,甚至还有“快照”功能对你不移动的目标做备份。
我们这里打个比方,比如现实中你有一个werll的存储目录,挂载到了/dev/sdc,然而这个sdc硬盘容量大小为20G,里面存储了众多的数据,当有一天你的这个目录容量达不到你的需求了,你能做的就是增加一块大容量的硬盘去替换掉现在这块小硬盘,然后把原来sdc硬盘里的内容再拷贝到你的新硬盘里面去,然后将新硬盘挂载到werll下面,唯一考虑的是,我们能不能把两块硬盘“合在一起”挂载到werll呢?或者在不变动原来硬盘的情况下增加werll容量呢?答案是肯定的,那就是LVM实现的目的!
LVM working principle (工作原理):
这里我们要知道几个概念:
1:物理卷:Physical Volume (PV)
即为LVM底层的东西,可以为一个硬盘如sda,sdb,也可以为一个硬盘里面的一个分区如sda1,sdb1。
2:Volume Group (vg)卷组:
它是由一个或者多个物理卷组成的一个抽象的概念,表现形式为/dev/vg0,注意这里的vg0为一个目录而不是一个设备节点,卷组名称就是他的目录名称。
3:物理块 Physical Extents (PE):当一个物理卷加入卷组时,它的空间会分成大小均等的小组块,我们称为物理块,简称(PE),物理块大小是在创建卷组的时候被指定,具有代表性的物理块大小是4MB
更形象的表示他们,我们可以如下图去认识他们:
物理卷:physical volume(PV)

卷组 Volume Group (VG)

逻辑卷 Logical Volume (LV):

上面我们看见的LV0和LV1就是基于VG0上建立的逻辑卷
二:使用逻辑卷(LVM)
通常我们可以利用mkfs.ext3 /dev/vg0/lv?这样的形式来在LV?逻辑卷上面建立文件系统
然后挂载了我们指定的目录上。

三:实验目的
1,创建和管理PV,VG,LV
2,调整VG,LV,filesystem大小
3:LVM线性卷,镜像卷,带区卷,快照的建立
4:LVM线性卷转换成镜像卷。

假设我们有4块硬盘 /dev/sdc /dev/sdd /dev/sde /dev/sdf
实验环境为VMWARE上的RHEL5.2
然后我们对它进行分区操作,并把标卷属性设置成8e
[root@localhost /]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n (开始分区)
Command action
   e   extended
   p   primary partition (1-4)
p (主分区)
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): +1024M (设置分区大小为1GB)

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e (这里设置成LVM分区格式)
Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdc: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            1         125     1004031    8e  Linux LVM

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

如上所示 sdd sde sdf的就不演示了

①,        物理卷的创建 pvcreate,pvs pvscan,pvdisplay
[root@localhost /]# pvcreate /dev/sd[cdef]1 (创建4个物理卷)
  Physical volume "/dev/sdc1" successfully created
  Physical volume "/dev/sdd1" successfully created
  Physical volume "/dev/sde1" successfully created
  Physical volume "/dev/sdf1" successfully created

       [root@localhost /]# pvs (简单查看PV数量)
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdc1       lvm2 --   980.50M 980.50M
  /dev/sdd1       lvm2 --   980.50M 980.50M
  /dev/sde1       lvm2 --   980.50M 980.50M
  /dev/sdf1       lvm2 --   980.50M 980.50M
或者可以利用pvdisplay查看详细信息

[root@localhost /]# pvdisplay
  "/dev/sdc1" is a new physical volume of "980.50 MB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name               
  PV Size               980.50 MB
  Allocatable           NO
  PE Size (KByte)       0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               KSHaKY-adM1-HBz8-SWv4-rd07-Cc1R-rGZD90
   
  "/dev/sdd1" is a new physical volume of "980.50 MB"
  --- NEW Physical volume ---
。。。。。。
。。。。。(后面的省略)

② 卷组的创建:vgcreate(建立卷组) vgs(查看) vgdisplay(查看) vgcfgbackup(备份) vgcfgrestore(还原) vgchange(设置激活),vgmerge(合并)vgsplit(分离)vgextend(增加PV)vgreduce(减少PV) vgremove
     [root@localhost /]# vgcreate vg0 /dev/sd[cd]1(创建一个卷组,物理卷成员是sdc1和sdd1)以上的vg0是我们为卷组取的名字,可以自定。
        Volume group "vg0" successfully created
[root@localhost /]# vgs (查看VG数量和使用情况)
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    2   0   0 wz--n- 1.91G 1.91G
[root@localhost /]# vgdisplay (详细列出PV的资料)
  --- Volume group ---
  VG Name               vg0
  System ID            
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  1
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               1.91 GB
  PE Size               4.00 MB
  Total PE              490
  Alloc PE / Size       0 / 0   
  Free  PE / Size       490 / 1.91 GB
  VG UUID               6fwEEl-95zh-Xcj8-yP8G-3AZL-NO8I-W8rzAD
这里我们要注意一下几条信息:
VG Size               1.91 GB (vg0的总容量)
  PE Size               4.00 MB (单个物理块大小)
  Total PE              490(物理块总数)
  Alloc PE / Size       0 / 0   (前面是已经使用的物理块数,后面显示的是容量)
  Free  PE / Size       490 / 1.91 GB(同上,但是是没有使用的物理块和对应的容量)
[root@localhost /]# vgcfgbackup -f backup vg0 (备份一个名为backup的卷组到当前目录)
  Volume group "vg0" successfully backed up.
[root@localhost /]# ll
total 170
-rw-------  1 root root   990 May 31 08:38 backup
drwxr-xr-x  2 root root  4096 May 31 07:32 bin
drwxr-xr-x  4 root root  1024 Apr 12 16:17 boot
[root@localhost /]# vgcfgrestore -f backup vg0 (这里为恢复一个名为backup的VG备份到当前名为vg0)
Restored volume group vg0
思考一下,这里回复成功了还不代表这个恢复的vg0就能正常使用了,我们还得使用一个参数把它激活:

[root@localhost /]# vgchange –ay (这里为激活所有的卷组,因为当前我们只有一个vg0)
  0 logical volume(s) in volume group "vg0" now active

试想一下,如果我们要把两个vg合并一起呢?如vg0和vg1合并成一个名为vg0的卷组,该怎么做,或者是要把一个vg分离成两个vg,如vg0分离成一个vg1和vg0
那么我们就要用到以下命令了vgmerge(合并)/vgsplit(分离)
在这之前我们还要建立一个vg1方便我们合并和分离
Vgmerge合并的操作:
[root@localhost /]# pvcreate  /dev/sd[ef]1
  Physical volume "/dev/sde1" successfully created
  Physical volume "/dev/sdf1" successfully created
[root@localhost /]# vgcreate  vg1 /dev/sd[ef]1
  Volume group "vg1" successfully created
[root@localhost /]# vgs vg0 (查看一下vg0的容量为1.91GB)
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    2   0   0 wz--n- 1.91G 1.91G
[root@localhost /]# vgmerge -v vg0 vg1(把vg0和vg1合并)
    Checking for volume group "vg0"
  /dev/cdrom: open failed: Read-only file system
    Checking for volume group "vg1"
    Archiving volume group "vg1" metadata (seqno 1).
    Archiving volume group "vg0" metadata (seqno 2).
    Writing out updated volume group
    Creating volume group backup "/etc/lvm/backup/vg0" (seqno 3).
  Volume group "vg1" successfully merged into "vg0"
这里需要注意的是:前面的那个vg0是新的vg名字,意思是把vg0和vg1合并成一个vg0
                  那么以前那个vg0以为有了vg1的加入,容量也会增加,下面我们查看一下vg0的信息
[root@localhost /]# vgs vg0
  VG   #PV #LV #SN Attr   VSize VFree
  vg0    4   0   0 wz--n- 3.83G 3.83G (由原来的1.91增加到了3.83GB)
假如我们要把一个新的分区加入到现有的vg0当中该怎么做呢
比如sdb1加入到vg0中
首先将sdb1分区设置成8e格式然后创建成物理卷
[root@localhost /]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created
然后我们把sdb1这个pv加入到vg0中去
查看一下全部pv的信息
[root@localhost /]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1       lvm2 --     4.99G   4.99G
  /dev/sdc1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdd1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sde1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdf1  vg0  lvm2 a-   980.00M 980.00M
我们发现sdb1还没有加入到vg0里面去
[root@localhost /]# vgextend vg0 /dev/sdb1(这里就是把sdb1加入到vg0里面去拉)
  Volume group "vg0" successfully extended
[root@localhost /]# pvs (现在看见了吧,已经成功加入)
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1  vg0  lvm2 a-     4.99G   4.99G
  /dev/sdc1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdd1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sde1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdf1  vg0  lvm2 a-   980.00M 980.00M
那么我们要把sdb1在vg0里面移动出来呢?
[root@localhost /]# vgreduce vg0 /dev/sdb1 (这里就是在vg0里面把sdb1移除)
Removed "/dev/sdb1" from volume group "vg0"
[root@localhost /]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdb1       lvm2 --     4.99G   4.99G
  /dev/sdc1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdd1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sde1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdf1  vg0  lvm2 a-   980.00M 980.00M

vg的分离操作
[root@localhost /]# vgsplit vg0 vg1 /dev/sde1(这里的意思是从vg0里面提出/dev/sde1出来新建到一个vg1里面去)
[root@localhost /]# vgs (这里我们很清楚的看见了新建的VG1刚好是sde1的容量)
  VG   #PV #LV #SN Attr   VSize   VFree  
  vg0    3   0   0 wz--n-   2.87G   2.87G
  vg1    1   0   0 wz--n- 980.00M 980.00M

vg的删除:
[root@localhost /]# vgremove vg1
  Volume group "vg1" successfully removed


以上是pv和vg的创建以及转换,那么下面我们就来基于卷组上面创建LV,也就是逻辑卷。
②lv(逻辑卷的创建)lvcreate lvs lvdisplay resize2fs lvresize lvextend lvreduce lvremove
[root@localhost /]# lvcreate -L 500 -n lv0 vg0 (这里我们基于vg0上面创建了一个大小为500M的lv0逻辑卷)
上面需要注意的是 –L表示指定逻辑卷的大小,也就是MB,如果是 –l 那么就是指定的是物理块(PE),每个物理块我们创建的时候为4MB –n指定lv的名字
Logical volume "lv0" created
[root@localhost /]# lvs
  LV   VG   Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  lv0  vg0  -wi-a- 500.00M   

下面我们可以基于这个lv0逻辑卷创建文件系统了:
[root@localhost /]# mkfs.ext3 -L lv0 /dev/vg0/lv0 (运用mkfs.ext3我们创建了文件系统,下面就可以把这个带有ext3文件系统的逻辑卷挂载到我们指定目录为我们提供服务了)
mke2fs 1.39 (29-May-2006)
Filesystem label=lv0
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
128016 inodes, 512000 blocks
25600 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
63 block groups
8192 blocks per group, 8192 fragments per group
2032 inodes per group
Superblock backups stored on blocks:
        8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409

Writing inode tables: done                           
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@localhost /]# mkdir /werll (创建挂载点)
[root@localhost /]# mount -L lv0 /werll/ (挂载lv0)
[root@localhost /]# df -TH
Filesystem    Type     Size   Used  Avail Use% Mounted on
/dev/sda3     ext3     4.1G   2.1G   1.8G  55% /
/dev/sda1     ext3     104M    12M    87M  12% /boot
tmpfs        tmpfs     264M      0   264M   0% /dev/shm
/dev/mapper/vg0-lv0  ext3     508M    11M   471M   3% /werll

如上所示我们看见了LV0的挂载点大小正好是我们创建lv0时候分配的500MB

调整lv和filesystem(文件系统)的大小:
这里有两个概念:
第一:如果是增加容量,那么我们先要增加LV逻辑卷的大小,然后再增加文件系统的大小
第二:如果是减小容量,那么我们先要收缩文件系统的大小再减少LV的大小,意思是如果你先减少了LV到2GB 那么如果LV文件系统里面的数据是大于2GB的,那么有可能会损坏文件系统或者出现减少容量不成功,所以我们在减少LV容量的时候,应该考虑文件系统里面的数据实际大小而定。
这里增大LV大小可以用lvextend和lvresize都行,只不过lvextend在处理未被格式化和挂载的LV比较好些。
当前我们的LV大小为500MB,所处的VG0大小为2G,那么我们可以再为LV增加500M的容量扩展。
[root@localhost /]# lvresize -L +500 /dev/vg0/lv0 (我们为LV0增加了500M大小的容量)
  /dev/cdrom: open failed: Read-only file system
  Extending logical volume lv0 to 1000.00 MB
  Logical volume lv0 successfully resized
在增加了lv0大小后我们还得为基于LV0上面的文件系统做增量操作
[root@localhost /]# umount /werll/ (首先卸载掉挂载点)
[root@localhost /]# resize2fs /dev/vg0/lv0 (这里运行resize2fs调整增大后的LV所对应的文件系统实际大小)
resize2fs 1.39 (29-May-2006)



Please run 'e2fsck -f /dev/vg0/lv0' first (提示我们进行磁盘效验检查,下面我们继续).
[root@localhost /]# fsck.ext3 -f /dev/vg0/lv0
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
lv0: 11/128016 files (9.1% non-contiguous), 26700/512000 blocks
[root@localhost /]# resize2fs /dev/vg0/lv0
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg0/lv0 to 1024000 (1k) blocks.
The filesystem on /dev/vg0/lv0 is now 1024000 blocks long.

[root@localhost /]# mount /dev/vg0/lv0 /werll/ (挂载上我们增加过后的LV)
[root@localhost /]# df -TH
Filesystem    Type     Size   Used  Avail Use% Mounted on
/dev/sda3     ext3     4.1G   2.1G   1.8G  55% /
/dev/sda1     ext3     104M    12M    87M  12% /boot
tmpfs        tmpfs     264M      0   264M   0% /dev/shm
/dev/mapper/vg0-lv0 ext3     1.1G    12M   953M   2% /werll (这里显示容量变大了)

以上为增大LV以及所对应的文件系统容量,下面我们实现怎么减少文件系统容量和LV容量。减少容量我们用lvresize和lvreduce都行

这里我们要考虑我们要先收缩文件系统然后再收缩LV卷的大小,顺序不能搞反了,呵呵
我们在原来的1000MB减少到800吧


[root@localhost /]# umount /werll/
[root@localhost /]# resize2fs /dev/vg0/lv0 800M (后面的那个800M表示为你收缩过后文件系统的实际大小)
resize2fs 1.39 (29-May-2006)
Please run 'e2fsck -f /dev/vg0/lv0' first.
[root@localhost /]# fsck.ext3 -f /dev/vg0/lv0 (运行磁盘检查)
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
lv0: 11/254000 files (9.1% non-contiguous), 42831/1024000 blocks
[root@localhost /]# resize2fs /dev/vg0/lv0 800M (磁盘检查过后没有错误,那么再次进行收缩操作)
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg0/lv0 to 819200 (1k) blocks.
The filesystem on /dev/vg0/lv0 is now 819200 blocks long.

[root@localhost /]# lvextend -L -200 /dev/vg0/lv0
  Negative argument not permitted - use lvreduce
  Run `lvextend --help' for more information.
[root@localhost /]# lvreduce -L -200 /dev/vg0/lv0
  /dev/cdrom: open failed: Read-only file system
  WARNING: Reducing active logical volume to 800.00 MB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
  Reducing logical volume lv0 to 800.00 MB
  Logical volume lv0 successfully resized
[root@localhost /]# mount /dev/vg0/lv0 /werll/
[root@localhost /]# df -TH
Filesystem    Type     Size   Used  Avail Use% Mounted on
/dev/sda3     ext3     4.1G   2.1G   1.8G  55% /
/dev/sda1     ext3     104M    12M    87M  12% /boot
tmpfs        tmpfs     264M      0   264M   0% /dev/shm
/dev/mapper/vg0-lv0  ext3     813M    12M   760M   2% /werll (这正是我们需要的效果,呵呵)
下面我们来实现基于LVM的线性卷,条带卷和镜像,快照的建立
线性卷(Linear volume)的建立:
查看一下VG0下面有几个PV

[root@localhost /]# pvs
  PV         VG   Fmt  Attr PSize   PFree  
  /dev/sdc1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdc2       lvm2 --     1.04G   1.04G
  /dev/sdd1  vg0  lvm2 a-   980.00M 980.00M
  /dev/sdd2       lvm2 --     1.04G   1.04G
  /dev/sde1       lvm2 --   980.50M 980.50M
  /dev/sde2       lvm2 --     1.04G   1.04G
有两个,分别是sdc1和sdd1大小分别是980MB和1.04GB
[root@localhost /]# lvcreate -l 250  -n lv0 vg0 /dev/sdc1:0-150 /dev/sdd1:0-100
以上的-l 250是我们需要建立LV0的大小,意思是总共250个PE,每个PE4MB那么最终结果就是1000MB,后面的vg0 /dev/sdc1:0-150 /dev/sdd1:0-100 意思是我们提取vg0下面的sdc1上面150个PE和sdd1上面的100个PE来组成LV0的总容量,下面我们查看一下
[root@localhost /]# lvs
  LV   VG   Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  lv0  vg0  -wi-ao 1000.00M   (这里刚好是1000M的容量)

接下来是LVM镜像卷的建立:
镜像卷有两种创建方式:
第一种是指定MB的大小
第二种是指定VG?上面多少个PE去创建
[root@localhost /]# lvcreate  -L 500 -m1 --corelog -n lv1 vg1
上面我们用到了-m1 和—corelog参数启用了镜像卷和核心日志功能

条带卷的创建
[root@localhost /]# lvcreate -n lv1 -i2 -I64 -L 1000 vg1
-i参数告诉LVM应该在多少个PV上分散数据,。-I参数指定单位为KB的块大小
  Logical volume "lv1" created
[root@localhost /]# lvs
  LV   VG   Attr   LSize    Origin Snap%  Move Log Copy%  Convert
  lv0  vg0  -wi-ao 1000.00M                                      
  lv1  vg1  -wi-a- 1000.00M   

  LVM快照的建立,这里需要注意的是,快照记录的是改变过后的东西,如果快照的容量超过了他所记录的最大数,那么LVM会自动把这个快照删除。
[root@localhost /]# mount /dev/vg0/lv0 /werll/
[root@localhost /]# cd /werll/
[root@localhost werll]# ls
lost+found
[root@localhost werll]# touch 1 2 3 4 5 6
[root@localhost werll]# ls
1  2  3  4  5  6  lost+found   (这里的目的是我们在LV0文件系统上面给他产生数据,那么一会我们建立的快照里面会有和他里面内容一样的数据出现)
  [root@localhost /]# lvcreate  -L500 -s -n backup /dev/vg0/lv0(这里我们产生一个大小为500M的LV0快照)
  Logical volume "backup" created
[root@localhost /]# mount /dev/vg0/backup /backup/ (挂载快照到backup目录上)
[root@localhost /]# cd /backup/
[root@localhost backup]# ls
1  2  3  4  5  6  lost+found (这里显示了和LV0里面一样的内容,证明了我们的快照建立成功)



 

加载中
返回顶部
顶部