在安裝Linux的時候,通常遇到的一個比較頭痛的問題就是分區,到底每個區該分多少,用了一段時間之后,某個分區又不夠用了,該怎么辦?如果是普通的服 務器,那一切都好說,大不了就關機重新划分分區嘛,但是對於有些關鍵的服務器,別說關機,就是停止服務都是不可忍受的。例如:一個虛擬主機服務提供商,本 來給/home划了100G空間,在剛開始的第一年,一切都還好,空間夠用,等到了第二年,開始搞促銷,結果兩個月之后,/home分區就只剩下1GB 了,而且/var分區估計1個月后也要用完了,怎么辦?有沒有在不停止服務的前提下,就能動態增加硬盤空間的技術?有,這就是Linux下LVM技術的來 歷。
LVM 全稱為Logical Volume Management,它是Linux環境下對磁盤分區進行管理的一種機制,它通過在硬盤和分區上建立一個抽象的邏輯層,來屏蔽分區大小,磁盤空間給用戶 帶來的困難。在LVM中,可以將多個磁盤分區組做成一個存儲池,管理員可以在此存儲池上隨意創建邏輯卷組,再mount到相應的掛載點上去,從而達成動態 增加磁盤空間的目的。例如上邊的這個例子,當/home分區不夠大時,可把磁盤的一部分空間mount到/home上去,這樣的話,就可以實現零當機時間 來調整磁盤了。
在開始LVM配置之前,先簡述幾個基本概念和術語:
1. 物理存儲介質:
指的是物理的硬盤,在/dev目錄下看到的sda,sdb,sdc,hda,hdb,hdc等。
2. 物理卷(Pisical Volume):
指的是物理硬盤上的分區或邏輯上與磁盤分區具有相同功能能的設備,是LVM的基本存儲塊,但和分區來比,卻包含了與LVM管理相關的參數。這個就是前面講的存儲池。
3. 卷組(Volume Group):
LVM的卷組類似於物理硬盤,卷組上邊可以建立多個虛擬的“分區”,LVM卷組由一個或多個物理卷組成。
4. 邏輯卷(Logical Volume):
LVM的邏輯卷類似於非LVM系統中的硬盤分區,在邏輯卷上邊可以建立文件系統,用於mount到不同的掛載點,提升分區空間——這是真正跟用戶打交道的部分。
5. PE (Physical Extent)
每一個物理卷被划分為一個個的基本存儲單元,每一個PE都具有唯一的編址(這個東西類似於物理硬盤上的磁盤地址)。PE的大小默認為4MB。
6. LE(Logical Extent)
每一個邏輯卷也被划分為一個個的基本存儲單元,每一個LE也具有一個唯一的編址。在同一個卷組中,LE和PE的大小是相等的。
綜上所述,進行一個總結就是,一個或者多個物理硬盤上都可以划分出一個或者多個LVM分區,然后這些分區可以組成一個物理卷(PV),形成一個存儲池。用 戶把這個存儲池划分出來一個或者多個LV,掛載到不同的分區上去使用,這個就是LVM的基本原理,也是建立LVM的過程。
結合上邊那個例子,如果要為/home和/var分區增加空間,則要有如下步驟:
1. 給服務器裝上2塊新硬盤
2. 把新硬盤進行分區,並標記為LVM分區
3. 把2塊新硬盤上的LVM分區合並起來,組成一個新的物理卷(PV)
4. 把物理卷划分成兩個邏輯卷(LV):名字分別是home和var
5. 在這兩個邏輯卷上建立文件系統
6. 把這兩個邏輯卷掛載到/home和/var上去
現在,開始進行LVM的實踐,本文的例子在VMware中進行,磁盤空間只有8GB,和上邊的例子不同。
在這台server中,安裝了1塊硬盤,其分區大小如下:
swap: 384M
/boot:100M
/home:2GB
/var:2GB
/:其余所有空間
現在,發現/home的空間不夠了,/var也在告急,於是,我決定為這台Server安裝LVM,擴充空間。
【第一步】
關閉虛擬機,增加兩塊硬盤,兩塊硬盤的大小均為8GB。由於這是虛擬機,沒辦法熱插拔硬盤,所以只能關機,如果是實體服務器,具備熱插拔硬盤接口的,自然就可以省去這一步
【第二步】
再次開機之后,可以在/dev目錄下看到新增加的兩塊硬盤sdb和sdc,原來的那塊是sda。
首先,先安裝LVM管理軟件:
- $sudo apt-get install lvm2
然后,查看一下當前系統中的硬盤:
- $sudo fdisk -l
可以看到當前系統中有3塊硬盤了。
然后,對sdb進行分區:
- $sudo fdisk /dev/sdb
系統提示:
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0xc3a40868.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won’t be recoverable.
Warning: invalid flag 0×0000 of partition table 4 will be corrected by w(rite)
Warning: DOS-compatible mode is deprecated. It’s strongly recommended to switch off the mode (command ‘c’) and change display units to sectors (command ‘u’)
不管這個提示,現在開始,在Command(m for help):后輸入n,這代表創建新分區
然后系統會提示:
e extend
p primary partition
e代表要創建的是擴展分區,p代表要創建的是主分區。這里輸入p,創建主分區。
系統提示partition number(1-4):,我要把這塊硬盤的全部空間都分配給/home,不做它用,所以只分1個區就夠了,在此處輸入1。
然后系統提示First cylinder (1-1044, default 1):默認從第一個柱面開始,這里直接回車就OK。
然后系統提示
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-1044, default 1044)
這里是分區大小了,我打算把所有空間全部分配給這個分區,所以直接輸入:1044,就把全部空間分配完了。
然后使用p命令,打印出來當前的分區情況。
Device Boot Start End Blocks Id System
/dev/sdb1 1 1044 8385898+ 83 Linux
然后,可以看到這個分區的類型是Linux,現在要把它改為LVM,使用t命令:
系統提示:Hex code (type L to list codes): ,然后輸入L命令,查看所有的代碼。在系統打印出來的這個表格中,可以看到Linux LVM對應的代碼是8e,在這里輸入8e,標記完成。這一步做完之后,這塊硬盤就算是OK了,記得使用w命令保存。
然后用同樣的方法,把/dev/sdc也做一遍。
【第三步】
現在,系統中有了兩塊新的硬盤:sdb和sdc,並且在上邊都建立了LVM分區sdb1和sdc1,現在要做的,就是把這兩塊硬盤上的兩個LVM分區,加入到物理卷(Physical Volume)中去。使用命令:
- $sudo pvcreate /dev/sdb1 /dev/sdc1
系統提示:
Physical volume “/dev/sdb1″ successfully created
Physical volume “/dev/sdc1″ successfully created
要刪除某個分區也很簡單,使用命令:
- $sudo pvremove /dev/sdb1
這條命令就可以把/dev/sdb1從物理卷中刪除掉了。
創建之后,可以使用pvdisplay命令來查看物理卷的狀態:
- $pvdisplay
【第四步】
物理卷(PV)創建完畢之后,就把這些分散在一個個的物理硬盤上的LVM分區組成了一個存儲池。
現在開始創建邏輯卷組(Volume Group),這個邏輯層將屏蔽掉硬盤、分區,使用戶透明地使用LVM功能管理磁盤,使用命令:
- $sudo vgcreate extspace /dev/sdb1 /dev/sdc1
系統提示:
Volume group “extspace” successfully created
這樣就創建了一個名稱為extspace的邏輯卷,創建完畢之后,可以在/dev目錄下看到一個名為extspace的設備。
*注:如果已經存在了一個物理卷fileserver,把新的硬盤分區/dev/sdb1加入到該邏輯卷組,其命令是:
- $sudo vgextend fileserver /dev/sdb1
當創建了一個邏輯卷組extspace后,刪除它的命令是:
- $sudo vgremove extspace
查看邏輯卷組的命令是:
- $sudo vgdisplay
或
- $sudo vgscan
【第五步】
邏輯卷組(VG)創建好了,現在在上邊創建邏輯卷,我將要創建兩個邏輯卷,一個叫home_ext,一個叫var_ext,望文生義,一個用來增加/home分區的空間,一個用於增加/var分區的空間。
使用命令:
- $sudo lvcreate --name home_ext --size 8G extspace
- $sudo lvcreate --name var_ext --size 8G extspace
這兩條命令很簡單,意思就是,在邏輯卷組(VG)上創建兩個大小均為8GB的邏輯卷(LV),其名稱分別為home_ext,var_ext
完成之后,系統會提示:
Logical volume “home_ext” created
Logical volume “var_ext” created
使用如下命令可以查看邏輯卷(LV)的情況:
- $sudo lvdisplay
系統的輸出結果很容易看懂,分別是兩個邏輯卷的參數。創建完畢之后,可以在/dev/extspace/下看到兩個設備,分別叫home_ext和var_ext
如果要刪除邏輯卷,同樣很簡單,使用命令:
- $sudo lvremove /dev/extspace/home_ext
這就刪除掉了剛才創建的邏輯卷home_ext。
【第六步】
邏輯卷(LV)創建完畢之后,基本上工作就做完了90%,只需要往掛載點上mount就可以了,在mount之前,如果對邏輯卷的空間大小、名稱不滿意,還可以修改(當然可以使用刪掉重建的辦法),LVM提供了相應的命令:
- $sudo lvextend -L 10G /dev/extspace/home_ext
這條命令把名為home_ext的邏輯卷(LV)的空間大小增至10G(本例中無法增加,因為創建LVM分區的時候已經使用了所有磁盤空間了)
- $sudo lvreduce -L 4G /dev/extspace/home_ext
這條命令把home_ext的邏輯卷(LV)的空間大小縮減至4G
- $sudo lvrename extspace/home_ext home_ext1
這條命令把extspace卷組中的邏輯卷(LV)home_ext改名為home_ext1
【第七步】
接下來,就是要在邏輯卷上創建文件系統了,這個文件系統是要和掛載點的文件系統一致的,我沒有嘗試過在ext4文件系統上掛載FAT32是什么效果,反正我做的都是相同的文件系統。
首先,把home_ext做成ext4文件系統,我的/home分區是ext4的
- $sudo mkfs.ext4 /dev/extspace/home_ext
再把var_ext做成ext4文件系統,我的/var分區也是ext4的
- $sudo mkfs.ext4 /dev/extspace/var_ext
做好之后,就可以掛載邏輯卷了。
- $sudo mount /dev/extspace/home_ext /home
- $sudo mount /dev/extspace/var_ext /var
至此,空間不足的問題得以解決!
可以查看掛載的文件系統,使用df -h命令。
【第八步】
到第七步就完成了LVM的配置,但是考慮到服務器也會有重啟的時候,而重啟之后,這幾個邏輯卷是不會自動掛載的,所以需要修改/etc/fstab文件(修改之前先保留一個備份):
- $sudo vi /etc/fstab
增加如下幾行:
- /dev/extspace/home_ext /home ext4 rw,noatime 0 0
- /dev/extspace/var_ext /var ext4 rw,noatime 0 0
重啟驗證,一切正常。
參考鏈接:
http://forum.ubuntu.org.cn/viewtopic.php?f=54&t=254335&p=2213398
http://baike.baidu.com/view/361916.htm
http://apipi.blog.163.com/blog/static/422663812008111735941500/
此條目由 Yang Jia 發表在 開源技術 分類目錄,並貼了 Linux、LVM、Ubuntu、邏輯卷管理 標簽。將固定鏈接加入收藏夾。