# LVM (简体中文)

翻译状态： 本文是英文页面 LVM 的翻译，最后翻译时间：2013-08-12，点击这里可以查看翻译后英文页面的改动。

摘要 help replacing me
本文提供如何在 Arch Linux 中配置和使用 Logical Volume Manager (LVM) 的例子。
相关页面
Software RAID and LVM
System Encryption with LUKS

## 介绍

### LVM基本组成块（building blocks）

LVM利用Linux内核的device-mapper来实现存储系统的虚拟化（系统分区独立于底层硬件）。 通过LVM，你可以实现存储空间的抽象化并在上面建立虚拟分区（virtual partitions），可以更简便地扩大和缩小分区，可以增删分区时无需担心某个硬盘上没有足够的连续空间， without getting caught up in the problems of fdisking a disk that is in use (and wondering whether the kernel is using the old or new partition table) and without having to move other partition out of the way. LVM是用来方便管理的，不会提供额外的安全保证。 However, it sits nicely with the other two technologies we are using.

LVM的基本组成块（building blocks）如下：

- 物理卷Physical volume (PV)：可以在上面建立卷组的媒介，可以是硬盘分区，也可以是硬盘本身或者回环文件（loopback file）。物理卷包括一个特殊的header，其余部分被切割为一块块物理区域（physical extents）。 Think of physical volumes as big building blocks which can be used to build your hard drive.
- 卷组Volume group (VG)：将一组物理卷收集为一个管理单元。Group of physical volumes that are used as storage volume (as one disk). They contain logical volumes. Think of volume groups as hard drives.
- 逻辑卷Logical volume (LV)：虚拟分区，由物理区域（physical extents）组成。A "virtual/logical partition" that resides in a volume group and is composed of physical extents. Think of logical volumes as normal partitions.
- 物理区域Physical extent (PE)：硬盘可供指派给逻辑卷的最小单位（通常为4MB）。A small part of a disk (usually 4MB) that can be assigned to a logical Volume. Think of physical extents as parts of disks that can be allocated to any partition.

示例:

    两块物理硬盘

      硬盘1 (/dev/sda):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        |分区1 50GB (物理卷)    |分区2 80GB (物理卷)      |
        |/dev/sda1                     |/dev/sda2                      |
        |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _|_ _ _ _ _ _ _ _ _ _ _ _ _ _ __|

      硬盘2 (/dev/sdb):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
        |分区1 120GB (物理卷)                     |
        |/dev/sdb1                                       |
        | _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|

    LVM方式

      卷组VG1 (/dev/MyStorage/ = /dev/sda1 + /dev/sda2 + /dev/sdb1):
         _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __
        |逻辑卷1 15GB                |逻辑卷2 35GB                      |逻辑卷3 200GB                      |
        |/dev/MyStorage/rootvol |/dev/MyStorage/homevol    |/dev/MyStorage/mediavol      |
        |_ _ _ _ _ _ _ _ _ _ _ _ _ _ __|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ __ |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _|

### 优点

比起正常的硬盘分区管理，LVM更富于弹性：

- 使用卷组(VG)，使众多硬盘空间看起来像一个大硬盘。
- 使用逻辑卷（LV），可以创建跨越众多硬盘空间的分区。
- 可以创建小的逻辑卷（LV），在空间不足时再动态调整它的大小。
- 在调整逻辑卷（LV）大小时可以不用考虑逻辑卷在硬盘上的位置，不用担心没有可用的连续空间。It does not depend on the position of the LV within VG, there is no need to ensure surrounding available space.
- 可以在线（online）对逻辑卷（LV）和卷组（VG）进行创建、删除、调整大小等操作。LVM上的文件系统也需要重新调整大小，某些文件系统也支持这样的在线操作。
- 无需重新启动服务，就可以将服务中用到的逻辑卷（LV）在线（online）/动态（live）迁移至别的硬盘上。
- 允许创建快照，可以保存文件系统的备份，同时使服务的下线时间（downtime）降低到最小。

这些优点使得LVM对服务器的管理非常有用，对于桌面系统管理的帮助则没有那么显著，你需要根据实际情况进行取舍。

### 缺点

- 只能在Linux上使用。对于其他操作系统（如FreeBSD, Windows等），尚未有官方支持。
- 在系统设置时需要更复杂的额外步骤。
- 假如你使用的是btrfs文件系统，那么它所提供的子卷（subvolume）实际上已经时一层可动态调整的存储层，此时再用LVM就显得多余了。

## 在LVM上安装Arch Linux

你应该在安装过程的Partitioning和mkfs步骤中间创建LVM卷， 而且根（root）分区不再通过直接格式化硬盘来创建，而是创建在LVM逻辑卷（LV）上。

快速导览：

- 创建物理卷（PV）所在的分区，设置分区格式为'Linux LVM'，对应的十六进制码为8e（MBR）或8e00（GPT）。
- 创建物理卷（PV）。如果你只有一个硬盘，那么你最好只创建一个分区一个物理卷；如果你有多个硬盘，你可以创建多个分区，在每个分区上分别创建一个物理卷。
- 创建卷组（VG），并把所有物理卷加进卷组。
- 在卷组上创建逻辑卷（LV）。
- 继续Beginners' Guide中的格式化分区步骤。
- 当你做到Beginners' Guide中的创建初始 ramdisk 环境时，把lvm加入到mkinitcpio.conf文件中（请参考下文）。

警告: 如果你的启动引导程序使用的是GRUB Legacy，那么由于GRUB Legacy不支持LVM，因而你将无法在LVM上创建`/boot`分区。GRUB用户则不会有这个限制。如果你必须使用GRUB Legacy，那么请单独创建并在硬盘上直接格式化/boot分区。

### 创建物理卷（PV）

请确认你对正确的分区进行操作！你可以通过以下方式找到类型为'Linux LVM'的分区：

- MBR格式： `fdisk -l`
- GPT格式： 先用命令`lsblk`，再用命令`gdisk -l disk-device`

在该分区下创建一个物理卷pv（假设是/dev/sda2)：

    # pvcreate /dev/sda2

This command creates a header on each partition so it can be used for LVM. 你可以用以下命令查看已创建好的物理卷：

    # pvdisplay

注意: 如果你用的是擦除块（erase block）大小小于1M的SSD，请采用以下命令`pvcreate --dataalignment 1m /dev/sda2`来设置对齐（alignment），可以参考链接（英文）

### 创建卷组（VG）

创建完成物理卷（PV）之后，下一步就是在该物理卷创建卷组（VG）了。 如果有两个以上的物理卷（例如以下的/dev/sda2和/dev/sdb1），首先必须先在其中一个物理卷（PV）创建一个卷组，然后让该卷组扩大到其他所有的物理卷（这里假设你只使用一个卷组来管理其他所有的物理卷）:

    # vgcreate VolGroup00 /dev/sda2
    # vgextend VolGroup00 /dev/sdb1

其中，“VolGroup00”名字换成你自己起的名字即可。接下来可以用以下命令查看卷组：

    # vgdisplay

注意: 你可以创建多个的卷组，但这将因此让你的硬盘空间看起来不像一块硬盘。

### 创建逻辑卷（LV）

创建完卷组（VG）之后，就可以开始创建逻辑卷（LV）了。输入下面命令：

    # lvcreate -L 10G VolGroup00 -n lvolhome

其中10G是大小，VolGroup00是卷组名称，lvolhome是逻辑卷名称，这些都可以根据你自己喜欢设定。 该逻辑卷创建完后，你就可以通过`/dev/mapper/Volgroup00-lvolhome`或`/dev/VolGroup00/lvolhome`来访问它。

如果你要创建的是swap，那么你需要加上`-C y`参数：

    # lvcreate -C y -L 10G VolGroup00 -n lvolswap

`-C y`参数用来指定逻辑卷的空间分配是连续的，这保证了你所创建的swap空间不会被分散在不连续的物理空间甚至不同的硬盘中。

如果你想让要创建的逻辑卷拥有卷组（VG）的所有未使用空间，请使用以下命令：

    # lvcreate -l +100%FREE VolGroup00 -n lvolmedia

你可以通过以下命令来查看逻辑卷：

    # lvdisplay

注意: 为了使上述命令能正常运行，你可能需要加载device-mapper内核模块（请使用命令modprobe dm-mod）。
小贴士: 一开始可以创建小一点的逻辑卷，在卷组里留下一部分未使用空间，以后就可以根据需要再作扩展了。

### 建立文件系统与挂载逻辑卷

现在你的逻辑卷应该已经在`/dev/mapper/`和`/dev/YourVolumeGroupName`中了。如果你无法在以上位置找到它，请使用以下命令来加载模块、并扫描与激活卷组：

    # modprobe dm-mod
    # vgscan
    # vgchange -ay

现在你可以在逻辑卷上创建文件系统并像普通分区一样挂载它了（如果你正在安装Arch linux，需要更详细的信息，请参考挂载分区）：

    # mkfs.ext4 /dev/mapper/VolGroup00-lvolhome
    # mount /dev/mapper/VolGroup00-lvolhome /home

警告: 挂载点请选择你所新建的逻辑卷（例如：`/dev/mapper/Volgroup00-lvolhome`），不要使用逻辑卷所在的实际分区设备（例如：`/dev/sda2`）。

### 在mkinitcpio.conf中加入lvm的钩子扩展（hook）

你需要保证`udev`和`lvm2`这两个mkinitcpio的钩子扩展被启用。

`udev`已经预设好，不必手动启用了。你只需要编辑`/etc/mkinitcpio.conf`文件，在`block`与`filesystem`这两项中间插入`lvm2`：

    /etc/mkinitcpio.conf:

    HOOKS="base udev ... block lvm2 filesystems"

之后你就可以继续下一步的创建和启用镜像操作了。

## 配置

### 高级选项

如果你需要监控功能（这对快照是必须的），那么你需要启用lvmetad。 这只需要在`/etc/lvm/lvm.conf`文件中设置`use_lvmetad = 1`选项即可。 目前这个选项已经成为预设选项，不需要手动设置。

### 扩大逻辑卷

如果你想扩大逻辑卷的文件系统大小，你需要先扩充该逻辑卷，再让文件系统也扩充到新增加的空余空间中。

假设我们有一个15GB的逻辑卷，该逻辑卷被格式化为ext3文件系统。现在我们想让它变为20G，那么我们需要执行以下命令：

    # lvextend -L 20G VolGroup00/lvolhome (或 lvresize -L +5G VolGroup00/lvolhome)
    # resize2fs /dev/VolGroup00/lvolhome

如上所示，你可以使用`lvresize`命令来替代`lvextend`命令。

如果你想把逻辑卷（LV）扩大到整个卷组（VG）的所有空余空间中，那么你可以执行以下命令：

    # lvextend -l +100%FREE VolGroup00/lvolhome

警告: 并非所有的文件系统都支持无损或在线（online）扩大逻辑卷（在已挂载的文件系统上扩大逻辑卷很可能会造成数据损失）。
注意: 如果你没有执行`resize2fs`命令来调整文件系统的大小，那么你实际可用的逻辑卷空间不会得到扩充。

### 缩小逻辑卷

由于你逻辑卷上的文件系统很可能已经占满了逻辑卷的空间，因此在缩小逻辑卷时，你可能需要先缩小文件系统的大小，再缩小逻辑卷本身。对于不支持在线调整大小的文件系统，你还需要先卸载它再执行上述操作。 假设我们有一个15GB的逻辑卷，该逻辑卷被格式化为ext3文件系统。现在我们想让它缩小到10G，那么我们需要执行以下命令：

    # resize2fs /dev/VolGroup00/lvolhome 9G
    # lvreduce -L 10G VolGroup00/lvolhome （或 lvresize -L -5G VolGroup00/lvolhome）
    # resize2fs /dev/VolGroup00/lvolhome

在这里我们先把文件系统缩小到不足15G的大小（上例为9G），之所以不把它调整到刚好15G大小是为了防止在缩小逻辑卷时对文件系统数据可能造成的损害。之后我们再用`resize2fs`命令把文件系统调整到正常大小（上例为15G），以让它可以使用逻辑卷另外的（上例为6G）空余空间。与扩大逻辑卷类似，你可以使用`lvresize`命令来替代`lvreduce`命令。

警告:

- 为了避免数据丢失，在缩小文件系统时请不要让文件系统的大小比它的已使用空间还小。
- 并非所有的文件系统都支持无损或在线（online）缩小逻辑卷（在已挂载的文件系统上缩小逻辑卷很可能会造成数据损失）。

注意: 建议一开始缩小文件系统时，使文件系统大小比缩小后的逻辑卷大小还小，这样可以保证在缩小逻辑卷时，不会造成文件系统末端被切断的意外。

### 移除逻辑卷

警告: 在移除逻辑卷之前，请先备份好数据以免丢失！

首先，找到你所要移除的逻辑卷的名称。你可以使用以下命令来查看系统的所有逻辑卷：

    # lvs

接下来，找到你所要移除的逻辑卷的挂载点

    $ df -h

并卸载它：

    # umount /your_mountpoint

最后，使用以下命令来移除逻辑卷：

    # lvremove /dev/yourVG/yourLV

请输入`y`来确定你要执行移除逻辑卷操作。

此外，请不要忘了更新`/etc/fstab`！

你可以再次使用`lvs`命令来确认你的逻辑卷已被移除。

### 添加物理卷（PV）到卷组（VG）中

首先创建一个新的物理卷（PV），再把卷组（VG）扩充到该物理卷上：

    # pvcreate /dev/sdb1
    # vgextend VolGroup00 /dev/sdb1

This of course will increase the total number of physical extents on your volume group, which can be allocated by logical volumes as you see fit.

Note: It is considered good form to have a partition table on your storage medium below LVM. Use the appropriate type code: `8e` for MBR, and `8e00` for GPT partitions.

### 从卷组（VG）中移除分区

首先，分区中的所有数据需要被转移到别的分区，幸而LVM提供了以下的简便方式：

    # pvmove /dev/sdb1

如果你想指定所要转移的目标分区，那么可以把该分区作为`pvmove`的第二个参数：

    # pvmove /dev/sdb1 /dev/sdf1

接着，从卷组（VG）中移除物理卷（PV）：

    # vgreduce myVg /dev/sdb1

或者把所有的空物理卷（PV）都移除掉：

    # vgreduce --all vg0

最后，如果你仍然想要使用该分区，而且不想让LVM以为它是一个物理卷，那么你可以执行以下命令：

    # pvremove /dev/sdb1

### 快照功能

#### 介绍

LVM可以给系统创建一个快照，由于使用了写入时复制(copy-on-write) 策略，相比传统的备份更有效率。 初始的快照只有关联到实际数据的inode的实体链接(hark-link)而已。只要实际的数据没有改变，快照就只会包含指向数据的inode的指针，而非数据本身。一旦你更改了快照对应的文件或目录，LVM就会自动拷贝相应的数据，包括快照所对应的旧数据的拷贝和你当前系统所对应的新数据的拷贝。这样的话，只要你修改的数据（包括原始的和快照的）不超过2G，你就可以只使用2G的空间对一个有35G数据的系统创建快照。

#### 配置

你可以像创建普通逻辑卷一样创建快照逻辑卷。

    # lvcreate --size 100M --snapshot --name snap01 /dev/mapper/vg0-pv

你可以修改少于100M的数据直到该快照逻辑卷空间不足为止。

Todo: scripts to automate snapshots of root before updates, to rollback... updating menu.lst to boot snapshots (separate article?)

快照可以提供文件系统的冻结副本，主要被用来做备份；一份需要两小时才能完成的（快照）备份比直接备份分区更能保证文件系统映像的一致性。

## 常见问题

### Arch Linux默认设定所必须的设定值（Changes that could be required due to changes in the Arch-Linux defaults）

在`/etc/lvm/lvm.conf`文件中必须设定`use_lvmetad = 1`。现在这个选项已经成为预设值——你可以通过合并`lvm.conf.pacnew`文件来更新你过时的`/etc/lvm/lvm.conf`文件。

### LVM 命令不起作用

- 加载以下模块:

    # modprobe dm_mod

正常情况下，`dm_mod`模块应当被自动加载。假如该模块无法被自动加载，你可以试着修改`/etc/mkinitcpio.conf`：

    /etc/mkinitcpio.conf:

    MODULES="dm_mod ..."

你需要重建initramfs来提交你对`/etc/mkinitcpio.conf`的更改。

- 测试以lvm开头的命令是否可以被正确执行，例如：

    # lvm pvdisplay

### 逻辑卷无法显示

如果你在挂载某个已创建好的逻辑卷时，发现它没有出现在`lvscan`命令的结果列表里，那么你可以用以下命令去激活它：

    # vgscan
    # vgchange -ay

### 在可移除设备上的LVM问题

症状：

    # vgscan
     Reading all physical volumes.  This may take a while...
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836585984: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 319836643328: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 0: Input/output error
     /dev/backupdrive1/backup: read failed after 0 of 4096 at 4096: Input/output error
     Found volume group "backupdrive1" using metadata type lvm2
     Found volume group "networkdrive" using metadata type lvm2

产生原因：

  在卷组（VG）失活（deactivate）之前就移除掉外部的LVM设备。在你断开连接之前，需要保证以下命令被执行：

    # vgchange -an volume group name

解决方案：（假设你已经用`# vgchange -ay vg`命令来激活卷组，但仍有Input/output error的错误信息。）执行以下命令：

    # vgchange -an volume group name

移除外部设备，稍候几分钟后再执行以下命令：

    # vgscan
    # vgchange -ay volume group name

### 内核（kernel）选项

在grub的kernel选项中，你可能需要`dolvm`。`root=`需要被设置成相应的逻辑卷，例如`/dev/mapper/vg-name-lv-name`。

## 更多资源

archwiki的其他关于LVM的文章：

- Installing with software RAID or LVM
- RAID encryption LVM

外部资源：

- LVM2 Resource Page on SourceWare.org
- LVM HOWTO article at The Linux Documentation project
- LVM article at Gentoo wiki
- LVM2 Mirrors vs. MD Raid 1 post by Josh Bryan

Categories:

- Getting and installing Arch (简体中文)
- File systems (简体中文)
- 简体中文