Unix與FreeBSD下檔案的屬性(轉)

BSDLite發表於2007-08-13
Unix與FreeBSD下檔案的屬性(轉)[@more@]  檔案在Unix下是一個非常重要的概念,Unix下不但使用檔案來儲存資料,而且使用檔案來儲存目錄資訊、表示硬體裝置等。Unix的檔名對大小寫敏感,例如 “FOO” 和 “foo” 是兩個不同的檔案,而且檔名可長達255個字元。

  檔案是按照分級的形式組織起來,每一級稱為一個目錄,其內容使用一個特殊的目錄檔案儲存,而第一級目錄為根目錄,這就形成了一種樹狀結構,最下面是根目錄 “/” ,根目錄下放有普通檔案和其子目錄,如: “/usr/” 、 “/var/” 等,而在不同的子目錄下又有自己的檔案和子目錄。

  /目錄:目錄樹的根,用於儲存系統的核心檔案和系統啟動檔案,它所在的檔案系統為根檔案系統。

  /dev目錄:用於儲存系統的裝置檔案,佔用大致固定的硬碟空間,位於根檔案系統中。

  /etc目錄:用於儲存系統的配置檔案,包括passwd,rc等非常重要的檔案,也被放置到根檔案系統中。

  /bin和/sbin目錄:儲存了用於系統維護目的的執行檔案,其中/sbin中的檔案通常直接用於系統維護,/bin為提供管理員使用系統的基本工具。也必須放置在根檔案系統上,在系統執行在單使用者模式時,只有根檔案系統安裝到系統上時,就能夠執行這些程式進行系統維護任務。

  /tmp目錄:用於存放程式執行產生的臨時檔案,這個目錄也是每個使用者都可寫的,在系統啟動時將自動清空這個目錄。當系統執行較大型的服務程式時,會要求較大的/tmp空間,會超過根檔案系統的空間,因此可以在其他檔案系統中建立另一個臨時檔案目錄,使用符號連線等方法進行維護。

  /usr目錄:用於儲存系統正常執行時使用的多種檔案,其中/usr/bin放置系統執行檔案,/usr/sbin 放置系統維護程式,/usr/local放置非標準的應用程式,/usr/share放置系統中的文件和其他資料檔案,/usr/src中放置系統的原始碼,/usr/X11R6放置X Window系統、應用程式和資料檔案。由於這些內容非常多,/usr目錄通常為一個單獨安裝的檔案系統,佔用一個硬碟分割槽,稱為usr檔案系統。隨著系統任務的增長,/usr目錄中的內容也會迅速增多,還要考慮將其較大的子目錄分離出來,例如/usr/local目錄。

  /var目錄:用於儲存系統執行時產生和使用的資料檔案,例如/var/log目錄用於放置系統日誌,/va r/db/pkg目錄用於放置系統軟體包的安裝記錄。很多應用程式也使用它來放置資料檔案,如news伺服器等。這個目錄下檔案會隨系統的執行而不斷變化,其中的很多檔案會不斷增大,佔用大量的磁碟空間。應該將這個目錄分離出來,這樣即使某個程式在這個目錄下沒有限制的產生資料檔案,填充整個檔案系統,也不會影響其他目錄下的資料儲存,例如使用者在自己目錄下的資料儲存。由於/var目錄的大小會隨著應用程式的需要改變,對於提供網路服務的伺服器,/var佔用磁碟分割槽應該大一些。

  /home目錄:使用它用於維護使用者的個人目錄,它的大小由使用者數量及使用者的活躍程度決定,也需要有足夠的空間才能提供正常的服務。通常這個目錄儲存在usr檔案系統中,而在根目錄下使用連線來維護。當使用者數量增加的很多的時候,應該讓它位於一個單獨的檔案系統中。

  這些目錄開始就設計為儲存不同的資料,而各個目錄會使用不同的磁碟分割槽。習慣於DOS/Windows的使用者會不習慣這種使用多個檔案系統的方式,而只使用一個檔案系統,這種做法是不對的。多檔案系統可以用於分隔不同的任務,分隔系統風險,增加可靠性,對於用作伺服器的FreeBSD系統是必需的。

  Unix的樹狀目錄結構十分標準,那類檔案應該放置到那個目錄中都有一定的習慣。當然在不同的Unix中,具體檔案的位置也有細微的差別,事實上在Unix發展的過程中,標準目錄樹結構的也有幾次較大的改動,但是基本結構是相同的。由於FreeBSD有統一的版本,所有的開發者都使用同一個原始碼樹,而且使用統一的Packages Collection 機制來維護應用軟體,因此FreeBSD的目錄結構更為整齊、乾淨。


檔案的屬性

  由於FreeBSD是一個多使用者系統,不同的使用者對不同的檔案就應該有不同的處理權力,通常建立檔案的使用者就擁有這個檔案,成為這個檔案的屬主。同樣,檔案也有自己的屬組,這是一個檔案的兩個重要屬性。由於檔案的屬主和組涉及到對檔案的訪問控制,因此只有root能更改檔案的這兩個屬性,更改檔案屬主的命令為chown,更改檔案屬組的命令為chgrp。

  由於不可能為每個使用者都單獨提供完全獨立的檔案系統,多使用者作業系統必須提供一種安全的訪問控制機制,使得使用者既能和其他使用者共享某些檔案,又能保證各個使用者的檔案不會被非法存取或破壞。Unix分別針對屬主、同組使用者和其他使用者共三種不同的使用者,分別設定了存取控制許可權,這個許可權分別為:讀、寫和執行,使用英文字母r(Read)、w(Write)和x(eXecute)來表示。由於對屬主、組和其他使用者均有這三種許可權設定,因此每個檔案共有九個許可權引數。使用 “ls -l” 命令就能看到檔案的許可權設定:

$ ls -l


drwx------ 4 user wheel 512 Nov 25 17:23 Mail


-rw-rw-r-- 1 user wheel 149 Dec 4 14:18 Makefile


-rwxr-xr-x 1 user wheel 3212 Dec 4 12:36 a.out


drwxr-xr-x 1 user wheel 512 Dec 14 17:03 bin


-rw-r--r-- 1 user wheel 143 Dec 4 12:36 hello.c


drwxr-xr-x 2 user wheel 1024 Oct 16 1997 public_html


drwxrwxrwx 2 user wheel 512 Jan 3 14:07 tmp


  從上面的例子中,可以看到檔案的許可權設定在列出的資料的第一列中顯示,例如檔案a.out的屬性是-rwxr-xr-x,共顯示了十個字母的位置。其中第一個位置是用於標識檔案的種類,而非許可權設定,其餘九個位置分別表示三組的三種許可權設定。第二個到第四個位置表示屬主的許可權分別設定為讀、寫和執行,第五個到第七個位置設定同組使用者的許可權,第八個到第十個位置設定其他使用者的許可權。當指定位置上沒有顯示對應的許可權,而是 “-” ,則表示不允許對應的許可權。因此a.out的許可權設定為,對於屬主user的許可權為讀寫和執行,對於同組使用者為讀和執行許可權,對於其他使用者也是讀和執行許可權。對於目錄來講,擁有讀許可權意味著使用者可以列出這個目錄下的檔案內容,寫許可權使使用者可以在這個目錄下增、刪檔案和更改檔名,執行許可權保證使用者可以使用cd進入這個目錄。

  ls輸出結果的第一個位置表示類別,例如 “d” 表示目錄, “c” 表示該檔案為字元裝置檔案, “b” 表示為塊裝置檔案, “l” 表示為一個符號連線。

  Unix系統內部使用數值來表示這些屬性,每一個屬性與檔案屬性中的一個二進位制位相對應,如果該存取許可權設定了,對應的二進位制位就是1,如果該存取許可權沒有設定,對應的二進位制位是0。這樣a.out的許可權屬性rwxr-xr-x 用二進位制來表示就是111101101,Unix下常使用八進位制的形式表示,這樣這個許可權是755。

  檔案的屬主和管理員可以使用命令chmod來設定或改變檔案的許可權。chmod有幾種不同的使用方法,可以直接使用八進位制的許可權表示方式設定屬性,或者使用屬性字母來設定或更改檔案的屬性,不同的使用方法要求不同的 chmod引數,下面是使用chmod的一些例子:

  chmod 750 a.out :改變a.out的許可權為750;

  chmod a+x a.out :對所有使用者增加a.out的執行許可權,
  a(All)表示所有使用者;

  chmod u=rwx a.out :設定屬主的許可權為讀、寫和執行
  u(user)表示屬主使用者;

  chmod g+rw a.out :增加同組使用者的讀寫許可權,
  g(group)表示同組使用者;

  chmod o-w a.out :減少其他使用者的寫許可權,
  o(others)表示其他使用者;

  chmod go= a.out :清除同組和其他使用者的所有許可權;

  chmod o=u-w a.out :設定其他使用者的許可權為減去寫許可權的屬主許可權;

  許可權755是最常見的檔案許可權設定,這種屬性的檔案允許其他使用者可以訪問這個檔案,但不可以更改,如果不打算讓其他使用者訪問檔案,檔案的存取許可權可以設定為700。檔案在建立的時候,系統使用掩碼來決定檔案的許可權,掩碼的二進位制對應位為1的,檔案屬性的對應位就設定為0,例如當掩碼的八進位制表示為022時(二進位制為000010010),建立的檔案許可權就為755(111101101)。檔案掩碼使用umask命令來設定,例如使用 “umask 027 ” 設定掩碼為027,則建立的檔案許可權為750,其他使用者將對這個檔案沒有任何許可權。可以在啟動資原始檔或者在登入類別中設定中設定使用者的掩碼。

  目錄需要設定執行位,以允許使用者能使用cd命令進入這個目錄中

  當一個檔案的許可權設定完畢之後,在一個程式試圖訪問這個檔案時,系統就比較這個程式的屬主和屬組與檔案的屬主和屬組,判斷這個程式是否具備訪問許可權。由於每個程式的屬主和屬組標識是由啟動這個程式的使用者決定的,因此一個使用者啟動的程式就具備其本身對檔案的訪問許可權。

  除了讀、寫和執行許可權以外,對於可執行的程式還有另外兩個非常重要的屬性:設定屬主身份(setuid, Set User ID)許可權和設定組身份(setgid, Set Group ID)許可權,這兩個屬性允許某個程式可以更改自己的程式標識為程式檔案屬主或組,因而就可以具備該程式檔案屬主或屬組的訪問許可權,而不再僅僅是啟動程式的使用者的訪問許可權,這樣就能完成特定的任務。很多系統程式,例如su,就是透過這個特性來完成從執行程式時的普通使用者身份到root使用者身份的轉化的,因此這兩個屬性對於系統安全至關重要。不是必要的系統程式,不能具備這些屬性。

  可以使用 “chmod +s file” 或 “chmod g+s file” 來設定這兩個屬性,或者使用 “chmod 4755 file” 、 “chmod 2755 file” 八進位制方式來設定setuid 或setgid屬性。

檔案的連線和符號連線

  Unix中使用i節點(i node)來記錄真實的物理檔案及其位置,檔名只是指向i節點的一個連線。因此每個檔案可以有多個名字,每個名字就稱為檔案的一個連線,而同一個檔案的所有連線所指向的i節點件完全相同。但在刪除時只有全部刪除這個i節點的全部連線,才能刪除i節點、即刪除這個檔案本身。

$ ln l1 l2

$ ls -l l*

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l1

-rwxr-xr-x 2 user wheel 53212 Dec 4 12:36 l2

$

  上面的例子使用ln建立了一個連線,然後在ls的結果中可以看到第二列的數字為2,這表示這個檔案有兩個連線。這樣的連線可以建立在不同的目錄中,但所有連線所在的目錄必須在同一個檔案系統中,才能使用同樣的i節點。由於連線是直接指向標識物理檔案的i節點,因此這種連線又稱為硬連線。

  另一種更靈活的連線方式是符號連線,它沒有指向物理檔案的i節點,而是直接指向目錄樹上的另一個入口,那麼當系統訪問這個檔案時,就沿著它指向的目錄樹的位置去查詢具體檔案。這樣就能對任何檔案系統中的檔案和目錄建立連線,因此稱為軟連線。符號連線可以跨越檔案系統,靈活性很大,能夠突破物理檔案系統的限制維護目錄樹的一致性,對於系統管理和維護很有用。但是這種連線方式需要對目錄樹進行多次查詢,增加了檔案操作的額外步驟,因此效率較低,因此不應該使用多級連線,及某個符號連線指向的目錄還是一個符號連線,甚至發生符號連線的迴圈。應該儘量少用符號連線,並避免多級符號連線及符號連線的迴圈。

$ ln -s l1 /root/files

$ ls -l l*

lrwxrwxrwx 1 user wheel 12 Dec 4 12:36 l1 -> /root/files

$

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617542/viewspace-955384/,如需轉載,請註明出處,否則將追究法律責任。

相關文章