一、文件系統特性
1.1 結構體
磁盤分區后還要進行格式化,操作系統才能使用這個文件系統。每個操作系統能識別和使用的文件系統不完全相同,如windows98以前支持FAT,Windows2000后支持NTFS。linux傳統的操作系統是ext2(Linux second Extended file system,ext2fs)。以前一個分區只能格式化為一個文件系統,而一些新的技術可以將一個分區格式化為多個文件系統(如LVM 邏輯卷)。
較新的操作系統的文件會保存文件權限、文件所有者等信息,這些信息存放在inode,實際的文件數據保存到數據區塊。 另外有一個超級區塊記錄整個文件系統的整體信息,包括inode與數據區塊的總量、使用量、剩余量等。
每個inode和區塊都有編號,每個文件都會占用一個inode,在inode內放置區塊號碼。超級區塊定義:
1.2 讀取文件流程(基于linux0.11)
一個普通用戶要讀取/etc/passwd :
- 看首字母是不是/,判斷是絕對路徑還是相對路徑;絕對路徑從root的inode開始找;
- 讀root的inode數據塊,從里面的dir_entry找有沒有與/etc名稱匹配的;
- 如果找到了,返回/etc的 inode_nr;
- 通過/etc的inode_nr,讀取etc的inode;
- 通過etc的inode讀取etc的數據塊,etc是個目錄,要查找目錄里有沒有和passwd匹配的名稱;
- 如果找到了,返回passwd的inode_nr
- 通過passwd的inode_nr讀取passwd中的數據。
1.2.1 打開文件源文件示例/fs/open.c
open源文件示例:
其它函數可逐步跟蹤查看。
1.2.2 讀取文件的入口/fs/read_write.c
1.2.3 fs/file_read.c普通文件讀取示例
1.2.4 fs/buffer.c 緩存讀取函數示例
1.2.5 kernel/blk_drv/ll_rw_blk.c到硬盤讀數據
make_request請求
add_request
這里給一個隊列插入了一個請求節點。
隊列的結構:
struct blk_dev_struct {
void (*request_fn)(void);
struct request * current_request;
};
/* blk_dev_struct is:
* do_request-address
* next-request
*/
struct blk_dev_struct blk_dev[NR_BLK_DEV] = {
{ NULL, NULL }, /* no_dev */
{ NULL, NULL }, /* dev mem */
{ NULL, NULL }, /* dev fd */
{ NULL, NULL }, /* dev hd */
{ NULL, NULL }, /* dev ttyx */
{ NULL, NULL }, /* dev tty */
{ NULL, NULL } /* dev lp */
};
后面要進入硬盤驅動環節,暫且不繼續向下分析細節了。
二、常用的本地文件系統
2.1 傳統的文件系統,不帶日志
2.1.1 ext
第一代擴展文件系統,于1992年4月發表,是為Linux核心所做的第一個文件系統。采用Unix文件系統(UFS)的元數據結構,以克服MINIX文件系統性能不佳的問題。
2.1.2 ext2
第二代擴展文件系統,LINUX內核所用的文件系統。它開始由Rémy Card設計,用以代替ext,于1993年1月加入linux核心支持之中。ext2 的經典實現為Linux內核中的ext2fs文件系統驅動,最大可支持2TB的文件系統,至Linux核心2.6版時,擴展到可支持32TB。
2.1.3 Minix
早期Linux支持的文件系統,性能低下,沒有時間標記,文件名最長14個字符。只能使用64M硬盤分區。
2.1.4 Xia
Minix 修訂的文件系統,解決文件名和支持的硬盤大小的問題。
2.1.5 Msdos
微軟dos、windows和一些OS/2系統支持的文件系統,文件名格式是8.3。
2.1.6 umsdos
Linux兼容Msdos使用的文件系統,支持長文件名、權限、所有者設置。
2.1.7 ISO 9660
標準的CD-ROM文件系統。此標準有不同的說明級別,一級,文件必須是8.3格式(文件名不得多于8個字符,后綴名不得多于3個字符),并且都得是大寫字母。目錄也不得多于8個字符。在二級和三級中,文件名可以達到32個字符。
2.1.8 FAT16 FAT32
Windows較早支持的文件系統,以前軟盤也一般使用FAT格式。 FAT16只支持2G磁盤空間,FAT32增加了管理能力。
2.2 日志文件系統
文件系統發生變化時,把相關信息寫入一個日志區域,再把變化寫入主文件系統。當文件系統發生故障時,日志文件輔助實現一致性,可以較快恢復。
2.2.1 ext3
EXT3是第三代擴展文件系統(英語:Third extended filesystem,縮寫為ext3),是一個日志文件系統,常用于Linux操作系統,完全兼容ext2文件系統。它提供了高可用性、數據完整性、提高了文件系統的速度,支持多日志模式。
2.2.2 ext4
是ext3文件系統的后繼版本。ext4是由ext3的維護者Theodore Tso領導的開發團隊實現的,并引入到Linux2.6.19內核中。其與ext3兼容(可能指令將ext3在線升級到ext4)、支持無限數量的子目錄。
2.2.3 VFAT
VFAT是“擴展文件分配表系統”的意思,它對FAT16文件系統進行擴展,并提供支持長文件名,文件名可長達255個字符,VFAT仍保留有擴展名,而且支持文件日期和時間屬性,為每個文件保留了文件創建日期/時間、文件最近被修改的日期/時間和文件最近被打開的日期/時間這三個日期/時間。linux處理的時候把fat/vfat/fat32的文件系統統一用VFAT來表示。
2.2.4 XFS
XFS 最初是由 Silicon Graphics,Inc. 于 90 年代初開發的。SGI原有文件系統(existing filesystem,EFS)有一些缺陷,SGI 因此設計一種全新的高性能 64 位文件系統,并于 1994 年隨 IRIX 5.3 的發布。它至今仍作為 SGI 基于 IRIX 的產品(從工作站到超級計算機)的底層文件系統來使用。現在,XFS 也可以用于 Linux。
2.2.5 reiserfs
Linux內核支持最久的日志文件系統之一,支持海量磁盤和磁盤陣列,開發團隊大部分是在俄羅斯國內。2006年其作者被抓,2008年判處25年監禁,此系統隨后喪失了競爭力。
2.2.6 Btrfs
Oracle于2007年寫成在開發的文件系統,用以取代ext3,其改善ext3的限制,特別是單一文件大小的限制、總文件系統大小限制以及加入文件校驗和特性。
2.2.7 JFS
IBM貢獻到Linux內核,提供了基于日志的字節級文件系統,該文件系統是為面向事務的高性能系統而開發的。JFS 能夠在幾秒或幾 分鐘內就把文件系統恢復到一致狀態。JFS能夠保證數據在任何意外宕機的情況下,不會造成磁盤數據的丟失與損壞。
2.2.8 HPFS
高性能文件系統 (High Performance File System ,HPFS),HPFS是微軟的LAN Manager中的文件系統,同時也是IBM的LAN Server和OS/2產品。在OS/2中,它就是HPFS,但是在LAN Manager和LAN Server產品中,它是HPFS386,這是HPFS的改進版本。HPFS提供了DOS文件系統中的文件分配表(FAT)所沒有的長文件名和性能增強特性。另外,HPSF還能訪問較大的硬盤驅動器,提供更多的組織特性并改善了文件系統的安全特性。HPFS386增加了對HPFS文件系統的32位訪問,另外還增加了容錯和安全性功能。
三、網絡文件系統
3.1 NFS
NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位于遠端NFS服務器上的文件,就像訪問本地文件一樣。
3.2 SMB
方便是windows和Unix系統之間共享文件的一種協議,主要用于Windows 和 Linux下的文件共享、打印共享,可以實現匿名與本地用戶文件的共享、支持多節點掛載。
四、其它文件系統
4.1 Swap文件系統
swap(交互分區)一起就是把硬盤的一部分空間拿來作為內存使用,即虛擬內存。Linux上交換分區需要使用專門的文件系統,使用mkswap創建,命令選項:
- -c 檢測壞塊
- -f 強制創建swap分區
- -L 指定卷標
- -p 指定分頁大小 不經常使用
- -u 指定UUID
通過 swapon 啟用新的swap文件系統。
4.2 proc
文件系統是一個虛擬文件系統,通過它可以使用一種新的方法在 Linux內核空間和用戶間之間進行通信。
4.3 虛擬文件系統VFS
Linux文件系統的抽象層,向上提供了統一的文件訪問接口,向下兼容了不同的文件系統,讓Linux復雜的文件系統建立關聯關系。
五、對文件系統操作的常用命令
1. fdisk
創建和維護分區表。必要參數:
- -l 列出素所有分區表
- -u 與-l搭配使用,顯示分區數目
選擇參數:
- -s<分區編號> 指定分區
- -v 版本信息
菜單操作說明
- m :顯示菜單和幫助信息
- a :活動分區標記/引導分區
- d :刪除分區
- l :顯示分區類型
- n :新建分區
- p :顯示分區信息
- q :退出不保存
- t :設置分區號
- v :進行分區檢查
- w :保存修改
- x :擴展應用,高級功能
2. mkfs格式化 用于在特定的分區上建立 linux 文件系統
命令格式: mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
參數 :
- device : 預備檢查的硬盤分區,例如:/dev/sda1
- -V : 詳細顯示模式
- -t : 給定檔案系統的型式,Linux 的預設值為 ext2
- -c : 在制作檔案系統前,檢查該partition 是否有壞道
- -l bad_blocks_file : 將有壞軌的block資料加到 bad_blocks_file 里面
- block : 給定 block 的大小
實例
在 /dev/hda5 上建一個 msdos 的文件系統,同時檢查是否有壞道存在,并且將過程詳細列出來 :
mkfs -V -t msdos -c /dev/hda5
3. mount掛載命令 掛載Linux系統外的文件
命令格式:
mount [-hV]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,...]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
參數說明:
- -V:顯示程序版本
- -h:顯示輔助信息
- -v:顯示較訊息,通常和 -f 用來除錯。
- -a:將 /etc/fstab 中定義的所有檔案系統掛上。
- -F:這個命令通常和 -a 一起使用,它會為每一個 mount 的動作產生一個行程負責執行。在系統需要掛上大量 NFS 檔案系統時可以加快掛上的動作。
- -f:通常用在除錯的用途。它會使 mount 并不執行實際掛上的動作,而是模擬整個掛上的過程。通常會和 -v 一起使用。
- -n:一般而言,mount 在掛上后會在 /etc/mtab 中寫入一筆資料。但在系統中沒有可寫入檔案系統存在的情況下可以用這個選項取消這個動作。
- -s-r:等于 -o ro
- -w:等于 -o rw
- -L:將含有特定標簽的硬盤分割掛上。
- -U:將檔案分割序號為 的檔案系統掛下。-L 和 -U 必須在/proc/partition 這種檔案存在時才有意義。
- -t:指定檔案系統的形態,通常不必指定。mount 會自動選擇正確的型態。
- -o async:打開非同步模式,所有的檔案讀寫動作都會用非同步模式執行。
- -o sync:在同步模式下執行。
- -o atime、-o noatime:當 atime 打開時,系統會在每次讀取檔案時更新檔案的『上一次調用時間』。當我們使用 flash 檔案系統時可能會選擇把這個選項關閉以減少寫入的次數。
- -o auto、-o noauto:打開/關閉自動掛上模式。
- -o defaults:使用預設的選項 rw, suid, dev, exec, auto, nouser, and async.
- -o dev、-o nodev-o exec、-o noexec允許執行檔被執行。
- -o suid、-o nosuid:允許執行檔在 root 權限下執行。
- -o user、-o nouser:使用者可以執行 mount/umount 的動作。
- -o remount:將一個已經掛下的檔案系統重新用不同的方式掛上。例如原先是唯讀的系統,現在用可讀寫的模式重新掛上。
- -o ro:用唯讀模式掛上。
- -o rw:用可讀寫模式掛上。
- -o loop=:使用 loop 模式用來將一個檔案當成硬盤分割掛上系統。
實例將 /dev/hda1 掛在 /mnt 之下。
mount /dev/hda1 /mnt
4. unmount 卸載
# umount -v /dev/sda1 通過設備名卸載
/dev/sda1 umounted
# umount -v /mnt/mymount/ 通過掛載點卸載
/tmp/diskboot.img umounted