首頁 > 軟體

Linux磁碟管理LVM使用手冊

2020-06-16 16:58:40

一、LVM簡介

LVM是 Logical Volume Manager(邏輯卷管理)的簡寫,它是Linux環境下對磁碟分割區進行管理的一種機制.Linux使用者安裝Linux作業系統時遇到的一個常見的難以決定的問題就是如何正確地評估各分割區大小,以分配合適的硬碟空間。普通的磁碟分割區管理方式在邏輯分割區劃分好之後就無法改變其大小,當一個邏輯分割區存放不下某個檔案時,這個檔案因為受上層檔案系統的限制,也不能跨越多個分割區來存放,所以也不能同時放到別的磁碟上。而遇到出現某個分割區空間耗盡時,解決的方法通常是使用符號連結,或者使用調整分割區大小的工具,但這只是暫時解決辦法,沒有從根本上解決問題。隨著Linux的邏輯卷管理功能的出現,這些問題都迎刃而解,使用者在無需停機的情況下可以方便地調整各個分割區大小。

二、基本術語

  • 物理卷(Physical Volume,PV):指系統的物理儲存裝置:磁碟,如:/dev/hda、/dev/sda等,是儲存系統最底層的儲存單元;
  • 卷組(Volume Group,VG):類似於非LVM系統中的物理磁碟,其由一個或多個物理卷PV組成。可以在捲組上建立一個或多個LV(邏輯卷);
  • 邏輯卷(Logical Volume,LV):類似於非LVM系統中的磁碟分割區,邏輯卷建立在捲組VG之上。在邏輯捲LV之上可以建立檔案系統(比如/home或者/usr等)。

從上面的定義我們可以了解到:邏輯卷(LV)是建立在卷組(VG)上的,而捲組(VG)則是建立在物理卷(PV)上的。
從中還可以作更深一層的理解:LVM的可伸縮性無非是建立在卷組(VG)和邏輯卷(LV)的可伸縮性的基礎上的:
- 只要存在尚未使用的磁碟或者分割區,就可以動態的擴充套件卷組(VG)的大小;
- 只要捲組(VG)中存在尚未分配的空間,就可以動態的擴充套件邏輯卷的大小。
從以上二點出發就可以達到動態調整分割區大小的目的。

因為本文中很多的命令都是以上述術語的縮寫開頭,因此了解各個縮寫對命令的記憶和使用是非常有幫助的。

三、基本命令

範例中的 vg1lv1 分別為物理卷組名邏輯卷名,可自行替換成任意名稱。

分類命令說明範例
PV pvcreate 建立物理卷 pvcreate /dev/sdb1
PV pvdisplay 顯示已建立的物理卷的詳細資訊  
PV pvs 顯示已建立的物理卷的匯總資訊  
PV pvremove 刪除物理卷 pvremove /dev/sdb1
VG vgcreate 建立卷組 pvcreate vg1 /dev/sdb1 /dev/sdb2 …
VG vgdisplay 顯示已建立的卷組的詳細資訊  
VG vgs 顯示已建立的卷組的匯總資訊  
VG vgextend 擴充套件卷組 vgextend vg1 /dev/sdb3 …
VG vgreduce 收縮捲組 vgreduce vg1 /dev/sdb5
VG vgremove 刪除捲組 vgremove vg1
LV lvcreate 建立邏輯卷 lvcreate -L 1000M -n lv1 vg1
LV lvdisplay 顯示已建立的邏輯卷的詳細資訊  
LV lvs 顯示已建立的邏輯卷的匯總資訊  
LV lvresize 重設邏輯卷大小 lvresize -L 1000M /dev/vg1/lv1
LV resize2fs 更新邏輯卷資訊(ext4) resize2fs /dev/vg1/lv1
LV lvremove 刪除邏輯卷 lvremove /dev/vg1/lv1
LV xfs_growfs 更新邏輯卷資訊(xfs) xfs_growfs /dev/vg1/lv1
LV e2fsck 檢查邏輯卷錯誤(ext4) e2fsck -f /dev/vg1/lv1

四、實驗的操作環境

  • 虛擬機器:VirtualBox 5.6.2
  • 作業系統:CentOS 7.4
  • 磁碟:二塊:一塊安裝作業系統(/dev/sda),容量為20GB; 另一塊用於進行lvm分割區操作(/dev/sdb),容量為10GB
  • 因為CentOS 7.4預設沒有安裝支援上述命令的軟體包,因此需要提前安裝lvm2軟體包,具體命令為:yum install -y lvm2

五、建立LVM

在這裡我帶著大家從一塊全新的磁碟開始,一步步建立LVM分割區。

流程

先介紹一下流程,以便大家從總體上對建立LVM有一個了解。
1. 對新磁碟進行分割區操作(fdisk);
2. 逐一變更分割區型別為Linux LVM(Hex程式碼為:8e);
3. 針對每個分割區建立物理卷(pvcreate);
4. 建立卷組(vgcreate);
5. 建立邏輯卷(lvcreate);
6. 格式化(mkfs.ext4/mkfs.xfs),並掛載(mount)。

(一)、磁碟分割區及分割區型別更改

使用命令fdisk對需要進行LVM操作的磁碟/dev/sdb進行分割區

fdisk /dev/sdb
  • 1

輸入n進行分割區,一共分五個分割區,前三個是主分割區,後二個分割區在擴充套件分割區裡,每個分割區2GB。以下只列出第一個分割區的操作:

命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分割區號 (2-4,預設 2):
起始 磁區 (4196352-20971519,預設為 4196352):
將使用預設值 4196352
Last 磁區, +磁區 or +size{K,M,G} (4196352-20971519,預設為 20971519):+2G
分割區 2 已設定為 Linux 型別,大小設為 2 GiB

輸入p列印分割區完成後的情況:

命令(輸入 m 獲取幫助):p

磁碟 /dev/sdb:10.7 GB, 10737418240 位元組,20971520 個磁區
Units = 磁區 of 1 * 512 = 512 bytes
磁區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標簽型別:dos
磁碟識別符號:0x231b271d

   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   83  Linux
/dev/sdb2         4196352     8390655     2097152   83  Linux
/dev/sdb3         8390656    12584959     2097152   83  Linux
/dev/sdb4        12584960    20971519     4193280    5  Extended
/dev/sdb5        12587008    16781311     2097152   83  Linux
/dev/sdb6        16783360    20971519     2094080   83  Linux

分割區完成後除了擴充套件分割區(上圖的Extended)外,需要變更所有分割區的磁碟型別:原型別為Linux,變更後為Linux LVM。這裡只列出針對第一個分割區的操作:

命令(輸入 m 獲取幫助):t
分割區號 (1-6,預設 6):1
Hex 程式碼(輸入 L 列出所有程式碼):8e
已將分割區“Linux”的型別更改為“Linux LVM”

輸入p列印分割區型別變更後的情況:

命令(輸入 m 獲取幫助):p

磁碟 /dev/sdb:10.7 GB, 10737418240 位元組,20971520 個磁區
Units = 磁區 of 1 * 512 = 512 bytes
磁區大小(邏輯/物理):512 位元組 / 512 位元組
I/O 大小(最小/最佳):512 位元組 / 512 位元組
磁碟標簽型別:dos
磁碟識別符號:0x231b271d

   裝置 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048     4196351     2097152   8e  Linux LVM
/dev/sdb2         4196352     8390655     2097152   8e  Linux LVM
/dev/sdb3         8390656    12584959     2097152   8e  Linux LVM
/dev/sdb4        12584960    20971519     4193280    5  Extended
/dev/sdb5        12587008    16781311     2097152   8e  Linux LVM
/dev/sdb6        16783360    20971519     2094080   8e  Linux LVM

以上操作完成後,輸入w將操作寫入磁碟,完成分割區:

命令(輸入 m 獲取幫助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁碟。
(二)、建立物理卷

針對新建立的分割區建立物理卷,這是建立LVM的第一步。使用如下命令對每一個分割區進行操作:

pvcreate /dev/sdb1
  • 1

其他分割區的操作類似,這裡就不逐一介紹了。
建立完物理卷後,有二種檢視的方法:

1、詳細資訊:pvdisplay,這裡只列出第一個分割區的資訊:

[root@localhost ~]# pvdisplay
  "/dev/sdb1" is a new physical volume of "2.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name
  PV Size               2.00 GiB
  Allocatable           NO
  PE Size               0
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               SCIOKN-i2fO-PylF-CJGI-T8Yw-e2dH-BYX0xq

2、匯總資訊:pvs

[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize  PFree
  /dev/sdb1     lvm2 ---   2.00g  2.00g
  /dev/sdb2     lvm2 ---   2.00g  2.00g
  /dev/sdb3     lvm2 ---   2.00g  2.00g
  /dev/sdb5     lvm2 ---   2.00g  2.00g
  /dev/sdb6     lvm2 ---  <2.00g <2.00g
(三)、建立卷組

建立物理捲完成後,就需要將物理捲加入到特定的捲組。
下面的操作將前二個分割區/dev/sdb1/dev/sdb2加入到名稱為gv1的卷組中:

[root@localhost ~]# vgcreate vg1 /dev/sdb1 /dev/sdb2
  Volume group "vg1" successfully created
  • 1
  • 2

檢視卷組也有二種方法進行檢視:詳細資訊和彙總資訊:

1、詳細資訊:

[root@localhost ~]# vgdisplay
  --- Volume group ---
  VG Name               vg1
  System ID
  Format                lvm2
  Metadata Areas        2
  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                2
  Act PV                2
  VG Size               3.99 GiB
  PE Size               4.00 MiB
  Total PE              1022
  Alloc PE / Size       0 / 0
  Free  PE / Size       1022 / 3.99 GiB
  VG UUID               N2mK2P-tvev-bex2-LX4C-1DIs-nFci-Ay5e8H

2、匯總資訊:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   2   0   0 wz--n- 3.99g 3.99g
(四)、建立邏輯卷

建立捲組完成後,我們就可以在捲組上建立邏輯卷。使用下面的命令,我們在卷組vg1上建立一個名稱為lv1、大小為1GB的邏輯卷:

[root@localhost ~]# lvcreate -L 1G -n lv1 vg1
  Logical volume "lv1" created.

檢視邏輯卷也有二種方法進行檢視:詳細資訊和彙總資訊:

1、詳細資訊:

[root@localhost ~]# lvdisplay
  --- Logical volume ---
  LV Path                /dev/vg1/lv1
  LV Name                lv1
  VG Name                vg1
  LV UUID                LaLTid-eLAG-DNlq-h4fT-Xiia-PTDG-HnXL3i
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-11-08 09:27:21 +0800
  LV Status              available
  # open                 0
  LV Size                1.00 GiB
  Current LE             256
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

2、匯總資訊:

[root@localhost ~]# lvs
  LV   VG  Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1  vg1 -wi-a----- 1.00g
(五)、格式化邏輯卷並掛載

使用下面的命令,對邏輯卷lv1進行格式化:

[root@localhost ~]# mkfs.ext4 /dev/vg1/lv1

格式化完成後,將該邏輯捲掛載到目錄/mnt上:

[root@localhost ~]# mount /dev/vg1/lv1 /mnt

檢視掛載後的情況:

[root@localhost ~]# df -h
檔案系統             容量  已用  可用 已用% 掛載點
/dev/sda2             17G  1.5G   15G   10% /
devtmpfs             488M     0  488M    0% /dev
tmpfs                497M     0  497M    0% /dev/shm
tmpfs                497M  6.6M  490M    2% /run
tmpfs                497M     0  497M    0% /sys/fs/cgroup
/dev/sda1            976M  115M  795M   13% /boot
tmpfs                100M     0  100M    0% /run/user/0
/dev/mapper/vg1-lv1  976M  2.6M  907M    1% /mnt
(六)、設定開機自動掛載分割區

1、檢視邏輯卷的UUID:

[root@localhost ~]# blkid
/dev/sda1: UUID="ee8a3a12-cb3e-4890-b255-4b706a718600" TYPE="ext4"
/dev/sda2: UUID="5863f890-3eb8-41a5-8239-4f41f48299bd" TYPE="ext4"
/dev/sda3: UUID="f7c02dd9-73e9-4a26-8da7-a2ca29f58747" TYPE="swap"
/dev/sdb1: UUID="2l1Llw-yFjj-YwbF-TtiN-P0XI-i7W8-9Lq4CF" TYPE="LVM2_member"
/dev/sdb2: UUID="h3uEZx-gw1W-1PMM-PPVT-dAuQ-zf1i-3RZThD" TYPE="LVM2_member"
/dev/sdb3: UUID="aFBSn0-0hwb-Mklg-vCKU-nhmF-lk1k-0uP9Ns" TYPE="LVM2_member"
/dev/sdb5: UUID="5kT4gk-6TRC-2jCj-Sbb5-HAeo-P0CE-cJZzm8" TYPE="LVM2_member"
/dev/sdb6: UUID="57LR2H-Kaua-vY0v-QgbQ-9Eej-qHJe-zXsVvf" TYPE="LVM2_member"
/dev/mapper/vg1-lv1: UUID="11262806-d796-4f49-8f08-897181e8ec33" TYPE="ext4"

最後一行就是邏輯卷的資訊,把該行的UUID複製出來,不含引號。

2、編輯fstab:
在最後新增一行,輸入如下內容:

UUID=11262806-d796-4f49-8f08-897181e8ec33 /mnt                    ext4    defaults        0 0

然後儲存退出(:wq),重新啟動後檢視結果,如果能正常掛載就沒有問題了。

以上便完成的了LVM的建立和掛載的全部流程。

六、卷組擴容

我們上一節建立LVM中建立了五個分割區,但只使得了其中二個分割區,在這一節中,我們要把剩餘的三個分割區加入到卷組vg1中,對其進行擴容。下面的流程只針對新加入的磁碟或者分割區,因此這裡對流程1-3步的操作就不再做介紹了,具體的操作方法可參照建立LVM

流程
  1. 建立新的磁碟分割區(fdisk);
  2. 變更分割區型別為Linux LVM(Hex程式碼為:8e);
  3. 建立物理卷(pvcreate);
  4. 擴充套件卷組(vgextend);
擴充套件卷組

使用如下命令將剩餘的三個分割區加入到卷組vg1

[root@localhost ~]# vgextend vg1 /dev/sdb3 /dev/sdb5 /dev/sdb6
  Volume group "vg1" successfully extended

檢視擴充套件後的捲組:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   5   1   0 wz--n- 9.98g 8.98g

已經完了卷組的擴容。

七、卷組縮容

如果想要對卷組縮容,實際上就是要把加入的卷組的物理卷從卷組中移除。
這時需要注意的是:如果要移除的物理卷,已經被使用的話,移除操作可能會對檔案系統造成操作。因此移除操作應針對未被使用的物理卷。

(一)、確認物理卷使用情況
[root@localhost ~]# pvs
  PV         VG  Fmt  Attr PSize  PFree
  /dev/sdb1  vg1 lvm2 a--  <2.00g     0
  /dev/sdb2  vg1 lvm2 a--  <2.00g     0
  /dev/sdb3  vg1 lvm2 a--  <2.00g <1.99g
  /dev/sdb5  vg1 lvm2 a--  <2.00g <2.00g
  /dev/sdb6  vg1 lvm2 a--  <2.00g <2.00g

只有PFree等於PSize,也就是說沒有被使用的物理卷,還能被列入考慮範圍。根據上面命令的執行結果,只有/dev/sdb5/dev/sdb6二個可以被移除。
檢視卷組的使用情況:

[root@localhost ~]# vgs
  VG  #PV #LV #SN Attr   VSize VFree
  vg1   5   0   0 wz--n- 5.99g 9.98g
(二)、捲組縮容


[root@localhost ~]# vgreduce vg1 /dev/sdb5 /dev/sdb6
Removed "/dev/sdb5" from volume group "vg1"
Removed "/dev/sdb6" from volume group "vg1"

檢視結果:

[root@localhost ~]# vgs
VG #PV #LV #SN Attr VSize VFree
vg1 3 1 0 wz--n- <5.99g <1.99g

可以看到VFree的容量已經減少了,到此完成了捲組縮容

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-12/149610p2.htm


IT145.com E-mail:sddin#qq.com