LVM原理、創建、擴容、縮減、快照詳解

前言:本文章耗費作者大量時間編寫,如轉載請聲明轉自anyisalin.blog.51cto.com





LVM是什麼?爲什麼要使用LVM?

    LVM(Logical Volume Manager):邏輯卷管理, 在日常使用或生產環境中, 我們可能會因爲在規劃存儲時未考慮到未來數據增長的速度超乎我們的預計而措手不及,因爲增加一塊硬盤再將源數據移到新硬盤上很麻煩並且提高了成本還浪費硬盤空間。

    在1998年有人在開發了一個基於卷的管理方式, 在HP-UX中使用,這就是LVM,LVM可以無損擴容、縮減空間來達到應對硬盤空間不足的情況。



LVM相關原理

    LVM通過內核中的dm(device mapper)模塊實現使用純軟件的方式將一個或多個底層硬件設備組織成一個或多個邏輯設備。


相關術語:

    PV:Physical Volume    #一般是物理分區 /dev/sd##...

    VG:Volume Group    #由多個PE組成,創建卷組時可指定PE大小

    PE:Physical Extent    #默認大小爲4M,LVM中的最小單元

    LV:Logical Volume    #由多個PE組成

    LE:Logical Extent    #在LV中的PE稱作LE


    LVM通過PV組成PV池,基於PV創建VG,VG由若干個PE組成,在VG中由多個PE組成LV,在LV中PE叫做LE。


原理圖:

    File:LVM1.svg




實戰:創建、擴容、縮減、快照

系統環境

當前系統分區信息,當前系統有2塊新硬盤,分別爲20G
[root@server2 ~]# fdisk -l

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002777c

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      208813+  83  Linux
/dev/sda2              27        1985    15735667+  83  Linux
/dev/sda3            1986        2247     2104515   82  Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xdee177d5

   Device Boot      Start         End      Blocks   Id  System

Disk /dev/sdc: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000



LVM相關命令解釋

vg管理工具:
    vgs    #查看vg簡要信息
    vgdisplay      #查看vg詳細信息
    vgcreate  [-s #[kKmMgGtTpPeE]] VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #創建vg
    vgextend  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #擴展vg容量
    vgreduce  VolumeGroupName  PhysicalDevicePath [PhysicalDevicePath...]    #縮減vg容量
    vgremove  VolumeGroupName  #刪除vg

lv管理工具:
    lvs    #查看lv簡要信息
    lvdisplay    #查看lv詳細信息
    lvcreate -L #[mMgGtT] -n NAME VolumeGroup    #創建lv
    lvremove /dev/VG_NAME/LV_NAME    #刪除lv

擴展邏輯卷:
    lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME    #擴展邏輯卷
    resize2fs /dev/VG_NAME/LV_NAME    #重新定義文件系統大小
    
縮減邏輯卷:
    umount /dev/VG_NAME/LV_NAME    #卸載lv
    e2fsck -f /dev/VG_NAME/LV_NAME    #檢查lv
    resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]    #重新定義lv大小
    lvreduce -L [-] [mMgGtT] /dev/VG_NAME/LV_NAME    #縮減lv



LVM創建

[root@server2 ~]# pvcreate /dev/sdb     #將sdb硬盤添加到PV池中
  Physical volume "/dev/sdb" successfully created
[root@server2 ~]# pvcreate /dev/sdc    #將sdc硬盤添加到PV池中
  Physical volume "/dev/sdc" successfully created
[root@server2 ~]# pvs    #查看PV池
  PV         VG   Fmt  Attr PSize  PFree 
  /dev/sdb        lvm2 ---  20.00g 20.00g
  /dev/sdc        lvm2 ---  20.00g 20.00g
[root@server2 ~]# vgcreate myvg /dev/sdb     #創建名稱爲myvg的卷組,由/dev/sdb提供PE
  Volume group "myvg" successfully created    #提示vg創建成功
[root@server2 ~]# vgs    #查看vg簡要信息
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   1   1   0 wz--n- 20.00g 10.00g
[root@server2 ~]# lvcreate -L 10G -n mylv myvg    #在myvg下創建容量爲10G、名稱爲mylv的lv
  Logical volume "mylv" created.
[root@server2 ~]# lvs    #查看lv簡要信息
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-a----- 10.00g 
  
[root@server2 ~]# mkfs.ext4 /dev/mapper/myvg-mylv     #格式化lv爲ext4文件系統
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621440 blocks
131072 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 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, 1605632

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    #將mylv掛載到/mnt下

[root@server2 ~]# df -lh    #查看mylv分區使用情況
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      9.8G   23M  9.2G   1% /mnt


LVM擴展


我們現在想將mylv擴展到30G該如何操作?

    應該先將myvg擴展到30G以上,在將mylv擴展到30G

操作過程

[root@server2 ~]# vgextend myvg /dev/sdc    #擴展myvg,將sdc的空間也提供給myvg
  Volume group "myvg" successfully extended
  
[root@server2 ~]# vgs    #查看vg當前信息,myvg大小爲40G
  VG   #PV #LV #SN Attr   VSize  VFree 
  myvg   2   1   0 wz--n- 39.99g 29.99g
  
[root@server2 ~]# umount /mnt/    #卸載mylv

[root@server2 ~]# lvextend -L 30G /dev/myvg/mylv     #擴展lv到30G
  Size of logical volume myvg/mylv changed from 10.00 GiB (2560 extents) to 30.00 GiB (7680 extents).
  Logical volume mylv successfully resized
  
[root@server2 ~]# lvs    #查看當前lv信息,mylv爲30G
  LV   VG   Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-a----- 30.00g 
[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    #掛載mylv到/mnt目錄

[root@server2 ~]# df    ##注意:這裏顯示mylv大小隻有10G,這是因爲我們沒有進行重新定義
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/sda2             15357672 3527844  11043048  25% /
tmpfs                   502384       0    502384   0% /dev/shm
/dev/sda1               198123   36589    151094  20% /boot
/dev/mapper/myvg-mylv
                      10190136   23028   9642820   1% /mnt
[root@server2 ~]# df -lh
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      9.8G   23M  9.2G   1% /mnt
                      
[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv     #使用resize2fs可以重新定義分區的大小
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/mapper/myvg-mylv is mounted on /mnt; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/mapper/myvg-mylv to 7864320 (4k) blocks.
The filesystem on /dev/mapper/myvg-mylv is now 7864320 blocks long.
[root@server2 ~]# df -lh    #現在mylv大小終於恢復正常了
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                       30G   28M   28G   1% /mnt


LVM縮減

    縮減mylv到10G

操作過程

[root@server2 ~]# umount /mnt/    #先卸載掛載目錄
[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv 8G    
resize2fs 1.41.12 (17-May-2010)
Please run 'e2fsck -f /dev/mapper/myvg-mylv' first.    #提示需先使用e2fsck命令檢查文件系統
[root@server2 ~]# e2fsck -f /dev/mapper/myvg-mylv     #檢查mylv文件系統
e2fsck 1.41.12 (17-May-2010)
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
/dev/mapper/myvg-mylv: 11/1966080 files (0.0% non-contiguous), 167409/7864320 blocks

[root@server2 ~]# resize2fs /dev/mapper/myvg-mylv 8G    #使用resize2fs命令重新定義mylv分區大小
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/mapper/myvg-mylv to 2097152 (4k) blocks.
The filesystem on /dev/mapper/myvg-mylv is now 2097152 blocks long.

[root@server2 ~]# lvreduce -L 8G /dev/myvg/mylv     #將mylv大小縮減成8G
  WARNING: Reducing active logical volume to 8.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce mylv? [y/n]: y
  Size of logical volume myvg/mylv changed from 30.00 GiB (7680 extents) to 8.00 GiB (2048 extents).
  Logical volume mylv successfully resized
  
[root@server2 ~]# lvs    #查看mylv信息
  LV   VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv myvg -wi-ao---- 8.00g 
[root@server2 ~]# mount /dev/mapper/myvg-mylv /mnt/    重新掛載
[root@server2 ~]# df -lh    #查看分區大小
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2              15G  3.4G   11G  25% /
tmpfs                 491M     0  491M   0% /dev/shm
/dev/sda1             194M   36M  148M  20% /boot
/dev/mapper/myvg-mylv
                      7.8G   36M  7.4G   1% /mnt



LVM快照創建

    LVM快照簡單來說就是將所快照源分區一個時間點所有文件的元數據進行保存,如果源文件沒有改變,那麼訪問快照卷的相應文件則直接指向源分區的源文件,如果源文件發生改變,則快照卷中與之對應的文件不會發生改變。快照卷主要用於輔助備份文件。  這裏只簡單介紹,點擊查看詳細介紹


操作過程


[root@server2 mnt]# df    
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/sda2             15357672 3527924  11042968  25% /
tmpfs                   502384       0    502384   0% /dev/shm
/dev/sda1               198123   36589    151094  20% /boot
/dev/mapper/myvg-mylv
                       8125880   36852   7669600   1% /mnt
[root@server2 mnt]# pwd    #當前在mylv的分區中
/mnt
[root@server2 mnt]# cp -rf /etc/{grub.conf,sysconfig} ./    #複製/etc/sysconfig,/etc/grub.conf到當前目錄(mylv中)
[root@server2 mnt]# ls    #查看當前分區中的文件
grub.conf  lost+found  sysconfig
[root@server2 mnt]# lvcreate -s -n mylv-snap -L 8G /dev/myvg/mylv    #創建mylv的快照卷mylv-snap
  Logical volume "mylv-snap" created.
[root@server2 mnt]# lvs    #查看lv的信息,出現了mylv-snap
  LV        VG   Attr       LSize Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  mylv      myvg owi-aos--- 8.00g                                                    
  mylv-snap myvg swi-a-s--- 8.00g      mylv   0.00                                   
[root@server2 mnt]# mkdir /mylv-snap    #創建mylv-snap目錄
[root@server2 mnt]# mount /dev/myvg/mylv-snap /mylv-snap/    #將mylv-snap掛載到/mylv-snap
[root@server2 mnt]# ll /mylv-snap/    #查看分區中的文件,和/mnt下一樣
total 20
lrwxrwxrwx. 1 root root    22 Jan  4 16:01 grub.conf -> ../boot/grub/grub.conf
drwx------. 2 root root 16384 Jan  4 15:44 lost+found
drwxr-xr-x. 7 root root  4096 Jan  4 16:02 sysconfig
[root@server2 mnt]# cp /etc/rc.d/init.d/functions ./    #複製/etc/rc.d/init.d/functions到/mnt目錄中
[root@server2 mnt]# ls    #查看當前目錄(/mnt,即是mylv)中的文件
functions  grub.conf  lost+found  sysconfig
[root@server2 mnt]# ll /mylv-snap/    #查看/mylv-snap(即是mylv-snap)中的文件,發現並沒有functions
total 20
lrwxrwxrwx. 1 root root    22 Jan  4 16:01 grub.conf -> ../boot/grub/grub.conf
drwx------. 2 root root 16384 Jan  4 15:44 lost+found
drwxr-xr-x. 7 root root  4096 Jan  4 16:02 sysconfig





總結

    LVM雖然很好用,但是因爲在硬件上使用純軟件方式進行管理,所以誤刪除數據恢復更加困難,LVM縮減分區大小風險較大,況且現在btrfs已經很穩定了,功能更加強大,並不推薦使用LVM對磁盤分區進行管理。

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