linux|chmod,chown,chgrp檔案安全與權限

chmod 改變權限位

分為符号模式和絕對模

符号模式的一般格式:

chmod [who] operator [permission] filename

who的含義

u 檔案屬主權限。

g 屬組使用者權限。

o 其他使用者權限。

a 所有使用者(檔案屬主、屬組使用者及其他使用者)

operator的含義

+ 增權重限。

- 取消權限。

= 設定權限

permission的含義

r 讀權限。

w 寫權限。

x 執行權限。

s 檔案屬主群組set-ID。

t 粘性位*。

l 給檔案加鎖,使其他使用者無法通路。

u,g,o 針對檔案屬主、屬組使用者及其他使用者的操作

*在列檔案或目錄時,有時會遇到“ t”位。“t”代表了粘性位。如果在一個目錄上出現

“t”位,這就意味着該目錄中的檔案隻有其屬主才可以删除,即使某個屬組使用者具有和屬

主同等的權限。不過有的系統在這一規則上并不十分嚴格。

如果在檔案清單時看到“ t”,那麼這就意味着該腳本或程式在執行時會被放在交換區(虛

存)。

chmod a-x test //rw- rw- rw- 收回所有使用者的執行權限

chmod og-w test //rw- r-- r-- 收回屬組使用者和其他使用者的寫權限

chmod g+w test //rw- rw- r-- 賦予屬組使用者寫權限

chmod u+x test //rwx rw- r-- 賦予檔案屬主執行權限

chmod go+x test //rwx rwx r-x 賦予屬組使用者和其他使用者執行權限

chmod 777 rwx rwx rwx 賦予所有使用者讀、寫、執行的權限

檔案類型

d 目錄。

l 符号連結(指向另一個檔案)。

s 套接字檔案。

b 塊裝置檔案。

c 字元裝置檔案。

p 命名管道檔案。

- 普通檔案

檔案的權限位

-rw-r--r-

rw-:前三位,檔案屬主可讀、寫

r--:中間三位,組使用者可讀

r--:最後三位,其他使用者隻可讀

檔案與目錄的權限

root預設建立檔案的權限就是666-022=644   建立的目錄權限就是777-022=755

一般使用者預設建立檔案權限是666-002=664   建立目錄權限是777-002=775

絕對模式的一般格式:

chmod [mode] file

其中m o d e是一個八進制數。 在絕對模式中,權限部分有着不同的含義。每一個權限位

用一個八進制數來代表,如

0 4 0 0 檔案屬主可讀

0 2 0 0 檔案屬主可寫

0 1 0 0 檔案屬主可執行

0 0 4 0 屬組使用者可讀

0 0 2 0 屬組使用者可寫

0 0 1 0 屬組使用者可執行

0 0 0 4 其他使用者可讀

0 0 0 2 其他使用者可寫

0 0 0 1 其他使用者可執行

在設定權限的時候,隻需按照上面查出與檔案屬主、屬組使用者和其他使用者所具有的權限相

對應的數字,并把它們加起來,就是相應的權限表示。 可以看出,檔案屬主、屬組使用者和

其他使用者分别所能夠具有的最大權限值就是7。 再來看看前面舉的例子:

-rwxr--r-- 1 root 0 10月 19 20:16 test

相應的權限是:

rwx-:0400 + 0200 +0100 (檔案屬主可讀、寫、執行) = 0 7 0 0

r--:0 0 4 0 (屬組使用者可讀) = 0 0 4 0

r--:0 0 4 0 (屬組使用者可讀) = 0 0 4 0 0 7 4 4

有一個計算八進制權限表示的更好辦法,如下:

檔案屬主:r w x:4 + 2 + 1

屬組使用者:r w x:4 + 2 + 1

其他使用者:r w x:4 + 2 + 1

像上面這樣,更容易地計算出相應的權限值,隻要分别針對檔案屬主、屬組使用者和其他用

戶把相應權限下面的數字加在一起就可以了。 test檔案具有這樣的權限:

r w x r - - r - -

4+2+1 4 4

把相應權限位所對應的值加在一起,就是7 4 4。 如:

chmod 666 rw- rw- rw- 賦予所有使用者讀和寫的權限

chmod 644 rw- r-- r- - 賦予所有檔案屬主讀和寫的權限,所有其他使用者讀權限

chmod 744 rwx r-- r- - 賦予檔案屬主讀、寫和執行的權限,所有其他使用者讀的權限

chmod 664 rw- rw- r- - 賦予檔案屬主和屬組使用者讀和寫的權限,其他使用者讀權限

chmod 700 rwx --- --- 賦予檔案屬主讀、寫和執行的權限

chmod 444 r-- r-- r- - 賦予所有使用者讀權限

下面舉一個例子,假定有一個名為test的檔案,具有如下權限:

-rw-rw-r-- 1 root 0 10月 19 20:16 test1

現在希望對該檔案可讀、寫和執行, root組使用者對該檔案隻讀,可以鍵入:

:

$chmod 740 test1 $ls -l -rwxr----- 1 root 0 10月 19 20:16 test1

如果檔案可讀、寫和執行,對其他所有使用者隻讀,用:

$chmod 744 test1 $ls -l -rwxr--r-- 1 root 0 10月 19 20:16 test1

如果希望一次設定目錄下所有檔案的權限,可以用:

$chmod 664* $ls -l -rw-r--r-- 1 root 0 10月 19 20:16 test1

這将使檔案屬主和屬組使用者都具有讀和寫的權限,其他使用者隻具有讀權限。 還可以通過使

用- R選項連同子目錄下的檔案一起設定:

chmod -R 664 /test/*

這樣就可以一次将/ test目錄下的所有檔案連同各個子目錄下的檔案的權限全部設定為文

件屬主和屬組使用者可讀和寫,其他使用者隻讀。使用- R選項一定要謹慎,隻有在需要改變目

錄樹下全部檔案權限時才可以使用。

目錄

目錄的權限位和檔案有所不同。目錄的讀權限位意味着可以列出其中的内容。寫權限位意

味着可以在該目錄中建立檔案,如果不希望其他使用者在你的目錄中建立檔案,可以取消相

應的寫權限位。執行權限位則意味着搜尋和通路該目錄.

r :可以列出該目錄中的檔案

w:可以在該目錄中建立或删除檔案

x:可以搜尋或進入該目錄

權限檔案屬主屬組使用者其他使用者

drwx rwx r- x ( 775 ) 屬主讀、寫、執行,屬組讀、寫、執行,其它組讀、執行

drwx r-x r- - ( 754 ) 屬主讀、寫、執行,屬組讀、執行,其它組讀

drwx r-x r- x ( 755 ) 屬主讀、寫、執行,屬組讀、執行,其它組讀、執行

如果把屬組使用者或其他使用者針對某一目錄的權限設定為- - x,那麼他們将無法列出該目

錄中的檔案。如果該目錄中有一個執行位置位的腳本或程式,隻要使用者知道它的路徑和文

件名,仍然可以執行它。使用者不能夠進入該目錄并不妨礙他的執行。

目錄的權限将會覆寫該目錄中檔案的權限。例如,如果目錄test具有如下的權限:

drwxr--r-- 1 admin 0 10月 19 20:16 test

而目錄下的檔案myfile的權限為:

-rwxrwxrwx 1 admin 0 10月 19 20:16 myfile

那麼admin組的使用者将無法編輯該檔案,因為它所屬的目錄不具有這樣的權限。

該檔案對任何使用者都可讀,但由于它所在的目錄并未給admin組的使用者賦予執行權限,所

以該組的使用者都将無法通路該目錄,他們将會得到“通路受限”的錯誤消息。

=================================

suid/guid

1、為什麼要使用這種類型的腳本? 例如有幾個大型的資料庫系統,對它們進行備份需要

有系統管理權限。可以寫幾個腳本,并設定了它們的guid,這樣就可以指定的一些使用者來

執行這些腳本就能夠完成相應的工作,而無須以資料庫管理者的身份登入,以免不小心破

壞了資料庫伺服器。通過執行這些腳本,他們可以完成資料庫備份及其他管理任務,但是

在這些腳本運作結束之後,他們就又回複到他們作為普通使用者的權限。

2、查找suid/guid指令 有相當一些UNIX指令也設定了suid和guid。如果想找出這些命

令,可以進入/bin或/sbin目錄,執行下面的指令:

$ ls -l | grep '^...s'

上面的指令是用來查找s u i d檔案的;

$ ls -l | grep '^...s..s'

上面的指令是用來查找s u i d和g u i d的。

3、設定UID

設定suid:将相應的權限位之前的那一位設定為4;

設定guid:将相應的權限位之前的那一位設定為2;

兩者都置位:将相應的權限位之前的那一位設定為4+2=6。

設定了這一位後x的位置将由s代替。

記住:在設定suid或guid的同時,相應的執行權限位必須要被設定。

例如,如果希望設定g u i d,那麼必須要讓該使用者組具有執行權限。

如果想要對檔案login[它目前所具有的權限為rwx rw- r-- (741)]設定suid,,可在使

用chmod指令時在該權限數字的前面加上一個4,即chmod 4741,這将使該檔案的權限變

為r w s rw- r - -。

$ chmod 4741 login

設定suid/guid的例子

CODE:

指令         結果         含義

chmod 4755 rws r-x r- x 檔案被設定了suid,檔案屬主具有讀、寫和執行的權限,其

他使用者具有讀和執行的權限

chmod 6711 rws --s --x 檔案被設定了suid和guid,檔案屬主具有讀、寫和執行的權

限,其他使用者具有執行的權限

chmod 4764 rws rw- r- - 檔案被設定了suid,檔案屬主具有讀、寫和執行的權限,屬

組使用者具有讀和執行的權限,使用者具有讀權限

4、還可以使用符号方式來設定suid/guid。如果某個檔案具有這樣的權限: rwx r-x

r- x,那麼可以這樣設定其suid:

chmod u+s <filename>

于是該檔案的權限将變為: rws r-x r-x

在查找設定了suid的檔案時,沒準會看到具有這樣權限的檔案:rwS r-x r- x,其中S為

大寫。

它表示相應的執行權限位并未被設定,這是一種沒有什麼用處的suid設定,可以忽略它的

存在。

注意,chmod指令不進行必要的完整性檢查,可以給某一個沒用的檔案賦予任何權限,但

chmod 指令并不會對所設定的權限組合做什麼檢查。是以,不要看到一個檔案具有執行權

限,就認為它一定是一個程式或腳本。

chown變更檔案或目錄的擁有者或所屬群組

指令的一般形式:

chown -R -h owner file

- R(recursive)選項意味着對所有子目錄下的檔案也都進行同樣的操作。

- h選項意味着在改變符号連結檔案的屬主時不影響該連結所指向的目标檔案

如:

# chown -R qq test1 (test1目錄及子目錄的所有檔案屬主變為qq)

# ls -l

drwxrwxr-x 2 sam sam 4096 10月 26 19:48 sam

# chown gem sam

drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam

檔案sam的所有權現在由使用者sam交給了使用者gem。

chgrp變更檔案或目錄的所屬群組

chgrp -R -h owner file

chgrp -R a test1 (test1目錄及子目錄的所有檔案組變為a)

drwxrwxr-x 2 gem sam 4096 10月 26 19:48 sam

# chgrp group sam

drwxrwxr-x 2 gem group 4096 10月 26 19:48 sam

現在把該檔案sam所屬的組由sam變為group。

查找自己所屬使用者組

# su sam

$ id

uid=506(sam) gid=4(adm) groups=4(adm)

查找其他使用者所屬組

# id

uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4

(adm),6(disk),10(wheel)

檢視目前使用者所屬組

# id gem

uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)

檢視其它使用者所用組:#id 使用者名

# su sam

$ id gem

uid=507(gem) gid=507(group) groups=507(group),0(root),4(adm)

檢視其它使用者所屬組

umask

當最初登入到系統中時,umask指令确定了你建立檔案的預設模式。這一指令實際上和

chmod指令正好相反。你的系統管理者必須要為你設定一個合理的umask值,以確定你建立

的檔案具有所希望的預設權限,防止其他非同組使用者對你的檔案具有寫權限。

在已經登入之後,可以按照個人的偏好使用umask指令來改變檔案建立的預設權限。相應

的改變直到退出該shell或使用另外的umask指令之前一直有效。

一般來說,umask指令是在/etc/profile檔案中設定的,每個使用者在登入時都會引用這個

檔案,是以如果希望改變所有使用者的umask,可以在該檔案中加入相應的條目。如果希望

永久性地設定自己的umask值,那麼就把它放在自己$HOME目錄下的.profile

或.bash_profile檔案中。

如何計算umask值

umask指令允許你設定檔案建立時的預設模式,對應每一類使用者(檔案屬主、屬組、其他用

戶)存在一個相應的umask值中的數字。對于檔案來說,這一數字的最大值分别是6。系統

不允許你在建立一個文本檔案時就賦予它執行權限,必須在建立後用chmod指令增加這一

權限。目錄則允許設定執行權限,這樣針對目錄來說,umask中各個數字最大可以到7。

該指令的一般形式為:

umask nnn

其中nnn為umask置0 0 0 - 7 7 7。

計算umask值:

可以有幾種計算umask值的方法,通過設定umask值,可以為新建立的檔案和目錄設定預設

權限。

與權限位相對應的umask值。

umask 檔案 目錄

0 6 7

1 6 6

2 4 5

3 4 4

4 2 3

5 2 2

6 0 1

7 0 0

在計算umask值時,可以針對各類使用者分别按上面那張表中按照所需要的檔案/目錄建立缺

省權限查找對應的umask值。

例如,umask值

是以002所對應的檔案和目錄建立預設權限分别為664和775。

還有另外一種計算umask值的方法。我們隻要記住umask是從權限中“拿走”相應的位即可

2 4 5

例如,對于umask值002,相應的檔案和目錄預設建立權限是什麼呢?

第一步,我們首先寫下具有全部權限的模式,即777(所有使用者都具有讀、寫和執行權限)

第二步,在下面一行按照umask值寫下相應的位,在本例中是002。

第三步,在接下來的一行中記下上面兩行中沒有比對的位。這就是目錄的預設建立權限。

稍加練習就能夠記住這種方法。

第四步,對于檔案來說,在建立時不能具有檔案權限,隻要拿掉相應的執行權限比特即可

這就是上面的例子,其中umask值為002:

1) 檔案的最大權限rwx rwx rwx (777)

2) umask值為0 0 2 - - - - - - -w-

3) 目錄權限rwx rwx r-x (775) 這就是目錄建立預設權限

4) 檔案權限rw- rw- r-- (664) 這就是檔案建立預設權限

下面是另外一個例子,假設這次umask值為022:

2) umask值為022 - - - -w- -w-

3) 目錄權限rwx r-x r-x (755) 這就是目錄建立預設權限

4) 檔案權限rw- r-- r-- (644) 這就是檔案建立預設權限

如果想知道目前的umask 值,可以使用u m a s k指令:

#su sam /*切換到sam使用者玩境下

#umask /*檢視sam的umask

0022

前面多了個0,是suid/guid的

$ touch file1

$ mkdir file2

$ ls -l

總用量 8

-rw-r--r-- 1 sam adm 0 10月 30 19:27 file1

drwxr-xr-x 2 sam adm 4096 10月 30 19:28 file2

建立檔案file1和目錄file2,檢視建立檔案和目錄的預設權限,umask為022時 目錄權限

rwx r-x r-x (755) 檔案權限rw- r-- r-- (644)

更改umask預設值由022至002

$ umask 002

$ touch file3

總用量 12

drwxr-xr-x 2 sam adm 4096 10月 30 19:28 file2

-rw-rw-r-- 1 sam adm 0 10月 30 19:34 file3

drwxrwxr-x 2 sam adm 4096 10月 30 19:34 file4

可以看到,建立檔案和目錄的預設權限改變了,umask為002時

目錄權限rwx rwx r-x (775)

檔案權限rw- rw- r-- (664)

可以看見,$ umask 002已生效

先說一下umask在不同玩境下的不同

1、bash umask [-p] [-S] [mode]

2、tcsh umask [value]

說明

當新增檔案或目錄時,預設的使用權限,由 umask 這個内設值所規定的。

一般情況下,umask 會被設定在 shell 的啟始檔案中。

對 bash 的使用者來說,個人的啟始檔案是 $HOME/.bashrc,使用者可以将 umask 設

定在其中。像 RedHat 9 是放 /etc 之下,檔名為 bashrc。 當使用者沒有自行設定,

umask 設定值便來自于此系統的預設設定。 tcsh 的個人啟始檔案為 ~/.tcshrc,系統

設定檔案在 /etc/csh.cshrc。

linux 作業系統的角度,完整的權限設定值是四位數字。 第一位數,代表檔案或目錄的

特殊屬性。 4 代表 "suid"﹔2 代表 "sgid"﹔1 代表 "粘滞位 - save text p_w_picpath"

。後三位數,依序代表 "user-檔案擁有者","group-群組","other-其它"。 每一位

數,代表三種權限的疊加,4-讀(r),2-寫(w),1-執行(x)。被禁止的權限則以0帶入。

對 umask 來說,有效的設定值隻有後三位數。在 bash 中,雖然可帶入四位數字,但第

一個數字,必須為 0。這點請注意。

指令 umask 的設定值以三個八進位的數字“nnn”代表。

第一個設定數字給使用者自己(owner user),

第二個則是設定給用使用者所屬的群體(group),

第三個給不屬于同群體的其它使用者(other)。

每一位數字的設定值都是三項不同權限的數值加總,read 權限數值為 4;write 權限數

值為 2;execute 權限數值為 1。

結合了前三者的權限數值,單一的數字可設定的範圍是 0~7;整體的可設定範圍是

000~777。

umask 的設定值,對目錄,與對檔案的實質作用是有差别的。

注意: 當我們設定為 000 時,會得到完全開放的目錄權限 777,以及檔案權限 666。

為何檔案隻得到 666 呢?因為檔案權限中的 execute 權限已被程式移除,是以,不管

你設定什麼 umask 數值,檔案都不會出現 execute 權限。

umask 文法如下:

umask who operator permissions

其中,參數的含義如下:

who:表示下列字元中的一個、兩個或全部:

u(表示使用者權限)

g(表示組使用者權限)

o(表示其他使用者權限)

a (ugo 的縮寫形式)

如果忽略了字元who,operator和permissions 将适用于所有類(等同于a或ugo)。

operator:字元 +、- 或 = 之一: 

+ 增權重限。

- 取消權限。

= 設定權限。

permissions:字元或字元組合 r、w、x、rx、wx、rw 或 rwx 之一,用于為相應的

who 和 operator 指定讀、寫和(或)執行(搜尋)權限。

如果未指定 permissions,則相應的 who 中的現有檔案建立模式掩碼不會發生更改。

如果在 shell 提示符下設定 umask,它将隻适用于目前登入會話中的 shell 和

subshell。但不适用于以後登入的會話。要在登入時自動應用 umask 設定,請将

umask 指令添加到 .profile 檔案(對于 POSIX 和 Bourne Shell 使用者)或 .login

檔案中(對于 C Shell 使用者)。

選項說明

bash

-S

以 "u=rwx,g=rx,o=rx" 這種較人性的格式取代數字顯示

-p

當使用 -p 選項,但 mode 省略,輸出格式為 umask mode (可以做為下 umask 指令

使用)。當模式改變成功,或 mode 參數被省略,執行的狀态值為 0。否則狀态值為 1。

執行個體說明

首先,讓我們先顯示目前環境的 umask 設定情況

# umask 0022 #

得到的數值為 "0022"。是以,建立新檔案的預設權限是 644,目錄則是755。如果不習

慣看數字,我們可以使用 -S 選項來顯示設定值

# umask -S u=rwx,g=rx,o=rx

#

實際建個檔案與目錄看看

# ls > fileA

# mkdir dirB

總計 8

drwxr-xr-x 2 root root 4096 12月 21 16:42 dirB

-rw-r--r-- 1 root root 6 12月 21 16:42 fileA

可以看到檔案和目錄的不同

tcsh

$ umask

$

$ umask 000

$ umask

$

從以上,我們可以知道,tcsh 簡單到連 0 都懶的顯示...

要設定 umask 值,使檔案所有者具有讀寫執行權限,屬組的其他使用者具有隻讀權限,除

此之外的其他使用者沒有通路權限 (-rw-r-------),請輸入以下内容:

$ umask u=rwx,g=r,o=r

$ touch file5

$ mkdir file6

總用量 16

-rw-r--r-- 1 sam adm 0 10月 30 19:48 file5

drwxr--r-- 2 sam adm 4096 10月 30 19:48 file6

要确定目前的 umask 設定,請鍵入:

$ umask -S u=rwx,g=r,o=r

符号連結

存在兩種不同類型的連結,軟連結和硬連結。修改其中一個,硬連接配接指向的是節點

(inode),而軟連接配接指向的是路徑(path)

軟連結檔案 軟連結又叫符号連結,這個檔案包含了另一個檔案的路徑名。可以是任意檔案

或目錄,可以連結不同檔案系統的檔案。和win下的快捷方式差不多。連結檔案甚至可以鍊

接不存在的檔案,這就産生一般稱之為"斷鍊"的問題(或曰“現象",連結檔案甚至可以循

環連結自己。類似于程式設計語言中的遞歸。

指令格式:

ln [-s] source_path target_path

硬連結檔案

info ln 指令告訴您,硬連結是已存在檔案的另一個名字,硬連接配接的指令是

ln -d existfile newfile

硬連結檔案有兩個限制

1、不允許給目錄建立硬連結;

2、隻有在同一檔案系統中的檔案之間才能建立連結。

對硬連結檔案進行讀寫和删除操作時候,結果和軟連結相同。但如果我們删除硬連結檔案

的源檔案,硬連結檔案仍然存在,而且保留了願有的内容。這時,系統就“忘記”了它曾

經是硬連結檔案。而把他當成一個普通檔案。修改其中一個,與其連接配接的檔案同時被修改

舉例 說明:

$umask 022

$ cp /etc/httpd/conf/httpd.conf /usr/sam

原來前面做的試驗,改變了系統預設的umask值,現在改回來為022, 舉個httpd.conf文

件做例 子

$ ln httpd.conf httpd1.conf

$ ln -s httpd.conf httpd2.conf

第一條為硬連結,第二條為軟連結

$ ls -li

總用量 80

1077669 -rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd1.conf

1077668 lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf ->

httpd.conf

1077669 -rw-r--r-- 2 sam adm 34890 10月 31 00:57 httpd.conf

可以看到,使用ls -li,軟連接配接隻産生了10位元組的快捷而已,硬連接配接卻實實在在的的拷貝

對http1.conf進行編輯,可以發現httpd.conf也發生了一樣的變化

$ rm httpd.conf

現在删除連結的源檔案,來比較不同之處

總用量 44

drw-r--r-- 2 sam adm 4096 10月 30 20:14 file6

-rw-r--r-- 1 sam adm 34890 10月 31 00:57 httpd1.conf

lrwxrwxrwx 1 sam adm 10 10月 31 00:58 httpd2.conf -> httpd.conf

發現,httpd2.conf實際已經不存在了,是斷鍊,而httpd1.conf變也了普通檔案

索引節點、硬連接配接和連接配接計數

索引節點inode:

Linux為每個檔案配置設定一個稱為索引節點的号碼inode,可以将inode簡單了解成一個指針

,它永遠指向本檔案的具體存儲位置。系統是通過索引節點(而不是檔案名)來定位每一個

檔案。

例如:

假設我們在硬碟目前目錄下建立了一個名為mytext文本檔案,其内容隻有一行:

This is my file.

1、當然這行文字一定是存儲在磁盤資料區某個具體位置裡(實體上要通過磁頭号、柱面号

和扇區号來描述,在本例中假設分别是1、20、30)。

2、假設其inode是262457,那麼系統通過一段标準程式,就能将這個inode轉換成存放此

檔案的具體實體位址(1磁頭、20柱面、30扇區),最終讀出檔案的内容:“This is my

file.”

3、是以inode是指向一個檔案資料區的指針号碼,一個inode對應着系統中唯一的一片物

理資料區,而位于兩個不同實體資料區的檔案必定分别對應着兩個不同的inode号碼。

檔案拷貝指令與硬連結的差別:

# cp /home/zyd/mytext newfile

在目前工作目錄建立了一個新檔案newfile,其實際操作主要包括如下三步:

1、在目前目錄中增加一個目錄項,其檔案名域填入newfile,并配置設定了一個新的inode,

假設是262456。

2、将原檔案(在1磁頭、20柱面、30扇區)的内容複制了一份到新的空閑實體塊(假設是1磁

頭、20柱面、31扇區)。

3、填寫一些其他關鍵資訊,使系統通過這些資訊及inode号碼可以完成實體位址的轉換。

是以檔案複制要配置設定新的inode和新的資料區,雖然兩個檔案的内容是一樣的。

硬連接配接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

連接配接計數count:

,檔案的連接配接計數域表明本系統中共有幾個檔案目錄項的inode和本檔案相同,也就是本

檔案共有幾個硬連接配接。如上面的例子中hardlink_mytext和mytext檔案的count值都是2

那麼對于目錄,其count域的含義是什麼呢?目錄的count同樣表示共有多少個目錄項指向

此目錄,不過要詳細說明必須進一步解釋VFS檔案系統的結構,為簡單起見,隻要這樣了解

就行了:(count-2)等于本目錄包含的直接子目錄數(就是隻包括兒子,不包括孫子啦!)

例如:如果一個目錄/abc的count域為5,那麼/abc目錄一定包含3個子目錄

進一步說明:

硬連接配接檔案實際上并不是一種新的檔案類型,兩個檔案互為對方的硬連接配接。它們應該都是

普通檔案(誰能告訴我:其它類型的檔案可以硬連接配接嗎?)。兩個檔案除了名稱或/和檔案目

錄不同外,其它部分完全相同,更改了一個檔案,另一個的檔案長度、内容、更改時間等

都将相應發生變化,更改了一個檔案的權限位mode,另一個也會發生同樣的變化。

注意連接配接計數字段count,互為硬連接配接的兩個檔案的count值都是2,表明有兩個inode指

向同一檔案的inode。

當我們删除其中一個檔案時,系統首先将(count-1)->count,如果結果是零,就将其目

錄項和資料區都删除,否則隻将本目錄項删除,資料區仍然保留,仍然可以通過另外的文

件名通路。根據這個特性,可以通過為重要的檔案建立硬連接配接的方法來防止其被誤删除。

一個檔案系統允許的inode節點數是有限的,如果檔案數量太多,即使每個檔案都是0位元組

的空檔案,系統最終也會因為節點空間耗盡而不能再建立檔案。是以當發現不能建立檔案

時首先要考慮硬碟資料區是否還有空間(可通過du指令),其次還得檢查節點空間。

互為硬連接配接的多個檔案必須位于同一個檔案系統上。根裝置及任何一個需要mount才能挂

接進來的分區、軟碟、NFS、光驅等都是一個獨立的檔案系統,每個檔案系統有一個相應的

裝置号,不同檔案系統中具有相同inode節 點的檔案間沒有任何聯系。系統則通過裝置号

和inode号的組合唯一确定一個檔案。

Linux之是以能支援多種檔案系統,其實是由于Linux提供了一個虛拟檔案系統VFS,VFS

作為實際檔案系統的上層軟體,掩蓋了實際檔案系統底層的具體結構差異,為系統通路位

于不同檔案系統的檔案提供了一個統一的接 口。

實際上許多檔案系統并不具備inode結構,其目錄結構也和以上的讨論不同,但通過VFS,

系統均為其提供了虛拟一緻的inode和目錄項結構。

是以,'ls -il'指令實際顯示的inode應該是VFS inode,也就是說,inode是存在于内

存中的資料結構,而不一定是實際的硬碟結構。

但為Linux量身定做的ext2檔案系統具備實際的inode和連接配接型目錄項結構,是以,對于

ext2檔案系統,可以認為我們上面讨論的關于硬連接配接的概念是完全正确的。

關于 permission mode, 我(網中人)這裡想補充一下:

permission mode 是存在于 inode block 裡的 12 個 bit.

當 bit 為 0 時表示關, 1 表示開, 如: 110111101101

若這 12 bit 分開4組的話, 分別為如下內容:

1) suid, sgid, sticky_bit

2) owner_read, owner_write, owner_exectue

3) group_read, group_write, group_exectue

4) others_read, others_write, others_exectue

按前例來算的, 被打開的 permission 有:

suid, sgid (110)

owner_read, owner_write, owner_exectue (111)

group_read, group_exectue (101)

others_read, others_exectue (101)

不過, 在操作上, 我們不會用 2 進制了, 一般(視程式而別)可使用 8 進制或 text

mode :

110111101101換算為 8 進制就是 6755 了.

這個相對簡單多了, 我們可用 bc 來算算看: echo

"obase=8;ibase=2;110111101101"

echo "obase=2;ibase=8;6755" | bc

如果手頭上沒有 bc 或其它工具可用, 那也可用如下的換算表來對照:

000|0

001|1

010|2

011|3

100|4

101|5

110|6

111|7

分別将 12 bit 拆四組來算就是了

然而, 換算成 text mode 就沒那麼輕松了.

是因為 text mode 上隻能用 9 個字母去表示 12 個 bit .

需花些心思還是可以的.

可先從最簡單的右邊 9 個 bit 來算起: 111101101

rwxr-xr-x

不難發現每組都是 rwx , 1 對着就寫相應的 text, 0 就寫 - 了.

再下來分別找到那三個 x 的位置, 因為:

suid 若為 1 會修改 owner_x: 以 s 代替 x, 以 S 代替 - .

sgid 若為 1 會修改 group_x: 以 s 代替 x, 以 S 代替 - .

sticky_bit 若為 1 會改 others_x: 以 t 代替 x, 以 T 代替 - .

簡單來說, 若原來的 x 為 1 , 就是小寫, 為 0 則是大寫.

以上例來說, 最後結果将是: 110111101101

rwsr-sr-x

至于 umask 運算, 也是可從 permission bit 來運算的. 先抓出 directory 的

default mode: 0777 及 file 的 default mode: 0666

然後将 umask bit 的 1 所對的位置設為 0 就是了.

以 umask 0123 為例吧, 換為 2

進為就是:

000001010011

對應 new file 的 0666:

000110110110

結果, 凡是umask 1 的位置都設為 0, 得:

000110100100

再轉回 8 進位就是:

0644

若你簡單用減法來算的話, 是不對的:

0666

-0123

-------

0543 (000101100011)

真的公式可參考這個: (bitwise_NOT umask) AND default_mode =

new_permission

上例:

(bitwise_NOT 0123) AND 0666 = 0644

計算過程如下:

bitwise_NOT 得:

111110101100

AND 000110110110

得:

換算為 8 進位, 就是:

用 2 進位來算是最接近計算機思維的方法, 也是最準确的.

隻是人們一般不習慣 2 進位思維而已, 一旦熟悉之後就萬變不離其宗了!

至于 file 與 directory 在 rwx 及 suid,sgid, sitcky_bit 上的差異,

可先參考前面 wingger 版主與相關資料.

若還是了解不來的話, 我們日後再來慢慢讨論好了.

關于 sticky bits 的作用,在 APUE 裡面的說法是:

如果一個目錄權限具有 sticky bit 則是表示檔案共享方面的控制:隻有屬主可以删除文

如果一個檔案具有 sticky bit 則表示檔案始終被保持在記憶體中(這樣反複加載的時候可

以速度加快)

Linux chmod 休閑 chown chgrp

繼續閱讀