注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 【全新打造】思科认证跟踪..
 帮助

在 Linux 中使用动态磁盘


2008-07-23 21:10:13
 标签:磁盘 Linux 动态   [推送到技术圈]

 是否遇到过这样的问题,划分了 10G 的一个分区,挂接到 /home 下,可是随着时间的流逝,10G 的空间开始不够用了,需要把它扩充。假设要扩充到 12G,那么唯一的方法就是建立一个 12G 的新分区,然后将原来的 10G 分区中的数据全部移动到新分区中,再修改挂接配置。这样不仅麻烦而且浪费时间。
Linux 2.4 开始支持 LVMLogical Volume Manager,逻辑卷管理器),通过 LVM,可以动态地改变分区(准确地说应当称之为卷)的大小,而不必担心数据移动的问题。LVM 的原理是,首先在硬盘上创建 PVPhysical Volume: 物理卷)。PV 可以创建在一个分区上,也可以创建在整个硬盘上,它由许多的 PEPhysical Extent)组成,每个 PE 的默认值为 4MB。之后将数个 PV 合在一起组成一个 VGVolume Group: 卷组)。最后在 VG 中创建 LVLogical Volume: 逻辑卷),它也由许多的 LELogical Extent)组成,LE 的大小与 PE 相同,并与 PE 一一对应。LV 就可以像普通的分区一样挂接在任何地方了。
下面我们总结一下这里出现的词汇:
LVM (Logical Volume Manager
,逻辑卷管理器):Linux 中用于管理逻辑卷的功能。
PV
Physical Volume,物理卷):数据实际保存的位置,由许多 PE 组成。
VG
Volume Group,卷组):多个 PV 组合在一起。
LV
Logical Volume,逻辑卷):LVM 创建的虚拟卷,由许多 LE 组成,可以像普通分区一样进行挂接,可以动态修改大小。
PE
Physical Extent):LVM 管理的最小单位,默认为 4MB
LE
Logical Extent):大小与 PE 相同,并与 PE 一一对应。
制作 LVM
下面我们尝试在 Linux 下使用 LVM 来管理分区。以下操作使用的系统为 Fedora Core 3
1. 首先用 fdisk 创建两个分区 /dev/hda7 /dev/hda8,选择分区大小为 1G。结果如下:
    Device Boot      Start         End      Blocks   Id  System
 /dev/hdb1               1        2117     1000251   83  Linux
 /dev/hdb2            2118        4234     1000282+  83  Linux
2. 使用 pvcreate 命令将分区建立为 PV
 # pvcreate /dev/hdb1
   Physical volume "/dev/hdb1" successfully created
 # pvcreate /dev/hdb2
   Physical volume "/dev/hdb2" successfully created
3. 使用 vgcreate 命令将新建的两个 PV 组合成 VG
 # vgcreate newvg /dev/hdb1 /dev/hdb2
   Volume group "newvg" successfully created
之后我们可以发现在 /dev 目录下多了一个名为 newvg 的目录,这就是我们建立的 VG
4. 使用 lvcreate 命令在 newvg 中建立一个 LV,名为 lv01,大小为 256M
 # lvcreate -L
256M -n lv01 newvg
   Logical volume "lv01" created
可以发现在 /dev/newvg 下多了一个名为 lv01 的符号链接,这就是 LV
5. lv01 上建立文件系统。
 # mke2fs /dev/newvg/lv01
6. 挂接该文件系统。
 # mount -t ext2 /dev/newvg/lv01 /root/lv
至此一个 LV 已经建立完毕。我们可以试着增大该 LV 的容量。使用 lvextend 命令将刚刚建立的 LV 增大 128M。扩大容量之后需要使用 resize2fs 命令来扩大原有的文件系统到新的容量。
 # lvextend -L+
128M /dev/newvg/lv01
   Extending logical volume lv01 to 384.00 MB
   Logical volume lv01 successfully resized
 
 # umount /dev/newvg/lv01
 
 # e2fsck -f /dev/newvg/lv01
 e2fsck 1.36 (05-Feb-2005)
 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/newvg/lv01: 12/65536 files (8.3% non-contiguous), 10336/262144 blocks
 
 # resize2fs /dev/newvg/lv01
 resize2fs 1.36 (05-Feb-2005)
 Resizing the filesystem on /dev/newvg/lv01 to 393216 (1k) blocks.
 The filesystem on /dev/newvg/lv01 is now 393216 blocks long.
 
 # mount -t ext2 /dev/newvg/lv01 /root/lv
之后马上就可以利用 df -h 命令看到文件系统的容量改变了。
我们也可以利用 vgdisplay 命令来查看 VG 的信息。
 # vgdisplay newvg
   --- Volume group ---
   VG Name               newvg
   System ID
   Format                lvm2
   Metadata Areas        2
   Metadata Sequence No  3
   VG Access             read/write
   VG Status             resizable
   MAX LV                0
   Cur LV                1
   Open LV               1
   Max PV                0
   Cur PV                2
   Act PV                2
   VG Size               1.91 GB
   PE Size               4.00 MB
   Total PE              488
   Alloc PE / Size       96 / 384.00 MB
   Free  PE / Size       392 / 1.53 GB
   VG UUID               YAlPwY-Vlfa-ZBa7-4jPQ-60Gk-Fzwi-jUW8BM
LVM使用手册

1
简介
1.1
什么是LVM?
LVM
Logical Volume Manager(逻辑卷管理)的简写,它由Heinz MauelshagenLinux 2.4内核上实现,目前最新版本为:稳定版1.0.5,开发版 1.1.0-rc2,以及LVM2开发版。
与传统的磁盘与分区相比,LVM为计算机提供了更高层次的磁盘存储。它使系统管理员可以更方便的为应用与用户分配存储空间。在LVM管理下的存储卷可以按需要随时改变大小与移除(可能需对文件系统工具进行升级)LVM也允许按用户组对存储卷进行管理,允许管理员用更直观的名称("sales' 'development')代替物理磁盘名('sda''sdb')来标识存储卷。
1.2
为什么使用LVM?
LVM
通常用于装备大量磁盘的系统,但它同样适于仅有一、两块硬盘的小系统。
1.2.1
小系统使用LVM的益处
传统的文件系统是基于分区的,一个文件系统对应一个分区。这种方式比较直观,但不易改变:
1.
不同的分区相对独立,无相互联系,各分区空间很易利用不平衡,空间不能充分利用;
2.
当一个文件系统/分区已满时,无法对其扩充,只能采用重新分区/建立文件系统,非常麻烦;或把分区中的数据移到另一个更大的分区中;或采用符号连接的方式使用其它分区的空间。
3.
如果要把硬盘上的多个分区合并在一起使用,只能采用再分区的方式,这个过程需要数据的备份与恢复。
当采用LVM时,情况有所不同:
1.
硬盘的多个分区由LVM统一为卷组管理,可以方便的加入或移走分区以扩大或减小卷组的可用容量,充分利用硬盘空间;
2.
文件系统建立在逻辑卷上,而逻辑卷可根据需要改变大小(在卷组容量范围内)以满足要求;
3.
文件系统建立在LVM上,可以跨分区,方便使用;
1.2.2
大系统使用LVM的益处
在使用很多硬盘的大系统中,使用LVM主要是方便管理、增加了系统的扩展性。
在一个有很多不同容量硬盘的大型系统中,对不同的用户的空间分配是一个技巧性的工作,要在用户需求与实际可用空间中寻求平衡。
用户/用户组的空间建立在LVM上,可以随时按要求增大,或根据使用情况对各逻辑卷进行调整。当系统空间不足而加入新的硬盘时,不必把用户的数据从原硬盘迁移到新硬盘,而只须把新的分区加入卷组并扩充逻辑卷即可。同样,使用LVM可以在不停服务的情况下。把用户数据从旧硬盘转移到新硬盘空间中去。
2 LVM
构成
LVM
的结构简图如下:
hda1 hdc1 sdc (PV:s
物理卷,一般为分区或整个硬盘)
\
/
\
/
diskvg (VG
卷组由物理卷组成)
/ | \
/ | \
usrlv rootlv varlv (LV:s
逻辑卷在卷组上创建)
| | |
ext2 reiserfs xfs (
建立在逻辑卷上的文件系统)
2.1
卷组volume group (VG)
卷组是LVM中最高抽象层,是由一个或多个物理卷所组成的存储器池。
2.2
物理卷physical volume (PV)
典型的物理卷是硬盘分区,但也可以是整个硬盘或已创建的Software RAID 卷。
2.3
逻辑卷logical volume (LV)
逻辑卷相当于非LVM系统中的分区,它在卷组上建立,是一个标准的块设备,可以在其上建立文件系统。
2.4
物理块physical extent (PE)
物理卷按大小相等的为单位存储,块的大小与卷组中逻辑卷块的大小相同。
2.5
逻辑块logical extent (LE)
逻辑卷按为单位存储,在一卷组中的所有逻辑卷的块大小是相同的。
2.6
总述
例子:有一个卷组VG1,它的物理块大小为4MB。在这个卷组中为2个硬盘分区:/dev/hda1/dev/hdb1,它们分别成为物理卷PV1PV2。物理卷将按4MB为单位分块,如PV1PV2分别可分为99248块。在VG1上建立逻辑卷,它的大小可在1347(99+248)块之间。当建立逻辑卷时,会建立逻辑块与物理块的一一映射关系。
2.7
映射模式 (linear/striped)
在建立逻辑卷时,可以选择逻辑块与物理块映射的策略:
1.
线性映射-将把一定范围的物理块按顺序分配给逻辑卷,如 LVLE 1 – 99映射到PV1LE 100 – 347映射到PV2
2.
交错模式-将把逻辑块交错映射到不同的物理卷中,如 LVLE 1映射为PV1PE1LE 2映射为PV2PE1LE 3映射为PV1PE2...。这种方式可以提高逻辑卷的性能,但是采用这种方式建立的逻辑卷将不能在它们所在的物理卷中扩展。
2.8 Snapshots (
快照)
LVM
提供了一个非常好的特性:snapshots。它允许管理员建立一个块设备:该设备是一逻辑卷在某一时刻冻结的精确拷贝。这个特性通常用于批处理过程(如备份)需要处理逻辑卷,但又不能停止系统。当操作完成时,snapshot设备可以被移除。这个特性要求在建立snapshot设备时逻辑卷处于相容状态。
3 LVM
的一般操作
3.1
建立PV
为把一个磁盘或分区作为PV,首先应使用 pvcreate 对其初始化,如对IDE硬盘/dev/hdb
"
使用整个磁盘,
# pvcreate /dev/hdb
这将在磁盘上建立VG的描述符。
"
使用磁盘分区,如/dev/hdb1
使用fdisk t 命令把/dev/hda1的分区类型设为0x8e,然后运行:
# pvcreate /dev/hdb1
这将在分区/dev/hda1上建立VG的描述符。
PV
初始化命令pvcreate的一般用法为:
pvcreate PV1 [ PV2 ... ]
它的参数可以是整个磁盘、分区,也可以是一loop设备。
3.2
建立VG
在使用pvcreate 建立了PV后,可以用vgcreate 建立卷组,如有PV1PV2分别是/dev/hda1/dev/hdb1,使用
# vgcreate testvg /dev/hda1 /dev/hdb1
将建立一个名为testvg的卷组,它由两个PV/dev/hda1/dev/hdb1组成。vgcreate的一般用法为:
# vgcreate [options] VG_name PV1 [PV2 ...]
其中的可选项包括设置VG最大支持的LV数、PE大小(缺省为4MB)等。
注意:当使用devfs系统时,应使用设备的全名而不能是Symbol Link,如对上例应为:
# vgcreate testvg /dev/ide/host0/bus0/target0/lun0/part1\
/dev/ide/host0/bus0/target1/lun0/part1
3.3
激活VG
在被激活之前,VGLV是无法访问的,这时可用命令:
# vgchange -a y testvg
激活所要使用的卷组。当不再使用VG时,可用
vgchange -a n testvg
使之不再可用。
vgchange
可用来设置VG的一些参数,如是否可用( -a [y|n]选项)、支持最大逻辑卷数等。
3.4
移除VG
在移除一卷组前应确认卷组中不再有逻辑卷,首先休眠卷组:
# vgchange -a n testvg
然后可用vgremove移除该卷组:
# vgremove testvg
3.5
VG增加新PV
当卷组空间不足时,可以加入新的物理卷来扩大容量,这时可用命令vgextend,如
# vgextend testvg /dev/hdc1
其中/dev/hdc1是新的PV,当然在这之前,它应使用pvcreate初始化。
3.6
VG移除PV
在移除PV之前,应确认该PV没用被LV使用,这可用命令pvdisplay查看,如:
# pvdisplay /dev/hda1
--- Physical volume ---
PV Name /dev/hda1
VG Name testvg
PV Size 1.95 GB / NOT usable 4 MB [LVM: 122 KB]
PV# 1
PV Status available
Allocatable yes (but full)
Cur LV 1
PE Size (KByte) 4096
Total PE 499
Free PE 0
Allocated PE 499
PV UUID Sd44tK-9IRw-SrMC-MOkn-76iP-iftz-OVSen7
如这个PV仍在被使用,则应把数据传移到其它PV上。在确认它未被使用后,可用命令vgreduce把它从VG中删除,如:
# vgreduce testvg /dev/hda1
3.7
创建LV
在创建逻辑卷前,应决定LV使用哪些PV,这可用命令vgdisplaypvdisplay查看当前卷组与PV的使用情况。在已有的卷组上创建逻辑卷使用命令lvcreate,如:
# lvcreate -L1500 -ntestlv testvg
将在卷组testvg上建立一个1500MB的线性LV,其命名为testlv,对应的块设备为/dev/testvg/testlv
# lvcreate -i2 -I4 -l100 -nanothertestlv testvg
将在卷组testvg上建立名为anothertestlvLV,其大小为100LE,采用交错方式存放,交错值为2,块大小为4KB
如果需要LV使用整个VG,可首先用vgdisplay 查找 Total PE 值,然后在运行lvcreate时指定,如:
# vgdisplay testvg | grep "Total PE"
Total PE 10230
# lvcreate -l 10230 testvg -n mylv
将使用卷组testvg的全部空间创建逻辑卷mylv
在创建逻辑卷后,就可在其上创建文件系统并使用它。
命令lvcreate的常用方法:
lvcreate [options] -n
逻辑卷名 卷组名 [PV1 ... ]
其中的常用可选项有:
"-i Stripes
:采用交错(striped)方式创建LV,其中Stripes指卷组中PV的数量。
"-I Stripe_size
:采用交错方式时采用的块大小(单位为KB)Stripe_size必须为2的指数:2N N=2,3...9
"-l LEs
:指定LV的逻辑块数。
"-L size
:指定LV的大小,其后可以用KMG表示KBMBGB
"-s
:创建一已存在LVsnapshot卷。
"-n name
:为LV指定名称。
3.8
删除LV
为删除一个逻辑卷,必须首先从系统卸载其上的文件系统,然后可用lvremove删除,如:
# umount /dev/testvg/testlv
# lvremove /dev/testvg/testlv
lvremove -- do you really want to remove "/dev/testvg/testlv"? [y/n]: y
lvremove -- doing automatic backup of volume group "testvg"
lvremove -- logical volume "/dev/testvg/testlv" successfully removed
3.9
扩展LV
为逻辑卷增加容量可用使用lvextend,即可以指定要增加的尺寸也可以指定扩容后的尺寸,如
# lvextend -L
12G /dev/testvg/testlv
lvextend -- extending logical volume "/dev/testvg/testlv" to 12 GB
lvextend -- doing automatic backup of volume group "testvg"
lvextend -- logical volume "/dev/testvg/testlv" successfully extended
将扩大逻辑卷testlv的容量为12GB
# lvextend -L+
1G /dev/testvg/testlv
lvextend -- extending logical volume "/dev/testvg/testlv" to 13 GB
lvextend -- doing automatic backup of volume group "testvg"
lvextend -- logical volume "/dev/testvg/testlv" successfully extended
将为LV testlv再增大容量1GB13GB
LV扩容的一个前提是:LV所在的VG有足够的空闲存储空间可用。
在为LV扩容之后,应同时为LV之上的文件系统扩容,使二者相匹配。对不同的文件系统有相对应的扩容方法。
3.9.1 ext2/ext3
除非内核已有ext2online 补丁,否则在改变ext2/ext3文件系统的大小时应卸载它:
# umount /dev/testvg/testlv
# resize2fs /dev/testvg/testlv
# mount /dev/testvg/testlv /home
这里假设testlv安装点为/home。在es2fsprogs-1.19或以上版本中包含resize2fs命令。
LVM发行包中有一个称为e2fsadm的工具,它同时包含了lvextendresize2fs的功能,如:
# e2fsadm -L+
1G /dev/testvg/testlv
等价于下面两条命令:
# lvextend -L+
1G /dev/testvg/testlv
# resize2fs /dev/testvg/testlv
但用户仍需首先卸载文件系统。
3.9.2 reiserfs
ext2不同,Reiserfs不必卸载文件系统,如:
# resize_reiserfs -f /dev/testvg/testvl
3.9.3 xfs
SGI XFS
文件系统必须在安装的情况下才可改变大小,并且要使用安装点而不是块设备,如:
# xfs_growfs /home
3.10
缩小LV
逻辑卷可扩展同样也可缩小,但应在缩小LV之前首先减小文件系统,否则将可能导致数据丢失。
3.10.1 ext2/ext3
可以使用LVM的工具e2fsadm操作,如:
# umount /home
# e2fsadm -L
-1G /dev/testvg/testvl
# mount /home
如果采用resize2fs,就必须知道缩少后卷的块数:
# umount /home
# resize2fs /dev/testvg/testvl 524288
# lvreduce -L
-1G /dev/testvg/testvl
# mount /home
3.10.2 reiserfs
在缩小reiserfs时,应首先卸载它,如:
# umount /home
# resize_reiserfs -s
-1G /dev/testvg/testvl
# lvreduce -L
-1G /dev/testvg/testvl
# mount -treiserfs /dev/testvg/testvl /home
3.10.3 xfs
无法实现。
3.11
PV间转移数据
若要把一个PV