Linux中邏輯卷(LV)的創建、增大和減小


首先說一下在縮小邏輯卷的時候要注意的問題:第一步使用resize2fs命令更改文件系統的容量;第二步使用lvreduce命令減小邏輯卷的容量。這兩個順序千萬不要搞反了,而且要保證縮減后的邏輯卷容量大於等於實際更改后的文件系統大小,否則你的邏輯卷就不能正常使用了

1 LVM體系結構

LVM(邏輯卷管理器),可以將幾個物理分區(或磁盤)通過軟件組合成為一個看起來獨立的大磁盤,並且可以靈活的調整卷的大小。LVM是由VG(卷組)、PV(物理卷)、LV(邏輯卷)和PE(物理擴展塊)組成。

1.1 物理存儲介質(The Physical Media)

這里指系統的存儲設備,如:/dev/sda、/dev/sdb等等,是存儲系統最低層的存儲單元。

1.2 物理卷(PV, Physical Volume)

物理卷就是指磁盤、磁盤分區或從邏輯上和磁盤分區具有同樣功能的設備(如RAID),是LVM的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁盤等)比較,卻包含有和LVM相關的管理參數。

1.3 卷組(VG, Volume Group)

LVM卷組類似於非LVM系統中的物理硬盤,其由物理卷組成。能在卷組上創建一個或多個“LVM分區”(邏輯卷),LVM卷組由一個或多個物理卷組成。

1.4 邏輯卷(LV, Logical Volume)

LVM的邏輯卷類似於非LVM系統中的硬盤分區,在邏輯卷之上能建立文件系統(比如/home或/usr等)。

1.5 PE(physical extent)

每一個物理卷被划分為稱為PE(Physical Extents)的基本單元,具有唯一編號的PE是能被LVM尋址的最小單元。PE的大小是可設置的,默認為4MB。

1.6 LE(logical extent)

邏輯卷也被划分為被稱為LE(Logical Extents) 的可被尋址的基本單位。在同一個卷組中,LE的大小和PE是相同的,並且一一對應。
下面是一個LVM的體系結構圖

創建LV有兩種方式,一種是基於磁盤的,另外一種是基於分區的,如果是基於分區的就必須先通過fdisk或parted方式划分好分區,但不要格式化來進行pvcreate創建處理卷;如果基於磁盤的就不需要創建分區了,直接就可以通過pvcreate來創建物理卷。因為只有創建好了物理卷之后才能添加到卷組,並在卷組里面創建邏輯卷,后格式化才能存放數據。
這里,我以基於磁盤的方式創建LV。

2 創建物理卷PV

假設我們的系統已經掛載了一塊尚未使用的硬盤,通過fdisk -l命令可以看到系統中所有的硬盤

[root@node1 ~]# fdisk -l | grep sd
Disk /dev/sda: 21.5 GB, 21474836480 bytes
/dev/sda1   *           1          26      204800   83  Linux
/dev/sda2              26        2611    20765696   8e  Linux LVM
Disk /dev/sdb: 1073 MB, 1073741824 bytes
Disk /dev/sdc: 1073 MB, 1073741824 bytes
[root@node1 ~]# 

這里可以看到我的系統中有三塊硬盤sda、sdb、sdc,其中sda已經被划分成2個分區。
現在我們來利用sdb、sdc這兩塊盤,創建兩個PV

[root@node1 ~]# pvcreate /dev/sdb /dev/sdc
  Physical volume "/dev/sdb" successfully created
  Physical volume "/dev/sdc" successfully created
[root@node1 ~]# 
[root@node1 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree   
  /dev/sda2  vg_node1 lvm2 a--    19.80g    3.14g
  /dev/sdb   vgtest   lvm2 a--  1020.00m 1020.00m
  /dev/sdc            lvm2 a--     1.00g    1.00g
[root@node1 ~]# pvscan
  PV /dev/sdb    VG vgtest          lvm2 [1020.00 MiB / 1020.00 MiB free]
  PV /dev/sda2   VG vg_node1        lvm2 [19.80 GiB / 3.14 GiB free]
  PV /dev/sdc                       lvm2 [1.00 GiB]
  Total: 3 [21.79 GiB] / in use: 2 [20.79 GiB] / in no VG: 1 [1.00 GiB]
[root@node1 ~]#

如上所示,使用pvcreate命令創建PV,然后使用pvspvscan可以查看系統中已有的PV。
到這里,物理卷就創建完成了,接下來我們用這兩個PV來創建一個卷組。

3 創建卷組VG

我們先用其中一個PV來創建VG

[root@node1 ~]# vgcreate vgtest /dev/sdb
  Volume group "vgtest" successfully created
[root@node1 ~]#
[root@node1 ~]# vgs
  VG       #PV #LV #SN Attr   VSize    VFree   
  vg_node1   1   3   0 wz--n-   19.80g    3.14g
  vgtest     1   0   0 wz--n- 1020.00m 1020.00m
[root@node1 ~]# vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vgtest" using metadata type lvm2
  Found volume group "vg_node1" using metadata type lvm2
[root@node1 ~]#

這里,我們 vgcreate命令創建了一個名叫vgtest的卷組,然后使用vgsvgscan可以查看已創建的vg。
現在我們已經成功創建了一個卷組,接下來就可以根據需要來創建邏輯卷LV了

4 創建邏輯卷LV

[root@node1 ~]# lvcreate -L 1000M -n lvtest vgtest
  Logical volume "lvtest" created
[root@node1 ~]#

這里我們使用lvcreate命令創建了一個名叫lvtest的邏輯卷,大小為1000M
簡單介紹一下lvcreate命令的參數

-L:指定邏輯卷的大小,單位為“kKmMgGtT”字節
-l:指定邏輯卷的大小(LE數)
-n: 指定邏輯卷的名字

邏輯卷創建后,還需要進行格式化操作,否則不能使用,使用mkfs命令來進行格式化,如下所示,我們把這個邏輯卷格式化為ext4文件系統

[root@node1 ~]# mkfs.ext4 /dev/mapper/vgtest-lvtest 
mke2fs 1.41.12 (17-May-2010)
文件系統標簽=
操作系統:Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65280 inodes, 261120 blocks
13056 blocks (5.00%) reserved for the super user
第一個數據塊=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8160 inodes per group
Superblock backups stored on blocks: 
       32768, 98304, 163840, 229376

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

This filesystem will be automatically checked every 31 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@node1 ~]#

到此為止,邏輯卷建立完成,你可以把它掛載到一個空閑目錄下(注意:如果掛載的非空閑目錄下,原來目錄中的內容會被隱藏,不是覆蓋哦,但你取消掛載后,被隱藏的內容就會再次出現

[root@node1 ~]# mkdir /test/
[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_node1-lvroot  9.7G  3.4G  5.8G  37% /
tmpfs                        491M   72K  491M   1% /dev/shm
/dev/sda1                    194M   30M  155M  16% /boot
/dev/mapper/vg_node1-lvhome  4.9G  153M  4.5G   4% /home
/dev/mapper/vgtest-lvtest   1000M   18M  936M   2% /test
[root@node1 ~]# 

5 邏輯卷LV擴容

假如你的邏輯卷容量不夠了,需要擴容,有兩種情況:一是你的VG中還有剩余空間,那么可以直接使用VG中剩余的空間進行擴容;二是你的VG中沒有空間或者是空間不足了,那你需要先擴容VG,在擴容LV。。第二種只是比第一種情況多了一步擴容VG的操作,所以這里我們以第二種情況為例進行介紹。
這里我們使用剛才未使用的另一塊PV來擴容我們的卷組vgtest。

[root@node1 ~]# vgextend vgtest /dev/sdc
  Volume group "vgtest" successfully extended
[root@node1 ~]# vgs
  VG       #PV #LV #SN Attr   VSize  VFree   
  vg_node1   1   3   0 wz--n- 19.80g    3.14g
  vgtest     2   1   0 wz--n-  1.99g 1020.00m
[root@node1 ~]# 

使用vgextend命令擴容卷組,這里可以看到我們vgtest容量已經增加了一倍,接下來開始擴容邏輯卷

[root@node1 ~]# lvextend -L +500M /dev/mapper/vgtest-lvtest 
  Extending logical volume lvtest to 1.48 GiB
  Logical volume lvtest successfully resized
[root@node1 ~]# df -h /test
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest 1004M   18M  936M   2% /test
[root@node1 ~]#

如上所示,我們使用lvextend命令將lvtest擴容到1.48G,但是為什么用df -h /test命令看到的lvtest空間並沒有改變的,這里還需要一步操作才能使lvtest的空間改變生效

[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 1
Performing an on-line resize of /dev/mapper/vgtest-lvtest to 389120 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 389120 blocks long.

[root@node1 ~]#

到此,我們的LV擴容已經成功了

6 縮小LV容量

介紹完LV的擴容,我們再來說說如何縮小LV容量。假設我們想縮小lvtest的容量,並將/dev/sdc從vgtest中抽離出去,我們需要這樣進行:

#首先降低文件系統容量
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/vgtest-lvtest is mounted on /test; on-line resizing required
On-line shrinking from 389120 to 230400 not supported.
#這里提示我們lvtest已經被掛載,不能在線縮小邏輯卷容量,所以要先取消掛載
[root@node1 ~]# umount /dev/mapper/vgtest-lvtest 
[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
請先運行 'e2fsck -f /dev/mapper/vgtest-lvtest'.

#這里提示我們先運行e2fsck命令,按照提示操作即可
[root@node1 ~]# e2fsck -f /dev/mapper/vgtest-lvtest
e2fsck 1.41.12 (17-May-2010)
第一步: 檢查inode,塊,和大小
第二步: 檢查目錄結構
第3步: 檢查目錄連接性
Pass 4: Checking reference counts
第5步: 檢查簇概要信息
/dev/mapper/vgtest-lvtest: 11/97920 files (0.0% non-contiguous), 10636/389120 blocks

[root@node1 ~]# resize2fs /dev/mapper/vgtest-lvtest 900M
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/vgtest-lvtest to 230400 (4k) blocks.
The filesystem on /dev/mapper/vgtest-lvtest is now 230400 blocks long.

#這里可以看到文件系統已經成功縮小了,接下來縮小邏輯卷的大小,請注意一定要保證縮小后的邏輯卷空間大於或等於resize2fs命令縮小后的文件系統大小,否則該邏輯卷就出錯不能正常使用了(很不幸,我就是在這里踩雷了~)。我們可以先使用pvdisplay命令查看/dev/sdc的信息

[root@node1 ~]# pvdisplay /dev/sdc
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               255
  Allocated PE          0
  PV UUID               l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
   
#可以看到PE塊大小是4M,共有255個PE塊,所以我們可以從lvtest中減小255個PE
[root@node1 ~]# lvreduce -l 255 /dev/mapper/vgtest-lvtest 
  WARNING: Reducing active logical volume to 1020.00 MiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lvtest? [y/n]: y
  Reducing logical volume lvtest to 1020.00 MiB
  Logical volume lvtest successfully resized
#上面會有告警信息,但是我們實際的數據量(900M)比1020M小,所以按y繼續吧

[root@node1 ~]# mount /dev/mapper/vgtest-lvtest /test
[root@node1 ~]# df -h /test
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vgtest-lvtest  885M   34M  806M   5% /test
#重新掛載該邏輯卷,查看其大小,

# 接下來就是移除/dev/sdc了
[root@node1 ~]# pvdisplay /dev/sdb /dev/sdc
  --- Physical volume ---
  PV Name               /dev/sdb
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              255
  Free PE               0
  Allocated PE          255
  PV UUID               RUQhfR-5XLv-Xhgg-mbFH-M2dp-Cust-myRojW
   
  --- Physical volume ---
  PV Name               /dev/sdc
  VG Name               vgtest
  PV Size               1.00 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              255
  Free PE               255
  Allocated PE          0
  PV UUID               l4VpXe-wbwu-jSkq-jv8J-Qw8X-V5t3-1fAfBE
# 使用pvdisplay命令查看/dev/sdb /dev/sdc的信息,可以看到/dev/sdc是完全空閑的,所以可以直接移除
[root@node1 ~]# vgreduce vgtest /dev/sdc
  Removed "/dev/sdc" from volume group "vgtest"
[root@node1 ~]# pvs
  PV         VG       Fmt  Attr PSize    PFree
  /dev/sda2  vg_node1 lvm2 a--    19.80g 3.14g
  /dev/sdb   vgtest   lvm2 a--  1020.00m    0 
  /dev/sdc            lvm2 a--     1.00g 1.00g
#可以看到/dev/sdc 已經不屬於vgtest了

到此為止,lv的縮小就介紹完了,不過我們再小小的擴展一下,假設我們剛才對lvtest進行縮減后,發現/dev/sdc的PE還有被使用的,那這是就不能直接移除sdc了,需要先進行PE的轉移,將/dev/sdc中的已使用PE全部轉移到其他空間充足的PV中,比如說執行pvmove /dev/sdc /dev/sdb,然后就可以從vgtest中移除/dev/sdc。


免責聲明!

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



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