cnhnln 发表于 2006-11-2 21:54:57

Linux LVM HOWTO

一份非常内行的Linux LVM HOWTO

作 者: 谢启发

1. 绪论
欢迎你,亲爱的读者。

写这个文档的目的是为了告诉你什么是LVM,它怎样工作,你怎样运用它使你的生活变得更容易。虽然有一份LVM FAQ,但仍是德文的,它是从不同的角度来描写的。它是一份“真的”HOWTO,在传授理解(有希望的)的时候也是非常内行的。

我要说清楚我不是一个Linux逻辑卷管理器(Logical Volume Manager)的作者。我向那些作者表示敬意,同时我希望能和他们合作。

不可思议的是我甚至不知道LVM的开发者。我希望这种情况不久会改变。我事先向他们表示道歉。

1.1 免责声明 & 许可
分发这个文档是希望它对你有用,但是不提供任何担保,也没有销售或适应特殊目的的隐含担保。

如果你的磁盘融化了,你公司解雇了你--这决不是我们的错。对不起。请记得经常做备份,在没有重要数据的系统上做实验。

此外,Richard Allen不代表他老板说话。

Linux是Linus Torvalds的注册商标。

英文原文(若翻译有误,以原文为准)

This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

If your disks melt and your company fires you - its never our fault. Sorry. Make frequent backups and do your experiments on non-mission critical systems.

Furthermore, Richard Allen does not speak for his employer.

Linux is a registered trademark of Linus Torvalds.

1.2 预备知识
不是太多。如果你曾经安装过Linux和创建过文件系统(fdisk/mkfs),那你就准备就绪了。但因为总是以root身份操作,所以一定要小心谨慎!错误的命令或操作设备文件都可能损坏已经存在的数据。

如果你知道怎样配置HP/UX LVM,那你几乎都完成了,Linux工作得很象HP上的处理。

1.3 注意事项
关于这份文档有几点需要注释。虽然我写了大部分,但我真的不希望它停步。我坚决相信Open Source,我鼓励你反馈、更新、打补丁等等。不要不愿意告诉我们有关排版或普通的老错误。

如果你感觉你更有资格来维护一部分,或者你认为你能创作和维护一个新的部分,欢迎你。这个HOWTO的SGML格式是通过CVS可用的。我预想这会是个合作计划。

这份文档里,你会发现许多FIXME的通知。补丁总是欢迎的!无论你在哪里发现FIXME,你都要明白你正踩在未知的领域。这不是说其他地方没有错误,而是说这里是要特别注意的地方。如果你已经验证了什么,请告诉我,我好删除这FIXME通知。

1.4 访问,CVS & 更新
这份HOWTO的规范定位在 这里。

我们现在有匿名的CVS访问,对全世界普遍有效。这使你更容易获得最新版的HOWTO,并提供改变和增强。

如果你想通过CVS获得这份HOWTO,下面教你怎样做:

$ export CVSROOT=:pserver:[email protected]:/var/cvsroot
$ cvs login
CVS password:
$ cvs co lvm-howto
cvs server: Updating lvm-howto
U lvm-howto/lvm-howto.sgml


如果你发现错误,或者想增加什么,本地修复它,并运行“cvs diff -u”,同时将结果发给我们。

提供了一个Makefile文件来帮助你创建postscript,dvi,pdf,html 和 plain text格式。你可能需要安装sgml-tools,ghostscript 和 tetex 以获得所有格式。

1.5 这份文档的编排
我们将首先解释一些需要的基本知识。我们尽量设法包括例子来帮助理解。


2. 什么是LVM?
传统上,一个分区大小是静态的。这要求一个系统安装人员必须考虑的不是“我要在这个分区上存储多少数据”,而是“我‘究竟’要在这个分区上存储多少数据”。当一个用户在这个分区上没有空间了,他要么不得不重新分区(这可能要求整个操作系统重装),要么象符号连接一样使用组装机。

一个分区就是物理磁盘上一系列连续数据块的概念已经演变了。多数类Unix系统现在有能力分解物理磁盘到许多单元。多个驱动器上的存储单元可以汇聚成一个“逻辑卷”,它们可以分配给分区。另外,单元可以随着空间要求的改变而从分区中添加和删除。

这就是基本的逻辑卷管理器(LVM)

例如,假设你有一个1GB的磁盘,并且创建“/home”分区花了600MB。设想你没有空间了,于是决定“/home”需要1GB。用传统的分区观念,你不得不有另外一个至少1GB大小的驱动器。接着增加这个磁盘,创建新的/home,并且将现有的数据拷贝过去。

然而,用LVM配置,你仅仅只需要增加400MB(或更大)的磁盘,并将它的存储单元添加到“/home”分区中。其他工具可以让你调整原来文件系统的大小,所以你仅仅只需要调整“/home”大小来使用更大的分区,接着返回到商务中。

一个非常特殊的处理,LVM甚至可以做它自身的“快照”,这使你能对不可移动的目标做备份。我们返回到这个激动人心的可能中,稍后,有许多另外的真实应用。

以下章节中,我们解释了LVM的基本要素,和它使用中的许多概要。


3. 基本原理
Ok,不要因为恐惧而停止,但是LVM有许多你要明白的术语,以免你危及你的文件系统。

我们从下面开始,或多或少。

物理介质 The physical media
你应该感受“物理”这个单词有极大的延伸,虽然我们刚开始假设它仅仅是一个硬盘,或者一个分区。例如,/dev/hda,/dev/hda6,/dev/sda。你可以转换一个块设备上任何连续块到一个。。。

物理卷 Physical Volume (PV)
一个PV只不过是有许多管理数据添加在它里面的物理介质--一旦你添加了它,LVM就认为它是。。。的一个持有者。

物理分区 Physical Extents (PE)
物理分区真的象一些大的数据块,通常有几MB。PE可以分配给一个。。。

卷组 Volume Group (VG)
一个VG是由许多物理分区组成的(可能来自多个物理卷或硬盘)。虽然这可能容易让你认为一个VG就是由几个硬盘组成的(例如/dev/hda和/dev/sda),但是更确切的说,它包含由这些硬盘提供的许多PE。

> >从这个卷组,PE可以分配给一个。。。

逻辑卷 Logical Volume (LV)
Yes,我们最终到达某处。一个逻辑卷是我们工作的最终结果,这里是我们存储信息的地方。这等同于传统分区的想法。
象用通常的分区一样,在逻辑卷上你能代表性的创建一个。。。

文件系统 Filesystem
文件系统是你想它成为的形态:标准的 ext2,ReiserFS,NWFS,XFS,JFX,NTFS,等等。。。对Linux内核来说,在通常的分区和逻辑卷之间没有差别。
我试着画了一个ASCII图来使这些形象化。

一个物理卷,包含了许多物理分区:

+-----[ Physical Volume ]------+
| PE | PE | PE | PE | PE | PE |
+------------------------------+

一个卷组,包含了2个物理卷(PV)有6个物理分区:

+------[ Volume Group ]-----------------+
| +----------+ +-----------+ |
| | PE | PE | PE | | PE | PE | PE | |
| +--------------+ +---------------+ |
+---------------------------------------+

我们现在做更进一步扩展:

+------[ Volume Group ]-----------------+
| +----------+ +-----------+ |
| | PE | PE | PE | | PE | PE | PE | |
| +--+---+---+---+ +-+----+----+---+ |
| | | | +-----/ | | |
| | | | | | | |
| +-+---+---+-+ +----+----+--+ |
| | Logical | | Logical | |
| | Volume | | Volume | |
| | | | | |
| | /home | | /var | |
| +-----------+ +------------+ |
+---------------------------------------+


这个向我们展示了两个文件系统,它跨越两个磁盘。/home文件系统包含4个物理分区,/var文件系统包含2个。

bert hubert 正在写一个工具来更真实的描述LVM,这里提供了一些它在屏幕上出现的外观。看起来比ASCII图画要好。

3.1 Show & Tell
Ok,这些概念很难理解(’We are LVM of Borg...),因此下面给出了创建一个逻辑卷的例子。不要粘贴这个例子到你的控制台,因为这样会破坏数据,除非碰巧你的计算机的/dev/hda3和/dev/hdb2没有使用。

如果有疑问,查看上面的ASCII图画。

你应该首先设置/dev/hda3和/dev/hdb2的分区类型为0x8e,它表示”Linux LVM”。请注意你的fdisk的版本可能仍不认识这种类型,因此它显示为“Unknown”:


# fdisk /dev/hda

Command (m for help): p

Disk /dev/hda: 255 heads, 63 sectors, 623 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 2 16033+ 83 Linux
/dev/hda2 3 600 4803435 83 Linux
/dev/hda3 601 607 56227+ 83 Linux
/dev/hda4 608 614 56227+ 83 Linux

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e

Command (m for help): p

Disk /dev/hda: 255 heads, 63 sectors, 623 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 2 16033+ 83 Linux
/dev/hda2 3 600 4803435 83 Linux
/dev/hda3 601 607 56227+ 8e Unknown
/dev/hda4 608 614 56227+ 83 Linux

Command (m for help): w

我们对/dev/hdb2做同样的操作,在此就不演示了。这是需要的,以至LVM能重建你应该丢失的配置。

通常,不需要重启,但有些计算机却要求。因此如果下面的例子不工作,试试重启。

接着我们创建物理卷(PV),如下:


# pvcreate /dev/hda3
pvcreate -- physical volume "/dev/hda3" successfully created
# pvcreate /dev/hdb2
pvcreate -- physical volume "/dev/hdb2" successfully created

我们再将这两个物理卷(PV)加到一个叫做“test”的卷组(VG)中:


# vgcreate test /dev/hdb2 /dev/hda3
vgcreate -- INFO: using default physical extent size 4 MB
vgcreate -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate -- doing automatic backup of volume group "test"
vgcreate -- volume group "test" successfully created and activated

现在我们有一个空的卷组(VG),让我们来检查一下:


# vgdisplay -v test
--- Volume group ---
VG Name test
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 0
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 184 MB
PE Size 4 MB
Total PE 46
Alloc PE / Size 0 / 0
Free PE / Size 46 / 184 MB

--- No logical volumes defined in test ---


--- Physical volumes ---
PV Name (#) /dev/hda3 (2)
PV Status available / allocatable
Total PE / Free PE 13 / 13

PV Name (#) /dev/hdb2 (1)
PV Status available / allocatable
Total PE / Free PE 33 / 33

这里的许多数据--大多数现在都容易理解了。我们看到没有逻辑卷(LV)定义,因此我们要补上它。我们将在“test”卷组(PV)中创建一个50MB的逻辑卷,叫做“HOWTO”:


# lvcreate -L 50M -n HOWTO test
lvcreate -- rounding up size to physical extent boundary "52 MB"
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/test/HOWTO" successfully created

Ok,到这里,我们创建一个文件系统:


# mke2fs /dev/test/HOWTO
mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
13328 inodes, 53248 blocks
2662 blocks (5.00%) reserved for the super user
First data block=1
7 block groups
8192 blocks per group, 8192 fragments per group
1904 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961

Writing inode tables: done
Writing superblocks and filesystem accounting information: done
# mount /dev/test/HOWTO /mnt
# ls /mnt
lost+found

我们做完了!让我们回顾我们的卷组(VG),它现在充满了一些东西:


# vgdisplay test -v
--- Volume group ---
VG Name test
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 1
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 184 MB
PE Size 4 MB
Total PE 46
Alloc PE / Size 13 / 52 MB
Free PE / Size 33 / 132 MB

--- Logical volume ---
LV Name /dev/test/HOWTO
VG Name test
LV Write Access read/write
LV Status available
LV # 1
# open 1
LV Size 52 MB
Current LE 13
Allocated LE 13
Allocation next free
Read ahead sectors 120
Block device 58:0


--- Physical volumes ---
PV Name (#) /dev/hda3 (2)
PV Status available / allocatable
Total PE / Free PE 13 / 13

PV Name (#) /dev/hdb2 (1)
PV Status available / allocatable
Total PE / Free PE 33 / 20

好,这就是了。/dev/hda3完全没用,而/dev/hdb2有13个物理分区(PE)在用。

3.2 激活和非激活:内核空间和用户空间
和使用所有操作系统一样,Linux划分了两个部分:内核空间(kernel space)和用户空间(user space)。用户空间有时叫做用户区(userland),这也是关于这个主题的一个很好的名字。

关于逻辑卷管理器的创建和修改都是在用户空间做的,然后传给内核。一旦卷组或逻辑卷向内核汇报,它就叫做“激活(Active)”。当它被激活时,只有某些更改可以执行,其他的更改只有在它非激活时执行。


4. 首要条件
LVM在很大范围内的内核中都有效。在Linux 2.4,LVM将全部被集成。内核2.3.47和以前的,LVM要经过处理来合并到主内核中。

4.1 内核
Linux 2.4
包含了你需要的所有内容。希望大多数的发行版都将LVM当成模块集成来发行。如果你需要编译,仅仅是当你选择块设备时打勾LVM选项。

Linux 2.3.99.*
一旦内核向前发展稳定了,这部分就不会存在了。但是现在,我们还是要描述一下。

当我们写这篇文档时,Linux最新的内核版本是2.3.99pre5,它仍然需要一些小的补丁才能使LVM工作。

对于Linux 2.3.99pre3,有两个补丁发行:

一个补丁是张贴在linux-kernel,在这里可以找到。

Andrea Arcangeli改进了这个补丁,提供了一个增量的补丁,它应用于2.3.99pre3 LVM补丁和这之上。

对于Linux 2.3.99pre5,bert hubert将这两个补丁合并成一个了,并且主要针对2.3.99pre5。在这里可以找到这个补丁。使用它要小心。

2.3.99pre6-1,是的,是补丁的一个预览版,特色是第一次完成了LVM的支持!它仍然遗漏了Andreas的补丁,但我们确信它不久真的会发行的。

2.3.99pre4-ac1缺省有一个小的补丁在,并且能工作。虽然它不包括Andreas的补丁。

Linux 2.2
FIXME: write this

Linux 2.3
FIXME: write this

4.2 用户余地
你需要从LVM站点下载有效的工具。用glibc2.1编译系统要求的一些补丁。即使这样,在Debian 2.2上仍会出错。

5. 增长文件系统
你可以用一个预备好的脚本做大量的工作,也可以根据你的需要手工做

5.1 使用e2fsadm
如果在你的卷组中有剩余空间,并且你使用的是ext2文件系统(大多数人都是这样的),你就可以使用这个便捷的工具。

e2fsadm命令利用商业的resize2fs工具。虽然人们都感觉resize2fs是一个很好的软件,但是它并没有被广泛的安装。

如果你想使用FSF的ext2resize命令,你需要告诉e2fsadm以下内容:


# export E2FSADM_RESIZE_CMD=ext2resize
# export E2FSADM_RESIZE_OPTS=""

余下的就简单了,e2fsadm使用时很象其他的LVM命令:


# e2fsadm /dev/test/HOWTO -L+50M
e2fsadm -- correcting size 102 MB to physical extent boundary 104 MB
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
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/test/HOWTO: 11/25688 files (0.0% non-contiguous), 3263/102400 blocks
lvextend -- extending logical volume "/dev/test/howto" to 104 MB
lvextend -- doing automatic backup of volume group "test"
lvextend -- logical volume "/dev/test/HOWTO" successfully extended

ext2_resize_fs
ext2_grow_fs
ext2_block_relocate
ext2_block_relocate_grow
ext2_grow_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
direct hits 4096 indirect hits 0 misses 1
e2fsadm -- ext2fs in logical volume "/dev/test/HOWTO" successfully extended to 104 MB

5.2 增长逻辑卷
e2fsadm命令为你做了这些工作。然而,了解怎样手工来做可能会有用的。

如果在你的卷组中有剩余空间,那么只需要一行:


# lvextend -L+12M /dev/test/HOWTO
lvextend -- rounding size to physical extent boundary
lvextend -- extending logical volume "/dev/test/HOWTO" to 116 MB
lvextend -- doing automatic backup of volume group "test"
lvextend -- logical volume "/dev/test/HOWTO" successfully extended

5.3 增长卷组
这是用vgextend功能实现的,它很象馅饼一样容易。你首先需要创建一个物理卷。这要用pvcreate来实现。使用这个工具,你转换任何块设备为一个物理卷。

这样做了之后,vgextend做余下的任务:


# pvcreate /dev/sda1
pvcreate -- physical volume "/dev/sda1" successfully created
# vgextend webgroup /dev/sda1
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "webgroup"
vgextend -- volume group "webgroup" successfully extended

请注意,为了要做这些,你的卷组必须是激活的。你可以通过执行象“vgchange -a y webgroup”来使它激活。

5.4 增长文件系统
如果你想手工做,有两条路径可以实现。

ext2离线,使用ext2resize
离线,就意味着你必须umount这个文件系统来做这些改变。在做这些改变的时候,这个文件系统和它上面的数据暂时不可用。如果你想扩充根分区或其他重要的分区,你必须用其他的启动介质来引导。

ext2resize工具可以在GNU ftp站点找到,但大多数的发行版都将它作为一个包来发行。它的语法也简单易懂:


# ext2resize /dev/HOWTO/small 40000

这里40000是文件系统已经增长或收缩之后的块的数目。

ext2在线
FIXME: write this

6. 替换磁盘
这是LVM的好处之一。一旦你发现某个磁盘有错误,那就是要移动你的数据的时候了。使用LVM它很象馅饼一样容易。我们首先举一个明显的替换例子,你先添加一个磁盘到系统中,它至少要和你想要替换的磁盘一样大。

要移动数据,我们移动卷组的物理分区到另一个磁盘上,或者更准确的说,到另一个物理卷上。要做这些,LVM给我们提供了pvmove功能。

假设我们怀疑的那块磁盘叫/dev/hda1,并且我们想用/dev/sdb3来替换它。我们首先将/dev/sdb3添加到包含/dev/hda1的那个卷组中。

在这之前,umount这个卷组上的所有文件系统看来是明智的。有一个全备份也不会损坏什么。

FIXME: is this necessary?

接下来我们执行pvmove。非常简单的,我们仅仅提到我们想要移走的那块磁盘,就象这样:


# pvmove /dev/hda1
pvmove -- moving physical extents in active volume group "test1"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? y
pvmove -- doing automatic backup of volume group "test1"
pvmove -- 12 extents of physical volume "/dev/hda1" successfully moved

请留意这个警告。而且看来至少有些内核或LVM的版本在使用这个命令时有问题。我是用2.3.99pre6-2来测试的,它可以工作,但要警告。

现在,/dev/hda1没有包含任何物理分区了,我们可以将它从卷组中删除:


# vgreduce test1 /dev/hda1
vgreduce -- doing automatic backup of volume group "test1"
vgreduce -- volume group "test1" successfully reduced by physical volume:
vgreduce -- /dev/hda1

FIXME: we need clarity on a few things. Should the volume group be active? When do we get data loss?

6.1 当事情发生在晚期时
如果一个磁盘没有出现警告就失败了,你就不能移走它上面的物理分区到另一个物理卷上,这样你可能会丢失数据,除非在这个失败的PV上的逻辑卷是镜像了的。正确的行为是用一个同样的PV或者至少同样大小的分区来替换这个失败的PV。

/etc/lvmconf目录包含了LVM数据和结构的备份,包括哪些磁盘做成了PV,每个PV属于哪个VG,每个VG中有哪些LV。

替换了出错的磁盘之后,你可以用vgcfgrestor命令来恢复LVM数据到新的PV上。它恢复卷组和所有它的信息,但是不会恢复在逻辑卷上的数据。这是因为当LVM数据做一些更改时,LVM命令自动做备份。


--------------------------------------------------------------------------------

7. 为一致性备份做快照
这是更加难以置信的一个可能性。假设你有一个非常繁忙的服务器,有许多东西运行。为了一个有用的备份,你需要停止大量的程序,否则,你将以数据不一致告终。

一个规范的例子是从/tmp移动一个文件到/root下,而且/root将先备份。当/root被读的时候,这个文件还不在那里。当/tmp被备份时,这个文件已经不在了。

另一个事例是保存数据库或目录。如果一个文件在使用状态,我们就没有任何线索了,除非我们给应用程序时间做一个清除的关闭。

这样的话,新的问题又出现了。我们关闭程序,做我们的备份,接着重新启动它们。如果备份只花几分钟这是很好的,但是,如果它要花数小时,或者你根本不确定它到底要花多久的时候,事情就真的痛苦了。

LVM可以营救。

使用LVM,我们可以做一个LV瞬间的快照,然后mount它,再备份它。

让我们试验一下:


# mount /dev/test/HOWTO /mnt
# echo > /mnt/a.test.file
# ls /mnt/
a.test.file lost+found
# ls -l /mnt/
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found

Ok,我们现在有些事情要用它一起做。让我们产生这个快照:


# lvcreate --size 16m --snapshot --name snap /dev/test/HOWTO
lvcreate -- WARNING: all snapshots will be disabled if more than 16 MB are changed
lvcreate -- INFO: using default snapshot chunk size of 64 KB
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/test/HOWTO" successfully created

对于“--size”参数以后再详述。让我们mount这个快照:


# mount /dev/test/snap /snap
# ls /snap
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found

现在我们从原处删除a.test.file,并且检查它是否仍然在快照里:


# rm /mnt/a.test.file
# ls /snap
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost+found

太令人惊讶了!

7.1 它是如何工作的?
记得我们不得不设置“--size”参数吗?真正发生的事情是,“snap”卷需要有那些当LVM调用时,在原处要被改变的所有块的一个拷贝。

当我们删除a.test.file时,它的i节点被删除。这引起64KB要被标注成“脏的”--同时原始数据的一个拷贝被写到“snap”卷。这个例子中,我们分配了16MB给快照,因此如果多于16MB的块要被修改,快照就会无效了。

要决定一个快照分区的正确大小,你将不得不推测基于主LV的使用模式、快照要激活的总时间。例如,在午夜,当无人使用系统的情况下,一个几小时的备份可能要求很小的空间。

请注意,快照不是永久的。如果你卸下LVM或重启,它们就丢失了,需要重新创建。


--------------------------------------------------------------------------------

8. 冗余 & 性能
为了性能的考虑,可以将数据分散在几个条块化的磁盘上。这意味着块1在PV A上,块2在PV B上,块3又在PV A上。你也可以条块化跨多余2块磁盘。

这样的安排意味着你有更多有效的磁盘带宽。也就是说包含了更多的“轴”。以后会详述。

除此之外,为了提高性能,也可以将你的数据在多个磁盘上有多份拷贝。这叫做镜像。目前,LVM本身还不支持它,但是有多种方法能实现镜像。

8.1 为何要条块化?
磁盘的性能至少受三种因素的影响。最明显的是一块磁盘上的数据能连续被读或写的速度。这是当读或写仅连接了一个单一的磁盘的SCSI/IDE总线上的一个大文件时的限制因素。

接着是到磁盘的有效带宽。如果你在一个SCSI总线上有7块盘,这也许会小于你的磁盘本身写的速度。如果你愿意花足够的钱,你可以避免这个瓶颈成为一个问题。

然后是响应时间。当成谚语说,响应时间总是坏消息。甚至更坏的是,你不可能通过花更多的钱来降低响应时间!现在出产的大多数磁盘有一个大约7ms的响应时间。还有SCSI响应时间,通常是大约25ms。

FIXME: need recent numbers!

这意味着什么?在一个典型情形,总的响应时间大约是30ms。因此你每秒钟只能执行大约33个磁盘操作。如果你想每秒钟能做数千个查询,并且你没有大量的缓存,那么你就非常不走运了。

如果你有多个磁盘,或者“轴”,在并行工作,那么你可以有多个命令很好地围绕你的响应问题同时执行。有些应用程序,比如一个大的新闻服务器,如果没有条块化或其它I/O敏捷性它甚至不再工作。

这就是条块化做的事。如果你的总线能胜任,甚至连续的读和写可能会更快。

8.2 为何不条块化
条块化没有进一步的措施来解除你的错误机会,按一个“每次一比特”的基本原则。如果你的磁盘任一块死了,你全部的逻辑卷都会丢失。如果你正好连接数据,仅仅文件系统部分丢失。

最终的选项是镜像的条块化。

FIXME: make a mirrored stripe with LVM and md

8.3 LVM本身的条块化
当用lvcreate创建LV时,指定条块化配置项。有两个相关参数。-i参数告诉LVM应该在多少个PV上分散数据。条块化不是真的按一次一比特的基础来做的,而是按块。-I参数指定单位为KB的块大小。注意它必须是2的一个幂,而且最大的块大小为128KB。

例如:


# lvcreate -n stripedlv -i 2 -I 64 mygroup -L 20M
lvcreate -- rounding 20480 KB to stripe boundary size 24576 KB / 6 PE
lvcreate -- doing automatic backup of "mygroup"
lvcreate -- logical volume "/dev/mygroup/stripedlv" successfully created

性能注意事项
如果跨同一块磁盘的两个分区来条块化,性能的“增加”可能会是非常消极的--注意避免这样。跨单一的IDE总线上的两个磁盘来条块化也是没用的--除非IDE已经改进了我所记忆的。

FIXME: is this still true?

很老的主板可能有两个IDE总线,但是第二个通常是用于一个相对慢的cdrom驱动器。你可以用几个工具来执行基准,最令人注目的是“Bonnie”。ReiserFS人们已经发布了Bonnie++,它可以用来测试性能数据。

8.4 硬件RAID
多数高速的Inter x86服务器有硬件RAID控制器。它们中大部分至少有2个独立的SCSI通道。幸运的是,这些在LVM上很少有关系。在Linux能看到如此一个控制器上的任何东西之前,管理员必须在RAID控制器自身里定义一个逻辑驱动器。举一个例子,他(她)可能选择条块化在SCSI通道A上的两个磁盘,然后镜像它们到通道B上的两块磁盘上。这是一个典型的RAID 0/1配置,最佳化性能和数据安全。当Linux在一台采用这种配置的机器上启动时,它只能“看”到在RAID控制器上的一块磁盘,那就是包含了RAID 0/1条块组上四块磁盘的逻辑驱动器。这就是说,至于LVM关心的,仅仅是在这台机器上的一块磁盘,它将被同样地使用。如果这些磁盘中的一个失败了,LVM甚至不知道。当管理员替换了磁盘(甚至很快的用热备硬件),LVM也不知道任一种情况发生了。控制器会重新同步镜像的数据,一切都良好。这里多数人会退一步来询问“那么使用这个RAID控制器,LVM为我带来什么好处呢?”最容易的回答是,多数情况下,你在RAID控制器里定义了一个逻辑驱动器后,你不可能在以后添加更多的磁盘到那个驱动器了。因此,如果你误算了所要求的空间,或者你只是需要更多的空间,你都不可能添加一个新的磁盘或一组磁盘到原来的条块组里。这意味着你必须在这个控制器里创建一个新的RAID条块组,然后用LVM你可以简单的扩展LVM的LV,以致它无缝的跨越RAID控制器里的两个条块组。

FIXME: Is there more needed on this subject ?

8.5 Linux软件RAID
Linux 2.4带着一个非常好的RAID代替出现了。Linux 2.2缺省的,当被Alan Cox发布时,是一个初期的RAID版本的特写,它没有被很好的重视。2.2仍然是早期版本特色的原因是写内核的人们不想在一个稳定的版本里做改动,那样会要求使用者更新。

更多的人们,包括Red Hat,Mandrake和SuSE,选择用表现得很完美的0.90版本来替换它。

这里我们只论述0.90版本。

FIXME: write more of this


--------------------------------------------------------------------------------

9. Cookbook
9.1 在计算机之间移动LVM磁盘
使用这些新技术,简单的任务象从一台计算机移动磁盘到另一台计算机就变得有些机警了。在用LVM之前,用户只需要把这块盘放到新的机器上并且mount这些文件系统。使用LVM,就多一点事情要做。LVM结构既保存在磁盘上也保存在/etc/lvmconf目录里,因此,移动一个或一组包含了一个VG的磁盘所要做的唯一的事情是确保这个VG属于的机器不会破坏它的数据。这是通过vgexport命令来实现的。vgexport仅仅从/etc/lvmconf删除关于这个VG的结构,而不会更改磁盘上的任何内容。一旦磁盘放到新的机器上(他们没必要有相同的ID),唯一要做的事情就是修改/etc/lvmconf。这是通过vgimport来做的。

例如:

在机器#1:


vgchange -a n vg01
vgexport vg01

在机器#2:


vgimport vg01 /dev/sda1 /dev/sdb1
vgchange -a y vg01

注意你没必要为这个VG使用相同的名字。如果vgimport命令没有保存配置的备份,那就用vgcfgbackup来做。

9.2 重建/etc/lvmtab 和/etc/lvmtab.d
FIXME: write about more neat stuff


--------------------------------------------------------------------------------

10. 进一步阅读
LVM站点
主要的有效LVM资源
德文LVM HOWTO
如果你能读懂德文,它就已经包含了许多信息
德文HOWTO的翻译
[email protected]正在将德文HOWTO翻译成英语。看来他们会花许多时间在上面。如果你怀疑我们的HOWTO,或者想知道些什么,请试试他们的努力。
HP/UX管理磁盘向导
因为Linux LVM几乎就是HP/UX执行的一个原样,他们的文档对我们也是非常有用的。是一个很好的资料。

11. 致谢
我们尝试在这里列出所有帮助我们写这篇HOWTO的人。包括呈报更新、修复或投稿的人,还有帮助我们理解这个主题的人。

Axel Boldt
Sean Reifschneider
Alexander Talos
Eric Maryniak


--



cnhnln 发表于 2006-11-2 21:55:38

虽然唔知佢讲噶大部分系乜不过似乎有d用..

Linux下TB级别的文件系统

1. linux 版本, kernel 版本, errata 版本
2. 什么文件系统,什么版本的
3. 什么存储,怎么连接的

另外,尽可能在TB级存储上避免单独mkfs一个超大分区然后直接mount上.我估计你不是用ext2就是ext3.如果TB级的ext2/3直接单独挂上去后,以后会有数不清的麻烦的. 从fsck开始到disaster recovery,从I/O blocking 开始到partition extending.

在生产环境下,正确的做法是:

1. upgrade你的linux kernel, errata到最新的, TB级存储,尽一切可能规避掉采用RedHat professional 之类的。RHEL, SLES是唯一的选择. FC也尽可能不要用.

2. 如果你的服务器是x86的,不是EM64T/AMD64的(x86_64)的,你就创建LVM分区,每个大小控制在400GB以内(当然,到底最小的用多少,要到现场采用一定的方法和手段作应用级的性能评估才能确定的,这里就是假设你是最普通的应用). 我习惯把所有的分区和lvm操作都脚本化. 所以我一般会切200G的LVM分区. 切多少个LVM partition,具体看你现在到底要用到多少, 比如你现在只要用1TB,就切5x200GB出来,剩下的不要理它.

3. 把你前面切出来的LVM Partition 用 pvcreate 做成PV,然后把用vgcreatevgname pv1 pv2 pv3... 把你这些pv都放到一个新建的vg中去

4. vg做好后,vgscan一下,如果没有activated, vgchange -a y 来激活, 然后lvcreate从这个1TB的vg中切出你要得lv出来. 比如就是 1TB的lv

5. 给这个lv 创建文件系统,我建议你好好看清楚自己的应用 I/O行为到底是怎样的,如果是大块的顺序读,并且数据不需要太多的保护,直接用ext2是最优的选择,当然你linux玩的还过得去的话,我也建议你优先考虑xfs. 如果都是琐碎的不确定大小的文件,且随机读写操作频繁,建议用ReiserFS. 最后考虑ext3.(n多人上来就用默认的ext3, ext3性能很糟糕,而且日志只有meta data才做,data区没有日志机制保护的,不像ReiserFS, JFS, XFS那样).

6. 以后要扩容了,就fdisk你的LUN,切出新的LVM partition, 然后用 pvcreate newpv1 newpv2 做好pv,然后用vgextend vgname newpv1 newpv2 newpv3把新的pv扩进去

7. 扩好了vg, 不用umount你之前的1TB LV的mountpoint,直接lvextend +LE numbersoldLV 来热扩展你的LV,扩好了LV之后,用 reiserfs.resize或者ext3.resize或者xfs_resize之类的动态的热扩展你的mountpoint上的fs

8.瞬间就可以做好n个TB上的存储管理.

看着挺烦德对巴,其实linux下面很容易做,也就个10分钟的事情. 如果你的应用是生产环境的正规应用,忘掉你说的什么直接创建文件系统然后挂上去的做法把,这个是野路子的做法,基本上没有人在正规应用中这样操作TB级的linux存储管理的,主要的原因就是后患无穷。



--


页: [1]
查看完整版本: Linux LVM HOWTO