原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章?原始出處?、作者信息和本聲明。否則將追究法律責(zé)任。http://jagen.blog.51cto.com/2889774/1312868
2.5? 磁盤的管理方式
用戶也好,權(quán)限也罷,它們總是要有一個證明自己的天地;文件也罷,程序也好,它們總是得有一個安身立命的家園;即便 Linux 自己也必須得有自己的棲身之所。那就是磁盤。其實 Linux 對磁盤的管理十分對得起兩個字:“不賴”!
2.5.1 Linux 的文件系統(tǒng)
只要是磁盤就得格式化,好像已經(jīng)是天經(jīng)地義的事情了,幾乎沒有人去問為什么。很多有經(jīng)驗的人在似乎都有個這樣的經(jīng)歷,就是風(fēng)風(fēng)火火的從朋友那里借來了一張裝滿高清 “ A ” 片的移動硬盤,暗爽過后還想留下一些待以后慢慢品味,可是總有那么一些質(zhì)量比較好的片子(尺寸超過 4G )復(fù)制失敗。追問原因還往往被高手們嘲笑: “ 都什么年代了你還用 FAT32 ,趕緊換 NTFS 吧”。我想這個時候你就不得不追問一下,為什么 FAT32 不行而 NTFS 卻能行吧?
因為它們是不同的文件系統(tǒng),功能不同,能力不同。 FAT32 是在 Windows95 時代開始采用的文件系統(tǒng),到現(xiàn)在都有人在用(比如 U 盤),可以說是伴隨著我們成長的文件系統(tǒng)。 FAT 是 File Allocation Table 的縮寫,從字面意義上就能看出這是一種類似表格一樣的文件系統(tǒng)。由于其用于描述文件大小的屬性是一個 32 位的值,導(dǎo)致其能夠支持的單個文件最大不能超過 4G 。而 NTFS 是微軟專門為 NT 系統(tǒng)設(shè)計的,單個文件最大可以達到 2T 。現(xiàn)在最為常用的 Windows XP 和 Windows 7 都支持 NTFS 。至于 NTFS 是怎么管理文件的有點不太好說,因為微軟一直當(dāng)它是個“秘密 ” 。
Linux 也有自己的文件系統(tǒng)格式,被稱為 ExtN ( N=2 、 3 、 4 )。如果要追溯 ExtN 的起源,其實要比 FAT32 和 NTFS 都要古老,也就是我們前面所說的基于 inode 的文件系統(tǒng)。如前面所述, ExtN 文件系統(tǒng)必定要包含 inode 數(shù)據(jù)結(jié)構(gòu)來代表一個文件,并且存儲這個文件的各種屬性和權(quán)限。至于實際的數(shù)據(jù)則放在 data block 塊區(qū)中。除此之外, ExtN 文件系統(tǒng)還有一個超級塊區(qū)( superblock ),用于記錄整個文件系統(tǒng)的整體信息,包括 inode 與 data block 的總量、使用量和剩余量。
data block 與 inode 一樣,每一個都有一個唯一編號, inode 只需要記錄這些編號,就能夠定位整個文件的任意一段數(shù)據(jù)。我們假定有一個編號為 3 的 inode ,它所代表的文件的數(shù)據(jù)被放置在編號為 2 、 5 、 6 、 8 、 13 和 20 的這幾個 data block 中。那么讀取這個文件的過程則如圖 2.4 所示。采用這種數(shù)據(jù)存取的方法的文件系統(tǒng)被稱之為 “ 索引式文件系統(tǒng)”。它與伴隨著很多人成長的 FAT32 有什么不同呢?圖 2.5 對比了這個過程。
通過對兩個圖的比較,我們可以清晰的看出, ExtN 通過 inode 能夠一次性獲得文件數(shù)據(jù)所存放的位置,可以據(jù)此來安排磁盤的閱讀順序,盡量保證在磁盤只旋轉(zhuǎn)一圈的情況下將所有內(nèi)容讀出來。而 FAT32 則只有將對應(yīng)的 data block 讀入之后才知道下一個 data block 在什么地方。如果一個文件的 data block 比較分散的話,將很難保證在磁盤只旋轉(zhuǎn)一圈的情況下讀取全部數(shù)據(jù),有時候甚至要多轉(zhuǎn)很多圈才能讀完數(shù)據(jù)。
這就是我們非常熟悉的 “ 磁盤碎片 ” 問題。由于長時間的對文件進行創(chuàng)建、刪除、讀寫,很難保證同一個文件的 data block 的位置相鄰。而由于 FAT32 的讀寫特性,在 data block 不相鄰的情況下讀寫性能會極具下降。所以為了提高 Windows 系統(tǒng)的磁盤性能,經(jīng)常性的做 “ 磁盤碎片整理 ” 是非常有必要的。
而對于 Linux 這種文件系統(tǒng),則基本上不需要進行磁盤碎片整理。而且你也基本上找不到類似的工具。但是 Linux 系統(tǒng)經(jīng)過長時間使用之后,還是會有文件數(shù)據(jù)過于分散的問題的。即便能夠做到很好的規(guī)劃,但是對性能多多稍稍還是會有一些影響,只是沒有使用 FAT32 的 Windows 那么嚴重罷了。所以,一個使用時間很久的 Linux 系統(tǒng)也會因為磁盤碎片問題而變慢,這也是事實。只是不需要太過在意它。
圖 2.4 ExtN 文件系統(tǒng)讀取數(shù)據(jù)過程示意圖
圖 2.5 FAT32 文件系統(tǒng)讀取數(shù)據(jù)過程示意圖
2.5.2? 磁盤的基本操作
在前面的小結(jié)中介紹過幾個最常用的文件操作命令: ls 、 cd 、 cp 、 rm 和 mv 。雖然它們也都是作用在磁盤上,但是它們面向的對象更為高級一些,屬于文件范疇的。而我們現(xiàn)在要介紹的是稍微低級一點,面對是的文件的載體 —— 磁盤的一些基本操作。最常用的是: df 、 du 、 dd 、 fsck 和 mount 。
df 命令用于查看系統(tǒng)中所有磁盤的整體使用量。在我們的測試系統(tǒng)中能夠得到如下所示信息:
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 ” 。如果要翻譯成中文(很多人的機器中可能顯示的字段名)則是 “ 文件系統(tǒng) ” 和 “ 掛載點 ” 。
這里所說的 “ 文件系統(tǒng) ” 與我們之前所說的操作系統(tǒng)中的文件系統(tǒng)的概念有點不盡相同,著這里更多的含義指的是磁盤分區(qū)。之所以叫它是文件系統(tǒng),是因為每一個磁盤分區(qū)都是一個文件系統(tǒng)的具體實例,如果套用面向?qū)ο蟮恼f法就是,類和對象。諸如 ExtN 這樣的就是類,而具體的磁盤分區(qū)就是這個類的對象。至于 “ 掛載點 ” 則比較有趣,它是某個具體的目錄。
從 df 每一個行的輸出上看,難道具體的磁盤分區(qū)會與某個具體的目錄有關(guān)?事實的確是這樣的。前面也是說過, Linux 沒有 Windows 中的 C 盤、 D 盤的概念。精通 Windows 的同學(xué)都清楚, Windows 中的分區(qū)會有一個盤符與它對應(yīng),在分區(qū)中的文件和目錄的組織結(jié)構(gòu)就像一顆樹一樣,樹根就是盤符 + “:” 。 Linux 組織文件和目錄的方式最終也能被看作是一棵樹。但是由于沒有 C 盤、 D 盤的概念,更沒有盤符一說,于是就特意規(guī)定了一個總的樹根叫 “ / ” ,而具體某個分區(qū)的樹根就從某個目錄開始。至于不同的分區(qū)應(yīng)該從哪個目錄開始這個就沒有明確的規(guī)定。其實不規(guī)定也就是有規(guī)定,即你可以隨意指派。而具體指派哪個分區(qū)與哪個目錄對應(yīng),就由 mount 命令來指定了。之后只要訪問哪個目錄里的任何文件或目錄,都是對具體的分區(qū)進行訪問了。而這個目錄則被稱為 “ 掛載點 ” 。
根據(jù) df 命令的輸出 內(nèi)容可以看出, Linux 文件中的總樹根 “ / ” 與 “ 分區(qū) ” /dev/mapper/VolGroup-lv_root 相關(guān)聯(lián),而 /dev/shm 目錄與 “ 分區(qū) ” tmpfs 相關(guān)聯(lián), /boot 目錄與分區(qū) /dev/sda1 相關(guān)聯(lián), …… 。這些 “ 分區(qū)名 ” 都什么含義呢?其實在這些所謂的分區(qū)中,只有 /dev/sda1 才是真正的磁盤分區(qū),而這個名稱則是這個磁盤分區(qū)的 “ 設(shè)備名 ” 。在 Linux 系統(tǒng)中, /dev 目錄下的所有文件都與一個具體的設(shè)備有關(guān),有物理的,也有虛擬的。而 sda1 這個就是一個物理的設(shè)備。它對應(yīng)系統(tǒng)第一塊串口硬盤的第一個分區(qū)。那么如果是第二個分區(qū)呢? sda2 ,第三個是 sda3 …… ,而對應(yīng)整塊硬盤的則是 sda 。由此遞推,第二塊串口硬盤,應(yīng)該是 sdb ,第三塊應(yīng)該是 sdc …… 。而 /dev/mapper/* 這些又是什么呢?這個就是虛擬的設(shè)備了,它實際上是邏輯卷。有關(guān)邏輯卷的概念我們稍后在說,現(xiàn)在你只要知道它是虛擬的磁盤分區(qū)就行了。不過更奇怪的是 tmpfs ,這個設(shè)備文件在什么地方呢?答案是沒有,因為它不對應(yīng)任何設(shè)備。它實際上是真正的文件系統(tǒng)名稱。而這個文件系統(tǒng)是在內(nèi)存中虛擬的,與具體的硬盤無關(guān),所以也沒有具體的設(shè)備。于是在 df 的輸出中所幸就與 “ 類名 ” 代替了。這樣的文件系統(tǒng)還有很多,比如 procfs 、 sysfs 等,本書會有專門的一章來介紹這些特種文件系統(tǒng)。
(可以這樣理解,一個filesystem就是一個分區(qū),分區(qū)就是實際的存儲空間,但是分區(qū)要掛載在目錄下才能訪問,而目錄可以隨便創(chuàng)建,只要把分區(qū)掛載在這個目錄下,就可以通過這個目錄訪問這個分區(qū)了)
df 命令本身就沒有什么好繼續(xù)再介紹的了,上述的一些概念遠比 df 本身要重要很多,這個是大家應(yīng)該更加注意的。對于 /dev 目錄下的那些文件,本書不會逐個的去講述它們都代表誰。畢竟每個人的系統(tǒng)都不同,所以也沒法說,你沒看到你怎么信我呢?比較好辦的辦法是問百度或谷歌,它們是你學(xué)習(xí) Linux 必不可少的工具。好了,我不能再說多了,因為這樣你們都會不買我的書而逛百度去了。
df 命令是用來觀察總體磁盤使用量的,要觀察局部使用量,需要使用 du 命令。 df 命令可以通過讀取磁盤的 superblock 來實現(xiàn),而 du 命令則不同,它要搜索所有的 inode 來計算局部數(shù)據(jù),所以 du 命令的執(zhí)行效率,經(jīng)常要比 df 差很多。
從嚴格意義上來講, dd 命令應(yīng)該不屬于管理磁盤的命令,因為在聯(lián)機幫助中說它的功能是 “ convert and copy a file ” 。但是如果你想要直接讀寫磁盤的每一個扇區(qū),或者鏡像整個磁盤, dd 命令則是非常好的選擇。通常 dd 命令的格式如下:
dd if=input_file of=out_file
從這個基本用法,如果像聯(lián)機幫助中說描述的,復(fù)制一個文件,可以使用類似這樣的命令:
# dd if=/etc/bashrc of=./bashrc
這個命令與 cp /etc/bashrc ./bashrc 是等價的。其實“ if ”和“ of ”這兩個參數(shù)也不用給定,會有默認值。“ if ”的默認值是標(biāo)準(zhǔn)輸入,“ of ”的默認值是標(biāo)準(zhǔn)輸出。如果要模擬 cat 命令,可以使用這樣的命令:
# dd if=/etc/bashrc
根據(jù)前面的講述的內(nèi)容,具體的硬件設(shè)備在 /dev 目錄下會由具體的文件與之對應(yīng),比如 /dev/sda1 。如果要制作第一個串口磁盤第一個分區(qū)的鏡像文件,可以使用這樣的命令:
# dd if=/dev/sda1 of=./sda1.img
需要注意,執(zhí)行上面的命令時,輸出文件所在的分區(qū)必須大于 sda1 分區(qū),至于為什么我想你懂的。如果還希望對生成的鏡像文件壓縮一下,可以使用這樣的命令:
# dd if=/dev/sda1 | gzip -9 > ./sda1.img
按照這個思路,我們將整個磁盤都做一個鏡像呢?
# dd if=/dev/sda | gzip -9 > ./sda.img
如果要恢復(fù)這個磁盤的內(nèi)容,就可以這樣: # gzip -dc ./sda.img | ddof=/dev/sda
通過這兩條命令,大家想到了什么?這個是不是與我們在 Windows 下經(jīng)常使用 ghost 非常像呢?感覺塞門鐵克公司的老大應(yīng)該找塊豆腐撞死。而 dd 命令還不止這點本事,它還能指定讀寫數(shù)據(jù)量。比如 bs 和 count 這兩個參數(shù),能夠指定依次讀寫的自己數(shù)和讀寫次數(shù),這樣就能夠指定讀寫數(shù)量了。比如我要備份磁盤的主引導(dǎo)記錄,可以這樣:
# dd if=/dev/sda of=./mbr.img bs=512 count=1
這要求值讀取 sda 磁盤的首個 512 個字節(jié)的信息,也就是第一個扇區(qū)的內(nèi)容,將它保存到 mbr.img 文件。對 mbr 內(nèi)容感興趣的同學(xué),可以使用反匯編工具,將這個文件反匯編掉,就能知道計算機是怎么啟動的了。
使用 dd 命令能夠做的事情還有很多,比如銷毀磁盤數(shù)據(jù)、測試磁盤讀寫速度、修復(fù)磁盤等,為了方便你使用,我將這些技巧列下來:
# 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
看完這些,我覺得你們更會認為賽門鐵克公司的老大應(yīng)該買塊豆腐撞死。特別說明一下 /dev/urandom 、 /dev/zero 和 /dev/null 這三個虛擬設(shè)備設(shè)備文件非常有用。 urandom 代表隨即數(shù),每次讀入的數(shù)據(jù)都不會相同; zero 代表 0 ,每次讀入的數(shù)據(jù)都是 0 ;而 null 主要面對寫,相當(dāng)于是一個黑洞一樣,無論寫什么都會消失得無影無蹤。
不知道通過我上面的介紹,大家是否已經(jīng)理解 dd 在磁盤管理中的作用了呢?既然到了這個份上,理不理解我也管不了了。生活還得繼續(xù),我們的內(nèi)容接著往下走,該說一下 fsck 了。
fsck 一般我們很少手工執(zhí)行,基本上都是在系統(tǒng)啟動階段就執(zhí)行了。至于它是什么作用則非常簡單,與 Windows 的 scandisk 一樣,對文件系統(tǒng)的損壞進行修復(fù)。需要注意, fsck 只能對文件系統(tǒng)的損壞進行修復(fù),對磁盤的損壞它是沒有辦法的。后面我們會有單獨的章節(jié)來介紹 fsck 的工作原理,這里就不做復(fù)述。具體的使用方法就是:
# fsck -t? 文件系統(tǒng) 設(shè)備名
比如 :
# fsck -f -t ext3 /dev/hda3
其中參數(shù) “ -f ” 要求進行強制檢查。如果不增加 -f 選項,在沒有報錯的磁盤中是不會做檢查的。至于磁盤什么時候會報錯呢?一般就是非法關(guān)機的時候了 !
期待已久的 mount 的終于登場了。前面已經(jīng)講過 “ 掛接點 ” 是個什么東西了,相信大家還在為 Linux 這種 “ 怪異 ” 的設(shè)計而嘖嘖稱奇呢。但是早已用慣 Linux 的我反倒覺得 Windows 的設(shè)計非常奇怪。相比之下, Linux 的方式更為靈活。就比如在 Windows 下有一個軟件必須在 D 盤下的某個目錄中讀取文件,而這個軟件若是在一個沒有 D 盤的系統(tǒng)中就無法執(zhí)行了;相反的,在 Linux 下,只需要特意創(chuàng)建一個目錄即可,如果需要單獨的磁盤分區(qū)來存儲它,使用 mount 命令指定給它就好了。
雖說 mount 命令聽起來有點神奇,但是使用起來卻是非常簡單。一般的用法是這樣的:
# mount [-t? 文件系統(tǒng) ]? 設(shè)備名稱 掛接點
比如我們要將系統(tǒng)中第二塊串口硬盤的第一個分區(qū)(如果有的話)掛接到 /data 目錄下,可以這樣用:
# mount /dev/sdb1 /data
或
# mount -t vfat /dev/sdb1 /data
怎么樣,夠簡單的吧?對于第二種用法很多時候 “ -t ” 參數(shù)是多余的,因為類似 ext2 、 ext3 這樣的 ExtN 類的基于 inode 的文件系統(tǒng),都是都有超級塊的。利用超級塊就能夠了解到具體的文件系統(tǒng)。所以第一種用法在大多數(shù)時候都會成功。而第二種用法多數(shù)用于掛接 Windows 分區(qū)時使用,因為這些文件文件系統(tǒng)不具備超級快。
其實掛接磁盤分區(qū)還只是 mount 命令的最平常的一種用法。由于 Linux 使用設(shè)備文件來描述一個設(shè)備,那么如果有一個實際的文件中的內(nèi)容與在某個磁盤設(shè)備文件中的讀到的內(nèi)容一致,那么這個實際的文件也能夠掛接進來。就比如我們之前使用 dd 命令創(chuàng)建的 sda1.img 文件(未壓縮的),就可以利用這樣的命令來掛進到一個目錄上:
# mount -o loop ./sda1.img /mnt/sda1
這樣你就會發(fā)現(xiàn) /mnt/sda1 目錄下的內(nèi)容與 /boot 目錄下的內(nèi)容相同(別忘了之前 df 命令的輸出)。以此類推,我們下載到的 *.iso 文件也可以使用同樣的方法掛接到某個目錄上直接訪問了。 例如:
# mount -o loop ./CentOS-6.4-x86_64-bin-DVD1.iso/mnt/centos
看到這里是不是覺得 Windows 下那些虛擬光驅(qū)軟件的作者們都開買塊豆腐撞死了?
在這種 mount 的用法中,比較重要的是“ -o ” 命令選項,這是個 mount 比較靈活的一個選項,有很多可選參數(shù)。比如 “ro” 說明掛接的磁盤是只讀的、“ rw ” 說明掛接的磁盤是可讀寫的等等。而 loop 則說明要掛接的文件是一個虛擬設(shè)備,而這個虛擬設(shè)備是環(huán)形的設(shè)備。為什么是“環(huán)形”呢?想想硬盤、光盤、軟盤等都是什么形狀就行了。還不知道?圓形的啊!
與 mount 相反的操作就是卸載了,使用 umount 命令。它的操作更加簡單,給定掛接點目錄或具體設(shè)備就行了。比如 :
# umount /data
或
#umount /dev/sdb1
如果你的系統(tǒng)中有這些設(shè)備,則這兩種方法是等價的。
其余的有關(guān)進行磁盤分區(qū)和格式化的命令就不做詳細介紹了。因為很多人連 Windows 下這樣的工具怎么用都還搞不清楚,可見它們都是很少用到的東西。為了滿足一份同學(xué)的好奇心,我們在這里只說一下它們的名字。
用于磁盤分區(qū)的命令是 fdisk ,這與 Windows 或 DOS 下的命令名是一致的。比 fdisk 更好用一些的分區(qū)工具是 cfdisk , Cent OS 中有提供。而對磁盤做格式化的則不是 format 命令。在 Linux 是下 mkfs.* 命令。至于 * 是什么,取決于你格式化成什么系統(tǒng)。比如要格式化成 ext3 文件系統(tǒng),就應(yīng)該是 mkfs.ext3 。如果想了解系統(tǒng)中都對那些文件系統(tǒng)支持這樣的命令,直接到 /sbin 目錄下查看就是了。而更為通用的格式化命令則是 mkfs ,具體如何使用,查看聯(lián)機幫助吧。這類工具與之前介紹的那些磁盤工具也是一樣的,可以對某個磁盤中的一個具體文件進行 “ 分區(qū) ” 和格式化。
2.5.3? /etc/fstab 文件
現(xiàn)在大家已經(jīng)了解到了 Linux 磁盤的一些基本管理方式,也了解了 “ 掛接 ” 這個新鮮玩意兒。 Windows 是怎么操作的我們不是很清楚,但是在 Linux 啟動之后,其文件布局能夠像你所見到的這樣都是經(jīng)過一步一步的掛接來完成的。決定讓磁盤的各個分區(qū)具體要掛接到哪個目錄是由 /etc/fstab 文件所決定的,所以這個文件是 Linux 系統(tǒng)中十分重要的文件,一旦損壞或丟失,系統(tǒng)將無法正常啟動。所以掌握這個文件的格式并能手工恢復(fù)它,將是成為 Linux 系統(tǒng)管理員的必修課程。 這個文件( /etc/fstab )在我們的測試系統(tǒng)中如下所示:
#
# /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 設(shè)備文件、磁盤卷標(biāo)或者 UUID
l 掛接點
l 文件系統(tǒng)類型
l mount 命令的 -o 選項參數(shù), defaults 不給定 -o 選項時的行為
l 是否使用 dump 命令備份, 0 代表不做, 1 代表每天備份
l 是否使用 fsck 命令檢查磁盤; 0 代表不檢查, 1 代表最早檢查(一般只有樹根“ / ”是 1 ), 2 也是要檢查,只是比 1 要晚(除樹根之外的一般都使用這個)
在第一個字段中,我們看到了一些在 df 命令中出現(xiàn)的“分區(qū)”,而有一些則沒看到過。其實使用 “ df –a ” 就可以查看更多了。而比較讓人困惑的是 /dev/sda1 確不見了,但是能明顯看出來是“ UUID=ec11a28b-2bf2-4f7e-95dc-2b7ccd5992ca ” 這個設(shè)備。使用命令 blkid 命令就能露出真面目了。實際上在這里直接寫 /dev/sda1 也是沒有問題的。
雖然 /dev/sda1 找到主了,但是還有一個分區(qū)在 df 命令的輸出怎么也找不到,那就是類型為 swap 的這個分區(qū)。這個是什么呢?這個是交換分區(qū)!交換分區(qū)是什么概念呢?與 Windows 的頁面文件是相同的概念!
所謂的頁面交換文件,實際上就是虛擬內(nèi)存管理時要使用的內(nèi)存置換文件,就是用來擴展虛擬內(nèi)存空間的。當(dāng)然,也是拖慢系統(tǒng)的罪魁禍?zhǔn)字弧P枰⒁?#xff0c;如果你使用的是 32 位的系統(tǒng),而且已經(jīng)配備了 4G 的內(nèi)存,那么就沒有必要給 Windows 分配頁面交換文件(在沒有開啟 PAE 模式的情況下)。 Linux 下也有這樣的規(guī)矩,只是將頁面交換文件變成交換分區(qū)了。
創(chuàng)建交換分區(qū)可以使用 fdisk 命令,格式化它使用 mkswap 命令。這個似乎并沒有逃出我們之前所掌握的一些知識。但是到了具體掛接的時候就不一樣了,它不是掛接的,即不是使用 mount 命令來用的。取而代之的是使用 swapon 命令。如果需要關(guān)掉某個交換分區(qū),則使用 swapoff 命令。
此外,根據(jù)我們之前的經(jīng)驗,普通文件也是能夠成為 “ 交換分區(qū) ” 的(還記得前面講的虛擬光驅(qū)嗎? ) ,我們所幸就叫它交換文件好了。方法就是使用 dd 命令來創(chuàng)建一個空的文件,然后使用 mkswap 命令來 “ 格式化 ” 它。比如創(chuàng)建一個 1G 的交互文件,可以這樣:
# dd if=/dev/zero of=/tmp/swap bs=1Mcount=1024
# mkswap /tmp/swap
至于接下來該怎么做,我想你懂的。
2.5.4? 邏輯卷
在前一小節(jié)中我們留下了一個小尾巴,說 /dev/mapper/* 這些都是邏輯卷。而具體邏輯卷是什么就沒有繼續(xù)說,主要是因為這個小尾巴其實并不小,一不小心可能夾到尾巴。
1.什么是邏輯卷
那么到底什么是邏輯卷呢?這個可能得需要一個比較實際的場景來解釋一下,正好還有一個。
前幾天我有一個同事,在自己的電腦中與他的 Windows 并行安裝了一個 Ubuntu 。他在使用 Linux 的時候總是顯得很小氣,只給他的 Ubuntu 分了 10G 的硬盤空間,并劃分了三個分區(qū)分別給了“ / ” 、“ /home ” 和 swap 。樹根“ / ” 分配 2G 的空間,“ /home ” 分配了 7G , swap 為 1G 。這樣的分配方法還是比較專業(yè)的。只是沒過幾天他就遇到了麻煩。他想用這個 Linux 系統(tǒng)來定制一套 Android 系統(tǒng),于是就需要下載到 Android 的全部源代碼。但是沒想到 Google 實在是大方, 7G 的磁盤空間不夠裝 Android 的源代碼。好了,我想問問各位同學(xué),你遇到這樣的問題要怎么做?
按照我們前面掌握的知識可以這樣做。首先再從硬盤中劃分一個更大的分區(qū)出來,比如 100G ;然后再將這個分區(qū)格式化成 Linux 的文件系統(tǒng),并將 /home 目錄下的內(nèi)容全部復(fù)制到新的分區(qū);最后修改 /etc/fstab 文件,讓新的分區(qū)成為 /home 。重啟之后就大功告成了。看來問題解決的非常好, Linux 的靈活性顯然不一般。但是如果覺得 100G 給的太多了呢, Windows 又不夠用了怎么辦?難道再重復(fù)上述動作?天哪,復(fù)制文件是要花很長很長時間的,尤其是這種源代碼的東西,無數(shù)的小文件。
好了,邏輯卷就是來解決這個問題的,它能夠彈性的調(diào)整文件系統(tǒng)的容量。從理論上說,邏輯卷就是在磁盤分區(qū)和文件系統(tǒng)之間增加了一個邏輯層。這樣,當(dāng)文件系統(tǒng)的容量覺得不夠用時,可以向邏輯卷中增加新的分區(qū)來實現(xiàn)擴大容量的目的;而當(dāng)發(fā)現(xiàn)文件系統(tǒng)過大而有磁盤浪費的時候,可以選擇去除一些基本沒有使用的磁盤分區(qū)來達到容量的目的。在 Linux 系統(tǒng)中實現(xiàn)邏輯卷更能的是 LVM, 即 Logical Volume Manager ,邏輯卷管理器。
2.基本術(shù)語與原理
在進一步講述邏輯卷之前,我們先了解一下它的基本術(shù)語。
l Physical Volume , PV ,物理卷
物理卷就是具體的硬盤分區(qū),或者與硬盤分區(qū)具有相同功能的設(shè)備,比如 raid 等,是 LVM 的基本存儲單元。但是與基本的物理存儲介質(zhì),比如普通的硬盤分區(qū)等,物理卷還要包含與 LVM 相關(guān)的管理參數(shù)。
l Volume Group , VG ,卷組
卷組類似于非 LVM 系統(tǒng)中的物理硬盤,由多個物理卷組成。可以在卷組上創(chuàng)建一個或多個 LVM 分區(qū)。
l Physical Extend , PE ,物理擴展區(qū)
每一個物理卷被進一步劃分成被稱為物理擴展區(qū)的基本單元,換句話說 PE 是 LVM 使用的最小存儲區(qū),與物理磁盤中的“扇區(qū)”或文件系統(tǒng)中的“簇”的概念基本相同。 LVM 的默認 PE 大小是 4M ,每個卷組最多僅能含有 65534 個 PE 。所以,一個卷組的最大容量就是 4M*65534=256G 。如果改變 PE 的大小,就能夠改變卷組的最大容量。
l Logical Volume , LV ,邏輯卷
最后我們說道正題上了,就是邏輯卷。這個邏輯卷就是在卷組之上再進行切分,與在物理磁盤上繼續(xù)劃分分區(qū)是一樣的道理。但是邏輯卷的大小必須是 PE 的整數(shù)倍。這就是 LVM 能夠彈性調(diào)整邏輯卷容量的秘密所在。需要增加容量,就增加 PE ;需要減少容量,就減少 PE 。 LVM 的構(gòu)成原理見圖 2.6 所示。
圖 2.6? LVM 的構(gòu)成原理
到了具體的邏輯卷上,就可以應(yīng)用 mkfs 命令進行格式化了,如此以來就能夠使用 mount 命令掛接到系統(tǒng)中了。
構(gòu)成原理現(xiàn)在算是搞定了,但是對于一個邏輯卷可能會對應(yīng)到多個物理分區(qū)上,那么在向硬盤中寫入數(shù)據(jù)的時候是怎么操作的呢?目前有兩種模式:
l 線性模式( linear ):即逐個物理分區(qū)使用。比如一個邏輯卷占用了 /dev/sda1 和 /dev/sda2 兩個分區(qū),那么首先寫 /dev/sda1 ,直到滿了之后才會使用 /dev/sda2 。
l 交錯模式( triped ):這個就將一筆數(shù)據(jù)拆成兩個部分,分別寫入 /dev/sda1 和 /dev/sda2 。這個與 RAID 0 很像。如果使用 /dev/sda1 和 /dev/sdb1 這樣的組合來做邏輯卷,有相當(dāng)于一份數(shù)據(jù)用兩個硬盤來寫,理論上是能夠提升讀寫效率的。
需要注意,雖然交錯模式的邏輯卷有點像 RAID ,但是它的最終目的還是用于磁盤容量的彈性可調(diào)的。如果要關(guān)注性能,還是直接使用 RAID 比較好。而且 triped 模式的邏輯卷與 RAID 0 是類似的,即當(dāng)某個分區(qū)掛掉了,那么你的數(shù)據(jù)也會跟著灰飛煙滅的。所以邏輯卷的默認工作模式是 linear 的。
3.基本操作
Cent OS 已經(jīng)默認支持邏輯卷了,所以如果選擇了 Cent OS 的同學(xué),現(xiàn)在就已經(jīng)在使用邏輯卷了。但是如果你選擇了 Ubuntu 這樣的發(fā)行版,就沒有這么幸運了,因為 Ubuntu 并沒有提供這方面的支持。但是也不要緊,我們可以手動安裝。
首先,邏輯卷必須有內(nèi)核支持才能工作。所以必須保證你所使用的內(nèi)核已經(jīng)開啟了的邏輯卷的支持(好在大多數(shù)主流發(fā)行版的內(nèi)核都支持);其次,需要安裝 lvm2 軟件包。當(dāng)這些都準(zhǔn)備妥當(dāng)之后,就可開始具體的工作了。
第一步就是準(zhǔn)備磁盤空余空間( PQ 絕對是個好工具),硬盤多的同學(xué)可以考慮利用第二塊硬盤。然后在這些準(zhǔn)備好的空余空間中劃出幾個分區(qū)來,并設(shè)置分區(qū)類型為 Linux LVM (分區(qū)標(biāo)志是 8e )。我們這里正好有一個塊 20G 的老硬盤,我們將它劃分了 4 個分區(qū),平均每個分區(qū) 5G 。
第二步是創(chuàng)建物理卷。與物理卷相關(guān)的命令有: pvcreate 、 pvscan 、 pvdisplay 和 pvremove 四個。具體都提供那些功能,相比通過名稱都能了解到。我們將剛剛劃分的 4 個分區(qū)都設(shè)置成物理卷,執(zhí)行這樣的命令:
# pvcreate /dev/hdb1
# pvcreate /dev/hdb2
# pvcreate /dev/hdb3
# pvcreate /dev/hdb4
或
# pvcreate /dev/hdb{1 , 2 , 3 , 4 }
顯然后一種的風(fēng)格更加簡便,所以我們后面的所有操作都將采用這種風(fēng)格。
第三步就是創(chuàng)建卷組 VG 。操作卷組的命令有: vgcreate 、 vgscan 、 vgdisplay 、 vgextend 、 vgreduce 、 vgchange 和 vgremove 。創(chuàng)建一個新卷組可以執(zhí)行類似這樣的命令:
# vgcreate /dev/hdb{1 , 2 , 3} NewVolGroup
我們知道卷組是由多個物理卷構(gòu)成的,現(xiàn)在我們將 /dev/hdb1 、 /dev/hdb2 和 /dev/hdb3 做成一個名為 NewVolGroup 的卷組,留下的那個用于放在后面說明如果動態(tài)增加或減少容量用。在卷組中額外添加或刪除物理卷的命令是 vgextend 和 vgreduce 。在創(chuàng)建創(chuàng)建卷組的這一時刻,可以給 vgcreate 命令傳遞“ -s ”選項指定物理擴展區(qū) PE 的大小,比如 16M 。可能有同學(xué)會覺得設(shè)置較大的 PE 會導(dǎo)致磁盤的浪費。其實不然, PE 與磁盤的最小存儲單元“扇區(qū)”或“簇”不同,他只是 LVM 用于進行動態(tài)伸縮尺寸的一個最小分配單元,而在真正存儲文件的時候,還是會利用磁盤本身的最小存儲單元。
第四步是創(chuàng)建邏輯卷 LV ,就相當(dāng)于對卷組這個大磁盤進行分區(qū)。與邏輯卷 LV 有關(guān)的命令有: lvcreate 、 lvscan 、 lvdisplay 、 lvextend 、 lvreduce 、 lvremove 和 lvresize 。出于方便考慮,我們將整個 VG 只劃分為一個 LV ,使用命令:
# lvcreate -l 3842 -n lv_data NewVolGroup
在這個命令中“ -l ”選項說明分配的 PE 數(shù)量,“ -n ”選擇則為新的 LV 命名。本例中 3842 正是我們現(xiàn)有的全部 PE 數(shù)量。我們從哪里獲得的呢?利用 vgdisplay 命令就行。
這樣,一個新的邏輯卷就創(chuàng)建完畢了。剩下的事情就是格式化并掛接它。我們使用如下命令:
# mkfs.ext4 /dev/mapper/NewVolGroup-lv_data
# mkdir /mnt/data
# mount /dev/mapper/NewVolGroup-lv_data/mnt/data
之后就可以使用 df 命令來確認這個新的磁盤使用情況了。
4.縮放邏輯卷
使用邏輯卷的目的就是沖著它能任意縮放的,所以如何縮放邏輯卷才是關(guān)鍵所在。我們先來看一下如何給邏輯卷增加容量。
我們之前特意留下了 /dev/hda4 來做這件事。在實際應(yīng)用中,還需要經(jīng)歷創(chuàng)建分區(qū)和物理卷的階段。將一個新的物理卷加入到一個已有的卷組中使用 vgextend 命令。在我們的例子中這樣操作:
$ vgextend NewVolGroup /dev/hda4
之后我們使用 vgdisplay 命令就能發(fā)現(xiàn)有新的 Free PE 出現(xiàn),在我們的測試機中是 1274 個。這個階段是擴大了卷組的容量,但是邏輯卷的還沒有改變。還需要使用 lvresize 命令將新增加的 PE 加入到邏輯卷中。在我們的例子中這樣操作:
$ lvresize -l +1274/dev/mapper/NewVolGroup-lv_data
這樣再使用 vgdisply 命令就發(fā)現(xiàn)已經(jīng)沒有 Free PE 了。不過這個時候我們使用 df 命令查看磁盤空間情況時,并沒有發(fā)現(xiàn)有什么變化。主要是因為我們還差一個步驟,就是執(zhí)行 resize2fs 命令。具體的原因其實很簡單,我們新增加的那些磁盤空間還沒有格式化呢。這個命令很簡單,在我們的例子中只需要這樣:
$ resize2fs /dev/mapper/NewVolGroup-lv_data
這樣,我們的磁盤容量就增大了,完全是在線的,是不是相當(dāng)神奇呢?
好了,說完了增加容量,就來看看如何減小容量吧。這次我們要把 /dev/hda1 抽出來。但是減小容量相對來講就要麻煩一些了,首先它就是不能在線的了。
我們先要確定 /dev/hda1 到底有多大,可以通過 pvdisplay 命令獲得。在我們的測試機中得到的結(jié)果是 5.01G 。而我們的硬盤是 20G 的,那么先要使用 resize2fs 命令將我們的磁盤調(diào)整到 20G-5.01G=14990M 的大小。我們執(zhí)行這樣的命令:
# 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 命令查看就能看出磁盤容量已經(jīng)縮減了。但是此時我們還有沒回收任何 PE 。這個時候還需要使用 lvresize 命令來回收 PE 。回收多少呢?當(dāng)然是 /dev/hda1 中含有的那些了。通過 pvdisplay 命令可以查到有 1282 個,所以執(zhí)行命令:
# lvresize -l -1282/dev/mapper/NewVolGroup-lv_data
那現(xiàn)在是不是就可以將 /dev/hda1 抽出來了呢?還不行。因為通過 pvdisplay 命令發(fā)現(xiàn), /dev/sda1 并沒有空閑的 PE ,而空閑的 PE 現(xiàn)在在 /dev/sda3 和 /dev/sda4 上。 /dev/sda4 上有 1274 個 Free PE ,而 /dev/sda3 上有 8 個 Free PE (總共 1280 個 PE) 。要抽出 /dev/sda1 ,必須是的它的全部 PE 為 Free 狀態(tài),這個可以借由 pvmove 命令完成。在我們這個場景中可以使用類似這樣的命令:
# psmove /dev/hda1:0-1273 /dev/hda4:0-1273
# psmove /dev/hda1:1274-1281/dev/hda3:1272-1279
這之后再使用 pvdisplay 查看,就發(fā)現(xiàn) /dev/sda1 的 PE 都為 Free 狀態(tài)了。這之后就可以使用 vgreduce 命令,將 /dev/sda1 抽出了。在我們的場景中可執(zhí)行類似這樣的命令:
# vgreduce NewVolGroup /dev/hda1
需要提醒大家一下,在我們這個例子中,由于 /dev/sda1 是所有分區(qū)中最大的一個,使得無法將它的整個數(shù)據(jù)移入到任何其他分區(qū)中,所以我們在使用 psmove 命令的時候參數(shù)有些復(fù)雜。但是這種情況卻是在實際應(yīng)用當(dāng)中經(jīng)常遇到的情況。如果遇到了目標(biāo)分區(qū)空余空間比原分區(qū)大的時候, PE 編號范圍就可以省略了。順便提一句, PE 編號是從零開始的。
總結(jié)
以上是生活随笔 為你收集整理的融于心而表于行 之 磁盘的管理方式 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。