對於計算機來說,所謂的資料就是0和1的序列。這樣的一個序列可以儲存在記憶體中,但記憶體中的資料會隨著關機而消失。為了將資料長久儲存,我們把資料儲存在光碟或者硬碟中。根據我們的需要,我們通常會將資料分開儲存到檔案這樣一個個的小單位中(所謂的小,是相對於所有的資料而言)。
但如果資料只能組織為檔案的話,而不能分類的話,檔案還是會雜亂無章。每次我們搜尋某一個檔案,就要一個檔案又一個檔案地檢查,太過麻煩。檔案系統(file system)是就是檔案在邏輯上組織形式,它以一種更加清晰的方式來存放各個檔案。
路徑與檔案簡介
檔案被組織到檔案系統(file system)中,通常會成為一個樹狀(tree)結構。Linux有一個根目錄/, 也就是樹狀結構的最頂端。這個樹的分叉的最末端都代表一個檔案,而這個樹的分叉處則是一個目錄(directory, 相當於我們在windows介面中看到的資料夾)。在圖1中看到的是整個的一個檔案樹。如果我們從該樹中擷取一部分,比如說從目錄vamei開始往下,實際上也構成一個檔案系統。
要找到一個檔案,除了要知道該檔案的檔名,還需要知道從樹根到該檔案的所有目錄名。從根目錄開始的所有途徑的目錄名和檔名構成一個路徑(path)。比如說,我們在Linux中尋找一個檔案file.txt,不僅要知道檔名(file.txt),還要知道完整路徑,也就是絕對路徑(/home/vamei/doc/file.txt)。從根目錄錄/, 也就是樹狀結構的最頂端出發,經過目錄home, vamei, doc,最終才看到檔案file.txt。整個檔案系統層層分級(hierarchy),vamei是home的子目錄,而home是vamei的父目錄。
在Linux中,我們用ls命令來顯示目錄下的所有檔案,比如 $ls /home/vamei/doc
圖1 檔案樹
如該圖中所示的檔案系統,即綠色構成的樹。最頂端的根目錄(/),沿紅色箭頭標出的路徑,我們最終找到檔案file.txt。
目錄
在Linux系統中,目錄也是一種檔案。所以/home/vamei是指向目錄檔案vamei的絕對路徑。
這個檔案中至少包含有以下條目:
. 指向當前目錄
.. 指向父目錄
除此之外,目錄檔案中還包含有屬於該目錄的檔案的檔名,比如vamei中就還要有如下條目,指向屬於該目錄的檔案:
doc
movie
photo
Linux解釋一個絕對路徑的方式如下:先找到根目錄檔案,從該目錄檔案中讀取home目錄檔案的位置,然後從home檔案中讀取vamei的位置……直到找到目錄doc中的file.txt的位置。
由於目錄檔案中都有.和..的條目,我們可以在路徑中加入.或者..來表示當前目錄或者父目錄,比如/home/vamei/doc/..與/home/vamei等同。
此外,Linux會在程式中,維護一個工作目錄(present working directory)的變數。在shell中,你可以隨時查詢到到工作目錄(在命令列輸入$pwd)。這是為了省去每次都輸入很長的絕對路徑的麻煩。比如說我們將工作目錄更改為/home/vamei ($cd /home/vamei),那麼此時我們再去找file.txt就可以省去/home/vamei/ ($ls doc/file.txt),這樣得到的路徑叫相對路徑(relative path),上面的doc/file.txt就是這樣一個相對路徑。
當檔案出現在一個目錄檔案中時,我們就把檔案接入到檔案系統中,我們稱建立一個到檔案的硬連結(hard link)。一個檔案允許出現在多個目錄中,這樣,它就有多個硬連結。當硬連結的數目(link count)降為0時,檔案會被Linux刪除。所以很多時候,unlink與remove在Linux作業系統中是一個意思。由於軟連結(soft link)的廣泛使用(soft link不會影響link count,而且可以跨越檔案系統),現在較少手動建立硬連線。
檔案操作
對於檔案,我們可以讀取(read),寫入(write)和執行(execute)。讀取是從已經存在的檔案中獲得資料。寫入是向新的檔案或者舊的檔案寫入資料。如果檔案儲存的是可執行的二進位制碼,那麼它可以被載入記憶體,作為一個程式執行。在Linux的檔案系統中,如果某個使用者想對某個檔案執行某一種操作,那麼該使用者必須擁有對該檔案進行這一操作的許可權。檔案許可權的資訊儲存在檔案資訊(metadata)中, 見下一節。
檔案附加資訊 (metadata)
檔案自身包含的只有資料。檔名實際上儲存在目錄檔案。除了這些之外,還有作業系統維護的檔案附加資訊,比如檔案型別,檔案尺寸,檔案許可權,檔案修改時間,檔案讀取時間等。可以用ls命令查詢檔案資訊($ls -l file.txt),得到如下結果:
-rw-r–r– 1 vamei vamei 8445 Sep 8 07:33 file1.txt
各個部分的含義如下:
- 我們先介紹最開始的-,它表示檔案型別,說明file1.txt是常規檔案(如果是目錄檔案,則應顯示d)。
- 隨後有九個字元,為rw-r–r–,它們用於表示檔案許可權。這九個字元分為三組,rw-, r–, r–,分別對應擁有者(owner),擁有組(owner group)和所有其他人(other)。回顧Linux開機啟動,登入後,我會有一個使用者身份和一個組身份, 相當於我的名片。第一組表示,如果我的名片上的使用者身份證明我是該檔案的擁有者,那麼我就可以對該檔案有讀取(r),寫入(w)該檔案的許可權,但不擁有執行(-,如果擁有執行許可權,則為x)該檔案的許可權。第二組表示,如果我的名片上的組身份證明我所在的組是該檔案的擁有組的一員,那麼我有從該檔案讀入的許可權。第三組表示,如果我的名片顯示我既不是擁有者,也不是擁有組的一員,那麼我只有讀入的許可權。當我想要進行一個讀取操作時,Linux會先看我是否是擁有者下文會進一步解釋擁有者和擁有組。
- 後面的1是硬連線(hard link)數目(link count)。
- 之後的vamei表示使用者vamei是檔案的擁有者(owner),檔案的擁有者有權更改檔案許可權(比如改為rwxrwxrwx)。而後面的vamei檔案的擁有組是組vamei。檔案的擁有者和擁有組在檔案建立時就附加在檔案上(相當於給檔案上鎖,只有有合適名片的使用者才能開啟操作)。要注意,Linux有一個超級使用者root (也叫做根使用者),該使用者擁有所有的檔案。
- 隨後的8445表示檔案大小,單位為位元組(byte)。
- Sep 8 07:33表示檔案的上一次寫入的時間(modification time)。實際上在檔案附加資訊中還包含有檔案的上一次讀取時間(access time),沒有顯示出來。
軟連結 (soft link, or symbolic link)
如上討論硬連結時說到的,軟連結不會影響檔案的link count。如果還記得windows系統的快捷方式的話,Linux的軟連結(soft link,也叫做symbolic link)就是linux的快捷方式。軟連結本質上是一個檔案,它的檔案型別是symbolic link。在這個檔案中,包含有連結指向的檔案的絕對路徑。當你從這個檔案讀取資料時,linux會把你導向所指向的檔案,然後從那個檔案中讀取(就好像你雙擊快捷方式的效果一樣)。軟連結可以方便的在任何地方建立,並指向任何一個絕對路徑。
軟連結本身也是一個檔案,也可以執行檔案所可以進行的操作。當我們對軟連結操作時,要注意我們是對軟連結本身操作,還是對軟連結指向的目標操作。如果是後者,我們就說該操作跟隨連結指引(follow the link)。
umask
當我們建立檔案的時候,比如使用touch,它會嘗試將新建檔案建立為許可權666,也就是rw-rw-rw-。但作業系統要參照許可權mask來看是否真正將檔案建立為666。許可權mask表示作業系統不允許設定的許可權位,比如說037(—-wxrwx)的許可權mask意味著不允許設定設定group的wx位和other的rwx位。如果是這個許可權mask的話,最終的檔案許可權是rw-r—– (group的w位和other的rw位被mask)。
我們可以通過
$umask 022
的方式改變許可權mask。
總結
計算機本質上是對資料進行處理的工具,而檔案是資料儲存的邏輯載體,所以瞭解Linux檔案系統很重要。對於檔案系統的瞭解要結合Linux的其他方面(比如使用者管理)進行有機的學習。
檔案許可權,擁有者,擁有組,超級使用者root
硬連結,軟連結,follow the link