只 要是磁盤就得 式化,好像已是天經地義的事情了,幾乎沒有人去問爲何。不少有經驗的同窗 乎都有過這樣的經歷,就是風風火火的從朋友那裏借來了一張裝滿高清島國愛情動做片的移動硬盤,暗爽事後還想留下一些待之後慢慢品味,但是總有那麼一些質量 比較好的片子(尺寸超過 4G)複製失敗。追問緣由還每每被高手們嘲笑:「都什麼年代了你還用 FAT32,趕忙換 NTFS 吧。」我想這個時候你就不得不追問一下,爲何 FAT32 不行而 NTFS 卻能行吧? node
由於它們是不一樣的文件系統,功能不一樣,能力不一樣。FAT32 是 在 Windows95 時代開始採用的文件系統,到如今都有人在用(好比 U盤),能夠說是伴隨着咱們成長的文件系統。FAT 是 File Allocation Table 的縮寫,從字面意義上就能看出這是一種類 表 同樣的文件系統。因爲其用於描述文件大小的屬性是一個 32 位的 ,致使其可以支持的單個文件最大不能超過 4G。而 NTFS 是微軟專門爲 NT 系統設計的,單個文件最大能夠達到 2T。如今最爲經常使用的 Windows XP 和 Windows 7 都支持 NTFS。至於 NTFS 是怎麼管理文件的有點不太好說,由於微軟一直當它是個「祕密」。windows
Linux 也有本身的文件系統 式,被稱爲 ExtN(N=二、 三、4)。若是要追溯 ExtN 的起源,其實要比 FAT32 和 NTFS 都要古老。ExtN 文件系統一定要包含 inode 數據結構來表明一個文件,而且存儲這個文件的各類屬性和權限。至於實際的數據則放在 data block 塊區中。除此以外,ExtN 文件系統還有一個超級塊區(super block),用於記錄整個文件系統的總體信息,包括 inode 與 data block 的總量、使用量和剩餘量。數據結構
使用 stat -f filename 可查看系統的 inode 和 data block 使用狀況。工具
-f, --file-system
display file system status instead of file status
性能
weiyuzhang@weiyuzhang:/work/windows$ stat -f /work/workspace/so/main
文件:"/work/workspace/so/main"ui
如下輸出都跟 main 文件無關
ID:1371e0e3c96e0461 文件名長度:255 類型:ext2/ext3
塊大小:4096 基本塊大小:4096
塊:總計:23151106 空閒:14056882 可用:12880870
Inodes: 總計:5881856 空閒:5836277google
data block 與 inode 同樣,每個都有一個惟一編號,inode 只須要記錄這些編號,就可以定位整個文件的任意一段數據。咱們假定有一個編號爲 3 的 inode,它所表明的文件的數據被放置在編號爲 二、五、六、八、13 和 20 的這幾個 data block 中。那麼讀取這個文件的過程則如 圖1 所示。spa
圖 1 ExtN 文件系統讀取數據過程示意圖設計
採用這種數據存取的方法的文件系統被稱之爲「索引式文件系統」。它與伴隨着不少人成長的 FAT32 有什麼不一樣呢?圖2 展現了這個過程。索引
圖 2 FAT32 文件系統讀取數據過程示意圖
經過對兩個圖的比較,咱們能夠清晰的看出,ExtN 經過 inode 可以一次性得到文件數據所存放的位置,能夠據此來安排磁盤的閱讀順序,儘可能保證在磁盤只旋轉一圈的狀況下將全部內容讀出來。而 FAT32 則只有將對應的 data block 讀入以後才知道下一個 data block 在什麼地方。若是一個文件的 data block 比較分散的話,將很難保證在磁盤只旋轉一圈的狀況下讀取所有數據,有時候甚至要多轉不少圈才能讀完數據。
這就是咱們很是熟悉的「磁盤碎片」問題。因爲長時間的對文件進行建立、刪除、讀寫,很難保證同一個文件的 data block 的位置相鄰。而因爲 FAT32 的讀寫特性,在 data block 不相鄰的狀況下讀寫性能會急劇降低。因此,爲了提升 Windows 系統的磁盤性能,常常性的作「磁盤碎片整理」是很是有必要的。
而對於 Linux 這種文件系統,則基本上不須要進行磁盤碎片整理。並且你也基本上找不到類 的工具。可是 Linux 系統通過長時間使用以後,仍是會有文件數據過於分散的問題的。即使可以作到很好的規劃,可是對性能多多稍稍仍是會有一些影響,只是沒有使用 FAT32 的 Windows 那麼嚴重罷了。因此,一個使用時間好久的Linux 系統也會由於磁盤碎片問題而變慢,這也是事實。只是不須要太過在乎它。
一. 文件相關
1. 節點(inode)
在 Linux 的文件系統中,保存在磁盤分區中的文件,無論是什麼類型,都有一個編號,即節點號。
經過 ls -i 能夠查看。
2. atime/ctime/mtime 訪問時間/更改時間/修改時間
後 2 者的區別是,ctime 會同時跟蹤文件屬性和數據,mtime 僅關係到文件數據。
例如,修改一個 .sh 文件的內容,mtime 會發生變化,可是僅修改 .sh 文件的權限,例如 chmod a+x test.sh,ctime 會發生變化
經過 stat filename 能夠查看文件的 inode 節點信息:
3. 連接
分爲軟連接(符號連接)和硬連接。不論哪種,都會保持連接文件的同步性;可使用相對路徑連接文件。
a. 軟連接(符號鏈接)
類 於 Windows 中的快捷方式,其實是一個文本文件,包含了被連接文件的位置信息,但與被連接文件的節點號不一樣;支持跨分區連接
既然是快捷方式,其大小就不是所連接文件的大小,而是隻有幾個字節。
stat 命令查看源文件和軟連接的結果以下:
weiyuzhang@weiyuzhang:/work/workspace$ stat client.c
File: "client.c"
Size: 686 Blocks: 8(表示爲了存儲該文件,使用了幾個 data block,其結果,並非嚴 的 Size/512) IO Block: 4096 普通文件
Device: 809h/2057d Inode: 131252 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/weiyuzhang) Gid: ( 1000/weiyuzhang)
Access: 2012-09-20 10:26:40.466391743 +0800
Modify: 2012-09-18 17:33:15.405397461 +0800
Change: 2012-09-20 10:25:06.786254344 +0800
weiyuzhang@weiyuzhang:/work/workspace$ stat fake
File: "fake" -> "client.c"
Size: 8 Blocks: 0 IO Block: 4096 符號連接
Device: 809h/2057d Inode: 131318 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 1000/weiyuzhang) Gid: ( 1000/weiyuzhang)
Access: 2012-09-20 10:24:12.236174347 +0800
Modify: 2012-09-20 10:24:11.486173237 +0800
Change: 2012-09-20 10:24:11.486173237 +0800
也能夠看到,增長軟鏈接,stat 信息中的 Links 不會增長
b. 硬連接
ln 源 目
經過節點號進行連接,即多個文件名指向同一個節點號;windows 中不具有該功能;
其功能是,容許一個文件擁有多個有效路徑名稱,防止誤刪。只刪除一個連接,並不影響節點自己和其它連接,只有當最後一個連接被刪除後,文件的數據塊纔會被釋放。即,文件真正刪除的條件是,與之相關的全部硬連接文件均被刪除。
只能在同一分區內,不然提示:
「ln: 建立硬連接"test" => "/work/out": 無效的跨設備鏈接」
stat 命令查看源文件和硬連接的結果以下:
weiyuzhang@weiyuzhang:/work/workspace$ stat client.c
File: "client.c"
Size: 686 Blocks: 8 IO Block: 4096 普通文件
Device: 809h/2057d Inode: 131252 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/weiyuzhang) Gid: ( 1000/weiyuzhang)
Access: 2012-09-20 10:26:40.466391743 +0800
Modify: 2012-09-18 17:33:15.405397461 +0800
Change: 2012-09-20 10:25:06.786254344 +0800
weiyuzhang@weiyuzhang:/work/workspace$ stat fake2
File: "fake2"
Size: 686 Blocks: 8 IO Block: 4096 普通文件
Device: 809h/2057d Inode: 131252 Links: 2
Access: (0644/-rw-r--r--) Uid: ( 1000/weiyuzhang) Gid: ( 1000/weiyuzhang)
Access: 2012-09-20 10:26:40.466391743 +0800
Modify: 2012-09-18 17:33:15.405397461 +0800
Change: 2012-09-20 10:25:06.786254344 +0800
此外,ll 命令輸出的第二列也顯示對應文件的硬連接數目。
weiyuzhang@weiyuzhang:/tmp$ ll
總用量 68
drwxrwxrwt 11 root root 4096 11月 26 14:46 ./
drwxr-xr-x 25 root root 4096 11月 9 16:42 ../
drwx------ 2 weiyuzhang weiyuzhang 4096 11月 26 09:10 .com.google.Chrome.X8rA1c/
drwx------ 2 weiyuzhang weiyuzhang 4096 11月 26 09:16 CRX_75DAF8CB7768/
prw-rw-r-- 1 weiyuzhang weiyuzhang 0 11月 26 10:06 fifo|
4. 編輯文件
除了 vi,還有一個經常使用的工具是 nano。
在其底部有效的命令列表中,^ 表示 Control。
5. touch
用於更新文件的訪問時間和更改時間,雖然實際上不會編輯文件的內容。
6. 壓縮和解壓
提供 gzip 和 bzip2 兩種壓縮方法。
tar zcvf archive.tar.gz [file1 file2...]
tar jcvf archive.tar.bz2 [file1 file2...]
7. 掛載
在 /dev 目錄中,有些可用的設備是存儲設備,例如軟驅或者 CD-ROM。訪問它們提供的內容不是簡單的 cd 進入驅動器,存儲驅動器須要掛載到文件系統。換句話說,驅動器須要附加到一個固定的目錄。
mount /dev/md1 /mnt/alexdrive
將驅動器 /dev/md1 附加到系統中現有的目錄 /mnt/alexdrive。一旦驅動器被掛載,就可使用文件系統的任何指令訪問驅動器。
查看已啓用的驅動器名,可經過 df -h。
在現代的 Linux 發行版本中,CD-ROM、U盤等一些常見設備可以由系統自動掛載。
此外,不帶參數的 mount 指令,能夠輸出系統中每個被掛載的驅動器及使用的文件系統。
例如,插入 U 盤,經過 mount 指令能夠看到:
......
/dev/sdb1 on /media/username/PENDRIVE type vfat (rw,nosuid,nodev,uid=1000,gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush,uhelper=udisks2)
這是系統自動掛載的結果。/dev/sdb1 即爲 U 盤對應的驅動器名。可使用 umount /dev/sdb1 來取消掛載。可是若是再次打開文件,又會被自動掛載。
若是想讓一個驅動器在開機時自動掛載,或者簡單設置一個目錄做爲一個驅動器的默認掛載點,須要修改 /etc/fstab 文件。
8. 文件查找
a. locate & updatedb
locate filename
該命令與 updatedb 關聯,徹底依賴於索引,若是新建一個文件,使用 locate 是找不到的,除非執行過 updatedb
updatedb 須要 root 權限,通常經過 cron 按期執行。