class="21890">
一、前言
========
本文主要說明Linux下普通文件及目錄的存取權限設置。本文是為稍具基礎的初學者寫的(我也是beginner),如
果您能夠理解如下幾行'ls -l'命令的輸出含義(注意下面標注^的位),那您就沒有必要讀本文了——別浪費時
間看對你沒用的東西,時間是最寶貴的!
-r-sr-xr-x 1 root bin 26975 Jun 24 1999 01:32 /usr/bin/passwd-----------1.1
^
-rwxrwSr-x 1 zyd zyd 12506 Oct 29 10:27 test_euid-----------------------1.2
^
drwxrwxrwt 5 root root 1024 Nov 1 17:17 01;34 /tmp----------------------1.3
^^^^ ^ ^
-rwxr-xr-x 2 zyd zyd 32506 Oct 19 10:20 hard_link-----------------------1.4
^
lrwxr-xr-x 1 zyd zyd 1 Oct 23 10:40 sym_link->/tmp/sym_target-----------1.5
^ ^^^^^^^^^^^^^^^
二、'ls -l'命令輸出格式簡介
===========================
'ls -l'命令以長格式顯示文件列表,其各字段含義如下:
lrwxr-xr-x 1 zyd users 15 Oct 23 10:40 sym_link->/tmp/sym_target
_________ ___ _____ ____________ ________ _______________
| | | | | | | | |
| | | | | | | | +--符號連接(s_link)
| | | | | | | |
| | | | | | | +-----文件名(name)
| | | | | | |
| | | | | | +----文件最後更改時間(time)
| | | | | |
| | | | | +------------以字節計的文件長度(size)
| | | | |
| | | | +----------文件屬組(group)
| | | |
| | | +--------------------文件屬主(user)
| | |
| | +-------連接數位(count)
| |
| +-------文件模式位(mode),占9位
|
+------------文件類型位(type),占一位
以上9個字段中除了s_link外,其他字段對不同文件和目錄都應該有。其中user、group、time和name的含義自
明,本文就不再介紹,其它字段將分專題小節在本文介紹。
三、文件類型(type)
Linux支持的文件類型主要包括一下7類,箭頭右面的字符就是相應的文件類型位標志:
1、普通文件========>-
2、目錄文件========>d
3、符號連接========>l
4、字符設備文件====>c
5、塊設備文件======>b
6、命名管道FIFO
7、套接口socket
其中FIFO和socket超出了本文的范疇,不做介紹。其它文件簡單解釋如下:
1、普通文件:就是普通文件(廢話!),你用'vi myfile'建立的myfile就是普通文件,比如可執行二進制代碼
文件、script腳本文件、ASCII文本文件、數據文件、配置文件......就解釋到這樣行嗎?
2、目錄文件:目錄可以理解成放其它文件和/或其它目錄的容器,是一種特殊文件,其內容由目錄項組成,每個
目錄項主要包括兩部分內容:文件名name和索引節點號inode,兩者和起來稱為連接,我們將在下小節對inode
進行更詳細的介紹。
3、設備文件:不知道諸位是否有使用DOS的經驗,如果我們的機器只有三個DOS系統文件IO.SYS, MSDOS.SYS,
COMMAND.COM,而你需要編輯一份英文文檔,日後再通過打印機輸出,你能怎麼辦?
COPY CON MYDOC.TXT
;在此輸入文檔內容
^+D ;結束存盤
COPY MYDOC.TXT > PRN ;打印文檔
如果你熟悉這個過程,那你就已經理解設備文件了。以上的CON和PRN分別是DOS定義的兩個設備文件,分別對應
終端和並行打印口。這種設計使我們不必了解設備使用的具體硬件細節,按使用普通文件相同的方法來使用外部
設備。
Linux下的設備文件分為三大類:字符設備、塊設備和網絡設備,要想准確區別它們可能需要單獨寫一篇更臭更
長的文章,大致情況是:字符設備是直接讀取的,不使用緩沖區,象串行口、終端等;而塊設備都是通過緩沖區
進行讀取的,並且每次只能讀取一定數量的塊,比如磁盤每次至少要讀取一個扇區(如512字節),塊設備可以實
現隨機讀寫;網絡設備即前面提到的socket,因為我還不很熟悉,就不亂說了。設備文件一般都保存在/dev目
錄下,諸位可以用ls -l命令看看都有什麼?反正本文的重點在於介紹普通文件和目錄,設備文件不是重點,所
以就只介紹到這裡。
四、索引節點、硬連接和連接計數
==============================
1、索引節點inode:
Linux為每個文件分配一個稱為索引節點的號碼inode,可以將inode簡單理解成一個指針,它永遠指向本文件的
具體存儲位置。系統是通過索引節點(而不是文件名)來定位每一個文件。例如:
假設我們在硬盤當前目錄下建立了一個名為mytext文本文件,其內容只有一行:
This is my file.
當然這行文字一定是存儲在磁盤數據區某個具體位置裡(物理上要通過磁頭號、柱面號和扇區號來描述,在本例
中假設分別是1、20、30)。
假設其inode是262457,那麼系統通過一段標准程序,就能將這個inode轉換成存放此文件的具體物理地址(1磁
頭、20柱面、30扇區),最終讀出文件的內容:“This is my file.”
所以inode是指向一個文件數據區的指針號碼,一個inode對應著系統中唯一的一片物理數據區,而位於兩個不
同物理數據區的文件必定分別對應著兩個不同的inode號碼。
文件拷貝命令:
# cp /home/zyd/mytext newfile
在當前工作目錄建立了一個新文件newfile,其實際操作主要包括如下三步:
1、在當前目錄中增加一個目錄項,其文件名域填入newfile,並分配了一個新的inode,假設是262456。
2、將原文件(在1磁頭、20柱面、30扇區)的內容復制了一份到新的空閒物理塊(假設是1磁頭、20柱面、31扇
區)。
3、填寫一些其他關鍵信息,使系統通過這些信息及inode號碼可以完成物理地址的轉換。
所以文件復制要分配新的inode和新的數據區,雖然兩個文件的內容是一樣的。
2、硬連接hardlink:
我們實際使用文件時一般是通過文件名來引用的。通過上面的討論,我們知道:1個inode號碼肯定和一片完全
屬於一個文件的數據區一一對應。那麼一個文件系統中兩個或更多個不同的文件名能否對應同一個文件呢?答案
是肯定的。我們知道inode號碼是記錄在文件名對應的目錄項中的,我們可以使兩個或多個文件的目錄項具有相
同的inode值,實際上就使它們對應著同一個文件。有幾個目錄項具有相同的inode號,我們就說這個文件有幾
個硬連接(hardlink),對於普通文件,ls -l命令的連接計數count域的數值就是本文件擁有的硬連接數。硬連
接可以通過ln命令建立,例如:
# ln /home/zyd/mytext hardlink_mytext
就建立了一個新的文件hardlink_mytext,這個文件的inode同樣是262457。建立硬連接實際上只是增加了一個
目錄項,但並復制文件數據區,原文件的數據區由兩個文件共享。這一方面能夠節約大量磁盤空間,同時可以保
證兩個文件能同步更新。
'ls -il'可以顯示文件的inode(在下面最左邊):
262456 -rw-rw-r-- 1 zyd zyd 17 Nov 3 14:52 newfile
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 hardlink_mytext
262457 -rw-rw-r-- 2 zyd zyd 17 Nov 3 14:50 mytext
3、連接計數count:
前面我們介紹了,文件的連接計數域表明本系統中共有幾個文件目錄項的inode和本文件相