如果用标准分区在硬盘上创建了文件系统,为已有文件系统添加额外的空间多少是一种痛苦
的体验。你只能在同一个物理硬盘的可用空间范围内调整分区大小。如果硬盘上没有地方了,你
就必须弄一个更大的硬盘,然后手动将已有的文件系统移动到新的硬盘上。
这时候可以通过将另外一个硬盘上的分区加入已有文件系统,动态地添加存储空间。Linux
逻辑卷管理器(logical volume manager,LVM)软件包正好可以用来做这个。它可以让你在无需
重建整个文件系统的情况下,轻松地管理磁盘空间。
8.3.1 逻辑卷管理布局
逻辑卷管理的核心在于如何处理安装在系统上的硬盘分区。在逻辑卷管理的世界里,硬盘称
作物理卷(physical volume,PV)。每个物理卷都会映射到硬盘上特定的物理分区。
多个物理卷集中在一起可以形成一个卷组(volume group,VG)。逻辑卷管理系统将卷组视
为一个物理硬盘,但事实上卷组可能是由分布在多个物理硬盘上的多个物理分区组成的。卷组提
供了一个创建逻辑分区的平台,而这些逻辑分区则包含了文件系统。
整个结构中的最后一层是逻辑卷(logical volume,LV)。逻辑卷为Linux提供了创建文件系统
的分区环境,作用类似于到目前为止我们一直在探讨的Linux中的物理硬盘分区。Linux系统将逻
辑卷视为物理分区。
可以使用任意一种标准Linux文件系统来格式化逻辑卷,然后再将它加入Linux虚拟目录中的
某个挂载点。
图8-1显示了典型Linux逻辑卷管理环境的基本布局。
图8-1中的卷组横跨了三个不同的物理硬盘,覆盖了五个独立的物理分区。在卷组内部有两
个独立的逻辑卷。Linux系统将每个逻辑卷视为一个物理分区。每个逻辑卷可以被格式化成ext4
文件系统,然后挂载到虚拟目录中某个特定位置。
注意,图8-1中,第三个物理硬盘有一个未使用的分区。通过逻辑卷管理,你随后可以轻松
地将这个未使用分区分配到已有卷组:要么用它创建一个新的逻辑卷,要么在需要更多空间时用
它来扩展已有的逻辑卷。
类似地,如果你给系统添加了一块硬盘,逻辑卷管理系统允许你将它添加到已有卷组,为某
个已有的卷组创建更多空间,或是创建一个可用来挂载的新逻辑卷。这种扩展文件系统的方法要
好用得多!
8.3.2 Linux 中的 LVM
Linux LVM是由Heinz Mauelshagen开发的,于1998年发布到了Linux社区。它允许你在Linux
上用简单的命令行命令管理一个完整的逻辑卷管理环境。
Linux LVM有两个可用的版本。
- LVM1:最初的LVM包于1998年发布,只能用于Linux内核2.4版本。它仅提供了基本的逻辑卷管理功能。
- LVM2:LVM的更新版本,可用于Linux内核2.6版本。它在标准的LVM1功能外提供了额外的功能。
大部分采用2.6或更高内核版本的现代Linux发行版都提供对LVM2的支持。除了标准的逻辑
卷管理功能外,LVM2还提供了另外一些好用的功能。
1. 快照
最初的Linux LVM允许你在逻辑卷在线的状态下将其复制到另一个设备。这个功能叫作快
照。在备份由于高可靠性需求而无法锁定的重要数据时,快照功能非常给力。传统的备份方法在
将文件复制到备份媒体上时通常要将文件锁定。快照允许你在复制的同时,保证运行关键任务的
Web服务器或数据库服务器继续工作。遗憾的是,LVM1只允许你创建只读快照。一旦创建了快
照,就不能再写入东西了。
LVM2允许你创建在线逻辑卷的可读写快照。有了可读写的快照,就可以删除原先的逻辑卷,
然后将快照作为替代挂载上。这个功能对快速故障转移或涉及修改数据的程序试验(如果失败,
需要恢复修改过的数据)非常有用。
2. 条带化
LVM2提供的另一个引人注目的功能是条带化(striping)。有了条带化,可跨多个物理硬盘
创建逻辑卷。当Linux LVM将文件写入逻辑卷时,文件中的数据块会被分散到多个硬盘上。每个
后继数据块会被写到下一个硬盘上。
条带化有助于提高硬盘的性能,因为Linux可以将一个文件的多个数据块同时写入多个硬盘,
而无需等待单个硬盘移动读写磁头到多个不同位置。这个改进同样适用于读取顺序访问的文件,
因为LVM可同时从多个硬盘读取数据。
说明 LVM条带化不同于RAID条带化。LVM条带化不提供用来创建容错环境的校验信息。事实
上,LVM条带化会增加文件因硬盘故障而丢失的概率。单个硬盘故障可能会造成多个逻
辑卷无法访问。
3. 镜像
通过LVM安装文件系统并不意味着文件系统就不会再出问题。和物理分区一样,LVM逻辑
卷也容易受到断电和磁盘故障的影响。一旦文件系统损坏,就有可能再也无法恢复。
LVM快照功能提供了一些安慰,你可以随时创建逻辑卷的备份副本,但对有些环境来说可能
还不够。对于涉及大量数据变动的系统,比如数据库服务器,自上次快照之后可能要存储成百上
千条记录。
这个问题的一个解决办法就是LVM镜像。镜像是一个实时更新的逻辑卷的完整副本。当你创
建镜像逻辑卷时,LVM会将原始逻辑卷同步到镜像副本中。根据原始逻辑卷的大小,这可能需要
一些时间才能完成。
一旦原始同步完成,LVM会为文件系统的每次写操作执行两次写入——一次写入到主逻辑
卷,一次写入到镜像副本。可以想到,这个过程会降低系统的写入性能。就算原始逻辑卷因为某
些原因损坏了,你手头也已经有了一个完整的最新副本!
8.3.3 使用 Linux LVM
现在你已经知道Linux LVM可以做什么了,本节将讨论如何创建LVM来帮助组织系统上的硬
盘空间。Linux LVM包只提供了命令行程序来创建和管理逻辑卷管理系统中所有组件。有些Linux
发行版则包含了命令行命令对应的图形化前端,但为了完全控制你的LVM环境,最好习惯直接使
用这些命令。
1. 定义物理卷
创建过程的第一步就是将硬盘上的物理分区转换成Linux LVM使用的物理卷区段。我们的朋
友fdisk命令可以帮忙。在创建了基本的Linux分区之后,你需要通过t命令改变分区类型。
[…]
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 8e
Changed system type of partition 1 to 8e (Linux LVM)
Command (m for help): p
Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa8661341
Device Boot Start End Blocks Id System
/dev/sdb1 1 262 2104483+ 8e Linux LVM
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
$
分区类型8e表示这个分区将会被用作Linux LVM系统的一部分,而不是一个直接的文件系统
(就像你在前面看到的83类型的分区)。
说明 如果下一步中的pvcreate命令不能正常工作,很可能是因为LVM2软件包没有默认安装。
可以使用软件包名lvm2,按照第9章中介绍的软件安装方法安装这个包。
下一步是用分区来创建实际的物理卷。这可以通过pvcreate命令来完成。pvcreate定义了
用于物理卷的物理分区。它只是简单地将分区标记成Linux LVM系统中的分区而已。
$ sudo pvcreate /dev/sdb1
dev_is_mpath: failed to get device for 8:17
Physical volume “/dev/sdb1” successfully created
$
说明 别被吓人的消息dev_is_mpath: failed to get device for 8:17或类似的消息唬
住了。只要看到了successfully created就没问题。pvcreate命令会检查分区是否
为多路(multi-path,mpath)设备。如果不是的话,就会发出上面那段消息。
如果你想查看创建进度的话,可以使用pvdisplay命令来显示已创建的物理卷列表。
$ sudo pvdisplay /dev/sdb1
“/dev/sdb1” is a new physical volume of “2.01 GiB”
—- NEW Physical volume —-
PV Name /dev/sdb1
VG Name
PV Size 2.01 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 0FIuq2-LBod-IOWt-8VeN-tglm-Q2ik-rGU2w7
$
pvdisplay命令显示出/dev/sdb1现在已经被标记为物理卷。注意,输出中的VG Name内容为
空,因为物理卷还不属于某个卷组。
2. 创建卷组
下一步是从物理卷中创建一个或多个卷组。究竟要为系统创建多少卷组并没有既定的规则,
你可以将所有的可用物理卷加到一个卷组,也可以结合不同的物理卷创建多个卷组。
要从命令行创建卷组,需要使用vgcreate命令。vgcreate命令需要一些命令行参数来定义
卷组名以及你用来创建卷组的物理卷名。
$ sudo vgcreate Vol1 /dev/sdb1
Volume group “Vol1” successfully created
$
输出结果平淡无奇。如果你想看看新创建的卷组的细节,可用vgdisplay命令。
$ sudo vgdisplay Vol1
—- Volume group —-
VG Name Vol1
System ID
Format lvm2
Metadata Areas 1
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 1
Act PV 1
VG Size 2.00 GiB
PE Size 4.00 MiB
Total PE 513
Alloc PE / Size 0 / 0
Free PE / Size 513 / 2.00 GiB
VG UUID oe4I7e-5RA9-G9ti-ANoI-QKLz-qkX4-58Wj6e $
这个例子使用/dev/sdb1分区上创建的物理卷,创建了一个名为Vol1的卷组。
创建一个或多个卷组后,就可以创建逻辑卷了。
3. 创建逻辑卷
Linux系统使用逻辑卷来模拟物理分区,并在其中保存文件系统。Linux系统会像处理物理分
区一样处理逻辑卷,允许你定义逻辑卷中的文件系统,然后将文件系统挂载到虚拟目录上。
要创建逻辑卷,使用lvcreate命令。虽然你通常不需要在其他Linux LVM命令中使用命令
行选项,但lvcreate命令要求至少输入一些选项。表8-5显示了可用的命令行选项。
虽然命令行选项看起来可能有点吓人,但大多数情况下你用到的只是少数几个选项。
$ sudo lvcreate -l 100%FREE -n lvtest Vol1
Logical volume “lvtest” created
$
如果想查看你创建的逻辑卷的详细情况,可用lvdisplay命令。
$ sudo lvdisplay Vol1
—- Logical volume —-
LV Path /dev/Vol1/lvtest
LV Name lvtest
VG Name Vol1
LV UUID 4W2369-pLXy-jWmb-lIFN-SMNX-xZnN-3KN208
LV Write Access read/write
LV Creation host, time … -0400
LV Status availableopen 0
LV Size 2.00 GiB
Current LE 513
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:2
$
现在可以看到你刚刚创建的逻辑卷了!注意,卷组名(Vol1)用来标识创建新逻辑卷时要使
用的卷组。
-l选项定义了要为逻辑卷指定多少可用的卷组空间。注意,你可以按照卷组空闲空间的百分
比来指定这个值。本例中为新逻辑卷使用了所有的空闲空间。
你可以用-l选项来按可用空间的百分比来指定这个大小,或者用-L选项以字节、千字节
(KB)、兆字节(MB)或吉字节(GB)为单位来指定实际的大小。-n选项允许你为逻辑卷指定
一个名称(在本例中称作lvtest)。
4. 创建文件系统
运行完 lvcreate命令之后,逻辑卷就已经产生了,但它还没有文件系统。你必须使用相应
的命令行程序来创建所需要的文件系统。
$ sudo mkfs.ext4 /dev/Vol1/lvtest
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
131376 inodes, 525312 blocks
26265 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=541065216
17 block groups
32768 blocks per group, 32768 fragments per group
7728 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first.Use tune2fs -c or -i to override.
$
在创建了新的文件系统之后,可以用标准Linux mount命令将这个卷挂载到虚拟目录中,就
跟它是物理分区一样。唯一的不同是你需要用特殊的路径来标识逻辑卷。
$ sudo mount /dev/Vol1/lvtest /mnt/my_partition
$
$ mount
/dev/mapper/vg_server01-lv_root on / type ext4 (rw)
[…]
/dev/mapper/Vol1-lvtest on /mnt/my_partition type ext4 (rw)
$
$ cd /mnt/my_partition
$
$ ls -al
total 24
drwxr-xr-x. 3 root root 4096 Jun 12 10:22 .
drwxr-xr-x. 3 root root 4096 Jun 11 09:58 ..
drwx———. 2 root root 16384 Jun 12 10:22 lost+found
$
注意,mkfs.ext4和mount命令中用到的路径都有点奇怪。路径中使用了卷组名和逻辑卷名,
而不是物理分区路径。文件系统被挂载之后,就可以访问虚拟目录中的这块新区域了。
5. 修改LVM
Linux LVM的好处在于能够动态修改文件系统,因此最好有工具能够让你实现这些操作。在
Linux有一些工具允许你修改现有的逻辑卷管理配置。
如果你无法通过一个很炫的图形化界面来管理你的Linux LVM环境,也不是什么都干不了。
在本章中你已经看到了一些Linux LVM命令行程序的实际用法。还有一些其他的命令可以用来管
理LVM的设置。表8-6列出了在Linux LVM包中的常见命令。
通过使用这些命令行程序,就能完全控制你的Linux LVM环境。
窍门 在手动增加或减小逻辑卷的大小时,要特别小心。逻辑卷中的文件系统需要手动修整来
处理大小上的改变。大多数文件系统都包含了能够重新格式化文件系统的命令行程序,
比如用于ext2、ext3和ext4文件系统的resize2fs程序。