融於心而表於行 之 磁盤的管理方式

2.5 磁盤的管理方式

用戶也好,權限也罷,它們總是要有一個證明自己的天地;文件也罷,程序也好,它們總是得有一個安身立命的家園;即便Linux自己也必須得有自己的棲身之所。那就是磁盤。其實Linux對磁盤的管理十分對得起兩個字:“不賴”!

2.5.1Linux的文件系統

只要是磁盤就得格式化,好像已經是天經地義的事情了,幾乎沒有人去問爲什麼。很多有經驗的人在似乎都有個這樣的經歷,就是風風火火的從朋友那裏借來了一張裝滿高清A片的移動硬盤,暗爽過後還想留下一些待以後慢慢品味,可是總有那麼一些質量比較好的片子(尺寸超過4G)複製失敗。追問原因還往往被高手們嘲笑:都什麼年代了你還用FAT32,趕緊換NTFS吧”。我想這個時候你就不得不追問一下,爲什麼FAT32不行而NTFS卻能行吧?

因爲它們是不同的文件系統,功能不同,能力不同。FAT32是在Windows95時×××始採用的文件系統,到現在都有人在用(比如U盤),可以說是伴隨着我們成長的文件系統。FATFile Allocation Table的縮寫,從字面意義上就能看出這是一種類似表格一樣的文件系統。由於其用於描述文件大小的屬性是一個32位的值,導致其能夠支持的單個文件最大不能超過4G。而NTFS是微軟專門爲NT系統設計的,單個文件最大可以達到2T。現在最爲常用的Windows XPWindows 7都支持NTFS。至於NTFS是怎麼管理文件的有點不太好說,因爲微軟一直當它是個“祕密

Linux也有自己的文件系統格式,被稱爲ExtNN=234)。如果要追溯ExtN的起源,其實要比FAT32NTFS都要古老,也就是我們前面所說的基於inode的文件系統。如前面所述,ExtN文件系統必定要包含inode數據結構來代表一個文件,並且存儲這個文件的各種屬性和權限。至於實際的數據則放在data block塊區中。除此之外,ExtN文件系統還有一個超級塊區(superblock),用於記錄整個文件系統的整體信息,包括inodedata block的總量、使用量和剩餘量。

data blockinode一樣,每一個都有一個唯一編號,inode只需要記錄這些編號,就能夠定位整個文件的任意一段數據。我們假定有一個編號爲3inode,它所代表的文件的數據被放置在編號爲25681320的這幾個data block中。那麼讀取這個文件的過程則如圖2.4所示。採用這種數據存取的方法的文件系統被稱之爲索引式文件系統”。它與伴隨着很多人成長的FAT32有什麼不同呢?圖2.5對比了這個過程。

通過對兩個圖的比較,我們可以清晰的看出,ExtN通過inode能夠一次性獲得文件數據所存放的位置,可以據此來安排磁盤的閱讀順序,儘量保證在磁盤只旋轉一圈的情況下將所有內容讀出來。而FAT32則只有將對應的data block讀入之後才知道下一個data block在什麼地方。如果一個文件的data block比較分散的話,將很難保證在磁盤只旋轉一圈的情況下讀取全部數據,有時候甚至要多轉很多圈才能讀完數據。

這就是我們非常熟悉的磁盤碎片問題。由於長時間的對文件進行創建、刪除、讀寫,很難保證同一個文件的data block的位置相鄰。而由於FAT32的讀寫特性,在data block不相鄰的情況下讀寫性能會極具下降。所以爲了提高Windows系統的磁盤性能,經常性的做磁盤碎片整理是非常有必要的。

而對於Linux這種文件系統,則基本上不需要進行磁盤碎片整理。而且你也基本上找不到類似的工具。但是Linux系統經過長時間使用之後,還是會有文件數據過於分散的問題的。即便能夠做到很好的規劃,但是對性能多多稍稍還是會有一些影響,只是沒有使用FAT32Windows那麼嚴重罷了。所以,一個使用時間很久的Linux系統也會因爲磁盤碎片問題而變慢,這也是事實。只是不需要太過在意它。

221018736.jpg

2.4 ExtN文件系統讀取數據過程示意圖

221048847.jpg

2.5 FAT32文件系統讀取數據過程示意圖

2.5.2 磁盤的基本操作

在前面的小結中介紹過幾個最常用的文件操作命令:lscdcprmmv。雖然它們也都是作用在磁盤上,但是它們面向的對象更爲高級一些,屬於文件範疇的。而我們現在要介紹的是稍微低級一點,面對是的文件的載體——磁盤的一些基本操作。最常用的是:dfduddfsckmount

df命令用於查看系統中所有磁盤的整體使用量。在我們的測試系統中能夠得到如下所示信息:

Filesystem 1K-blocks Used Available Use% Mountedon

/dev/mapper/VolGroup-lv_root

51606140 5587240 43397460 12% /

tmpfs 250860 272 250588 1% /dev/shm

/dev/sda1 495844 31891 438353 7% /boot

/dev/mapper/VolGroup-lv_home

9877432 1681704 7693968 18% /home

可見df命令的輸出還是比較清晰的。但是有兩個概念可能需要解釋一下,就是這裏所說的FilesystemMounted on。如果要翻譯成中文(很多人的機器中可能顯示的字段名)則是文件系統掛載點

這裏所說的文件系統與我們之前所說的操作系統中的文件系統的概念有點不盡相同,着這裏更多的含義指的是磁盤分區。之所以叫它是文件系統,是因爲每一個磁盤分區都是一個文件系統的具體實例,如果套用面向對象的說法就是,類和對象。諸如ExtN這樣的就是類,而具體的磁盤分區就是這個類的對象。至於掛載點則比較有趣,它是某個具體的目錄。

df每一個行的輸出上看,難道具體的磁盤分區會與某個具體的目錄有關?事實的確是這樣的。前面也是說過,Linux沒有Windows中的C盤、D盤的概念。精通Windows的同學都清楚,Windows中的分區會有一個盤符與它對應,在分區中的文件和目錄的組織結構就像一顆樹一樣,樹根就是盤符+“:”Linux組織文件和目錄的方式最終也能被看作是一棵樹。但是由於沒有C盤、D盤的概念,更沒有盤符一說,於是就特意規定了一個總的樹根叫/,而具體某個分區的樹根就從某個目錄開始。至於不同的分區應該從哪個目錄開始這個就沒有明確的規定。其實不規定也就是有規定,即你可以隨意指派。而具體指派哪個分區與哪個目錄對應,就由mount命令來指定了。之後只要訪問哪個目錄裏的任何文件或目錄,都是對具體的分區進行訪問了。而這個目錄則被稱爲掛載點

根據df命令的輸出內容可以看出,Linux文件中的總樹根/分區/dev/mapper/VolGroup-lv_root相關聯,而/dev/shm目錄與分區tmpfs相關聯,/boot目錄與分區/dev/sda1相關聯,……。這些分區名都什麼含義呢?其實在這些所謂的分區中,只有/dev/sda1纔是真正的磁盤分區,而這個名稱則是這個磁盤分區的設備名。在Linux系統中,/dev目錄下的所有文件都與一個具體的設備有關,有物理的,也有虛擬的。而sda1這個就是一個物理的設備。它對應系統第一塊串口硬盤的第一個分區。那麼如果是第二個分區呢?sda2,第三個是sda3……,而對應整塊硬盤的則是sda。由此遞推,第二塊串口硬盤,應該是sdb,第三塊應該是sdc……。而/dev/mapper/*這些又是什麼呢?這個就是虛擬的設備了,它實際上是邏輯卷。有關邏輯卷的概念我們稍後在說,現在你只要知道它是虛擬的磁盤分區就行了。不過更奇怪的是tmpfs,這個設備文件在什麼地方呢?答案是沒有,因爲它不對應任何設備。它實際上是真正的文件系統名稱。而這個文件系統是在內存中虛擬的,與具體的硬盤無關,所以也沒有具體的設備。於是在df的輸出中所幸就與類名代替了。這樣的文件系統還有很多,比如procfssysfs等,本書會有專門的一章來介紹這些特種文件系統。

df命令本身就沒有什麼好繼續再介紹的了,上述的一些概念遠比df本身要重要很多,這個是大家應該更加註意的。對於/dev目錄下的那些文件,本書不會逐個的去講述它們都代表誰。畢竟每個人的系統都不同,所以也沒法說,你沒看到你怎麼信我呢?比較好辦的辦法是問百度或谷歌,它們是你學習Linux必不可少的工具。好了,我不能再說多了,因爲這樣你們都會不買我的書而逛百度去了。

df命令是用來觀察總體磁盤使用量的,要觀察局部使用量,需要使用du命令。df命令可以通過讀取磁盤的superblock來實現,而du命令則不同,它要搜索所有的inode來計算局部數據,所以du命令的執行效率,經常要比df差很多。

從嚴格意義上來講,dd命令應該不屬於管理磁盤的命令,因爲在聯機幫助中說它的功能是convert and copy a file。但是如果你想要直接讀寫磁盤的每一個扇區,或者鏡像整個磁盤,dd命令則是非常好的選擇。通常dd命令的格式如下:

dd if=input_file of=out_file

從這個基本用法,如果像聯機幫助中說描述的,複製一個文件,可以使用類似這樣的命令:

# dd if=/etc/bashrc of=./bashrc

這個命令與cp /etc/bashrc ./bashrc是等價的。其實“if”和“of”這兩個參數也不用給定,會有默認值。“if”的默認值是標準輸入,“of”的默認值是標準輸出。如果要模擬cat命令,可以使用這樣的命令:

# dd if=/etc/bashrc

根據前面的講述的內容,具體的硬件設備在/dev目錄下會由具體的文件與之對應,比如/dev/sda1。如果要製作第一個串口磁盤第一個分區的鏡像文件,可以使用這樣的命令:

# dd if=/dev/sda1 of=./sda1.img

需要注意,執行上面的命令時,輸出文件所在的分區必須大於sda1分區,至於爲什麼我想你懂的。如果還希望對生成的鏡像文件壓縮一下,可以使用這樣的命令:

# dd if=/dev/sda1 | gzip -9 > ./sda1.img

按照這個思路,我們將整個磁盤都做一個鏡像呢?

# dd if=/dev/sda | gzip -9 > ./sda.img

如果要恢復這個磁盤的內容,就可以這樣:# gzip -dc ./sda.img | ddof=/dev/sda

通過這兩條命令,大家想到了什麼?這個是不是與我們在Windows下經常使用ghost非常像呢?感覺塞門鐵克公司的老大應該找塊豆腐撞死。而dd命令還不止這點本事,它還能指定讀寫數據量。比如bscount這兩個參數,能夠指定依次讀寫的自己數和讀寫次數,這樣就能夠指定讀寫數量了。比如我要備份磁盤的主引導記錄,可以這樣:

# dd if=/dev/sda of=./mbr.img bs=512 count=1

這要求值讀取sda磁盤的首個512個字節的信息,也就是第一個扇區的內容,將它保存到mbr.img文件。對mbr內容感興趣的同學,可以使用反彙編工具,將這個文件反彙編掉,就能知道計算機是怎麼啓動的了。

使用dd命令能夠做的事情還有很多,比如銷燬磁盤數據、測試磁盤讀寫速度、修復磁盤等,爲了方便你使用,我將這些技巧列下來:

# dd if=/dev/urandom of=/dev/sda1

# dd if=/dev/zero of=./test.file bs=1024count=1000000

# dd if=./test.file bs=8k | dd of=/dev/null

# dd if=/dev/sda of=/dev/sda

看完這些,我覺得你們更會認爲賽門鐵克公司的老大應該買塊豆腐撞死。特別說明一下/dev/urandom/dev/zero/dev/null這三個虛擬設備設備文件非常有用。urandom代表隨即數,每次讀入的數據都不會相同;zero代表0,每次讀入的數據都是0;而null主要面對寫,相當於是一個黑洞一樣,無論寫什麼都會消失得無影無蹤。

不知道通過我上面的介紹,大家是否已經理解dd在磁盤管理中的作用了呢?既然到了這個份上,理不理解我也管不了了。生活還得繼續,我們的內容接着往下走,該說一下fsck了。

fsck一般我們很少手工執行,基本上都是在系統啓動階段就執行了。至於它是什麼作用則非常簡單,與Windowsscandisk一樣,對文件系統的損壞進行修復。需要注意,fsck只能對文件系統的損壞進行修復,對磁盤的損壞它是沒有辦法的。後面我們會有單獨的章節來介紹fsck的工作原理,這裏就不做複述。具體的使用方法就是:

# fsck -t 文件系統設備名

比如

# fsck -f -t ext3 /dev/hda3

其中參數-f要求進行強制檢查。如果不增加-f選項,在沒有報錯的磁盤中是不會做檢查的。至於磁盤什麼時候會報錯呢?一般就是非法關機的時候了!

期待已久的mount的終於登場了。前面已經講過掛接點是個什麼東西了,相信大家還在爲Linux這種怪異的設計而嘖嘖稱奇呢。但是早已用慣Linux的我反倒覺得Windows的設計非常奇怪。相比之下,Linux的方式更爲靈活。就比如在Windows下有一個軟件必須在D盤下的某個目錄中讀取文件,而這個軟件若是在一個沒有D盤的系統中就無法執行了;相反的,在Linux下,只需要特意創建一個目錄即可,如果需要單獨的磁盤分區來存儲它,使用mount命令指定給它就好了。

雖說mount命令聽起來有點神奇,但是使用起來卻是非常簡單。一般的用法是這樣的:

# mount [-t 文件系統] 設備名稱掛接點

比如我們要將系統中第二塊串口硬盤的第一個分區(如果有的話)掛接到/data目錄下,可以這樣用:

# mount /dev/sdb1 /data

# mount -t vfat /dev/sdb1 /data

怎麼樣,夠簡單的吧?對於第二種用法很多時候-t參數是多餘的,因爲類似ext2ext3這樣的ExtN類的基於inode的文件系統,都是都有超級塊的。利用超級塊就能夠瞭解到具體的文件系統。所以第一種用法在大多數時候都會成功。而第二種用法多數用於掛接Windows分區時使用,因爲這些文件文件系統不具備超級快。

其實掛接磁盤分區還只是mount命令的最平常的一種用法。由於Linux使用設備文件來描述一個設備,那麼如果有一個實際的文件中的內容與在某個磁盤設備文件中的讀到的內容一致,那麼這個實際的文件也能夠掛接進來。就比如我們之前使用dd命令創建的sda1.img文件(未壓縮的),就可以利用這樣的命令來掛進到一個目錄上:

# mount -o loop ./sda1.img /mnt/sda1

這樣你就會發現/mnt/sda1目錄下的內容與/boot目錄下的內容相同(別忘了之前df命令的輸出)。以此類推,我們下載到的*.iso文件也可以使用同樣的方法掛接到某個目錄上直接訪問了。例如:

# mount -o loop ./CentOS-6.4-x86_64-bin-DVD1.iso/mnt/centos

看到這裏是不是覺得Windows下那些虛擬光驅軟件的作者們都開買塊豆腐撞死了?

在這種mount的用法中,比較重要的是“-o命令選項,這是個mount比較靈活的一個選項,有很多可選參數。比如“ro”說明掛接的磁盤是隻讀的、“rw說明掛接的磁盤是可讀寫的等等。而loop則說明要掛接的文件是一個虛擬設備,而這個虛擬設備是環形的設備。爲什麼是“環形”呢?想想硬盤、光盤、軟盤等都是什麼形狀就行了。還不知道?圓形的啊!

mount相反的操作就是卸載了,使用umount命令。它的操作更加簡單,給定掛接點目錄或具體設備就行了。比如

# umount /data

#umount /dev/sdb1

如果你的系統中有這些設備,則這兩種方法是等價的。

其餘的有關進行磁盤分區和格式化的命令就不做詳細介紹了。因爲很多人連Windows下這樣的工具怎麼用都還搞不清楚,可見它們都是很少用到的東西。爲了滿足一份同學的好奇心,我們在這裏只說一下它們的名字。

用於磁盤分區的命令是fdisk,這與WindowsDOS下的命令名是一致的。比fdisk更好用一些的分區工具是cfdiskCent OS中有提供。而對磁盤做格式化的則不是format命令。在Linux是下mkfs.*命令。至於*是什麼,取決於你格式化成什麼系統。比如要格式化成ext3文件系統,就應該是mkfs.ext3。如果想了解系統中都對那些文件系統支持這樣的命令,直接到/sbin目錄下查看就是了。而更爲通用的格式化命令則是mkfs,具體如何使用,查看聯機幫助吧。這類工具與之前介紹的那些磁盤工具也是一樣的,可以對某個磁盤中的一個具體文件進行分區和格式化。

2.5.3 /etc/fstab文件

現在大家已經瞭解到了Linux磁盤的一些基本管理方式,也瞭解了掛接這個新鮮玩意兒。Windows是怎麼操作的我們不是很清楚,但是在Linux啓動之後,其文件佈局能夠像你所見到的這樣都是經過一步一步的掛接來完成的。決定讓磁盤的各個分區具體要掛接到哪個目錄是由/etc/fstab文件所決定的,所以這個文件是Linux系統中十分重要的文件,一旦損壞或丟失,系統將無法正常啓動。所以掌握這個文件的格式並能手工恢復它,將是成爲Linux系統管理員的必修課程。這個文件(/etc/fstab)在我們的測試系統中如下所示:

#

# /etc/fstab

# Created by anaconda on Sat Mar 17 05:12:212012

#

# Accessible filesystems, by reference, aremaintained under '/dev/disk'

# See man pages fstab(5), findfs(8), mount(8)and/or blkid(8) for more info

#

/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1

UUID=ec11a28b-9bf2-4f7e-95dc-2b7ccd5992ca /boot ext4 defaults 1 2

/dev/mapper/VolGroup-lv_home /home ext4 defaults 1 2

/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

我們可以清楚地看到,這個文件一共分爲6個字段,分別是:

l設備文件、磁盤卷標或者UUID

l掛接點

l文件系統類型

lmount命令的-o選項參數,defaults不給定-o選項時的行爲

l是否使用dump命令備份,0代表不做,1代表每天備份

l是否使用fsck命令檢查磁盤;0代表不檢查,1代表最早檢查(一般只有樹根“/”是1),2也是要檢查,只是比1要晚(除樹根之外的一般都使用這個)

在第一個字段中,我們看到了一些在df命令中出現的“分區”,而有一些則沒看到過。其實使用df –a就可以查看更多了。而比較讓人困惑的是/dev/sda1確不見了,但是能明顯看出來是“UUID=ec11a28b-2bf2-4f7e-95dc-2b7ccd5992ca這個設備。使用命令blkid命令就能露出真面目了。實際上在這裏直接寫/dev/sda1也是沒有問題的。

雖然/dev/sda1找到主了,但是還有一個分區在df命令的輸出怎麼也找不到,那就是類型爲swap的這個分區。這個是什麼呢?這個是交換分區!交換分區是什麼概念呢?與Windows的頁面文件是相同的概念!

所謂的頁面交換文件,實際上就是虛擬內存管理時要使用的內存置換文件,就是用來擴展虛擬內存空間的。當然,也是拖慢系統的罪魁禍首之一。需要注意,如果你使用的是32位的系統,而且已經配備了4G的內存,那麼就沒有必要給Windows分配頁面交換文件(在沒有開啓PAE模式的情況下)。Linux下也有這樣的規矩,只是將頁面交換文件變成交換分區了。

創建交換分區可以使用fdisk命令,格式化它使用mkswap命令。這個似乎並沒有逃出我們之前所掌握的一些知識。但是到了具體掛接的時候就不一樣了,它不是掛接的,即不是使用mount命令來用的。取而代之的是使用swapon命令。如果需要關掉某個交換分區,則使用swapoff命令。

此外,根據我們之前的經驗,普通文件也是能夠成爲交換分區的(還記得前面講的虛擬光驅嗎?),我們所幸就叫它交換文件好了。方法就是使用dd命令來創建一個空的文件,然後使用mkswap命令來格式化它。比如創建一個1G的交互文件,可以這樣:

# dd if=/dev/zero of=/tmp/swap bs=1Mcount=1024

# mkswap /tmp/swap

至於接下來該怎麼做,我想你懂的。

2.5.4 邏輯卷

在前一小節中我們留下了一個小尾巴,說/dev/mapper/*這些都是邏輯卷。而具體邏輯卷是什麼就沒有繼續說,主要是因爲這個小尾巴其實並不小,一不小心可能夾到尾巴。

1.什麼是邏輯卷

那麼到底什麼是邏輯卷呢?這個可能得需要一個比較實際的場景來解釋一下,正好還有一個。

前幾天我有一個同事,在自己的電腦中與他的Windows並行安裝了一個Ubuntu。他在使用Linux的時候總是顯得很小氣,只給他的Ubuntu分了10G的硬盤空間,並劃分了三個分區分別給了“/、“/homeswap。樹根“/分配2G的空間,“/home分配了7Gswap1G。這樣的分配方法還是比較專業的。只是沒過幾天他就遇到了麻煩。他想用這個Linux系統來定製一套Android系統,於是就需要下載到Android的全部源代碼。但是沒想到Google實在是大方,7G的磁盤空間不夠裝Android的源代碼。好了,我想問問各位同學,你遇到這樣的問題要怎麼做?

按照我們前面掌握的知識可以這樣做。首先再從硬盤中劃分一個更大的分區出來,比如100G;然後再將這個分區格式化成Linux的文件系統,並將/home目錄下的內容全部複製到新的分區;最後修改/etc/fstab文件,讓新的分區成爲/home。重啓之後就大功告成了。看來問題解決的非常好,Linux的靈活性顯然不一般。但是如果覺得100G給的太多了呢,Windows又不夠用了怎麼辦?難道再重複上述動作?天哪,複製文件是要花很長很長時間的,尤其是這種源代碼的東西,無數的小文件。

好了,邏輯卷就是來解決這個問題的,它能夠彈性的調整文件系統的容量。從理論上說,邏輯卷就是在磁盤分區和文件系統之間增加了一個邏輯層。這樣,當文件系統的容量覺得不夠用時,可以向邏輯卷中增加新的分區來實現擴大容量的目的;而當發現文件系統過大而有磁盤浪費的時候,可以選擇去除一些基本沒有使用的磁盤分區來達到容量的目的。在Linux系統中實現邏輯卷更能的是LVM,Logical Volume Manager,邏輯卷管理器。

2.基本術語與原理

在進一步講述邏輯卷之前,我們先了解一下它的基本術語。

lPhysical VolumePV,物理卷

物理卷就是具體的硬盤分區,或者與硬盤分區具有相同功能的設備,比如raid等,是LVM的基本存儲單元。但是與基本的物理存儲介質,比如普通的硬盤分區等,物理卷還要包含與LVM相關的管理參數。

lVolume GroupVG,卷組

卷組類似於非LVM系統中的物理硬盤,由多個物理卷組成。可以在卷組上創建一個或多個LVM分區。

lPhysical ExtendPE,物理擴展區

每一個物理卷被進一步劃分成被稱爲物理擴展區的基本單元,換句話說PELVM使用的最小存儲區,與物理磁盤中的“扇區”或文件系統中的“簇”的概念基本相同。LVM的默認PE大小是4M,每個卷組最多僅能含有65534PE。所以,一個卷組的最大容量就是4M*65534=256G。如果改變PE的大小,就能夠改變卷組的最大容量。

lLogical VolumeLV,邏輯卷

最後我們說道正題上了,就是邏輯卷。這個邏輯卷就是在卷組之上再進行切分,與在物理磁盤上繼續劃分分區是一樣的道理。但是邏輯卷的大小必須是PE的整數倍。這就是LVM能夠彈性調整邏輯卷容量的祕密所在。需要增加容量,就增加PE;需要減少容量,就減少PELVM的構成原理見圖2.6所示。

221158716.jpg

2.6 LVM的構成原理

到了具體的邏輯捲上,就可以應用mkfs命令進行格式化了,如此以來就能夠使用mount命令掛接到系統中了。

構成原理現在算是搞定了,但是對於一個邏輯卷可能會對應到多個物理分區上,那麼在向硬盤中寫入數據的時候是怎麼操作的呢?目前有兩種模式:

l線性模式(linear):即逐個物理分區使用。比如一個邏輯卷佔用了/dev/sda1/dev/sda2兩個分區,那麼首先寫/dev/sda1,直到滿了之後纔會使用/dev/sda2

l交錯模式(triped):這個就將一筆數據拆成兩個部分,分別寫入/dev/sda1/dev/sda2。這個與RAID 0很像。如果使用/dev/sda1/dev/sdb1這樣的組合來做邏輯卷,有相當於一份數據用兩個硬盤來寫,理論上是能夠提升讀寫效率的。

需要注意,雖然交錯模式的邏輯卷有點像RAID,但是它的最終目的還是用於磁盤容量的彈性可調的。如果要關注性能,還是直接使用RAID比較好。而且triped模式的邏輯卷與RAID 0是類似的,即當某個分區掛掉了,那麼你的數據也會跟着灰飛煙滅的。所以邏輯卷的默認工作模式是linear的。

3.基本操作

Cent OS已經默認支持邏輯捲了,所以如果選擇了Cent OS的同學,現在就已經在使用邏輯捲了。但是如果你選擇了Ubuntu這樣的發行版,就沒有這麼幸運了,因爲Ubuntu並沒有提供這方面的支持。但是也不要緊,我們可以手動安裝。

首先,邏輯卷必須有內核支持才能工作。所以必須保證你所使用的內核已經開啓了的邏輯卷的支持(好在大多數主流發行版的內核都支持);其次,需要安裝lvm2軟件包。當這些都準備妥當之後,就可開始具體的工作了。

第一步就是準備磁盤空餘空間(PQ絕對是個好工具),硬盤多的同學可以考慮利用第二塊硬盤。然後在這些準備好的空餘空間中劃出幾個分區來,並設置分區類型爲Linux LVM(分區標誌是8e)。我們這裏正好有一個塊20G的老硬盤,我們將它劃分了4個分區,平均每個分區5G

第二步是創建物理卷。與物理卷相關的命令有:pvcreatepvscanpvdisplaypvremove四個。具體都提供那些功能,相比通過名稱都能瞭解到。我們將剛剛劃分的4個分區都設置成物理卷,執行這樣的命令:

# pvcreate /dev/hdb1

# pvcreate /dev/hdb2

# pvcreate /dev/hdb3

# pvcreate /dev/hdb4

# pvcreate /dev/hdb{1234

顯然後一種的風格更加簡便,所以我們後面的所有操作都將採用這種風格。

第三步就是創建卷組VG。操作卷組的命令有:vgcreatevgscanvgdisplayvgextendvgreducevgchangevgremove。創建一個新卷組可以執行類似這樣的命令:

# vgcreate /dev/hdb{123} NewVolGroup

我們知道卷組是由多個物理卷構成的,現在我們將/dev/hdb1/dev/hdb2/dev/hdb3做成一個名爲NewVolGroup的卷組,留下的那個用於放在後面說明如果動態增加或減少容量用。在卷組中額外添加或刪除物理卷的命令是vgextendvgreduce。在創建創建卷組的這一時刻,可以給vgcreate命令傳遞“-s”選項指定物理擴展區PE的大小,比如16M。可能有同學會覺得設置較大的PE會導致磁盤的浪費。其實不然,PE與磁盤的最小存儲單元“扇區”或“簇”不同,他只是LVM用於進行動態伸縮尺寸的一個最小分配單元,而在真正存儲文件的時候,還是會利用磁盤本身的最小存儲單元。

第四步是創建邏輯卷LV,就相當於對卷組這個大磁盤進行分區。與邏輯卷LV有關的命令有:lvcreatelvscanlvdisplaylvextendlvreducelvremovelvresize。出於方便考慮,我們將整個VG只劃分爲一個LV,使用命令:

# lvcreate -l 3842 -n lv_data NewVolGroup

在這個命令中“-l”選項說明分配的PE數量,“-n”選擇則爲新的LV命名。本例中3842正是我們現有的全部PE數量。我們從哪裏獲得的呢?利用vgdisplay命令就行。

這樣,一個新的邏輯卷就創建完畢了。剩下的事情就是格式化並掛接它。我們使用如下命令:

# mkfs.ext4 /dev/mapper/NewVolGroup-lv_data

# mkdir /mnt/data

# mount /dev/mapper/NewVolGroup-lv_data/mnt/data

之後就可以使用df命令來確認這個新的磁盤使用情況了。

4.縮放邏輯卷

使用邏輯卷的目的就是衝着它能任意縮放的,所以如何縮放邏輯卷纔是關鍵所在。我們先來看一下如何給邏輯卷增加容量。

我們之前特意留下了/dev/hda4來做這件事。在實際應用中,還需要經歷創建分區和物理卷的階段。將一個新的物理卷加入到一個已有的卷組中使用vgextend命令。在我們的例子中這樣操作:

$ vgextend NewVolGroup /dev/hda4

之後我們使用vgdisplay命令就能發現有新的Free PE出現,在我們的測試機中是1274個。這個階段是擴大了卷組的容量,但是邏輯卷的還沒有改變。還需要使用lvresize命令將新增加的PE加入到邏輯卷中。在我們的例子中這樣操作:

$ lvresize -l +1274/dev/mapper/NewVolGroup-lv_data

這樣再使用vgdisply命令就發現已經沒有Free PE了。不過這個時候我們使用df命令查看磁盤空間情況時,並沒有發現有什麼變化。主要是因爲我們還差一個步驟,就是執行resize2fs命令。具體的原因其實很簡單,我們新增加的那些磁盤空間還沒有格式化呢。這個命令很簡單,在我們的例子中只需要這樣:

$ resize2fs /dev/mapper/NewVolGroup-lv_data

這樣,我們的磁盤容量就增大了,完全是在線的,是不是相當神奇呢?

好了,說完了增加容量,就來看看如何減小容量吧。這次我們要把/dev/hda1抽出來。但是減小容量相對來講就要麻煩一些了,首先它就是不能在線的了。

我們先要確定/dev/hda1到底有多大,可以通過pvdisplay命令獲得。在我們的測試機中得到的結果是5.01G。而我們的硬盤是20G的,那麼先要使用resize2fs命令將我們的磁盤調整到20G-5.01G=14990M的大小。我們執行這樣的命令:

# umount /mnt/data

# e2fsck -f /dev/mapper/NewVolGroup-lv_data

# resize2fs /dev/mapper/NewVolGroup-lv_data14990M

# mount /dev/mapper/NewVolGroup-lv_data/mnt/data

這之後我們再通過df命令查看就能看出磁盤容量已經縮減了。但是此時我們還有沒回收任何PE。這個時候還需要使用lvresize命令來回收PE。回收多少呢?當然是/dev/hda1中含有的那些了。通過pvdisplay命令可以查到有1282個,所以執行命令:

# lvresize -l -1282/dev/mapper/NewVolGroup-lv_data

那現在是不是就可以將/dev/hda1抽出來了呢?還不行。因爲通過pvdisplay命令發現,/dev/sda1並沒有空閒的PE,而空閒的PE現在在/dev/sda3/dev/sda4上。/dev/sda4上有1274Free PE,而/dev/sda3上有8Free PE(總共1280PE)。要抽出/dev/sda1,必須是的它的全部PEFree狀態,這個可以藉由pvmove命令完成。在我們這個場景中可以使用類似這樣的命令:

# psmove /dev/hda1:0-1273 /dev/hda4:0-1273

# psmove /dev/hda1:1274-1281/dev/hda3:1272-1279

這之後再使用pvdisplay查看,就發現/dev/sda1PE都爲Free狀態了。這之後就可以使用vgreduce命令,將/dev/sda1抽出了。在我們的場景中可執行類似這樣的命令:

# vgreduce NewVolGroup /dev/hda1

需要提醒大家一下,在我們這個例子中,由於/dev/sda1是所有分區中最大的一個,使得無法將它的整個數據移入到任何其他分區中,所以我們在使用psmove命令的時候參數有些複雜。但是這種情況卻是在實際應用當中經常遇到的情況。如果遇到了目標分區空餘空間比原分區大的時候,PE編號範圍就可以省略了。順便提一句,PE編號是從零開始的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章