現在您已經知道關於檔案的基本知識,該學些更加深入的東西了。
一個檔案可以有超過一個的硬連接,就是說多個不同的檔案名稱可以指向同一個檔案(它們都和同一個資料結點需要結合)。但您不能做跨越檔案系統的硬連接:所有的對某一個檔案(資料結點)做直接參考必需在同一個檔案系統上,這是因為每個檔案系統都有它自己的一套資料結點,不同的檔案系統間的資料結點序號可能會重複。
因為所有指向同一個資料結點的硬連接都是參照同一個檔案,您可以用一個檔案名稱來修改一個檔案,用指向同一個資料結點但使用一個不同的檔案名稱來查看您的更改結果。試一下這個:
所有的檔案都是這樣的──即使是像設備檔案這樣的特殊檔案(例如 /dev/hda)。
一個目錄只是一個檔案名稱和資料結點序號的列表,也就是說是一個硬連接的列表。當您建立一個硬連接時,您只是在一個目錄上加入了一個「檔名─序號」對。當您刪除一個檔案,您只是從目錄中刪除了一個硬連接。
到目前為止,我們隱藏了一個細節:Linux 核心把所有東西都看成是一個檔案。這包括目錄和各種設備,它們只是一些特殊的檔案罷了。
您可能記得,ls -l 顯示的第一個字符代表的是該檔案的類型,對於一個普通的檔案來說,這個字符就是個簡單的 -。其它可能的字符包括一下:
因此一個硬連接是一個檔案名稱和一個資料結點序號。一個檔案其實是一個資料結點:在磁片上的地址,檔案類型,允許模式等等。一個符號連接是一個資料結點,它的內容包含一個硬連接的名字。一個符號連接把一個檔案名稱和另外一個檔案名稱配對,而一個硬連接把一個檔案名稱和一個資料結點配對。
所有的指向同一個檔案的硬連接有相同的形態,就是說任何一個跟其他的都是一樣的,如果您在其中一個上面進行操作,其效果跟再其它的連接上進行操作是一樣的。而在符號連接上的操作,有時候會影響這個符號連接自己的資料結點(含有硬連接名字的那個結點)的資料,有時候影響的是它指向的那個硬連接的內容。
符號連接和硬連接之間有幾個重要的分別。
符號連接可以跨越檔案系統,因為它們含有從根目錄開始的完整的檔案名稱,而所有的完整的檔案名稱都是唯一的。但硬連接指向的是資料結點序號,資料結點序號僅僅在一個檔案系統內是唯一的,如果不知道檔案系統,則這個序號就會不明確。
您可以建立目錄的符號連接,但不能建立目錄的硬連接。每個目錄都有它的硬連接──在它的母目錄中以 . 列出,在它的所有子目錄中以 .. 列出──但為了在檔案系統中強制次序,不允許有其它的目錄硬連接存在。因而一個目錄中的檔案數目等於該目錄的所有硬連接的數目減 2 (減去目錄名和 . 連接)。比較符號連接和硬連接,您只能跟一個存在的檔案建立硬連接,因為它必需指向一個資料結點序號,但您可以把符號連接連到任何檔案名稱,不論這個檔案名稱的檔案是否存在。
刪除一個符號連接只刪除這個連接,這對於連到的那個目標檔案沒有影響,而刪除一個檔案的最後的那個硬連接,則會把那個檔案完全刪除。
範例:
設備檔案指向您的系統�堛漯垓z設備或者虛擬設備,例如您的硬碟、顯卡、螢幕和鍵盤。虛擬設備則包括控制台 (console),以 /dev/console 來表示。
設備分為兩種:字符式 (character) 和塊式 (block)。字符設備可以每次訪問一個字符,記住從這種設備中可以讀取和寫入的最小單位是一個字符(一個位元組)。
塊設備的存取必需以一個大的單位進行,我們叫作‘塊’。一塊�堨]含了一些字符。硬碟就是一個塊設備。
您可以像對其它檔案一樣對設備檔案進行讀寫,不過這些設備檔案�堨i能含有一些您根本看不懂的亂七八糟的東西。一般來說往這些檔案�媕H便寫入資料不是什麼好事兒,但又是卻會有用,例如,您可以把一個 postscript 檔案直接傾倒進列表機設備檔案 /dev/lp0 或者把一些調制解調器 (modem) 指令傳給相應的串連埠的設備檔案。
/dev/null 是一個特殊的設備檔案,您寫入它的任何東西都會被丟棄。如果您不想要什麼了,把它扔進 /dev/null。它基本上就是個無底深淵,如果您從 /dev/null �媗炊J,您立刻會得到一個檔案結束 (EOF : end-of-file) 字符。/dev/zero 是另一個類似的設備檔案,只是如果您從這�媗爸�,您得到的是一個 \0 字符(這是一個空 (null) 字符,代表什麼也不是,與數字 0 是不同的)。
一個管道是一個作用象個管道的檔案。您放東西進這個檔案,您放的東西從檔案的另一端出來,因此它也叫 FIFO(First-In-First-Out 縮寫,即先入先出),您放進去的第一個東西也是最先從另外一端出來的那個。
如果對一個具名的管道進行寫入,這個寫入的進程不到所有寫入的資料被從管道中都讀走了是不會結束的。如果您從一個管道中讀取,讀取進程會一直等到讀到一些東西以後才結束。管道的大小總是 0:它不儲存任何資料,它只是把兩個進程連接起來,就像 shell �堛� | 一樣。但是因為這個管道是有名字的,所以那兩個被連的進程不需要總同一個命令行出現,它們甚至不需要是屬於同一個用戶的。
您可以試一下這個例子:
套接口 (sockets) 類似於管道 (pipes) 但它是在網路上面工作的。您到電腦就是靠它來做網路處理的。您可能聽說過 ``Winsock'',那是 Windows 的套接口。
我們在這�堣ㄡ`入談有關套接口,因為如果您不寫程式,您不會用到它,但如果您看到您系統�埵陪蚗仵袓�型是 s,您知道它是什麼就行了。
Linux 的核心會建立一個特別的檔案系統,在 Debian 系統上,這個檔案系統加載於 /proc 目錄下。這是一個「偽檔案系統」 (``pseudo-filesystem''),因為它不在任何一個物理設備上。
proc 檔案系統包含系統和執行中的進程的資料。/proc 下的「檔案」,有些是可以讀懂的簡單文字格式(試著鍵入 cat /proc/meminfo 或 cat /proc/cpuinfo),另外一些是一些神秘的數字組合。系統會有一些工具可以讀取這些資料,然後翻譯成一些您看的懂的東西。
有些人當看到一個特別的檔案時常會覺得緊張,就是 /proc/kcore 檔案。這個檔案一般來說都很大,它是用來對核心進行除錯用的。它其實根本不存在您的物理設備�堙]記住 /proc 下是一個偽檔案系統),所以用不著擔心它的大小。
如果您想知道所有關於 /proc 的資料,參看它的手冊,鍵入man 5 proc。
有時候您會要把一個目錄複製 (copy) 到另外一個地方,可能是因為您加了一個新硬碟,您要把您的 /usr/local 複製到它上面。有幾個方法都可以達到這個目的。
第一個是用複製命令 cp。命令 cp -a 告訴 cp 在複製的時候,盡量保存可能保存的資料(這個 a 有 all 的意思)。因此,您可以用
。因此,進行大規模複製工作的最好方法是使用兩個連在一起的 tar 命令,像是:
John Goerzen / Ossama Othman / Debian 中文計劃