1、磁盤基礎知識
1.1 物理結構
硬盤的物理結構一般由磁頭與碟片、電動機、主控芯片與排線等部件組成;當主電動機帶動碟片旋轉時,副電動機帶動一組(磁頭)到相對應的碟片上并確定讀取正面還是反面的碟面,磁頭懸浮在碟面上畫出一個與碟片同心的圓形軌道(磁軌或稱柱面),這時由磁頭的磁感線圈感應碟面上的磁性與使用硬盤廠商指定的讀取時間或數據間隔定位扇區,從而得到該扇區的數據內容。所有的盤片都固定在一個旋轉軸上,這個軸即盤片主軸。而所有盤片之間是絕對平行的,在每個盤片的存儲面上都有一個磁頭,磁頭與盤片之間的距離比頭發 絲的直徑還小。所有的磁頭連在一個磁頭控制器上,由磁頭控制器負責各個磁頭的運動。磁頭可沿盤片的半徑方向動作,而盤片以每分鐘數千轉到上萬轉的速度在高 速旋轉,這樣磁頭就能對盤片上的指定位置進行數據的讀寫操作。
當磁盤旋轉時,磁頭若保持在一個位置上,則每個磁頭都會在磁盤表面劃出一個圓形軌跡數據結構讀取文件,這些圓形軌跡就叫做磁道(Track)。信息以脈沖串的形式記錄在這些軌跡中,這些同心圓不是連續記錄數據,而是被劃分成一段段的圓弧(扇區),這些圓弧 的角速度一樣。
在有多個盤片構成的盤組中,由不同盤片的面,但處于同一半徑圓的多個磁道組成的一個圓柱面()。所有盤面上的同一磁道構成一個圓柱,通常稱做柱面(),每個圓柱上的磁頭由上而下從“0”開始編號。數據的讀/寫按柱面進行,即磁 頭讀/寫數據時首先在同一柱面內從“0”磁頭開始進行操作,依次向下在同一柱面的不同盤面即磁頭上進行操作,只在同一柱面所有的磁頭全部讀/寫完畢后磁頭 才轉移到下一柱面,因為選取磁頭只需通過電子切換即可,而選取柱面則必須通過機械切換。電子切換相當快,比在機械上磁頭向鄰近磁道移動快得多,所以,數據 的讀/寫按柱面進行,而不按盤面進行。也就是說,一個磁道寫滿數據后,就在同一柱面的下一個盤面來寫,一個柱面寫滿后,才移到下一個扇區開始寫數據。讀數 據也按照這種方式進行,這樣就提高了硬盤的讀/寫效率。
磁盤上的每個磁道被等分為若干個弧段,這些弧段便是硬盤的扇區()。硬盤的第一個扇區,叫做引導扇區。操作系統以扇區()形式將信息存儲在硬盤上,每個扇區包括512個字節的數據和一些其他信息。
在硬盤系 統中,硬盤的每一個盤片都有兩個盤面(Side),即上、下盤面,一般每個盤面都會利 用,都可以存儲數據。盤面號又叫磁頭號,因為每一個有效盤面都有一個對應的讀寫磁頭。
在 linux 中可以使用 fdisk -l 查看一個磁盤的物理結構:
該磁盤有255個heads,也就是說共有255個盤面。3263個柱面(),也就是說每個盤面上都有3263個磁道, 63 /track說的是每個磁道上共有63個扇區。命令結果也給出了 size的值是。那我們動筆算一下該磁盤的大小吧。
255盤面 * 3263柱面 * 63扇區 * 每個扇區 = 。
結果是26.8G,和磁盤的總大小相符。
1.2 磁盤的讀寫原理
系統將文件存儲到磁盤上時,按柱面、磁頭、扇區的方式進行,即最先是第1磁道的第一磁頭下(也就是第1盤面的第一磁道)的所有扇區,然后,是同一柱面的下一磁頭,……,一個柱面存儲滿后就推進到下一個柱面,直到把文件內容全部寫入磁盤。
系統也以相同的順序讀出數據。讀出數據時通過告訴磁盤控制器要讀出扇區所在的柱面號、磁頭號和扇區號(物理地址的三個組成部分)進行。磁盤控制器則直接使磁頭部件步進到相應的柱面,選通相應的磁頭,等待要求的扇區移動到磁頭下。在扇區到來時,磁盤控制器讀出每個扇區的頭標,把這些頭標中的地址信息與 期待檢出的磁頭和柱面號做比較(即尋道),然后,尋找要求的扇區號。待磁盤控制器找到該扇區頭標時,根據其任務是寫扇區還是讀扇區,來決定是轉換寫電路, 還是讀出數據和尾部記錄。找到扇區后,磁盤控制器必須在繼續尋找下一個扇區之前對該扇區的信息進行后處理。如果是讀數據,控制器計算此數據的ECC碼,然 后,把ECC碼與已記錄的ECC碼相比較。如果是寫數據,控制器計算出此數據的ECC碼,與數據一起存儲。在控制器對此扇區中的數據進行必要處理期間,磁 盤繼續旋轉。其實我們的文件大多數的時候都是破碎的,在文件沒有破碎的時候,搖臂只需要尋找1次磁道并由磁頭進行讀取,只需要1次就可以成功讀取;但是如果文件破碎成11處,那么搖臂要來回尋找11次磁道磁頭進行11次讀取才能完整的讀取這個文件,讀取時間相對沒有破碎的時候就變得冗長。
因此,磁盤IO時的過程包括:
所以,單次磁盤IO時間 = 尋道時間 + 旋轉延遲 + 存取時間。
候選的磁盤分區方案:
其實采用哪一種,最主要看的是那種方式性能更快。因為同一分區下的數據經常會一起讀取,假如采用第一種,那么這樣磁頭就需要在3000多個track間不停地跳來跳去,這樣磁盤的尋道時間就會翻倍,磁盤性能就會下降。而對于方案二,假如對于磁盤C,只需要在磁頭在1-1000個磁道間移動就可以了,大大降低了尋道時間。(實際上分區并不是從0開始的,磁盤的第一個磁道對應的柱面會被用來安裝引導加載程序以及磁盤分區表)。所以,方案二的分區方式可以降低磁盤IO時間中的尋道時間部分,所以所有的操作系統采用的都是方案二,沒有用方案一的。
2. Linux 下磁盤命名和分區
在為主機添加硬盤前,首先要了解Linux系統下對硬盤和分區的命名方法。
2.1 磁盤命名
在Linux下對 SCSI 和 SATA 設備是以 sd 命名的,第一個 scsi 設備是 sda,第二個是 sdb,依此類推。一般主板上有兩個SCSI接口,因此一共可以安裝四個SCSI設備。主 SCSI 上的兩個設備分別對應 sda 和 sdb,第二個 SCSI 口上的兩個設備對應 sdc 和 sdd。一般硬盤安裝在主 SCSI 的主接口上,所以是 sda 或者 sdb,而光驅一般安裝在第二個SCSI的主接口上,所以是 sdc。(IDE接口設備是用 hd 命名的,第一個設備是hda,第二個是hdb,依此類推。)
IDE 磁盤
描述配置
/dev/hda
1st () IDE
/dev/hdb
1st () IDE
Slave
/dev/hdc
2nd () IDE
/dev/hdd
2nd () IDE
Slave
2.2 分區命名
所謂的磁盤分區指的是告訴操作系統『我這顆磁盤在此分割槽可以存取的區域是由 A 磁柱到 B 磁柱之間的區塊』, 如此一來操作系統就能夠知道他可以在所指定的區塊內進行文件數據的讀/寫/搜尋等動作了。 也就是說,磁盤分區意即指定分割槽的啟始與結束磁柱就是了。
分區是用設備名稱加數字命名的。例如 hda1 代表hda這個硬盤設備上的第一個分區。 每個硬盤可以最多有四個主分區,作用是 1-4 命名硬盤的主分區。多個主分區中只能有一個 主分區作為啟動分區。邏輯分區是從5開始的,每多一個分區,每個磁盤上最多可以有 24個擴展分區。
2.3 分區步驟
1. 運行 fdisk 來分區:
其中第一個框和第二個框,是已經分好區的磁盤,第三個硬盤沒有分區。
[root]# fdisk /dev/sdb
(m for help): m(Enter the "m" to get list of )
a a flag
b edit bsd
c the dos flag
d a
l list known types
m print this menu
n add a new
o a new empty DOS table
p print the table
q quit
s a new empty Sun
t a 's id
u /entry units
v the table
w write table to disk and exit
x extra ( only)
(m for help): n
e
p (1-4)
p
(1-4): 1
First (1-9729, 1):
Using value 1
Last , + or +size{K,M,G} (1-9729, 9729):
Using value 9729
(m for help): w (Write and save table)
[root]# mkfs.ext4 -L disk2 /dev/sdb
分多個區有以下幾個目的:
2. 格式化分區:mkfs -t ext3 /dev/sda1
每塊硬盤都分為若干個分區,每個分區都有自己的文件系統。為這些文件系統各自指定了一個字母。不過 GNU/Linux 使用唯一的樹形結構來管理文件,而每個文件系統都掛載于樹形結構的某個位置。
正如 需要有 C: 驅動器一樣,GNU/Linux 必須能夠將根文件系統掛載于文件樹的根(/)上。當根掛載完成之后,您就可以將其它文件系統掛載于樹形結構各種掛載點上。根結構下的任何目錄都可以作為掛載點,而您也可以將同一文件系統同時掛載于不同的掛載點上。掛載點實際上就是linux中的磁盤文件系統的入口目錄:
關于文件系統的三個易混淆的概念:
linux 下一切皆文件!換言之就是linux操作系統將系統中的一切都作為文件來管理。在中我們常見的硬件設備(打印機、網卡、聲卡...)、磁盤分區等,在linux中統統都被視作文件,對設備、分區的訪問就是讀寫對應的文件。
格式化命令:
mkfs.ext3 /dev/sdb1 //格式化分區成 ext3
mkfs.ext2 /dev/sdb1 //格式化分區成 ext2
3. 掛載 mount /dev/sda1 /test
df 命令用于查看已掛載磁盤的總容量、使用容量、剩余容量等,可以不加任何參數,默認是按k為單位顯示的。
du 命令用來查看某個目錄所占空間大小。
4. 開機直接掛載
編輯 /etc/fstab 文件,添加:/dev/sda1 /test ext3 1 1,重啟則發選已經掛載上去。
5. 總結
3. Linux 文件系統
文件系統是對一個存儲設備上的數據和元數據進行組織的機制。它的最終目的是把大量數據有組織的放入持久性()的存儲設備中,比如硬盤和磁盤。文件系統(file )是就是文件在邏輯上組織形式,它以一種更加清晰的方式來存放各個文件。數據被存入到某個分區中。一個典型的Linux分區()包含有下面各個部分:
文件是文件系統對數據的分割單元。文件系統用目錄來組織文件,賦予文件以上下分級的結構。在硬盤上實現這一分級結構的關鍵,是使用 inode 來虛擬普通文件和目錄文件對象。在Linux系統中,目錄也是一種文件。所以/home/sammy 是指向目錄文件 sammy 的絕對路徑。
磁盤與文件系統:
3.1 inode
是實現文件存儲的關鍵。在 Linux 中,文件系統中管理的每個對象(文件或目錄)表示為一個 inode。inode 包含管理文件系統中的對象所需的所有元數據(包括可以在對象上執行的操作)。在 Linux 系統中,一個文件可以分成幾個數據塊存儲在分區內。為了搜集各數據塊,我們需要該文件對應的inode。每個文件對應一個 inode。這個 inode 中包含多個指針,指向屬于該文件各個數據塊。當操作系統需要讀取文件時,只需要找到對應 inode,收集分散的數據塊,就可以收獲我們的文件了。
讀取文件:
在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應的inode編號。當我們輸入$cat /var/test.txt時,Linux 將在根目錄文件中找到 var 這個目錄文件的inode編號,然后根據 inode 合成 var 的數據。隨后,根據 var 中的記錄,找到 text.txt 的 inode 編號,沿著 inode 中的指針,收集數據塊,合成 text.txt 的數據。整個過程中,會參考三個inode:
因此,當我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然后根據inode的指針,把數據塊組合起來,放入內存供進一步的處理。當我們創建一個文件時,是分配一個空白 inode 給該文件,將其 inode 編號記入該文件所屬的目錄,然后選取空白的數據塊,讓 inode 的指針指向這些數據塊,并放入內存中的數據。
3.2 循環設備
在類Unix系統中,/dev/loop 是一種偽設備,這種設備使得文件可以如同塊設備一般被訪問。在目錄上掛載包含文件系統的文件一般需要兩步:
用一個循環設備節點連接文件。在目錄上掛載該循環設備
具體步驟:
dd if=/dev/zero of=file.img bs=1k count=10000 //創建一個初始化文件 /dev/loop0 file.img //創建一個循環設備 -c /dev/loop0 10000 //創建文件系統 mkdir /mnt/ //創建掛載點 mount -t ext2 /dev/loop0 /mnt/ //掛載
3.3 文件系統的結構
用戶空間包含一些應用程序(例如數據結構讀取文件,文件系統的使用者)和 GNU C 庫(glibc),它們為文件系統調用(打開、讀取、寫和關閉)提供用戶接口。系統調用接口的作用就像是交換器,它將系統調用從用戶空間發送到內核空間中的適當端點。
VFS 是底層文件系統的主要接口,它是 Linux 內核中的一個軟件抽象層。。這個組件導出一組接口,然后將它們抽象到各個文件系統,各個文件系統的行為可能差異很大。有兩個針對文件系統對象的緩存(inode 和 )。它們緩存最近使用過的文件系統對象。因為有 VFS 存在,Linux 允許眾多不同的文件系統共存,并支持跨文件系統的文件操作。它通過一些數據結構及其方法向實際的文件系統如 ext2,vfat 提供接口機制。
每個文件系統實現(比如 ext2、JFS 等等)導出一組通用接口,供 VFS 使用。緩沖區緩存會緩存文件系統和相關塊設備之間的請求。例如,對底層設備驅動程序的讀寫請求會通過緩沖區緩存來傳遞。這就允許在其中緩存請求,減少訪問物理設備的次數,加快訪問速度。可以使用 sync 命令將緩沖區緩存中的請求發送到存儲媒體(迫使所有未寫的數據發送到設備驅動程序,進而發送到存儲設備)。
3.4 VFS (虛擬文件系統)
Linux 中允許眾多不同的文件系統共存,如 ext2, ext3, vfat 等。通過使用同一套文件 I/O 系統調用即可對 Linux 中的任意文件進行操作而無需考慮其所在的具體文件系統格式;更進一步,對文件的 操作可以跨文件系統而執行。如下圖所示,我們可以使用 cp 命令從 vfat 文件系統格式的硬盤拷貝數據到 ext3 文件系統格式的硬盤;而這樣的操作涉及到兩個不同的文件系統。
過程:VFS調用 vfat 的讀文件方法將 a.txt 的數據讀入內存;再將 a.txt 在內存中的數據映射到b.txt對應的內存空間后,VFS調用ext3的寫文件方法將b.txt寫入磁盤;從而實現了最終的跨文件系統的復制操作。
“一切皆是文件”是 Unix/Linux 的基本哲學之一。不僅普通的文件,目錄、字符設備、塊設備、 套接字等在 Unix/Linux 中都是以文件被對待;它們雖然類型不同,但是對其提供的卻是同一套操作界面。操作文件時需先打開;打開文件時,VFS 會知道該文件對應的文件系統格式;當VFS把控制權傳給實際的文件系統時,實際的文件系統再做出具體區分,對不同的文件類型執行不同的操作。這也就是“一切皆是文件”的根本所在。
從物理介質讀文件的具體過程:
當在用戶應用程序調用文件 I/O read()操作時,系統調用 () 被激發,() 找到文件所在的具體文件系統,把控制權傳給該文件系統,最后由具體文件系統與物理介質交互,從介質中讀出數據。
3.5 Linux 文件系統類型 3.5.1
是一種文件系統格式。Linux內核從2.4.1版本開始支持。原先是公司的SuSE Linux 采用的默認文件系統,直到2006年10月12日其宣稱將在未來的版本改采 ext3 為默認。和同樣在 Linux 2.4 版本下的 ext2 及 ext3 相比較,處理 4KB 以下的小文件時(tail ), 的速度快了 10 到 15 倍[3]。但是,有些目錄的操作在 上面并不同步,(包括像 (2)),可能會導致一些重度依賴文件鎖(file-based lock)機制的應用程序上面數據的毀損。 在一個單一復合B+樹中存儲文件的亞數據信息(stat item)、目錄文件信息( items)、索引節點中的塊列表( items),這些信息都有唯一的標識號作為B+樹的索引值。
3.5.2 ext2 文件系統
ext2 文件系統(也稱為第二擴展文件系統)旨在克服早期 Linux 版本中使用的 Minix 文件系統的缺點。多年來,該文件系統一直廣泛應用于 Linux。但 ext2 中沒有日志,現在基本上已被 ext3 和最新的 ext4 所取代。
3.5.3 ext3 文件系統
ext3 文件系統向標準 ext2 文件系統添加了日志功能,因此是一個非常穩定的文件系統的一個演化發展。它在大多數情況下提供合理的性能并且仍舊在改進。由于它在可靠的 ext2 文件系統上添加了日志功能,因此可以將現有 ext2 文件系統轉換為 ext3 文件系統,并且在必要時還可以轉換回來。
3.5.4 ext4 文件系統
ext4 是作為 ext3 的擴展來啟動的,它通過增加存儲限制和提高性能來滿足更大文件系統的需求。為了保留 ext3 的穩定性,在2006 年 6 月,該擴展被拆分成一個新的文件系統,即 ext4。ext4 文件系統在 2008 年 12 月正式發布,包含在 2.6.28 內核中。
3.5.5 vfat 文件系統
vfat 文件系統(也稱為 FAT32)沒有日志功能,且缺乏完整的 Linux 文件系統實現所需的許多特性。它可用于在 和 Linux 系統之間交換數據,因為 和 Linux 都能讀取它。不要將這個文件系統用于 Linux,除非要在 和 Linux 之間共享數據。
3.5.6 XFS 文件系統
XFS 文件系統擁有日志功能,包含一些健壯的特性,并針對可伸縮性進行了優化。XFS 通常是相當快的。在大文件操作方面,XFS 在所有測試中一直處于領先地位。XFS 的性能非常接近 ,并在大多數測試指標上都超過了 ext3。
3.5.7 IBM JFS 文件系統
IBM 的 File (JFS),目前用于 IBM 企業服務器,專為高吞吐量服務器環境而設計。它可用于 Linux,包含在幾個發行版中。要創建 JFS 文件系統,使用 mkfs.jfs 命令。
3.6 選擇文件系統
選擇合適的下一代 Linux 文件系統一直很簡單。那些只尋求原始性能的人通常傾向于使用 ,而那些更關心數據完整性特性的人則首選 ext3/4。然而,隨著 XFS 的 Linux 版的發布,事情突然變得令人困惑。尤其是,對于 是否依然是下一代文件系統性能方面的佼佼者,人們開始感到疑惑。
3.7 創建文件系統
Linux 使用 mkfs 命令來創建文件系統,使用 命令創建交換空間。mkfs 命令實際上是幾個特定文件系統的命令的前端,比如面向 ext3 的 mkfs.ext3,面向 ext4 的 mkfs.ext4 以及面向 的 mkfs.。你的文件系統上安裝的是什么文件系統支持?使用 ls /sbin/mk* 命令即可得到答案。
原://p/.html
參考文檔:
//view/620
//blog/
.tw//.php
/vamei/p/.html
//cn/linux/l-linux-/
//cn/linux/l-cn-vfs/
//cn/linux//l-fs9/
/wiki/