「邏輯卷管理」爲存儲器管理帶來的魔力html
簡介: 在本文中,Daniel 向您介紹了 Linux LVM(邏輯卷管理)背後的概念,並告訴您如何將最新的內核補丁和工具安裝到您的系統上。LVM 可讓您在除機器上的物理存儲資源之外建立邏輯卷。不過,與物理卷不一樣,邏輯卷能夠在系統仍處於運行狀態時擴充和縮減,這樣就爲 Linux 系統管理員提供了他們求之不得的存儲器靈活性。linux
在這一系列中,我要向您介紹如何安裝和使用新的內置在 Linux 2.4 內核中的「邏輯卷管理」支持。若是您之前從未使用過任何形式的 LVM ,那麼您得好好學一學;它是一種很是棒的技術。 在咱們真正設置和運行 LVM 以前,我要解釋一下它到底是什麼以及它是如何工做的。而後,咱們準備對 LVM 作一些測試來充分了解它。web
LVM 介紹服務器
若是您象我同樣,那麼您對 UNIX 和 Linux 的體驗是從 PC 平臺,而不是從大型的商業 UNIX 服務器和工做站上開始的。在基本 PC 上,咱們老是不得不對硬盤驅動器執行分區。使用 PC 的人一般至關了解 fdisk 這樣的在硬盤上建立和刪除主要分區和擴展分區的工具。硬盤分區是一種使人厭煩,但公認是使操做系統設置和運行進程不可或缺的一部分。jsp
由於要作好工做,確實須要精確地估計每一個分區須要多少空間,因此硬盤驅動器分區多是很是煩人的事。若是估計得不許確,Linux 系統極可能會顧此失彼 -- 爲解決這個問題,您甚至可能須要執行整個系統備份、將硬盤清除乾淨,而後將全部數據恢復到新的(可能比原來好一些)分區佈局中。討厭!這些就是系統管理員在一開始就盡力避免的狀況。編輯器
雖然分區曾一度是靜態存儲器的天下,但值得慶幸的是,咱們如今有許多 PC 從新分區工具(PowerQuest 的 Partition Magic 產品就是最流行的一種)。這些工具可讓您用一個特殊磁盤來引導系統,並能夠動態地從新調整分區和文件系統的大小。從新引導後,您就擁有了從新調整過大小的新分區,這樣就有望將您從存儲器危境中解脫出來。這些從新調整分區大小的工具頗有效,並從某種程度上解決了一些存儲器管理問題。但它們是否是就完美了呢?不必定。工具
象 Partition Magic 這樣的工具對於工做站來講很是有效,但對服務器來講就不合適了。首先,它們須要從新引導系統。 而這正是大多數系統管理員儘可能避免的。若是在每次須要調整存儲器(例如,若是每週存儲器調整都須要作很大調整)時不能從新引導機器怎麼辦?若是須要擴充文件系統使它能跨越多個硬盤驅動器會發生什麼,或者若是在容許 Apache 繼續提供 Web 頁面的同時須要動態擴充或縮減卷的存儲容量,您該怎麼作?在一個高度可用的動態環境中,基本的分區大小調整器沒法知足這些要求。對於這樣一些和其它一些狀況,「邏輯卷管理」是一種很是出色(若是不是最完美)的解決方案。佈局
回頁首性能
進入 LVM學習
如今,讓咱們看看 LVM 是如何解決這些問題的。咱們執行下面的三步驟過程來建立 LVM 邏輯卷。首先,咱們須要選擇用於 LVM 的物理存儲器資源。這些一般是標準分區,但也能夠是咱們已建立的 Linux Software RAID 卷。若是使用 LVM 術語,這些存儲器資源稱爲「物理卷」。設置 LVM 的第一步是正確初始化這些分區以使它們能夠被 LVM 系統識別。若是添加物理分區,它還包括設置正確的分區類型,以及運行 pvcreate 命令。
在初始化 LVM 使用的一個或多個物理卷後,能夠繼續進行第二步 -- 建立卷組。您能夠把卷組看做是由一個或多個物理卷所組成的存儲器池。 在 LVM 運行時,咱們能夠向卷組添加物理卷,甚至從中除去它們。不過,咱們不能直接在卷組上安裝或建立文件系統。而是告訴 LVM 使用咱們的卷組存儲器池建立一個或多個「邏輯卷」:
建立 LVM 邏輯卷很是容易,並且一旦建立它之後,咱們就能夠把文件系統放在它上面、安裝它,而後開始使用捲來存儲文件。使用 "lvcreate" 命令來建立邏輯卷,指定新卷的名稱、所但願的卷的大小,以及但願這個特定邏輯卷所屬的卷組。 而後,LVM 系統從咱們指定的卷組中分配存儲量來建立準備使用的新卷。建立新卷後,能夠將 ext2 或 ReiserFS 文件系統放在上面、安裝它,而後照咱們喜歡的方式使用它。
在幕後,LVM 系統以大小相等的「塊」(稱爲「範圍」)爲單位分配存儲量。咱們能夠指定在建立卷組時使用的特定的範圍大小。範圍的大小缺省爲 4Mb,這對於大多數狀況來講至關理想。LVM 的一個好處是在已經安裝了邏輯卷並在使用邏輯卷的狀況下,能夠動態地改變邏輯卷使用的範圍的物理存儲位置(換句話說,就是存儲它們所在的磁盤)。LVM 系統確保邏輯卷在管理員物理地改變存儲位置的同時可以繼續正常操做。
固然,由於全部事物都是在大小相等的範圍之上建立的,因此要爲已存在的邏輯卷分配一些額外的範圍實際上很容易 -- 換句話說,動態「增加」卷:
一旦擴充了邏輯卷,接下來就能夠擴充 ext2 或 ReiserFS 文件系統來利用這一新的磁盤空間。若是使用例如 resize_reiserfs 這樣的程序,也能夠 在已安裝和正使用卷時擴充文件系統!真正使人稱奇的是 -- 使用 LVM 和聯機文件系統擴充實用程序,能夠在改變存儲器配置時再也不須要從新引導系統,甚至不須要下降到運行級別 1。
惟一須要關閉系統的狀況是在須要添加新的物理磁盤時。添加了新磁盤後,能夠將這些新的物理卷添加到卷組中來建立新的範圍補給。
好,讓咱們開始安裝 LVM。LVM 由兩部分組成:內核部分和一套用戶空間工具。爲了開始,先跳到主要 LVM 頁面(請參閱本文稍後部分的 參考資料)並下載能夠找到的最新版本的 LVM tar 文件(當前是 lvm_0.9.1_beta3.tar.gz)。LVM tar 文件包含了全部用戶空間工具以及一組內核補丁程序。這正是使人感興趣的地方。
若是已經安裝了 2.4 系列內核,則系統上已有 LVM 支持,若是沒有,很簡單,只須要從新編譯內核來啓用 LVM 支持便可。不過,您可能不但願使用自帶的(或發行版提供的)2.4 內核所包括的 LVM 支持。若是但願使用最新的 LVM 版本,要將 LVM tar 文件中的補丁程序應用到當前的 2.4 內核源碼樹。如下是執行方法。
爲了開始,進入內核源碼目錄 (/usr/src/linux) 並建立一個稱爲 "extras" 的目錄。而後進入該目錄並抽取 LVM tar 文件:
# cd /usr/src/linux # mkdir extras # cd extras # tar xzvf /path/to/location/of/lvm_0.9.1_beta3.tar.gz |
執行完這一步後,您會注意到在 extras 中有一個稱之爲 "LVM" 的目錄,它包含了另外一個根據您剛剛解包的 LVM 版本命名的目錄。進入這兩個目錄找到 LVM 源碼:
您將看到幾個文本文件、腳本和源目錄。您會在 "INSTALL" 文件中找到安裝指令;我將指導您完成這一過程。首先,咱們但願運行配置腳本,以下:
# ./configure --prefix=/ --mandir=/usr/man |
執行完這條命令後,將建立並配置 Makefile,以在 /sbin 中安裝全部 LVM 工具,在 /usr/man 中安裝幫助頁面。若是您的幫助頁面位於 /usr/share/man 中(按照 FHS 2.1),則對上述路徑做相應的調整。若是內核源碼不在 /usr/src/linux 中,還須要將 "--with-kernel_dir=/path/to/usr/src/linux" 選項添加到一行中。配置腳本完成後,咱們就能夠準備安裝這些工具並生成當前內核的補丁了。讓咱們首先對內核加以修補。進入 PATCHES 目錄:
# cd PATCHES |
如今輸入 "make"。makefile 將生成專用於特定 2.4 系列內核源碼的補丁:
# make |
補丁名爲 lvm-[lvmversion]-[kernelversion].patch。例如,由於我使用的是版本 0.9.1_beta3 的 LVM 和內核 2.4.0-ac11,因此補丁名爲 lvm-0.9.1_beta3-2.4.0-ac11.patch。您能夠在當前目錄中找到它。如今該應用補丁了。要應用補丁,須要將目錄切換到內核源碼所在的位置,而後使用 patch 命令,如清單 2 所示:
雖然 LVM INSTALL 文檔並無提到,但我一般將 "-l" 選項傳遞給 patch。該選項讓補丁程序補償空白中的任何變化(例如細微的縮排變化),這些變化通常會形成補丁的某些部分失敗。若是上述命令完成時沒有任何帶有 "FAILED" 的行,那麼就能夠準備安裝用戶磁盤空間工具了。若是不是這樣,您須要審視 /usr/src/linux 目錄來查找 ..rej 文件,而後使用文本編輯器手工將被拒絕的部分插入到源碼中 -- 真麻煩!不過,在大多數狀況下,應用補丁都很順利,您能夠迅速使用它。
好,如今有了一個通過修補的內核,所以它具備最新可用的 LVM 代碼。如今須要配置內核來啓用 LVM 支持。我建議您直接將 LVM 支持編譯到內核中而不是將它配置成做爲一個模塊編譯。啓動您喜好的 Linux 內核配置方法:
# cd /usr/src/linux # make menuconfig |
您在 "Multi-device support (RAID and LVM)" 部分中能夠找到 LVM 選項。一旦啓用了第一個選項:
[*] Multiple devices driver support (RAID and LVM) |
....您將看到如下選項,您也應該啓用它們:
<*> Logical volume manager (LVM) support |
根據您使用的 LVM 版本,可能還有其它一些但願啓用的與 LVM 相關的選項。完成後,保存內核配置,並執行標準內核編譯例程,而後從新引導。 恭喜 -- 您現已啓用了內核 LVM 支持;如今,咱們須要編譯和安裝用戶磁盤空間工具。這一步很簡單:
# cd /usr/src/linux/extras/LVM/0.9.1_beta3 # make # make install |
另外還有一步,它是可選的。若是您要作的不只是測試 LVM,還須要將如下幾行添加到啓動 rc 腳本中:
/sbin/vgscan /sbin/vgchange -a y |
這些行將瀏覽全部可用的卷組並激活它們。而後,將如下這行添加到關機 rc 腳本中,並確保它在卸裝了全部文件系統後執行:
/sbin/vgchange -a n |
若是隻是測試 LVM,能夠跳過這些步驟。只是要記住,在每次從新引導後,在邏輯卷可使用前,須要以 root 輸入 "vgscan" 和 "vgchange -a y"。
以上就是這篇文章的內容。在下一篇文章中,我將介紹如何建立您本身的邏輯卷,以及如何發揮 LVM 的威力。到時候再見!
在 我前一篇 LVM 文章 中,我解釋了 LVM 背後的概念。如今該是發揮 LVM 做用的時候了。在本文中,我將在官方 Gentoo Linux web/cvs/email 服務器 -- cvs.gentoo.org -- 上設置 LVM。儘管 cvs.gentoo.org 只有一個硬盤,但靈活性很強的 LVM 仍然使人難以置信地提供了比標準靜態分區方法好得多的改進。我將爲您介紹 LVM 轉換過程的的全部步驟,這樣,若是您有興趣,能夠在本身的機器上執行相似的轉換。
在開始以前有一個告誡。由於實現 LVM 是對系統進行的一項重要的變更(包括建立新分區和其它一些潛在的冒險操做),因此在開始這一過程以前備份整個系統 不失爲 一個好主意。若是您不想進行備份,我但願您能使用一臺沒有什麼重要數據的測試機器 :) 應該說我在轉換到 LVM 時並無遇到任何問題,但最好作好準備以防萬一。
那麼,讓咱們繼續。在開始轉換過程以前,我對 cvs.gentoo.org 進行了升級,讓它使用下列軟件包。在我執行 LVM 轉換的時候,這些是當時的最新版本(請參閱本文稍後部分的 參考資料):
如今輪到硬盤驅動器了。cvs.gentoo.org 有一個不錯的新的 IBM 45 GB 硬盤驅動器;不過,當我在 cvs 上安裝 Gentoo Linux 時,我只對驅動器中的 10 GB 進行了分區,而將餘下的 35 GB 留做「未來的分區」使用。這些是在不使用 LVM 時耍的一點小計謀 -- 將部分驅動器保留不分區是一種爲從此的擴充做準備的簡單但有效的方式。不過,若是使用 LVM,會有更好的方法。
在過去的幾個星期中,我注意到個人根 ReiserFS 分區在被緩慢地填滿,這能夠從下面的 "df" 輸出中看出:
Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda3 9765200 6989312 2775888 72% / tmpfs 269052 0 269052 0% /dev/shm |
如今,72% 被佔滿的根分區並不構成什麼危機,但也決不是一種良好的情況。ReiserFS 和許多其它文件系統同樣,隨着它愈來愈滿而開始逐漸減慢速度,在根文件系統被徹底填滿、文件系統的性能遭到重創以前,這只是時間問題。
我決定在硬盤驅動器的結尾處使用 LVM,從 35 GB 的當前未分區空間中建立新邏輯捲來解決這一問題。而後,我會在這個捲上建立一個文件系統,並將 /dev/hda3 的大部份內容轉移到其中。
若是您考慮在本身的機器上進行相似的轉換,首先須要作的就是在根文件系統上找一個合適的部分轉移到邏輯捲上。對我來講,選擇很容易 -- 個人 /home 樹佔用了大約 5.7 GB。經過將 /home 轉移到它本身的 LVM 邏輯卷,個人根文件系統處於大約 20% 容量的位置。由於大多數新數據被添加到 /home,因此個人根文件系統極可能也停留在大約 20% 容量的位置 -- 一種很是健康的狀態。
在開始轉換以前,首先在硬盤驅動器的結尾處對未使用的空間進行分區。我使用 cfdisk 建立了一個 35 GB 的分區 (/dev/hda5),而後將分區的分區類型設置成 "8E"(正規 LVM 分區類型)。在這一更改後,我進行了從新引導以強制從新讀取分區表。在從新引導後,個人分區表以下:
# sfdisk -l Disk /dev/hda: 89355 cylinders, 16 heads, 63 sectors/track Units = 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 的分區,我就準備爲 LVM 初始化它。如下是過程 -- 首先,我將 35 GB 初始化成 物理卷;而後,使用這個物理卷建立一個 卷組 ,最後,在卷組上分配一些範圍,建立將包含新文件系統並存放當前 /home 中全部文件的 邏輯卷。
爲開始這個過程,我使用 pvcreate 命令將 /dev/hda5 初始化成物理卷:
# pvcreate /dev/hda5 pvcreate -- physical volume "/dev/hda5" successfully created |
pvcreate 在 /dev/hda5 上設置一個特殊的「記賬」區域,稱做 VGDA(「卷組描述符區域」)。LVM 使用該區域來記錄物理範圍是如何分配的,以及其它一些操做。
下一步是建立卷組並向該卷組添加 /dev/hda5。卷組將充當範圍池(許多存儲塊)。建立卷組以後,建立所需數量的邏輯卷。我決定將卷組稱爲 "main":
# vgcreate main /dev/hda5 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 "main" vgcreate -- volume group "main" successfully created and activated |
vgcreate 命令執行幾個操做。除了建立 "main" 卷組之外,它還設置 /dev/hda5,使它使用 4 MB 的範圍,4 GB 是缺省範圍大小。這意味着在卷組上建立的全部邏輯卷均可以以 4 MB 爲增量單位來進行擴充或縮減。
因爲內核限制的緣由,範圍大小決定了邏輯卷的最大大小。您能夠從上面的輸出中看出,4 MB 的範圍大小決定了邏輯卷大小限制爲 256 GB,若是您向卷組添加幾個高容量驅動器,這是很容易達到的邏輯卷組大小。若是每個卷最後都大於 256 GB,我建議您在運行 vgcreate 時指定更大一些的範圍大小。範圍的大小能夠是從 8 KB 到 512 MB 之間的任何值,而且必須老是 2 的倍數。經過將範圍大小增長到 4 MB 以上,最大的物理卷大小將相應地增長到最大爲 1 Petabyte(儘管當今現實世界中,x86 系統上的大小限制是 2 Terabytes)。例如,若是但願使用 32 MB 的範圍建立卷組,我會輸入:
# vgcreate -s 32M main /dev/hda5 |
32 MB 是個合適的範圍大小,由於 32 MB 的顆粒度仍然便於管理,並將引導的最大邏輯卷大小增長到 2 TB。建立卷組以後,能夠經過輸入 "vgdisplay" 來查看其信息:
# vgdisplay --- Volume group --- VG Name main VG Access read/write VG Status available/resizable VG # 0 MAX LV 256 Cur LV 0 Open LV 0 MAX LV Size 255.99 GB Max PV 256 Cur PV 1 Act PV 1 VG Size 33.28 GB PE Size 4 MB Total PE 8519 Alloc PE / Size 0 / 0 Free PE / Size 8519 / 33.28 GB VG UUID 2qC2H2-iA8s-qW6F-cwXx-JVIh-I6VC-VVCGmn |
既然有了本身的卷組,我準備建立邏輯卷。我決定在最初時將它的大小設置爲 8 GB,並稱它做 "lv_home":
# lvcreate -L8G -nlv_home main lvcreate -- doing automatic backup of "main" lvcreate -- logical volume "/dev/main/lv_home" successfully created |
而後,在邏輯捲上建立文件系統:
# 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 8211 Hash function "r5" ATTENTION: ALL DATA WILL BE LOST ON '/dev/main/lv_home'! (y/n)y journal size 8192 (from 18) Initializing journal - 0%....20%....40%....60%....80%....100% Syncing..done. |
既然建立了文件系統,我就能夠在 /mnt/newhome 上安裝它:
# mkdir /mnt/newhome # mount /dev/main/lv_home /mnt/newhome # df Filesystem 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 |
您能夠從上面看出,我幾乎準備複製 /home 中的全部數據。 在開始以前,我把系統下降到運行級別 1 以確保在複製 /home 中的文件時,沒有用戶或進程可以訪問或修改它們:
# init 1 |
而後,開始複製文件:
# cp -avx /home/* /mnt/newhome |
複製操做須要大約 10 分鐘的時間完成。而後,我將原始 /home 備份成 /home.old,這只是爲在複製過程當中有任何錯誤而準備的。建立一個新的安裝點,而後在 /home 上從新安裝新 home:
# cd / # mv home home.old # mkdir home # umount /mnt/newhome # mount /dev/main/lv_home /home |
而後,應該設置服務器以使個人新 /home 分區能夠在每次啓動機器時使用。首先修改 /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 0 proc /proc proc defaults 0 0 none /dev/pts devpts mode=620 0 0 tmpfs /dev/shm tmpfs defaults 0 0 |
而後,我對初始化腳本進行了一些小小改動。我修改了 "checkroot" 啓動腳本,使如下命令能夠在根分區從新安裝讀/寫後當即運行:
/sbin/vgscan /sbin/vgchange -a y |
接下來,我修改了在關機時運行的文件系統卸裝腳本,使如下命令在卸裝了全部文件系統 後當即運行:
/sbin/vgchange -a n |
完成了這些步驟後,我從新引導了機器,讓我高興的是一切都工做正常。在接下去的一天左右的時間裏徹底沒有問題,隨後我刪除了 /home.old 以釋放根文件系統上的一些空間。太棒了!到 LVM 的轉換成功了。
雖然到 LVM 的轉換有些痛苦,但一旦轉換完成以後,管理文件系統就變得很是簡單。例如,我決定從新調整新的 /home 邏輯卷大小,向文件系統結尾添加大約 2 GB 的空間。首先,我向 "lv_home" 邏輯卷添加了額外的容量,而後使用 resize_reiserfs 實用程序來擴充文件系統,使它可使用額外的容量。如下是執行全部這些操做的兩個命令:
# lvextend -L+2G /dev/main/lv_home # resize_reiserfs -f /dev/main/lv_home |
在大約一秒鐘的時間裏,我將 /home 文件系統擴大了 2 GB;使人驚奇的是,我不須要從新引導、下降到運行級別 1,甚至不須要卸裝 /home 來執行大小調整。一切都照常工做。是否是很了不得?下面是個人文件系統的當前狀態:
# df Filesystem 1k-blocks Used Available Use% Mounted on /dev/hda3 9765200 1413340 8351860 15% / /dev/main/lv_home 10485436 5609836 4875600 54% /home |
您能夠看出 LVM 的確可讓管理員的工做輕鬆許多。我但願在從此能將根文件系統的其它部分轉移到 LVM,最終甚至將個人根文件系統轉換成 LVM 邏輯卷。下面的參考資料能夠幫助您瞭解有關 LVM 的更多知識。
Daniel Bobbins 居住在美國新墨西哥州的阿爾布開克,他是 Gentoo Technologies, Inc. 的總裁兼 CEO、 Gentoo Linux (一種用於 PC 的高級 Linux)和 Portage 系統(用於 Linux 的下一代移植系統)的主創人。他仍是幾本 Macmillan 出版的書籍 Caldera OpenLinux Unleashed、 SuSE Linux Unleashed 和 Samba Unleashed 的投稿人。Daniel 自二年級起就與計算機結下不解之緣,那時他首先接觸的是 Logo 程序語言,並沉溺於 Pac-Man 遊戲中。這也許就是他至今仍擔任 SONY Electronic Publishing/Psygnosis 的首席圖形設計師的緣由所在。Daniel 喜歡與妻子 Mary 和新出生的女兒 Hadassah 一塊兒共度時光。可經過 drobbins@gentoo.org 與 Daniel 聯繫。