第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各目錄的名稱和安排﹐有一定的標準﹐底下針對上面幾個路徑來做說明:
- /bin :這是放 ls, mv, rm, mkdir, rmdir, gzip, tar, telnet, 及 ftp 等常用的執行檔的地方,而通常這個檔案的內容與 /usr/bin 是一樣的(有時候會使用連結檔);
- /boot :放置 Linux 核心與開機相關檔案的地方;
- /dev :擺放一些與裝置有關的檔案。基本上 Unix 或 Linux 系統均把裝置當成是一個檔案來看待,例如 /dev/fd0 代表軟碟,亦即 Windows 系統下的 A 槽,而 /dev/cdrom 則代表光碟!
- /etc :在開機過程中需要讀取的系統組態檔案均在這個目錄中,例如 Lilo 的參數、人員的帳號與密碼、系統的主要設定、http 架站的參數內容等,所以這個目錄,請記得一定要備份!
- /etc/rc.d :這個路徑主要在記錄一些開關機過程中的 scripts 檔案, scripts 有點像是 DOS 下的批次檔(.bat檔名);
- /etc/X11 :這是與 X windows 有關的設定檔;
- /home :這是系統預設的使用者的家目錄( home directory )!
- /lib :系統共享的函式庫(library);
- /lost+fount :系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下。你加裝一棵硬碟於 /disk 中,在這個目錄下就會自動產生一個這樣的目錄 /disk/lost+found,這是砍不掉的目錄;
- /mnt :這是軟碟與光碟接掛點的地方;通常軟碟掛在 /mnt/floppy 下,而光碟掛在 /mnt/cdrom 下;
- /proc :/proc並不是一個真正的檔案系統,不佔據任何硬碟空間,但是你可以"好像"使用真正的檔案系統一般,瀏覽該目錄下的檔案內容。 proc記錄UNIX系統程序(process)執行狀況,真正內容並非存在於硬碟,而是由核心根據系統及process狀況,透過這個虛擬的檔案系統,回應相關的系統相關的運作資訊。
- /root :系統管理員的家目錄;
- /sbin :放置一些系統管理常用的程式,例如: fdisk, mke2fs, fsck, mkswap, mount 等;
- /tmp :這是讓一般使用者暫時存放檔案的地方,你要定期的清理一下,重要資料最好不要放在這裡!
- /usr :裡面有相當多的使用者的應用程式與指令;
- /usr/bin :放置可執行程式,如前所說,這個目錄的檔案與 /bin 幾乎是相同的;
- /usr/lib :內含許多程式與子程式所需的函式庫;
- /usr/sbin :放置管理者使用程式,與 /sbin 相同;
- /usr/doc :放置系統說明文件的地方,(RedHat 7.0 以後改在 /usr/share/doc下);
- /usr/man :放置程式的說明檔的地方,(RedHat 7.0 以後放在 /usr/share/man );
- /usr/src :這是放置核心原始碼的預設目錄;
- /usr/X11R6 :X Window System存放相關檔案的目錄 。
- /var :這是系統在工作時,預設的工作目錄,也是登入或各類服務的問題發生時的記錄目錄,例如主機使用者的登入(log in)記錄資料、尚未寄出的郵件存放地、接收的郵件放置處等。所以當你的系統有問題時,就需要來這個目錄的檔案資料中察看問題的所在!
最後強調﹐UNIX作業系統下,所有設備均可視為檔案,並依檔案方式運作, 包括目錄本身也是一個特殊的檔案。所有的硬體設備﹐也必須在檔案系統上面有相對的檔案﹐例如﹐/dev/fd0 就是系統的第一個軟碟機。
UNIX檔案種類:
一般檔案(ordinary files)
原始程式、文件、資料…等。目錄檔案(directory files)
目錄檔用於涵括檔案,使檔案系統更加簡潔。特殊檔案(Special device files)
代表某種特殊硬體設備,通常存在於/dev目錄之下。此種檔案類型又可區分為區塊(block)及字元(Character)兩種。
- 區塊 (block) 設備檔: 所謂區塊設備檔, 就是儲存資料, 供人讀取的周邊, 如軟碟與硬碟的分割區 /dev/hda1 等。
- 字元 (character) 設備檔: 字元設備檔, 就是一個可以讀取序列字元的周邊, 如 keyboard , serial port 滑鼠, 終端機等。
符號鏈結檔(Symbolic link)
內容為一指標,指向檔案名稱所在 。
貳. 檔案系統管理
常用命令如下:
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):
UNIX系統是以所謂的inode號碼來識別檔案(用ls -i,你可以看到每一個檔案的indoe number)。所謂的 inode是一個單獨的儲存區, 用來描述某一個檔案的權限屬性、檔案大小及檔案資料存放區塊(Data block)位置等資訊. 每個檔案在建立之時, 系統即會配置一個專屬的inode, 其中含有代表該檔案的一個獨一無二的inode 編號.
利用檔案鏈結可以使一個檔案擁有多個檔名。
Hard Link
指令:ln file1 file2
file1為已存在之檔案,file2則是以上指令所產生之檔案鏈結;Hard Link的結果是”在File Table中產生一個新的檔名,指向一個已存在的inode”。地位上file1與file2相同,file1與file2必須同時被刪除才能真正刪除原有之檔案。
Hard Link不允許跨過不同的file system。而且不能用在目錄上面。
Symbolic Link(soft Link)
指令:ln -s file1 file2
file1為已存在之檔案,file2則是以上指令所產生之符號鏈結;Symbolic Link的結果是" 在File
Table中產生一個新的檔名file2,指向另一個已存在之檔名file1"。基本上刪除file1,與file2是否存在無關。
Symbolic Link允許跨過不同的file system。同時可以用在檔案和目錄上 。
Example:
cc301:~/test> ls -l kerm* |
為什麼我們要用 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 |
這些訊息包括至少包括以下之項目:
檔案模式
第一列的意思﹕
- : 表示這是一個常規檔案
d : 表示這是一個目錄
l : 表示這是一個 link
b : 特殊檔案(區塊)
c : 特殊檔案(字元)
檔案存取權限
接著其後的 9 個字母﹐分為三組﹕分別是分配給‘user (擁有者)’、‘group (群組)’、和‘others
(其他使用者)’這三個不同使用者群的權限﹔而其中每一組使用者可以擁有這些權限﹕‘r’表示 readable (可讀)、‘w’表示 writable
(可寫)、和‘x’表示 executable (可執行)。
鏈結個數
跟著是一個數字﹐是關於這個檔案的 hard link 數目,此鏈結個數不包含符號鏈結。
檔案擁有者
擁有此一檔案之使用者名稱, 通常是建立這個檔案的使用者。
群組
此一檔案所屬之群組。
檔案大小
單位為byte。
修改日期
此檔案最後一次被修改日期。
檔名
檔案名稱
例如:
可以獲得這樣的訊息﹕這是一個檔案﹐它的擁有者 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 來瞭解。