一份非常內行的Linux LVM HOWTO

火星人 @ 2014-03-09 , reply:0
←手機掃碼閱讀

1. 緒論
歡迎你,親愛的讀者.

寫這個文檔的目的是為了告訴你什麼是LVM,它怎樣工作,你怎樣運用它使你的生活變得更容易.雖然有一份LVM FAQ,但仍是德文的,它是從不同的角度來描寫的.它是一份「真的」HOWTO,在傳授理解(有希望的)的時候也是非常內行的.

我要說清楚我不是一個Linux邏輯卷管理器(Logical Volume Manager)的作者.我向那些作者表示敬意,同時我希望能和他們合作.

不可思議的是我甚至不知道LVM的開發者.我希望這種情況不久會改變.我事先向他們表示道歉.

1.1 免責聲明 & 許可
分發這個文檔是希望它對你有用,但是不提供任何擔保,也沒有銷售或適應特殊目的的隱含擔保.

如果你的磁碟融化了,你公司解僱了你--這決不是我們的錯.對不起.請記得經常做備份,在沒有重要數據的系統上做實驗.

此外,Richard Allen不代表他老闆說話.

Linux是Linus Torvalds的註冊商標.

英文原文(若翻譯有誤,以原文為準)

This document is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

If your disks melt and your company fires you - its never our fault. Sorry. Make frequent backups and do your experiments on non-mission critical systems.

Furthermore, Richard Allen does not speak for his employer.

Linux is a registered trademark of Linus Torvalds.

1.2 預備知識
不是太多.如果你曾經安裝過Linux和創建過文件系統(fdisk/mkfs),那你就準備就緒了.但因為總是以root身份操作,一定要小心謹慎!錯誤的命令或操作設備文件都可能損壞已經存在的數據.

如果你知道怎樣配置HP/UX LVM,那你幾乎都完成了,Linux工作得很象HP上的處理.

1.3 注意事項
關於這份文檔有幾點需要註釋.雖然我寫了大部分,但我真的不希望它停步.我堅決相信Open Source,我鼓勵你反饋、更新、打補丁等等.不要不願意告訴我們有關排版或普通的老錯誤.

如果你感覺你更有資格來維護一部分,或者你認為你能創作和維護一個新的部分,歡迎你.這個HOWTO的SGML格式是通過CVS可用的.我預想這會是個合作計劃.

這份文檔里,你會發現許多FIXME的通知.補丁總是歡迎的!無論你在哪裡發現FIXME,你都要明白你正踩在未知的領域.這不是說其他地方沒有錯誤,而是說這裡是要特別注意的地方.如果你已經驗證了什麼,請告訴我,我好刪除這FIXME通知.

1.4 訪問,CVS & 更新
這份HOWTO的規範定位在 這裡.

我們現在有匿名的CVS訪問,對全世界普遍有效.這使你更容易獲得最新版的HOWTO,並提供改變和增強.

如果你想通過CVS獲得這份HOWTO,下面教你怎樣做:

$ export CVSROOT=:pserver:anon@outpost.ds9a.nl:/var/cvsroot
$ cvs login
CVS password: [enter cvs (without s)]
$ cvs co lvm-howto
cvs server: Updating lvm-howto
U lvm-howto/lvm-howto.sgml


如果你發現錯誤,或者想增加什麼,本地修復它,並運行「cvs diff -u」,同時將結果發給我們.

提供了一個Makefile文件來幫助你創建postscript,dvi,pdf,html 和 plain text格式.你可能需要安裝sgml-tools,ghostscript 和 tetex 以獲得所有格式.

1.5 這份文檔的編排
我們將解釋一些需要的基本知識.我們盡量設法包括例子來幫助理解.


2. 什麼是LVM?
傳統上,一個分區大小是靜態的.這要求一個系統安裝人員考慮的不是「我要在這個分區上存儲多少數據」,而是「我『究竟』要在這個分區上存儲多少數據」.當一個用戶在這個分區上沒有空間了,他要麼不得不重新分區(這可能要求整個操作系統重裝),要麼象符號連接一樣使用組裝機.

一個分區就是物理磁碟上一系列連續數據塊的概念已經演變了.多數類Unix系統現在有能力分解物理磁碟到許多單元.多個驅動器上的存儲單元可以匯聚成一個「邏輯卷」,它們可以分配給分區.另外,單元可以隨著空間要求的改變而從分區中添加和刪除.

這就是基本的邏輯卷管理器(LVM)

例如,假設你有一個1GB的磁碟,並且創建「/home」分區花了600MB.設想你沒有空間了,於是決定「/home」需要1GB.用傳統的分區觀念,你不得不有另外一個至少1GB大小的驅動器.接著增加這個磁碟,創建新的/home,並且將現有的數據拷貝過去.

然而,用LVM配置,你僅僅只需要增加400MB(或更大)的磁碟,並將它的存儲單元添加到「/home」分區中.其他工具可以讓你調整原來文件系統的大小,你僅僅只需要調整「/home」大小來使用更大的分區,接著返回到商務中.

一個非常特殊的處理,LVM甚至可以做它自身的「快照」,這使你能對不可移動的目標做備份.我們返回到這個激動人心的可能中,稍後,有許多另外的真實應用.

以下章節中,我們解釋了LVM的基本要素,和它使用中的許多概要.


3. 基本原理
Ok,不要因為恐懼而停止,但是LVM有許多你要明白的術語,以免你危及你的文件系統.

我們從下面開始,或多或少.

物理介質 The physical media
你應該感受「物理」這個單詞有極大的延伸,雖然我們剛開始假設它僅僅是一個硬碟,或者一個分區.例如,/dev/hda,/dev/hda6,/dev/sda.你可以轉換一個塊設備上任何連續塊到一個...
 
物理卷 Physical Volume (PV)
一個PV只不過是有許多管理數據添加在它裡面的物理介質--一旦你添加了它,LVM就認為它是...的一個持有者.
 
物理分區 Physical Extents (PE)
物理分區真的象一些大的數據塊,通常有幾MB.PE可以分配給一個...
 
卷組 Volume Group (VG)
一個VG是由許多物理分區組成的(可能來自多個物理卷或硬碟).雖然這可能容易讓你認為一個VG就是由幾個硬碟組成的(例如/dev/hda和/dev/sda),但是更確切的說,它包含由這些硬碟提供的許多PE.
 
>;從這個卷組,PE可以分配給一個...
 
邏輯卷 Logical Volume (LV)
Yes,我們最終到達某處.一個邏輯卷是我們工作的最終結果,這裡是我們存儲信息的地方.這等同於傳統分區的想法.
象用通常的分區一樣,在邏輯卷上你能代表性的創建一個...
 
文件系統 Filesystem
文件系統是你想它成為的形態:標準的 ext2,ReiserFS,NWFS,XFS,JFX,NTFS,等等...對Linux內核來說,在通常的分區和邏輯卷之間沒有差別.
我試著畫了一個ASCII圖來使這些形象化.

一個物理卷,包含了許多物理分區:

-----[ Physical Volume ]------
| PE | PE | PE | PE | PE | PE |
------------------------------

一個卷組,包含了2個物理卷(PV)有6個物理分區:

------[ Volume Group ]-----------------
| --[PV]-------- --[PV]--------- |
| | PE | PE | PE | | PE | PE | PE | |
| -------------- --------------- |
---------------------------------------

我們現在做更進一步擴展:

------[ Volume Group ]-----------------
| --[PV]-------- --[PV]--------- |
| | PE | PE | PE | | PE | PE | PE | |
| -- --- --- --- - ---- ---- --- |
| | | | -----/ | | |
| | | | | | | |
| - --- --- - ---- ---- -- |
| | Logical | | Logical | |
| | Volume | | Volume | |
| | | | | |
| | /home | | /var | |
| ----------- ------------ |
---------------------------------------


這個向我們展示了兩個文件系統,它跨越兩個磁碟./home文件系統包含4個物理分區,/var文件系統包含2個.

bert hubert 正在寫一個工具來更真實的描述LVM,這裡提供了一些它在屏幕上出現的外觀.看起來比ASCII圖畫要好.

3.1 Show & Tell
Ok,這些概念很難理解(』We are LVM of Borg...),因此下面給出了創建一個邏輯卷的例子.不要粘貼這個例子到你的控制台,因為這樣會破壞數據,除非碰巧你的計算機的/dev/hda3和/dev/hdb2沒有使用.

如果有疑問,查看上面的ASCII圖畫.

你應該設置/dev/hda3和/dev/hdb2的分區類型為0x8e,它表示」Linux LVM」.請注意你的fdisk的版本可能仍不認識這種類型,因此它顯示為「Unknown」:


# fdisk /dev/hda

Command (m for help): p

Disk /dev/hda: 255 heads, 63 sectors, 623 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 2 16033 83 Linux
/dev/hda2 3 600 4803435 83 Linux
/dev/hda3 601 607 56227 83 Linux
/dev/hda4 608 614 56227 83 Linux

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): 8e

Command (m for help): p

Disk /dev/hda: 255 heads, 63 sectors, 623 cylinders
Units = cylinders of 16065 * 512 bytes

Device Boot Start End Blocks Id System
/dev/hda1 1 2 16033 83 Linux
/dev/hda2 3 600 4803435 83 Linux
/dev/hda3 601 607 56227 8e Unknown
/dev/hda4 608 614 56227 83 Linux

Command (m for help): w

我們對/dev/hdb2做同樣的操作,在此就不演示了.這是需要的,以至LVM能重建你應該丟失的配置.

通常,不需要重啟,但有些計算機卻要求.因此如果下面的例子不工作,試試重啟.

接著我們創建物理卷(PV),如下:


# pvcreate /dev/hda3
pvcreate -- physical volume "/dev/hda3" successfully created
# pvcreate /dev/hdb2
pvcreate -- physical volume "/dev/hdb2" successfully created

我們再將這兩個物理卷(PV)加到一個叫做「test」的卷組(VG)中:


# vgcreate test /dev/hdb2 /dev/hda3
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"
vgcreate -- volume group "test" successfully created and activated

現在我們有一個空的卷組(VG),讓我們來檢查一下:


# vgdisplay -v test
--- Volume group ---
VG Name test
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 2
Act PV 2
VG Size 184 MB
PE Size 4 MB
Total PE 46
Alloc PE / Size 0 / 0
Free PE / Size 46 / 184 MB

--- No logical volumes defined in test ---


--- Physical volumes ---
PV Name (#) /dev/hda3 (2)
PV Status available / allocatable
Total PE / Free PE 13 / 13

PV Name (#) /dev/hdb2 (1)
PV Status available / allocatable
Total PE / Free PE 33 / 33

這裡的許多數據--大多數現在都容易理解了.我們看到沒有邏輯卷(LV)定義,因此我們要補上它.我們將在「test」卷組(PV)中創建一個50MB的邏輯卷,叫做「HOWTO」:


# lvcreate -L 50M -n HOWTO test
lvcreate -- rounding up size to physical extent boundary "52 MB"
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/test/HOWTO" successfully created

Ok,到這裡,我們創建一個文件系統:


# mke2fs /dev/test/HOWTO
mke2fs 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
13328 inodes, 53248 blocks
2662 blocks (5.00%) reserved for the super user
First data block=1
7 block groups
8192 blocks per group, 8192 fragments per group
1904 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961

Writing inode tables: done
Writing superblocks and filesystem accounting information: done
# mount /dev/test/HOWTO /mnt
# ls /mnt
lost found

我們做完了!讓我們回顧我們的卷組(VG),它現在充滿了一些東西:


# vgdisplay test -v
--- Volume group ---
VG Name test
VG Access read/write
VG Status available/resizable
VG # 0
MAX LV 256
Cur LV 1
Open LV 1
MAX LV Size 255.99 GB
Max PV 256
Cur PV 2
Act PV 2
VG Size 184 MB
PE Size 4 MB
Total PE 46
Alloc PE / Size 13 / 52 MB
Free PE / Size 33 / 132 MB

--- Logical volume ---
LV Name /dev/test/HOWTO
VG Name test
LV Write Access read/write
LV Status available
LV # 1
# open 1
LV Size 52 MB
Current LE 13
Allocated LE 13
Allocation next free
Read ahead sectors 120
Block device 58:0


--- Physical volumes ---
PV Name (#) /dev/hda3 (2)
PV Status available / allocatable
Total PE / Free PE 13 / 13

PV Name (#) /dev/hdb2 (1)
PV Status available / allocatable
Total PE / Free PE 33 / 20

好,這就是了./dev/hda3完全沒用,而/dev/hdb2有13個物理分區(PE)在用.

3.2 激活和非激活:內核空間和用戶空間
和使用所有操作系統一樣,Linux劃分了兩個部分:內核空間(kernel space)和用戶空間(user space).用戶空間有時叫做用戶區(userland),這也是關於這個主題的一個很好的名字.

關於邏輯卷管理器的創建和修改都是在用戶空間做的,然後傳給內核.一旦卷組或邏輯卷向內核彙報,它就叫做「激活(Active)」.當它被激活時,只有某些更改可以執行,其他的更改只有在它非激活時執行.


4. 首要條件
LVM在很大範圍內的內核中都有效.在Linux 2.4,LVM將全部被集成.內核2.3.47和以前的,LVM要經過處理來合併到主內核中.

4.1 內核
Linux 2.4
包含了你需要的所有內容.希望大多數的發行版都將LVM當成模塊集成來發行.如果你需要編譯,僅僅是當你選擇塊設備時打勾LVM選項.

Linux 2.3.99.*
一旦內核向前發展穩定了,這部分就不會存在了.但是現在,我們還是要描述一下.

當我們寫這篇文檔時,Linux最新的內核版本是2.3.99pre5,它仍然需要一些小的補丁才能使LVM工作.

對於Linux 2.3.99pre3,有兩個補丁發行:

一個補丁是張貼在linux-kernel,在這裡可以找到.

Andrea Arcangeli改進了這個補丁,提供了一個增量的補丁,它應用於2.3.99pre3 LVM補丁和這之上.

對於Linux 2.3.99pre5,bert hubert將這兩個補丁合併成一個了,並且主要針對2.3.99pre5.在這裡可以找到這個補丁.使用它要小心.

2.3.99pre6-1,是的,是補丁的一個預覽版,特色是第一次完成了LVM的支持!它仍然遺漏了Andreas的補丁,但我們確信它不久真的會發行的.

2.3.99pre4-ac1預設有一個小的補丁在,並且能工作.雖然它不包括Andreas的補丁.

Linux 2.2
FIXME: write this

Linux 2.3
FIXME: write this

4.2 用戶餘地
你需要從LVM站點下載有效的工具.用glibc2.1編譯系統要求的一些補丁.即使這樣,在Debian 2.2上仍會出錯.

5. 增長文件系統
你可以用一個預備好的腳本做大量的工作,也可以根據你的需要手工做

5.1 使用e2fsadm
如果在你的卷組中有剩餘空間,並且你使用的是ext2文件系統(大多數人都是這樣的),你就可以使用這個便捷的工具.

e2fsadm命令利用商業的resize2fs工具.雖然人們都感覺resize2fs是一個很好的軟體,但是它並沒有被廣泛的安裝.

如果你想使用FSF的ext2resize命令,你需要告訴e2fsadm以下內容:


# export E2FSADM_RESIZE_CMD=ext2resize
# export E2FSADM_RESIZE_OPTS=""

餘下的就簡單了,e2fsadm使用時很象其他的LVM命令:


# e2fsadm /dev/test/HOWTO -L 50M
e2fsadm -- correcting size 102 MB to physical extent boundary 104 MB
e2fsck 1.18, 11-Nov-1999 for EXT2 FS 0.5b, 95/08/09
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/test/HOWTO: 11/25688 files (0.0% non-contiguous), 3263/102400 blocks
lvextend -- extending logical volume "/dev/test/howto" to 104 MB
lvextend -- doing automatic backup of volume group "test"
lvextend -- logical volume "/dev/test/HOWTO" successfully extended

ext2_resize_fs
ext2_grow_fs
ext2_block_relocate
ext2_block_relocate_grow
ext2_grow_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
ext2_add_group
direct hits 4096 indirect hits 0 misses 1
e2fsadm -- ext2fs in logical volume "/dev/test/HOWTO" successfully extended to 104 MB

5.2 增長邏輯卷
e2fsadm命令為你做了這些工作.然而,了解怎樣手工來做可能會有用的.

如果在你的卷組中有剩餘空間,那麼只需要一行:


# lvextend -L 12M /dev/test/HOWTO
lvextend -- rounding size to physical extent boundary
lvextend -- extending logical volume "/dev/test/HOWTO" to 116 MB
lvextend -- doing automatic backup of volume group "test"
lvextend -- logical volume "/dev/test/HOWTO" successfully extended

5.3 增長卷組
這是用vgextend功能實現的,它很象餡餅一樣容易.你需要創建一個物理卷.這要用pvcreate來實現.使用這個工具,你轉換任何塊設備為一個物理卷.

這樣做了之後,vgextend做餘下的任務:


# pvcreate /dev/sda1
pvcreate -- physical volume "/dev/sda1" successfully created
# vgextend webgroup /dev/sda1
vgextend -- INFO: maximum logical volume size is 255.99 Gigabyte
vgextend -- doing automatic backup of volume group "webgroup"
vgextend -- volume group "webgroup" successfully extended

請注意,為了要做這些,你的卷組是激活的.你可以通過執行象「vgchange -a y webgroup」來使它激活.

5.4 增長文件系統


如果你想手工做,有兩條路徑可以實現.

ext2離線,使用ext2resize
離線,就意味著你umount這個文件系統來做這些改變.在做這些改變的時候,這個文件系統和它上面的數據暫時不可用.如果你想擴充根分區或其他重要的分區,你用其他的啟動介質來引導.

ext2resize工具可以在GNU ftp站點找到,但大多數的發行版都將它作為一個包來發行.它的語法也簡單易懂:


# ext2resize /dev/HOWTO/small 40000

這裡40000是文件系統已經增長或收縮之後的塊的數目.

ext2在線
FIXME: write this

6. 替換磁碟
這是LVM的好處之一.一旦你發現某個磁碟有錯誤,那就是要移動你的數據的時候了.使用LVM它很象餡餅一樣容易.我們舉一個明顯的替換例子,你先添加一個磁碟到系統中,它至少要和你想要替換的磁碟一樣大.

要移動數據,我們移動卷組的物理分區到另一個磁碟上,或者更準確的說,到另一個物理卷上.要做這些,LVM給我們提供了pvmove功能.

假設我們懷疑的那塊磁碟叫/dev/hda1,並且我們想用/dev/sdb3來替換它.我們將/dev/sdb3添加到包含/dev/hda1的那個卷組中.

在這之前,umount這個卷組上的所有文件系統看來是明智的.有一個全備份也不會損壞什麼.

FIXME: is this necessary?

接下來我們執行pvmove.非常簡單的,我們僅僅提到我們想要移走的那塊磁碟,就象這樣:


# pvmove /dev/hda1
pvmove -- moving physical extents in active volume group "test1"
pvmove -- WARNING: moving of active logical volumes may cause data loss!
pvmove -- do you want to continue? [y/n] y
pvmove -- doing automatic backup of volume group "test1"
pvmove -- 12 extents of physical volume "/dev/hda1" successfully moved

請留意這個警告.看來至少有些內核或LVM的版本在使用這個命令時有問題.我是用2.3.99pre6-2來測試的,它可以工作,但要警告.

現在,/dev/hda1沒有包含任何物理分區了,我們可以將它從卷組中刪除:


# vgreduce test1 /dev/hda1
vgreduce -- doing automatic backup of volume group "test1"
vgreduce -- volume group "test1" successfully reduced by physical volume:


vgreduce -- /dev/hda1

FIXME: we need clarity on a few things. Should the volume group be active? When do we get data loss?

6.1 當事情發生在晚期時
如果一個磁碟沒有出現警告就失敗了,你就不能移走它上面的物理分區到另一個物理卷上,這樣你可能會丟失數據,除非在這個失敗的PV上的邏輯卷是鏡像了的.正確的行為是用一個同樣的PV或者至少同樣大小的分區來替換這個失敗的PV.

/etc/lvmconf目錄包含了LVM數據和結構的備份,包括哪些磁碟做成了PV,每個PV屬於哪個VG,每個VG中有哪些LV.

替換了出錯的磁碟之後,你可以用vgcfgrestor命令來恢復LVM數據到新的PV上.它恢復卷組和所有它的信息,但是不會恢復在邏輯卷上的數據.這是因為當LVM數據做一些更改時,LVM命令自動做備份.


--------------------------------------------------------------------------------

7. 為一致性備份做快照
這是更加難以置信的一個可能性.假設你有一個非常繁忙的伺服器,有許多東西運行.為了一個有用的備份,你需要停止大量的程序,否則,你將以數據不一致告終.

一個規範的例子是從/tmp移動一個文件到/root下,/root將先備份.當/root被讀的時候,這個文件還不在那裡.當/tmp被備份時,這個文件已經不在了.

另一個事例是保存資料庫或目錄.如果一個文件在使用狀態,我們就沒有任何線索了,除非我們給應用程序時間做一個清除的關閉.

這樣的話,新的問題又出現了.我們關閉程序,做我們的備份,接著重新啟動它們.如果備份只花幾分鐘這是很好的,但是,如果它要花數小時,或者你根本不確定它到底要花多久的時候,事情就真的痛苦了.

LVM可以營救.

使用LVM,我們可以做一個LV瞬間的快照,然後mount它,再備份它.

讓我們試驗一下:


# mount /dev/test/HOWTO /mnt
# echo >; /mnt/a.test.file
# ls /mnt/
a.test.file lost found
# ls -l /mnt/
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost found

Ok,我們現在有些事情要用它一起做.讓我們產生這個快照:


# lvcreate --size 16m --snapshot --name snap /dev/test/HOWTO
lvcreate -- WARNING: all snapshots will be disabled if more than 16 MB are changed
lvcreate -- INFO: using default snapshot chunk size of 64 KB
lvcreate -- doing automatic backup of "test"
lvcreate -- logical volume "/dev/test/HOWTO" successfully created

對於「--size」參數以後再詳述.讓我們mount這個快照:


# mount /dev/test/snap /snap
# ls /snap
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost found

現在我們從原處刪除a.test.file,並且檢查它是否仍然在快照里:


# rm /mnt/a.test.file
# ls /snap
total 13
-rw-r--r-- 1 root root 1 Apr 2 00:28 a.test.file
drwxr-xr-x 2 root root 12288 Apr 2 00:28 lost found

太令人驚訝了!

7.1 它是如何工作的?
記得我們不得不設置「--size」參數嗎?真正發生的事情是,「snap」卷需要有那些當LVM調用時,在原處要被改變的所有塊的一個拷貝.

當我們刪除a.test.file時,它的i節點被刪除.這引起64KB要被標註成「髒的」--同時原始數據的一個拷貝被寫到「snap」卷.這個例子中,我們分配了16MB給快照,因此如果多於16MB的塊要被修改,快照就會無效了.

要決定一個快照分區的正確大小,你將不得不推測基於主LV的使用模式、快照要激活的總時間.例如,在午夜,當無人使用系統的情況下,一個幾小時的備份可能要求很小的空間.

請注意,快照不是永久的.如果你卸下LVM或重啟,它們就丟失了,需要重新創建.


--------------------------------------------------------------------------------

8. 冗餘 & 性能
為了性能的考慮,可以將數據分散在幾個條塊化的磁碟上.這意味著塊1在PV A上,塊2在PV B上,塊3又在PV A上.你也可以條塊化跨多餘2塊磁碟.

這樣的安排意味著你有更多有效的磁碟帶寬.也就是說包含了更多的「軸」.以後會詳述.

除此之外,為了提高性能,也可以將你的數據在多個磁碟上有多份拷貝.這叫做鏡像.目前,LVM本身還不支持它,但是有多種方法能實現鏡像.

8.1 為何要條塊化?
磁碟的性能至少受三種因素的影響.最明顯的是一塊磁碟上的數據能連續被讀或寫的速度.這是當讀或寫僅連接了一個單一的磁碟的SCSI/IDE匯流排上的一個大文件時的限制因素.

接著是到磁碟的有效帶寬.如果你在一個SCSI匯流排上有7塊盤,這也許會小於你的磁碟本身寫的速度.如果你願意花足夠的錢,你可以避免這個瓶頸成為一個問題.

然後是響應時間.當成諺語說,響應時間總是壞消息.甚至更壞的是,你不可能通過花更多的錢來降低響應時間!現在出產的大多數磁碟有一個大約7ms的響應時間.還有SCSI響應時間,通常是大約25ms.

FIXME: need recent numbers!

這意味著什麼?在一個典型情形,總的響應時間大約是30ms.因此你每秒鐘只能執行大約33個磁碟操作.如果你想每秒鐘能做數千個查詢,並且你沒有大量的緩存,那麼你就非常不走運了.

如果你有多個磁碟,或者「軸」,在并行工作,那麼你可以有多個命令很好地圍繞你的響應問題同時執行.有些應用程序,比如一個大的新聞伺服器,如果沒有條塊化或其它I/O敏捷性它甚至不再工作.

這就是條塊化做的事.如果你的匯流排能勝任,甚至連續的讀和寫可能會更快.

8.2 為何不條塊化
條塊化沒有進一步的措施來解除你的錯誤機會,按一個「每次一比特」的基本原則.如果你的磁碟任一塊死了,你全部的邏輯卷都會丟失.如果你正好連接數據,僅僅文件系統部分丟失.

最終的選項是鏡像的條塊化.

FIXME: make a mirrored stripe with LVM and md

8.3 LVM本身的條塊化
當用lvcreate創建LV時,指定條塊化配置項.有兩個相關參數.-i參數告訴LVM應該在多少個PV上分散數據.條塊化不是真的按一次一比特的基礎來做的,而是按塊.-I參數指定單位為KB的塊大小.注意它是2的一個冪,最大的塊大小為128KB.

例如:


# lvcreate -n stripedlv -i 2 -I 64 mygroup -L 20M
lvcreate -- rounding 20480 KB to stripe boundary size 24576 KB / 6 PE
lvcreate -- doing automatic backup of "mygroup"
lvcreate -- logical volume "/dev/mygroup/stripedlv" successfully created

性能注意事項
如果跨同一塊磁碟的兩個分區來條塊化,性能的「增加」可能會是非常消極的--注意避免這樣.跨單一的IDE匯流排上的兩個磁碟來條塊化也是沒用的--除非IDE已經改進了我所記憶的.

FIXME: is this still true?

很老的主板可能有兩個IDE匯流排,但是第二個通常是用於一個相對慢的cdrom驅動器.你可以用幾個工具來執行基準,最令人注目的是「Bonnie」.ReiserFS人們已經發布了Bonnie ,它可以用來測試性能數據.

8.4 硬體RAID
多數高速的Inter x86伺服器有硬體RAID控制器.它們中大部分至少有2個獨立的SCSI通道.幸運的是,這些在LVM上很少有關係.在Linux能看到如此一個控制器上的任何東西之前,管理員在RAID控制器自身里定義一個邏輯驅動器.舉一個例子,他(她)可能選擇條塊化在SCSI通道A上的兩個磁碟,然後鏡像它們到通道B上的兩塊磁碟上.這是一個典型的RAID 0/1配置,最佳化性能和數據安全.當Linux在一台採用這種配置的機器上啟動時,它只能「看」到在RAID控制器上的一塊磁碟,那就是包含了RAID 0/1條塊組上四塊磁碟的邏輯驅動器.這就是說,至於LVM關心的,僅僅是在這台機器上的一塊磁碟,它將被同樣地使用.如果這些磁碟中的一個失敗了,LVM甚至不知道.當管理員替換了磁碟(甚至很快的用熱備硬體),LVM也不知道任一種情況發生了.控制器會重新同步鏡像的數據,一切都良好.這裡多數人會退一步來詢問「那麼使用這個RAID控制器,LVM為我帶來什麼好處呢?」最容易的回答是,多數情況下,你在RAID控制器里定義了一個邏輯驅動器后,你不可能在以後添加更多的磁碟到那個驅動器了.因此,如果你誤算了所要求的空間,或者你只是需要更多的空間,你都不可能添加一個新的磁碟或一組磁碟到原來的條塊組裡.這意味著你在這個控制器里創建一個新的RAID條塊組,然後用LVM你可以簡單的擴展LVM的LV,以致它無縫的跨越RAID控制器里的兩個條塊組.

FIXME: Is there more needed on this subject ?

8.5 Linux軟體RAID
Linux 2.4帶著一個非常好的RAID代替出現了.Linux 2.2預設的,當被Alan Cox發布時,是一個初期的RAID版本的特寫,它沒有被很好的重視.2.2仍然是早期版本特色的原因是寫內核的人們不想在一個穩定的版本里做改動,那樣會要求使用者更新.

更多的人們,包括Red Hat,Mandrake和SuSE,選擇用表現得很完美的0.90版本來替換它.

這裡我們只論述0.90版本.

FIXME: write more of this


--------------------------------------------------------------------------------

9. Cookbook
9.1 在計算機之間移動LVM磁碟
使用這些新技術,簡單的任務象從一台計算機移動磁碟到另一台計算機就變得有些機警了.在用LVM之前,用戶只需要把這塊盤放到新的機器上並且mount這些文件系統.使用LVM,就多一點事情要做.LVM結構既保存在磁碟上也保存在/etc/lvmconf目錄里,因此,移動一個或一組包含了一個VG的磁碟所要做的唯一的事情是確保這個VG屬於的機器不會破壞它的數據.這是通過vgexport命令來實現的.vgexport僅僅從/etc/lvmconf刪除關於這個VG的結構,而不會更改磁碟上的任何內容.一旦磁碟放到新的機器上(他們沒必要有相同的ID),唯一要做的事情就是修改/etc/lvmconf.這是通過vgimport來做的.

例如:

在機器#1:


vgchange -a n vg01
vgexport vg01

在機器#2:


vgimport vg01 /dev/sda1 /dev/sdb1
vgchange -a y vg01

注意你沒必要為這個VG使用相同的名字.如果vgimport命令沒有保存配置的備份,那就用vgcfgbackup來做.

9.2 重建/etc/lvmtab 和/etc/lvmtab.d
FIXME: write about more neat stuff


--------------------------------------------------------------------------------

10. 進一步閱讀
LVM站點
主要的有效LVM資源
德文LVM HOWTO
如果你能讀懂德文,它就已經包含了許多信息
德文HOWTO的翻譯
Peter.Wuestefeld@resnova.de正在將德文HOWTO翻譯成英語.看來他們會花許多時間在上面.如果你懷疑我們的HOWTO,或者想知道些什麼,請試試他們的努力.
HP/UX管理磁碟嚮導
因為Linux LVM幾乎就是HP/UX執行的一個原樣,他們的文檔對我們也是非常有用的.是一個很好的資料.

11. 致謝
我們嘗試在這裡列出所有幫助我們寫這篇HOWTO的人.包括呈報更新、修復或投稿的人,還有幫助我們理解這個主題的人.





[火星人 via ] 一份非常內行的Linux LVM HOWTO已經有264次圍觀

http://www.coctec.com/docs/linux/show-post-53438.html