磁盤管理系列
linux磁盤管理系列一:磁盤配額管理   http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html
linux磁盤管理系列二:軟RAID的實現  http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_041_raid.html
linux磁盤管理系列三:LVM的使用        http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_042_lvm.html
LVM是什么
LVM是Linux操作系統的邏輯卷管理器。 現在有兩個Linux版本的LVM,分別是 LVM1,LVM2。LVM1是一種已經被認為穩定了幾年的成熟產品,LVM2 是最新最好的LVM版本。 LVM2幾乎完全向后兼容使用LVM1創建的卷。此例外是快照(在升級到LVM 2之前,必須刪除快照卷)。
LVM簡介
邏輯卷管理提供了比傳統的磁盤和分區視圖更高級別的計算機系統上磁盤存儲的視圖。 這使得系統管理員可以更靈活地將存儲分配給應用程序和用戶。
在邏輯卷管理器的控制下創建的存儲卷可以隨意調整大小和移動,盡管這可能需要對文件系統工具進行一些升級。
邏輯卷管理器還允許管理用戶定義組中的存儲卷,允許系統管理員處理明顯命名的卷組(如“development”和“sales”),而不是物理磁盤名稱,例如“sda”和“sdb”
LVM基本術語
volume group (VG) 
卷組是LVM中使用的最高級別的抽象。 它將邏輯卷和物理卷集合在一起成為一個管理單元。
physical volume (PV)
一個物理卷通常是一個硬盤,雖然它可能只是一個看起來像一個硬盤(如軟件RAID設備)的設備。
logical volume (LV)
相當于非LVM系統中的磁盤分區。 LV作為標準塊設備可見 因此LV可以包含文件系統(例如/ home)。
physical extent (PE) 
每個物理卷都被劃分為數據塊(稱為物理擴展盤區),這些擴展盤區與卷組的邏輯盤區具有相同的大小。
logical extent (LE)
每個邏輯卷都被分割成數據塊,稱為邏輯盤區。 卷組中的所有邏輯卷的區段大小都是相同的。
幾個概念的關系
一個具體的例子將有助于:
假設我們有一個名為VG1的卷組,這個卷組的物理盤區大小為4MB。 在這個卷組中,我們引入了2個硬盤分區/dev/hda1和/dev/hdb1。 
這些分區將成為物理卷PV1和PV2(管理員可以自行決定是否提供更有意義的名稱)。
PV被分成4MB塊,因為這是卷組的大小。磁盤大小不同,我們在PV1中獲得99個擴展盤區,在PV2中獲得248個擴展盤區。 
我們現在可以創建自己的邏輯卷,它可以是1到347(248 + 99)范圍之間的任何大小。 
當創建邏輯卷時,在邏輯盤區和物理盤區之間定義映射,例如, 邏輯盤區1可以映射到PV1的物理盤區51上,寫入邏輯盤的第一個4MB的數據實際上被寫入到PV1的第51盤區。
映射模式
線性映射 : 將分配一定范圍的PE到LV的一個區域,例如LE 1 - 99映射到PV1,LE 100 - 347映射到PV2。
分條映射 : 將跨多個物理卷交織邏輯盤區的塊,這個方式一定程度上提高了性能,具體如下
1st chunk of LE[1] -> PV1[1], #第一個邏輯塊在PV1設備上, 第二個在PV2設備上,等等。
2nd chunk of LE[1] -> PV2[1],
3rd chunk of LE[1] -> PV3[1],
4th chunk of LE[1] -> PV1[2],
Snapshots(快照):
這是LVM提供的一個非常棒的功能就是快照了,他允許管理員創建一個新的塊設備來呈現一個邏輯卷的的精確副本,在某個時間凍結,管理員可以及時備份指定一致狀態下的數據,備份完畢就可以刪除設備了。
快照最初包含有關快照的一些元數據,但沒有來自源邏輯卷的實際數據?煺帐褂脤憰r復制(copy on write)技術來檢測數據在原始數據塊中何時更改。它將拍攝快照時保存的值復制到快照卷中的塊中,然后允許將新數據存儲在源塊中。
隨著更多塊從源邏輯卷上的原始值發生更改,快照大小也會增加。如果快照卷變滿,它將被丟棄,所以分配足夠的空間是非常重要的,具體取決于你數據的變換情況,如果快照大小和原始數據一樣大,它將永遠不會溢出的。
安裝LVM
[root@centos7 ~]$ rpm -q lvm2 # 查看lvm2是否安裝了, 我使用的centos7,這是安裝的了 lvm2-2.02.171-8.el7.x86_64 [root@centos7 ~]$ # yum -y install lvm2 # 沒有安裝的話使用yum安裝
常用命令簡介
[root@centos7 ~]$ pv # 使用tab按鍵獲取pv相關命令 pvchange pvck pvcreate pvdisplay pvmove pvremove pvresize pvs pvscan [root@centos7 ~]$ vg # 使用tabl按鍵獲取vg相關的命令 vgcfgbackup vgck vgdisplay vgimport vgmknodes vgrename vgsplit vgcfgrestore vgconvert vgexport vgimportclone vgreduce vgs vgchange vgcreate vgextend vgmerge vgremove vgscan [root@centos7 ~]$ lv # 使用tabl按鍵獲取lv先關的命令 lvchange lvdisplay lvmconf lvmdump lvmsadc lvremove lvs lvconvert lvextend lvmconfig lvmetad lvmsar lvrename lvscan lvcreate lvm lvmdiskscan lvmpolld lvreduce lvresize
上面的命令比較多,簡單介紹幾個常用的命令。
- pv打頭的:代表pv相關的命令
- vg帶頭的:代表vg相關的命令
- lv帶頭的: 代表lv相關的命令
- create:創建相關
- remove:移除相關
- display:顯示相關
- import:導入 相關
- export:導出相關
- rename:重命名
- vgchange:改變狀態相關
- extend:擴展相關
- reduce:縮進相關
使用LVM
pv創建
pv作用:初始化磁盤和磁盤分區
在將磁盤或者磁盤分區用作物理卷(PV)之前,你需要對其進行初始化工作。
[root@centos7 ~]$ pvcreate /dev/sdb1
注意:
- 不建議對整個磁盤做PV初始化工作。因為其他操作系統不能識別LVM元數據,導致我們認為磁盤是空閑的,重新設置分區覆蓋原有數據
-  如果是分區需要調整分區的類型為LVM(代碼為8e)
分區并設置分區類型
[root@centos7 ~]$ fdisk -l Disk /dev/sda: 214.7 GB, 214748364800 bytes, 419430400 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000b0b8a Device Boot Start End Blocks Id System /dev/sda1 * 2048 2099199 1048576 83 Linux /dev/sda2 2099200 270534655 134217728 83 Linux /dev/sda3 270534656 372934655 51200000 83 Linux /dev/sda4 372934656 419430399 23247872 5 Extended /dev/sda5 372938752 413898751 20480000 83 Linux Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x93d380cf Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 8e Linux LVM /dev/sdb2 2099200 4196351 1048576 8e Linux LVM Disk /dev/sde: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x73afb36f Device Boot Start End Blocks Id System /dev/sde1 2048 2099199 1048576 8e Linux LVM /dev/sde2 2099200 6293503 2097152 8e Linux LVM Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x7e0900d8 Device Boot Start End Blocks Id System /dev/sdd1 2048 2099199 1048576 8e Linux LVM /dev/sdd2 2099200 12584959 5242880 8e Linux LVM Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0xc56b90d8 Device Boot Start End Blocks Id System /dev/sdc1 2048 2099199 1048576 8e Linux LVM /dev/sdc2 2099200 4196351 1048576 8e Linux LVM Disk /dev/sdf: 21.5 GB, 21474836480 bytes, 41943040 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes [root@centos7 ~]$ partprobe Warning: Unable to open /dev/sr0 read-write (Read-only file system). /dev/sr0 has been opened read-only. [root@centos7 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 200G 0 disk ├─sda1 8:1 0 1G 0 part /boot ├─sda2 8:2 0 128G 0 part ├─sda3 8:3 0 48.8G 0 part / ├─sda4 8:4 0 512B 0 part └─sda5 8:5 0 19.5G 0 part /app sdb 8:16 0 100G 0 disk ├─sdb1 8:17 0 1G 0 part └─sdb2 8:18 0 1G 0 part sdc 8:32 0 20G 0 disk ├─sdc1 8:33 0 1G 0 part └─sdc2 8:34 0 1G 0 part sdd 8:48 0 20G 0 disk ├─sdd1 8:49 0 1G 0 part └─sdd2 8:50 0 5G 0 part sde 8:64 0 20G 0 disk ├─sde1 8:65 0 1G 0 part └─sde2 8:66 0 2G 0 part sdf 8:80 0 20G 0 disk sr0 11:0 1 8.1G 0 rom /run/media/root/CentOS 7 x86_64
上面我們在/dev/sd{b,c,d,e}這4個盤每個都有2個類型為lvm的盤。接下來使用pvcreat初始化為物理卷
[root@centos7 ~]$ pvcreate /dev/sd{b1,b2,c1,c2,d1,d2,e1,e2} -y # 這里加入了-y選項,之前的盤有文件系統的。 我這里強制創建了 Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Wiping xfs_external_log signature on /dev/sdb2. Physical volume "/dev/sdb1" successfully created. Physical volume "/dev/sdb2" successfully created. Physical volume "/dev/sdc1" successfully created. Physical volume "/dev/sdc2" successfully created. Physical volume "/dev/sdd1" successfully created. Physical volume "/dev/sdd2" successfully created. Physical volume "/dev/sde1" successfully created. Physical volume "/dev/sde2" successfully created.
pv信息查看
[root@centos7 ~]$ pvs # 詳細信息可以使用pvdisplay查看 PV VG Fmt Attr PSize PFree /dev/sdb1 vg_test_01 lvm2 a 1020.00m 1020.00m /dev/sdb2 lvm2 - 1.00g 1.00g /dev/sdc1 vg_test_01 lvm2 a 1020.00m 1020.00m /dev/sdc2 lvm2 - 1.00g 1.00g /dev/sdd1 vg_test_01 lvm2 a 1020.00m 1020.00m /dev/sdd2 lvm2 - 5.00g 5.00g /dev/sde1 vg_test_01 lvm2 a 1020.00m 1020.00m /dev/sde2 lvm2 - 2.00g 2.00g
vg創建
vg的創建是比較簡單的。
[root@centos7 ~]$ vgcreate vg_test_01 /dev/sd{b1,c1,d1,e1} # 上面我們創建了8個pv,這里我們使用4個1的設備去創建vg,創建后默認vg是激活狀態的 Volume group "vg_test_01" successfully created
vg信息的查看
[root@centos7 ~]$ vgs # 查看簡短的信息 VG #PV #LV #SN Attr VSize VFree vg_test_01 4 0 0 wzn- 3.98g 3.98g [root@centos7 ~]$ vgdisplay # 查看詳細的信息 - Volume group - VG Name vg_test_01 # vg的名字 System ID Format lvm2 # lvm格式, 這里是lvm2的 Metadata Areas 4 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 3.98 GiB # 這是我們4個pv的總大小 PE Size 4.00 MiB # pe的大小 Total PE 1020 Alloc PE / Size 0 / 0 # 分配的大小,這里我們還沒有創建lv,所以為0 Free PE / Size 1020 / 3.98 GiB # 分配后剩余的空間,第一個數是剩余的個數,第二個數是剩余的空間大小,2個都是剩余的只是單位表示不一樣而已 VG UUID Y5NjjP-e3Aq-3u6E-gw6P-fLyy-Y5pN-ryyN9R # vg設備的uuid
vg的激活
[root@centos7 ~]$ vgchange -a y vg_test_01 # 我們上面就是激活狀態的,如果我們重啟系統,或者vgchange -y n命令關閉了,就需要這個命令啟動下 0 logical volume(s) in volume group "vg_test_01" now active
vg的移除
[root@centos7 ~]$ vgchange -a n vg_test_01 # 要想移除vg,需要先關閉vg才能移除,這里先關閉 0 logical volume(s) in volume group "vg_test_01" now active [root@centos7 ~]$ vgremove vg_test_01 # 移除vg,
vg的添加成員
[root@centos7 ~]$ vgcreate vg_test_01 /dev/sd{b1,c1,d1,e1} # 上面我把vg刪了,這里重新添加進來 Volume group "vg_test_01" successfully created [root@centos7 ~]$ vgextend vg_test_01 /dev/sdb2 # 添加一個pv2到vg中來 Volume group "vg_test_01" successfully extended
vg的刪除成員
這個操作需要使用vgdisplay查看vg的使用情況和刪除的pv上沒有數據。如果有使用pvmove遷移完畢數據才能移除。
[root@centos7 ~]$ vgreduce vg_test_01 /dev/sdb2 Removed "/dev/sdb2" from volume group "vg_test_01"
lv的創建
[root@centos7 ~]$ vgdisplay # lv邏輯卷創建之前, 需要查看下vg信息 - Volume group - VG Name vg_test_01 System ID Format lvm2 Metadata Areas 4 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 4 Act PV 4 VG Size 3.98 GiB PE Size 4.00 MiB Total PE 1020 Alloc PE / Size 0 / 0 Free PE / Size 1020 / 3.98 GiB VG UUID sZwHea-LabA-SJaV-Wz40-qFp3-Um2w-pvmJAY [root@centos7 ~]$ lvcreate -L 2G -n lv_test_01 vg_test_01 # 我們的vg是近4G的,我這里創建一個2G的lv,之前磁盤使用了文件系統慈愛有如下警告。輸入y即可。 WARNING: linux_raid_member signature detected on /dev/vg_test_01/lv_test_01 at offset 4096. Wipe it? [y/n]: y Wiping linux_raid_member signature on /dev/vg_test_01/lv_test_01. WARNING: ext4 signature detected on /dev/vg_test_01/lv_test_01 at offset 1080. Wipe it? [y/n]: y Wiping ext4 signature on /dev/vg_test_01/lv_test_01. Logical volume "lv_test_01" created.
lv的移除
[root@centos7 ~]$ lvremove /dev/vg_test_01/lv_test_01
# 這個移除我們上面創建lv_test_01這個邏輯卷, 下面提示這個是活動的邏輯卷,輸入y就可以了 Do you really want to remove active logical volume vg_test_01/lv_test_01? [y/n]: y Logical volume "lv_test_01" successfully removed
注意: 如果這個lv被掛載了。 請先umount
掛載文件系統
[root@centos7 ~]$ lvcreate -L 2G -n lv_test_01 vg_test_01 # 上面我們刪除了lv,這里需要創建出來 Logical volume "lv_test_01" created. [root@centos7 ~]$ mkfs.ext4 /dev/vg_test_01/lv_test_01 # 這里我使用ext4 文件系統了。centos7默認使用的文件系統是xfs,但是xfs不支持縮減的 [root@centos7 ~]$ mkdir /mnt/test_01 # 創建掛載點目錄 [root@centos7 ~]$ mount /dev/vg_test_01/lv_test_01 /mnt/test_01/ # 掛載邏輯卷