對于Linux用戶而言,在安裝一臺Linux機器的時候,遇到的問題之一就是給各分區(qū)估計和分派足夠的硬盤空間。無論對一個正在為服務器尋找空間的系統(tǒng)管理員,還是一個磁盤即將用盡的普通用戶來說,這都是一個非常常見的問題。解決的方法通常是使用符號鏈接,或者一些調整分區(qū)大小的工具(比如parted)。但是,這只是一個暫時性的解決辦法,不久,我們又會面臨同樣的問題。
如果你是一個站點的系統(tǒng)管理員,管理著數量眾多的、連接在Internet之上的服務器,那么你每關機一分鐘,都會給公司帶來很大損失。此外,使用這種方法,在修改了分區(qū)表之后,每一次都得重新啟動系統(tǒng)。LVM(邏輯卷管理程序)可以幫助我們解決這些問題。
LVM簡介
Linux LVM可以使管理工作更加輕松。相對于硬盤和分區(qū),LVM是從更高的層次來看待存儲空間的。在使用LVM之前,先來看一些將要使用到的相關概念。
物理卷
物理卷是指硬盤分區(qū)或者從邏輯上看起來和硬盤分區(qū)類似的設備(比如RAID設備)。
邏輯卷
一個或者多個物理卷組成一個邏輯卷。對于LVM而言,邏輯卷類似于非LVM系統(tǒng)中的硬盤分區(qū)。邏輯卷可以包含一個文件系統(tǒng)(比如/home或者/usr)。
卷組
一個或者多個邏輯卷組成一個卷組。對于LVM而言,卷組類似于非LVM系統(tǒng)中的物理硬盤。卷組把多個邏輯卷組合在一起,形成一個可管理的單元。
document.body.clientWidth-450) {this.height=(document.body.clientWidth-450)*this.height/this.width;this.width=document.body.clientWidth-450}" border="0">
LVM工作方式
下面來看一看LVM到底是怎樣工作的。每一個物理卷都被分成幾個基本單元,即所謂的PE(Physical Extents)。PE的大小是可變的,但是必須和其所屬卷組的物理卷相同。在每一個物理卷里,每一個PE都有一個惟一的編號。PE是一個物理存儲里可以被LVM尋址的最小單元。
每一個邏輯卷也被分成一些可被尋址的基本單位,即所謂的LE(Logical Extents)。在同一個卷組中,LE的大小和PE是相同的,很顯然,LE的大小對于一個卷組中的所有邏輯卷來說都是相同的。
在一個物理卷中,每一個PE都有一個惟一的編號,但是對于邏輯卷這并不一定是必需的。這是因為當這些PE ID號不能使用時,邏輯卷可以由一些物理卷組成。因此,LE ID號是用于識別LE以及與之相關的特定PE的。正如前面所提到的,LE和PE之間是一一對應的。每一次存儲區(qū)域被尋址訪問或者LE的ID被使用,都會把數據寫在物理存儲設備之上。
你可能會覺得奇怪,有關邏輯卷和邏輯卷組的所有元數據都存到哪兒去了。類似的在非LVM系統(tǒng)中,有關分區(qū)的數據是存儲在分區(qū)表中,而分區(qū)表被存儲在了每一個物理卷的起始位置。VGDA(卷組描述符區(qū)域)功能就好象是LVM的分區(qū)表,它存儲在每一個物理卷的起始處。
VGDA由以下信息組成:
·一個PV描述符
·一個VG描述符
·LV描述符
·一些PE描述符
當系統(tǒng)啟動LV時,VG被激活,并且VGDA被加載至內存。VGDA幫助識別LV的實際存儲位置。當系統(tǒng)想要訪問存儲設備時,由VGDA建立起來的映射機制就用于訪問實際的物理位置來執(zhí)行I/O操作。
開始工作
下面具體看一看如何使用LVM。
第一步:配置內核。在安裝LVM之前,內核之中應該有LVM模塊,可以使用以下的步驟來完成:
#cd /usr/src/linux
#make menuconfig
選擇Multi-device Support (RAID and LVM)子菜單,選中以下兩個選項:
-
- [*] Multiple devices driver support (RAID and LVM)
- < *> Logical volume manager (LVM) Support.
復制代碼注:如果在安裝Linux系統(tǒng)時已經安裝了LVM相關軟件包,上面幾步操作可以省略掉,直接到第二步.
第二步:檢查驅動器上空閑硬盤空間的總量。這可以通過以下命令來未完成:
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 3.1G 2.7G 398M 87% /
/dev/hda2 4.0G 3.2G 806M 80% /home
/dev/hda5 2.1G 1.0G 1.1G 48% /var
第三步:在硬盤上創(chuàng)建一個LVM分區(qū)。使用fdisk或者其它的分區(qū)工具來創(chuàng)建一個LVM分區(qū)。Linux LVM的分區(qū)類型為8e。
# fdisk /dev/hda
press p (to print the partition table) and n (to create a new partition)
第四步:創(chuàng)建一個物理卷。下述命令將在分區(qū)的起始處創(chuàng)建一個卷組描述符:
# pvcreate /dev/hda6
pvcreate -- -physical volume "/dev/hda6" successfully created
# pvcreate /dev/hda7
pvcreate- -- physical volume "/dev/hda7" successfully created
第五步:創(chuàng)建一個卷組。通過下面的方法創(chuàng)建一個新的卷組,并且添加兩個物理卷:
# vgcreate test_lvm /dev/hda6 /dev/hda7
vgcreate- -- INFO: using default physical extent size 4 MB
vgcreate- -- INFO: maximum logical volume size is 255.99 Gigabyte
vgcreate- -- doing automatic backup of volume group "test_lvm"
vgcreate- -- volume group "test_lvm" successfully created and activated
上述命令將創(chuàng)建一個名為test_lvm,包含有/dev/hda6和/dev/hda7兩個物理卷的卷組。使用下面命令來激活卷組:
# vgchange -ay test_lvm
使用“vgdisplay”命令來查看所建立卷組的細節(jié)信息。
# vgdisplay
--- Volume group ---
VG Name test_lvm
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 0
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 3.91 GB
PE Size 4 MB
Total PE 1000
Alloc PE / Size 256 / 1 GB
Free PE / Size 744 / 2.91 GB
VG UUID T34zIt-HDPs-uo6r-cBDT-UjEq-EEPB-GF435E
第六步:創(chuàng)建一個邏輯卷。使用lvcreate命令在卷組中創(chuàng)建一個邏輯卷:
# lvcreate -L2G -nlogvol1 test_lvm
第七步:創(chuàng)建文件系統(tǒng)。在該邏輯卷上選擇使用reiserfs日志文件系統(tǒng):
# mkreiserfs /dev/test_lvm/logvol1
使用mount命令來加載新創(chuàng)建的文件系統(tǒng)。
# mount -t reiserfs /dev/test_lvm/logvol1 /mnt/lv1
第八步:在/etc/fstab和/etc/lilo.conf中添加一個入口。在/etc/fstab中加入以下入口,在啟動時加載文件系統(tǒng):
/dev/test_lvm/logvol1 /mnt/lv1 reiserfs defaults 1 1
如果沒有覆蓋原來的內核,那么拷貝一份重新編譯后的內核,并且在啟動時選擇是否使用LVM。下面是LILO文件的內容:
image = /boot/lvm_kernel_image
label = linux-lvm
root = /dev/hda1
initrd = /boot/init_image
ramdisk = 8192
添加以上內容后,使用以下命令重新加載LILO:
#/sbin/lilo
第九步:修改邏輯卷的大小??梢允褂胠vextend命令方便地修改邏輯卷的大小,增加邏輯卷大小的方法如下:
# lvextend -L 1G /dev/test_lvm/logvol1
lvextend -- extending logical volume "/dev/test_lvm/logvol1" to 3GB
lvextend -- doing automatic backup of volume group "test_lvm"
lvextend -- logical volume "/dev/test_lvm/logvol1" successfully extended
類似的,減小邏輯卷大小的方法如下:
- # lvreduce -L-1G /dev/test_lvm/lv1
- lvreduce -- -Warning: reducing active logical volume to 2GB
- lvreduce- -- This may destroy your data (filesystem etc.)
- lvreduce -- -do you really want to reduce "/dev/test_lvm/lv1"? [y/n]: y
- lvreduce- -- doing automatic backup of volume group "test_lvm"
- lvreduce- -- logical volume "/dev/test_lvm/lv1" successfully reduced
復制代碼總結
從上面的討論可以看到,LVM具有很好的可擴展性,并且使用起來很直觀。一旦卷組建立起來以后,根據需求調整每一個邏輯卷的大小也非常容易。
LVM操作的相關命令:
fdisk -l :查看系統(tǒng)中都認到了那些物理硬盤
pvdisplay:查看系統(tǒng)中已經創(chuàng)建好的物理卷
pvcreate:創(chuàng)建一個新的物理卷
pvremove:刪除一個物理卷(也就是從物理卷中刪除一個LVM標簽)
vgdisplay:查看系統(tǒng)中的卷組
vgcreate:創(chuàng)建一個新的卷組
vgreduce:從卷組中刪除一個物理卷(也就是縮小卷組)
vgremove:刪除一個卷組
lvdisplay:查看系統(tǒng)中已經創(chuàng)建好的邏輯卷
lvcreate:創(chuàng)建一個新的邏輯卷
lvreduce:縮小邏輯卷(也就是從一個邏輯卷中減少一些LE)
lvremove:從系統(tǒng)中刪除一個邏輯卷
mkfs:基于邏輯卷創(chuàng)建一個相應類型的文件系統(tǒng)
mkdir -p $mount_piont:創(chuàng)建一個掛載目錄
創(chuàng)建好的文件系統(tǒng)位于:
/dev/$create_vg_name/$lv_name
mount /dev/$create_vg_name/$lv_name $mount_piont:掛載文件系統(tǒng)
vgscan:讀取系統(tǒng)中創(chuàng)建的所有卷組
vgchange -a y :激活所有卷組 (開機執(zhí)行,redhat可在/etc/rc.d/rc.sysinit系統(tǒng)啟動初始化腳本里可以找到)
vgchange -a n :關閉所有卷組(提示:必須在umount所有的文件系統(tǒng)后,才能成功執(zhí)行
裸設備使用:
1.先lvreate
2. raw /dev/raw/raw0 /dev/mapper/vgname-lvname
3.修改 /etc/sysconfig/rawdevices,添加:
/dev/raw/raw0 /dev/mapper/vgname-lvname
4.執(zhí)行命令; service rawdevices restart,使得/etc/sysconfig/rawdevices文件中的裸設備配置生效
5.執(zhí)行/sbin/schkconfig rawdevices on 使得系統(tǒng)重啟后,裸設備能自動加載
6.修改裸設備的屬主,使得相應權限的用戶對裸設備有讀寫權限
chown -R owner:group /dev/raw/raw0
7.將修改裸設備屬主修改命令加入到系統(tǒng)啟動執(zhí)行腳本/etc/rc.local中,使得系統(tǒng)啟動后裸設備的屬主保持不變.
以上命令和操作都需要root權限來執(zhí)行,具體使用方法就不詳細介紹了,可以使用man手冊.