在 Linux 平臺中,第三方的軟件安裝位置一般是:/usr/local/ 和 /srv ,隨着我們的應用漸漸增多。萬一這些目錄所在的分區使用完了。但是,這時候我們又需要安裝新的應用軟件,怎麼辦呢?
Linux 系統中 /usr/share目錄是存放幫助手冊的,通常該目錄所佔用的磁盤空間比較大,使用rpm包安裝的應用,幫助手冊一般會安裝到 /usr/share 目錄中。分區操作那時沒有做到充分全面地考慮,隨着我們的應用的增多,該目錄所有的分區日漸用盡的情況是有可能的。我們想到最簡單的方法就是擴大該目錄所在的分區。但是磁盤的分區是不能擴展的。在對磁盤進行分區那一刻分區大小就固定下來了。以後再也不能改變的了。
數據是企業的命脈,數據安全由爲重要。RAID保證不會因爲磁盤故障而導致業務中斷;備份保證了,因誤操作或******導致數據的損壞丟失。能夠從備份中把數據恢復還原回來。
我們的應用服務很多使用到數據庫服務器(如MySQL),爲了不影響業務的正常運行,我們都要在線備份數據的,也就是熱備份。商業的熱備工具都很貴。有沒有一種廉價的解決方案呢?
這時 LVM(邏輯卷),帶來了福音。它可以動態地縮減邊界的大小;它還有“快照snapshot”的功能,該功能做數據的全備份且是熱備(其實是類熱備),速度很快。
LVM (LogicalVolumn Manage)邏輯卷。有兩個版本:LVM和LVM2。它有三部分組成:
1、PV層
PV由塊設備組成,可以是分區、raid.
對空間大小無要求,只要求是塊設備。
2、VG層
作用是把多個PV組合成一體。
PV加入VG的時候,PV被劃分成一個個邏輯單元(PE)PageExtend。因爲PE的大小是在在創建VG的時候指定的。所以剛創建PV的時候,查看PV的信息的時候顯示PE總數爲0、PE大小也爲零。PE的大小默認是4MB。PE也就是我們存儲數據的最小單元,類似於磁盤的block塊,所以設置PE大小的時候,也要根據實際應用:是存儲大數據文件呢還是存儲小文件數據呢。我們可以這樣理解:VG就一塊磁盤。
3、LV層
VG可以理解成整個磁盤,那麼創建LV的過程,可以理解爲創建分區的過程。創建分區以後要在分區上創建文件系統,並把它掛載纔可以使用的。LV也一樣要創建文件系統,且使用的命令都一樣,還要掛載纔可以使用。只是在/dev目錄下的設備文件不一樣。
LVM的邏輯組成結構如下圖:
創建邏輯卷的過程是從下到上一層層創建的:PV ---> VG ----à LV
一、創建邏輯卷並掛載使用
1、 先創建PV
操作pv使用到的命令
PV: pvcreate 創建 pvdisplay 顯示 pvmove 移動數據。在刪除PV的時候,把存放在該PV的數據移動到其它的PV上。 pvremove 移(刪)除卷 pvscan 掃描當前系統所有的PV並顯示。
準備了三個分區用來創建PV。
[root@Node1 07.11_job]# fdisk -l /dev/sdb Device Boot Start End Blocks Id System /dev/sdb1 1 66 530113+ 8e Linux LVM /dev/sdb2 67 198 1060290 8e Linux LVM /dev/sdb3 199 460 2104515 8e Linux LVM
把分區 /dev/sdb1和/dev/sdb3創建成pv
[root@Node1 ~]# pvcreate /dev/sdb1 /dev/sdb3 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb3" successfully created [root@Node1 07.11_job]# pvdisplay /dev/sdb3 "/dev/sdb3" is a new physical volume of "2.01 GiB" ---NEW Physical volume --- PVName /dev/sdb3 VGName PVSize 2.01 GiB Allocatable NO PESize 0 Total PE 0 Free PE 0 Allocated PE 0 PVUUID cIL2HD-TqAV-6ICp-iCkX-BJrW-JYZd-AoKhJV
說明:
在PV沒有加入VG之前,PE的各項參數都顯示爲0的。PE的大小,在創建VG的時候設置的。默認是:4M.其實PE就是數據的存儲最小單元。類似於block.
1、 創建VG
命令格式:
Vgcreate [option] 卷組名稱 指定加入到卷組的pv
創建卷組的時候只把 /dev/sdb3 加入該卷組
[root@Node1 07.11_job]# vgcreate –s 8M myvg /dev/sdb3 Volume group "myvg" successfully created [root@Node1 07.11_job]# vgdisplay myvg ---Volume group --- VGName myvg System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VGAccess read/write VGStatus resizable MAXLV 0 CurLV 0 Open LV 0 MaxPV 0 CurPV 1 ActPV 1 VGSize 2.00 GiB PESize 8.00 MiB Total PE 256 Alloc PE / Size 0 / 0 Free PE / Size 256 / 2.00 GiB VGUUID fG0uMm-ipew-DrQu-oXGI-ssGq-tYZq-0YxNbH [root@Node1 07.11_job]# pvdisplay /dev/sdb3 ---Physical volume --- PVName /dev/sdb3 VGName myvg PVSize 2.01 GiB / not usable7.19 MiB Allocatable yes PESize 8.00 MiB Total PE 256 Free PE 256 Allocated PE 0 PVUUID cIL2HD-TqAV-6ICp-iCkX-BJrW-JYZd-AoKhJV
操作VG使用到的命令:
vgcreate vg的創建 vgdisplay 顯示VG相關的信息 vgextend vg的擴展。 vgreduce vg的縮減 vgscan 掃描當前系統上有什麼卷組
第3步:創建邏輯卷LV
格式: Lvcreate -L 邏輯卷的大小 -n 邏輯卷名稱 在哪個卷中創建邏輯卷
創建大小爲2G的邏輯卷 mylv
[root@Node1 ~]# lvcreate -L 2G -n mylv myvg Logical volume "mylv" created
看看創建的邏輯卷的大小是不是2GB?
[root@Node1 ~]# lvscan | grep"mylv\>" ACTIVE '/dev/myvg/mylv' [2.00 GiB] inherit
操作LV 使用的命令:
lvcreate 創建邏輯卷 lvdisplay 顯出邏輯卷的信息,如果想顯示指定的邏輯卷的信息,要指定邏輯卷的設備名稱 # lvdisplay /dev/myvg/mylv lvextend 擴展邏輯卷 lvreduce 縮減邏輯卷 lvscan 列出當前系統上所有的邏輯卷
第4步:格式化並掛載
1、 格式化邏輯卷 mylv
[root@Node1~]# mke2fs -t ext4 /dev/myvg/mylv mke2fs1.41.12 (17-May-2010) Filesystemlabel= OS type:Linux Blocksize=4096 (log=2) Fragmentsize=4096 (log=2) Stride=0blocks, Stripe width=0 blocks 131072inodes, 524288 blocks 26214blocks (5.00%) reserved for the super user Firstdata block=0 Maximumfilesystem blocks=536870912 16 blockgroups 32768blocks per group, 32768 fragments per group 8192inodes per group Superblockbackups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writinginode tables: done Creatingjournal (16384 blocks): done Writingsuperblocks and filesystem accounting information: done Thisfilesystem will be automatically checked every 39 mounts or 180 days,whichever comes first. Use tune2fs -c or-i to override.
[root@Node1~]# echo $? 0
2、 掛載
Linux 的哲學思想之一是:一切皆文件。掛載設備要指定被掛載的設備,而設備在Linux系統中表現爲文件(它是我們訪問設備的入口)。設備文件存放在 /dev 目錄上。先要找到設備文件然後纔可以使用【mount】命令掛載之。
邏輯卷的設備名稱一般是:
[root@Node1 ~]# ll /dev/dm- dm-0 dm-1 dm-2 dm-6 dm-7
而表示邏輯卷的設備文件有兩個,所以掛載的時候使用那個設備名稱都可以的
[root@Node1 ~]# ll /dev/myvg/mylv lrwxrwxrwx. 1 root root 7 Jul 16 13:04 /dev/myvg/mylv ->../dm-2 [root@Node1 ~]# ll /dev/mapper/myvg-mylv lrwxrwxrwx. 1 root root 7 Jul 16 13:04 /dev/mapper/myvg-mylv-> ../dm-2
掛載邏輯卷 mylv
[root@Node1 ~]# mount -t ext4 /dev/myvg/mylv /mydata/ [root@Node1 ~]# mount | grep "mylv\>" /dev/mapper/myvg-mylv on /mydata type ext4 (rw)
或
[root@Node1 ~]# mount -t ext4 /dev/mapper/myvg-mylv /mydata/ [root@Node1 ~]# mount | grep "mylv\>" /dev/mapper/myvg-mylv on /mydata type ext4 (rw)
二、假如,邏輯卷 mylv 沒有多少剩餘空間了,怎麼擴展它的大小呢?
擴展條件:
卷組myvg必需有足夠大的剩餘空間提供給擴展使用 否則的話就要擴展卷組的大小了。 做邏輯卷擴展時,要先擴展物理邊界,再擴展邏輯邊界。
擴展邏輯卷的步驟如下圖如示:
1、 先查看卷組myvg的使用情況?
root@Node1 ~]# vgdisplay myvg | grep "VG[[:space:]]Size" VG Size 2.00 GiB [root@Node1 ~]# lvdisplay /dev/myvg/mylv | grep"LV[[:space:]]Size" LV Size 2.00 GiB
2、 假如,我們要把邏輯卷mylv擴展爲 4GB 大小。
從上面可以看得出卷組myvg已經使用完了,我們必需先擴展卷組myvg,再擴展邏輯卷 mylv.
先往該卷組中加入PV
[root@Node1 ~]# pvcreate /dev/sdb4 Physical volume "/dev/sdb4" successfully created
把剛創建的pv加入到卷組myvg中來:
未加入前,myvg的大小
[root@Node1 ~]# vgdisplay myvg | grep "VG[[:space:]]Size" VG Size 2.00 GiB
把/dev/sdb4加入卷組myvg
[root@Node1 ~]# vgextend myvg /dev/sdb4 Volume group"myvg" successfully extended
加入用戶的PV後,卷組的大小
[root@Node1 ~]# vgdisplay myvg | grep "VG[[:space:]]Size" VGSize 18.47 GiB
3、 卷組myvg已經有足夠的剩餘空間了。接下來進行邏輯卷的擴展
(1)、首先擴展邏輯卷 mylv的物理邊界
[root@Node1 ~]# lvextend -L 4G/dev/myvg/mylv Extending logical volume mylv to 4.00 GiB Logical volume mylv successfully resized [root@Node1 ~]# lvdisplay/dev/myvg/mylv | grep"LV[[:space:]]Size" LVSize 4.00 GiB
但是查看實際可用的磁盤空間還是2GB.
[root@Node1 ~]# df -h | grep -A 1"mylv\>" /dev/mapper/myvg-mylv 2.0G 67M 1.9G 4% /mydata
(2)、物理邊界擴展成功以後纔可以擴展邏輯卷mylv的邏輯邊界
[root@Node1 ~]# resize2fs -p /dev/myvg/mylv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/myvg/mylv is mounted on/mydata; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of/dev/myvg/mylv to 1048576 (4k) blocks. The filesystem on /dev/myvg/mylv is now1048576 blocks long. [root@Node1 ~]# echo $? 0
擴展邏輯邊界以後,看看是否擴展成功
[root@Node1 ~]# df -h | grep -A 1"mylv\>" /dev/mapper/myvg-mylv 4.0G 771M 3.0G 21% /mydata
三、使用邏輯卷的“快照”功能進行在線備份
其實,創建快照的過程就是備份數據的過程。
假如,我們創建快照耗時 10S, 而我們的應用每秒鐘會增加100M的數據量。
那麼,我們的快照卷大小至少需要:原卷的數據大小 + 10*100M
創建快照卷的條件:
快照卷必需要和原卷在同一個卷組當中。 卷組有足夠的剩餘空間使用 快照卷是隻讀的,爲了保證數據的一致性,在創建快照卷時指定是隻讀的 掛載快照卷以只讀方式掛載
創建快照卷的方法:
lvcreate -L 快照卷的大小 -s -p r -n 快照卷名稱 對哪個邏輯捲進行快照 -p 指定權限。讀寫 -n 快照卷的名字 -s 表示創建的是快照卷
[root@Node1 ~]# mount -o remount,ro /dev/myvg/mylv /mydata/ \ lvcreate -L 4G -n back-snap -p r -s/dev/myvg/mylv \ mount -oremount,rw /dev/myvg/mylv /mydata Logical volume"back-snap" created
說明:
創建快照卷要先對原卷施加讀鎖,然後再創建快照卷。等到快照卷創建完成以後再對原卷施加讀寫鎖。創建快照卷的時間很短,對在線業務幾乎沒有影響。我們稱這種備份數據的方法爲:溫備。
掛載並查看,快照卷的數據大小和原卷是不是一樣?
[root@Node1 ~]# mount -r/dev/mapper/myvg-back--snap /backup/ [root@Node1 ~]# df -h | grep -A 1"myvg" /dev/mapper/myvg-mylv 4.0G 1.8G 2.1G 47% /mydata /dev/mapper/myvg-back--snap 4.0G 1.8G 2.1G 47% /backup