
在 linux 中可以使用 fdisk -l 查看一個(gè)磁盤的物理結(jié)構(gòu):
該磁盤有255個(gè)heads,也就是說(shuō)共有255個(gè)盤面。3263個(gè)柱面(cylinders),也就是說(shuō)每個(gè)盤面上都有3263個(gè)磁道, 63 sectors/track說(shuō)的是每個(gè)磁道上共有63個(gè)扇區(qū)。命令結(jié)果也給出了Sector size的值是512bytes。那我們動(dòng)筆算一下該磁盤的大小吧。255盤面 * 3263柱面 * 63扇區(qū) * 每個(gè)扇區(qū)512bytes = 26839088640byte。結(jié)果是26.8G,和磁盤的總大小相符。1.2 磁盤的讀寫原理系統(tǒng)將文件存儲(chǔ)到磁盤上時(shí),按柱面、磁頭、扇區(qū)的方式進(jìn)行,即最先是第1磁道的第一磁頭下(也就是第1盤面的第一磁道)的所有扇區(qū),然后,是同一柱面的下一磁頭,……,一個(gè)柱面存儲(chǔ)滿后就推進(jìn)到下一個(gè)柱面,直到把文件內(nèi)容全部寫入磁盤。系統(tǒng)也以相同的順序讀出數(shù)據(jù)。讀出數(shù)據(jù)時(shí)通過(guò)告訴磁盤控制器要讀出扇區(qū)所在的柱面號(hào)、磁頭號(hào)和扇區(qū)號(hào)(物理地址的三個(gè)組成部分)進(jìn)行。磁盤控制器則直接使磁頭部件步進(jìn)到相應(yīng)的柱面,選通相應(yīng)的磁頭,等待要求的扇區(qū)移動(dòng)到磁頭下。在扇區(qū)到來(lái)時(shí),磁盤控制器讀出每個(gè)扇區(qū)的頭標(biāo),把這些頭標(biāo)中的地址信息與 期待檢出的磁頭和柱面號(hào)做比較(即尋道),然后,尋找要求的扇區(qū)號(hào)。待磁盤控制器找到該扇區(qū)頭標(biāo)時(shí),根據(jù)其任務(wù)是寫扇區(qū)還是讀扇區(qū),來(lái)決定是轉(zhuǎn)換寫電路, 還是讀出數(shù)據(jù)和尾部記錄。找到扇區(qū)后,磁盤控制器必須在繼續(xù)尋找下一個(gè)扇區(qū)之前對(duì)該扇區(qū)的信息進(jìn)行后處理。如果是讀數(shù)據(jù),控制器計(jì)算此數(shù)據(jù)的ECC碼,然 后,把ECC碼與已記錄的ECC碼相比較。如果是寫數(shù)據(jù),控制器計(jì)算出此數(shù)據(jù)的ECC碼,與數(shù)據(jù)一起存儲(chǔ)。在控制器對(duì)此扇區(qū)中的數(shù)據(jù)進(jìn)行必要處理期間,磁 盤繼續(xù)旋轉(zhuǎn)。其實(shí)我們的文件大多數(shù)的時(shí)候都是破碎的,在文件沒(méi)有破碎的時(shí)候,搖臂只需要尋找1次磁道并由磁頭進(jìn)行讀取,只需要1次就可以成功讀取;但是如果文件破碎成11處,那么搖臂要來(lái)回尋找11次磁道磁頭進(jìn)行11次讀取才能完整的讀取這個(gè)文件,讀取時(shí)間相對(duì)沒(méi)有破碎的時(shí)候就變得冗長(zhǎng)。因此,磁盤IO時(shí)的過(guò)程包括:| IDE 磁盤 | 描述 | 配置 |
|---|---|---|
| /dev/hda | 1st (PRimary) IDE controller | Master |
| /dev/hdb | 1st (Primary) IDE controller | Slave |
| /dev/hdc | 2nd (Secondary) IDE controller | Master |
| /dev/hdd | 2nd (Secondary) IDE controller | Slave |

其中第一個(gè)框和第二個(gè)框,是已經(jīng)分好區(qū)的磁盤,第三個(gè)硬盤沒(méi)有分區(qū)。[root]# fdisk /dev/sdbCommand (m for help): m (Enter the letter "m" to get list of commands)Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)Command (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-9729, default 1):Using default value 1Last cylinder, +cylinders or +size{K,M,G} (1-9729, default 9729):Using default value 9729Command (m for help): w (Write and save partition table)[root]# mkfs.ext4 -L disk2 /dev/sdb |
關(guān)于文件系統(tǒng)的三個(gè)易混淆的概念:.png)
4. 開(kāi)機(jī)直接掛載編輯 /etc/fstab 文件,添加:/dev/sda1 /test ext3 defaults 1 1,重啟則發(fā)選已經(jīng)掛載上去。5.總結(jié)
文件是文件系統(tǒng)對(duì)數(shù)據(jù)的分割單元。文件系統(tǒng)用目錄來(lái)組織文件,賦予文件以上下分級(jí)的結(jié)構(gòu)。在硬盤上實(shí)現(xiàn)這一分級(jí)結(jié)構(gòu)的關(guān)鍵,是使用 inode 來(lái)虛擬普通文件和目錄文件對(duì)象。在Linux系統(tǒng)中,目錄也是一種文件。所以/home/sammy 是指向目錄文件sammy 的絕對(duì)路徑。磁盤與文件系統(tǒng):.png)
3.1inodeinodes 是實(shí)現(xiàn)文件存儲(chǔ)的關(guān)鍵。在 Linux 中,文件系統(tǒng)中管理的每個(gè)對(duì)象(文件或目錄)表示為一個(gè) inode。inode 包含管理文件系統(tǒng)中的對(duì)象所需的所有元數(shù)據(jù)(包括可以在對(duì)象上執(zhí)行的操作)。在 Linux 系統(tǒng)中,一個(gè)文件可以分成幾個(gè)數(shù)據(jù)塊存儲(chǔ)在分區(qū)內(nèi)。為了搜集各數(shù)據(jù)塊,我們需要該文件對(duì)應(yīng)的inode。每個(gè)文件對(duì)應(yīng)一個(gè) inode。這個(gè) inode 中包含多個(gè)指針,指向?qū)儆谠撐募鱾€(gè)數(shù)據(jù)塊。當(dāng)操作系統(tǒng)需要讀取文件時(shí),只需要找到對(duì)應(yīng) inode,收集分散的數(shù)據(jù)塊,就可以收獲我們的文件了。
讀取文件:在Linux中,我們通過(guò)解析路徑,根據(jù)沿途的目錄文件來(lái)找到某個(gè)文件。目錄中的條目除了所包含的文件名,還有對(duì)應(yīng)的inode編號(hào)。當(dāng)我們輸入$cat /var/test.txt時(shí),Linux 將在根目錄文件中找到 var 這個(gè)目錄文件的inode編號(hào),然后根據(jù) inode 合成 var 的數(shù)據(jù)。隨后,根據(jù) var 中的記錄,找到 text.txt 的 inode 編號(hào),沿著 inode 中的指針,收集數(shù)據(jù)塊,合成 text.txt 的數(shù)據(jù)。整個(gè)過(guò)程中,會(huì)參考三個(gè)inode:
因此,當(dāng)我們讀取一個(gè)文件時(shí),實(shí)際上是在目錄中找到了這個(gè)文件的inode編號(hào),然后根據(jù)inode的指針,把數(shù)據(jù)塊組合起來(lái),放入內(nèi)存供進(jìn)一步的處理。當(dāng)我們創(chuàng)建一個(gè)文件時(shí),是分配一個(gè)空白 inode 給該文件,將其 inode 編號(hào)記入該文件所屬的目錄,然后選取空白的數(shù)據(jù)塊,讓 inode 的指針指向這些數(shù)據(jù)塊,并放入內(nèi)存中的數(shù)據(jù)。3.2 循環(huán)設(shè)備在類Unix系統(tǒng)中,/dev/loop是一種偽設(shè)備,這種設(shè)備使得文件可以如同塊設(shè)備一般被訪問(wèn)。在目錄上掛載包含文件系統(tǒng)的文件一般需要兩步:dd if=/dev/zero of=file.img bs=1k count=10000 //創(chuàng)建一個(gè)初始化文件losetup /dev/loop0 file.img //創(chuàng)建一個(gè)循環(huán)設(shè)備mke2fs -c /dev/loop0 10000 //創(chuàng)建文件系統(tǒng)mkdir /mnt/point1 //創(chuàng)建掛載點(diǎn)mount -t ext2 /dev/loop0 /mnt/point1 //掛載3.3 文件系統(tǒng)的結(jié)構(gòu)

用戶空間包含一些應(yīng)用程序(例如,文件系統(tǒng)的使用者)和 GNU C 庫(kù)(glibc),它們?yōu)槲募到y(tǒng)調(diào)用(打開(kāi)、讀取、寫和關(guān)閉)提供用戶接口。系統(tǒng)調(diào)用接口的作用就像是交換器,它將系統(tǒng)調(diào)用從用戶空間發(fā)送到內(nèi)核空間中的適當(dāng)端點(diǎn)。VFS 是底層文件系統(tǒng)的主要接口,它是 Linux 內(nèi)核中的一個(gè)軟件抽象層。。這個(gè)組件導(dǎo)出一組接口,然后將它們抽象到各個(gè)文件系統(tǒng),各個(gè)文件系統(tǒng)的行為可能差異很大。有兩個(gè)針對(duì)文件系統(tǒng)對(duì)象的緩存(inode 和 dentry)。它們緩存最近使用過(guò)的文件系統(tǒng)對(duì)象。因?yàn)橛?VFS存在,Linux 允許眾多不同的文件系統(tǒng)共存,并支持跨文件系統(tǒng)的文件操作。它通過(guò)一些數(shù)據(jù)結(jié)構(gòu)及其方法向?qū)嶋H的文件系統(tǒng)如 ext2,vfat 提供接口機(jī)制。每個(gè)文件系統(tǒng)實(shí)現(xiàn)(比如 ext2、JFS 等等)導(dǎo)出一組通用接口,供 VFS 使用。緩沖區(qū)緩存會(huì)緩存文件系統(tǒng)和相關(guān)塊設(shè)備之間的請(qǐng)求。例如,對(duì)底層設(shè)備驅(qū)動(dòng)程序的讀寫請(qǐng)求會(huì)通過(guò)緩沖區(qū)緩存來(lái)傳遞。這就允許在其中緩存請(qǐng)求,減少訪問(wèn)物理設(shè)備的次數(shù),加快訪問(wèn)速度。可以使用sync命令將緩沖區(qū)緩存中的請(qǐng)求發(fā)送到存儲(chǔ)媒體(迫使所有未寫的數(shù)據(jù)發(fā)送到設(shè)備驅(qū)動(dòng)程序,進(jìn)而發(fā)送到存儲(chǔ)設(shè)備)。
3.4 VFS (虛擬文件系統(tǒng))Linux 中允許眾多不同的文件系統(tǒng)共存,如 ext2, ext3, vfat 等。通過(guò)使用同一套文件 I/O 系統(tǒng)調(diào)用即可對(duì) Linux 中的任意文件進(jìn)行操作而無(wú)需考慮其所在的具體文件系統(tǒng)格式;更進(jìn)一步,對(duì)文件的 操作可以跨文件系統(tǒng)而執(zhí)行。如下圖所示,我們可以使用 cp 命令從 vfat 文件系統(tǒng)格式的硬盤拷貝數(shù)據(jù)到 ext3 文件系統(tǒng)格式的硬盤;而這樣的操作涉及到兩個(gè)不同的文件系統(tǒng)。
過(guò)程:VFS調(diào)用 vfat 的讀文件方法將 a.txt 的數(shù)據(jù)讀入內(nèi)存;再將 a.txt 在內(nèi)存中的數(shù)據(jù)映射到b.txt對(duì)應(yīng)的內(nèi)存空間后,VFS調(diào)用ext3的寫文件方法將b.txt寫入磁盤;從而實(shí)現(xiàn)了最終的跨文件系統(tǒng)的復(fù)制操作。“一切皆是文件”是 Unix/Linux 的基本哲學(xué)之一。不僅普通的文件,目錄、字符設(shè)備、塊設(shè)備、 套接字等在 Unix/Linux 中都是以文件被對(duì)待;它們雖然類型不同,但是對(duì)其提供的卻是同一套操作界面。操作文件時(shí)需先打開(kāi);打開(kāi)文件時(shí),VFS 會(huì)知道該文件對(duì)應(yīng)的文件系統(tǒng)格式;當(dāng)VFS把控制權(quán)傳給實(shí)際的文件系統(tǒng)時(shí),實(shí)際的文件系統(tǒng)再做出具體區(qū)分,對(duì)不同的文件類型執(zhí)行不同的操作。這也就是“一切皆是文件”的根本所在。
從物理介質(zhì)讀文件的具體過(guò)程:
當(dāng)在用戶應(yīng)用程序調(diào)用文件 I/O read()操作時(shí),系統(tǒng)調(diào)用 sys_read() 被激發(fā),sys_read() 找到文件所在的具體文件系統(tǒng),把控制權(quán)傳給該文件系統(tǒng),最后由具體文件系統(tǒng)與物理介質(zhì)交互,從介質(zhì)中讀出數(shù)據(jù)。3.5 Linux 文件系統(tǒng)類型3.5.1 ReiserFSReiserFS 是一種文件系統(tǒng)格式。Linux內(nèi)核從2.4.1版本開(kāi)始支持ReiserFS。ReiserFS原先是Novell公司的SuSELinux Enterprise采用的默認(rèn)文件系統(tǒng),直到2006年10月12日其宣稱將在未來(lái)的版本改采ext3為默認(rèn)。和同樣在 Linux Kernel 2.4 版本下的 ext2 及 ext3 相比較,處理 4KB 以下的小文件時(shí)(tail packing enable),ReiserFS 的速度快了 10 到 15 倍[3]。但是,有些目錄的操作在 ReiserFS 上面并不同步,(包括像 unlink(2)),可能會(huì)導(dǎo)致一些重度依賴文件鎖(file-based lock)機(jī)制的應(yīng)用程序上面數(shù)據(jù)的毀損。ReiserFS 在一個(gè)單一復(fù)合B+樹中存儲(chǔ)文件的亞數(shù)據(jù)信息(stat item)、目錄文件信息(directory items)、索引節(jié)點(diǎn)中的塊列表(indirect items),這些信息都有唯一的標(biāo)識(shí)號(hào)作為B+樹的索引值。3.5.2 ext2 文件系統(tǒng)ext2 文件系統(tǒng)(也稱為第二擴(kuò)展文件系統(tǒng))旨在克服早期 Linux 版本中使用的 Minix 文件系統(tǒng)的缺點(diǎn)。多年來(lái),該文件系統(tǒng)一直廣泛應(yīng)用于 Linux。但 ext2 中沒(méi)有日志,現(xiàn)在基本上已被 ext3 和最新的 ext4 所取代。
3.5.3 ext3 文件系統(tǒng)ext3 文件系統(tǒng)向標(biāo)準(zhǔn) ext2 文件系統(tǒng)添加了日志功能,因此是一個(gè)非常穩(wěn)定的文件系統(tǒng)的一個(gè)演化發(fā)展。它在大多數(shù)情況下提供合理的性能并且仍舊在改進(jìn)。由于它在可靠的 ext2 文件系統(tǒng)上添加了日志功能,因此可以將現(xiàn)有 ext2 文件系統(tǒng)轉(zhuǎn)換為 ext3 文件系統(tǒng),并且在必要時(shí)還可以轉(zhuǎn)換回來(lái)。
3.5.4 ext4 文件系統(tǒng)ext4 是作為 ext3 的擴(kuò)展來(lái)啟動(dòng)的,它通過(guò)增加存儲(chǔ)限制和提高性能來(lái)滿足更大文件系統(tǒng)的需求。為了保留 ext3 的穩(wěn)定性,在2006 年 6 月,該擴(kuò)展被拆分成一個(gè)新的文件系統(tǒng),即 ext4。ext4 文件系統(tǒng)在 2008 年 12 月正式發(fā)布,包含在 2.6.28 內(nèi)核中。3.5.5 vfat 文件系統(tǒng)vfat 文件系統(tǒng)(也稱為FAT32)沒(méi)有日志功能,且缺乏完整的 Linux 文件系統(tǒng)實(shí)現(xiàn)所需的許多特性。它可用于在 Windows 和 Linux 系統(tǒng)之間交換數(shù)據(jù),因?yàn)?Windows 和 Linux 都能讀取它。不要將這個(gè)文件系統(tǒng)用于 Linux,除非要在 Windows 和 Linux 之間共享數(shù)據(jù)。3.5.6 XFS 文件系統(tǒng)XFS 文件系統(tǒng)擁有日志功能,包含一些健壯的特性,并針對(duì)可伸縮性進(jìn)行了優(yōu)化。XFS 通常是相當(dāng)快的。在大文件操作方面,XFS 在所有測(cè)試中一直處于領(lǐng)先地位。XFS 的性能非常接近 ReiserFS,并在大多數(shù)測(cè)試指標(biāo)上都超過(guò)了 ext3。3.5.7 IBM JFS 文件系統(tǒng)IBM 的Journaled File System (JFS),目前用于 IBM 企業(yè)服務(wù)器,專為高吞吐量服務(wù)器環(huán)境而設(shè)計(jì)。它可用于 Linux,包含在幾個(gè)發(fā)行版中。要?jiǎng)?chuàng)建 JFS 文件系統(tǒng),使用 mkfs.jfs 命令。3.6 選擇文件系統(tǒng)選擇合適的下一代 Linux 文件系統(tǒng)一直很簡(jiǎn)單。那些只尋求原始性能的人通常傾向于使用 ReiserFS,而那些更關(guān)心數(shù)據(jù)完整性特性的人則首選 ext3/4。然而,隨著 XFS 的 Linux 版的發(fā)布,事情突然變得令人困惑。尤其是,對(duì)于 ReiserFS 是否依然是下一代文件系統(tǒng)性能方面的佼佼者,人們開(kāi)始感到疑惑。mkfs命令來(lái)創(chuàng)建文件系統(tǒng),使用mkswap命令創(chuàng)建交換空間。mkfs命令實(shí)際上是幾個(gè)特定文件系統(tǒng)的命令的前端,比如面向 ext3 的mkfs.ext3,面向 ext4 的mkfs.ext4以及面向 ReiserFS 的mkfs.reiserfs。你的文件系統(tǒng)上安裝的是什么文件系統(tǒng)支持?使用ls/sbin/mk*命令即可得到答案。參考文檔:http://djt.QQ.com/article/view/620http://my.oschina.net/leejun2005/blog/290073http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.phphttp://www.CUOXin.com/vamei/p/3506566.htmlhttp://www.ibm.com/developerworks/cn/linux/l-linux-kernel/http://www.ibm.com/developerworks/cn/linux/l-cn-vfs/http://www.ibm.com/developerworks/cn/linux/filesystem/l-fs9/http://zh.wikipedia.org/wiki/ReiserFS新聞熱點(diǎn)
疑難解答
圖片精選