快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

一份非常内行的Linux LVM HOWTO(2)

    好,这就是了。/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/n] 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?

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论