一、创建篇 本节主要是讲LVM逻辑卷的创建,如果有对LVM理论不太熟悉的朋友,可以先去看看LVM的原理,我在这儿暂且不表,直接讲下LVM创建实例。 要在Linux系统上使用LVM的功能,除了核心必须支持以外,还必须得安装LVM2套件。现在的Linux系统,核心都能支持,并且系统也自带了LVM2套件,如果没有装的话,就得自己动手装装了。 整个LVM制作流程可以简单分成三个部分,制作PV、创建VG、划分LV,下面来依次介绍。 1、建立和查询 PV 1.1、我准备了一个2G的盘来做测试,设备为/dev/sdb, 1 | Disk /dev/sdb: 2147 MB, 2147483648 bytes |
2 | 255 heads, 63 sectors/track, 261 cylinders |
3 | Units = cylinders of 16065 * 512 = 8225280 bytes |
5 | Device Boot Start End Blocks Id System |
然后对这个设备划分两个分区,来制作PV之用。当然,也可以直接把 /dev/sdb 作为一个pv。 01 | [root@localhost ~]# fdisk -l |
03 | Disk /dev/sda: 8589 MB, 8589934592 bytes |
04 | 255 heads, 63 sectors/track, 1044 cylinders |
05 | Units = cylinders of 16065 * 512 = 8225280 bytes |
07 | Device Boot Start End Blocks Id System |
08 | /dev/sda1 * 1 13 104391 83 Linux |
09 | /dev/sda2 14 914 7237282+ 83 Linux |
10 | /dev/sda3 915 1044 1044225 82 Linux swap / Solaris |
12 | Disk /dev/sdb: 2147 MB, 2147483648 bytes |
13 | 255 heads, 63 sectors/track, 261 cylinders |
14 | Units = cylinders of 16065 * 512 = 8225280 bytes |
16 | Device Boot Start End Blocks Id System |
17 | [root@localhost ~]# fdisk /dev/sdb |
19 | Command (m for help): n |
22 | p primary partition (1-4) |
24 | Partition number (1-4): 1 |
25 | First cylinder (1-261, default 1): |
27 | Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): +300M |
29 | Command (m for help): n |
32 | p primary partition (1-4) |
34 | Partition number (1-4): 2 |
35 | First cylinder (38-261, default 38): |
37 | Last cylinder or +size or +sizeM or +sizeK (38-261, default 261): +400M |
39 | Command (m for help): p |
41 | Disk /dev/sdb: 2147 MB, 2147483648 bytes |
42 | 255 heads, 63 sectors/track, 261 cylinders |
43 | Units = cylinders of 16065 * 512 = 8225280 bytes |
45 | Device Boot Start End Blocks Id System |
46 | /dev/sdb1 1 37 297171 83 Linux |
47 | /dev/sdb2 38 87 401625 83 Linux |
现在可以看到 ID 为83,这是LINUX格式,我们需要做PV,则需要将 ID 更改为 8e ,成为 LINUX LVM 格式。继续上面的操作: 01 | Command (m for help): t |
02 | Partition number (1-4): 1 |
03 | Hex code (type L to list codes): 8e |
04 | Changed system type of partition 1 to 8e (Linux LVM) |
06 | Command (m for help): t |
07 | Partition number (1-4): 2 |
08 | Hex code (type L to list codes): 8e |
09 | Changed system type of partition 2 to 8e (Linux LVM) |
11 | Command (m for help): p |
13 | Disk /dev/sdb: 2147 MB, 2147483648 bytes |
14 | 255 heads, 63 sectors/track, 261 cylinders |
15 | Units = cylinders of 16065 * 512 = 8225280 bytes |
17 | Device Boot Start End Blocks Id System |
18 | /dev/sdb1 1 37 297171 8e Linux LVM |
19 | /dev/sdb2 38 87 401625 8e Linux LVM |
21 | Command (m for help): w |
22 | The partition table has been altered! |
24 | Calling ioctl() to re-read partition table. |
26 | WARNING: Re-reading the partition table failed with error 16: Device or resource busy. |
27 | The kernel still uses the old table. |
28 | The new table will be used at the next reboot. |
30 | [root@localhost ~]# partprobe |
31 | [root@localhost ~]# fdisk -l |
33 | Disk /dev/sda: 8589 MB, 8589934592 bytes |
34 | 255 heads, 63 sectors/track, 1044 cylinders |
35 | Units = cylinders of 16065 * 512 = 8225280 bytes |
37 | Device Boot Start End Blocks Id System |
38 | /dev/sda1 * 1 13 104391 83 Linux |
39 | /dev/sda2 14 914 7237282+ 83 Linux |
40 | /dev/sda3 915 1044 1044225 82 Linux swap / Solaris |
42 | Disk /dev/sdb: 2147 MB, 2147483648 bytes |
43 | 255 heads, 63 sectors/track, 261 cylinders |
44 | Units = cylinders of 16065 * 512 = 8225280 bytes |
46 | Device Boot Start End Blocks Id System |
47 | /dev/sdb1 1 37 297171 8e Linux LVM |
48 | /dev/sdb2 38 87 401625 8e Linux LVM |
通过上面的操作,我们可以看出,已经将ID更改为8e,并且使用 partprobe 命令,让核心立刻读取最新的分区表,而不需要重新启动系统。 1.2、现在开始使用刚才建立的两个分区,来创建我们的PV设备。 01 | [root@localhost ~]# pvscan |
02 | No matching physical volumes found |
03 | [root@localhost ~]# pvcreate /dev/sdb1 |
04 | Physical volume "/dev/sdb1" successfully created |
05 | [root@localhost ~]# pvcreate /dev/sdb2 |
06 | Physical volume "/dev/sdb2" successfully created |
07 | [root@localhost ~]# pvscan |
08 | PV /dev/sdb1 lvm2 [290.21 MB] |
09 | PV /dev/sdb2 lvm2 [392.21 MB] |
10 | Total: 2 [682.42 MB] / in use : 0 [0 ] / in no VG: 2 [682.42 MB] |
使用 pvcreate 命令将分区改为pv格式后,可以使用 pvscan 命令搜索当前系统里任何具有PV格式的磁盘,如果想要查看详细的信息,可以执行 pvdisplay 命令。 01 | [root@localhost ~]# pvdisplay |
02 | "/dev/sdb1" is a new physical volume of "290.21 MB" |
03 | --- NEW Physical volume --- |
12 | PV UUID 4F633B-c57H-DQ0D-FppL-Ujv0-eDCH-mnBRko |
14 | "/dev/sdb2" is a new physical volume of "392.21 MB" |
15 | --- NEW Physical volume --- |
24 | PV UUID Axqcih-c0VU-peX7-SL22-q4QM-rQg2-zrluIj |
当然,也可以删除任何一个pv设备,使用 pvremove 命令即可。 1 | [root@localhost ~]# pvremove /dev/sdb2 |
2 | Labels on physical volume "/dev/sdb2" successfully wiped |
3 | [root@localhost ~]# pvscan |
4 | PV /dev/sdb1 lvm2 [290.21 MB] |
5 | Total: 1 [290.21 MB] / in use : 0 [0 ] / in no VG: 1 [290.21 MB] |
2、建立和查询 VG 2.1、创建VG时要使用 vgcreate 命令,格式和具体操作如下: 1 | [root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2 |
2 | Volume group "vg1" successfully created |
3 | [root@localhost ~]# vgscan |
4 | Reading all physical volumes. This may take a while ... |
5 | Found volume group "vg1" using metadata type lvm2 |
2.2、查询VG详细信息可以使用 vgdisplay 命令,如 01 | [root@localhost ~]# vgdisplay |
07 | Metadata Sequence No 1 |
20 | Free PE / Size 170 / 680.00 MB |
21 | VG UUID DMO8p5-OZoJ-QM0v-ewcW-KU0E-HZ0T-DUrO2l |
2.3、在这里罗嗦几句关于PE的概念,所谓 PE,就是 Physical Extend 物理扩展,在建立VG的时候,需要指定PE的数值,如果不指定,则默认为 4MB 。那么当PE为4MB 时,VG最大的容量就是256GB,不难看到,PE有点像VG的块,PE的大小决定了VG的容量。如果想让VG大于默认的256GB,那么就要改变PE这个数值。需要注意的是,一个VG最大可以允许65534个PE。 更改PE的值,要在创建VG时就要指定,使用 -s 参数即可。 1 | [root@localhost ~]# vgcreate -s 16M vg1 /dev/sdb1 /dev/sdb2 |
2 | Volume group "vg1" successfully created |
这样,名为vg1的VG容量从256GB增加到了 1TB 。不同的版本的核心对于PE的限制也不同,具体情况可以参看下man vgcreate中-s参数的解释。 但是,只有LVM1需要指定PE大小,来达到控制VG容量的效果,而现在的linux大部分都使用了 LVM 2 ,LVM2的PE数量已经没有限制了,所以,设置PE的大小,只会影响速率,而不会影响VG容量大小。 2.4、在VG内删除PV和增加PV设备 在VG内,可以随意删除某个PV设备,也可以随意添加某个PV设备进入到VG内,使用的命令为 vgreduce 和 vgextend 01 | [root@localhost ~]# vgdisplay |
07 | Metadata Sequence No 1 |
20 | Free PE / Size 42 / 672.00 MB |
21 | VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB |
23 | [root@localhost ~]# vgreduce vg1 /dev/sdb2 |
24 | Removed "/dev/sdb2" from volume group "vg1" |
25 | [root@localhost ~]# vgdisplay |
31 | Metadata Sequence No 2 |
44 | Free PE / Size 18 / 288.00 MB |
45 | VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB |
47 | [root@localhost ~]# vgextend vg1 /dev/sdb2 |
48 | Volume group "vg1" successfully extended |
49 | [root@localhost ~]# vgdisplay |
55 | Metadata Sequence No 3 |
68 | Free PE / Size 42 / 672.00 MB |
69 | VG UUID EzIPfa-DVvM-itX0-y1nd-MxsJ-ZUdZ-8eqsxB |
2.5、激活VG 当操作系统出现问题而无法开机时,备份数据显的由为重要。进入 rescue 模式或其他有 LVM 命令的环境,执行 pvscan 进行pv的扫描,此时可以查看到 pv和vg 的名字,再执行 vgchange -ay vg名字 命令,激活这个vg,就可以将里面的lv设备里的数据备份出来。 (1)单机使用LVM时,可以使用 1 | vgchange -a y vgname #来激活vg |
2 | vgchange -a n vgname #来非激活vg |
(2)Cluster模式下,有多台主机,当一台主机激活了VG,其他主机则无法激活VG,保证了数据的完整性,可以这样操作: 1 | vgchange -c y vgname #设置exclusive 属性; |
2 | vgchange -a e vgname #以 exclusive 模式激活vg ,上一步操作是前提条件; |
1 | vgchange -a n vgname #仍然使用这个命令来 非激活 vg ; |
2 | vgchange -c n vgname #去掉 exclusive 属性; |
(3)共享模式。允许VG被多台主机同时激活使用,如Oracle OPS等,但卷组里都必须是些裸设备才行,这样操作系统和文件系统不会对该设备进行操作,而完全交给应用程序来处理,数据的完整性也靠应用程序管理。 1 | vgchange -c y -S y vgname #设置VG为共享模式; |
2 | vgchange -a -s vgname #共享方式激活VG; |
3 | vgchange -a n vgname #仍然使用这个命令来 非激活 vg ; |
2.6、删除VG 删除一个VG很简单,执行 1 | vgremove vgname #删除名为vgname的vg |
3、创建LV 3.1、当vg创建好后,可以创建lv设备了,使用lvcreate命令即可: 在创建之前,需要介绍下两种模式,线性(linear)和交错(striped),默认情况下都是线性模式,如果有需要,可以选择交错模式。 线性(linear) 简单来说,就是按顺序分配,例如,LV 的 LE 1–100 映射到 pv1 上, LE 101—200 映射到 pv2 上。 2 | lvcreate -L [sizeMG] -n [lvname] vgname |
4 | [root@localhost ~]# lvcreate -L 96M -n lv1 vg1 |
5 | Logical volume "lv1" created |
6 | [root@localhost ~]# lvcreate -L 160M -n lv2 vg1 |
7 | Logical volume "lv2" created |
条带(striped) 简单来说,就是交错分配,例如,LV的 LE1 映射到 pv1 的 PE1 上,LV的 LE2 映射到 pv2 的 PE1 上,LV的 LE3 映射到 pv1 的 PE2 上,LV的 LE4 映射到 pv2 的 PE2 上等等。 2 | lvcreate -i [Stripes] -I [StripeSize] -L [sizeMG] -n [lvname] vgname |
4 | [root@localhost ~]# lvcreate -i 3 -I 4k -L 7G -n lv1 vg1 |
5 | Rounding size (1792 extents) up to stripe boundary size (1794 extents) |
6 | Logical volume "lv1" created |
-i 参数是在几个PV上建立交错模式, -I 参数是采用交错模式时使用的块大小,默认是4K,也可以设大些,但必须是2的N此方,N最大为9。 3.2、查看lv信息 可以先扫描下lv设备 (lvscan),再查看下lv的详细信息 (lvdisplay) 01 | [root@localhost ~]# lvscan |
02 | ACTIVE '/dev/vg1/lv1' [96.00 MB] inherit |
03 | ACTIVE '/dev/vg1/lv2' [160.00 MB] inherit |
04 | [root@localhost ~]# lvdisplay |
05 | --- Logical volume --- |
08 | LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco |
09 | LV Write Access read/write |
16 | Read ahead sectors auto |
17 | - currently set to 256 |
20 | --- Logical volume --- |
23 | LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel |
24 | LV Write Access read/write |
31 | Read ahead sectors auto |
32 | - currently set to 256 |
3.3、扩大或减小lv的容量 可以使用 lvextend 和 lvreduce 命令来扩大或减少 lv 的大小,具体的扩容问题后面会有专门的小节讲到,在这儿先简单的介绍下这两个命令。 01 | [root@localhost ~]# lvextend -L +32M /dev/vg1/lv1 |
02 | Extending logical volume lv1 to 128.00 MB |
03 | [root@localhost ~]# lvscan |
04 | ACTIVE '/dev/vg1/lv1' [128.00 MB] inherit |
05 | ACTIVE '/dev/vg1/lv2' [160.00 MB] inherit |
06 | [root@localhost ~]# lvdisplay |
07 | --- Logical volume --- |
10 | LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco |
11 | LV Write Access read/write |
18 | Read ahead sectors auto |
19 | - currently set to 256 |
22 | --- Logical volume --- |
25 | LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel |
26 | LV Write Access read/write |
33 | Read ahead sectors auto |
34 | - currently set to 256 |
01 | [root@localhost ~]# lvreduce -L -16M /dev/vg1/lv1 |
02 | WARNING: Reducing active logical volume to 112.00 MB |
03 | THIS MAY DESTROY YOUR DATA (filesystem etc.) |
04 | Do you really want to reduce lv1? [y/n]: y |
05 | Reducing logical volume lv1 to 112.00 MB |
06 | Logical volume lv1 successfully resized |
07 | [root@localhost ~]# lvscan |
08 | ACTIVE '/dev/vg1/lv1' [112.00 MB] inherit |
09 | ACTIVE '/dev/vg1/lv2' [160.00 MB] inherit |
10 | [root@localhost ~]# lvdisplay |
11 | --- Logical volume --- |
14 | LV UUID 9KNWK8-RGlB-VTiT-rn1R-IbGP-juoz-Froeco |
15 | LV Write Access read/write |
22 | Read ahead sectors auto |
23 | - currently set to 256 |
26 | --- Logical volume --- |
29 | LV UUID vHKb4j-MlSO-ppLG-Srk0-ofF4-silb-oT7Lel |
30 | LV Write Access read/write |
37 | Read ahead sectors auto |
38 | - currently set to 256 |
4、格式化lv,正式使用lv 01 | [root@localhost ~]# mkfs.ext3 /dev/vg1/lv1 |
02 | mke2fs 1.39 (29-May-2006) |
05 | Block size=1024 (log=0) |
06 | Fragment size=1024 (log=0) |
07 | 28672 inodes, 114688 blocks |
08 | 5734 blocks (5.00%) reserved for the super user |
10 | Maximum filesystem blocks=67371008 |
12 | 8192 blocks per group, 8192 fragments per group |
14 | Superblock backups stored on blocks: |
15 | 8193, 24577, 40961, 57345, 73729 |
17 | Writing inode tables: done |
18 | Creating journal (4096 blocks): done |
19 | Writing superblocks and filesystem accounting information: done |
21 | This filesystem will be automatically checked every 26 mounts or |
22 | 180 days, whichever comes first. Use tune2fs -c or -i to override. |
格式化为ext3格式后,挂载上来即可使用。 01 | [root@localhost ~]#cd /mnt |
02 | [root@localhost mnt]# mkdir sdb1 |
03 | [root@localhost mnt]# mount /dev/vg1/lv1 /mnt/sdb1 |
04 | [root@localhost mnt]# cd sdb1/ |
05 | [root@localhost sdb1]# ll |
07 | drwx------ 2 root root 12288 10-28 14:50 lost+found |
09 | [root@localhost sdb1]# df -h |
10 | Filesystem Size Used Avail Use% Mounted on |
11 | /dev/sda2 6.7G 4.9G 1.6G 76% / |
12 | /dev/sda1 99M 12M 82M 13% /boot |
13 | tmpfs 187M 0 187M 0% /dev/shm |
14 | /dev/mapper/vg1-lv1 109M 5.6M 98M 6% /mnt/sdb1 |
至此,LVM 制作步骤结束
|