1. 程式人生 > >邏輯卷管理(LVM)

邏輯卷管理(LVM)

參考資料列表

本文將從以下幾個方面介紹LVM

  • 什麼是邏輯卷
  • 邏輯卷的結構
  • 邏輯卷的管理
  • 遷移邏輯捲到新的系統
  • 刪除邏輯卷
  • 邏輯卷快照

什麼是邏輯卷

   邏輯卷管理(LVM)指系統將物理卷管理抽象到更高的層次,常常會形成更簡單的管理模式。與物理磁碟和分割槽不同,邏輯卷展現給我們的是邏輯上的儲存結構。LVM 可以將分割槽和磁碟聚合成一個虛擬磁碟(virtual disk),從而用小的儲存空間組成一個統一的大空間。這個虛擬磁碟在 LVM 術語中稱為卷組(volume group)

   將眾多比較小的物理磁碟裝置組織起來建立一個比單個磁碟本身還要大的檔案系統,並不是LVM的唯一用途,它還可以
- 在磁碟列表中新增磁碟和分割槽,對現有的檔案系統進行擴充套件。
- 用一個 160GB 磁碟替換兩個 80GB 磁碟,而不需要讓系統離線,也不需要在磁碟之間手工轉移 。
- 當儲存空間遠大於我們所需要的空間的時候,我們可以將物理硬碟從磁碟列表中去掉,從而減少儲存空間。
- 使用快照(snapshot

)執行一致的備份(本文後面會進一步討論)

   為了理解起來更加的形象,我們來思考這樣一個問題,假設我們一共有三個物理硬碟,容量分別是200G,100G,80G,我們如何來建立一個大於300G的檔案系統呢?在沒有接觸到LVM之前,我們恐怕是將這個三個硬碟掛載到系統中,然後進行分割槽,建立檔案系統來使用。比如下圖這樣。

磁碟分割槽示意

但是這樣的分割槽模式有些時候是沒有辦法滿足我們的需求的,我們想要的是一個完整的300G的獨立檔案系統,而此時使用LVM就能夠實現這樣的設計。

物理磁碟到邏輯的對映

物理磁碟到邏輯卷的對映

如圖所示,我們從邏輯上實現了 建立了一個大於300G的檔案系統,而且在使用者看來,根本不清楚底層一共有多少個硬碟,只知道有一個檔案系統可以用來儲存資料。當然,這對使用者來說就足夠了。具體的實驗將在稍後的內容中實現。

邏輯卷的結構

LVM 的組成一共包含三種元素,(Volume,物理和邏輯卷,卷組),區段(物理和邏輯區段),裝置對映器 。 接下來,我們分別介紹這三種元素各代表什麼意思。

Linux LVM 組織為物理卷(PV)、卷組(VG)和邏輯卷(LV)。物理卷 是物理磁碟或物理磁碟分割槽(比如 /dev/sdb1 或 /dev/sdc)。卷組 是物理卷的集合。卷組 可以在邏輯上劃分成多個邏輯卷。

物理磁碟到邏輯卷的對映

物理磁碟到邏輯卷的對映

  卷組是實現將n個PV對映成m個LV的關鍵。我們可以這樣來理解。當我們將多個PV劃分到一個卷組中去了之後(也就是VG0),就可以建立多個任意容量的LV(邏輯卷),在這些邏輯卷看來,他們的底層實際上就是一個380G的空間,他們可以自由分配。如圖所示,我們在VG0上劃分了一個LV0,在LV0和FREE SPACE 看來,VG0就是一個整體,不關心VG0是由多少個PV組合而來。在實際的使用過程中,使用者就會將LV0看作一個物理磁碟分割槽來使用。
  在建立 LV 之後,可以使用任何檔案系統對它進行格式化並將它掛載在某個掛載點上,然後就可以開始使用它了。 如下圖所示,給創建出來的LV0格式化檔案系統,並將其掛載到/app 目錄下。

將LV0掛載到/app

區段

為了實現n個PV到m個LV的對映,PV和VG劃分的基本的資料塊必須要大小一致,我們就將這些基本的資料塊稱為區段。也就是物理區段(PE)和邏輯區段(LE) 。雖然是n個PV到m個LV的對映,但是PE和LE總是一對一對映的(如下圖中紅色區段與綠色區段)。
在LVM2中,預設的區段大小是4M,也就是說,在劃分LV的時候,會以4M為基本單位進行劃分,這個概念與磁碟儲存資料的塊(Block 預設4k)是類似的。在實際的使用中,最好不要修改這個預設值,因為有可能會降低LVM的效率。

物理區段到邏輯區段的對映

這裡有一點需要注意。物理區段的分配並非是連續的,也就是說,屬於LV0的邏輯區段,他們所對應的物理區段有可能來自不同的物理裝置。這也再一次證實了,卷組在對應物理捲到邏輯卷的對映上起到了關鍵性的作用。

裝置對映器

通俗的來理解的話,或許應該是這樣的。當我們在系統中建立了多個卷組(VG0,VG1…)之後,又在每個卷組上建立了多個邏輯卷(LV1,LV2…)比方說,如下所示的結構。

#採用資料夾的形式模式LVM
[root@localhost test]# tree
.
├── VG0
│   ├── LV0
│   ├── LV1
│   └── LV2
└── VG1
    ├── LV0
    └── LV1

這樣的話,我們需要對每一個邏輯捲進行有效的標識,以便我們能夠快捷的訪問,裝置對映器應運而生。
在大多數的Linux 發行版中裝置對映器會被預設安裝。在建立VG和LV的時候,如果我們不指定名字的話,裝置對映器就會預設生成名稱,並指定到物理裝置。對於前面的示例,裝置對映器會在 /dev 檔案系統中建立下面的裝置節點,裝置名稱一般為 /dev/dm-#。
/dev/mapper/VG0-LV0 ,/dev/VG0/LV0 是生成的裝置名(/dev/dm-#)相應的軟連線。

LVM生成裝置的軟連線

注意名稱的格式標準:/dev/{vg_name}/{lv_name} -> /dev/mapper/{vg_name}{lv_name}

邏輯卷的管理

對於邏輯卷的管理通常包括建立,新增,縮減和刪除。將通過接下來的實驗介紹以下邏輯卷的管理。
首先看一下我們的實驗環境 。
我們將使用sdb,sdc,sdd三個物理裝置來實現我們在前文所描述的案例。sda在本例項中將不會使用。

[root@localhost ~]#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   55G  0 part /
├─sda3   8:3    0   50G  0 part /app
├─sda4   8:4    0  512B  0 part 
└─sda5   8:5    0    2G  0 part [SWAP]
sdb      8:16   0  200G  0 disk 
├─sdb1   8:17   0  100G  0 part 
└─sdb2   8:18   0  100G  0 part 
sdc      8:32   0  100G  0 disk 
sdd      8:48   0   80G  0 disk 

建立物理卷

當物理裝置新增到系統中之後,我們可以對物理裝置進行分割槽,也可以直接拿過來使用,也就是說,我們可以將 sdb2 和sdc 、sdd 一起組合使用,組成一個邏輯卷,而不是使用sdb整個磁碟都使用。同時有一點需要注意,如果要使用分割槽來構建邏輯卷的話,在建立該分割槽的時候,分割槽的型別應該是 Linux LVM ,如下所示


   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048   209717247   104857600   8e  Linux LVM
/dev/sdb2       209717248   419430399   104856576   8e  Linux LVM

我們這裡會直接使用整個 /dev/sdb 裝置來建立邏輯卷。

[[email protected] ~]#pvcreate /dev/sd{b{1,2},c,d}
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.
[[email protected] ~]#pvs
  PV         VG Fmt  Attr PSize   PFree  
  /dev/sdb1     lvm2 ---  100.00g 100.00g
  /dev/sdb2     lvm2 ---  100.00g 100.00g
  /dev/sdc      lvm2 ---  100.00g 100.00g
  /dev/sdd      lvm2 ---   80.00g  80.00g

物理卷已經成功的建立了。使用 pvs 命令可以檢視生成的物理卷的資訊。從列表中,我們可以看到,所有的物理卷還沒有相應卷組(VG),因為我們還沒有進行劃分。使用pvdisplay 命令可以看到每個物理卷的詳細資訊。

[[email protected] ~]#pvdisplay 
  "/dev/sdd" is a new physical volume of "80.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name               
  PV Size               80.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh

  "/dev/sdb1" is a new physical volume of "100.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               100.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq

  "/dev/sdc" is a new physical volume of "100.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               100.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD

  "/dev/sdb2" is a new physical volume of "100.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               100.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S

從上面的詳細資訊中可以看到 VG Name 還沒有值, PE Size 也沒有值, 那麼接下來,我們就要建立卷組,建立了卷組之後,我們再回過頭檢視以下這些物理卷的詳細資訊,就會發生很大的變化 。

建立卷組

在建立卷組的過程中,我們可以人為地指定卷組的名稱,和物理區塊(PE)的大小。這裡我們這裡不指定。

#建立卷組
[[email protected] ~]#vgcreate VG0 /dev/sd{b{1,2},c,d}
  Volume group "VG0" successfully created
[[email protected] ~]#vgs
  VG  #PV #LV #SN Attr   VSize   VFree  
  VG0   4   0   0 wz--n- 379.98g 379.98g
[[email protected] ~]#pvs
  PV         VG  Fmt  Attr PSize   PFree  
  /dev/sdb1  VG0 lvm2 a--  100.00g 100.00g
  /dev/sdb2  VG0 lvm2 a--  100.00g 100.00g
  /dev/sdc   VG0 lvm2 a--  100.00g 100.00g
  /dev/sdd   VG0 lvm2 a--   80.00g  80.00g

建立卷組結束之後,我們就可以看到相應的物理卷已經有了所屬的卷組叫做VG0,同樣我們還是使用pvdisplay 來看一下每一個物理卷的詳細資訊。

[root@localhost ~]#pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               VG0
  PV Size               100.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               25599
  Allocated PE          0
  PV UUID               SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               VG0
  PV Size               100.00 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               25599
  Allocated PE          0
  PV UUID               jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S

  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               VG0
  PV Size               100.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               25599
  Allocated PE          0
  PV UUID               5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD

  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               VG0
  PV Size               80.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              20479
  Free PE               20479
  Allocated PE          0
  PV UUID               HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh

由上面的詳細資訊,我們發現 PE的預設大小就是4M,這也就是說,以後我們在分配磁碟大小的時候,應該以4M為最小單位進行劃分。同樣我們還能夠看到卷組名(VG Name),空閒的區塊( Free PE)。 如果想要看卷組的詳細資訊,我們使用 vgdisplay 命令來檢視卷組VG0的詳細資訊。


[root@localhost ~]#vgdisplay 
  --- Volume group ---
  VG Name               VG0                     #卷組名稱
  System ID             
  Format                lvm2                    #Format版本
  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               379.98 GiB              #卷組的大小
  PE Size               4.00 MiB                #預設區塊的大小
  Total PE              97276
  Alloc PE / Size       0 / 0   
  Free  PE / Size       97276 / 379.98 GiB
  VG UUID               rrI0HJ-JPwB-CWtU-ddM0-kvJ5-7Beo-uV5qEy

建立邏輯卷

只有了卷組還不足夠,因為從文章開頭的案例中我們可以知道,沒有邏輯卷和檔案系統,使用者並不能直接使用。接下來我們在卷組 VG0 的基礎上建立一個邏輯卷LV0。在建立邏輯卷的過程中,需要指定邏輯卷的大小。指定邏輯卷的大小有三種方式,一是指定PE的個數,二是直接指定邏輯卷的大小,三是直接使用百分比來指定,都是可以的。

[root@localhost ~]#lvcreate -n LV0 -l 50%vg VG0
[root@localhost ~]#lvcreate -n LV0 -l 100%FREE VG0
[root@localhost ~]#lvcreate -n LV0 -L 250G VG0
  Logical volume "LV0" created.

#建立成功之後系統中已經有了一個邏輯卷
[root@localhost ~]#lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0 -wi-a----- 250.00g

此時我們使用 pvdisplay命令來檢視所有的物理卷狀態的時候,我們會發現,物理卷的PE等各種資訊已經發生了變化。

[[email protected] ~]#pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sdb1
  VG Name               VG0
  PV Size               100.00 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               0                   #已經全部被分配
  Allocated PE          25599
  PV UUID               SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq

  --- Physical volume ---
  PV Name               /dev/sdb2
  VG Name               VG0
  PV Size               100.00 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               0                   #已經全部被分配
  Allocated PE          25599
  PV UUID               jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S

  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               VG0
  PV Size               100.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              25599
  Free PE               12797               #還有一部分沒有被使用
  Allocated PE          12802   
  PV UUID               5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD

  --- Physical volume ---
  PV Name               /dev/sdd
  VG Name               VG0
  PV Size               80.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              20479
  Free PE               20479               #還沒有被使用
  Allocated PE          0
  PV UUID               HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh

從上面的資訊中,我們看到物理捲髮生了變化,那麼相應的卷組呢?

[root@localhost ~]#vgdisplay 
  --- Volume group ---
  VG Name               VG0
  System ID             
  Format                lvm2
  Metadata Areas        4
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                1
  Open LV               0
  Max PV                0
  Cur PV                4
  Act PV                4
  VG Size               379.98 GiB
  PE Size               4.00 MiB
  Total PE              97276
  Alloc PE / Size       64000 / 250.00 GiB          #已經被佔用的PE
  Free  PE / Size       33276 / 129.98 GiB          #還剩下沒有被使用的PE
  VG UUID               rrI0HJ-JPwB-CWtU-ddM0-kvJ5-7Beo-uV5qEy

同樣,因為我們已經建立了邏輯卷,我們可以使用lvdisplay 來檢視邏輯卷的詳細資訊。

[[email protected] ~]#lvdisplay 
  --- Logical volume ---
  LV Path                /dev/VG0/LV0   #已經生成了裝置名稱
  LV Name                LV0
  VG Name                VG0
  LV UUID                D3dpT9-EYFP-ieGm-DiYm-Ey4P-O5JM-EMtrOh
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-08-15 21:51:32 +0800
  LV Status              available
  # open                 0
  LV Size                250.00 GiB     #邏輯卷的大小
  Current LE             64000          #當前一共有多少LE 邏輯區塊
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

給邏輯卷建立檔案系統

邏輯卷建立成功之後,就可以將其作為一個分割槽來使用了。就像物理分割槽一樣,我們首先對邏輯卷建立檔案系統。

#CentOS 7中預設的檔案系統是xfs

[root@localhost ~]#mkfs.xfs /dev/VG0/LV0 
meta-data=/dev/VG0/LV0           isize=512    agcount=4, agsize=16384000 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=65536000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=32000, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0  

# 使用blkid 可以檢視檔案系統是否已經成功建立  
[root@localhost ~]#blkid
/dev/sdb1: UUID="SQnDDE-U3BB-X9TY-07ix-Hn5x-EBdj-RgAWDq" TYPE="LVM2_member" 
/dev/sdb2: UUID="jnHzv4-PEYl-qOvO-n5Ee-Nt8r-Wbkg-5GN03S" TYPE="LVM2_member" 
/dev/sdc: UUID="5l0Nf9-snrM-oG0j-Si4y-s3Tb-qRw8-kod0xD" TYPE="LVM2_member" 
/dev/sdd: UUID="HJE2wS-rX0U-FUcq-32TI-YUjv-k0jO-qDp0Rh" TYPE="LVM2_member" 
/dev/mapper/VG0-LV0: UUID="56cde737-2618-4ff5-9298-1cb15a80f04e" TYPE="xfs"

建立了檔案系統之後,將LV0掛載到 /app 目錄下,就可以正常訪問 LV0了,當然掛載的方式有臨時掛載和永久掛載兩種方式,永久掛載就是將掛載選項寫到 /etc/fstab 檔案中,我們這裡不再詳細介紹。

擴充套件邏輯卷

現在我們假設LV0這個邏輯卷的空間已經使用完了,需要進行擴充套件,我們在之前的資訊中已經看到,卷組VG0中還有120多G的空間沒有使用,我們就從這段未使用的空間中為LV0進行擴充套件 。指定需要擴充套件的空間的大小時,與建立時的使用方法是一致的,可以有多種靈活的方式。


[[email protected] ~]#lvextend -L +50G /dev/VG0/LV0 
  Size of logical volume VG0/LV0 changed from 250.00 GiB (64000 extents) to 300.00 GiB (76800 extents).
  Logical volume VG0/LV0 successfully resized.
[[email protected] ~]#lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0 -wi-a----- 300.00g 

我們看到LV0的大小已經成功的發生了變化,然後我們再檢視一下所有塊裝置的使用情況 使用 df -h 命令來檢視

[root@localhost ~]#df -h
Filesystem           Size  Used Avail Use% Mounted on
    ......................

/dev/mapper/VG0-LV0  250G   33M  250G   1% /mnt/lv0   # LV0的大小沒有發生變化

此時出現了一個狀況,LV0的容量明明已經發生了變化,但是使用 df 命令檢視塊裝置使用情況的時候,LV0的大小卻沒有發生變化。這是因為,我們剛剛追加的那部分空間沒有檔案系統,所以檔案系統的容量沒有發生變化。因此我們需要給剛剛追加的那部分邏輯卷同步檔案系統 。


#不同的檔案系統  同步的命令是不一樣的。其他檔案系統的命令是resize2fs
[root@localhost ~]#xfs_growfs /mnt/lv0
    .................

[root@localhost ~]#df -h
Filesystem           Size  Used Avail Use% Mounted on
    ..........

/dev/mapper/VG0-LV0  300G   33M  300G   1% /mnt/lv0   #邏輯卷的大小已經發生了變化  

從整個擴充套件的過程中,我們看出,只要LV0的空間不足,我們就可以很靈活的給LV0擴充套件儲存空間。如果VG0的空間不足夠使用了,那我們就可以重新加入一個物理磁碟,並按照此過程將物理卷新增到VG0中,只要使用vgextend命令就可以。

縮減邏輯卷

對於XFS檔案系統的邏輯卷,只能進行擴充套件,不能進行縮減,這一點是很遺憾的。同時縮減邏輯卷也是有很大風險的,對於ext型別的檔案系統來說,如果要縮減邏輯卷,就需要將裝置取消掛載,這點會影響到使用者的使用,同時如果邏輯捲上已經存在了大量的資料,進行縮減的過程有可能對資料造成損壞,最好事前有所備份,所以在實際生產中,縮減邏輯卷的操作應該謹慎為之。

我們首先使用一下命令重新建立一個ext4的邏輯卷 LV1,用來實現我們縮減邏輯卷的實驗。



#建立邏輯卷
[root@localhost ~]#lvcreate -n LV1 -l 100%FREE VG0  
#格式化檔案系統
[root@localhost ~]#mkfs.ext4 /dev/VG0/LV1 
#編輯 /etc/fatab 檔案 並掛載該LV1
[root@localhost ~]#mount -a  

#此時系統中結構如圖所示 
[root@localhost ~]#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   55G  0 part /
├─sda3        8:3    0   50G  0 part /app
├─sda4        8:4    0  512B  0 part 
└─sda5        8:5    0    2G  0 part [SWAP]
sdb           8:16   0  200G  0 disk 
├─sdb1        8:17   0  100G  0 part 
│ └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
└─sdb2        8:18   0  100G  0 part 
  └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
sdc           8:32   0  100G  0 disk 
└─VG0-LV0   253:0    0  300G  0 lvm  /mnt/lv0
sdd           8:48   0   80G  0 disk 
├─VG0-LV0   253:0    0  300G  0 lvm  /mnt/lv0
└─VG0-LV1   253:1    0   80G  0 lvm  /mnt/lv1

卷組VG0的所有空間都被使用了。接下來我們就可以進行縮減邏輯卷的實驗。

取消邏輯卷的掛載

我們之前就已經說過,邏輯卷在掛載的時候是不能進行縮減的。因此我們先取消該邏輯卷的掛載。

[root@localhost ~]#umount /mnt/lv1  

縮減邏輯卷的空間

系統會提示 應該先檢查檔案系統,所以我們就先檢查一下。

#檢查檔案系統 -f 表示強制性檢查
[root@localhost ~]#e2fsck -f /dev/VG0/LV1

# 直接將檔案系統的大小縮減到 50G
[root@localhost ~]#resize2fs /dev/VG0/LV1 50G

# 將邏輯卷的空間縮減到50G
[root@localhost ~]#lvreduce -L 50G /dev/VG0/LV1
  WARNING: Reducing active logical volume to 50.00 GiB.
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce VG0/LV1? [y/n]: y  
  Size of logical volume VG0/LV1 changed from 79.98 GiB (20476 extents) to 50.00 GiB (12800 extents).
  Logical volume VG0/LV1 successfully resized.

在這一步中,一共有三個步驟。準備步驟:強制性檢查檔案系統。然後:先縮減檔案系統大小。接著:縮減邏輯卷。 這三步,缺一不可。

重新掛載

,邏輯捲縮減之後,將邏輯卷重新掛載到之前的目錄中就可以重新訪問邏輯捲了。 重新檢視塊裝置的使用情況,就可以發現邏輯捲髮生了變化

[root@localhost ~]#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   55G  0 part /
├─sda3        8:3    0   50G  0 part /app
├─sda4        8:4    0  512B  0 part 
└─sda5        8:5    0    2G  0 part [SWAP]
sdb           8:16   0  200G  0 disk 
├─sdb1        8:17   0  100G  0 part 
│ └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
└─sdb2        8:18   0  100G  0 part 
  └─VG0-LV0 253:0    0  300G  0 lvm  /mnt/lv0
sdc           8:32   0  100G  0 disk 
└─VG0-LV0   253:0    0  300G  0 lvm  /mnt/lv0
sdd           8:48   0   80G  0 disk 
├─VG0-LV0   253:0    0  300G  0 lvm  /mnt/lv0
└─VG0-LV1   253:1    0   50G  0 lvm  /mnt/lv1

遷移邏輯捲到新的系統

我首先在另外一個虛擬機器中建立一個邏輯卷,並在裡面存入相應的資料,然後來模擬我們的遷移邏輯卷的實驗。在另外一個虛擬機器中建立LV0邏輯卷的操作,如下圖所示。

動態演示建立邏輯卷

此時該系統中塊裝置列表如下所示。 LV0。就是我們剛剛建立的邏輯卷。


[root@centos6 lv0]#lsblk
NAME             MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0               11:0    1  3.7G  0 rom  /media/CentOS_6.9_Final
sda                8:0    0  200G  0 disk 
├─sda1             8:1    0 1000M  0 part /boot
├─sda2             8:2    0 53.7G  0 part /
├─sda3             8:3    0 48.8G  0 part /app
├─sda4             8:4    0    1K  0 part 
└─sda5             8:5    0    2G  0 part [SWAP]
sdb                8:16   0   20G  0 disk 
└─VG0-LV0 (dm-0) 253:0    0   10G  0 lvm  /mnt/lv0

現在我們要將剛剛建立的這個邏輯卷遷移到一個新的系統中,而且我們要保證,資料不能丟失。同時,我們考慮一下,萬一我們要遷移到的新的檔案系統中有跟我們新建立的邏輯卷同名的邏輯卷該如何處理,比方說像,下面這樣。 注意,兩個系統不一樣,但是邏輯卷的名字一致。


#CentOS6 中的邏輯卷,即將被遷移到CentOS7中
[root@centos6 ~]#lvs
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0  -wi-ao---- 10.00g  

#CentOS 7 中的邏輯卷,即將遷移到這裡。
[root@localhost ~]#lvs
  LV   VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  LV0  VG0 -wi-ao---- 300.00g                                                    
  LV1  VG0 -wi-ao----  50.00g    

總結一下遷移過程中的重要步驟,一共有如下幾步。
在源主機上

  • 將舊的邏輯卷解除掛載 umount /mnt/lv0
  • 修改舊的卷組名稱 vgrename VG0 NEWVG0
  • 修改舊的邏輯卷的名稱 lvrename /dev/NEWVG0/LV0 NEWLV0
  • 將舊的卷組設定為非活動狀態 vgchange -an NEWVG0
  • 將舊的卷組匯出 vgexport NEWVG0
  • 將硬碟拆下 安裝到新的主機上

相關的操作如下所示,操作成功之後,將硬碟檔案拆下,接到新的主機上。


[[email protected] ~]#umount /mnt/lv0 

[[email protected] ~]#vgrename VG0 NEWVG0
  Volume group "VG0" successfully renamed to "NEWVG0"

[[email protected] ~]#lvrename /dev/NEWVG0/LV0 NEWLV0
  Renamed "LV0" to "NEWLV0" in volume group "NEWVG0"

[[email protected] ~]#vgchange -an NEWVG0 
  0 logical volume(s) in volume group "NEWVG0" now active

[[email protected] ~]#vgexport NEWVG0 
  Volume group "NEWVG0" successfully exported

在目標主機上

  • 在新的系統中安裝硬碟,並將其匯入檔案系統。 vgimport NEWVG0
  • 啟用新的卷組 vgchange -ay NEWVG0
  • 重新掛載 mount /dev/NEWVG0/NEWLV0 /mnt/newlv0

在加裝了新的硬碟之後,我們