天天看點

LVM邏輯卷管理

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---&gt;然後使用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---&gt;将此PV的資料轉移至其它PV----&gt;從卷組中将此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

  先确定要擴充多大--&gt;确定目前VG有足夠的空閑空間--&gt;擴充(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

先解除安裝---&gt;然後減小邏輯邊界----&gt;最後減小實體邊界---&gt;在檢測檔案系統   ====謹慎用===

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将不會被儲存。

步驟:

分區---&gt;建立PV---&gt;建立VG---&gt;建立LV---&gt;格式化LV為ext4---&gt;挂載---&gt;寫入資料---&gt;需要備份(建立快照)---&gt;建立快照卷---&gt;再次繼續寫入資料----&gt;挂載快照卷---&gt;備份之前的資料到快照卷裡面---&gt;解除安裝快照---&gt;删除快照卷

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,如需轉載請自行聯系原作者

繼續閱讀