原文出處:http://www.92csz.com/study/linux/6.htm
作者:clairelume
在linux中什麼是一個文件的路徑呢,說白了就是這個文件存在的地方,例如在上一章提到的/root/.ssh/authorized_keys 這就是一個文件的路徑。如果你告訴系統這個文件的路徑,那麼系統就可以找到這個文件。在linux的世界中,存在着絕對路徑和相對路徑。
絕對路徑:路徑的寫法一定由根目錄”/”寫起,例如/usr/local/mysql 這就是絕對路徑。
相對路徑:路徑的寫法不是由根目錄”/”寫起,例如,首先用戶進入到/ 然後再進入到home ,命令爲 cd /home 然後 cd test 此時用戶所在的路徑爲 /home/test 。第一個cd命令後跟 /home 第二個cd命令後跟test ,並沒有斜槓,這個test是相對於/home 目錄來講的,所以叫做相對路徑。
pwd 這個命令打印出當前所在目錄
cd 進入到某一個目錄
./ 指的是當前目錄
../ 指的是當前目錄的上一級目錄。
上圖中,首先進入到/usr/local/lib/ 目錄下,然後再進入 ./ 其實還是進入到當前目錄下,用pwd查看當前目錄,並沒有發生變化,然後再進入../ 則是進入到了/usr/local/目錄下,即/usr/local/lib目錄的上一級目錄。你看明白了嗎?
mkdir 創建一個目錄,這個命令在上一章節中提及過。mkdir 其實就是make directory的縮寫。其語法爲 mkdir [-mp] [目錄名稱] ,其中-m , –p 爲其選項,-m:這個參數用來指定要創建目錄的權限,該參數不常用,所以筆者不做重點解釋。-p:這個參數很管用的,先來做個試驗,你會一目瞭然的。
當我們想創建 /tmp/test/123 目錄,可是提示不能創建,原因是/tmp/test目錄不存在,你會說,這個linux怎麼這樣傻,/tmp/test目錄不存在就自動創建不就OK了嘛,的確linux確實很傻,如果它發現要創建的目錄的上一級目錄不存在就會報錯。然後linux也爲我們想好了解決辦法,即-p參數。
你看到這裏,是不是明白-p參數的作用了?沒錯,它的作用就是遞歸創建目錄,即使上級目錄不存在。還有一種情況就是如果你想要創建的目錄存在的話,會提示報錯,然後你加上-p參數後,就不會報錯了。
rmdir 刪除一個目錄。
rmdir 其實是rmove directory 縮寫,其只有一個選項-p 類似與mkdir命令,這個參數的作用是將上級目錄一起刪除。舉個例子吧,新建目錄mkdir -p d1/d2/d3 ,rmdir -p d1/d2/d3相當於是刪除了d1,d1/d2, d1/d2/d3。如果一個目錄中還有目錄,那麼當你直接rmdir 該目錄時,會提示該目錄不爲空,不能刪除。如果你非要刪除不爲空的目錄,那你用rm指令吧。
rm 刪除目錄或者文件
rmdir 只能刪除目錄但不能刪除文件,要想刪除一個文件,則要用rm命令了。rm同樣也有很多選項。你可以通過 man rm 來獲得詳細幫助信息。在這裏筆者只列舉較常用的幾個選項。
-f 強制的意思,如果不加這個選項,當刪除一個不存在的文件時會報錯。
-i 這個選項的作用是,當用戶刪除一個文件時會提示用戶是否真的刪除。
如果刪除,輸入y 否則輸入 n
-r 當刪除目錄時,加該選項,如果不加這個選項會報錯。rm是可以刪除不爲空的目錄的。
你會發現,筆者在列舉的rm例子中使用的是絕對路徑,而ls 則使用的相對路徑。這是爲什麼呢?
which 用來查找一個命令的絕對路徑,這個命令筆者不詳細介紹,因爲平時筆者只用來查找一個命令的絕對路徑。
alias 用來設置指令的別名。語法:alias[別名]=[指令名稱],例如 alias rm='rm -i' ,即當我們使用rm命令時,實際上是使用的是rm –i ,而用絕對路徑的/bin/rm 則不會被alias,該命令在以後章節中會詳細介紹。
【環境變量PATH】
上邊提到了alias,也提到了絕對路徑的/bin/rm ,然後你意識到沒有,爲什麼我們輸入很多命令時是直接打出了命令,而沒有去使用這些命令的絕對路徑?這是因爲環境變量PATH在起作用了。請輸入 echo $PATH,這裏的echo其實就是打印的意思,而PATH前面的$表示後面接的是變量。
因爲/bin 在PATH的設定中,所以自然就可以找到ls了。如果你將 ls 移動到 /root 底下的話,然後你自己本身也在 /root 底下,但是當你執行 ls 的時候,他就是不理你?怎麼辦?這是因爲 PATH 沒有 /root 這個目錄,而你又將 ls 移動到 /root 底下了,自然系統就找不到可執行文件了,因此就會告訴你, command not found !那麼該怎麼克服這種問題呢?
有兩個方法,一種方法是直接將 /root 的路徑加入 PATH 當中!如何增加?可以使用:
PATH=”$PATH”:/root
另一種方式則是使用完整檔名,亦即直接使用相對或絕對路徑來執行,例如:
/root/ls
./ls
關於rm,筆者使用最多便是-rf兩個選項合用了。不管刪除文件還是目錄都可以。但是方便的同時也要多注意,萬一你的手太快後邊跟了/那樣就會把你的系統文件全部刪除的,切記切記。
ls 在前面的命令中多次用到它。現在你已經明白它的含義了吧。沒有錯,就是查看某個目錄或者某個文件,是list的簡寫。ls 後可以跟一個目錄,也可以跟一個文件。以下是ls的選項,在這裏筆者並沒有完全列出,只是列出了平時使用最多的選項。其他選項,你可以自行通過man ls 查詢。
-a 全部的檔案都列出,包括隱藏的。linux文件系統中同樣也有隱藏文件。這些隱藏文件的文件名是以.開頭的。例如.test, /root/.123, /root/.ssh 等等,隱藏文件可以是目錄也可以是普通文件。
-l 詳細列出文件的屬性信息,包括大小、創建日期、所屬主所屬組等等。ll 這個命令等同於ls –l 。
--color=never/always/auto never即不要顯示顏色,always 即總顯示顏色,auto 是由系統自行判斷。在Redhat/CentOS 系統中,默認是帶顏色的,因爲我們平時用的ls已經alias成了ls –color=tty 所以目錄的顏色是藍色的,而可執行文件的顏色是綠色。這樣有助於幫我們區分文件的格式。
-d 後邊跟目錄,如果不加這個選項則列出目錄下的文件,加上後只列車目錄本身。
cp copy的簡寫,即拷貝。格式爲 cp [選項] [ 來源文件 ] [目的文件] ,例如我想把test1 拷貝成test2 ,這樣即可 cp test1 test2,以下介紹幾個常用的選項
-d 這裏涉及到一個“連接”的概念。連接分爲軟連接和硬連接。在以後的章節中會詳細解釋,現在你只要明白這裏的軟連接跟windows中的快捷方式類似即可。如果不加這個-d 則拷貝軟連接時會把軟連接的目標文件拷貝過去,而加上後,其實只是拷貝了一個連接文件(即快捷方式)。
上例中的ln 命令即爲建立連接的,以後再做詳細解釋。
-r 如果你要拷貝一個目錄,必須要加-r選項,否則你是拷貝不了目錄的。
-i 如果遇到一個存在的文件,會問是否覆蓋。在Redhat/CentOS系統中,我們使用的cp其實是cp –i
下面簡單做一個小試驗,很快你就會明白-i 選項的作用了。
上例中,touch 命令,看字面意思就是摸一下,沒錯,如果有這個文件,則會改變文件的訪問時間,如果沒有這個文件就會創建這個文件。前面說過echo,其實就是打印,在這裏所echo的內容”abc” 和 “def”並沒有顯示在屏幕上,而是分別寫進了文件 111和222, 其寫入作用的就是這個大於號”>” 在linux中這叫做重定向,即把前面產生的輸出寫入到後面的文件中。在以後的章節中會做詳細介紹,這裏你要明白它的含義即可。而cat 命令則是讀一個文件,並把讀出的內容打印到當前屏幕上。該命令也會在後續章節中詳細介紹。
-u 該選項僅當目標文件存在時纔會生效,如果源文件比目標文件新纔會拷貝,否則不做任何動作。
mv 移動的意思,是move的簡寫。格式爲 mv [ 選項 ] [源文件] [目標文件],下面介紹幾個常用的選項。
-i 和cp的-i 一樣,當目標文件存在時會問用戶是否要覆蓋。在Redhat/CentOS系統中,我們使用的mv其實是mv –i
-u 和上邊cp 命令的-u選項一個作用,當目標文件存在時纔會生效,如果源文件比目標文件新纔會移動,否則不做任何動作。
該命令有集中情況,你注意到了嗎?
1) 目標文件是目錄,而且目標文件不存在;
2) 目標文件是目錄,而且目標文件存在;
3) 目標文件不是目錄不存在;
4) 目標文件不是目錄存在;
目標文件是目錄,存在和不存在,移動的結果是不一樣的,如果存在,則會把源文件移動到目標文件目錄中。不存在的話移動完後,目標文件是一個文件。這樣說也許你會覺得有點不好理解,看例子吧。
windows下的重命名,在linux下用mv就可以搞定。
cat 比較常用的一個命令,即查看一個文件的內容並顯示在屏幕上。
-n 查看文件時,把行號也顯示到屏幕上。
上例中出現了一個”>>”,這個符號跟前面介紹的”>”的作用都是重定向,即把前面輸出的東西輸入到後邊的文件中,只是”>>”是追加的意思,而用”>”,如果文件中有內容則會刪除文件中內容,而”>>”則不會。
-A 顯示所有東西出來,包括特殊字符
tac 其實是cat的反寫,同樣的功能也是反向打印文件的內容到屏幕上。
more 也是用來查看一個文件的內容。當文件內容太多,一屏幕不能佔下,而你用cat肯定是看不前面的內容的,那麼使用more就可以解決這個問題了。當看完一屏後按空格鍵繼續看下一屏。但看完所有內容後就會退出。如果你想提前退出,只需按q鍵即可。
less 作用跟more一樣,但比more好在可以上翻,下翻。空格鍵同樣可以翻頁,而按”j”鍵可以向下移動(按一下就向下移動一行),按”k”鍵向上移動。在使用more和less查看某個文件時,你可以按一下”/” 鍵,然後輸入一個word回車,這樣就可以查找這個word了。如果是多個該word可以按”n”鍵顯示下一個。另外你也可以不按”/”而是按”?”後邊同樣跟word來搜索這個word,唯一不同的是,”/”是在當前行向下搜索,而”?”是在當前行向上搜索。
head head後直接跟文件名,則顯示文件的前十行。如果加 –n 選項則顯示文件前n行。
tail 和head一樣,後面直接跟文件名,則顯示文件最後十行。如果加-n 選項則顯示文件最後n行。
-f 動態顯示文件的最後十行,如果文件是不斷增加的,則用-f 選項。如:tail -f /var/log/messages
【文件的所屬主以及所屬組】
一個linux目錄或者文件,都會有一個所屬主和所屬組。所屬主,即文件的擁有者,而所屬組,即該文件所屬主所在的一個組。Linux這樣設置文件屬性的目的是爲了文件的安全。例如,test文件的所屬主是user0 而test1文件的所屬主是user1,那麼user1是不能查看test文件的,相應的user0也不能查看test1文件。然後有這樣一個應用,我想創建一個文件同時讓user0和user1來查看怎麼辦呢?
這時“所屬組”就派上用場了。即,創建一個羣組users,讓user0和user1同屬於users組,然後建立一個文件test2,且其所屬組爲users,那麼user0和user1都可以訪問test2文件。
Linux文件屬性不僅規定了所屬主和所屬組,還規定了所屬主(user)、所屬組(group)以及其他用戶(others)對該文件的權限。你可以通過ls -l 來查看這些屬性。
【linux文件屬性】
上例中,用ls –l 查看當前目錄下的文件時,共顯示了9列內容(用空格劃分列),都代表了什麼含義呢?
第1列,包含的東西有該文件類型和所屬主、所屬組以及其他用戶對該文件的權限。第一列共10位。其中第一位用來描述該文件的類型。上例中,我們看到的類型有”d”, “-“ ,其實除了這兩種外還有”l”, “b”, “c”,”s”等。
d 表示該文件爲目錄;
- 表示該文件爲普通文件;
l 表示該文件爲連接文件(linux file),上邊提到的軟連接即爲該類型;
b 表示該文件爲塊設備文件,比如磁盤分區
c 表示該文件爲串行端口設備,例如鍵盤、鼠標。
s 表示該文件爲套接字文件(socket),用於進程間通信。
後邊的9位,每三個爲一組。均爲rwx 三個參數的組合。其中r 代表可讀,w代表可寫,x代表可執行。前三位爲所屬主(user)的權限,中間三位爲所屬組(group)的權限,最後三位爲其他非本羣組(others)的權限。下面拿一個具體的例子來述說一下。
一個文件的屬性爲-rwxr-xr-- ,它代表的意思是,該文件爲普通文件,文件擁有者可讀可寫可執行,文件所屬組對其可讀不可寫可執行,其他用戶對其只可讀。
對於一個目錄來講,打開這個目錄即爲執行這個目錄,所以任何一個目錄必須要有x權限才能打開並查看該目錄。例如一個目錄的屬性爲 drwxr--r-- 其所屬主爲root,那麼除了root外的其他用戶是不能打開這個目錄的。
第2列,表示爲連接佔用的節點(inode),若爲目錄時,通常與該目錄地下還有多少目錄有關係,關於連接(link)在以後章節詳細介紹。
第3列,表示該文件的所屬主。
第4列,表示該文件的所屬組。
第5列,表示該文件的大小。
第6列、第7列和第8列爲該文件的創建日期或者最近的修改日期,分別爲月份日期以及時間。
第9列,文件名。如果前面有一個. 則表示該文件爲隱藏文件。
【更改文件的權限】
更改文件的權限,也就是更改所屬主、所屬組以及他們對應的讀寫執行權限。
1)更改所屬組 chgrp
語法:chgrp [組名] [文件名]
這裏用到了groupadd 命令,其含義即增加一個用戶組。該命令在以後章節中做詳細介紹,你只要知道它是用來增加用戶組的即可。
2)更改文件的所屬主 chown
語法:chown [ -R ] 賬戶名 文件名
chown [ -R ] 賬戶名:組名 文件名
這裏的-R選項只作用於目錄,作用是級聯更改,即不僅更改當前目錄,連目錄裏的目錄或者文件全部更改。
useradd 是增加一個賬戶,以後會詳細介紹。上例中,首先建立一個目錄test,然後在test目錄下創建一個普通文件test2,因爲是以root的身份創建的目錄和文件,所以所屬主以及所屬組都是root。chown user1 test 這使test的目錄所屬主由root變爲了user1 ,然後test目錄下的test2文件所屬主以及所屬組還是root。接着 chown –R user1:testgroup test 這樣把test連同test目錄下的test2 的所屬主以及所屬組都改變了。
3)改變用戶對文件的讀寫執行權限 chmod
在linux中爲了方便更改這些權限,linux使用數字去代替rwx ,具體規則爲r: 4 w:2 x:1 -:0 舉個例子,-rwxrwx---用數字表示就是 770,具體是這樣來的:
rwx = 4+2+1=7; rwx= 4+2+1=7; --- = 0+0+0=0
chmod 語法: chmod [-R] xyz 文件名 (這裏的xyz,表示數字)
-R 選項作用同chown,級聯更改。
值得提一下的是,在linux系統中,默認一個目錄的權限爲 755,而一個文件的默認權限爲644.
如果你創建了一個目錄,而該目錄不想讓其他人看到內容,則只需設置成 rwxr----- (740) 即可。
chmod 還支持使用rwx的方式來設置權限。!從之前的介紹中我們可以發現,基本上就九個屬性分別是(1)user (2)group (3)others 三羣啦!那麼我們就可以藉由 u, g, o 來代表三羣的屬性!此外, a 則代表 all 亦即全部的三羣!那麼讀寫的屬性就可以寫成了 r, w, x!也就是可以使用底下的方式來看:
現在我想把一個文件設置成這樣的權限 rwxr-xr-x (755),使用這種方式改變權限的命令爲
另外還可以針對u, g, o, a增加或者減少某個權限(讀,寫,執行),例如
另外linux下還有兩個比較特殊的權限s和t,請點擊linux下文件的特殊權限s和t
umask
上邊也提到了默認情況下,目錄權限值爲766,普通文件權限值爲644。那麼這個值是由誰規定呢?追究其原因就涉及到了umask。
umask語法: umask xxx (這裏的xxx代表三個數字)
查看umask值只要輸入umask然後回車。 umask預設是0022,其代表什麼含義?先看一下下面的規則:
1)若用戶建立爲普通文件,則預設“沒有可執行權限”,只有rw兩個權限。最大爲666(-rw-rw-rw-)
2)若用戶建立爲目錄,則預設所有權限均開放,即777(drwxrwxrwx)
umask數值代表的含義爲,上邊兩條規則中的默認值(文件爲666,目錄爲777)需要減掉的權限。所以目錄的權限爲(rwxrwxrwx) – (----w--w-) = (rwxr-xr-x),普通文件的權限爲(rw-rw-rw-) – (----w--w-) = (rw-r--r--)。umask的值是可以自定義的,比如設定umask 爲 002,你再創建目錄或者文件時,默認權限分別爲(rwxrwxrwx) – (-------w-) = (rwxrwxr-x)和(rw-rw-rw-) – (-------w-) = (rw-rw-r--)。
umask 可以在/etc/bashrc裏面更改,預設情況下,root的umask爲022,而一般使用者則爲002,因爲可寫的權限非常重要,因此預設會去掉寫權限。
chattr 修改文件的特殊屬性
語法: chattr [+-=][ASaci [文件或者目錄名]
+-= :分別爲增加、減少、設定
A:增加該屬性後,文件或目錄的atime將不可被修改;
S:增加該屬性後,會將數據同步寫入磁盤中;
a:增加該屬性後,只能追加不能刪除,非root用戶不能設定該屬性;
c:自動壓縮該文件,讀取時會自動解壓;
i:增加後,使文件不能被刪除、重命名、設定連接、寫入、新增數據;
增加i屬性後不能在該目錄中建立文件。
增加a屬性後,只能追加不能刪除。
lsattr 列出文件/目錄的特殊屬性
語法: lsattr [-aR] [文件/目錄名]
-a:類似與ls 的-a 選項,即連同隱藏文件一同列出;
-R:連同子目錄的數據一同列出
在上例中,test4是在test3目錄增加a屬性後建立的,所以test4也有a屬性,通過這個例子可以看出,chattr 的屬性是級聯生效的,不僅對當前目錄生效而且會對目錄下的文件同樣生效。
【在linux下搜索一個文件】
在windows下有一個搜索工具,可以讓我們很快的找到一個文件,這是很有用的。然而在linux下搜索功能更加強大。
which 用來查找可執行文件的絕對路徑。
在前面章節中已經多次用到該命令,需要注意的一點是,which只能用來查找PATH環境變量中出現的路徑下的可執行文件。這個命令用的也是蠻多的,有時候我們不知道某個命令的絕對路徑,which一下很容易就知道了。
當查找的文件在PATH變量中並沒有時,就會報錯。
whereis 通過預先生成的一個文件列表庫去查找跟給出的文件名相關的文件。
語法: whereis [-bmsu] [文件名稱]
-b:只找binary 文件
-m:只找在說明文件manual路徑下的文件
-s:只找source來源文件
-u:沒有說明檔的文件
說明:whereis 筆者幾乎很少用到,如果你感興趣請深入研究。
locate 類似於whereis,也是通過查找預先生成的文件列表庫來告訴用戶要查找的文件在哪裏。後邊直接跟文件名。如果你的linux沒有這個命令,請安裝軟件包 mlocate ,這個軟件包在你的系統安裝盤裏,後綴名是RPM,隨後介紹的find命令會告訴你如何查找這個包。如果你裝的CentOS你可以使用這個命令來安裝 yum install –y mlocate 。 前提是你的CentOS能連互聯網。至於yum這個命令如何使用,到後續章節你自然會明白。如果你剛裝上這個命令,初次使用會報錯。
這是因爲系統還沒有生成那個文件列表庫。你可以使用updatedb 命令立即生成(更新)這個庫。如果你的服務器上正跑着重要的業務,那麼你最好不要去運行這個命令,因爲一旦運行,服務器的壓力會變大。這個數據庫默認情況下每週更新一次。所以你用locate命令去搜索一個文件,正好是在兩次更新時間段內,那你肯定是得不到結果的。你可以到/etc/updated.conf 去配置這個數據庫生成(更新)的規則。locate命令筆者用的也並不多,所以你只要明白有這麼一個東西即可。你用到時再去深究其用法吧。
find 這個搜索工具是筆者用的最多的一個,所以請你務必要熟悉它。
語法: find [路徑] [參數] 下面介紹幾個筆者經常用的參數
-atime +n :訪問或執行時間大於n天的文件
-ctime +n :寫入、更改inode屬性(例如更改所有者、權限或者連接)時間大於n天的文件
-mtime +n :寫入時間大於n天的文件
看到這裏,你對這三個time是不是有些暈了,那筆者就先給你介紹一下這三個time屬性。
文件的 Access time,atime 是在讀取文件或者執行文件時更改的。文件的 Modified time,mtime 是在寫入文件時隨文件內容的更改而更改的。文件的 Create time,ctime 是在寫入文件、更改所有者、權限或鏈接設置時隨 Inode 的內容更改而更改的。 因此,更改文件的內容即會更改 mtime 和 ctime,但是文件的 ctime 可能會在 mtime 未發生任何變化時更改,例如,更改了文件的權限,但是文件內容沒有變化。 如何獲得一個文件的atime mtime 以及ctime ?
ls -l 命令可用來列出文件的 atime、ctime 和 mtime。
ls -lc filename 列出文件的 ctime
ls -lu filename 列出文件的 atime
ls -l filename 列出文件的 mtime
atime不一定在訪問文件之後被修改,因爲:使用ext3文件系統的時候,如果在mount的時候使用了noatime參數那麼就不會更新atime的信息。而這是加了 noatime 取消了, 不代表真實情況。反正, 這三個 time stamp 都放在 inode 中。若 mtime, atime 修改inode 就一定會改, 既然 inode 改了, 那 ctime 也就跟著要改了。
繼續講find常用的參數。
-name filename 直接查找該文件名的文件,這個使用最多了。
-type type :通過文件類型查找。文件類型在前面部分已經簡單介紹過,相信你已經大體上了解了。type 包含了 f, b, c, d, l, s 等等。後續的內容還會介紹文件類型的。
【linux的文件系統】
搞計算機的應該都知道windows的系統格式化硬盤時會指定格式,fat 或者 ntfs。而linux的文件系統格式爲Ext2,或者Ext3 。早期的linux使用Ext2格式,目前的linux都使用了Ext3。 Ext2文件系統雖然是高效穩定的。但是,隨着Linux系統在關鍵業務中的應用,Linux文件系統的弱點也漸漸顯露出來了,因爲Ext2文件系統是非日誌文件系統。這在關鍵行業的應用是一個致命的弱點。Ext3文件系統是直接從Ext2文件系統發展而來,Ext3文件系統帶有日誌功能,可以跟蹤記錄文件系統的變化,並將變化內容寫入日誌,寫操作首先是對日誌記錄文件進行操作,若整個寫操作由於某種原因 (如系統掉電) 而中斷,系統重啓時,會根據日誌記錄來恢復中斷前的寫操作,而且這個過程費時極短。目前Ext3文件系統已經非常穩定可靠。它完全兼容Ext2文件系統。用戶可以平滑地過渡到一個日誌功能健全的文件系統中來。這實際上了也是ext3日誌文件系統初始設計的初衷。
Linux文件系統在windows中是不能識別的,但是在linux系統中你可以掛載的windows的文件系統,linux目前支持MS-DOS,VFAT,FAT,BSD等格式。如果你使用的是Redhat或者CentOS,那麼你不要妄圖掛載NFS格式的文件到linux下,因爲它不支持NFS。雖然有些版本的linux支持NFS,但不建議使用,因爲目前的技術還不成熟。
Ext3文件系統爲Redhat/CentOS默認使用的文件系統,除了Ext3文件系統外,有些linux發行版例如SuSE默認的文件系統爲reiserFS ,Ext3 獨特的優點就是易於轉換,很容易在 Ext2 和 Ext3 之間相互轉換,而具有良好的兼容性,其它優點 ReiserFS 都有,而且還比它做得更好。如高效的磁盤空間利用和獨特的搜尋方式都是Ext3 所不具備的,速度上它也不能和 ReiserFS相媲美,在實際使用過程中,reiserFS 也更加安全高效,據說反刪除功能也不錯。
ReiserFS 的優勢在於,它是基於 B*Tree 快速平衡樹這種高效算法的文件系統,例如在處理小於 1k 的文件比 Ext3 快 10 倍。再一個就是 ReiserFS 空間浪費較少,它不會對一些小文件分配 inode,而是打包存放在同一個磁盤塊 (簇) 中,Ext2/Ext3 是把它們單獨存放在不同的簇上,如簇大小爲 4k,那麼 2 個 100 字節的文件會佔用 2 個簇,ReiserFS 則只佔用一個。當然 ReiserFS 也有缺點,就是每升級一個版本,都要將磁盤重新格式化一次。
【linux文件類型】
在前面的內容中簡單介紹了普通文件(-),目錄(d)等,在linux文件系統中,主要有以下幾種類型的文件。
1)正規文件(regular file):就是一般類型的文件,當用ls –l 查看某個目錄時,第一個屬性爲”-“的文件就是正規文件,或者叫普通文件。正規文件又可分成純文字文件(ascii)和二進制文件(binary)。純文本文件是可以通過cat, more, less等工具直接查看內容的,而二進制文件並不能。例如我們用的命令/bin/ls 這就是一個二進制文件。
2)目錄(directory):這個很容易理解,就是目錄,跟windows下的文件夾一個意思,只不過在linux中我們不叫文件夾,而是叫做目錄。ls –l 查看第一個屬性爲”d”。
3)連接檔(link):ls –l 查看第一個屬性爲 “l”,類似windows下的快捷方式。這種文件在linux中很常見,而且筆者在日常的系統運維工作中用的很多,所以你要特意留意一下這種類型的文件。在後續章節筆者會介紹。
4)設備檔(device):與系統周邊相關的一些檔案,通常都集中在 /dev 這個目錄之下!通常又分爲兩種:區塊 (block) 設備檔 :就是一些儲存數據,以提供系統存取的接口設備,簡單的說就是硬盤啦!例如你的一號硬盤的代碼是 /dev/hda1 等等的檔案啦!第一個屬性爲 “ b “;字符 (character) 設備檔 :亦即是一些串行端口的接口設備,例如鍵盤、鼠標等等!第一個屬性爲 “ c “。
* linux 文件後綴名
對於後綴名這個概念,相信你不陌生吧。在linux系統中,文件的後綴名並沒有具體意義,也就是說,你加或者不加,都無所謂。但是爲了容易區分,linux愛好者們都習慣給文件加一個後綴名,這樣當用戶看到這個文件名時就會很快想到它到底是一個什麼文件。例如1.sh, 2.tar.gz, my.cnf, test.zip等等,如果你首次接觸這些文件,你也許會感到很暈,沒有關係,隨着學習的深入,你就會逐漸的瞭解這些文件了。筆者所列舉的幾個文件名中1.sh代表它是一個shell script ,2.tar.gz 代表它是一個壓縮包,my.cnf 代表它是一個配置文件,test.zip 代表它是一個壓縮文件。
另外需要你知道的是,早期Unix系統文件名最多允許14個字符,而新的Unix或者linux系統中,文件名最長可以到達 256 個字符!
【linux中的連接檔】
在講連接檔之前,需要你先理解inode的概念。什麼是inode呢?這就需要你知道磁盤的整體構造。磁盤是有多個盤片(類似與光盤)重疊在一起構成的,而每個盤片上會有一個可以移動的磁頭,這個磁頭的作用就是用來讀寫數據的。磁頭並不是一直在動,當磁頭固定時,盤片轉一圈,這一圈就是一個磁道了。很多個盤片同半徑的那一圈的磁道總和稱爲磁柱。而由圓心向外畫出直線,可以得到一個個扇區,如圖二所示,一個扇區的物理量大約是 512 bytes ( 約 0.5K )。
圖一
圖二
知道了大體的硬盤構造之後,再來談一談怎麼硬盤分割( partition )呢?我們在進行硬盤分割的時候,最小都是以磁柱爲單位進行分割的,那麼分割完成之後自然就是格式化( format )囉,在 Linux 裏面我們在進行格式化的時候必須要考慮到 Block 與 inode 的信息,這個 block 還好理解,他是我們磁盤可以記錄的最小單位,是由數個 sector 所組成的,所以他的大小通常爲 n*512 bytes ,例如 4K 。那麼 inode 是什麼? Block 是記錄“檔案內容數據”的地區,而 inode 則是記錄“該檔案的屬性、及該檔案放置在哪一個 Block 之內”的信息!所以,每個檔案都會佔用到至少一個 inode 。而當我們 Linux 系統要找到這個檔案時,他會先去搜尋 inode table 找到這個檔案的屬性及數據放置的地區,然後再到數據去找到數據存放的 Block 進而將數據取出利用。這個 inode 數目在一開始就會被設定好,他的設定方式通常是利用 ( 硬盤大小 / 一個容量 ),這個容量至少應該比 Block 要大一些較佳,例如剛剛的 Block 訂爲 4K ,那麼 inode 可以訂爲 8K 左右。所以,一顆 1GB 的硬盤,如果以 8K 來規劃他的 inode 數時,他的 inode 就會有 131072 個 inode 啦!而一個 inode 的大小爲 128 bytes 這麼大!這麼一來的話,我們就可以清楚的知道了,那就是一個 partition 格式化爲一個 filesystem 之後,基本上,他一定會有 inode table 與 data area 兩個區塊,一個用來記錄檔案的信息與該檔案放置的 block 區塊,一個用來記錄檔案的內容!
由於我們 Linux 在讀取數據的時候,是先查詢 inode table 以得到數據是放在那個 Block 裏面,然後再去該 Block 裏面讀取真正的數據內容!然後,那個 block 是我們在格式化硬盤的時候規定出來的一個值,這個 block 是由 2 的 n 次方個sector 所集結而成的!所以,他是 0.5K 的倍數!假設我們 block 規劃爲 4KBytes 好了,那麼由於一個 inode 與一個block 最多均只紀錄一個檔案,所以,如果你的一個檔案有 0.1 K bytes 這麼大時,你要曉得的是,由於你的 block 爲 4K bytes ,因此,你就會有 3.9 Kbytes 的空間浪費掉!所以,當你在格式化硬盤的時候,請千萬注意到你的系統未來的使用方向。