LVM詳解


LVM相關概念和機制

LVM(Logical Volume Manager)可以讓分區變得彈性,可以隨時隨地的擴大和縮小分區大小,前提是該分區是LVM格式的。

lvm需要使用的軟件包為lvm2,一般在CentOS發行版中都已經預安裝了。

  • PV(Physical Volume)即物理卷

  硬盤分區后(還未格式化為文件系統)使用pvcreate命令可以將分區創建為pv,要求分區的system ID為8e,即為LVM格式的系統標識符。

  • VG(Volume Group)即卷組

將多個PV組合起來,使用vgcreate命令創建成卷組,這樣卷組包含了多個PV就比較大了,相當於重新整合了多個分區后得到的磁盤。雖然VG是整合多個PV的,但是創建VG時會將VG所有的空間根據指定的PE大小划分為多個PE,在LVM模式下的存儲都以PE為單元,類似於文件系統的Block。

  • PE(Physical Extend)

PE是VG中的存儲單元。實際存儲的數據都是存儲在這里面的。

  • LV(Logical Volume)

VG相當於整合過的硬盤,那么LV就相當於分區,只不過該分區是通過VG來划分的。VG中有很多PE單元,可以指定將多少個PE划分給一個LV,也可以直接指定大小(如多少兆)來划分。划分為LV之后就相當於划分了分區,只需再對LV進行格式化即可變成普通的文件系統。

通俗地講,非LVM管理的分區步驟是將硬盤分區,然后將分區格式化為文件系統。而使用LVM,則是在硬盤分區為特定的LVM標識符的分區后將其轉變為LVM可管理的PV,其實PV仍然類似於分區,然后將幾個PV整合為類似於磁盤的VG,最后划分VG為LV,此時LV就成了LVM可管理的分區,只需再對其格式化即可成為文件系統。

  • LE(logical extent)

PE是物理存儲單元,而LE則是邏輯存儲單元,也即為lv中的邏輯存儲單元,和pe的大小是一樣的。從vg中划分lv,實際上是從vg中划分vg中的pe,只不過划分lv后它不再稱為pe,而是成為le。

LVM之所以能夠伸縮容量,其實現的方法就是將LV里空閑的PE移出,或向LV中添加空閑的PE。

LVM的寫入機制

LV是從VG中划分出來的,LV中的PE很可能來自於多個PV。在向LV存儲數據時,有多種存儲機制,其中兩種是:

  • 線性模式(linear):先寫完來自於同一個PV的PE,再寫來自於下一個PV的PE。
  • 條帶模式(striped):一份數據拆分成多份,分別寫入該LV對應的每個PV中,所以讀寫性能較好,類似於RAID 0。

盡管striped讀寫性能較好也不建議使用該模式,因為lvm的着重點在於彈性容量擴展而非性能,要實現性能應該使用RAID來實現,而且使用striped模式時要進行容量的擴展和收縮將比較麻煩。默認的是使用線性模式。

 LVM實現圖解

LVM常用命令匯總

任務

PV階段

VG階段

LV階段

查找(scan)

pvscan

vgscan

lvscan

新建(create)

pvcreate

vgcreate

lvcreate

顯示(display)

pvdisplay

vgdisplay

lvdisplay

增加(extend)

 

vgextend

lvextend(lvresize)

減少(reduce)

 

vgreduce

lvreduce(lvresize)

刪除(remove)

pvremove

vgremove

lvremove

改變容量(resize)

 

 

lvresize

改變屬性(attribute)

pvchange

vgchange

lvchange

LVM的實現

1、准備物理磁盤。

[root@localhost ~]# fdisk -l

磁盤 /dev/sda:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x0005b35c

   設備 Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      616447      307200   83  Linux
/dev/sda2          616448    41943039    20663296   8e  Linux LVM

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節


磁盤 /dev/sdc:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節


磁盤 /dev/sdd:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節


磁盤 /dev/mapper/cl-root:20.1 GB, 20107493376 字節,39272448 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節


磁盤 /dev/mapper/cl-swap:1048 MB, 1048576000 字節,2048000 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節

我們從空的硬盤sdb上創建兩個分區sdb1 5G,sdb2 5G為接下來做LVM做准備,注意的是我們在創建分區是需要設定分區的類型Linux LVM的分區類型為8e,並且這些分區要被內核識別,通過cat /proc/partions進行查看,若沒有顯示,則需要讓內核重新進行探測

[root@localhost ~]# fdisk /dev/sdb
歡迎使用 fdisk (util-linux 2.23.2)。

更改將停留在內存中,直到您決定將更改寫入磁盤。
使用寫入命令前請三思。

Device does not contain a recognized partition table
使用磁盤標識符 0x4822aff9 創建新的 DOS 磁盤標簽。

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

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System

命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分區號 (1-4,默認 1):1
起始 扇區 (2048-41943039,默認為 2048):
將使用默認值 2048
Last 扇區, +扇區 or +size{K,M,G} (2048-41943039,默認為 41943039):+5G
分區 1 已設置為 Linux 類型,大小設為 5 GiB

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

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux

命令(輸入 m 獲取幫助):t
已選擇分區 1
Hex 代碼(輸入 L 列出所有代碼):8e
已將分區“Linux”的類型更改為“Linux LVM”

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

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
命令(輸入 m 獲取幫助):n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
分區號 (2-4,默認 2):2
起始 扇區 (10487808-41943039,默認為 10487808):
將使用默認值 10487808
Last 扇區, +扇區 or +size{K,M,G} (10487808-41943039,默認為 41943039):+5G
分區 2 已設置為 Linux 類型,大小設為 5 GiB

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

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   83  Linux

命令(輸入 m 獲取幫助):t
分區號 (1,2,默認 2):2
Hex 代碼(輸入 L 列出所有代碼):8e
已將分區“Linux”的類型更改為“Linux LVM”

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

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   8e  Linux LVM

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

Calling ioctl() to re-read partition table.
正在同步磁盤。

[root@localhost ~]# fdisk -l /dev/sdb

磁盤 /dev/sdb:21.5 GB, 21474836480 字節,41943040 個扇區
Units = 扇區 of 1 * 512 = 512 bytes
扇區大小(邏輯/物理):512 字節 / 512 字節
I/O 大小(最小/最佳):512 字節 / 512 字節
磁盤標簽類型:dos
磁盤標識符:0x4822aff9

   設備 Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   8e  Linux LVM
/dev/sdb2        10487808    20973567     5242880   8e  Linux LVM
[root@localhost ~]# cat /proc/pa
pagetypeinfo  partitions    
[root@localhost ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   20971520 sda
   8        1     307200 sda1
   8        2   20663296 sda2
   8       16   20971520 sdb
   8       17    5242880 sdb1
   8       18    5242880 sdb2
   8       32   20971520 sdc
   8       48   20971520 sdd
  11        0    4277248 sr0
 253        0   19636224 dm-0
 253        1    1024000 dm-1

創建物理卷

將新創建的兩個分區/dev/sdb1 /dev/sdb2創建成物理卷:所用的命令為pvcreate /dev/adb{1,2} 當然也可以分開進行設定

[root@localhost ~]# pvcreate /dev/sdb1 /dev/sdb2
  Physical volume "/dev/sdb1" successfully created.
  Physical volume "/dev/sdb2" successfully created.
[root@localhost ~]# pvs
  PV         VG Fmt  Attr PSize  PFree 
  /dev/sda2  cl lvm2 a--  19.70g     0 
  /dev/sdb1     lvm2 ---   5.00g  5.00g
  /dev/sdb2     lvm2 ---   5.00g  5.00g
  /dev/sdc      lvm2 ---  20.00g 20.00g
  /dev/sdd      lvm2 ---  20.00g 20.00g

通過pvs 和pvdisplay可以查看物理卷的信息,后面也可以指定特定的物理磁盤,查看某一個物理卷的信息

[root@localhost ~]# pvdisplay 
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               cl
  PV Size               19.71 GiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              5044
  Free PE               0
  Allocated PE          5044
  PV UUID               uTbh7P-pmtL-KRqx-uAys-fxUA-PdUa-LIpvOX
   
  "/dev/sdb1" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb1
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               UFLcKK-XrDv-1wZi-FYIL-FDSW-Bsn0-Xy1Era
   
  "/dev/sdc" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               gHJF8r-cqBO-EV3L-yxD9-3CaA-K3OR-jcFDtU
   
  "/dev/sdb2" is a new physical volume of "5.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdb2
  VG Name               
  PV Size               5.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               9Y3f1L-3M35-lAHU-27xd-XpvI-ptOT-bRekUW
   
  "/dev/sdd" is a new physical volume of "20.00 GiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdd
  VG Name               
  PV Size               20.00 GiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               IKH97P-igyp-aaC7-bw2h-tQOF-gjXy-2pc9z0

創建卷組

物理卷pv創建好之后,才可以創建卷組,創建卷組則用命令vgcreate,並將剛才創建的兩個物理卷加入該卷組,其中PE的默認大小為4MB,PE是卷組的最小存儲單位,可以通過-s選項指定PE的大小,可以通過vgs或者vgdisplay來查看創建的卷組

[root@localhost ~]# vgcreate myvg /dev/sdb1 /dev/sdb2
  Volume group "myvg" successfully created
[root@localhost ~]# vgs
  VG   #PV #LV #SN Attr   VSize  VFree
  cl     1   2   0 wz--n- 19.70g    0 
  myvg   2   0   0 wz--n-  9.99g 9.99g
[root@localhost ~]# vgdisplay 
  --- Volume group ---
  VG Name               cl
  System ID             
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               2
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               19.70 GiB
  PE Size               4.00 MiB
  Total PE              5044
  Alloc PE / Size       5044 / 19.70 GiB
  Free  PE / Size       0 / 0   
  VG UUID               AbayDZ-NRTB-EILO-IjLH-kHji-Ixek-LI1Kdx
   
  --- Volume group ---
  VG Name               myvg
  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               9.99 GiB
  PE Size               4.00 MiB
  Total PE              2558
  Alloc PE / Size       0 / 0   
  Free  PE / Size       2558 / 9.99 GiB
  VG UUID               bRctGj-xKXV-C2pw-hzqk-KSyI-h5mR-BATF9A

創建邏輯卷

卷組VG創建好之后,才可以創建邏輯卷LV,邏輯卷的創建命令為lvcreate,創建好之后可以通過lvs或者lvdisplay開查看創建的邏輯卷,需要說明的是在創建lv的時候需要指定其大小,選項為-L,邏輯卷的名字選項-n,也可以指定PE的個數選項-l

[root@localhost ~]# lvcreate -L 5G -n textlv myvg
  Logical volume "textlv" created.
[root@localhost ~]# lvs
  LV     VG   Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  root   cl   -wi-ao----   18.73g                                                    
  swap   cl   -wi-ao---- 1000.00m                                                    
  textlv myvg -wi-a-----    5.00g                                                    
[root@localhost ~]# lvdisplay 
  --- Logical volume ---
  LV Path                /dev/cl/swap
  LV Name                swap
  VG Name                cl
  LV UUID                Y06H4S-vcF7-GIAf-AV1U-0TlK-yR39-FiR7bD
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-08 20:41:35 +0800
  LV Status              available
  # open                 2
  LV Size                1000.00 MiB
  Current LE             250
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:1
   
  --- Logical volume ---
  LV Path                /dev/cl/root
  LV Name                root
  VG Name                cl
  LV UUID                L9AAAm-gjjC-dF5S-fOyd-XOTG-fxBC-CI0j2Y
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-08 20:41:36 +0800
  LV Status              available
  # open                 1
  LV Size                18.73 GiB
  Current LE             4794
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0
   
  --- Logical volume ---
  LV Path                /dev/myvg/textlv
  LV Name                textlv
  VG Name                myvg
  LV UUID                LhE6yQ-t3cn-BmwW-css0-dvua-CvCO-pSf2pe
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2019-12-26 21:41:01 +0800
  LV Status              available
  # open                 0
  LV Size                5.00 GiB
  Current LE             1280
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2
   

創建文件系統

邏輯卷textlv創建好之后,就可以在上面創建文件系統,以ext3文件系統為例,應該注意的是邏輯卷的引用需要邏輯卷的設備文件,邏輯卷的設備文件有兩種書寫方式

/dev/VG_NAME/LV_NAME

/dev/mapper/VG_NAME-LV_NAME

以我們做的為例邏輯卷的設備文件為

/dev/myvg/textlv或者是/dev/mapper/myvg-textlv

[root@localhost ~]# mkfs -t ext4 /dev/myvg/textlv 
mke2fs 1.42.9 (28-Dec-2013)
文件系統標簽=
OS type: Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1310720 blocks
65536 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736

Allocating group tables: 完成                            
正在寫入inode表: 完成                            
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成 

掛載

將創建好的文件系統/dev/myvg/textlv掛載到/mnt上,若實現以后服務器重啟自動掛載,需要將創建好的文件系統掛載到配置文件/etc/fstab里面

[root@localhost ~]# mount /dev/myvg/textlv /mnt
[root@localhost ~]# mount |tail -1
/dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)
[root@localhost ~]# vi /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  8 20:41:38 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=d6e819c3-6d45-4b79-8179-746c005bf567 /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0
/dev/myvg/textlv        /mnt                    ext4    defaults        0 0

為了查看/etc/fstab/是否正確,可以先卸載邏輯卷textlv,然后使用mount –a是內核重新讀取/etc/fstab,看是否能夠自動掛載

[root@localhost ~]# umount /dev/myvg/textlv 
[root@localhost ~]# mount -a
[root@localhost ~]# mount |tail -1
/dev/mapper/myvg-textlv on /mnt type ext4 (rw,relatime,seclabel,data=ordered)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM