本文提供如何在 Arch Linux 中配置和使用 Logical Volume Manager (LVM) 的例子。php
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.html
LVM的基本组成块(building blocks)以下:node
示例:linux
两块物理硬盘 硬盘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更富于弹性:ubuntu
这些优势使得LVM对服务器的管理很是有用,对于桌面系统管理的帮助则没有那么显著,你须要根据实际状况进行取舍。安全
你应该在安装过程的分区和建立文件系统这一步中建立LVM卷, 并且根(root)分区再也不经过直接格式化硬盘来建立,而是建立在LVM逻辑卷(LV)上。服务器
快速导览:app
lvm
加入到 mkinitcpio.conf
文件中(请参考下文)。/boot
分区。
GRUB用户则不会有这个限制。若是你必须使用GRUB Legacy,那么请单首创建并在硬盘上直接格式化
/boot
分区。
参见Partitioning对设备进行分区。tcp
可经过如下命令列出可被用做物理卷的设备:ide
# lvmdiskscan
在列出的设备上建立物理卷:
# pvcreate DEVICE
该命令在各个设备上建立LVM使用的头部。如#LVM基本组成所示, DEVICE能够是磁盘(如/dev/sda
),分区(如/dev/sda2
)或环回设备。例如:
# pvcreate /dev/sda2
你能够用如下命令查看已建立好的物理卷:
# pvdisplay
pvcreate --dataalignment 1m /dev/sda
来设置对齐(alignment),能够参考
连接(英文)
建立完成物理卷(PV)以后,下一步就是在该物理卷建立卷组(VG)了。 首先必须先在其中一个物理卷(PV)建立一个卷组
# vgcreate <volume_group> <physical_volume>
例如:
# vgcreate VolGroup00 /dev/sda2
而后让该卷组扩大到其余全部的物理卷:
# vgextend <volume_group> <physical_volume> # vgextend <volume_group> <another_physical_volume> # ...
例如:
# vgextend VolGroup00 /dev/sdb1 # vgextend VolGroup00 /dev/sdc
其中,“VolGroup00”名字换成你本身起的名字便可。接下来能够用如下命令查看卷组:
# vgdisplay
LVM支持将卷组与物理卷的建立聚合在一个命令中。例如,为了在前文提到的三个设备中建立名为VolGroup00的卷组,能够执行以下命令:
# vgcreate VolGroup00 /dev/sda2 /dev/sdb1 /dev/sdc
该命令首先会在分区上建立物理卷(若是以前没有建立过),再建立一个包含三个物理卷的卷组。若是设备上已经存在文件系统,命令会提出警告。
建立完卷组(VG)以后,就能够开始建立逻辑卷(LV)了。输入下面命令以指定新逻辑卷的名字、大小及其所在的卷组:
# lvcreate -L <size> <volume_group> -n <logical_volume>
例如:
# lvcreate -L 10G VolGroup00 -n lvolhome
该逻辑卷建立完后,你就能够经过/dev/mapper/Volgroup00-lvolhome
或/dev/VolGroup00/lvolhome
来访问它。与卷组命名相似,你能够按你的须要将逻辑卷命名。
你能够指定一个或多个物理卷来限制LVM分配数据空间的位置。好比你但愿在较小的SSD硬盘上建立根文件系统,并在较慢的机械硬盘上建立家目录卷,仅需把物理卷设备加入到命令中,例如:
# lvcreate -L 10G VolGroup00 -n lvolhome /dev/sdc1
若是你想让要建立的逻辑卷拥有卷组(VG)的全部未使用空间,请使用如下命令:
# lvcreate -l +100%FREE <volume_group> -n <logical_volume>
能够经过如下命令来查看逻辑卷:
# lvdisplay
如今你的逻辑卷应该已经在/dev/mapper/
和/dev/YourVolumeGroupName
中了。若是你没法在以上位置找到它,请使用如下命令来加载模块、并扫描与激活卷组:
# modprobe dm-mod # vgscan # vgchange -ay
如今你能够在逻辑卷上建立文件系统并像普通分区同样挂载它了(若是你正在安装Arch linux,须要更详细的信息,请参考挂载分区):
# mkfs.<fstype> /dev/mapper/<volume_group>-<logical_volume> # mount /dev/mapper/<volume_group>-<logical_volume> /<mountpoint>
例如:
# mkfs.ext4 /dev/mapper/VolGroup00-lvolhome # mount /dev/mapper/VolGroup00-lvolhome /home
/dev/mapper/Volgroup00-lvolhome
),
不要使用逻辑卷所在的实际分区设备(即不要使用:
/dev/sda2
)。
若是你的根文件系统基于LVM,你须要保证udev
和lvm2
这两个mkinitcpio的钩子扩展被启用。
udev
默认已经预设好,没必要手动启用了。你只须要编辑/etc/mkinitcpio.conf
文件,在block
与filesystem
这两项中间插入lvm2
:
/etc/mkinitcpio.conf
HOOKS="base udev ... block lvm2 filesystems"
以后你就能够继续下一步的建立和启用镜像操做了。
若是你的根文件系统位于逻辑分卷,则root=
内核参数必须指向一个映射设备,好比/dev/mapper/vg-name-lv-name
。
你可能还须要dolvm
的支持。
若是你须要监控功能(这对快照是必须的),那么你须要启用lvmetad。 这只须要在/etc/lvm/lvm.conf
文件中设置use_lvmetad = 1
选项便可。 目前这个选项已经成为预设选项,不须要手动设置。
能够经过修改/etc/lvm/lvm.conf
文件中的auto_activation_volume_list
参数限制自动激活的卷。若是存在问题,能够将此选项注释掉。
对于存在物理卷的设备,在扩增其容量以后或缩小其容量以前,必须使用pvresize
命令对应地增长或减小物理卷的大小。
增大分区/dev/sda1
的容量以后,须要执行如下命令扩展物理卷的大小
# pvresize /dev/sda1
命令将自动探测设备当前大小并将物理卷扩展到其最大容量。
在减小某个物理卷所在设备大小以前,须要经过指定--setphysicalvolumesize size
参数缩小物理卷大小,例如:
# pvresize --setphysicalvolumesize 40G /dev/sda1
该命令可能会提示如下错误:
/dev/sda1: cannot resize to 25599 extents as later ones are allocated. 0 physical volume(s) resized / 1 physical volume(s) not resized
即该物理卷已分配物理区域超过了命令指定的新大小边界,pvresize
会拒绝将物理卷缩小。若磁盘空间足够,可经过pvmove将物理区域从新分配至别的卷组来解决这个问题。
在移动空闲的物理区域到卷尾部以前,须要运行# pvdisplay -v -m
命令查看物理分段。以下例所示,仅有一个物理卷/dev/sdd1
, 一个卷组vg1
和一个逻辑卷backup
# pvdisplay -v -m
Finding all volume groups. Using physical volume(s) on command line. --- Physical volume --- PV Name /dev/sdd1 VG Name vg1 PV Size 1.52 TiB / not usable 1.97 MiB Allocatable yes PE Size 4.00 MiB Total PE 399669 Free PE 153600 Allocated PE 246069 PV UUID MR9J0X-zQB4-wi3k-EnaV-5ksf-hN1P-Jkm5mW --- Physical Segments --- Physical extent 0 to 153600: FREE Physical extent 153601 to 307199: Logical volume /dev/vg1/backup Logical extents 1 to 153599 Physical extent 307200 to 307200: FREE Physical extent 307201 to 399668: Logical volume /dev/vg1/backup Logical extents 153601 to 246068
可用空间在卷中段。为了减少物理卷大小,首先必须把全部的已用分段移到前部。
此例中,第一个可用空间在第0至第153600分段共153601个可用区域。咱们能够从最后的分段中移动相同数目的物理区域来填补这段空间
# pvmove --alloc anywhere /dev/sdd1:307201-399668 /dev/sdd1:0-92466
/dev/sdd1: Moved: 0.1 % /dev/sdd1: Moved: 0.2 % ... /dev/sdd1: Moved: 99.9 % /dev/sdd1: Moved: 100,0%
--alloc anywhere
能够用于在同一个分区中移动物理区域的。若要在不一样分区中移动,命令形式应该是# pvmove /dev/sdb1:1000-1999 /dev/sdc1:0-999
当全部空闲分段都移动到最后的物理区域时,运行# vgdisplay
查看。
以后能够再次运行命令:
# pvresize --setphysicalvolumesize size PhysicalVolume
结果相似:
# pvs
PV VG Fmt Attr PSize PFree /dev/sdd1 vg1 lvm2 a-- 1t 500g
最后,你能够用你喜欢的分区工具来缩小该分区。
lvextend
和
lvreduce
能够实现
lvresize特定选项实现的功能,且他们都有一个
-r, --resizefs
选项容许文件系统利用
fsadm(8)
(支持
ext2,
ext3,
ext4,
ReiserFS和
XFS)同步调节其大小。但除非你要对整个过程有更加精确的控制,直接使用
lvresize
辅以
--resizefs
选项来完成全部工做比较简便。
为了向逻辑组vg1中的逻辑卷lv1增长2GB空间但并不修改其文件系统,执行:
# lvresize -L +2G vg1/lv1
而从逻辑组vg1/lv1
中减小500MB空间但并不修改其文件系统大小(须要确保文件系统已经缩小过[broken link: invalid section]),执行:
# lvresize -L -500M vg1/lv1
设置vg1/lv1
为15GB并同时更改其文件系统大小:
# lvresize -L 15G -r vg1/lv1
若是想将全部可用空间都加入一个卷组,能够执行:
# lvresize -l +100%FREE vg/lv
查阅lvresize(8)可见详细说明。
若是在执行lv{resize,extend,reduce}
时没有使用-r, --resizefs
选项, 或文件系统不支持fsadm(8)
(如Btrfs, ZFS等),则须要在缩小逻辑卷以前或扩增逻辑卷后手动调整文件系统大小。
例如对于ext2/ext3/ext4文件系统:
# resize2fs vg/lv
会将文件系统大小扩展到逻辑卷支持的最大容量,而
# resize2fs -M vg/lv
会将文件系统减少到其所需的最小容量。也能够指定具体的尺寸:
# resize2fs vg/lv NewSize
首先,找到你所要移除的逻辑卷的名称。你可使用如下命令来查看系统的全部逻辑卷:
# lvs
接下来,找到你所要移除的逻辑卷的挂载点
$ lsblk
并卸载它:
# umount /<mountpoint>
最后,使用如下命令来移除逻辑卷:
# lvremove <volume_group>/<logical_volume>
例如:
# lvremove VolGroup00/lvolhome
请输入y
来肯定你要执行移除逻辑卷操做。
此外,请不要忘了更新/etc/fstab
。
你能够再次使用lvs
命令来确认你的逻辑卷已被移除。
首先建立一个新的物理卷(PV),再把卷组(VG)扩充到该物理卷上:
# pvcreate /dev/sdb1 # vgextend VolGroup00 /dev/sdb1
这将增长你卷组中的物理区域总数,你能够按须要将它们分配到逻辑卷中。
首先,分区中的全部数据须要被转移到别的分区,幸而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的数据直到该快照逻辑卷空间不足为止。
Reverting the modified 'pv' logical volume to the state when the 'snap01' snapshot was taken can be done with
# lvconvert --merge /dev/vg0/snap01
In case the origin logical volume is active, merging will occur on the next reboot.(Merging can be done even from a LiveCD)
The snapshot will no longer exist after merging.
Also multiple snapshots can be taken and each one can be merged with the origin logical volume at will.
The snapshot can be mounted and backed up with dd or tar. The size of the backup file done with dd will be the size of the files residing on the snapshot volume. To restore just create a snapshot, mount it, and write or extract the backup to it. And then merge it with the origin.
It is important to have the dm_snapshot module listed in the MODULES variable of /etc/mkinitcpio.conf
, otherwise the system will not boot. If you do this on an already installed system, make sure to rebuild the image with
# mkinitcpio -g /boot/initramfs-linux.img
Todo: scripts to automate snapshots of root before updates, to rollback... updating menu.lst to boot snapshots (separate article?)
快照能够提供文件系统的冻结副本,主要被用来作备份;一份须要两小时才能完成的(快照)备份比直接备份分区更能保证文件系统映像的一致性。
See Create root filesystem snapshots with LVM for automating the creation of clean root file system snapshots during system startup for backup and rollback.
Dm-crypt/Encrypting an entire system#LVM on LUKS and Dm-crypt/Encrypting an entire system#LUKS on LVM.
If you have LVM volumes not activated via the initramfs, enable[broken link: invalid section] the lvm-monitoring service, which is provided by the lvm2 package.
在/etc/lvm/lvm.conf
文件中必须设定use_lvmetad = 1
。如今这个选项已经成为预设值——你能够经过合并lvm.conf.pacnew
文件来更新你过期的/etc/lvm/lvm.conf
文件。
# modprobe dm_mod
正常状况下,dm_mod
模块应当被自动加载。假如该模块没法被自动加载,你能够试着修改/etc/mkinitcpio.conf
:
/etc/mkinitcpio.conf:
MODULES="dm_mod ..."
你须要重建initramfs来提交你对/etc/mkinitcpio.conf
的更改。
# lvm pvdisplay
若是你在挂载某个已建立好的逻辑卷时,发现它没有出如今lvscan
命令的结果列表里,那么你能够用如下命令去激活它:
# vgscan # vgchange -ay
症状:
# 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
产生缘由:
# vgchange -an volume group name
解决方案:(假设你已经用# vgchange -ay vg
命令来激活卷组,但仍有Input/output error的错误信息。)执行如下命令:
# vgchange -an volume group name
移除外部设备,稍候几分钟后再执行如下命令:
# vgscan # vgchange -ay volume group name
If trying to extend a logical volume errors with:
" Insufficient suitable contiguous allocatable extents for logical volume "
The reason is that the logical volume was created with an explicit contiguous allocation policy (options -C y
or --alloc contiguous
) and no further adjacent contiguous extents are available (see also reference).
To fix this, prior to extending the logical volume, change its allocation policy with lvchange --alloc inherit <logical_volume>
. If you need to keep the contiguous allocation policy, an alternative approach is to move the volume to a disk area with sufficient free extents (see [1]).
Make sure to remove snapshot volumes before generating grub.cfg