在 我前一篇 LVM 文章 中,我解釋了 LVM 背后的概念。現(xiàn)在該是發(fā)揮 LVM 作用的時候了。在本文中,我將在官方 Gentoo Linux web/cvs/email 服務器 -- cvs.gentoo.org -- 上設置 LVM。盡管 cvs.gentoo.org 只有一個硬盤,但靈活性很強的 LVM 仍然令人難以置信地提供了比標準靜態(tài)分區(qū)方法好得多的改進。我將為您介紹 LVM 轉換過程的的所有步驟,這樣,如果您有興趣,可以在自己的機器上執(zhí)行類似的轉換。
在開始之前有一個告誡。因為實現(xiàn) LVM 是對系統(tǒng)進行的一項重要的變動(包括創(chuàng)建新分區(qū)和其它一些潛在的冒險操作),所以在開始這一過程之前備份整個系統(tǒng) 不失為 一個好主意。如果您不想進行備份,我希望您能使用一臺沒有什么重要數(shù)據(jù)的測試機器 :) 應該說我在轉換到 LVM 時并沒有遇到任何問題,但最好做好準備以防萬一。
那么,讓我們繼續(xù)。在開始轉換過程之前,我對 cvs.gentoo.org 進行了升級,讓它使用下列軟件包。在我執(zhí)行 LVM 轉換的時候,這些是當時的最新版本(請參閱本文稍后部分的 參考資料):
現(xiàn)在輪到硬盤驅動器了。cvs.gentoo.org 有一個不錯的新的 IBM 45 GB 硬盤驅動器;不過,當我在 cvs 上安裝 Gentoo Linux 時,我只對驅動器中的 10 GB 進行了分區(qū),而將余下的 35 GB 留作“將來的分區(qū)”使用。這些是在不使用 LVM 時耍的一點小計謀 -- 將部分驅動器保留不分區(qū)是一種為今后的擴充作準備的簡單但有效的方式。不過,如果使用 LVM,會有更好的方法。
在過去的幾個星期中,我注意到我的根 ReiserFS 分區(qū)在被緩慢地填滿,這可以從下面的 "df" 輸出中看出:
Filesystem 1k-blocks Used Available Use% Mounted on/dev/hda3 9765200 6989312 2775888 72% /tmpfs 269052 0 269052 0% /dev/shm |
現(xiàn)在,72% 被占滿的根分區(qū)并不構成什么危機,但也決不是一種良好的狀況。ReiserFS 和許多其它文件系統(tǒng)一樣,隨著它越來越滿而開始逐漸減慢速度,在根文件系統(tǒng)被完全填滿、文件系統(tǒng)的性能遭到重創(chuàng)之前,這只是時間問題。
我決定在硬盤驅動器的結尾處使用 LVM,從 35 GB 的當前未分區(qū)空間中創(chuàng)建新邏輯卷來解決這一問題。然后,我會在這個卷上創(chuàng)建一個文件系統(tǒng),并將 /dev/hda3 的大部分內(nèi)容轉移到其中。
如果您考慮在自己的機器上進行類似的轉換,首先需要做的就是在根文件系統(tǒng)上找一個合適的部分轉移到邏輯卷上。對我來說,選擇很容易 -- 我的 /home 樹占用了大約 5.7 GB。通過將 /home 轉移到它自己的 LVM 邏輯卷,我的根文件系統(tǒng)處于大約 20% 容量的位置。因為大多數(shù)新數(shù)據(jù)被添加到 /home,所以我的根文件系統(tǒng)很可能也停留在大約 20% 容量的位置 -- 一種非常健康的狀態(tài)。
在開始轉換之前,首先在硬盤驅動器的結尾處對未使用的空間進行分區(qū)。我使用 cfdisk 創(chuàng)建了一個 35 GB 的分區(qū) (/dev/hda5),然后將分區(qū)的分區(qū)類型設置成 "8E"(正規(guī) LVM 分區(qū)類型)。在這一更改后,我進行了重新引導以強制重新讀取分區(qū)表。在重新引導后,我的分區(qū)表如下:
# sfdisk -lDisk /dev/hda: 89355 cylinders, 16 heads, 63 sectors/trackUnits = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0 Device Boot Start End #cyls #blocks Id System/dev/hda1 * 0+ 247 248- 124960+ 83 Linux/dev/hda2 248 743 496 249984 82 Linux swap/dev/hda3 744 20119 19376 9765504 83 Linux/dev/hda4 20120 89354 69235 34894440 5 Extended/dev/hda5 20120+ 89354 69235- 34894408+ 8e Linux LVM |
既然有了空的 35 GB 的分區(qū),我就準備為 LVM 初始化它。以下是過程 -- 首先,我將 35 GB 初始化成 物理卷;然后,使用這個物理卷創(chuàng)建一個 卷組 ,最后,在卷組上分配一些范圍,創(chuàng)建將包含新文件系統(tǒng)并存放當前 /home 中所有文件的 邏輯卷。
為開始這個過程,我使用 pvcreate 命令將 /dev/hda5 初始化成物理卷:
# pvcreate /dev/hda5pvcreate -- physical volume "/dev/hda5" successfully created |
pvcreate 在 /dev/hda5 上設置一個特殊的“記帳”區(qū)域,稱作 VGDA(“卷組描述符區(qū)域”)。LVM 使用該區(qū)域來記錄物理范圍是如何分配的,以及其它一些操作。
下一步是創(chuàng)建卷組并向該卷組添加 /dev/hda5。卷組將充當范圍池(許多存儲塊)。創(chuàng)建卷組之后,創(chuàng)建所需數(shù)量的邏輯卷。我決定將卷組稱為 "main":
# vgcreate main /dev/hda5vgcreate -- INFO: using default physical extent size 4 MBvgcreate -- INFO: maximum logical volume size is 255.99 Gigabytevgcreate -- doing automatic backup of volume group "main"vgcreate -- volume group "main" successfully created and activated |
vgcreate 命令執(zhí)行幾個操作。除了創(chuàng)建 "main" 卷組以外,它還設置 /dev/hda5,使它使用 4 MB 的范圍,4 GB 是缺省范圍大小。這意味著在卷組上創(chuàng)建的所有邏輯卷都可以以 4 MB 為增量單位來進行擴充或縮減。
由于內(nèi)核限制的原因,范圍大小決定了邏輯卷的最大大小。您可以從上面的輸出中看出,4 MB 的范圍大小決定了邏輯卷大小限制為 256 GB,如果您向卷組添加幾個高容量驅動器,這是很容易達到的邏輯卷組大小。如果每一個卷最后都大于 256 GB,我建議您在運行 vgcreate 時指定更大一些的范圍大小。范圍的大小可以是從 8 KB 到 512 MB 之間的任何值,并且必須總是 2 的倍數(shù)。通過將范圍大小增加到 4 MB 以上,最大的物理卷大小將相應地增加到最大為 1 Petabyte(盡管當今現(xiàn)實世界中,x86 系統(tǒng)上的大小限制是 2 Terabytes)。例如,如果希望使用 32 MB 的范圍創(chuàng)建卷組,我會輸入:
# vgcreate -s 32M main /dev/hda5 |
32 MB 是個合適的范圍大小,因為 32 MB 的顆粒度仍然便于管理,并將引導的最大邏輯卷大小增加到 2 TB。創(chuàng)建卷組之后,可以通過輸入 "vgdisplay" 來查看其信息:
# vgdisplay--- Volume group ---VG Name mainVG Access read/writeVG Status available/resizableVG # 0MAX LV 256Cur LV 0Open LV 0MAX LV Size 255.99 GBMax PV 256Cur PV 1Act PV 1VG Size 33.28 GBPE Size 4 MBTotal PE 8519Alloc PE / Size 0 / 0Free PE / Size 8519 / 33.28 GBVG UUID 2qC2H2-iA8s-qW6F-cwXx-JVIh-I6VC-VVCGmn |
既然有了自己的卷組,我準備創(chuàng)建邏輯卷。我決定在最初時將它的大小設置為 8 GB,并稱它作 "lv_home":
# lvcreate -L8G -nlv_home mainlvcreate -- doing automatic backup of "main"lvcreate -- logical volume "/dev/main/lv_home" successfully created |
然后,在邏輯卷上創(chuàng)建文件系統(tǒng):
# mkreiserfs /dev/main/lv_home <----------- MKREISERFSv2 -----------> Block size 4096 bytes Block count 2097152 Used blocks 8275 Journal - 8192 blocks (18-8209), journal header is in block 8210 Bitmaps: 17, 32768, 65536, 98304, 131072, 163840, 196608, 229376, 262144, 294912, 327680, 360448, 393216, 425984, 458752, 491520, 524288, 557056, 589824, 622592, 655360, 688128, 720896, 753664, 786432, 819200, 851968, 884736, 917504, 950272, 983040, 1015808, 1048576, 1081344, 1114112, 1146880, 1179648, 1212416, 1245184, 1277952, 1310720, 1343488, 1376256, 1409024, 1441792, 1474560, 1507328, 1540096, 1572864, 1605632, 1638400, 1671168, 1703936, 1736704, 1769472, 1802240, 1835008, 1867776, 1900544, 1933312, 1966080, 1998848, 2031616, 2064384 Root block 8211Hash function "r5"ATTENTION: ALL DATA WILL BE LOST ON '/dev/main/lv_home'! (y/n)yjournal size 8192 (from 18)Initializing journal - 0%....20%....40%....60%....80%....100%Syncing..done. |
既然創(chuàng)建了文件系統(tǒng),我就可以在 /mnt/newhome 上安裝它:
# mkdir /mnt/newhome# mount /dev/main/lv_home /mnt/newhome# dfFilesystem 1k-blocks Used Available Use% Mounted on/dev/hda3 9765200 6989840 2775360 72% /tmpfs 291388 0 291388 0% /dev/shm/dev/main/lv_home 8388348 32840 8355508 1% /mnt/newhome |
您可以從上面看出,我?guī)缀鯗蕚鋸椭?/home 中的所有數(shù)據(jù)。在開始之前,我把系統(tǒng)降低到運行級別 1 以確保在復制 /home 中的文件時,沒有用戶或進程能夠訪問或修改它們:
# init 1 |
然后,開始復制文件:
# cp -avx /home/* /mnt/newhome |
復制操作需要大約 10 分鐘的時間完成。然后,我將原始 /home 備份成 /home.old,這只是為在復制過程中有任何錯誤而準備的。創(chuàng)建一個新的安裝點,然后在 /home 上重新安裝新 home:
# cd /# mv home home.old# mkdir home# umount /mnt/newhome# mount /dev/main/lv_home /home |
然后,應該設置服務器以使我的新 /home 分區(qū)可以在每次啟動機器時使用。首先修改 /etc/fstab 以使它包括新的 /home 項:
# /etc/fstab: static file system information.## fs mountpoint type opts dump/pass/dev/hda3 / reiserfs defaults 1 1/dev/main/lv_home /home reiserfs defaults 2 2/dev/hda2 none swap sw 0 0/dev/hda1 /boot reiserfs noauto 0 0/dev/cdrom /mnt/cdrom iso9660 noauto,ro 0 0proc /proc proc defaults 0 0none /dev/pts devpts mode=620 0 0tmpfs /dev/shm tmpfs defaults 0 0 |
然后,我對初始化腳本進行了一些小小改動。我修改了 "checkroot" 啟動腳本,使以下命令可以在根分區(qū)重新安裝讀/寫后立即運行:
/sbin/vgscan/sbin/vgchange -a y |
接下來,我修改了在關機時運行的文件系統(tǒng)卸裝腳本,使以下命令在卸裝了所有文件系統(tǒng) 后立即運行:
/sbin/vgchange -a n |
完成了這些步驟后,我重新引導了機器,讓我高興的是一切都工作正常。在接下去的一天左右的時間里完全沒有問題,隨后我刪除了 /home.old 以釋放根文件系統(tǒng)上的一些空間。太棒了!到 LVM 的轉換成功了。
雖然到 LVM 的轉換有些痛苦,但一旦轉換完成之后,管理文件系統(tǒng)就變得非常簡單。例如,我決定重新調(diào)整新的 /home 邏輯卷大小,向文件系統(tǒng)結尾添加大約 2 GB 的空間。首先,我向 "lv_home" 邏輯卷添加了額外的容量,然后使用 resize_reiserfs 實用程序來擴充文件系統(tǒng),使它可以使用額外的容量。以下是執(zhí)行所有這些操作的兩個命令:
# lvextend -L+2G /dev/main/lv_home# resize_reiserfs -f /dev/main/lv_home |
在大約一秒鐘的時間里,我將 /home 文件系統(tǒng)擴大了 2 GB;令人驚奇的是,我不需要重新引導、降低到運行級別 1,甚至不需要卸裝 /home 來執(zhí)行大小調(diào)整。一切都照常工作。是不是很了不起?下面是我的文件系統(tǒng)的當前狀態(tài):
# dfFilesystem 1k-blocks Used Available Use% Mounted on/dev/hda3 9765200 1413340 8351860 15% //dev/main/lv_home 10485436 5609836 4875600 54% /home |
您可以看出 LVM 的確可以讓管理員的工作輕松許多。我希望在今后能將根文件系統(tǒng)的其它部分轉移到 LVM,最終甚至將我的根文件系統(tǒng)轉換成 LVM 邏輯卷。下面的參考資料可以幫助您了解有關 LVM 的更多知識。
Daniel Bobbins 居住在美國新墨西哥州的阿爾布開克,他是 Gentoo Technologies, Inc. 的總裁兼 CEO、 Gentoo Linux (一種用于 PC 的高級 Linux)和 Portage 系統(tǒng)(用于 Linux 的下一代移植系統(tǒng))的主創(chuàng)人。他還是幾本 Macmillan 出版的書籍 Caldera OpenLinux Unleashed、 SuSE Linux Unleashed 和 Samba Unleashed 的投稿人。Daniel 自二年級起就與計算機結下不解之緣,那時他首先接觸的是 Logo 程序語言,并沉溺于 Pac-Man 游戲中。這也許就是他至今仍擔任 SONY Electronic Publishing/Psygnosis 的首席圖形設計師的原因所在。Daniel 喜歡與妻子 Mary 和新出生的女兒 Hadassah 一起共度時光??赏ㄟ^ drobbins@gentoo.org 與 Daniel 聯(lián)系。