2.5 磁盤的管理方式node
用戶也好,權限也罷,它們老是要有一個證實本身的天地;文件也罷,程序也好,它們老是得有一個安身立命的家園;即使Linux本身也必須得有本身的棲身之所。那就是磁盤。其實Linux對磁盤的管理十分對得起兩個字:「不賴」!centos
2.5.1Linux的文件系統bash
只要是磁盤就得格式化,好像已是天經地義的事情了,幾乎沒有人去問爲何。不少有經驗的人在彷佛都有個這樣的經歷,就是風風火火的從朋友那裏借來了一張裝滿高清「A」片的移動硬盤,暗爽事後還想留下一些待之後慢慢品味,但是總有那麼一些質量比較好的片子(尺寸超過4G)複製失敗。追問緣由還每每被高手們嘲笑:「都什麼年代了你還用FAT32,趕忙換NTFS吧」。我想這個時候你就不得不追問一下,爲何FAT32不行而NTFS卻能行吧?數據結構
由於它們是不一樣的文件系統,功能不一樣,能力不一樣。FAT32是在Windows95時代開始採用的文件系統,到如今都有人在用(好比U盤),能夠說是伴隨着咱們成長的文件系統。FAT是File Allocation Table的縮寫,從字面意義上就能看出這是一種相似表格同樣的文件系統。因爲其用於描述文件大小的屬性是一個32位的值,致使其可以支持的單個文件最大不能超過4G。而NTFS是微軟專門爲NT系統設計的,單個文件最大能夠達到2T。如今最爲經常使用的Windows XP和Windows 7都支持NTFS。至於NTFS是怎麼管理文件的有點不太好說,由於微軟一直當它是個「祕密」。app
Linux也有本身的文件系統格式,被稱爲ExtN(N=2、3、4)。若是要追溯ExtN的起源,其實要比FAT32和NTFS都要古老,也就是咱們前面所說的基於inode的文件系統。如前面所述,ExtN文件系統一定要包含inode數據結構來表明一個文件,而且存儲這個文件的各類屬性和權限。至於實際的數據則放在data block塊區中。除此以外,ExtN文件系統還有一個超級塊區(superblock),用於記錄整個文件系統的總體信息,包括inode與data block的總量、使用量和剩餘量。dom
data block與inode同樣,每個都有一個惟一編號,inode只須要記錄這些編號,就可以定位整個文件的任意一段數據。咱們假定有一個編號爲3的inode,它所表明的文件的數據被放置在編號爲2、5、6、8、13和20的這幾個data block中。那麼讀取這個文件的過程則如圖2.4所示。採用這種數據存取的方法的文件系統被稱之爲「索引式文件系統」。它與伴隨着不少人成長的FAT32有什麼不一樣呢?圖2.5對比了這個過程。工具
經過對兩個圖的比較,咱們能夠清晰的看出,ExtN經過inode可以一次性得到文件數據所存放的位置,能夠據此來安排磁盤的閱讀順序,儘可能保證在磁盤只旋轉一圈的狀況下將全部內容讀出來。而FAT32則只有將對應的data block讀入以後才知道下一個data block在什麼地方。若是一個文件的data block比較分散的話,將很難保證在磁盤只旋轉一圈的狀況下讀取所有數據,有時候甚至要多轉不少圈才能讀完數據。oop
這就是咱們很是熟悉的「磁盤碎片」問題。因爲長時間的對文件進行建立、刪除、讀寫,很難保證同一個文件的data block的位置相鄰。而因爲FAT32的讀寫特性,在data block不相鄰的狀況下讀寫性能會極具降低。因此爲了提升Windows系統的磁盤性能,常常性的作「磁盤碎片整理」是很是有必要的。佈局
而對於Linux這種文件系統,則基本上不須要進行磁盤碎片整理。並且你也基本上找不到相似的工具。可是Linux系統通過長時間使用以後,仍是會有文件數據過於分散的問題的。即使可以作到很好的規劃,可是對性能多多稍稍仍是會有一些影響,只是沒有使用FAT32的Windows那麼嚴重罷了。因此,一個使用時間好久的Linux系統也會由於磁盤碎片問題而變慢,這也是事實。只是不須要太過在乎它。性能
圖2.4 ExtN文件系統讀取數據過程示意圖
圖2.5 FAT32文件系統讀取數據過程示意圖
2.5.2 磁盤的基本操做
在前面的小結中介紹過幾個最經常使用的文件操做命令:ls、cd、cp、rm和mv。雖然它們也都是做用在磁盤上,可是它們面向的對象更爲高級一些,屬於文件範疇的。而咱們如今要介紹的是稍微低級一點,面對是的文件的載體——磁盤的一些基本操做。最經常使用的是:df、du、dd、fsck和mount。
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命令的輸出仍是比較清晰的。可是有兩個概念可能須要解釋一下,就是這裏所說的「Filesystem」和「Mounted 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的輸出中所幸就與「類名」代替了。這樣的文件系統還有不少,好比procfs、sysfs等,本書會有專門的一章來介紹這些特種文件系統。
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命令還不止這點本事,它還能指定讀寫數據量。好比bs和count這兩個參數,可以指定依次讀寫的本身數和讀寫次數,這樣就可以指定讀寫數量了。好比我要備份磁盤的主引導記錄,能夠這樣:
# 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通常咱們不多手工執行,基本上都是在系統啓動階段就執行了。至於它是什麼做用則很是簡單,與Windows的scandisk同樣,對文件系統的損壞進行修復。須要注意,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」參數是多餘的,由於相似ext2、ext3這樣的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,這與Windows或DOS下的命令名是一致的。比fdisk更好用一些的分區工具是cfdisk,Cent 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的硬盤空間,並劃分了三個分區分別給了「/」、「/home」和swap。樹根「/」分配2G的空間,「/home」分配了7G,swap爲1G。這樣的分配方法仍是比較專業的。只是沒過幾天他就遇到了麻煩。他想用這個Linux系統來定製一套Android系統,因而就須要下載到Android的所有源代碼。可是沒想到Google實在是大方,7G的磁盤空間不夠裝Android的源代碼。好了,我想問問各位同窗,你遇到這樣的問題要怎麼作?
按照咱們前面掌握的知識能夠這樣作。首先再從硬盤中劃分一個更大的分區出來,好比100G;而後再將這個分區格式化成Linux的文件系統,並將/home目錄下的內容所有複製到新的分區;最後修改/etc/fstab文件,讓新的分區成爲/home。重啓以後就大功告成了。看來問題解決的很是好,Linux的靈活性顯然不通常。可是若是以爲100G給的太多了呢,Windows又不夠用了怎麼辦?難道再重複上述動做?天哪,複製文件是要花很長很長時間的,尤爲是這種源代碼的東西,無數的小文件。
好了,邏輯卷就是來解決這個問題的,它可以彈性的調整文件系統的容量。從理論上說,邏輯卷就是在磁盤分區和文件系統之間增長了一個邏輯層。這樣,當文件系統的容量以爲不夠用時,能夠向邏輯卷中增長新的分區來實現擴大容量的目的;而當發現文件系統過大而有磁盤浪費的時候,能夠選擇去除一些基本沒有使用的磁盤分區來達到容量的目的。在Linux系統中實現邏輯卷更能的是LVM,即Logical Volume Manager,邏輯卷管理器。
2.基本術語與原理
在進一步講述邏輯卷以前,咱們先了解一下它的基本術語。
lPhysical Volume,PV,物理卷
物理卷就是具體的硬盤分區,或者與硬盤分區具備相同功能的設備,好比raid等,是LVM的基本存儲單元。可是與基本的物理存儲介質,好比普通的硬盤分區等,物理卷還要包含與LVM相關的管理參數。
lVolume Group,VG,卷組
卷組相似於非LVM系統中的物理硬盤,由多個物理卷組成。能夠在卷組上建立一個或多個LVM分區。
lPhysical Extend,PE,物理擴展區
每個物理卷被進一步劃分紅被稱爲物理擴展區的基本單元,換句話說PE是LVM使用的最小存儲區,與物理磁盤中的「扇區」或文件系統中的「簇」的概念基本相同。LVM的默認PE大小是4M,每一個卷組最多僅能含有65534個PE。因此,一個卷組的最大容量就是4M*65534=256G。若是改變PE的大小,就可以改變卷組的最大容量。
lLogical Volume,LV,邏輯卷
最後咱們說道正題上了,就是邏輯卷。這個邏輯卷就是在卷組之上再進行切分,與在物理磁盤上繼續劃分分區是同樣的道理。可是邏輯卷的大小必須是PE的整數倍。這就是LVM可以彈性調整邏輯卷容量的祕密所在。須要增長容量,就增長PE;須要減小容量,就減小PE。LVM的構成原理見圖2.6所示。
圖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。
第二步是建立物理卷。與物理卷相關的命令有:pvcreate、pvscan、pvdisplay和pvremove四個。具體都提供那些功能,相比經過名稱都能瞭解到。咱們將剛剛劃分的4個分區都設置成物理卷,執行這樣的命令:
# pvcreate /dev/hdb1
# pvcreate /dev/hdb2
# pvcreate /dev/hdb3
# pvcreate /dev/hdb4
或
# pvcreate /dev/hdb{1,2,3,4}
顯而後一種的風格更加簡便,因此咱們後面的全部操做都將採用這種風格。
第三步就是建立卷組VG。操做卷組的命令有:vgcreate、vgscan、vgdisplay、vgextend、vgreduce、vgchange和vgremove。建立一個新卷組能夠執行相似這樣的命令:
# vgcreate /dev/hdb{1,2,3} NewVolGroup
咱們知道卷組是由多個物理卷構成的,如今咱們將/dev/hdb1、/dev/hdb2和/dev/hdb3作成一個名爲NewVolGroup的卷組,留下的那個用於放在後面說明若是動態增長或減小容量用。在卷組中額外添加或刪除物理卷的命令是vgextend和vgreduce。在建立建立卷組的這一時刻,能夠給vgcreate命令傳遞「-s」選項指定物理擴展區PE的大小,好比16M。可能有同窗會以爲設置較大的PE會致使磁盤的浪費。其實否則,PE與磁盤的最小存儲單元「扇區」或「簇」不一樣,他只是LVM用於進行動態伸縮尺寸的一個最小分配單元,而在真正存儲文件的時候,仍是會利用磁盤自己的最小存儲單元。
第四步是建立邏輯卷LV,就至關於對卷組這個大磁盤進行分區。與邏輯卷LV有關的命令有:lvcreate、lvscan、lvdisplay、lvextend、lvreduce、lvremove和lvresize。出於方便考慮,咱們將整個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上有1274個Free PE,而/dev/sda3上有8個Free PE(總共1280個PE)。要抽出/dev/sda1,必須是的它的所有PE爲Free狀態,這個能夠藉由pvmove命令完成。在咱們這個場景中可使用相似這樣的命令:
# psmove /dev/hda1:0-1273 /dev/hda4:0-1273
# psmove /dev/hda1:1274-1281/dev/hda3:1272-1279
這以後再使用pvdisplay查看,就發現/dev/sda1的PE都爲Free狀態了。這以後就可使用vgreduce命令,將/dev/sda1抽出了。在咱們的場景中可執行相似這樣的命令:
# vgreduce NewVolGroup /dev/hda1
須要提醒你們一下,在咱們這個例子中,因爲/dev/sda1是全部分區中最大的一個,使得沒法將它的整個數據移入到任何其餘分區中,因此咱們在使用psmove命令的時候參數有些複雜。可是這種狀況倒是在實際應用當中常常遇到的狀況。若是遇到了目標分區空餘空間比原分區大的時候,PE編號範圍就能夠省略了。順便提一句,PE編號是從零開始的。