LVM邏輯卷管理

寫在前面:

    博客書寫牢記5W1H法則:What,Why,When,Where,Who,How。


本篇主要內容:

● LVM基本介紹

● LVM結構

● LVM命令工具

    pv ...

    vg ...

    lv ...




LVM基本介紹

   Logical Volume Manager (version2)

   LVM功能是由內核模塊dm(device mapper)提供的,該模塊能夠將一個或多個底層設備組織成一個邏輯設備。設備具體目錄在/dev/dm-#


LVM設備路徑:

   /dev/mapper/VG_NAME-LV_NAME 爲鏈接文件,指向dm模塊生成的設備。

   /dev/VG_NAME/LV_NAME  爲鏈接文件,指向dm模塊生成的設備。


特點;

   (1)可屏蔽底層磁盤佈局,便於動態調整磁盤容量

   (2)可將多個磁盤或分區組合成一個大的“虛擬磁盤”,整合零散空間。並可在將來進行磁盤或分區的新增與移除。

   (3)通過快照,可以實現COW(Copy On Write)。以方便在掛載的情況下完成備份等操作。

   (4)/boot分區不能放置在LVM。


LVM結構:

   LVM是由3層結構組成的。

   PV(Physical Volume):將獨立的磁盤或分區標記爲物理卷,以備上層使用。

   VG(Volume Group):將PV進行整合,形成一個大的“虛擬磁盤”。隱藏物理差別,格式化最小單位爲PE(Physical Expend),默認PE大小爲4MB

   LV(Logical Volume):類似於分區之於磁盤,LV也相當於VG的分區,創建LV之後就可以格式化使用了。


命令工具:

   PV:

      pvcreate 

         pvcreate /dev/DEVICE 創建PV

      pvs

         簡要顯示pv列表及使用情況

      pvdisplay

         顯示pv詳細信息

      pvmove 

         pvmove FROM_PV TO_PV 移動PV上的數據到另一個PV上

      pvremove

         pvremove /dev/DEVICE 刪除PV設備

   VG:

      vgcreate

         vgcreate VG_NAME [-s #[KMGT]] /dev/DEVICE 創建vg,-s指定PE大小

      vgs

      vgdisplay

      vgremove

      vgextend

         vgextend VG_NAME /dev/DEVICE 擴展vg容量,添加PV

      vgreduce

         vgreduce VG-NAME /dev/DEVICE 縮減vg容量,移除PV

   LV:

      lvcreate

         lvcreate -L SIZE -n LV_NAME VG_NAME

         lvcreate -L SIZE -p r -s -n LV_NAME VG_NAME 創建快照LV卷,權限爲只讀。

      lvs

      lvdisplay

      lvremove

      lvextend

         lvextend -L [+]SIZE /dev/VG_NAME/LV_NAME

      lvreduce

         lvreduce -L [-]SIZE /dev/VG_NAME/LV_NAME


備份介紹:

   冷備份:卸載文件系統,不能讀寫。

   溫備份:不卸載文件系統,可讀,不可寫。

   熱備份:不卸載文件系統,可讀寫。


LV的擴展:

   擴展應該由底層到高層,從PV --> VG --> LV --> 文件系統層層操作。可以在掛載的同時操作。


LV的縮減:

   縮減操作應該先卸載文件系統,由高層到底層,從文件系統 --> LV --> VG --> PV層層操作,直到最後移除硬盤。


LV的快照:

   LV快照支持掛載文件系統的情況下進行操作,保證業務不中斷。但對於頻繁寫入的文件系統,應先停止所有寫操作(如數據庫進行鎖操作),而後快速執行快照,再恢復業務。快照期間,頻繁的寫入可能會影響寫入速度,完成備份等操作後,應及時刪除快照卷。



創建LVM並掛載使用

  #fdisk工具創建2個分區,分區大小分別爲15G和5G,並指定標識符爲8e(Linux LVM)
[root@localhost ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk 
sda      8:0    0  120G  0 disk 
├─sda1   8:1    0  500M  0 part /boot
├─sda2   8:2    0   40G  0 part /
├─sda3   8:3    0   20G  0 part /usr
├─sda4   8:4    0    1K  0 part 
├─sda5   8:5    0   15G  0 part 
└─sda6   8:6    0    5G  0 part 
sr0     11:0    1 1024M  0 rom  
  #使用分區創建pv
[root@localhost ~]# pvcreate /dev/sda5
  Physical volume "/dev/sda5" successfully created
[root@localhost ~]# pvcreate /dev/sda6
  Physical volume "/dev/sda6" successfully created

  #使用已劃分爲pv的分區創建vg
[root@localhost ~]# vgcreate TESTVG -s 16M /dev/sda{5,6}
  Volume group "TESTVG" successfully created
  #在剛創建的vg上創建lv,大小爲5G
root@localhost ~]# lvcreate -L 5G -n TESTLV TESTVG
WARNING: swap signature detected on /dev/TESTVG/TESTLV at offset 4086. Wipe it? [y/n]: y
  Wiping swap signature on /dev/TESTVG/TESTLV.
  Logical volume "TESTLV" created.
  #格式化LV爲ext4文件類型,塊大小爲4K,卷標爲TESTLV
[root@localhost ~]# mke2fs -L TESTLV -b 4096 -t ext4 /dev/TESTVG/TESTLV
...省略輸出...
  #掛載並設置開機掛載到/users目錄
[root@localhost ~]# mkdir /users
[root@localhost ~]# mount /dev/TESTVG/TESTLV /users
[root@localhost ~]# blkid /dev/TESTVG/TESTLV
/dev/TESTVG/TESTLV: LABEL="TESTLV" UUID="a23cfb47-1e13-44d8-80ac-6081b7371abd" TYPE="ext4" 
[root@localhost ~]# vim /etc/fstab  #添加以下內容:
UUID=a23cfb47-1e13-44d8-80ac-6081b7371abd /users                  ext4    defaults        0 0
  #一定使用mount -a檢查下/etc/fstab文件是否正確。如果正確,會掛載文件中設置的所有條目,否則,會提示錯誤。
[root@localhost ~]# mount -a
[root@localhost ~]# mount | grep /users
/dev/mapper/TESTVG-TESTLV on /users type ext4 (rw,relatime,seclabel,data=ordered)


  #嘗試寫入數據,我們這裏新建用戶archlinux並讓/users/archlinux作爲其家目錄
[root@localhost ~]# useradd archlinux -d /users/archlinux
[root@localhost ~]# su - archlinux
[archlinux@localhost ~]$ cp /etc/pam.d/* /users/archlinux/


  #擴展TESTLV至7G

[root@localhost ~]# lvextend -L 7G /dev/TESTVG/TESTLV
  Size of logical volume TESTVG/TESTLV changed from 5.00 GiB (320 extents) to 7.00 GiB (448 extents).
  Logical volume TESTLV successfully resized.
  #擴展ext4文件系統與LV一致
[root@localhost ~]# resize2fs /dev/TESTVG/TESTLV 
resize2fs 1.42.9 (28-Dec-2013)
Filesystem at /dev/TESTVG/TESTLV is mounted on /users; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/TESTVG/TESTLV is now 1835008 blocks long.
  #查看塊設備已擴展到7G,掛載目錄的數據未丟失
[root@localhost ~]# lsblk 
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
│ └─TESTVG-TESTLV 253:0    0    7G  0 lvm  /users
└─sda6              8:6    0    5G  0 part 
sr0                11:0    1 1024M  0 rom  
[root@localhost ~]# ls /users/archlinux/
atd                  gdm-launch-environment  password-auth     setup              system-auth
chfn                 gdm-password            password-auth-ac  smartcard-auth     system-auth-ac
chsh                 gdm-pin                 polkit-1          smartcard-auth-ac  systemd-user
config-util          gdm-smartcard           postlogin         smtp               vlock
crond                kcheckpass              postlogin-ac      smtp.postfix       vmtoolsd
cups                 kscreensaver            ppp               sshd               xserver
fingerprint-auth     liveinst                remote            su
fingerprint-auth-ac  login                   runuser           sudo
gdm-autologin        other                   runuser-l         sudo-i
gdm-fingerprint      passwd                  screen            su-l


  #縮減TESTLV的大小至3G。縮減前請一定確定已使用空間要小於縮減後的空間。

[root@localhost ~]# umount /dev/TESTVG/TESTLV 
  #在調整文件系統大小前,需要先檢查設備是否有文件系統錯誤
[root@localhost ~]# e2fsck -f /dev/TESTVG/TESTLV 
e2fsck 1.42.9 (28-Dec-2013)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
TESTLV: 70/458752 files (0.0% non-contiguous), 67386/1835008 blocks
  #調整文件系統大小
[root@localhost ~]# resize2fs /dev/TESTVG/TESTLV 3G
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/TESTVG/TESTLV to 786432 (4k) blocks.
The filesystem on /dev/TESTVG/TESTLV is now 786432 blocks long.

  #調整LV大小,會有安全風險,重要數據需備份
[root@localhost ~]# lvreduce -L 3G /dev/TESTVG/TESTLV 
  WARNING: Reducing active logical volume to 3.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce TESTLV? [y/n]: y
  Size of logical volume TESTVG/TESTLV changed from 7.00 GiB (448 extents) to 3.00 GiB (192 extents).
  Logical volume TESTLV successfully resized.
  #重新掛載,慶幸的是文件都還在
[root@localhost ~]# mount -a
[root@localhost ~]# ls /users/archlinux/
atd                  gdm-launch-environment  password-auth     setup              system-auth
chfn                 gdm-password            password-auth-ac  smartcard-auth     system-auth-ac
chsh                 gdm-pin                 polkit-1          smartcard-auth-ac  systemd-user
config-util          gdm-smartcard           postlogin         smtp               vlock
crond                kcheckpass              postlogin-ac      smtp.postfix       vmtoolsd
cups                 kscreensaver            ppp               sshd               xserver
fingerprint-auth     liveinst                remote            su
fingerprint-auth-ac  login                   runuser           sudo
gdm-autologin        other                   runuser-l         sudo-i
gdm-fingerprint      passwd                  screen            su-l


  #釋放設備/分區

  #分配了20G的VG,只使用了不到1G,我們來把15G的/dev/sda5釋放出來。
[root@localhost ~]# lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
│ └─TESTVG-TESTLV 253:0    0    3G  0 lvm  /users
└─sda6              8:6    0    5G  0 part 
sr0                11:0    1 1024M  0 rom 
  #由於LV只有3G,而我們將要剩餘的/dev/sda6有5G空間,所以,文件系統我們無需再縮減;但我們看到TESTLV的數據都在/dev/sda5上面,直接從VG移除/dev/sda5必然會損失數據,所以,我們先將/dev/sda5上的數據移動到/dev/sda6上面。
[root@localhost ~]# pvmove /dev/sda5 /dev/sda6
  /dev/sda5: Moved: 0.0%
  /dev/sda5: Moved: 12.0%
  /dev/sda5: Moved: 25.0%
  /dev/sda5: Moved: 37.5%
  /dev/sda5: Moved: 46.4%
  /dev/sda5: Moved: 57.8%
  /dev/sda5: Moved: 72.9%
  /dev/sda5: Moved: 100.0%
[root@localhost ~]# lsblk
NAME              MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0                 2:0    1    4K  0 disk 
sda                 8:0    0  120G  0 disk 
├─sda1              8:1    0  500M  0 part /boot
├─sda2              8:2    0   40G  0 part /
├─sda3              8:3    0   20G  0 part /usr
├─sda4              8:4    0    1K  0 part 
├─sda5              8:5    0   15G  0 part 
└─sda6              8:6    0    5G  0 part 
  └─TESTVG-TESTLV 253:0    0    3G  0 lvm  /users
sr0                11:0    1 1024M  0 rom  
  #OK,把/dev/sda6從TESTVG移除,移除此PV
[root@localhost ~]# vgreduce TESTVG /dev/sda5
  Removed "/dev/sda5" from volume group "TESTVG"
[root@localhost ~]# pvremove /dev/sda5
  Labels on physical volume "/dev/sda5" successfully wiped
[root@localhost ~]# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sda6  TESTVG lvm2 a--  4.98g 1.98g


  #爲LV創建快照。

  #注意養成好習慣,在快照創建時,就應該設置爲只讀!快照建立前,首先要確保並沒有程序正在寫入操作。避免數據不完整

[root@localhost ~]# lvcreate -L 1G -s -p r -n TESTLV_SNAPSHOT /dev/TESTVG/TESTLV
  Logical volume "TESTLV_SNAPSHOT" created.
  #掛載LV快照快照,驗證在原LV新建數據,快照LV仍爲快照時刻的數據
[root@localhost ~]# mount /dev/TESTVG/TESTLV_SNAPSHOT /backup
mount: /dev/mapper/TESTVG-TESTLV_SNAPSHOT is write-protected, mounting read-only
[root@localhost ~]# echo "new file" > /users/archlinux/newfile
[root@localhost ~]# ls /users/archlinux/newfile 
/users/archlinux/newfile
[root@localhost ~]# ls /backup/archlinux/newfile
ls: cannot access /backup/archlinux/newfile: No such file or directory

  #數據備份完成後,卸載LV快照
[root@localhost ~]# umount /dev/TESTVG/TESTLV_SNAPSHOT 
[root@localhost ~]# lvremove /dev/TESTVG/TESTLV_SNAPSHOT 
Do you really want to remove active logical volume TESTLV_SNAPSHOT? [y/n]: y
  Logical volume "TESTLV_SNAPSHOT" successfully removed


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章