linux 檔案系統

tthero00boo發表於2013-10-29
 
檔案系統是作業系統用於明確磁碟或分割槽上的檔案的方法和資料結構;即在磁碟上組織檔案的方法

對磁碟格式化,就是建立檔案系統
 
linux檔案系統使用inode來記錄檔案資訊,
linux在建立檔案系統時,確定block,inode的 size和總數 ,併為每個block,inode編號

磁碟分割槽後,需要格式化才能掛載使用,傳統的來說,一個磁碟分割槽就對應一個檔案系統,但lvm技術在磁碟分割槽和檔案系統之間新增了一個邏輯層,磁碟分割槽pv->邏輯卷lv,在lv上建立檔案系統,pv和fs沒有什麼特定的對應關係了
一個可被掛載的資料,就是一個檔案系統


檔案資料除了檔案實際內容外, 通常還含有非常多的檔案屬性
 
linux 檔案系統通常會將這兩部份的資料分別存放在不同的區塊,許可權與屬性放置到 inode 中,至於實際資料則放置到 data block 區塊中

還有一個超級區塊 (superblock) 會記錄整個檔案系統的整體資訊,包括 inode 與 block 的總量、使用量、剩餘量等
  • superblock:記錄此 filesystem 的整體資訊,包括inode/block的總量、使用量、剩餘量, 以及檔案系統的格式與相關資訊等;
  • inode:記錄檔案的屬性,一個檔案佔用一個inode,同時記錄此檔案的資料所在的 block 號碼(多個);
  • block:實際記錄檔案的內容,若檔案太大時,會佔用多個 block 。
linux的EXT?即是 索引式檔案系統(indexed allocation)

Ext2 檔案系統在格式化的時候基本上是區分為多個區塊群組 (block group) 的,每個區塊群組都有獨立的 inode/block/superblock 系統
 
        
Boot Sector
sector = 512 byte
boot sector 主引導扇區 包括:硬碟主開機記錄(MBR)+ 硬碟分割槽表(DPT)+ 結束標誌
MBR 446位元組,DPT 64位元組,結束標誌2位元組
Dpt(由4項組成,每項16個位元組(Byte),描述一個分割槽的基本資訊)


Superblock (超級區塊)
  • block 與 inode 的總量;
  • 未使用與已使用的 inode / block 數量;
  • block 與 inode 的大小 (block 為 1, 2, 4K,inode 為 128 bytes);
  • filesystem 的掛載時間、最近一次寫入資料的時間、最近一次檢驗磁碟 (fsck) 的時間等檔案系統的相關資訊;
  • 一個 valid bit 數值,若此檔案系統已被掛載,則 valid bit 為 0 ,若未被掛載,則 valid bit 為 1 。
一個檔案系統應該僅有一個 superblock 而已,但每個 block group 都可能含有 superblock ,主要目的是做為第一個 block group 內 superblock 的備份

Filesystem Description (檔案系統描述說明)

描述每個 block group 的開始與結束的 block 號碼,以及說明每個區段 (superblock, bitmap, inodemap, data block) 分別介於哪一個 block 號碼之間。這部份也能夠用 dumpe2fs 來觀察的

# dumpe2fs -h /dev/sda2 #顯示superblock資訊
# dumpe2fs -f /dev/sda2 #顯示superblock + 各個group描述資訊

block bitmap (區塊對照表)
inode bitmap (inode 對照表)

這兩個點陣圖就不說了

inode table 
這個部分儲存的是inode條目,
inode應包含以下兩種資訊
1. 記錄檔案的屬性資訊(metadata)
2. 檔案資料所在的block號 (point分為:直接指向,3級的間接指向(藉助data block))


屬性:inumber,檔案型別,許可權,連結數,uid,gid,size(bytes,blocks),3個時間戳,point(file's data block號...),

檢視inode資訊: stat ; ls -i ; df -i

檢視inumber
# ls -li      
131081 drwxr-xr-x 2 oracle oinstall  4096 Oct 27 22:02 arch
    15 -rw-r--r-- 1 root   root     63171 Oct 29 11:17 ~dumpf.txt 

檢視檔案的inode資訊
# stat 112/bin/oracle

  File: `112/bin/oracle'
  Size: 173515521       Blocks: 338920     IO Block: 4096   regular file
Device: 802h/2050d      Inode: 546887      Links: 1
Access: (6751/-rwsr-s--x)  Uid: (  501/  oracle)   Gid: (  501/oinstall)
Access: 2013-10-27 21:59:38.932013829 +0800
Modify: 2013-05-14 15:40:58.219034949 +0800
Change: 2013-05-14 15:40:59.033034948 +0800
 
檢視檔案系統的inode資訊 
# stat -f /u01/oracle  
# df -i ; df (檔案對應掛載的fs)
# dumpe2fs -h /dev/sda2

 
data block (資料區塊)
data block 是用來放置檔案內容資料地方
  • 原則上,block 的大小與數量在格式化完就不能夠再改變了(除非重新格式化);
  • 每個 block 內最多隻能夠放置一個檔案的資料;
  • 承上,如果檔案大於 block 的大小,則一個檔案會佔用多個 block 數量;
  • 承上,若檔案小於 block ,則該 block 的剩餘容量就不能夠再被使用了(磁碟空間會浪費)。

 

目錄也是一種檔案
linux檔案型別
d 目錄檔案
l 符號連結(指向另一個檔案,類似於window下的快捷方式)
s 套接字檔案
b 塊裝置檔案,二進位制檔案(有緩衝,且可以隨機存取)
c 字元裝置檔案(無緩衝,且只能順序存取)
p 命名管道檔案
- 普通檔案,或者更準確地說,不屬於以上幾種型別的檔案

 
ls -l 經常會發現目錄的大小是4096
這是由於fs的block size是4k

[root@localhost oracle]# dumpe2fs -h /dev/sda2|grep Block
dumpe2fs 1.41.12 (17-May-2010)
Block count:              3407616
Block size:               4096
Blocks per group:         32768
 
那麼,目錄的大小與什麼有關?
目錄與普通檔案類似,只不過data block裡存放的是目錄項(dirent對應的實際儲存結構)
這個儲存結構至少應包括 該目錄下(檔案/目錄)的檔名 和相應的inumber

所以一個directory型別檔案的大小,只與它下面直接包含(無遞迴)的檔案數有關
[root@localhost dir1]# mkdir {A-Z}{1..100}
[root@localhost dir1]# ll |wc -l
2703
[root@localhost dir1]# ll ..
total 60
drwxr-xr-x   2 oracle dba   4096 Aug 19 20:24 bs
drwxr-xr-x 103 root   root 57344 Oct 29 13:02 dir1   # dir1目錄變大了
[root@localhost dir1]# ll ../..
total 96
drwxr-xr-x 4 oracle dba       4096 Oct 29 13:48 oracle   #並不影響它的父目錄的大小
 
假設一種不管cache的思路,
那麼查詢檔案 /etc/sysctl.conf
核心解析該引數時,以"/"分割,發現是絕對路徑,就以根目錄作為工作目錄,一般是2號,從根目錄的datablock裡查詢etc,找到了取出inode號,然後讀etc的datablock,查詢sysctl.conf,返回它的inode號.

目錄的許可權:
r 瀏覽該目錄清單的許可權
w 具有刪除,移動,新增目錄內檔案
x 具有進入目錄,作為工作目錄的許可權

要開放目錄給任何人瀏覽時,至少要給r-x的許可權
只給r還是不夠,Permission denied

檔名 
對於一個檔案來說有唯一的inode號與之對應,對於一個inode號,卻可以有多個檔名與之對應。因此,在磁碟上的同一個檔案可以通過不同的路徑去訪問它

即對於fs來說,使用inode number來唯一標識檔案
而對於使用者來說,使用檔名(路徑名)來標識檔案

這個對應關係只存在於 目錄檔案的block中,裡面的資料結構也叫dentry好了,總之這裡把他理解為儲存結構,dentry結構,理解上可參考dirent結構體,至少包括檔名和該檔名所對應的inode號
 
除了目錄的block(dentry條目)之外,沒有地方存檔名了,檔案block不會有,inode更不會有

所以增,刪,改檔名與檔案所在目錄的w許可權有關

連結
可以用ln命令對一個已經存在的檔案再建立一個新的連結,連結有軟連結和硬連結之分

建立硬連結,其實只是修改某個目錄的block增加一個dentry項,inode號=被連結的inode(硬連結和檔案指向同一個inode號)
並把inode的link count+1

目錄不能有硬連線;硬連線不能跨越檔案系統

軟連線會建立一個"l"符號連結型別的檔案,有自己的inode,block裡的內容是被連結的檔案的檔名
當訪問一個軟連線檔案時,系統會發現他的檔案型別是"l",先讀取block裡的資料當做路徑,再去找到真正要訪問的檔案

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28859270/viewspace-775264/,如需轉載,請註明出處,否則將追究法律責任。

相關文章