LVM邏輯卷管理(Logical Volume Manager)
随着資料的逐漸增加,當初設計的磁盤大小已經滿足不了現在的需求了,當磁盤面臨着滿盤時,運維人員如何解決問題?是換一個更大的磁盤,把原先的資料copy到現在更大的磁盤裡面,繼續撐一段時間,還是尋找其它方法?LVM的出現很好的解決了這一問題。LVM是linux環境下對磁盤分區進行管理的一種機制,是建立在硬碟和分區之上的一個邏輯層,來提高磁盤分區管理的靈活性。
LVM有兩個特性
1、便捷的調整檔案系統大小
2、支援快照snapshot
建立LVM的示意圖
<a target="_blank" href="http://blog.51cto.com/attachment/201307/104745481.png"></a>
PV可以是硬碟的分區,PV組成了VG,在VG上面割取PE就組成了LV
實體卷physical volume (PV)
實體卷是硬碟分區,也可以是整個硬碟或已建立的Software RAID 卷。
卷組volume group (VG)
卷組是LVM 中最高抽象層,是由一個或多個實體卷所組成的存儲器池。
實體塊physical extent (PE)
實體卷按大小相等的“塊”為機關存儲,塊的大小與卷組中邏輯卷塊的大小相同。
邏輯塊logical extent (LE)
邏輯卷按“塊”為機關存儲,在一卷組中的所有邏輯卷的塊大小是相同的。
邏輯卷logical volume (LV)
邏輯卷相當于非LVM 系統中的分區,它在卷組上建立,是一個标準的塊裝置,可以在其上建立檔案系統
從一塊硬碟到能使用LV檔案系統的步驟:
硬碟----分區----PV----VG----LV----格式化(LV為ext檔案系統)----挂載
一、LVM的第一個特性,便捷的調整檔案系統大小
1、PV的相關操作
先對硬碟進行分區
<a target="_blank" href="http://blog.51cto.com/attachment/201307/110952594.png"></a>
<a target="_blank" href="http://blog.51cto.com/attachment/201307/111027190.png"></a>
pvcreate 建立PV
1
2
3
<code>[root@Redhat6 ~]</code><code># pvcreate /dev/sda5 /dev/sda6</code>
<code> </code><code>Physical volume </code><code>"/dev/sda5"</code> <code>successfully created</code>
<code> </code><code>Physical volume </code><code>"/dev/sda6"</code> <code>successfully created</code>
pvromve 移除PV
<code>[root@Redhat6 ~]</code><code># pvremove /dev/sda5</code>
<code> </code><code>Labels on physical volume </code><code>"/dev/sda5"</code> <code>successfully wiped</code>
pvdisplay 顯示PV的詳細資訊,用pvs也可以顯示pv的資訊
4
5
<code>[root@Redhat6 ~]</code><code># pvs</code>
<code> </code><code>PV VG Fmt Attr PSize PFree</code>
<code> </code><code>/dev/sda2</code> <code>vg0 lvm2 a-- 59.99g 7.99g</code>
<code> </code><code>/dev/sda5</code> <code>lvm2 a-- 10.00g 10.00g</code>
<code> </code><code>/dev/sda6</code> <code>lvm2 a-- 10.00g 10.00g</code>
pvmove 移動pv,将此PV的資料轉移至其它PV
<code>[root@Redhat6 ~]</code><code># pvmove /dev/sda5 /dev/sda6 #把sda5的資料轉移到sda6上面</code>
<code> </code><code>/dev/sda5</code><code>: Moved: 100.0%</code>
2、VG的相關操作
vgcreate 建立vg,-s PE:指定PE大小,預設為4M
<code>[root@Redhat6 ~]</code><code># vgcreate myvg /dev/sda5 /dev/sda6</code>
<code> </code><code>Volume group </code><code>"myvg"</code> <code>successfully created</code>
vgdisplay 顯示VG的詳細資訊,用vgs也可以顯示VG的資訊
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<code>[root@Redhat6 ~]</code><code># vgdisplay</code>
<code> </code><code>--- Volume group ---</code>
<code> </code><code>VG Name myvg</code>
<code> </code><code>System ID </code>
<code> </code><code>Format lvm2</code>
<code> </code><code>Metadata Areas 3</code>
<code> </code><code>Metadata Sequence No 2</code>
<code> </code><code>VG Access </code><code>read</code><code>/write</code>
<code> </code><code>VG Status resizable</code>
<code> </code><code>MAX LV 0</code>
<code> </code><code>Cur LV 0</code>
<code> </code><code>Open LV 0</code>
<code> </code><code>Max PV 0</code>
<code> </code><code>Cur PV 3</code>
<code> </code><code>Act PV 3</code>
<code> </code><code>VG Size 25.01 GiB</code>
<code> </code><code>PE Size 4.00 MiB</code>
<code> </code><code>Total PE 6402</code>
<code> </code><code>Alloc PE / Size 0 / 0</code>
<code> </code><code>Free PE / Size 6402 / 25.01 GiB</code>
<code> </code><code>VG UUID cLkCtE-LB7X-SYCE-GcKF-I30f-pBYH-MTCLZC</code>
vgremove 移除vg,隻需跟vg的名稱即可
<code>[root@Redhat6 ~]</code><code># vgremove myvg</code>
<code> </code><code>Volume group </code><code>"myvg"</code> <code>successfully removed</code>
vgextend vg的擴充,先必須添加其它的PV
首先準備好一個PV--->然後使用vgextend指令即可完成擴充
<code>[root@Redhat6 ~]</code><code># pvcreate /dev/sda5 /dev/sda6 #建立PV</code>
<code>[root@Redhat6 ~]</code><code># vgcreate myvg /dev/sda5 /dev/sda6 #建立VG</code>
<code>[root@Redhat6 ~]</code><code># pvcreate /dev/sda3 #把另外一個分區建立為PV</code>
<code> </code><code>Physical volume </code><code>"/dev/sda3"</code> <code>successfully created</code>
<code>[root@Redhat6 ~]</code><code># vgextend myvg /dev/sda3 #在myvg組裡面擴充VG</code>
<code> </code><code>Volume group </code><code>"myvg"</code> <code>successfully extended</code>
vgreduce vg的縮減,
确定要移除的PV--->将此PV的資料轉移至其它PV---->從卷組中将此PV移除
<code>[root@Redhat6 ~]</code><code># pvs #檢視PV,确定要移除哪個PV</code>
<code> </code><code>/dev/sda3</code> <code>myvg lvm2 a-- 5.01g 5.01g</code>
<code> </code><code>/dev/sda5</code> <code>myvg lvm2 a-- 10.00g 3.00g</code>
<code> </code><code>/dev/sda6</code> <code>myvg lvm2 a-- 10.00g 10.00g</code>
<code>[root@Redhat6 ~]</code><code># pvmove /dev/sda3 /dev/sda5 #把sda3的資料轉移到sda5上面</code>
<code> </code><code>/dev/sda3</code><code>: Moved: 100.0%</code>
<code>[root@Redhat6 ~]</code><code># vgreduce myvg /dev/sda3 #從VG中把PV移除</code>
<code> </code><code>Removed </code><code>"/dev/sda3"</code> <code>from volume group </code><code>"myvg"</code>
<code> </code><code>/dev/sda3</code> <code>lvm2 a-- 5.01g 5.01g</code>
<code>[root@Redhat6 ~]</code><code>#</code>
3、LV的相關操作
lvcreate 建立LV,相關參數:-l 指定PE個數,-L指定LV的大小,
-s建立一個快照卷,-n LV的名稱
<code>[root@Redhat6 ~]</code><code># lvcreate -L 5G -n lv1 myvg</code>
<code> </code><code>Logical volume </code><code>"lv1"</code> <code>created</code>
lvdisplay 顯示LV的詳細資訊,用lvs也可以顯示LV的資訊
<code>[root@Redhat6 ~]</code><code># lvdisplay</code>
<code> </code><code>--- Logical volume ---</code>
<code> </code><code>LV Path </code><code>/dev/myvg/lv1</code>
<code> </code><code>LV Name lv1</code>
<code> </code><code>VG Name myvg</code>
<code> </code><code>LV UUID 7Ewvyg-pEFI-o4XL-kFDa-Jtvl-hmak-5fg3qT</code>
<code> </code><code>LV Write Access </code><code>read</code><code>/write</code>
<code> </code><code>LV Creation host, </code><code>time</code> <code>Redhat6, 2013-07-23 05:42:33 +0800</code>
<code> </code><code>LV Status available</code>
<code> </code><code># open 0</code>
<code> </code><code>LV Size 5.00 GiB </code><code>#建立一個5G的lv</code>
<code> </code><code>Current LE 1280</code>
<code> </code><code>Segments 1</code>
<code> </code><code>Allocation inherit</code>
<code> </code><code>Read ahead sectors auto</code>
<code> </code><code>- currently </code><code>set</code> <code>to 256</code>
<code> </code><code>Block device 253:4</code>
lvremove 移除lv,需要移除lv的裝置檔案:
/dev/myvg/lv1或者/dev/mapper/myvg-lv1
<code>[root@Redhat6 ~]</code><code># lvremove /dev/myvg/lv1</code>
<code>Do you really want to remove active logical volume lv1? [y</code><code>/n</code><code>]: y</code>
<code> </code><code>Logical volume </code><code>"lv1"</code> <code>successfully removed</code>
lvextend 擴充LV
先确定要擴充多大-->确定目前VG有足夠的空閑空間-->擴充(1、實體邊界---2、邏輯邊界)
當VG不夠時,先增加PV,在擴充VG,最後在VG上面擴充LV。
<code>[root@Redhat6 ~]</code><code># mke2fs -t ext4 /dev/myvg/lv1 #先把lv格式化</code>
<code>[root@Redhat6 ~]</code><code># lvextend -L +4G /dev/myvg/lv1 #實作實體擴容</code>
<code> </code><code>Extending logical volume lv1 to 9.00 GiB </code><code>#之前隻有5G,現在擴了4G</code>
<code> </code><code>Logical volume lv1 successfully resized</code>
<code>[root@Redhat6 ~]</code><code># resize2fs /dev/myvg/lv1 #實作邏輯擴容</code>
<code>resize2fs 1.41.12 (17-May-2010)</code>
<code>Resizing the filesystem on </code><code>/dev/myvg/lv1</code> <code>to 2359296 (4k) blocks.</code>
<code>The filesystem on </code><code>/dev/myvg/lv1</code> <code>is now 2359296 blocks long.</code>
lvreduce 縮小LV
先解除安裝--->然後減小邏輯邊界---->最後減小實體邊界--->在檢測檔案系統 ====謹慎用===
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<code>[root@Redhat6 ~]</code><code># umount /dev/mapper/myvg-lv1</code>
<code>[root@Redhat6 ~]</code><code># e2fsck -f /dev/myvg/lv1</code>
<code>e2fsck 1.41.12 (17-May-2010)</code>
<code>Pass 1: Checking inodes, blocks, and sizes</code>
<code>Pass 2: Checking directory structure</code>
<code>Pass 3: Checking directory connectivity</code>
<code>Pass 4: Checking reference counts</code>
<code>Pass 5: Checking group summary information</code>
<code>/dev/myvg/lv1</code><code>: 13</code><code>/589824</code> <code>files (0.0% non-contiguous), 73829</code><code>/2359296</code> <code>blocks</code>
<code>[root@Redhat6 ~]</code><code># resize2fs /dev/myvg/lv1 7G #把lv減少到7G,減少了2G</code>
<code>Resizing the filesystem on </code><code>/dev/myvg/lv1</code> <code>to 524288 (4k) blocks.</code>
<code>The filesystem on </code><code>/dev/myvg/lv1</code> <code>is now 524288 blocks long.</code>
<code>[root@Redhat6 ~]</code><code># lvs #檢視lv的大小發現并沒有實際的減少</code>
<code> </code><code>LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert</code>
<code> </code><code>lv1 myvg -wi-a---- 9.00g </code>
<code> </code><code>root vg0 -wi-ao--- 20.00g </code>
<code> </code><code>swap vg0 -wi-ao--- 2.00g </code>
<code> </code><code>usr vg0 -wi-ao--- 10.00g </code>
<code> </code><code>var vg0 -wi-ao--- 20.00g </code>
<code>[root@Redhat6 ~]</code><code># lvreduce -L -2G /dev/myvg/lv1 #減少lv的實體邊界,指定減少2G</code>
<code> </code><code>WARNING: Reducing active logical volume to 7.00 GiB</code>
<code> </code><code>THIS MAY DESTROY YOUR DATA (filesystem etc.)</code>
<code>Do you really want to reduce lv1? [y</code><code>/n</code><code>]: y</code>
<code> </code><code>Reducing logical volume lv1 to 7.00 GiB</code>
<code>[root@Redhat6 ~]</code><code># lvs #檢視lv的大小發現已經實際的減少了</code>
<code> </code><code>lv1 myvg -wi-a---- 7.00g </code>
<code> </code><code>var vg0 -wi-ao--- 20.00g </code>
<code>[root@Redhat6 ~]</code><code># e2fsck -f /dev/myvg/lv1 #減少之後檢查檔案系統</code>
<code>/dev/myvg/lv1</code><code>: 13</code><code>/131072</code> <code>files (0.0% non-contiguous), 43698</code><code>/524288</code> <code>blocks</code>
二、LVM的第二個特性,在備份資料的時候創鍵快照卷
當需要備份LV裡面的資料時,且LV的資料也在進行寫操作時,這個時候建立快照就很有必要了,快照是一個通路LV裡面資料的一個通道,他不會儲存LV裡面所有的資料,當LV某些PE裡面資料變化時,快照儲存之前PE的資料,未變化的PE将不會被儲存。
步驟:
分區--->建立PV--->建立VG--->建立LV--->格式化LV為ext4--->挂載--->寫入資料--->需要備份(建立快照)--->建立快照卷--->再次繼續寫入資料---->挂載快照卷--->備份之前的資料到快照卷裡面--->解除安裝快照--->删除快照卷
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<code>root@station128 ~]</code><code># fdisk /dev/sda #先建立兩個邏輯分區,大小為10G</code>
<code>Command (m </code><code>for</code> <code>help): n</code>
<code>First cylinder (9165-15665, default 9165):</code>
<code>Using default value 9165</code>
<code>Last cylinder, +cylinders or +size{K,M,G} (9165-15665, default 15665): +10G</code>
<code>Command (m </code><code>for</code> <code>help): t</code>
<code>Partition number (1-5): 5</code>
<code>Hex code (</code><code>type</code> <code>L to list codes): 8e </code><code>#并改為LVM檔案系統</code>
<code>Changed system </code><code>type</code> <code>of partition 5 to 8e (Linux LVM)</code>
<code>First cylinder (10471-15665, default 10471):</code>
<code>Using default value 10471</code>
<code>Last cylinder, +cylinders or +size{K,M,G} (10471-15665, default 15665): +10G</code>
<code>Partition number (1-6): 6</code>
<code>Hex code (</code><code>type</code> <code>L to list codes): 8e</code>
<code>Changed system </code><code>type</code> <code>of partition 6 to 8e (Linux LVM)</code>
<code>Command (m </code><code>for</code> <code>help): w</code>
<code>[root@Redhat6 ~]</code><code># vgcreate -s 8M myvg /dev/sda5 /dev/sda6 #建立VG,并指定PE為8M</code>
<code>[root@Redhat6 ~]</code><code># lvcreate -L 4G -n lv1 myvg #建立LV為4G</code>
<code>[root@Redhat6 ~]</code><code># mkfs -t ext4 /dev/myvg/lv1 #格式化LV為ext4</code>
<code>[root@Redhat6 ~]</code><code># blkid #顯示裝置的UUID及檔案系統類型,及卷标</code>
<code>/dev/mapper/vg0-var</code><code>: UUID=</code><code>"c9776f08-bbaf-4a36-a009-3e16a09ad924"</code> <code>TYPE=</code><code>"ext4"</code>
<code>/dev/sda1</code><code>: UUID=</code><code>"dc3cc214-a9f6-4730-a186-d08765ccfa4f"</code> <code>TYPE=</code><code>"ext4"</code>
<code>/dev/sda2</code><code>: UUID=</code><code>"zPpbgE-0Ip7-A4m2-GG4K-sBrC-eUeU-V8VdCI"</code> <code>TYPE=</code><code>"LVM2_member"</code>
<code>/dev/sda5</code><code>: UUID=</code><code>"e5eLw1-JTrG-H9Q7-18qA-SrPV-axMc-QLPW5M"</code> <code>TYPE=</code><code>"LVM2_member"</code>
<code>/dev/sda6</code><code>: UUID=</code><code>"7OOZcJ-XzLf-zJJq-JbdF-e386-xCTl-Ym2UE3"</code> <code>TYPE=</code><code>"LVM2_member"</code>
<code>/dev/mapper/vg0-root</code><code>: UUID=</code><code>"bae7835a-af3b-4935-a04b-5932b2fc123b"</code> <code>TYPE=</code><code>"ext4"</code>
<code>/dev/mapper/vg0-swap</code><code>: UUID=</code><code>"3e0cb4a7-d393-4f75-af12-1fe6e8c96273"</code> <code>TYPE=</code><code>"swap"</code>
<code>/dev/mapper/vg0-usr</code><code>: UUID=</code><code>"46d516b8-03ea-4c0d-bb03-0e9d6893bd1a"</code> <code>TYPE=</code><code>"ext4"</code>
<code>/dev/mapper/myvg-lv1</code><code>: UUID=</code><code>"2d44718c-993d-42e6-896b-05e06af45aee"</code> <code>TYPE=</code><code>"ext4"</code>
<code>[root@Redhat6 ~]</code><code># mkdir /mnt/lv1 #建立LV的挂載點</code>
<code>[root@Redhat6 ~]</code><code># mount /dev/myvg/lv1 /mnt/lv1/ #挂載LV</code>
<code>[root@Redhat6 ~]</code><code># cd /mnt/lv1/ #進入到LV的挂載點</code>
<code>[root@Redhat6 lv1]</code><code># ls</code>
<code>lost+found</code>
<code>[root@Redhat6 lv1]</code><code># cp /etc/rc.sysinit /etc/inittab ./ #copy一個檔案到LV的挂載目錄裡面</code>
<code>inittab lost+found rc.sysinit</code>
<code>[root@Redhat6 lv1]</code><code># lvcreate -L 50M -s -p r -n MY_SNAP /dev/myvg/lv1 #建立快照卷為50M,且隻能讀,名稱為MY_SNAP</code>
<code> </code><code>Rounding up size to full physical extent 56.00 MiB</code>
<code> </code><code>Logical volume </code><code>"MY_SNAP"</code> <code>created</code>
<code>[root@Redhat6 lv1]</code><code># mkdir /mnt/snap #建立快照卷的挂載點</code>
<code>[root@Redhat6 lv1]</code><code># mount /dev/myvg/MY_SNAP /mnt/snap/ #挂載快照卷</code>
<code>mount</code><code>: block device </code><code>/dev/mapper/myvg-MY_SNAP</code> <code>is write-protected, mounting </code><code>read</code><code>-only</code>
<code>[root@Redhat6 lv1]</code><code># mkdir /backup #建立備份目錄</code>
<code>[root@Redhat6 lv1]</code><code># tar -jcf /backup/lv1.tar.bz2 /mnt/snap/* #把快照卷裡面的資料歸檔</code>
<code>tar</code><code>: Removing leading `/' from member names</code>
<code>[root@Redhat6 lv1]</code><code># cp /etc/fstab /mnt/lv1/ #copy檔案到LV檔案,使LV檔案與之前快照的檔案有所改變</code>
<code>[root@Redhat6 lv1]</code><code># umount /dev/myvg/MY_SNAP #備份完成後,解除安裝快照卷的挂載點</code>
<code>[root@Redhat6 lv1]</code><code># lvremove /dev/myvg/MY_SNAP #移除快照卷</code>
<code>Do you really want to remove active logical volume MY_SNAP? [y</code><code>/n</code><code>]: y</code>
<code> </code><code>Logical volume </code><code>"MY_SNAP"</code> <code>successfully removed</code>
<code>[root@Redhat6 lv1]</code><code># cd /mnt/lv1/</code>
<code>[root@Redhat6 lv1]</code><code># ls #可以檢視到LV檔案裡面有3個檔案</code>
<code>fstab inittab lost+found rc.sysinit</code>
<code>[root@Redhat6 lv1]</code><code># cd /backup/</code>
<code>[root@Redhat6 backup]</code><code># tar xf lv1.tar.bz2 #解壓之前備份的檔案</code>
<code>[root@Redhat6 backup]</code><code># ls</code>
<code>lv1.</code><code>tar</code><code>.bz2 mnt</code>
<code>[root@Redhat6 backup]</code><code># cd mnt/lv1/</code>
<code>[root@Redhat6 lv1]</code><code># ls #檢視到快照隻備份了之前的檔案</code>
<code>[root@Redhat6 lv1]</code><code>#</code>
本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1256180,如需轉載請自行聯系原作者