第7章 Linux的檔案系統 (File System)

壹. 檔案系統結構

在Linux下面﹐字母的大小是有分別的﹐一定要留意!

在 Linux 裡面﹐整個檔案結構就像樹狀一樣﹕一切從root 目錄(寫作 / ) 開始﹐在 / 下面是一些檔案及子目錄﹐而子目錄下面也有其自己的檔案和子目錄, 這樣一直延伸出去。我們稱這樣的結構為階層(hierarchy)式結構。一般的 Linux 檔案系統﹐其結構如下﹕

 

如果你是以root 的身份登入這部 Linux 機器,則你的路徑應該是在  [root@test root]# 底下,這時你可以輸入:

[root @test root]#  cd ..

會回到根目錄『/』下,再輸入指令『ls  -al』則會看到如下的畫面:  

[root@test /]$ ls -al
total 117
drwxr-xr-x   2 root     root         4096 May 10 06:50 bin
drwxr-xr-x   3 root     root         1024 Mar 16 18:37 boot
drwxr-xr-x   7 root     root        36864 Jul  8 04:02 dev
drwxr-xr-x  42 root     root         4096 Jul  9 15:21 etc
drwxr-xr-x  35 root     root         4096 Jul  9 15:20 home
drwxr-xr-x   4 root     root         4096 Jan 29 22:55 lib
drwxr-xr-x   2 root     root        16384 Jan 29 22:52 lost+found
drwxr-xr-x   6 root     root         4096 Mar 27 19:10 mnt
drwxr-xr-x   2 root     root         4096 Aug 24  1999 opt
dr-xr-xr-x  60 root     root            0 Jul  1 12:52 proc
drwxr-x---  12 root     root         4096 Jun  7 14:21 root
drwxr-xr-x   3 root     root         4096 May 10 06:50 sbin
drwxrwxrwt   6 root     root         4096 Jul 11 01:04 tmp
drwxr-xr-x  23 root     root         4096 Sep 16  2000 usr
drwxr-xr-x  23 root     root         4096 Jan 29 17:11 var
drwxr-xr-x   6 root     root         4096 Jan  1  1970 win98se

各目錄的名稱和安排﹐有一定的標準﹐底下針對上面幾個路徑來做說明:

最後強調﹐UNIX作業系統下,所有設備均可視為檔案,並依檔案方式運作, 包括目錄本身也是一個特殊的檔案。所有的硬體設備﹐也必須在檔案系統上面有相對的檔案﹐例如﹐/dev/fd0 就是系統的第一個軟碟機。

UNIX檔案種類:


  

貳. 檔案系統管理

常用命令如下:

pwd

它的意思是﹕Print Working Directory﹐會顯示您目前所處檔案系統中的位置.

cd ..

這個命令的目的是 Change Directory 到上一級目錄。如果您要在檔案系統中游走﹐使用 cd 後接路徑(path)進行, 我們用兩點“..”表示上級目錄﹐而當前目錄則用一點“.”表示。

路徑﹐就是一個檔案或目錄所在的位置﹐我們在 Linux 檔案系統中所使用的路徑一共有兩種﹕

絕對路徑 :絕對路徑的第一個字母一定是 / ﹐否則就是相對路徑。因為整個系統只有一個 / ﹐所以對任何檔案而言﹐都只有一個絕對路徑。

相對路徑:相對路徑則根據您當前的工作目錄﹐到目標檔案的路徑。例如﹐當前的工作目錄是在 /root/ 這裡﹐而目標的絕對路徑是 /tmp/test.txt﹐那相對路徑就是 ../tmp/test.txt (分析﹕.. 是 /root/ 的上一級目錄﹐也就是 / ﹐然後其下有一個 tmp/ 的目錄﹐然後就是目標檔案)。再舉一個例子﹕如果目標檔案的絕對路徑是 /root/temp/test.txt﹐那相對路徑就是 ./temp/text.txt﹐但是﹐通常來說﹐如果相對路徑是在當前目錄之下延伸出去的話﹐那麼這個 ./ (當前目錄)就可以省略﹐直接用 temp/test.txt 是一樣的。

如果輸入 cd 但不接任何路徑的話﹐您就會回到家目錄中。

家目錄的路徑也可以用“~/”來表示﹐例如您現在是用 root 登錄﹐在 /root 下面有個test.txt 檔案﹐其表示方法可以用絕對路徑﹕ /root/test.txt ﹐也可以用﹕~/text.txt (當您的身份是 root 的時候)。

mkdir test1

這個命令的結果會在當前目錄下面 make directory ﹐這裡新建了 test1 這個目錄。

rmdir test1

如果我們要刪除這個目錄的話﹐使用 rmdir 命令﹐但是目錄內必須是空白的才可以﹐否則您會碰到一個錯誤信息﹐告知您要移除的目錄並不是空的。這時候﹐我們要先用 rm 命令將目錄內的檔案刪除掉﹐但有一個強制的方法是﹐使用 ‘rm -rf’來將目錄強制刪除掉。rm 這個命令(remove)基本上是用來刪除檔案的﹐-r 是 recursive 模式﹐會將目錄其下的所有檔案和子目錄刪除掉﹔通常進行 rm 的時候﹐在 Redhat 裡面預設會是 -i (interactive) 模式﹐也就是在刪除檔案之前會提出詢問﹐如果您按 y 才真正刪除﹐而 -f 則是 force 的意思﹐則不再提出詢問就直接刪除檔案。

ls  -a

用來來查看目前目錄下面的內容。通常﹐使用 ls 是看不到那些以“.”開頭的檔案的﹐這些檔案是隱藏檔﹐

您要用 "ls -a"才能將它們顯示出來。通常這些檔案都是系統使用的﹐而不希望使用者對它們進行修改。

但是﹐如果您的系統遭到入侵被植入後門程式﹐它們通常會以隱藏檔案存在 。

 

ls / > test.ls

讓我們解讀這個命令﹕“>”是一個重導向功能﹐用來將命令的輸出結果產生檔案﹐如果該檔案已經存在的話﹐那麼原來內容都會丟失﹔如果您想保留原有內容﹐而把輸出產生在檔案結尾部份﹐可以使用“>>”。上面的命令執行結果是﹕產生一個內容為根目錄檔案列表結果的 test.ls 檔案。

cp test.ls test.ls.copy

這行命令的作用是將 test.ls 進行複製(copy)﹐產生一個 test.ls.copy 的副本。

如果用 mv 代替 cp﹐那就是為檔案改一個名字﹐原來的名字會不見﹐只有新的檔案名字。

 

檔案鏈結(File Link)



 

  為什麼我們要用 link 呢﹖理由如下﹕

 

. 檔案權限與屬性

檔案的一般命令與權限:

使用 ls 命令之後﹐您會看到目錄內容﹐現在的 Linux 會用不同的顏色來表示不同類型的檔案。如果您需要更詳細的訊息﹐可以加上 -l 的參數﹕

ls -l

您會看到這樣的結果﹕

-rw-r--r--   1 root  root   103 Oct 27 22:09 test.ls
-rw-r--r--   1 root  root   103 Oct 27 22:37 test.ls.copy
lrwxrwxrwx   1 root  root     7 Oct 27 22:37 test.ls.ln -> test.ls
drwxr-xr-x   2 root  root   024 Oct 27 22:37 test1-1   

這些訊息包括至少包括以下之項目:

例如:

可以獲得這樣的訊息﹕這是一個檔案﹐它的擁有者 root 對這個檔案具備‘讀(r)’和‘寫(w)’的權限﹐而屬於 root 這個群組的組員﹐都只具備‘讀(r)’的權限﹐其他的使用者也只具備‘讀(r)’的權限。

當您使用一個檔案的時候﹐會根據您目前的身份來判定您對該檔案擁有的權限。如果您就是該檔案的擁有者﹐那您就獲得 user 相關的權限﹔如果您不是它的 user﹐那麼看您是否屬於這個 group 裡面﹐然則您就獲得 group 的權限﹔如果您既不是 user﹐也不在 group 裡面﹐那您就獲得 others 的權限。

檔案被建立時, 依預設值設定。我們可以改變這些設定﹐下面讓我們輸入這幾個命令﹕

chmod u+x test.ls
chmod g+wx test.ls
chmod o+x test.ls

或是合為一句﹕
chmod u+x,g+wx,o+x test.ls

這個 chmod 命令是 change mode 的意思﹐第一行是為 user 增加 x 權限﹐第二行是為 group 增加 w 和 x 權限﹐而第三行則是為 others 增加 x 權限﹐如果您這時候再使用 ls -l 的話﹐您會看到 test.ls 的權限會變成﹕rwxrwxr-x 這樣的權限值。我們使用“+”來增加權限﹐如果使用“-”是刪除權限﹐如果使用“=”則是指定權限值。

chmod 777 test.ls

您會看到test.ls的權限會變成﹕rwxrwxrwx﹐也就是所有使用者都具備所有權限﹐因為我們給每一個使用者群都賦予‘7’這個數值﹐它分別是﹕1(x)+2(w)+4(r)的總和﹐如果是‘0’的話﹐就表示沒用任何權限。但事實上﹐權限值並的真正計算方法是以二進位進行的﹕

先讓我們看看 x,r,w 的 bit 位元表示方式﹕

x: 001
w: 010
r: 100

如果將全部位元做 AND 運算就是最終 permission﹕rwx 的位置都是 111 ﹐換成十進位就是 7 。

下面您如果輸入﹕

chmod 750 test.ls

您會發現權限會變成﹕rwxr-x---﹐算算看﹕

1) 將 750 換成二進位﹐就是﹕111,101,000
2) 分別將 rwx 的位置代入得﹕rwx,r-x,---
(說明﹕1 對應著的權限就打開﹐0 對應的就關閉)

umask

檔案被建立的時候﹐預設會獲得怎樣的權限呢﹖這個值可用 umask 來決定。

1.  umask 是在新建立一個檔案或目錄時, 檔案權限的遮罩值.(一般使用者是 002﹐root 則是 022)

運作方式 :

如果 umask 定為 022,

那麼一個新的檔案建立時, 其真正的權限應該是 666-022=644

新的目錄建立時, 其權限則是 777-022=755

2. 如何得知目前的 umask 值是多少呢?

輸入 umask

3. 如果您對一個目錄進行 umask 設定﹐那其後在這個目錄下面產生的新檔案﹐都會繼承目錄的 umask ﹐如﹕umask 002 ~/html/﹐那麼以後在家目錄的 html/ 裡面建立的新檔案﹐都具備 664 的權限。

chown user1.group1 test.ls

我們可以使用 chown 來改變檔案的 user 和 group (也可以使用 chgrp 來改變 group)﹕

這命令通常由 root 來執行﹐用“.”(或 : )將擁有者和群組分隔開就可以﹐當然﹐user 和 group 必須要事先被建立好。

 

Linux 對於目錄的權限, 另有一套看法:

r : 可列出目錄中的檔案名稱, 即 ls 有作用

w : 在該目錄中, 可刪檔,改檔名,建新檔

x : 可以進入該目錄之中(重要觀念, 用處大)

例如﹕在某個目錄中, 當您要建立、讀取或寫入一個檔案的時候﹐從 / 到當前目錄所經過的所有目錄﹐都必須有 x 權限。

用 chmod 和 chown 來改變一個目錄權限的時候﹐如果加上 -R 參數﹐那麼﹐目錄裡面的檔案和子目錄﹐都會更著被修改。

其中 -R 表示 Recursively change permissions of directories and their contents, 意即遞迴地將其下的所有檔案、目錄全數改變.

tips﹕例如﹐在架設網頁伺服器的時候﹐明明已經建立好目錄和網頁﹐為什麼還不能顯示﹖這是因為伺服器通常以 nobody 身份來讀取檔案系統的﹐如果從 / 到您存放網頁的目錄之間﹐只要其中一個目錄﹐對 others 來說沒有 x 的話﹐那就讀取不到網頁。

 

特殊權限 SUID, SGID, Sticky bit :

1. SUID (Set User ID) Bit

當您在 Linux 系統上面執行一個檔案的時候(具有 x permission)﹐這個檔案所執行的程式﹐所具備的權限﹐就以執行者的 ID 為準﹕如果您是 root﹐那麼這個程式也是以 root 的權限執行﹔如果您是 user1﹐那就以 user1 的權限執行。但如果﹐一個執行檔還具有 SUID 屬性的話﹐那這個程式所具有的權限﹐就不是命令的執行者﹐而是檔案的擁有者﹕如果一個檔案具備 SUID 屬性﹐它的 user 和 group 都是 root﹐而且 others 也具有 x 權限﹐那麼﹐當 user1 執行這個檔案的時候﹐程式所具有的權限就不是 user1 而是 root﹗

2. SGID (Set Group ID) bit

同樣﹐如果 SGID 打開﹐那麼這個被執行的程式也以這個程式之 goup 的權限來執行。

這樣的設計﹐是讓一些普通使用者以檔案擁有者的權限去執行某些程式。例如﹕某些程式﹐如 passwd (您可以輸入 ls -l /usr/bin/passwd 查看權限)﹐需要寫入檔案系統中使用者本身不能存取的位置(如 /etc/shadow)﹐如果沒有 SUID 和 SGID 屬性﹐那這樣的設計是沒辦法做到的。

3. sticky bit

 sticky bit (黏著位元)設定的時候﹐只有檔案的擁有者及root才能刪除這個檔案﹐其它使用者就算具有 w 的權限﹐也只能修改檔案的內容﹐而不能將檔案刪除。

如何設定 SUID ,  SGID及 Sticky bit 呢﹖

chmod 的第 4 個數字﹕如果是 4 就是 SUID﹔如果是 2 就是 SGID﹔如果是 1﹐則為sticky bit 。

例如﹕chmod 1777 /tmp 即設定了sticky bit。

 

如何知道已經做了設定?

可以使用 ls -al來查看, 在user, group及other的權限中會出現s,S或t,T的變化.

例如1:

ls -al tmp

-rwsr--r--   1 root  root   103 Oct 27 22:09 tmp

例如2:

ls -al tmp

-rwxr-Sr--   1 root  root   103 Oct 27 22:09 tmp

例如3:

ls -al tmp

-rwxr-xr-T   1 root  root   103 Oct 27 22:09 tmp

 

檔案的屬性( attributes ):

您可以使用 chattr 命令來改變一個檔案或目錄的屬性。常用的屬性有這些﹕

屬性 代表意思
a 在寫入的時候﹐只能延增﹐不能刪除現有內容。
c 核心會自動執行壓縮。
i 不能刪除、移動、link、寫入。
s 檔案刪除時﹐磁碟空間也會清理乾淨。
S 修改時直接寫入磁碟﹐而不是寫在 buffer 中。

善於運用檔案的屬性設定﹐可以保護檔案。例如﹐您或許不希望任何人修改 /bin 和 /sbin 裡面的檔案 (因為木馬程式通常都會修改那裡)﹐那您可以執行﹕

chattr +i /bin /sbin

然後﹐您試試在 /bin 和 /sbin 裡面新增或刪除檔案﹖應該不會成功的﹗如果您要看檔案或目錄的屬性﹐可以用 lsattr 命令﹕

lsattr -d /bin /sbin

如果拿掉 -d 就是看一般的檔案(和 ls 命令一樣)。而至於具體的屬性有哪些呢﹖您可以用 man chattr 來瞭解。