5.6 更改文件的權(quán)限
上面講了那么多文件的屬性,你雖然不能一下子明白每列信息所表示的具體含義,但隨著后續(xù)章節(jié)的逐步深入,阿銘相信你一定能理解和掌握它們。
5.6.1 命令chgrp
chgrp(change group的簡(jiǎn)寫(xiě))命令可以更改文件的所屬組,其格式為:chgrp?[組名] [文件名],示例命令如下:
?
# groupadd testgroup # mkdir /tmp/4_6 //創(chuàng)建實(shí)驗(yàn)用的目錄 # cd /tmp/4_6 # touch test1 # ls -l test1 -rw-r--r-- 1 root 0 12月 30 07:43 test1 # chgrp testgroup test1 # ls -l test1 -rw-r--r-- 1 root testgroup 0 12月 30 07:43 test1
?
上例中用到了groupadd命令,其含義為增加一個(gè)用戶組。
chgrp命令還可以更改目錄的所屬組,示例命令如下:
?
# mkdir dir2 # touch dir2/test2 # ls –ld dir2 drwxr-xr-x 2 root 19 12月 30 07:44 dir2 # chgrp testgroup dir2 # ls -ld dir2 drwxr-xr-x 2 root testgroup 19 12月 30 07:44 dir2 # ls –l dir2 總用量 0 -rw-r--r-- 1 root 0 12月 30 07:44 test2
?
上例中,chgrp命令只更改了目錄本身,而目錄下的文件并沒(méi)有更改。如果要想級(jí)聯(lián)更改子目錄以及子文件,加-R選項(xiàng)可以實(shí)現(xiàn),示例命令如下:
?
# chgrp -R testgroup dir2 # ls -l dir2 總用量 0 -rw-r--r-- 1 root testgroup 0 12月 30 07:44 test2
?
chgrp命令阿銘不常用,因?yàn)檫€有一個(gè)命令可以替代它,那就是chown。
5.6.2 命令chown
chown(change owner的簡(jiǎn)寫(xiě))命令可以更改文件的所有者,其格式為:chown [ -R ]?賬戶名 文件名或者chown [ -R ]?賬戶名:組名 文件名。這里的-R選項(xiàng)只適用于目錄,作用是級(jí)聯(lián)更改,即不僅更改當(dāng)前目錄,連目錄里的目錄或者文件也全部更改。示例命令如下:
?
# mkdir dir3 # useradd user1 // 創(chuàng)建用戶user1,useradd命令會(huì)在5.2.3節(jié)中介紹 # touch dir3/test3 // 在dir3目錄下創(chuàng)建test3文件 # chown user1 dir3 # ls -ld dir3 // dir3目錄所有者已經(jīng)由root改為user1 drwxr-xr-x 2 user1 root 19 12月 30 07:46 dir3 # ls -l dir3 // 但是dir3目錄下的test3文件的所有者依舊是root 總用量 0 -rw-r--r-- 1 root 0 12月 30 07:46 test3 # chown -R user1:testgroup dir3 # ls -l dir3 總用量 0 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 test3
?
上例中,chown -R user1:testgroup會(huì)把test目錄以及該目錄下的文件都修改成所有者為user1,所屬組為testgroup。
5.6.3 命令chmod
為了方便更改文件的權(quán)限,Linux使用數(shù)字代替rwx,具體規(guī)則為:r等于4,w等于2,x等于1,-等于0。例如,rwxrwx---用數(shù)字表示就是770,其具體算法為:rwx=4+2+1=7,rwx=4+2+1=7,---=0+0+0=0。
命令chmod(change mode的簡(jiǎn)寫(xiě))用于改變用戶對(duì)文件/目錄的讀寫(xiě)執(zhí)行權(quán)限,其格式為:chmod [-R] xyz?文件名(這里的xyz表示數(shù)字)。其中,-R選項(xiàng)的作用等同于chown命令的-R選項(xiàng),也表示級(jí)聯(lián)更改。值得注意的是,在Linux系統(tǒng)中,一個(gè)目錄的默認(rèn)權(quán)限為755,而一個(gè)文件的默認(rèn)權(quán)限為644。下面我們舉例說(shuō)明一下:
?
# ls -ld dir3 drwxr-xr-x 2 user1 testgroup 19 12月 30 07:46 dir3 # ls -l dir3 總用量 0 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 test3 # chmod 750 dir3 # ls -ld dir3 drwxr-x--- 2 user1 testgroup 19 12月 30 07:46 dir3 # ls -l dir3/test3 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 dir3/test3 # chmod 700 dir3/test3 # ls -l dir3/test3 -rwx------ 1 user1 testgroup 0 12月 30 07:46 dir3/test3 # chmod -R 700 dir3 # ls -ld dir3 drwx------ 2 user1 testgroup 19 12月 30 07:46 dir3 # ls -l dir3 總用量 0 -rwx------ 1 user1 testgroup 0 12月 30 07:46 test3
?
如果你創(chuàng)建了一個(gè)目錄,但又不想讓其他人看到該目錄的內(nèi)容,則只需設(shè)置成rwxr-----(740)即可。
chmod還支持使用rwx的方式來(lái)設(shè)置權(quán)限。從之前的介紹中可以發(fā)現(xiàn),基本上就9個(gè)屬性。我們可以使用u、g和o來(lái)分別表示user、group和others的屬性,用a代表all(即全部)。下面阿銘舉例來(lái)介紹它們的用法,示例命令如下:
?
# chmod u=rwx,og=rx dir3/test3 # ls -l dir3/test3 -rwxr-xr-x 1 user1 testgroup 0 12月 30 07:46 dir3/test3
?
這樣可以把dir3/test3的文件權(quán)限修改為rwxr-xr-x。此外,我們還可以針對(duì)u、g、o和a,增加或者減少它們的某個(gè)權(quán)限(讀、寫(xiě)或執(zhí)行),示例命令如下:
?
# chmod u-x dir3/test3 # ls -l dir3 總用量 0 -rw-r-xr-x 1 user1 testgroup 0 12月 30 07:46 test3 # chmod a-x dir3/test3 # ls -l dir3/test3 -rw-r--r-- 1 user1 testgroup 0 12月 30 07:46 dir3/test3 # chmod u+x dir3/test3 # ls -l dir3/test3 -rwxr--r-- 1 user1 testgroup 0 12月 30 07:46 dir3/test3
?
5.6.4 命令umask
默認(rèn)情況下,目錄的權(quán)限值為755,普通文件的權(quán)限值為644,那么這個(gè)值是由誰(shuí)規(guī)定的呢?究其原因,便涉及umask了。
命令umask用于改變文件的默認(rèn)權(quán)限,其格式為:umask xxx(這里的xxx代表3個(gè)數(shù)字)。如果要查看umask的值,只要在命令行輸入umask,然后回車即可,如下所示:
?
# umask 0022
?
這里umask的預(yù)設(shè)值是0022,這表示什么含義呢?咱們先來(lái)看以下兩條規(guī)則。
若用戶建立普通文件,則預(yù)設(shè)沒(méi)有可執(zhí)行權(quán)限,只有r、w兩個(gè)權(quán)限,最大值為666(-rw-rw-rw-)。
若用戶建立目錄,則預(yù)設(shè)所有權(quán)限均開(kāi)放,即777(drwxrwxrwx)。
umask數(shù)值代表的含義為以上兩條規(guī)則中的默認(rèn)值(文件為666,目錄為777)需要減掉的權(quán)限,所以:
目錄的權(quán)限為rwxrwxrwx - ----w--- = rwxr-xr-x
普通文件的權(quán)限為rw-rw-rw- ?-----w--- = rw-r--r--
umask的值是可以自定義的,比如設(shè)定umask為002,你再創(chuàng)建目錄或者文件時(shí),默認(rèn)權(quán)限分別為:
rwxrwxrwx ?- -------w- = rwxrwxr-x(目錄的權(quán)限)
rw-rw-rw- ?- ?-------w- = rw-rw-r--(文件的權(quán)限)
示例命令如下:
?
# umask 002 # mkdir dir4 # ls -ld dir4 drwxrwxr-x 2 root 6 12月 30 07:53 dir4 # touch test4 # ls -l test4 -rw-rw-r-- 1 root 0 12月 30 07:54 test4
?
這里我們可以看到創(chuàng)建的目錄的默認(rèn)權(quán)限變?yōu)?75,而文件的默認(rèn)權(quán)限變?yōu)?64。如果要把umask改回來(lái),具體操作方法如下:
?
# umask 022 # touch test5 # ls -l test5 -rw-r--r-- 1 root 0 12月 30 07:54 test5
?
關(guān)于umask的計(jì)算方法,有的朋友喜歡換算成數(shù)字去做減法,比如rwxrwxrwx?–----w--w-= 777–022 = 755。乍一看這好像沒(méi)有任何問(wèn)題,但有時(shí)會(huì)出錯(cuò),比如當(dāng)umask值為033時(shí),如果使用單純的減法,文件的默認(rèn)權(quán)限則為666–033=633,但實(shí)際權(quán)限應(yīng)該為rw-rw-rw-–----wx-wx = rw-r--r-- =644。
umask可以在/etc/bashrc里面更改,默認(rèn)情況下,root的umask為022,而一般使用者則為002。可寫(xiě)的權(quán)限非常重要,因此預(yù)設(shè)會(huì)去掉寫(xiě)權(quán)限??赡艽蠹乙恢庇幸粋€(gè)疑問(wèn),阿銘介紹的umask值一直都是3位數(shù),但為什么系統(tǒng)里面是4位呢?最前面還有一個(gè)0呢,這個(gè)0加與不加沒(méi)有影響,它表示umask數(shù)值是八進(jìn)制的。
5.6.5 修改文件的特殊屬性
1.命令chattr
命令chattr(change? attribute)的格式為:chattr [+-=][Asaci]?[文件或者目錄名],其中,+、-和=分別表示增加、減少和設(shè)定。各個(gè)選項(xiàng)的含義如下。
A:增加該屬性后,表示文件或目錄的atime將不可修改。
s:增加該屬性后,會(huì)將數(shù)據(jù)同步寫(xiě)入磁盤中。
a:增加該屬性后,表示只能追加不能刪除,非root用戶不能設(shè)定該屬性。
c:增加該屬性后,表示自動(dòng)壓縮該文件,讀取時(shí)會(huì)自動(dòng)解壓。
i:增加該屬性后,表示文件不能刪除、重命名、設(shè)定鏈接、寫(xiě)入以及新增數(shù)據(jù)。
以上選項(xiàng)中,常用的為a和i這兩個(gè)選項(xiàng)。下面阿銘舉例說(shuō)明其用法,示例命令如下:
?
# chattr +i dir2 # touch dir2/test5 touch: 無(wú)法創(chuàng)建"dir2/test5":權(quán)限不夠 # chattr -i dir2 # touch dir2/test5 # chattr +i dir2 # rm -f dir2/test5 rm: 無(wú)法刪除"dir2/test5":權(quán)限不夠
?
上例中,給dir2目錄增加i權(quán)限后,即使是root賬戶,也不能在dir2目錄中創(chuàng)建或刪除test5文件。
下面再來(lái)看看a權(quán)限的作用,示例命令如下:
?
# chattr -i dir2 # touch dir2/test6 # ls dir2 test2 test5 test6 # chattr +a dir2 # rm -f dir2/test6 rm: 無(wú)法刪除"dir2/test6":不允許的操作 # touch dir2/test7 # ls dir2 test2 test5 test6 test7
?
上例中,dir2目錄增加a權(quán)限后,只可以在里面創(chuàng)建文件,而不能刪除文件。
文件同樣適用以上權(quán)限,示例命令如下:
?
# chattr +a dir2/test7 # echo '11111' > dir2/test7 -bash: dir2/test7: 不允許的操作 # echo '11111' >> dir2/test7 # cat dir2/test7 11111 # chattr +i dir2/test6 # echo '11111' >> dir2/test6 -bash: test2/test3: 權(quán)限不夠 # echo '11111' > dir2/test6 -bash: dir2/test6: 權(quán)限不夠 # rm -f dir2/test6 rm: 無(wú)法刪除"dir2/test6":權(quán)限不夠
?
2.?命令lsattr
lsattr(list attribute),該命令用于讀取文件或者目錄的特殊權(quán)限,其格式為:lsattr [-aR] [文件/目錄名]。下面先來(lái)看看-a和-R這兩個(gè)選項(xiàng)的含義。
-a:類似于ls的-a選項(xiàng),即連同隱藏文件一同列出。
-R:連同子目錄的數(shù)據(jù)一同列出。
這個(gè)命令的用法和ls類似,示例命令如下:
?
# lsattr dir2 ---------------- dir2/test2 ---------------- dir2/test5 ----i----------- dir2/test6 -----a---------- dir2/test7 # lsattr -aR dir2 -----a---------- dir2/. ---------------- dir2/.. ---------------- dir2/test2 ---------------- dir2/test5 ----i----------- dir2/test6 -----a---------- dir2/test7
?
3.?set?uid、set?gid和sticky?bit
前面介紹權(quán)限的時(shí)候,我們一直都是用3位數(shù),其實(shí)最前面還有一位,那就是下面要講的set uid、set gid和sticky bit。
set uid:該權(quán)限針對(duì)二進(jìn)制可執(zhí)行文件,使文件在執(zhí)行階段具有文件所有者的權(quán)限。比如,passwd這個(gè)命令就具有該權(quán)限。當(dāng)普通用戶執(zhí)行passwd命令時(shí),可以臨時(shí)獲得root權(quán)限,從而可以更改密碼。
set gid:該權(quán)限可以作用在文件上(二進(jìn)制可執(zhí)行文件),也可以作用在目錄上。當(dāng)作用在文件上時(shí),其功能和set uid一樣,它會(huì)使文件在執(zhí)行階段具有文件所屬組的權(quán)限。目錄被設(shè)置這個(gè)權(quán)限后,任何用戶在此目錄下創(chuàng)建的文件都具有和該目錄所屬的組相同的組。
sticky bit:可以理解為防刪除位。文件是否可以被某用戶刪除,主要取決于該文件所在的目錄是否對(duì)該用戶具有寫(xiě)權(quán)限。如果沒(méi)有寫(xiě)權(quán)限,則這個(gè)目錄下的所有文件都不能刪除,同時(shí)也不能添加新的文件。如果希望用戶能夠添加文件但不能刪除該目錄下其他用戶的文件,則可以對(duì)父目錄增加該權(quán)限。設(shè)置該權(quán)限后,就算用戶對(duì)目錄具有寫(xiě)權(quán)限,也不能刪除其他用戶的文件。
例如,passwd命令設(shè)置了set uid權(quán)限,而/tmp/目錄則設(shè)置了sticky bit權(quán)限。下面我們來(lái)看看它們的權(quán)限,示例命令如下:
?
# ls -l /usr/bin/passwd -rwsr-xr-x. 1 root 27832 5月 11 2019 /usr/bin/passwd # ls -ld /tmp/ drwxrwxrwt. 21 root 4096 12月 30 07:43 /tmp/
?
可以發(fā)現(xiàn),passwd顯示的是rws而非傳統(tǒng)的rwx,用數(shù)字表示為4755。/tmp/顯示的rwt而非rwx,用數(shù)字表示為1777。那么,這個(gè)4和1是如何計(jì)算出來(lái)的呢?當(dāng)有特殊權(quán)限時(shí),第一位數(shù)字可以是0、1(--t)、2(-s-)、3(-st)、4(s--)、5(s-t)、6(ss-)或7(sst)。再回過(guò)頭來(lái)看passwd,它是s--,所以是4;而/tmp/是--t,所以是1。
配置這些特殊權(quán)限的方法和之前一樣。比如,我想給一個(gè)文件增加set uid權(quán)限,那么命令為chmod u+s filename,而去掉這個(gè)權(quán)限的命令則為chmod u-s filename。同理,想設(shè)置set gid權(quán)限的命令為chmod g+s dirname,設(shè)置sticky bit權(quán)限的命令為chmod o+t dirname。
有時(shí)候,你可能會(huì)發(fā)現(xiàn)set_uid上的權(quán)限為大寫(xiě)的S,而不是小寫(xiě)的s,比如rwS,這是因?yàn)樵撐募](méi)有x權(quán)限所致,不管是大寫(xiě)的S還是小寫(xiě)的s,都表示它存在set_uid或者set_gid權(quán)限,同理sticky bit也一樣。
5.7 在Linux下搜索文件
在Windows下有一個(gè)搜索工具,可以讓我們很快找到文件,這很有用。然而在Linux下,搜索功能更加強(qiáng)大。
5.7.1 用which命令查找可執(zhí)行文件的絕對(duì)路徑
前面已經(jīng)用過(guò)which命令,但需要注意的是,which只能用來(lái)查找PATH環(huán)境變量中出現(xiàn)的路徑下的可執(zhí)行文件。這個(gè)命令比較常用,有時(shí)我們不知道某個(gè)命令的絕對(duì)路徑,用which查找就很容易知道了。例如,查找vi和cat的絕對(duì)路徑,示例命令如下:
?
# which vi /usr/bin/vi # which cat /usr/bin/cat
?
5.7.2 用whereis命令查找文件
whereis命令通過(guò)預(yù)先生成的一個(gè)文件列表庫(kù)查找與給出的文件名相關(guān)的文件,其格式為whereis [-bms]?[文件名稱],其中各選項(xiàng)的含義如下所示。
-b:只查找二進(jìn)制文件。
-m:只查找?guī)椭募ㄔ趍an目錄下的文件)。
-s:只查找源代碼文件。
例如,用whereis查看ls的示例命令如下:
?
# whereis ls ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
?
可以看到,這里找到了2個(gè)文件。這個(gè)命令類似于模糊查找,只要文件名包含“l(fā)s”字符,就會(huì)列出來(lái)。此外,whereis?命令阿銘很少用到。
5.7.3 用locate命令查找文件
locate命令類似于whereis,也是通過(guò)查找預(yù)先生成的文件列表庫(kù)來(lái)告訴用戶要查找的文件在哪里,后面直接跟文件名。如果你的Linux沒(méi)有這個(gè)命令,請(qǐng)安裝mlocate軟件包,安裝命令如下:
?
# yum install -y mlocate # locate passwd locate: 無(wú)法執(zhí)行 stat () `/var/lib/mlocate/mlocate.db': 沒(méi)有那個(gè)文件或目錄
?
安裝好mlocate軟件包后,初次運(yùn)行l(wèi)ocate命令會(huì)報(bào)錯(cuò),這是因?yàn)橄到y(tǒng)還沒(méi)有生成那個(gè)文件列表庫(kù)??梢允褂胾pdatedb命令立即生成(或更新)這個(gè)庫(kù)。如果你的服務(wù)器上正執(zhí)行著重要的業(yè)務(wù),那么最好不要去運(yùn)行這個(gè)命令,因?yàn)橐坏┻\(yùn)行,服務(wù)器的壓力會(huì)增大。默認(rèn)情況下,這個(gè)數(shù)據(jù)庫(kù)每周更新一次。如果使用locate命令搜索一個(gè)文件,而該文件正好是在兩次更新時(shí)間段內(nèi)創(chuàng)建的,那肯定得不到結(jié)果。我們可以到文件/etc/updated.conf中配置這個(gè)數(shù)據(jù)庫(kù)生成(或更新)的規(guī)則。
locate所搜索到的文件列表,不管是目錄名還是文件名,只要包含我們要搜索的關(guān)鍵詞,都會(huì)列出來(lái),所以locate不適合精準(zhǔn)搜索。這個(gè)命令阿銘也不常用。
5.7.4 使用find搜索文件
find這個(gè)搜索工具是阿銘用得最多的一個(gè),請(qǐng)務(wù)必熟記,其格式為:find [路徑] [參數(shù)]?。下面介紹阿銘常用的幾個(gè)參數(shù)。
-atime +n/-n:表示訪問(wèn)或執(zhí)行時(shí)間大于或小于n天的文件。
-ctime +n/-n:表示寫(xiě)入、更改inode屬性(如更改所有者、權(quán)限或者鏈接)的時(shí)間大于或小于n天的文件。
-mtime +n/-n:表示寫(xiě)入時(shí)間大于或小于n天的文件,該參數(shù)用得最多。
下面我們先來(lái)做個(gè)簡(jiǎn)單的試驗(yàn),示例命令如下:
?
# find /tmp/4_6/ -mtime -1 /tmp/4_6/ /tmp/4_6/test1 /tmp/4_6/dir2 /tmp/4_6/dir2/test2 /tmp/4_6/dir2/test5 /tmp/4_6/dir2/test6 /tmp/4_6/dir2/test7 /tmp/4_6/dir3 /tmp/4_6/dir3/test3 /tmp/4_6/dir4 /tmp/4_6/test4 /tmp/4_6/test5
?
上例中,?-mtime -1表示,mtime在1天之內(nèi)的文件,單位是天。而-mtime +10表示mtime在10天以上的文件。還有一種用法-mmin -10,表示mtime在10分鐘內(nèi)的文件。有時(shí)候,也可以不加+或者-,比如-mtime 10,這表示正好為10天,這種用法就少了。
看到這里,你可能不太理解這三個(gè)time屬性,那阿銘就先介紹一下它們。?文件的access time(即atime)是在讀取文件或者執(zhí)行文件時(shí)更改的。文件的modified time(即mtime)是在寫(xiě)入文件時(shí)隨文件內(nèi)容的更改而更改的。文件的change time(即ctime)是在寫(xiě)入文件、更改所有者、權(quán)限或鏈接設(shè)置時(shí)隨inode內(nèi)容的更改而更改的。
其中,inode(索引節(jié)點(diǎn))用來(lái)存放檔案及目錄的基本信息,包含時(shí)間信息、文檔名、所有者以及所屬組等。inode是Unix操作系統(tǒng)中的一種數(shù)據(jù)結(jié)構(gòu),其本質(zhì)是結(jié)構(gòu)體,在文件系統(tǒng)創(chuàng)建時(shí)生成,且個(gè)數(shù)有限。在Linux下,可以通過(guò)命令df -i來(lái)查看各個(gè)分區(qū)的inode總數(shù)以及使用情況。
因此,更改文件的內(nèi)容即會(huì)更改mtime和ctime,但是文件的ctime可能會(huì)在mtime未發(fā)生任何變化時(shí)更改。例如,更改了文件的權(quán)限,但是文件內(nèi)容沒(méi)有變化,那么,如何獲得一個(gè)文件的atime、mtime以及ctime呢?stat命令可用來(lái)列出文件的atime、ctime和mtime,示例命令如下:
?
# stat dir2/test2 文件:"dir2/test2" 大?。? 塊:0 IO 塊:4096 普通空文件 設(shè)備:803h/2051d Inode:25689396 硬鏈接:1 權(quán)限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 1000/testgroup) 最近訪問(wèn):2019-12-30 0710.706789647 -0500 最近更改:2019-12-30 0710.706789647 -0500 最近改動(dòng):2019-12-30 0737.978885268 -0500 創(chuàng)建時(shí)間:-
?
atime不一定在訪問(wèn)文件之后被修改,因?yàn)樵谑褂胑xt3文件系統(tǒng)時(shí),如果mount使用了noatime參數(shù),那么就不會(huì)更新atime的信息??傊@三個(gè)time屬性值都放在了inode中。若mtime、atime被修改,那么inode就一定會(huì)改,既然inode改了,那ctime也跟著要改了。
下面阿銘繼續(xù)介紹find的常用選項(xiàng)。
-name filename:表示直接查找該文件名的文件,這個(gè)選項(xiàng)比較常用,示例命令如下:
?
# find . -name test2 //.表示當(dāng)前目錄,當(dāng)前目錄在/tmp/4_6下面 ./dir2/test2 # find . -name "test*" //支持用*通配 ./test1 ./dir2/test2 ./dir2/test5 ./dir2/test6 ./dir2/test7 ./dir3/test3 ./test4 ./test5
?
-type filetype:表示通過(guò)文件類型查找文件。文件類型在前面已經(jīng)簡(jiǎn)單介紹過(guò),相信你已經(jīng)基本了解了。filetype包含了f、b、c、d、l、s等類型,示例命令如下:
?
# find . -type d . ./dir2 ./dir3 ./dir4
?
5.8 Linux文件系統(tǒng)簡(jiǎn)介
Windows系統(tǒng)格式化硬盤時(shí),會(huì)指定格式FAT或者NTFS,而Linux的文件系統(tǒng)格式為ext3、ext4或者xfs。早期的Linux使用ext2格式,CentOS 5默認(rèn)使用ext3,CentOS 6默認(rèn)使用ext4,而CentOS 7和RHEL8/Rocky8默認(rèn)使用xfs格式。ext2文件系統(tǒng)雖然高效、穩(wěn)定,但隨著Linux系統(tǒng)在關(guān)鍵業(yè)務(wù)中的應(yīng)用,Linux文件系統(tǒng)的弱點(diǎn)也逐漸顯露出來(lái)。因?yàn)閑xt2文件系統(tǒng)不是日志文件系統(tǒng),這在關(guān)鍵行業(yè)是一個(gè)致命的弱點(diǎn)。
ext3文件系統(tǒng)是直接從ext2文件系統(tǒng)發(fā)展而來(lái)的,它帶有日志功能,可以跟蹤記錄文件系統(tǒng)的變化,并將變化內(nèi)容寫(xiě)入日志。寫(xiě)操作首先是對(duì)日志記錄文件進(jìn)行操作,若整個(gè)寫(xiě)操作由于某種原因(如系統(tǒng)掉電)而中斷,當(dāng)系統(tǒng)重啟時(shí),會(huì)根據(jù)日志記錄來(lái)恢復(fù)中斷前的寫(xiě)操作,而且這個(gè)過(guò)程費(fèi)時(shí)極短。目前,ext3文件系統(tǒng)已經(jīng)非常穩(wěn)定、可靠,它完全兼容ext2文件系統(tǒng),用戶可以平滑地過(guò)渡到一個(gè)日志功能健全的文件系統(tǒng)。這實(shí)際上也是ext3日志文件系統(tǒng)設(shè)計(jì)的初衷。
而ext4文件系統(tǒng),較ext3文件系統(tǒng)又有很多好的特性,其中最明顯的特征是ext4支持的最大文件系統(tǒng)容量和單個(gè)最大文件大小比ext3大了許多,二者之間的詳細(xì)區(qū)別阿銘不再介紹。雖然ext4支持的單個(gè)文件大小已經(jīng)達(dá)到了16TB,最大文件支持到40多億,但依然還是有瓶頸的,xfs支持的量級(jí)要比ext4大得多。CentOS 7默認(rèn)采用xfs也是必然的,還有一個(gè)原因,xfs的開(kāi)發(fā)者目前受雇于Red Hat公司,ext4的開(kāi)發(fā)者受雇于Google公司。
Linux文件系統(tǒng)在Windows中是不能識(shí)別的,但在Linux系統(tǒng)中可以掛載Windows文件系統(tǒng)。Linux目前支持MS-DOS、VFAT、FAT、BSD等格式,如果你使用的是RHEL或者Rocky,那么請(qǐng)不要妄圖掛載NTFS格式的分區(qū)到Linux下,因?yàn)樗恢С諲TFS。當(dāng)有這方面的需求時(shí),我們可以通過(guò)安裝ntfs-3g軟件包來(lái)解決這個(gè)問(wèn)題。
除了ext3/ext4文件系統(tǒng)外,有些Linux發(fā)行版(如SUSE)默認(rèn)的文件系統(tǒng)為ReiserFS,它在處理小于1KB的文件時(shí)的速度是ext文件系統(tǒng)的10倍。另外,ReiserFS空間浪費(fèi)較少,它不會(huì)為一些小文件分配inode,而是打包存放在同一個(gè)磁盤塊中。而ext是把它們單獨(dú)存放在不同的塊上。例如,塊大小為4KB,那么兩個(gè)100字節(jié)的文件會(huì)占用兩個(gè)塊,ReiserFS則只占用一個(gè)塊。當(dāng)然,ReiserFS也有缺點(diǎn),就是每升級(jí)一個(gè)版本,都要將磁盤重新格式化一次。
5.9 Linux文件類型
前面我們簡(jiǎn)單介紹了普通文件-、目錄d等文件類型,為了加深理解,阿銘將詳細(xì)介紹Linux的文件類型。
5.9.1 常見(jiàn)文件類型
在Linux文件系統(tǒng)中,主要有以下幾種類型的文件。
普通文件(regular file):即一般類型的文件,當(dāng)用命令ls -l查看某個(gè)目錄時(shí),第一個(gè)屬性為“-”的文件就是普通文件。它又可分成純文本文件(ASCII)和二進(jìn)制文件(binary)。純文本文件可以通過(guò)cat、more、less等工具直接查看內(nèi)容,而二進(jìn)制文件不能。例如,我們用的命令/usr/bin/ls就是一個(gè)二進(jìn)制文件。
目錄(directory):它與Windows下的文件夾類似,只不過(guò)在Linux中我們不將其稱為“文件夾”,而稱為“目錄”。用命令ls -l查看的第一個(gè)屬性值為d的文件就是目錄。
鏈接文件(link file):用命令ls -l查看的第一個(gè)屬性為l的文件就是鏈接文件,它類似于Windows下的快捷方式。這種文件在Linux中很常見(jiàn),阿銘在日常系統(tǒng)運(yùn)維工作中經(jīng)常用到,所以你要特別留意一下這類文件。
設(shè)備(device):即與系統(tǒng)周邊相關(guān)的一些文件,通常都集中在/dev目錄下。這種文件一般分為兩種,一種是塊(block)設(shè)備,就是一些存儲(chǔ)數(shù)據(jù),以提供系統(tǒng)存取的接口設(shè)備,簡(jiǎn)稱硬盤。例如,第一塊硬盤是/dev/sda1,用命令ls-l查看的第一個(gè)屬性值為b的文件就是塊設(shè)備。另一種是字符(character)設(shè)備,是一些串行端口的接口設(shè)備,例如鍵盤、鼠標(biāo)等,用命令ls-l查看的第一個(gè)屬性為c的文件就是字符設(shè)備。
5.9.2 Linux文件后綴名
對(duì)于“后綴名”這個(gè)概念,相信你并不陌生。在Linux系統(tǒng)中,文件的后綴名沒(méi)有具體意義,加或者不加都無(wú)所謂。但是為了便于區(qū)分,我們習(xí)慣在定義文件名時(shí)加一個(gè)后綴名。這樣當(dāng)用戶看到這個(gè)文件名時(shí),就會(huì)很快知道它到底是一個(gè)什么文件,例如1.sh、2.tar.gz、my.cnf、test.zip等。
如果你首次接觸這些文件,也許會(huì)很疑惑,但沒(méi)關(guān)系,深入學(xué)習(xí)之后,你就會(huì)逐漸了解這些文件。阿銘所列舉的幾個(gè)文件名中,1.sh代表它是一個(gè)shell腳本,2.tar.gz代表它是一個(gè)壓縮包,my.cnf代表它是一個(gè)配置文件,test.zip代表它是一個(gè)壓縮文件。
另外需要知道,早期的UNIX系統(tǒng)文件名最多允許14個(gè)字符,而新的UNIX或者Linux系統(tǒng)中,文件名最長(zhǎng)可達(dá)255個(gè)字符。
5.9.3 Linux的鏈接文件
前面阿銘多次提到了“鏈接文件”這個(gè)概念,它分為硬鏈接(hard link)和軟鏈接(symbolic link)兩種。兩種鏈接的本質(zhì)區(qū)別在于inode。下面阿銘就來(lái)介紹一下這兩種鏈接文件。
硬鏈接:當(dāng)系統(tǒng)要讀取一個(gè)文件時(shí),會(huì)先讀inode信息,然后再根據(jù)inode中的信息到塊區(qū)域?qū)?shù)據(jù)取出來(lái)。而硬鏈接是直接再建立一個(gè)inode鏈接到文件放置的塊區(qū)域,即進(jìn)行硬鏈接時(shí)該文件內(nèi)容沒(méi)有任何變化,只是增加了一個(gè)指向這個(gè)文件的inode,并不會(huì)額外占用磁盤空間。硬鏈接有兩個(gè)限制:(1)不能跨文件系統(tǒng),因?yàn)椴煌奈募到y(tǒng)有不同的inode table;(2)不能鏈接目錄。
軟鏈接:與硬鏈接不同,軟鏈接是建立一個(gè)獨(dú)立的文件,當(dāng)讀取這個(gè)鏈接文件時(shí),它會(huì)把讀取的行為轉(zhuǎn)發(fā)到該文件所鏈接的文件上。例如,現(xiàn)在有一個(gè)文件a,我們做了一個(gè)軟鏈接文件b(只是一個(gè)鏈接文件,非常?。?,b指向了a。當(dāng)讀取b時(shí),b就會(huì)把讀取的動(dòng)作轉(zhuǎn)發(fā)到a上,這樣就讀取了文件a。當(dāng)我們刪除文件a時(shí),鏈接文件b不會(huì)被刪除;但如果再次讀取b時(shí),會(huì)提示無(wú)法打開(kāi)文件。然而,當(dāng)我們刪除b時(shí),a是不會(huì)有任何影響的。
由此看來(lái),似乎硬鏈接比較安全,因?yàn)閯h除任何一個(gè)硬鏈接文件,還會(huì)有其他文件指向那個(gè)inode,既然inode存在,那文件的數(shù)據(jù)塊也就存在。但由于硬鏈接的限制太多了(包括無(wú)法做目錄的鏈接),所以用途上比較受限,而軟鏈接的使用方向較廣。那么,如何建立軟鏈接和硬鏈接呢?這就用到了下面我們要介紹的ln(link)命令。
ln命令的格式為:?ln [-s]?[來(lái)源文件] [目的文件],該命令常用的選項(xiàng)是-s。如果不加-s選項(xiàng)就是建立硬鏈接,加上-s選項(xiàng)就建立軟鏈接。示例命令如下:
?
# mkdir /tmp/4_9 # cd /tmp/4_9 # cp /etc/passwd ./ # ll 總用量 4 -rw-r--r-- 1 root 1121 12月 30 08:03 passwd # du -sk //du命令用來(lái)計(jì)算文件或者目錄的大小,-k表示以KB為單位,這里的4,就是4KB 4 . # ln passwd passwd-hard # ll 總用量 8 -rw-r--r-- 2 root 1121 12月 30 08:03 passwd -rw-r--r-- 2 root 1121 12月 30 08:03 passwd-hard # du -sk 4 .
?
這里的ll命令等同于ls -l,請(qǐng)使用which命令查看一下。一開(kāi)始目錄下面只有一個(gè)passwd文件,目錄總大小為4KB,做了硬鏈接后,雖然兩個(gè)文件的大小都為1121B,但目錄的總大小并沒(méi)有變化。我們不妨先刪除源文件,然后再來(lái)比較一下,示例命令如下:
?
# rm -f passwd # ll 總用量 4 -rw-r--r-- 1 root 1121 12月 30 08:03 passwd-hard # du -sk 4 .
?
上例中,刪除源文件passwd后,文件大小依舊不變。這說(shuō)明硬鏈接文件并不會(huì)復(fù)制數(shù)據(jù)塊,額外占用磁盤空間。再來(lái)看硬鏈接的另外一個(gè)限制——不允許目錄做硬鏈接,示例命令如下:
?
# mkdir 123 # ln 123 456 ln: "123": 不允許將硬鏈接指向目錄
?
下面我們?cè)賮?lái)看看軟鏈接的一些特性。首先建立一個(gè)測(cè)試目錄456,然后復(fù)制/etc/passwd文件來(lái)做測(cè)試,再給它做一個(gè)軟鏈接文件,示例命令如下:
?
# mkdir 456 # cd 456 # cp /etc/passwd ./ # ln -s passwd passwd-soft # ll 總用量 4 -rw-r--r-- 1 root 1121 12月 30 08:05 passwd lrwxrwxrwx 1 root 6 12月 30 08:05 passwd-soft -> passwd # head -n1 passwd-soft root0root:/root:/bin/bash # head -n1 passwd root0root:/root:/bin/bash # rm -f passwd # head -n1 passwd-soft head:無(wú)法打開(kāi)"passwd-soft"讀取數(shù)據(jù):沒(méi)有那個(gè)文件或目錄 # ll 總用量 0 lrwxrwxrwx 1 root 6 12月 30 08:05 passwd-soft -> passwd
?
上例中,如果刪除源文件,則不能讀取軟鏈接文件,而且使用命令ll查看,發(fā)現(xiàn)顏色也有所變化。另外,目錄不可以做硬鏈接,但可以做軟鏈接,示例命令如下:
?
# cd .. # In 456 789 In: "456": 不允許將硬鏈接指向目錄 # ln -s 456 789 # ls -ld 456 789 drwxrwxr-x 2 root 25 12月 30 08:06 456 lrwxrwxrwx?1?root?3?12月?30?08:07?789?->?45
?
審核編輯:湯梓紅
評(píng)論