摘要: Linux 用戶安裝Linux 操作系統時遇到的一個最常見的難以決定的問題就是如何正確地給評估各分區大小,以分配合適的硬盤空間。而遇到出現某個分區空間耗盡時,解決的方法通常是使用符號鏈接,或者使用調整分區大小的工具( 比如Patition Magic 等) ,但這都只是暫時解決辦法,沒有根本解決問題。隨着Linux 的邏輯盤卷管理功能的出現,這些問題都迎刃而解,本文就深入討論LVM 技術,使得用戶在無需停機的情況下方便地調整各個分區大小。
一、 前言
每個Linux 使用者在安裝Linux 時 都會遇到這樣的困境:在爲系統分區時,如何精確評估和分配各個硬盤分區的容量,因爲系統管理員不但要考慮到當前某個分區需要的容量,還要預見該分區以後可 能需要的容量的最大值。因爲如果估計不準確,當遇到某個分區不夠用時管理員可能甚至要備份整個系統、清除硬盤、重新對硬盤分區,然後恢復數據到新分區。
雖然現在有很多動態調整磁盤的工具可以使用,例如Partation Magic 等等,但是它並不能完全解決問題,因爲某個分區可能會再次被耗盡;另外一個方面這需要重新引導系統才能實現,對於很多關鍵的服務器,停機是不可接受的,而且對於添加新硬盤,希望一個能跨越多個硬盤驅動器的文件系統時,分區調整程序就不能解決問題。
因此完美的解決方法應該是在零停機前提下可以自如對文件系統的大小進行調整,可以方便實現文件系統跨越不同磁盤和分區。幸運的是Linux 提供的邏輯盤卷管理(LVM ,Logical Volume Manager )機制就是一個完美的解決方案。
LVM 是邏輯盤卷管理(Logical Volume Manager )的簡稱,它是Linux 環境下對磁盤分區進行管理的一種機制,LVM 是建立在硬盤和分區之上的一個邏輯層,來提高磁盤分區管理的靈活性。通過LVM 系統管理員可以輕鬆管理磁盤分區,如:將若干個磁盤分區連接爲一個整塊的卷組(volume group ),形成一個存儲池。管理員可以在卷組上隨意創建邏輯卷組(logical volumes ),並進一步在邏輯卷組上創建文件系統。管理員通過LVM 可以方便的調整存儲卷組的大小,並且可以對磁盤存儲按照組的方式進行命名、管理和分配,例如按照使用用途進行定義:“development” 和“sales” ,而不是使用物理磁盤名“sda” 和“sdb” 。而且當系統添加了新的磁盤,通過LVM 管理員就不必將磁盤的文件移動到新的磁盤上以充分利用新的存儲空間,而是直接擴展文件系統跨越磁盤即可。
二、 LVM 基本術語
前面談到,LVM 是在磁盤分區和文件系統之間添加的一個邏輯層,來爲文件系統屏蔽下層磁盤分區佈局,提供一個抽象的盤卷,在盤捲上建立文件系統。首先我們討論以下幾個LVM 術語:
- 物理存儲介質(The physical media
)
這裏指系統的存儲設備:硬盤,如:/dev/hda 、/dev/sda 等等,是存儲系統最低層的存儲單元。 - 物理卷(physical volume
)
物理卷就是指硬盤分區或從邏輯上與磁盤分區具有同樣功能的設備( 如RAID) ,是LVM 的基本存儲邏輯塊,但和基本的物理存儲介質(如分區、磁盤等)比較,卻包含有與LVM 相關的管理參數。 - 卷組(Volume Group
)
LVM 卷組類似於非LVM 系統中的物理硬盤,其由物理卷組成。可以在卷組上創建一個或多個“LVM 分區” (邏輯卷),LVM 卷組由一個或多個物理卷組成。 - 邏輯卷(logical volume
)
LVM 的邏輯卷類似於非LVM 系統中的硬盤分區,在邏輯卷之上可以建立文件系統( 比如/home 或者/usr 等) 。 - PE
(physical extent
)
每一個物理卷被劃分爲稱爲PE(Physical Extents) 的基本單元,具有唯一編號的PE 是可以被LVM 尋址的最小單元。PE 的大小是可配置的,默認爲4MB 。 - LE
(logical extent
)
邏輯卷也被劃分爲被稱爲LE(Logical Extents) 的可被尋址的基本單位。在同一個卷組中,LE 的大小和PE 是相同的,並且一一對應。
首先可以看到,物理卷(PV )被由大小等同的基本單元PE 組成。
一個卷組由一個或多個物理卷組成,
從上圖可以看到,PE 和LE 有着一一對應的關係。邏輯卷建立在卷組上。邏輯卷就相當於非LVM 系統的磁盤分區,可以在其上創建文件系統。
下圖是磁盤分區、卷組、邏輯卷和文件系統之間的邏輯關係的示意圖:
和非LVM 系統將包含分區信息的元數據保存在位於分區的起始位置的分區表中一樣,邏輯卷以及卷組相關的元數據也是保存在位於物理捲起始處的VGDA( 卷組描述符區域) 中。VGDA 包括以下內容: PV 描述符、VG 描述符、LV 描述符、和一些PE 描述符 。
系統啓動LVM 時激活VG ,並將VGDA 加載至內存,來識別LV 的實際物理存儲位置。當系統進行I/O 操作時,就會根據VGDA 建立的映射機制來訪問實際的物理位置。
三、 安裝LVM
首先確定系統中是否安裝了lvm 工具:
[root@www root]# rpm –qa|grep lvm
lvm-1.0.3-4
如果命令結果輸入類似於上例,那麼說明系統已經安裝了LVM 管理工具;如果命令沒有輸出則說明沒有安裝LVM 管理工具,則需要從網絡下載或者從光盤裝LVM rpm 工具包。
安裝了LVM 的RPM 軟件包以後,要使用LVM 還需要配置內核支持LVM 。RedHat 默認內核是支持LVM 的,如果需要重新編譯內核,則需要在配置內核時,進入Multi-device Support (RAID and LVM) 子菜單,選中以下兩個選項:
[*] Multiple devices driver support (RAID and LVM)
<*> Logical volume manager (LVM) Support
然後重新編譯內核,即可將LVM 的支持添加到新內核中。
爲了使用LVM ,要確保在系統啓動時激活LVM ,幸運的是在RedHat7.0 以後的版本,系統啓動腳本已經具有對激活LVM 的支持,在/etc/rc.d/rc.sysinit 中有以下內容:
# LVM initialization
if [ -e /proc/lvm -a -x /sbin/vgchange -a -f /etc/lvmtab ]; then
action $"Setting up Logical Volume Management:" /sbin/vgscan && /sbin/vgchange -a y
fi
其中關鍵是兩個命令,vgscan 命令實現掃描所有磁盤得到卷組信息,並創建文件卷組數據文件/etc/lvmtab 和/etc/lvmtab.d/* ;vgchange -a y 命令激活系統所有卷組。
四、 創建和管理LVM
要創建一個LVM 系統,一般需要經過以下步驟:
1 、 創建分區
使用分區工具(如:fdisk 等)創建LVM 分區,方法和創建其他一般分區的方式是一樣的,區別僅僅是LVM 的分區類型爲8e 。
2 、 創建物理卷
創建物理卷的命令爲pvcreate ,利用該命令將希望添加到卷組的所有分區或者磁盤創建爲物理卷。將整個磁盤創建爲物理卷的命令爲:
# pvcreate /dev/hdb
將單個分區創建爲物理卷的命令爲:
# pvcreate /dev/hda5
3 、 創建卷組
創建卷組的命令爲vgcreate ,將使用pvcreate 建立的物理卷創建爲一個完整的卷組:
# vgcreate web_document /dev/hda5 /dev/hdb
vgcreate 命令第一個參數是指定該卷組的邏輯名:web_document 。後面參數是指定希望添加到該卷組的所有分區和磁盤。vgcreate 在創建卷組 web_document 以外,還設置使用大小爲4 MB 的PE (默認爲4MB ),這表示卷組上創建的所有邏輯卷都以 4 MB 爲增量單位來進行擴充或縮減。由於內核原因,PE 大小決定了邏輯卷的最大大小,4 MB 的PE 決定了單個邏輯卷最大容量爲 256 GB ,若希望使用大於256G 的邏輯卷則創建卷組時指定更大的PE 。PE 大小範圍爲8 KB 到 512 MB ,並且必須總是 2 的倍數(使用-s 指定,具體請參考man vgcreate )。
4 、 激活卷組
爲了立即使用卷組而不是重新啓動系統,可以使用vgchange 來激活卷組:
# vgchange -a y web_document
5 、 添加新的物理捲到卷組中
當系統安裝了新的磁盤並創建了新的物理卷,而要將其添加到已有卷組時,就需要使用vgextend 命令:
# vgextend web_document /dev/hdc1
這裏/dev/hdc1 是新的物理卷。
6 、 從卷組中刪除一個物理卷
要從一個卷組中刪除一個物理卷,首先要確認要刪除的物理卷沒有被任何邏輯卷正在使用,就要使用pvdisplay 命令察看一個該物理卷信息:
如果某個物理卷正在被邏輯卷所使用,就需要將該物理卷的數據備份到其他地方,然後再刪除。刪除物理卷的命令爲vgreduce :
# vgreduce web_document /dev/hda1
7 、 創建邏輯卷
創建邏輯卷的命令爲lvcreate :
# lvcreate -L1500 –nwww1 web_document
該命令就在卷組web_document 上創建名字爲www1 ,大小爲1500M 的邏輯卷,並且設備入口爲/dev/web_document/www1 (web_document 爲卷組名,www1 爲邏輯卷名)。如果希望創建一個使用全部卷組的邏輯卷,則需要首先察看該卷組的PE 數,然後在創建邏輯卷時指定:
# vgdisplay web_document| grep "Total PE"
Total PE 45230
# lvcreate -l 45230 web_document -n www1
8 、 創建文件系統
筆者推薦使用reiserfs 文件系統,來替代ext2 和ext3 :
創建了文件系統以後,就可以加載並使用它:
# mkdir /data/wwwroot
# mount /dev/web_document/www1 /data/wwwroot
如果希望系統啓動時自動加載文件系統,則還需要在/etc/fstab 中添加內容:
/dev/web_document/www1 /data/wwwroot reiserfs defaults 1 2
9 、 刪除一個邏輯卷
刪除邏輯卷以前首先需要將其卸載,然後刪除:
# umount /dev/web_document/www1
# lvremove /dev/web_document/www1
lvremove -- do you really want to remove "/dev/web_document/www1"? [y/n]: y
lvremove -- doing automatic backup of volume group "web_document"
lvremove -- logical volume "/dev/web_document/www1" successfully removed
10 、 擴展邏輯卷大小
用慣了傳統調整硬盤工具的人可能會認爲文件系統和硬盤的分區之間是統一的,實際上他們之間並不是完整的整體
(
這也就是爲什麼
BSD
可以在一個硬盤分區裏面製作多個文件系統分區
)
。想像一下帶有移動式書架的書櫥。你可以通過移動式書架調整書櫥裏面書籍的位置。把書當成文件系統,你可以在書櫥裏面放滿書籍,也可以通過移動式書架調整書櫥的空間。當然也可以通過書架調整書櫥裏面書籍存放的位置。如下圖所示:
|<-- hda1--- ->|<-- hda2------>|
+---------------+---------------+
|xxxxxxxxxxx|xxxxxx| |
|xxxxxxxxxxx|xxxxxx| |
+---------------+---------------+
硬盤分區
/dev/hda1
中的文件系統佔滿了整個分區,而
/dev/hda2
中的文件系統只佔用了
2/3
左右的分區。
所以在調整邏輯卷容量大小的同時也要調整在該捲上的文件系統的大小,當要增大容量時,先調整容量,後調整文件系統,若要縮小容量則反之。
LVM 提供了方便調整邏輯卷大小的能力,擴展邏輯卷大小的命令是lvextend :
# lvextend -L12G /dev/web_document/www1
lvextend -- extending logical volume "/dev/web_document/www1" to 12 GB
lvextend -- doing automatic backup of volume group "web_document "
lvextend -- logical volume "/dev/web_document/www1" successfully extended
上面的命令就實現將邏輯卷www1 的大小擴招爲12G 。
# lvextend -L+1G /dev/web_document/www1
lvextend -- extending logical volume "/dev/web_document/www1" to 13 GB
lvextend -- doing automatic backup of volume group "web_document "
lvextend -- logical volume "/dev/web_document/www1" successfully extended
上面的命令就實現將邏輯卷www1 的大小增加1G 。
增加了邏輯卷的容量以後,就需要修改文件系統大小以實現利用擴充的空間。筆者推薦使用reiserfs 文件系統來替代ext2 或者ext3 。因此這裏僅僅討論reiserfs 的情況。Reiserfs 文件工具提供了文件系統大小調整工具:resize_reiserfs 。對於希望調整被加載的文件系統大小:
# resize_reiserfs -f /dev/web_document/www1
一般建議最好將文件系統卸載,調整大小,然後再加載:
# umount /dev/web_document/www1
# resize_reiserfs /dev/web_document/www1
# mount -treiserfs /dev/web_document/www1 /data/wwwroot
對於使用ext2 或ext3 文件系統的用戶可以考慮使用工具
ext2resize 。http://sourceforge.net/projects/ext2resize
11 、 減少邏輯卷大小
使用lvreduce 即可實現對邏輯卷的容量,同樣需要首先將文件系統卸載:
# umount /data/wwwroot
# resize_reiserfs -s-2G /dev/web_document/www1
# lvreduce -L-2G /dev/web_document/www1
# mount -treiserfs /dev/web_document/www1 /data/wwwroot
五、 總結
根據上面的討論可以看到,LVM 具有很好的可伸縮性,使用起來非常方便。可以方便地對卷組、邏輯卷的大小進行調整,更進一步調整文件系統的大小。如果希望瞭解更多信息,請參考LVM-HOWTO 。