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