從磁碟到資料,從資料到檔案,從檔案到目錄,從目錄到檔案系統,從檔案系統到作業系統。構成了計算機中的IO讀寫機制。

整個磁碟可以分為1個MBR(Master Boot Record)和4個partitions。一個分割槽,其實就是一個檔案系統,檔案系統就是管理組織硬碟上資料的一堆資料結構程式,一個檔案系統由許多block塊組成。塊是檔案系統讀寫存放資料的最小單位,一般是4KB。每個Block裡只能存放一個檔案的資料。如果檔案大於Block大小,則該檔案會佔用多個Block。對於檔案來說,分為目錄項、inode、資料塊。對於作業系統和應用程式來說,都是通過檔案系統來訪問硬碟上的檔案。
1、硬碟讀寫原理
大多數永久性或半永久性電腦資料都是將磁碟上的一小片金屬物質磁化來實現。然後再將這些磁性圖可被轉換成原始資料。這便是磁儲存的原理。
我們知道資訊儲存在硬盤裡,把它拆開也看不見裡面有任何東西,只有些碟片。假設,你用顯微鏡把碟片放大,會看見碟片表面凹凸不平,凸起的地方被磁化,凹的地方是沒有被磁化;凸起的地方代表數字1(磁化為1),凹的地方代表數字0。因此硬碟可以以二進位制來儲存表示文字、圖片等資訊。
硬碟,我們可以把它比喻成是我們電腦儲存資料和資訊的大倉庫。一般說來,無論哪種硬碟,都是由碟片、磁頭、碟片主軸、控制電機、磁頭控制器、資料轉換器、介面、快取等幾個部份組成。
磁頭是硬碟中最昂貴的部件,也是硬碟技術中最重要和最關鍵的一環。
當磁碟旋轉時,磁頭若保持在一個位置上,則每個磁頭都會在磁碟表面劃出一個圓形軌跡,這些圓形軌跡就叫做磁軌。這些磁軌用肉眼是根本看不到的,因為它們僅是盤面上以特殊方式磁化了的一些磁化區,磁碟上的資訊便是沿著這樣的軌道存放的。磁碟上的每個磁軌被等分為若干個弧段,這些弧段便是磁碟的山區,每個扇區可以存放512個位元組的資訊,磁碟驅動器在向磁碟讀取和寫入資料時,要以扇區為單位。1.44MB3.5英寸的軟盤,每個磁軌分為18個扇區。
磁碟通常由重疊的一組碟片構成,每個盤面都被劃分為數目相等的磁軌,並從外緣的“0”開始編號,具有相同編號的磁軌形成一個圓柱,稱之為磁碟的柱面。磁碟的柱面數與一個盤單面上的磁軌數是相等的。無論是雙盤面還是單盤面,由於每個盤面都只有自己獨一無二的磁頭,因此,盤面數等於總的磁頭數。所謂硬碟的CHS,即Cylinder(柱面)、Head(磁頭)、Sector(扇區),只要知道了硬碟的CHS的數目,即可確定硬碟的容量,硬碟的容量=柱面數*磁頭數*扇區數*512B。
2、RAID
傳統磁碟的劣勢。我們知道一臺PC機種都會包含CPU、記憶體、主機板、硬碟、網絡卡等硬體,影響計算機效能的元件包括:CPU、主機板匯流排IO、記憶體IO、硬碟IO、網絡卡IO等。但是隨著計算機的發展,特別對於現代的處理器來說,其運算速度已經是非常快的了,同時我們的記憶體IO速度也已經達到了非常快的地步了(差不多應該有5G每秒),而我們也知道資料都是儲存硬碟上的,所以計算機其實是先將硬碟的資料傳遞給記憶體,然後CPU再從記憶體中載入資料來進行運算的,由此看來影響整個計算機效能的因素就是我們的硬碟IO速度了。
我們目前的PC機上基本上都是使用SATA介面的硬碟,讀的速度大概不超過150M/s,寫的速度就更慢了,而生產環境下的服務基本上都是使用SAS(序列SCSI)硬碟,速度最快的是SSD固態硬碟,其速度幾乎是SATA的4-5倍。但是即使是使用SSD固態硬碟,其速度在500M/s左右,也遠遠達不到我們記憶體以及CPU的處理速度。所以,硬碟是絕大多數計算機的效能的瓶頸。
所以,現代磁碟的缺陷就是:I/O效能極差,穩定性極差。
I/O效能我們剛已經看到了,就算是使用SSD固態硬碟,其還是會大大影響計算機的效能,穩定性差表現在,如果一個硬碟發生了故障或者損壞,那麼這塊硬碟就已經不能再使用了,這如果是在對資料儲存要求特別高的地方來說,其是不可想象的。正因為如此,就誕生了一種新的技術--RAID。
RAID(Redundant Array of Independent Disks)是廉價磁碟冗餘陣列技術的英文縮寫,它的原理就是通過多個磁碟並行執行來提高整個計算機的I/O儲存效能。RAID的評判標準有如下三個:速度:讀寫速度的提升、磁碟使用率:多磁碟的空間使用率、冗餘性: 能夠支援幾塊磁碟損壞而不丟失資料。
所以,基於以上三個評判標準,RAID分為很多種類,稱之為RAID級別,現代RAID一共有7個級別,分別是RAID0~RAID6,但是常用的RAID級別主要是以下四種:RAID0:提高讀寫效能。RAID1:提高讀寫效能、冗餘性。RAID5:提高讀寫效能、冗餘性(允許1塊硬碟發生故障)。RAID6:提高讀寫效能、冗餘性(執行2塊硬碟發生故障)。
RAID的工作原理就是通過多塊硬碟並行執行來提高整個計算機的I/O儲存效能。RAID0至少需要2塊硬碟,最簡單的模式就是把N個物理磁碟合成一個虛擬磁碟。當使用RAID0時,我們在讀寫資料的時候是將資料分開讀寫到多塊硬碟上,其讀寫速度是最快的,但是因為多塊硬碟上儲存了資料的一部分,一損俱損,安全性最低。

RAID1也是至少需要2塊硬碟,RAID1在寫資料時會將資料複製到多塊硬碟上,即每塊硬碟都會儲存該資料的一個備份,在讀資料時,以提高冗餘性。讀的時候同時從多塊硬碟上讀取資料,以提高讀的效能。空間利用率是最小的,優點是冗餘能力:只要有一塊硬碟正常,資料就正常。

RAID5是最價效比的模式,至少需要3塊硬碟,RAID5與RAID0類似,讀寫資料的時候會將資料分佈的讀寫到所有硬碟上。但是在寫資料的時候RAID5會對資料進行奇偶校驗運算,並將校驗資訊也儲存在了硬碟上,所以即使我們其中一塊硬碟發生了損壞,RAID5也能通過其他硬碟以及校驗資訊對資料進行恢復使用。但是如果2塊或者2塊以上的硬碟發生了損壞,整個資料也就損壞了。空間利用率:1 - 1/n。效能:讀效能接近RAID0,寫效能相比RAID0要弱一些。冗餘能力:可以接受1塊硬碟的損壞。

RAID6至少需要4塊硬碟,RAID6與RAID5相類似,讀寫資料的時候會將資料分佈的讀寫到所有硬碟上。在寫資料的時候RAID5會對資料進行奇偶校驗運算,並將校驗資訊也儲存在了硬碟上,但是RAID6會比RAID5多儲存一份校驗資訊,所以RAID6的冗餘性比RAID5就有所提升,可以允許2塊硬碟發生損壞。空間利用率:1 - 2/n。效能:讀效能接近RAID5,寫效能相比RAID5還要弱一些。冗餘能力:可以接受2塊硬碟的損壞。

以上四種RAID級別是我們最常用的四種級別,對個人PC機來說,可能我們最需要提高的是硬碟儲存效能,所以基本使用的是RAID0,其讀寫效能得到了最大提高,但冗餘性為0。而在生產環境下的伺服器,使用的最多是RAID5或者RAID6,提供了讀寫效能,也提供了冗餘性。RAID1通常會對於那些對資料準確性要求及其嚴格的場合才會使用,如大資料叢集的部署。

3、檔案
Linux中有個哲學,一切皆檔案。那麼,在Linux檔案系統下,有哪些檔案型別呢?檔案又是怎樣儲存在檔案系統中的呢?
在Linux下,常用的七種檔案型別如下:
1)、普通檔案regular file,用 - (破折號)標示, 比如 -rwxr--r-- ,rxw前面的 - 表明這個是普通檔案。

2)、目錄檔案directory,用 d 標示 ,比如drwx------ 目錄也是一個檔案,其中存放著檔名和檔案索引結點之間的關聯關係。

3)、塊裝置檔案block deivce ,用 b 標示,實際表示硬體裝置 ,可以在/dev 目錄訪問,包含磁碟驅動光碟驅動等。

4)、字元裝置檔案character device,用 c 標示,也表示硬體裝置,但資料是以位元組流傳送的,裝置包括終端裝置和串列埠裝置。

5)、連結 link 裝置用 l 標示,就是ln 建立的連結,分為軟和硬連結。

6)、命名管道檔案 pipe 用 p 標示,管道也是一個檔案,作為資料管道方便程式之間的通訊,也稱為FIFO。

7)、套接字檔案socket 用 s 標示,與管道不同,套接字能使通過網路連線的不同計算機的程序之間進行通訊。

當執行一個檔案時候,程序通過檔名直接訪問檔案本身。這樣,每次讀取檔案的時候,過程如下:

檔名----(通過目錄項)---->inode編號----(通過inode)----->得到檔案的地址(資料塊號陣列)---->讀取檔案。


在Linux的檔案系統(如ext2、ext3、ext4)中,一個檔案由目錄項、inode和資料塊組成。
1)、目錄項:包括檔名和inode節點號。
2)、Inode:又稱檔案索引節點,是包含了檔案基本資訊的和資料塊的指標。
Linux正統的檔案系統下,將硬碟分割槽時會劃分出目錄塊、inode Table區塊和data block資料區域。Inode包含檔案的屬性(如讀寫屬性、owner等,以及指向資料塊的指標),資料區域塊則是檔案內容。當檢視某個檔案時,會先從inode table中查出檔案屬性及資料存放點,再從資料塊中讀取資料。理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做"扇區"(Sector),每個扇區儲存512位元組(相當於0.5KB)。
作業系統讀取硬碟的時候,不會一個扇區一個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取個"塊"(block)。這種由多個扇區組成的"塊",是檔案存取的最小單位。"塊"的大小,最常見的是4KB,即連續八個 sector組成一個block。

檔案資料都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存檔案的元資訊,比如檔案的建立者、檔案的建立日期、檔案的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為"索引節點"。
 
3)、資料塊:檔案的具體內容存放地。

4、檔案目錄
目錄,實際上是檔案下系統的訪問各個檔案組合的對映。在LInux下,裝置和硬碟都是掛載到某個目錄,最原始的是掛載到根目錄。然後使用者通過進入目錄去訪問硬碟上的資料,也就是檔案。所以說,目錄是一個訪問硬碟檔案資料的實際入口。在Linux下的目錄結構如下:
/bin:系統有很多放置執行檔的目錄,但/bin比較特殊。因為/bin放置的是在單人維護模式下還能夠被操作的指令。在/bin底下的指令可以被root與一般帳號所使用,主要有:cat,chmod(修改許可權),chown、date、mv、mkdir、cp、bash等等常用的指令。
/boot:主要放置開機會使用到的檔案,包括Linux核心檔案以及開機選單與開機所需設定檔等等。Linux kernel常用的檔名為:vmlinuz ,如果使用的是grub這個開機管理程式,則還會存在/boot/grub/這個目錄。
/dev:在Linux系統上,任何裝置與周邊裝置都是以檔案的型態存在於這個目錄當中。 只要通過存取這個目錄下的某個檔案,就等於存取某個裝置。比要重要的檔案有/dev/null、 /dev/zero、/dev/tty、/dev/lp*、 / dev/hd*、/dev/sd*等等
/etc:系統主要的設定檔幾乎都放置在這個目錄內,例如人員的帳號密碼檔、各種服務的啟始檔等等。 一般來說,這個目錄下的各檔案屬性是可以讓一般使用者查閱的,但是隻有root有權力修改。 另外,其下重要的目錄有:/etc/init.d/ 。所有服務的預設啟動script都是放在這裡的,例如要啟動或者關閉iptables的話: /etc/init.d/iptables start、/etc/init.d/ iptables stop。

/homt:這是系統預設的使用者家目錄(home directory)。在你新增一個一般使用者帳號時,預設的使用者家目錄都會規範到這裡來。比較重要的是,家目錄有兩種代號:~ :代表當前使用者的家目錄,而 ~guest:則代表使用者名稱為guest的家目錄。

/lib:系統的函式庫非常的多,而/lib放置的則是在開機時會用到的函式庫,以及在/bin或/sbin底下的指令會呼叫的函式庫而已 。 什麼是函式庫呢?妳可以將他想成是外掛,某些指令必須要有這些外掛才能夠順利完成程式的執行之意。 尤其重要的是/lib/modules/這個目錄,因為該目錄會放置核心相關的模組(驅動程式)。
/media:media是媒體的英文,顧名思義,這個/media底下放置的就是可移除的裝置。 包括軟碟、光碟、DVD等等裝置都暫時掛載於此。 常見的檔名有:/media/floppy、/media/cdrom等等。
/mnt:如果想要暫時掛載某些額外的裝置,一般建議可以放置到這個目錄中。
/opt:這個是給第三方協力軟體放置的目錄 。 
/root:系統管理員(root)的家目錄。 
/sbin:Linux有非常多指令是用來設定系統環境的,這些指令只有root才能夠利用來設定系統,其他使用者最多隻能用來查詢而已。放在/sbin底下的為開機過程中所需要的,裡面包括了開機、修復、還原系統所需要的指令。
/srv:srv可以視為service的縮寫,是一些網路服務啟動之後,這些服務所需要取用的資料目錄。 常見的服務例如WWW, FTP等等。 舉例來說,WWW伺服器需要的網頁資料就可以放置在/srv/www/裡面。呵呵,看來平時我們編寫的程式碼應該放到這裡了。
/tmp:這是讓一般使用者或者是正在執行的程式暫時放置檔案的地方。這個目錄是任何人都能夠存取的,所以定期清理。

5、檔案系統
檔案系統,是作業系統中用於明確磁碟或者分割槽上的檔案的方法和資料結構,即磁碟上組織檔案的方法。檔案系統的存在,使得資料可以被有效而透明地進行儲存訪問。在傳統意義上,一個分割槽只能格式化為一個檔案系統,所以通常認為一個檔案系統就是一個分割槽。在計算機中,DOS、Windows、OS/2、Macintosh和UNIX-based作業系統都有檔案系統,在此係統中檔案被放置在分等級的(樹狀)結構中的某一處。檔案被放置進目錄或子目錄,在樹狀結構中你希望的位置中。
磁碟或分割槽和它所包括的檔案系統的不同是很重要的。少數程式(包括最有理由的產生檔案系統的程式)直接對磁碟或分割槽的原始扇區進行操作;這可能破壞一個存在的檔案系統。大部分程式基於檔案系統進行操作,在不同種檔案系統上不能工作。
在Linux系統下,可以通過df -Th 檢視Linux下硬碟分割槽以及檔案系統資訊,而du -sh是檢視檔案大小資訊:
在安裝 Linux 系統時,根據伺服器的用途,需要對硬碟進行合理分割槽規劃。在系統執行的過程中,隨著業務的發展變化,不斷增長的資料儲存的要求,也需要對磁碟儲存進行調整和管理。目前在伺服器上使用得最多,技術最成熟可靠的仍然是傳統的機械硬碟。隨著技術的發展,在相當多的領域也使用了基於快閃記憶體技術的 SSD 硬碟。硬碟當然是用來儲存資料,即存放系統和使用者的檔案,而分割槽的檔案系統就規定了資料儲存單元在硬碟上排列的規則。
不同的檔案系統,儲存資料的方式不一樣,這些不同的檔案系統可以共存於同一個系統的硬碟之上,但不能共存於同一個磁碟分割槽之上。Linux 最重要的特性之一就是支援多種檔案系統。
而 Linux 通過 VFS(Virtual File System)支援多個不同的檔案系統,能夠與不同的操作環境實現資源共享。關於檔案系統,在Linux下有一個重要的哲學,就是一切皆檔案。其實現的原理,就是通過VFS。虛擬檔案系統(VFS)作為核心的子系統,為使用者空間程式提供了檔案系統介面,系統中的所有檔案系統依靠VFS系統協調工作。通過虛擬檔案系統,可以利用標準的UNIX系統呼叫對不同介質的不同檔案進行讀寫操作,而不需要考慮具體的檔案系統和實際物理介質。

所有,總的來說。從磁碟到資料,從資料到檔案,從檔案到目錄,從目錄到檔案系統,從不同的檔案系統到作業系統,這其中蘊含了複雜的實現原理,但是底層設計思路構成了計算機中的IO讀寫機制的基礎。