文件系統是文件存放在磁盤等存儲設備上的組織方法。Linux系統能支持多種目前流行的文件系統,如EXT二、 EXT三、 FAT、 FAT3二、 VFAT和ISO9660。node
文件系統指文件存在的物理空間,linux系統中每一個分區都是一個文件系統,都有本身的目錄層次結構。linux會將這些分屬不一樣分區的、單獨的文件系統按必定的方式造成一個系統的總的目錄層次結構。一個操做系統的運行離不開對文件的操做,所以必然要擁有並維護本身的文件系統。linux
磁盤分區完畢後還須要進行格式化(format),以後操做系統纔可以使用這個分區。 格式化的目的是能使操做系統可使用的文件系統格式(即咱們上面提到文件系統類型).ubuntu
每種操做系統可以使用的文件系統並不相同. 如windows 98 之前的微軟操做系統主要利用的文件系統是 FAT (或 FAT16),windows 2000 之後的版本有所謂的 NTFS 文件系統,至於 Linux 的正統文件系統則爲 Ext2 (Linux second extended file system, ext2fs)這一個。此外,在默認的狀況下,windows 操做系統是不會認識 Linux 的 Ext2 的。windows
傳統的磁盤與文件系統之應用中,一個分區就是隻可以被格式化成爲一個文件系統,因此咱們能夠說一個 filesystem 就是一個 partition。可是因爲新技術的利用,例如咱們常聽到的LVM與軟件磁盤陣列(software raid), 這些技術能夠將一個分區格式化爲多個文件系統(例如LVM),也可以將多個分區合成一個文件系統(LVM, RAID)! 因此說,目前咱們在格式化時已經再也不說成針對 partition 來格式化了, 一般咱們能夠稱呼一個可被掛載的數據爲一個文件系統而不是一個分區喔!緩存
那麼文件系統是如何運行的呢?這與操做系統的文件數據有關。較新的操做系統的文件數據除了文件實際內容外, 一般含有很是多的屬性,例如 Linux 操做系統的文件權限(rwx)與文件屬性(擁有者、羣組、時間參數等)。 文件系統一般會將這兩部份的數據分別存放在不一樣的區塊,權限與屬性放置到 inode 中,至於實際數據則放置到 data block 區塊中。 另外,還有一個超級區塊 (superblock) 會記錄整個文件系統的總體信息,包括 inode 與 block 的總量、使用量、剩餘量等。服務器
對於一個磁盤分區來講,在被指定爲相應的文件系統後,整個分區被分爲 1024,2048 和 4096 字節大小的塊。根據塊使用的不一樣,可分爲:網絡
經常會聽到所謂的「碎片整理」吧?less
須要碎片整理的緣由就是文件寫入的 block 太過於離散了,此時文件讀取的效能將會變的不好所致。 這個時候能夠透過碎片整理將同一個文件所屬的 blocks 彙整在一塊兒,這樣數據的讀取會比較容易啊! 想固然爾,FAT 的文件系統須要常常的碎片整理一下,那麼 Ext2 是否須要磁盤重整呢?dom
因爲 Ext2 是索引式文件系統,基本上不太須要經常進行碎片整理的。可是若是文件系統使用過久, 經常刪除/編輯/新增文件時,那麼仍是可能會形成文件數據太過於離散的問題,此時或許會須要進行重整一下的。 不過,老實說,鳥哥卻是沒有在 Linux 操做系統上面進行過 Ext2/Ext3 文件系統的碎片整理說!彷佛不太須要啦!^_^
能夠用ln命令對一個已經存在的文件再創建一個新的鏈接,而不復制文件的內容。鏈接有軟鏈接和硬鏈接之分,軟鏈接又叫符號鏈接。它們各自的特色是:
硬連接和軟連接的區別:
1:硬連接原文件和新文件的inode編號一致。而軟連接不同。
2:對原文件刪除,會致使軟連接不可用,而硬連接不受影響。
3:對原文件的修改,軟、硬連接文件內容也同樣的修改,由於都是指向同一個文件內容的。
文件與IO: 每一個進程在PCB(Process Control Block)中都保存着一份文件描述符表,文件描述符就是這個表的索引,每一個表項都有一個指向已打開文件的指針,如今咱們明確一下:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體。
在file結構體中維護File Status Flag(file結構體的成員f_flags)和當前讀寫位置(file結構體的成員f_pos)。在上圖中,進程1和進程2都打開同一文件,可是對應不一樣的file結構體,所以能夠有不一樣的File Status Flag和讀寫位置。file結構體中比較重要的成員還有f_count,表示引用計數(Reference Count),後面咱們會講到,dup、fork等系統調用會致使多個文件描述符指向同一個file結構體,例若有fd1和fd2都引用同一個file結構體,那麼它的引用計數就是2,當close(fd1)時並不會釋放file結構體,而只是把引用計數減到1,若是再close(fd2),引用計數就會減到0同時釋放file結構體,這才真的關閉了文件。
每一個file結構體都指向一個file_operations結構體,這個結構體的成員都是函數指針,指向實現各類文件操做的內核函數。好比在用戶程序中read一個文件描述符,read經過系統調用進入內核,而後找到這個文件描述符所指向的file結構體,找到file結構體所指向的file_operations結構體,調用它的read成員所指向的內核函數以完成用戶請求。在用戶程序中調用lseek、read、write、ioctl、open等函數,最終都由內核調用file_operations的各成員所指向的內核函數完成用戶請求。
file_operations結構體中的release成員用於完成用戶程序的close請求,之因此叫release而不叫close是由於它不必定真的關閉文件,而是減小引用計數,只有引用計數減到0才關閉文件。對於同一個文件系統上打開的常規文件來講,read、write等文件操做的步驟和方法應該是同樣的,調用的函數應該是相同的,因此圖中的三個打開文件的file結構體指向同一個file_operations結構體。若是打開一個字符設備文件,那麼它的read、write操做確定和常規文件不同,不是讀寫磁盤的數據塊而是讀寫硬件設備,因此file結構體應該指向不一樣的file_operations結構體,其中的各類文件操做函數由該設備的驅動程序實現。
每一個file結構體都有一個指向dentry結構體的指針,「dentry」是directory entry(目錄項)的縮寫。咱們傳給open、stat等函數的參數的是一個路徑,例如/home/akaedu/a,須要根據路徑找到文件的inode。爲了減小讀盤次數,內核緩存了目錄的樹狀結構,稱爲dentry cache,其中每一個節點是一個dentry結構體,只要沿着路徑各部分的dentry搜索便可,從根目錄/找到home目錄,而後找到akaedu目錄,而後找到文件a。dentry cache只保存最近訪問過的目錄項,若是要找的目錄項在cache中沒有,就要從磁盤讀到內存中。
每一個dentry結構體都有一個指針指向inode結構體。inode結構體保存着從磁盤inode讀上來的信息。在上圖的例子中,有兩個dentry,分別表示/home/akaedu/a和/home/akaedu/b,它們都指向同一個inode,說明這兩個文件互爲硬連接。inode結構體中保存着從磁盤分區的inode讀上來信息,例如全部者、文件大小、文件類型和權限位等。每一個inode結構體都有一個指向inode_operations結構體的指針,後者也是一組函數指針指向一些完成文件目錄操做的內核函數。
和file_operations不一樣,inode_operations所指向的不是針對某一個文件進行操做的函數,而是影響文件和目錄佈局的函數,例如添加刪除文件和目錄、跟蹤符號連接等等,屬於同一文件系統的各inode結構體能夠指向同一個inode_operations結構體。
inode結構體有一個指向super_block結構體的指針。super_block結構體保存着從磁盤分區的超級塊讀上來的信息,例如文件系統類型、塊大小等。super_block結構體的s_root成員是一個指向dentry的指針,表示這個文件系統的根目錄被mount到哪裏,在上圖的例子中這個分區被mount到/home目錄下。
file、dentry、inode、super_block這幾個結構體組成了VFS的核心概念。對於ext2文件系統來講,在磁盤存儲佈局上也有inode和超級塊的概念,因此很容易和VFS中的概念創建對應關係。而另一些文件系統格式來自非UNIX系統(例如Windows的FAT3二、NTFS),可能沒有inode或超級塊這樣的概念,但爲了能mount到Linux系統,也只好在驅動程序中硬湊一下,在Linux下看FAT32和NTFS分區會發現權限位是錯的,全部文件都是rwxrwxrwx,由於它們原本就沒有inode和權限位的概念,這是硬湊出來的。
linux系統中每一個分區都是一個文件系統,都有本身的目錄層次結構。linux會將這些分屬不一樣分區的、單獨的文件系統按必定的方式造成一個系統的總的目錄層次結構。這裏所說的「按必定方式」就是指的掛載。
將一個文件系統的頂層目錄掛到另外一個文件系統的子目錄上,使它們成爲一個總體,稱爲掛載。把該子目錄稱爲掛載點.
例如要讀取硬盤中的一個格式化好的分區、光盤或軟件等設備時,必須先把這些設備對應到某個目錄上,而這個目錄就稱爲「掛載點(mount point)」,這樣才能夠讀取這些設備。 掛載後將物理分區細節屏蔽掉,用戶只有統一的邏輯概念。全部的東西都是文件。
注意:
對於其餘操做系統創建的文件系統的掛載也是這樣。可是須要理解的是:光盤、軟盤、其餘操做系統使用的文件系統的格式與linux使用的文件系統格式是不同的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat1六、NTFS;windows98是fat1六、fat32;windows2000和windowsXP是fat1六、fat3二、 NTFS。掛載前要了解linux是否支持所要掛載的文件系統格式。
掛載時使用mount命令,其格式:mount [-參數] [設備名稱] [掛載點]
其中經常使用的參數有
codepage=XXX 代碼頁
iocharset=XXX 字符集
ro 以只讀方式掛載
rw 以讀寫方式掛載
nouser 使通常用戶沒法掛載
user 可讓通常用戶掛載設備
例如:
1. 掛載windows的文件系統:
# mount -t vfat /dev/hda5 /mnt/winc ( -t vfat指出這裏的文件系統fat32)
如今就能夠進入/mnt/winc等目錄讀寫這些文件了。
2.掛載光盤:# mk /mnt/cdrom
# mount -t iso9660 /dev/cdrom /mnt/cdrom (關盤的名字通常都是cdrom,這條命令通常都通用)
3.虛擬機共享文件夾:例如在VirtualBox下,主機是Windows,Ubuntu是Guest。共分三步:
1). 首先要安裝虛擬電腦工具包:在VirtualBox的菜單裏選擇」設備」->」安裝虛擬電腦工具包」,你會發如今Ubuntu桌面上多出一個光盤圖標,這張光盤默認被自動加載到了文件夾/media/cdom0,並且/cdrom自動指向這個文件夾。默認設置下文件管理器會自動打開這張光盤,能夠看到裏面有個」VBoxLinuxAdditions.run」文件。打開一個命令行終端,依次輸入」cd /cdrom」和」sudo sh ./VBoxLinuxAdditions.run」,不含雙引號,開始安裝工具包。安裝完畢,會用英文提示要重啓Ubuntu,建議馬上重啓。重啓後,比較明顯的變化是鼠標是共享模式,而且剪貼板也和Windows共享了。若是有這些變化,說明虛擬電腦工具包已經裝成功。
2). 下一步設置共享文件夾。
在共享文件夾設置窗口中,單擊右側的」添加一個共享文件夾」,路徑選擇你想要共享的Windows文件夾,共享名任取一個本身喜歡的,好比」myshare」,選項read-only是指是否只容許ubuntu讀這個文件夾,請根據須要選擇這個選項。
3). 在ubuntu下掛載這個共享文件夾:sudo mount -t vboxsf myshare /media/share
其中」myshare」是以前取的共享文件夾的名字,」/media/share」是要掛載到的目標文件.
每次開機訪問windows分區都要運行mount命令顯然太煩瑣,爲何訪問其餘的linux分區不用使用mount命令呢?
其實,每次開機時,linux自動將須要掛載的linux分區掛載上了。那麼咱們是否是能夠設定讓linux在啓動的時候也掛載咱們但願掛載的分區,如windows分區,以實現文件系統的自動掛載呢?
這是徹底能夠的。在/etc目錄下有個fstab文件,它裏面列出了linux開機時自動掛載的文件系統的列表。個人/etc/fstab文件以下:
/dev/hda2 / ext3 defaults 1 1
/dev/hda1 /boot ext3 defaults 1 2
none /dev/pts devpts gid=5,mode=620 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
/dev/hda3 swap swap defaults 0 0
/dev/cdrom /mnt/cdrom iso9660 noauto,codepage=936,iocharset=gb2312 0 0
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu 0 0
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
在/etc/fstab文件裏,第一列是掛載的文件系統的設備名,第二列是掛載點,第三列是掛載的文件系統類型,第四列是掛載的選項,選項間用逗號分隔。第五六列不知道是什麼意思,還望高手指點。
在最後兩行是我手工添加的windows下的C;D盤,加了codepage=936和iocharset=cp936參數以支持中文文件名。參數defaults實際上包含了一組默認參數:
你們能夠看到在這個列表裏,光驅和軟驅是不自動掛載的,參數設置爲noauto。(若是你非要設成自動掛載,你要確保每次開機時你的光驅和軟驅裏都要有盤,呵呵。)
磁盤和文件空間 :fdisk df du
文件目錄與管理: cd pwd mkdir rmdir ls cp rm mv
查看文件內容 cat、tac、more、less、head 、tail
文件目錄與權限 :chmod chown chgrp umask
文件查找:which、whereis、locate、find、find