最近因為一些需求,需要複習一下linux的檔案系統,簡單對磁碟&&檔案系統做乙個歸納,溫故而知新。
硬碟是怎麼變成檔案系統的
硬碟這東西不知道大家拆過沒,裡面是一片片帶有磁性的碟片,每個碟片有兩個面,都可記錄資料。
而linux 在使用磁碟的時候,會首先對磁碟進行初始化,即類似mkfs.ext3 /dev/hda1這種, 初始化會將磁碟分成3大塊,
vfs我們所知的linux檔案系統非常多,ext3,ext4,nfs,glusterfs等等等等,但我們在實際使用中似乎不太會關注怎麼用這些不同的檔案系統,對於我們寫**來說,我們只關注他掛在哪個本地路徑,然後基於檔案路徑做對應的讀寫操作即可,因為這一塊,linux的vfs(虛擬檔案系統)幫我們做了統一的封裝,我們只需要呼叫統一的核心介面
進行檔案讀寫而不需要關心他到底是ext3還是xfs。
檔案是如何寫入linux的
玩linux的都知道,linux的設計哲學在於一切皆檔案,即所有系統資源都是檔案,當然也包括硬體資源,所以linux在操作對應的硬體資源時,只要修改對應的資源檔案即可。
那既然一切皆檔案了,那不得不說的就是linux的檔案系統是如何實現的了。
先假設乙個場景,有個服務程序,他執行後需要對目錄/var/log/a.log
可以看到,僅僅是寫入乙個日誌,linux就幹了這麼多事,可放在實際工作中,其實也有一點不對,比如我們執行一條sql,返回了1條資料,為什麼返回不是乙個個位元組返回的,然後直接乙個table返回的? 這是因為linux的io機制。
io機制
linux下磁碟io過程不是簡單的乙個讀寫,傳統的io方式,以read(),write()為例,當我們要read() 乙個檔案的時候,首先要將資料從磁碟中拷貝到核心空間的頁快取中,然後再將頁快取的資料拷貝到使用者空間來,同理,write()乙個檔案的時候,也會將資料先寫入核心空間的頁快取,然後再寫入磁碟。
除此之外,還有其他一些io方式,比如阻塞/非阻塞,同步/非同步,直接讀寫等, 而日常工作中遇到的io檔案,大多是這些不同的機制導致的。
排查思路
一般的io慢可以根據以下思路(工具)進行排查:
root@dev: vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 1 0 6809322 1368 887443 0 0 32640 0 52 478 1 0 50 49 0
0 1 0 6776631 1368 889433 0 0 32640 0 33 490 0 0
-d -x 表示顯示所有磁碟 i/o 的指標
檔案系統知識點
1 堆檔案 類似資料庫的堆表,記憶體管理中的堆,記錄是無序儲存的,要訪問乙個記錄需要知道其位址 位移 mds的masterbin就是這種檔案,自己維護metadata pointer table 2雜湊檔案 記錄按照key雜湊到塊,hash key n,n是總塊數。然後存入相應塊裡,如果塊滿了,就插...
作業系統知識點總結(十七)檔案系統知識點總結
引導控制塊 boot control block 包括系統從該分割槽引導作業系統所需要的資訊。如果 磁碟沒有作業系統,那麼這塊的內容為空。它通常為分割槽的第一塊。ufs稱之為引導塊 boot block ntfs 稱之為分割槽引導扇區 partition boot sector 分割槽控制塊 par...
linux檔案系統知識點整理
1 掛載 在乙個區被格式化為乙個檔案系統之後,它就可以被linux作業系統使用了,只是這個時候linux作業系統還找不到它,所以我們還需要把這個檔案系統 註冊 進linux作業系統的檔案體系裡,這個操作就叫 掛載 mount 掛載是利用乙個目錄當成進入點 類似選乙個現成的目錄作為 將檔案系統放置在該...