管理文件系统
Linux 文件系統
Linux的文件系統為我們在硬盤中存儲的0和1和應用中使用的文件與目錄之間搭建起了一座橋梁。Linux支持多種類型的文件系統管理文件和目錄。每種文件系統都在存儲設備上實現了虛擬目錄結構,僅特性略有不同。
基本的 Linux 文件系統
Linux最初采用的是一種簡單的文件系統,它模仿了Unix文件系統的功能。
ext文件系統
Linux操作系統中引入的最早的文件系統叫作擴展文件系統( extended filesystem,簡記為ext)。
它為Linux提供了一個基本的類Unix文件系統:使用虛擬目錄來操作硬件設備,在物理設備上按定長的塊來存儲數據。
ext文件系統采用名為索引節點的系統來存放虛擬目錄中所存儲文件的信息。索引節點系統在每個物理設備中創建一個單獨的表(稱為索引節點表)來存儲這些文件的信息。存儲在虛擬目錄中的每一個文件在索引節點表中都有一個條目。 ext文件系統名稱中的extended部分來自其跟蹤的每個文件的額外數據,包括:
? 文件名
? 文件大小
? 文件的屬主
? 文件的屬組
? 文件的訪問權限
? 指向存有文件數據的每個硬盤塊的指針
Linux通過唯一的數值(稱作索引節點號)來引用索引節點表中的每個索引節點,這個值是創建文件時由文件系統分配的。文件系統通過索引節點號而不是文件全名及路徑來標識文件。
ext2文件系統
最早的ext文件系統有不少限制,比如文件大小不得超過2 GB。在Linux出現后不久, ext文件系統就升級到了第二代擴展文件系統,叫作ext2。
如你所猜測的, ext2文件系統是ext文件系統基本功能的一個擴展,但保持了同樣的結構。 ext2文件系統擴展了索引節點表的格式來保存系統上每個文件的更多信息。
ext2的索引節點表為文件添加了創建時間值、修改時間值和最后訪問時間值來幫助系統管理員追蹤文件的訪問情況。 ext2文件系統還將允許的最大文件大小增加到了2 TB(在ext2的后期版本中增加到了32 TB),以容納數據庫服務器中常見的大文件。
除了擴展索引節點表外, ext2文件系統還改變了文件在數據塊中存儲的方式。 ext文件系統常見的問題是在文件寫入到物理設備時,存儲數據用的塊很容易分散在整個設備中(稱作碎片化,fragmentation)。數據塊的碎片化會降低文件系統的性能,因為需要更長的時間在存儲設備中查找特定文件的所有塊。
保存文件時, ext2文件系統通過按組分配磁盤塊來減輕碎片化。通過將數據塊分組,文件系統在讀取文件時不需要為了數據塊查找整個物理設備。
多年來, ext文件系統一直都是Linux發行版采用的默認文件系統。但它也有一些限制。索引節點表雖然支持文件系統保存有關文件的更多信息,但會對系統造成致命的問題。文件系統每次存儲或更新文件,它都要用新信息來更新索引節點表。問題在于這種操作并非總是一氣呵成的。
如果計算機系統在存儲文件和更新索引節點表之間發生了什么,這二者的內容就不同步了。
ext2文件系統由于容易在系統崩潰或斷電時損壞而臭名昭著。即使文件數據正常保存到了物理設備上,如果索引節點表記錄沒完成更新的話, ext2文件系統甚至都不知道那個文件存在!
很快開發人員就開始嘗試開發不同的Linux文件系統了。
日志文件系統
日志文件系統為Linux系統增加了一層安全性。它不再使用之前先將數據直接寫入存儲設備再更新索引節點表的做法,而是先將文件的更改寫入到臨時文件(稱作日志, journal)中。在數據成功寫到存儲設備和索引節點表之后,再刪除對應的日志條目。
如果系統在數據被寫入存儲設備之前崩潰或斷電了,日志文件系統下次會讀取日志文件并處理上次留下的未寫入的數據。Linux中有3種廣泛使用的日志方法,每種的保護等級都不相同,如表8-1所示。
表8-1 文件系統日志方法
| 數據模式 | 索引節點和文件都會被寫入日志;丟失數據風險低,但性能差 |
| 有序模式 | 只有索引節點數據會被寫入日志,但只有數據成功寫入后才刪除;在性能和安全性之間取得了良好的折中 |
| 回寫模式 | 只有索引節點數據會被寫入日志,但不控制文件數據何時寫入;丟失數據風險高,但仍比不用日志好 |
數據模式日志方法是目前為止最安全的數據保護方法,但同時也是最慢的。所有寫到存儲設備上的數據都必須寫兩次:第一次寫入日志,第二次寫入真正的存儲設備。這樣會導致性能很差,尤其是對要做大量數據寫入的系統而言。
這些年來,在Linux上還出現了一些其他日志文件系統。
ext3文件系統
2001年, ext3文件系統被引入Linux內核中,直到最近都是幾乎所有Linux發行版默認的文件系統。它采用和ext2文件系統相同的索引節點表結構,但給每個存儲設備增加了一個日志文件,以將準備寫入存儲設備的數據先記入日志。
默認情況下, ext3文件系統用有序模式的日志功能——只將索引節點信息寫入日志文件,直到數據塊都被成功寫入存儲設備才刪除。你可以在創建文件系統時用簡單的一個命令行選項將ext3文件系統的日志方法改成數據模式或回寫模式。
雖然ext3文件系統為Linux文件系統添加了基本的日志功能,但它仍然缺少一些功能。例如ext3文件系統無法恢復誤刪的文件,它沒有任何內建的數據壓縮功能(雖然有個需單獨安裝的補丁支持這個功能), ext3文件系統也不支持加密文件。鑒于這些原因, Linux項目的開發人員選擇再接再厲,繼續改進ext3文件系統。
ext4文件系統
擴展ext3文件系統功能的結果是ext4文件系統。 ext4文件系統在2008年受到Linux內核官方支持,現在已是大多數流行的Linux發行版采用的默認文件系統,比如Ubuntu。
除了支持數據壓縮和加密, ext4文件系統還支持一個稱作區段( extent)的特性。區段在存儲設備上按塊分配空間,但在索引節點表中只保存起始塊的位置。由于無需列出所有用來存儲文件中數據的數據塊,它可以在索引節點表中節省一些空間。
ext4還引入了塊預分配技術( block preallocation)。如果你想在存儲設備上給一個你知道要變大的文件預留空間, ext4文件系統可以為文件分配所有需要用到的塊,而不僅僅是那些現在已經用到的塊。 ext4文件系統用0填滿預留的數據塊,不會將它們分配給其他文件。
Reiser文件系統
ReiserFS文件系統只支持回寫日志模式——只把索引節點表數據寫到日志文件。 ReiserFS文件系統也因此成為Linux上最快的日志文件系統之一。
有兩個有意思的特性被引入了ReiserFS文件系統:一個是你可以在線調整已有文件系統的大小;另一個是被稱作尾部壓縮( tailpacking)的技術,該技術能將一個文件的數據填進另一個文件的數據塊中的空白空間。如果你必須為已有文件系統擴容來容納更多的數據,在線調整文件系統大小功能非常好用。
JFS文件系統
作為可能依然在用的最老的日志文件系統之一, JFS( Journaled File System, 日志化文件系統)是IBM在1990年為其Unix衍生版AIX開發的。然而直到第2版,它才被移植到Linux環境中。
JFS文件系統采用的是有序日志方法,即只在日志中保存索引節點表數據,直到真正的文件數據被寫進存儲設備時才刪除它。這個方法在ReiserFS的速度和數據模式日志方法的完整性之間的采取的一種折中。
JFS文件系統采用基于區段的文件分配,即為每個寫入存儲設備的文件分配一組塊。這樣可以減少存儲設備上的碎片。
除了用在IBM Linux上外, JFS文件系統并沒有流行起來,但你有可能在同Linux打交道的日子中碰到它。
XFS文件系統
XFS日志文件系統是另一種最初用于商業Unix系統而如今走進Linux世界的文件系統。美國硅圖公司( SGI)最初在1994年為其商業化的IRIX Unix系統開發了XFS。 2002年,它被發布到了適用于Linux環境的版本。
XFS文件系統采用回寫模式的日志,在提供了高性能的同時也引入了一定的風險,因為實際數據并未存進日志文件。 XFS文件系統還允許在線調整文件系統的大小,這點類似于ReiserFS文件系統,除了XFS文件系統只能擴大不能縮小。
寫時復制文件系統
采用了日志式技術,你就必須在安全性和性能之間做出選擇。盡管數據模式日志提供了最高的安全性,但是會對性能帶來影響,因為索引節點和數據都需要被日志化。如果是回寫模式日志,性能倒是可以接受,但安全性就會受到損害。
就文件系統而言,日志式的另一種選擇是一種叫作寫時復制( copy-on-write, COW)的技術。
COW利用快照兼顧了安全性和性能。如果要修改數據,會使用克隆或可寫快照。修改過的數據并不會直接覆蓋當前數據,而是被放入文件系統中的另一個位置上。即便是數據修改已經完成,之前的舊數據也不會被重寫。
COW文件系統已日漸流行,接下來會簡要概覽其中最流行的兩種( Btrf和ZFS)。
ZFS文件系統
COW文件系統ZFS是由Sun公司于2005年研發的,用于OpenSolaris操作系統,從2008年起開始向Linux移植,最終在2012年投入Linux產品的使用。
ZFS是一個穩定的文件系統,與Resier4、 Btrfs和ext4勢均力敵。它最大的弱項就是沒有使用GPL許可。自2013年發起的OpenZFS項目有可能改變這種局面。但是,在獲得GPL許可之前,ZFS有可能終無法成為Linux默認的文件系統。
Btrf文件系統
Btrfs文件系統是COW的新人,也被稱為B樹文件系統。它是由Oracle公司于2007年開始研發的。 Btrfs在Reiser4的諸多特性的基礎上改進了可靠性。另一些開發人員最終也加入了開發過程,幫助Btrfs快速成為了最流行的文件系統。究其原因,則要歸于它的穩定性、易用性以及能夠動態調整已掛載文件系統的大小。 OpenSUSE Linux發行版最近將Btrfs作為其默認文件系統。除此之外,該文件系統也出現在了其他Linux發行版中(如RHEL),不過并不是作為默認文件系統。
操作文件系統
Linux提供了一些不同的工具,我們可以利用它們輕松地在命令行中進行文件系統操作。可使用鍵盤隨心所欲地創建新的文件系統或者修改已有的文件系統。
創建分區
一開始,你必須在存儲設備上創建分區來容納文件系統。分區可以是整個硬盤,也可以是部分硬盤,以容納虛擬目錄的一部分。
fdisk工具用來幫助管理安裝在系統上的任何存儲設備上的分區。它是個交互式程序,允許你輸入命令來逐步完成硬盤分區操作。
要啟動fdisk命令,你必須指定要分區的存儲設備的設備名,另外還得有超級用戶權限。如果在沒有對應權限的情況下使用該命令,你會得到類似于下面這種錯誤提示。
$ fdisk /dev/sdb Unable to open /dev/sdb有時候,創建新磁盤分區最麻煩的事情就是找出安裝在Linux系統中的物理磁盤。 Linux采用了一種標準格式來為硬盤分配設備名稱,但是你得熟悉這種格式。對于老式的IDE驅動器, Linux使用的是/dev/hdx。其中x表示一個字母,具體是什么要根據驅動器的檢測順序(第一個驅動器是a,第二個驅動器是b,以此類推)。對于較新的SATA驅動器和SCSI驅動器, Linux使用/dev/sdx。其中的x具體是什么也要根據驅動器的檢測順序(和之前一樣,第一個驅動器是a,第二個驅動器是b,以此類推)。在格式化分區之前,最好再檢查一下是否正確指定了驅動器。
如果你擁有超級用戶權限并指定了正確的驅動器,那就可以進入fdisk工具的操作界面了。
下面展示了該命令在CentOS發行版中的使用情景。
如果這是你第一次給該存儲設備分區, fdisk會警告你設備上沒有分區表。
fdisk交互式命令提示符使用單字母命令來告訴fdisk做什么。
| a | 設置活動分區標志 |
| b | 編輯BSD Unix系統用的磁盤標簽 |
| c | 設置DOS兼容標志 |
| d | 刪除分區 |
| l | 顯示可用的分區類型 |
| m | 顯示命令選項 |
| n | 添加一個新分區 |
| o | 創建DOS分區表 |
| p | 顯示當前分區表 |
| q | 退出,不保存更改 |
| s | 為Sun Unix系統創建一個新磁盤標簽 |
| t | 修改分區的系統ID |
| u | 改變使用的存儲單位 |
| v | 驗證分區表 |
| w | 將分區表寫入磁盤 |
| x | 高級功能 |
盡管看上去很恐怖,但實際上你在日常工作中用到的只有幾個基本命令。
對于初學者,可以用p命令將一個存儲設備的詳細信息顯示出來。
輸出顯示這個存儲設備有5368 MB( 5 GB)的空間。存儲設備明細后的列表說明這個設備上
是否已有分區。這個例子中的輸出中沒有顯示任何分區,所以設備還未分區。
下一步,可以使用n命令在該存儲設備上創建新的分區。
分區可以按主分區( primary partition)或擴展分區( extended partition)創建。主分區可以被文件系統直接格式化,而擴展分區則只能容納其他主分區①。擴展分區出現的原因是每個存儲設備上只能有4個分區。可以通過創建多個擴展分區,然后在擴展分區內創建主分區進行擴展。 上例中創建了一個主分區,在存儲設備上給它分配了分區號1,然后給它分配了2 GB的存儲設備空間。你可以再次使用p命令查看結果。
Command (m for help): p Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x029aa6af Device Boot Start End Blocks Id System /dev/sdb1 1 262 2104483+ 83 Linux Command (m for help):從輸出中現在可以看到,該存儲設備上有了一個分區(叫作/dev/sdb1)。 Id列定義了Linux怎么對待該分區。 fdisk允許創建多種分區類型。使用l命令列出可用的不同類型。默認類型是83,該類型定義了一個Linux文件系統。如果你想為其他文件系統創建一個分區(比如Windows的NTFS分區),只要選擇一個不同的分區類型即可。
可以重復上面的過程,將存儲設備上剩下的空間分配給另一個Linux分區。創建了想要的分區之后,用w命令將更改保存到存儲設備上。
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.存儲設備的分區信息被寫入分區表中, Linux系統通過ioctl()調用來獲知新分區的出現。設置好分區之后,可以使用Linux文件系統對其進行格式化。
創建文件系統
在將數據存儲到分區之前,你必須用某種文件系統對其進行格式化,這樣Linux才能使用它。
每種文件系統類型都用自己的命令行程序來格式化分區。
創建文件系統的命令行程序
| mkefs | 創建一個ext文件系統 |
| mke2fs | 創建一個ext2文件系統 |
| mkfs.ext3 | 創建一個ext3文件系統 |
| mkfs.ext4 | 創建一個ext4文件系統 |
| mkreiserfs | 創建一個ReiserFS文件系統 |
| jfs_mkfs | 創建一個JFS文件系統 |
| mkfs.xfs | 創建一個XFS文件系統 |
| mkfs.zfs | 創建一個ZFS文件系統 |
| mkfs.btrfs | 創建一個Btrfs文件系統 |
并非所有文件系統工具都已經默認安裝了。要想知道某個文件系統工具是否可用,可以使用type命令。
$ type mkfs.ext4 mkfs.ext4 is /sbin/mkfs.ext4 $ $ type mkfs.btrfs -bash: type: mkfs.btrfs: not found $據上面這個取自Ubuntu系統的例子顯示, mkfs.ext4工具是可用的。而Btrfs工具則不可用。每個文件系統命令都有很多命令行選項,允許你定制如何在分區上創建文件系統。要查看所有可用的命令行選項,可用man命令來顯示該文件系統命令的手冊頁面。所有的文件系統命令都允許通過不帶選項的簡單命令來創建一個默認的文件系統。
$ sudo mkfs.ext4 /dev/sdb1 [sudo] password for Christine: mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131648 inodes, 526120 blocks 26306 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=541065216 17 block groups 32768 blocks per group, 32768 fragments per group 7744 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 23 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.這個新的文件系統采用ext4文件系統類型,這是Linux上的日志文件系統。注意,創建過程中有一步是創建新的日志。
為分區創建了文件系統之后,下一步是將它掛載到虛擬目錄下的某個掛載點,這樣就可以將數據存儲在新文件系統中了。你可以將新文件系統掛載到虛擬目錄中需要額外空間的任何位置。
mkdir命令在虛擬目錄中創建了掛載點, mount命令將新的硬盤分區添加到掛載點。 mount命令的-t選項指明了要掛載的文件系統類型( ext4)。現在你可以在新分區中保存新文件和目錄了!
這種掛載文件系統的方法只能臨時掛載文件系統。當重啟Linux系統時,文件系統并不會自動掛載。要強制Linux在啟動時自動掛載新的文件系統,可以將其添加到/etc/fstab文件。
現在文件系統已經被掛載了到虛擬目錄中,可以投入日常使用了。遺憾的是,在日常使用過
程中有可能會出現一些嚴重的問題,例如文件系統損壞。下一節將演示如何應對這種問題。
文件系統的檢查與修復
就算是現代文件系統,碰上突然斷電或者某個不規矩的程序在訪問文件時鎖定了系統,也會出現錯誤。幸而有一些命令行工具可以幫你將文件系統恢復正常。
每個文件系統都有各自可以和文件系統交互的恢復命令。這可能會讓局面變得不太舒服,隨著Linux環境中可用的文件系統變多,你也不得不去掌握大量對應的命令。好在有個通用的前端程序,可以決定存儲設備上的文件系統并根據要恢復的文件系統調用適合的文件系統恢復命令。
fsck命令能夠檢查和修復大部分類型的Linux文件系統,包括本章早些時候討論過的ext、ext2、 ext3、 ext4、 ReiserFS、 JFS和XFS。該命令的格式是:
你可以在命令行上列出多個要檢查的文件系統。文件系統可以通過設備名、在虛擬目錄中的掛載點以及分配給文件系統的唯一UUID值來引用。
竅門 盡管日志式文件系統的用戶需要用到fsck命令,但是COW文件系統的用戶是否也得使用 該命令還存在爭議。實際上,ZFS文件系統甚至都沒有提供fsck工具的接口。
fsck命令使用/etc/fstab文件來自動決定正常掛載到系統上的存儲設備的文件系統。如果存儲設備尚未掛載(比如你剛剛在新的存儲設備上創建了個文件系統),你需要用-t命令行選項來指定文件系統類型。表8-4列出了其他可用的命令行選項。
fsck的命令行選項
| -a | 如果檢測到錯誤,自動修復文件系統 |
| -A | 檢查/etc/fstab文件中列出的所有文件系統 |
| -C | 給支持進度條功能的文件系統顯示一個進度條(只有ext2和ext3) |
| -N | 不進行檢查,只顯示哪些檢查會執行 |
| -r | 出現錯誤時提示 |
| -R | 使用-A選項時跳過根文件系統 |
| -s | 檢查多個文件系統時,依次進行檢查 |
| -t | 指定要檢查的文件系統類型 |
| -T | 啟動時不顯示頭部信息 |
| -V | 在檢查時產生詳細輸出 |
| -y | 檢測到錯誤時自動修復文件系統 |
你可能注意到了,有些命令行選項是重復的。這是為多個命令實現通用的前端帶來的部分問題。有些文件系統修復命令有一些額外的可用選項。如果要做更高級的錯誤檢查,就需要查看這個文件系統修復工具的手冊頁面來確定是不是有該文件系統專用的擴展選項。
只能在未掛載的文件系統上運行fsck命令。對大多數文件系統來說,你只需卸載文件系統來進行檢查,檢查完成之后重新掛載就好了。但因為根文件系統含有所有核心的Linux命令和日志文件,所以你無法在處于運行狀態的系統上卸載它。
這正是親手體驗Linux LiveCD的好時機!只需用LiveCD啟動系統即可,然后在根文件系統上運行fsck命令。
邏輯卷管理
如果用標準分區在硬盤上創建了文件系統,為已有文件系統添加額外的空間多少是一種痛苦的體驗。你只能在同一個物理硬盤的可用空間范圍內調整分區大小。如果硬盤上沒有地方了,你就必須弄一個更大的硬盤,然后手動將已有的文件系統移動到新的硬盤上。
這時候可以通過將另外一個硬盤上的分區加入已有文件系統,動態地添加存儲空間。 Linux邏輯卷管理器( logical volume manager, LVM)軟件包正好可以用來做這個。它可以讓你在無需重建整個文件系統的情況下,輕松地管理磁盤空間。
邏輯卷管理布局
邏輯卷管理的核心在于如何處理安裝在系統上的硬盤分區。在邏輯卷管理的世界里,硬盤稱作物理卷( physical volume, PV)。每個物理卷都會映射到硬盤上特定的物理分區。
多個物理卷集中在一起可以形成一個卷組( volume group, VG)。邏輯卷管理系統將卷組視為一個物理硬盤,但事實上卷組可能是由分布在多個物理硬盤上的多個物理分區組成的。卷組提供了一個創建邏輯分區的平臺,而這些邏輯分區則包含了文件系統。
整個結構中的最后一層是邏輯卷(logical volume, LV)。邏輯卷為Linux提供了創建文件系統的分區環境,作用類似于到目前為止我們一直在探討的Linux中的物理硬盤分區。 Linux系統將邏輯卷視為物理分區。
可以使用任意一種標準Linux文件系統來格式化邏輯卷,然后再將它加入Linux虛擬目錄中的某個掛載點。
圖8-1顯示了典型Linux邏輯卷管理環境的基本布局。
圖8-1中的卷組橫跨了三個不同的物理硬盤,覆蓋了五個獨立的物理分區。在卷組內部有兩個獨立的邏輯卷。 Linux系統將每個邏輯卷視為一個物理分區。每個邏輯卷可以被格式化成ext4文件系統,然后掛載到虛擬目錄中某個特定位置。
注意,圖8-1中,第三個物理硬盤有一個未使用的分區。通過邏輯卷管理,你隨后可以輕松地將這個未使用分區分配到已有卷組:要么用它創建一個新的邏輯卷,要么在需要更多空間時用它來擴展已有的邏輯卷。
類似地,如果你給系統添加了一塊硬盤,邏輯卷管理系統允許你將它添加到已有卷組,為某個已有的卷組創建更多空間,或是創建一個可用來掛載的新邏輯卷。這種擴展文件系統的方法要好用得多!
Linux 中的 LVM
Linux LVM是由Heinz Mauelshagen開發的,于1998年發布到了Linux社區。它允許你在Linux上用簡單的命令行命令管理一個完整的邏輯卷管理環境。
Linux LVM有兩個可用的版本。
? LVM1:最初的LVM包于1998年發布,只能用于Linux內核2.4版本。它僅提供了基本的邏輯卷管理功能。
? LVM2: LVM的更新版本,可用于Linux內核2.6版本。它在標準的LVM1功能外提供了額外的功能。
大部分采用2.6或更高內核版本的現代Linux發行版都提供對LVM2的支持。除了標準的邏輯卷管理功能外, LVM2還提供了另外一些好用的功能。
快照
最初的Linux LVM允許你在邏輯卷在線的狀態下將其復制到另一個設備。這個功能叫作快照。在備份由于高可靠性需求而無法鎖定的重要數據時,快照功能非常給力。傳統的備份方法在將文件復制到備份媒體上時通常要將文件鎖定。快照允許你在復制的同時,保證運行關鍵任務的Web服務器或數據庫服務器繼續工作。遺憾的是, LVM1只允許你創建只讀快照。一旦創建了
照,就不能再寫入東西了。
LVM2允許你創建在線邏輯卷的可讀寫快照。有了可讀寫的快照,就可以刪除原先的邏輯卷,然后將快照作為替代掛載上。這個功能對快速故障轉移或涉及修改數據的程序試驗(如果失敗,需要恢復修改過的數據)非常有用。
條帶化
LVM2提供的另一個引人注目的功能是條帶化( striping)。有了條帶化,可跨多個物理硬盤創建邏輯卷。當Linux LVM將文件寫入邏輯卷時,文件中的數據塊會被分散到多個硬盤上。每個后繼數據塊會被寫到下一個硬盤上。
條帶化有助于提高硬盤的性能,因為Linux可以將一個文件的多個數據塊同時寫入多個硬盤,而無需等待單個硬盤移動讀寫磁頭到多個不同位置。這個改進同樣適用于讀取順序訪問的文件,因為LVM可同時從多個硬盤讀取數據。
說明 LVM條帶化不同于RAID條帶化。 LVM條帶化不提供用來創建容錯環境的校驗信息。事實上, LVM條帶化會增加文件因硬盤故障而丟失的概率。單個硬盤故障可能會造成多個邏輯卷無法訪問。
鏡像
通過LVM安裝文件系統并不意味著文件系統就不會再出問題。和物理分區一樣, LVM邏輯卷也容易受到斷電和磁盤故障的影響。一旦文件系統損壞,就有可能再也無法恢復。
LVM快照功能提供了一些安慰,你可以隨時創建邏輯卷的備份副本,但對有些環境來說可能還不夠。對于涉及大量數據變動的系統,比如數據庫服務器,自上次快照之后可能要存儲成百上千條記錄。
這個問題的一個解決辦法就是LVM鏡像。鏡像是一個實時更新的邏輯卷的完整副本。當你創建鏡像邏輯卷時, LVM會將原始邏輯卷同步到鏡像副本中。根據原始邏輯卷的大小,這可能需要一些時間才能完成。
一旦原始同步完成, LVM會為文件系統的每次寫操作執行兩次寫入——一次寫入到主邏輯卷,一次寫入到鏡像副本。可以想到,這個過程會降低系統的寫入性能。就算原始邏輯卷因為某些原因損壞了,你手頭也已經有了一個完整的最新副本!
使用 Linux LVM
現在你已經知道Linux LVM可以做什么了,本節將討論如何創建LVM來幫助組織系統上的硬盤空間。 Linux LVM包只提供了命令行程序來創建和管理邏輯卷管理系統中所有組件。有些Linux發行版則包含了命令行命令對應的圖形化前端,但為了完全控制你的LVM環境,最好習慣直接使用這些命令。
定義物理卷
創建過程的第一步就是將硬盤上的物理分區轉換成Linux LVM使用的物理卷區段。我們的朋友fdisk命令可以幫忙。在創建了基本的Linux分區之后,你需要通過t命令改變分區類型。
[...] Command (m for help): t Selected partition 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 5368 MB, 5368709120 bytes 255 heads, 63 sectors/track, 652 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xa8661341 Device Boot Start End Blocks Id System /dev/sdb1 1 262 2104483+ 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. $分區類型8e表示這個分區將會被用作Linux LVM系統的一部分,而不是一個直接的文件系統(就像你在前面看到的83類型的分區)。
說明 如果下一步中的pvcreate命令不能正常工作, 很可能是因為LVM2軟件包沒有默認安裝。可以使用軟件包名lvm2,按照第9章中介紹的軟件安裝方法安裝這個包。
下一步是用分區來創建實際的物理卷。這可以通過pvcreate命令來完成。 pvcreate定義了用于物理卷的物理分區。它只是簡單地將分區標記成Linux LVM系統中的分區而已。
$ sudo pvcreate /dev/sdb1 dev_is_mpath: failed to get device for 8:17 Physical volume "/dev/sdb1" successfully created $說明 別被嚇人的消息dev_is_mpath: failed to get device for 8:17或類似的消息唬住了。只要看到了successfully created就沒問題。 pvcreate命令會檢查分區是否為多路(multi-path, mpath)設備。如果不是的話,就會發出上面那段消息。
如果你想查看創建進度的話,可以使用pvdisplay命令來顯示已創建的物理卷列表。
$ sudo pvdisplay /dev/sdb1 "/dev/sdb1" is a new physical volume of "2.01 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 2.01 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID 0FIuq2-LBod-IOWt-8VeN-tglm-Q2ik-rGU2w7 $pvdisplay命令顯示出/dev/sdb1現在已經被標記為物理卷。注意,輸出中的VG Name內容為空,因為物理卷還不屬于某個卷組。
創建卷組
下一步是從物理卷中創建一個或多個卷組。究竟要為系統創建多少卷組并沒有既定的規則,你可以將所有的可用物理卷加到一個卷組,也可以結合不同的物理卷創建多個卷組。
要從命令行創建卷組,需要使用vgcreate命令。 vgcreate命令需要一些命令行參數來定義卷組名以及你用來創建卷組的物理卷名。
$ sudo vgcreate Vol1 /dev/sdb1 Volume group "Vol1" successfully created輸出結果平淡無奇。如果你想看看新創建的卷組的細節,可用vgdisplay命令。
$ sudo vgdisplay Vol1 --- Volume group --- VG Name Vol1 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 2.00 GiB PE Size 4.00 MiB Total PE 513 Alloc PE / Size 0 / 0 Free PE / Size 513 / 2.00 GiB VG UUID oe4I7e-5RA9-G9ti-ANoI-QKLz-qkX4-58Wj6e這個例子使用/dev/sdb1分區上創建的物理卷,創建了一個名為Vol1的卷組。創建一個或多個卷組后,就可以創建邏輯卷了。
創建邏輯卷
Linux系統使用邏輯卷來模擬物理分區,并在其中保存文件系統。 Linux系統會像處理物理分區一樣處理邏輯卷,允許你定義邏輯卷中的文件系統,然后將文件系統掛載到虛擬目錄上。
要創建邏輯卷,使用lvcreate命令。雖然你通常不需要在其他Linux LVM命令中使用命令行選項,但lvcreate命令要求至少輸入一些選項。
lvcreate的選項
| -c | –chunksize | 指定快照邏輯卷的單位大小 |
| -C | –contiguous | 設置或重置連續分配策略 |
| -i | –stripes | 指定條帶數 |
| -I | –stripesize | 指定每個條帶的大小 |
| -l | –extents | 指定分配給新邏輯卷的邏輯區段數,或者要用的邏輯區段的百分比 |
| -L | –size | 指定分配給新邏輯卷的硬盤大小 |
| –minor | 指定設備的次設備號 | |
| -m | –mirrors | 創建邏輯卷鏡像 |
| -M | –persistent | 讓次設備號一直有效 |
| -n | –name | 指定新邏輯卷的名稱 |
| -p | –permission | 為邏輯卷設置讀/寫權限 |
| -r | –readahead | 設置預讀扇區數 |
| -R | –regionsize | 指定將鏡像分成多大的區 |
| -s | snapshot | 創建快照邏輯卷 |
| -Z | –zero | 將新邏輯卷的前1 KB數據設置為零 |
雖然命令行選項看起來可能有點嚇人,但大多數情況下你用到的只是少數幾個選項。
$ sudo lvcreate -l 100%FREE -n lvtest Vol1 Logical volume "lvtest" created $如果想查看你創建的邏輯卷的詳細情況,可用lvdisplay命令。
$ sudo lvdisplay Vol1 --- Logical volume --- LV Path /dev/Vol1/lvtest LV Name lvtest VG Name Vol1 LV UUID 4W2369-pLXy-jWmb-lIFN-SMNX-xZnN-3KN208 LV Write Access read/write LV Creation host, time ... -0400 LV Status available # open 0 LV Size 2.00 GiB Current LE 513 Segments 1 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2現在可以看到你剛剛創建的邏輯卷了!注意,卷組名( Vol1)用來標識創建新邏輯卷時要使用的卷組。
-l選項定義了要為邏輯卷指定多少可用的卷組空間。注意,你可以按照卷組空閑空間的百分比來指定這個值。本例中為新邏輯卷使用了所有的空閑空間。
你可以用-l選項來按可用空間的百分比來指定這個大小,或者用-L選項以字節、千字節( KB)、兆字節( MB)或吉字節( GB)為單位來指定實際的大小。 -n選項允許你為邏輯卷指定一個名稱(在本例中稱作lvtest)。
創建文件系統
運行完lvcreate命令之后,邏輯卷就已經產生了,但它還沒有文件系統。你必須使用相應的命令行程序來創建所需要的文件系統。
$ sudo mkfs.ext4 /dev/Vol1/lvtest mke2fs 1.41.12 (17-May-2010) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131376 inodes, 525312 blocks 26265 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=541065216 17 block groups 32768 blocks per group, 32768 fragments per group 7728 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 Writing inode tables: done Creating journal (16384 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 28 mounts or 180 days, whichever comes first.Use tune2fs -c or -i to override. $在創建了新的文件系統之后,可以用標準Linux mount命令將這個卷掛載到虛擬目錄中,就跟它是物理分區一樣。唯一的不同是你需要用特殊的路徑來標識邏輯卷。
$ sudo mount /dev/Vol1/lvtest /mnt/my_partition $ $ mount /dev/mapper/vg_server01-lv_root on / type ext4 (rw) [...] /dev/mapper/Vol1-lvtest on /mnt/my_partition type ext4 (rw) $ $ cd /mnt/my_partition $ $ ls -al total 24 drwxr-xr-x. 3 root root 4096 Jun 12 10:22 . drwxr-xr-x. 3 root root 4096 Jun 11 09:58 .. drwx------. 2 root root 16384 Jun 12 10:22 lost+found $注意, mkfs.ext4和mount命令中用到的路徑都有點奇怪。路徑中使用了卷組名和邏輯卷名,而不是物理分區路徑。文件系統被掛載之后,就可以訪問虛擬目錄中的這塊新區域了。
修改LVM
Linux LVM的好處在于能夠動態修改文件系統,因此最好有工具能夠讓你實現這些操作。在Linux有一些工具允許你修改現有的邏輯卷管理配置。
如果你無法通過一個很炫的圖形化界面來管理你的Linux LVM環境,也不是什么都干不了。在本章中你已經看到了一些Linux LVM命令行程序的實際用法。還有一些其他的命令可以用來管理LVM的設置。表8-6列出了在Linux LVM包中的常見命令。
| vgchange | 激活和禁用卷組 |
| vgremove | 刪除卷組 |
| vgextend | 將物理卷加到卷組中 |
| vgreduce | 從卷組中刪除物理卷 |
| lvextend | 增加邏輯卷的大小 |
| lvreduce | 減小邏輯卷的大小 |
竅門 在手動增加或減小邏輯卷的大小時,要特別小心。邏輯卷中的文件系統需要手動修整來處理大小上的改變。大多數文件系統都包含了能夠重新格式化文件系統的命令行程序,比如用于ext2、 ext3和ext4文件系統的resize2fs程序。
總結
- 上一篇: linux c字符连接,C 语言实例
- 下一篇: 数据库日志的说明