## 7.2 文件系統的簡單操作
稍微了解了文件系統后,再來我們得要知道如何查詢整體文件系統的總容量與每個目錄所占用的容量啰! 此外,前兩章談到的文件類型中尚未講的很清楚的鏈接文件 (Link file) 也會在這一小節當中介紹的。
### 7.2.1 磁盤與目錄的容量
現在我們知道磁盤的整體數據是在 superblock 區塊中,但是每個各別文件的容量則在 inode 當中記載的。 那在命令行下面該如何叫出這幾個數據呢?下面就讓我們來談一談這兩個指令:
* df:列出文件系統的整體磁盤使用量;
* du:評估文件系統的磁盤使用量(常用在推估目錄所占容量)
* df
```
[root@study ~]# df [-ahikHTm] [目錄或文件名]
選項與參數:
-a :列出所有的文件系統,包括系統特有的 /proc 等文件系統;
-k :以 KBytes 的容量顯示各文件系統;
-m :以 MBytes 的容量顯示各文件系統;
-h :以人們較易閱讀的 GBytes, MBytes, KBytes 等格式自行顯示;
-H :以 M=1000K 取代 M=1024K 的進位方式;
-T :連同該 partition 的 filesystem 名稱 (例如 xfs) 也列出;
-i :不用磁盤容量,而以 inode 的數量來顯示
范例一:將系統內所有的 filesystem 列出來!
[root@study ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 10475520 3409408 7066112 33% /
devtmpfs 627700 0 627700 0% /dev
tmpfs 637568 80 637488 1% /dev/shm
tmpfs 637568 24684 612884 4% /run
tmpfs 637568 0 637568 0% /sys/fs/cgroup
/dev/mapper/centos-home 5232640 67720 5164920 2% /home
/dev/vda2 1038336 133704 904632 13% /boot
# 在 Linux 下面如果 df 沒有加任何選項,那么默認會將系統內所有的
# (不含特殊內存內的文件系統與 swap) 都以 1 KBytes 的容量來列出來!
# 至于那個 /dev/shm 是與內存有關的掛載,先不要理他!
```
先來說明一下范例一所輸出的結果訊息為:
* Filesystem:代表該文件系統是在哪個 partition ,所以列出設備名稱;
* 1k-blocks:說明下面的數字單位是 1KB 呦!可利用 -h 或 -m 來改變容量;
* Used:顧名思義,就是使用掉的磁盤空間啦!
* Available:也就是剩下的磁盤空間大小;
* Use%:就是磁盤的使用率啦!如果使用率高達 90% 以上時, 最好需要注意一下了,免得容量不足造成系統問題喔!(例如最容易被灌爆的 /var/spool/mail 這個放置郵件的磁盤)
* Mounted on:就是磁盤掛載的目錄所在啦!(掛載點啦!)
```
范例二:將容量結果以易讀的容量格式顯示出來
[root@study ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 10G 3.3G 6.8G 33% /
devtmpfs 613M 0 613M 0% /dev
tmpfs 623M 80K 623M 1% /dev/shm
tmpfs 623M 25M 599M 4% /run
tmpfs 623M 0 623M 0% /sys/fs/cgroup
/dev/mapper/centos-home 5.0G 67M 5.0G 2% /home
/dev/vda2 1014M 131M 884M 13% /boot
# 不同于范例一,這里會以 G/M 等容量格式顯示出來,比較容易看啦!
范例三:將系統內的所有特殊文件格式及名稱都列出來
[root@study ~]# df -aT
Filesystem Type 1K-blocks Used Available Use% Mounted on
rootfs rootfs 10475520 3409368 7066152 33% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
devtmpfs devtmpfs 627700 0 627700 0% /dev
securityfs securityfs 0 0 0 - /sys/kernel/security
tmpfs tmpfs 637568 80 637488 1% /dev/shm
devpts devpts 0 0 0 - /dev/pts
tmpfs tmpfs 637568 24684 612884 4% /run
tmpfs tmpfs 637568 0 637568 0% /sys/fs/cgroup
.....(中間省略).....
/dev/mapper/centos-root xfs 10475520 3409368 7066152 33% /
selinuxfs selinuxfs 0 0 0 - /sys/fs/selinux
.....(中間省略).....
/dev/mapper/centos-home xfs 5232640 67720 5164920 2% /home
/dev/vda2 xfs 1038336 133704 904632 13% /boot
binfmt_misc binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
# 系統里面其實還有很多特殊的文件系統存在的。那些比較特殊的文件系統幾乎
# 都是在內存當中,例如 /proc 這個掛載點。因此,這些特殊的文件系統
# 都不會占據磁盤空間喔! ^_^
范例四:將 /etc 下面的可用的磁盤容量以易讀的容量格式顯示
[root@study ~]# df -h /etc
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 10G 3.3G 6.8G 33% /
# 這個范例比較有趣一點啦,在 df 后面加上目錄或者是文件時, df
# 會自動的分析該目錄或文件所在的 partition ,并將該 partition 的容量顯示出來,
# 所以,您就可以知道某個目錄下面還有多少容量可以使用了! ^_^
范例五:將目前各個 partition 當中可用的 inode 數量列出
[root@study ~]# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10M 108K 9.9M 2% /
devtmpfs 154K 397 153K 1% /dev
tmpfs 156K 5 156K 1% /dev/shm
tmpfs 156K 497 156K 1% /run
tmpfs 156K 13 156K 1% /sys/fs/cgroup
# 這個范例則主要列出可用的 inode 剩余量與總容量。分析一下與范例一的關系,
# 你可以清楚的發現到,通常 inode 的數量剩余都比 block 還要多呢
```
由于 df 主要讀取的數據幾乎都是針對一整個文件系統,因此讀取的范圍主要是在 Superblock 內的信息, 所以這個指令顯示結果的速度非常的快速!在顯示的結果中你需要特別留意的是那個根目錄的剩余容量! 因為我們所有的數據都是由根目錄衍生出來的,因此當根目錄的剩余容量剩下 0 時,那你的 Linux 可能就問題很大了。

**Tips** 說個陳年老笑話!鳥哥還在念書時,別的研究室有個管理 Sun 工作站的研究生發現, 他的磁盤明明還有好幾 GB ,但是就是沒有辦法將光盤內幾 MB 的數據 copy 進去, 他就去跟老板講說機器壞了!嘿!明明才來維護過幾天而已為何會壞了! 結果他老板就將維護商叫來罵了 2 小時左右吧!
后來,維護商發現原來磁盤的“總空間”還有很多, 只是某個分區填滿了,偏偏該研究生就是要將數據 copy 去那個分區!呵呵! 后來那個研究生就被命令“再也不許碰 Sun 主機”了~~
另外需要注意的是,如果使用 -a 這個參數時,系統會出現 /proc 這個掛載點,但是里面的東西都是 0 ,不要緊張! /proc 的東西都是 Linux 系統所需要載入的系統數據,而且是掛載在“內存當中”的, 所以當然沒有占任何的磁盤空間啰!
至于那個 /dev/shm/ 目錄,其實是利用內存虛擬出來的磁盤空間,通常是總實體內存的一半! 由于是通過內存仿真出來的磁盤,因此你在這個目錄下面創建任何數據文件時,存取速度是非常快速的!(在內存內工作) 不過,也由于他是內存仿真出來的,因此這個文件系統的大小在每部主機上都不一樣,而且創建的東西在下次開機時就消失了! 因為是在內存中嘛!
* du
```
[root@study ~]# du [-ahskm] 文件或目錄名稱
選項與參數:
-a :列出所有的文件與目錄容量,因為默認僅統計目錄下面的文件量而已。
-h :以人們較易讀的容量格式 (G/M) 顯示;
-s :列出總量而已,而不列出每個各別的目錄占用容量;
-S :不包括子目錄下的總計,與 -s 有點差別。
-k :以 KBytes 列出容量顯示;
-m :以 MBytes 列出容量顯示;
范例一:列出目前目錄下的所有文件大小
[root@study ~]# du
4 ./.cache/dconf <==每個目錄都會列出來
4 ./.cache/abrt
8 ./.cache
....(中間省略)....
0 ./test4
4 ./.ssh <==包括隱藏文件的目錄
76 . <==這個目錄(.)所占用的總量
# 直接輸入 du 沒有加任何選項時,則 du 會分析“目前所在目錄”
# 的文件與目錄所占用的磁盤空間。但是,實際顯示時,僅會顯示目錄容量(不含文件),
# 因此 . 目錄有很多文件沒有被列出來,所以全部的目錄相加不會等于 . 的容量喔!
# 此外,輸出的數值數據為 1K 大小的容量單位。
范例二:同范例一,但是將文件的容量也列出來
[root@study ~]# du -a
4 ./.bash_logout <==有文件的列表了
4 ./.bash_profile
4 ./.bashrc
....(中間省略)....
4 ./.ssh/known_hosts
4 ./.ssh
76 .
范例三:檢查根目錄下面每個目錄所占用的容量
[root@study ~]# du -sm /*
0 /bin
99 /boot
....(中間省略)....
du: cannot access ‘/proc/17772/task/17772/fd/4’: No such file or directory
du: cannot access ‘/proc/17772/fdinfo/4’: No such file or directory
0 /proc <==不會占用硬盤空間!
1 /root
25 /run
....(中間省略)....
3126 /usr <==系統初期最大就是他了啦!
117 /var
# 這是個很常被使用的功能~利用萬用字符 * 來代表每個目錄,如果想要檢查某個目錄下,
# 哪個次目錄占用最大的容量,可以用這個方法找出來。值得注意的是,如果剛剛安裝好 Linux 時,
# 那么整個系統容量最大的應該是 /usr 。而 /proc 雖然有列出容量,但是那個容量是在內存中,
# 不占磁盤空間。至于 /proc 里頭會列出一堆“No such file or directory” 的錯誤,
# 別擔心!因為是內存內的程序,程序執行結束就會消失,因此會有些目錄找不到,是正確的!
```
與 df 不一樣的是,du 這個指令其實會直接到文件系統內去搜尋所有的文件數據, 所以上述第三個范例指令的運行會執行一小段時間!此外,在默認的情況下,容量的輸出是以 KB 來設計的, 如果你想要知道目錄占了多少 MB ,那么就使用 -m 這個參數即可啰!而, 如果你只想要知道該目錄占了多少容量的話,使用 -s 就可以啦!
至于 -S 這個選項部分,由于 du 默認會將所有文件的大小均列出,因此假設你在 /etc 下面使用 du 時, 所有的文件大小,包括 /etc 下面的次目錄容量也會被計算一次。然后最終的容量 (/etc) 也會加總一次, 因此很多朋友都會誤會 du 分析的結果不太對勁。所以啰,如果想要列出某目錄下的全部數據, 或許也可以加上 -S 的選項,減少次目錄的加總喔!
### 7.2.2 實體鏈接與符號鏈接: ln
關于鏈接(link)數據我們第五章的[Linux文件屬性](../Text/index.html#filepermission_perm)及[Linux文件種類與擴展名](../Text/index.html#filepermission_type)當中提過一些信息, 不過當時由于尚未講到文件系統,因此無法較完整的介紹鏈接文件啦。不過在上一小節談完了文件系統后, 我們可以來了解一下鏈接文件這玩意兒了。
在 Linux 下面的鏈接文件有兩種,一種是類似 Windows 的捷徑功能的文件,可以讓你快速的鏈接到目標文件(或目錄); 另一種則是通過文件系統的 inode 鏈接來產生新文件名,而不是產生新文件!這種稱為實體鏈接 (hard link)。 這兩種玩意兒是完全不一樣的東西呢!現在就分別來談談。
* Hard Link (實體鏈接, 硬式鏈接或實際鏈接)
在前一小節當中,我們知道幾件重要的信息,包括:
* 每個文件都會占用一個 inode ,文件內容由 inode 的記錄來指向;
* 想要讀取該文件,必須要經過目錄記錄的文件名來指向到正確的 inode 號碼才能讀取。
也就是說,其實文件名只與目錄有關,但是文件內容則與 inode 有關。那么想一想, 有沒有可能有多個文件名對應到同一個 inode 號碼呢?有的!那就是 hard link 的由來。 所以簡單的說:hard link 只是在某個目錄下新增一筆文件名鏈接到某 inode 號碼的關連記錄而已。
舉個例子來說,假設我系統有個 /root/crontab 他是 /etc/crontab 的實體鏈接,也就是說這兩個文件名鏈接到同一個 inode , 自然這兩個文件名的所有相關信息都會一模一樣(除了文件名之外)。實際的情況可以如下所示:
```
[root@study ~]# ll -i /etc/crontab
34474855 -rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab
[root@study ~]# ln /etc/crontab . <==創建實體鏈接的指令
[root@study ~]# ll -i /etc/crontab crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
```
你可以發現兩個文件名都鏈接到 34474855 這個 inode 號碼,所以您瞧瞧,是否文件的權限/屬性完全一樣呢? 因為這兩個“文件名”其實是一模一樣的“文件”啦!而且你也會發現第二個字段由原本的 1 變成 2 了! 那個字段稱為“鏈接”,這個字段的意義為:“有多少個文件名鏈接到這個 inode 號碼”的意思。 如果將讀取到正確數據的方式畫成示意圖,就類似如下畫面:
圖7.2.1、實體鏈接的文件讀取示意圖
上圖的意思是,你可以通過 1 或 2 的目錄之 inode 指定的 block 找到兩個不同的文件名,而不管使用哪個文件名均可以指到 real 那個 inode 去讀取到最終數據!那這樣有什么好處呢?最大的好處就是“安全”!如同上圖中, 如果你將任何一個“文件名”刪除,其實 inode 與 block 都還是存在的! 此時你可以通過另一個“文件名”來讀取到正確的文件數據喔!此外,不論你使用哪個“文件名”來編輯, 最終的結果都會寫入到相同的 inode 與 block 中,因此均能進行數據的修改哩!
一般來說,使用 hard link 設置鏈接文件時,磁盤的空間與 inode 的數目都不會改變! 我們還是由圖 7.2.1 來看,由圖中可以知道, hard link 只是在某個目錄下的 block 多寫入一個關連數據而已,既不會增加 inode 也不會耗用 block 數量哩!

**Tips** hard link 的制作中,其實還是可能會改變系統的 block 的,那就是當你新增這筆數據卻剛好將目錄的 block 填滿時,就可能會新加一個 block 來記錄文件名關連性,而導致磁盤空間的變化!不過,一般 hard link 所用掉的關連數據量很小,所以通常不會改變 inode 與磁盤空間的大小喔!
由圖 7.2.1 其實我們也能夠知道,事實上 hard link 應該僅能在單一文件系統中進行的,應該是不能夠跨文件系統才對! 因為圖 7.2.1 就是在同一個 filesystem 上嘛!所以 hard link 是有限制的:
* 不能跨 Filesystem;
* 不能 link 目錄。
不能跨 Filesystem 還好理解,那不能 hard link 到目錄又是怎么回事呢?這是因為如果使用 hard link 鏈接到目錄時, 鏈接的數據需要連同被鏈接目錄下面的所有數據都創建鏈接,舉例來說,如果你要將 /etc 使用實體鏈接創建一個 /etc_hd 的目錄時,那么在 /etc_hd 下面的所有文件名同時都與 /etc 下面的文件名要創建 hard link 的,而不是僅鏈接到 /etc_hd 與 /etc 而已。 并且,未來如果需要在 /etc_hd 下面創建新文件時,連帶的, /etc 下面的數據又得要創建一次 hard link ,因此造成環境相當大的復雜度。 所以啰,目前 hard link 對于目錄暫時還是不支持的啊!
* Symbolic Link (符號鏈接,亦即是捷徑)
相對于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在創建一個獨立的文件,而這個文件會讓數據的讀取指向他 link 的那個文件的文件名!由于只是利用文件來做為指向的動作, 所以,當來源文件被刪除之后,symbolic link 的文件會“開不了”, 會一直說“無法打開某文件!”。實際上就是找不到原始“文件名”而已啦!
舉例來說,我們先創建一個符號鏈接文件鏈接到 /etc/crontab 去看看:
```
[root@study ~]# ln -s /etc/crontab crontab2
[root@study ~]# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
```
由上表的結果我們可以知道兩個文件指向不同的 inode 號碼,當然就是兩個獨立的文件存在! 而且鏈接文件的重要內容就是他會寫上目標文件的“文件名”, 你可以發現為什么上表中鏈接文件的大小為 12 Bytes 呢? 因為箭頭(-->)右邊的文件名“/etc/crontab”總共有 12 個英文,每個英文占用 1 個 Bytes ,所以文件大小就是 12Bytes了!
關于上述的說明,我們以如下圖示來解釋:
圖7.2.2、符號鏈接的文件讀取示意圖
由 1 號 inode 讀取到鏈接文件的內容僅有文件名,根據文件名鏈接到正確的目錄去取得目標文件的 inode , 最終就能夠讀取到正確的數據了。你可以發現的是,如果目標文件(/etc/crontab)被刪除了,那么整個環節就會無法繼續進行下去, 所以就會發生無法通過鏈接文件讀取的問題了!
這里還是得特別留意,這個 Symbolic Link 與 Windows 的捷徑可以給他劃上等號,由 Symbolic link 所創建的文件為一個獨立的新的文件,所以會占用掉 inode 與 block 喔!
* * *
由上面的說明來看,似乎 hard link 比較安全,因為即使某一個目錄下的關連數據被殺掉了, 也沒有關系,只要有任何一個目錄下存在著關連數據,那么該文件就不會不見!舉上面的例子來說,我的 /etc/crontab 與 /root/crontab 指向同一個文件,如果我刪除了 /etc/crontab 這個文件,該刪除的動作其實只是將 /etc 目錄下關于 crontab 的關連數據拿掉而已, crontab 所在的 inode 與 block 其實都沒有被變動喔!
不過由于 Hard Link 的限制太多了,包括無法做“目錄”的 link , 所以在用途上面是比較受限的!反而是 Symbolic Link 的使用方面較廣喔!好了, 說的天花亂墜,看你也差不多快要昏倒了!沒關系,實作一下就知道怎么回事了!要制作鏈接文件就必須要使用 ln 這個指令呢!
```
[root@study ~]# ln [-sf] 來源文件 目標文件
選項與參數:
-s :如果不加任何參數就進行鏈接,那就是hard link,至于 -s 就是symbolic link
-f :如果 目標文件 存在時,就主動的將目標文件直接移除后再創建!
范例一:將 /etc/passwd 復制到 /tmp 下面,并且觀察 inode 與 block
[root@study ~]# cd /tmp
[root@study tmp]# cp -a /etc/passwd .
[root@study tmp]# du -sb ; df -i .
6602 . <==先注意一下這里的容量是多少!
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10485760 109748 10376012 2% /
# 利用 du 與 df 來檢查一下目前的參數~那個 du -sb 是計算整個 /tmp 下面有多少 Bytes 的容量啦!
范例二:將 /tmp/passwd 制作 hard link 成為 passwd-hd 文件,并觀察文件與容量
[root@study tmp]# ln passwd passwd-hd
[root@study tmp]# du -sb ; df -i .
6602 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10485760 109748 10376012 2% /
# 仔細看,即使多了一個文件在 /tmp 下面,整個 inode 與 block 的容量并沒有改變!
[root@study tmp]# ls -il passwd*
2668897 -rw-r--r--. 2 root root 2092 Jun 17 00:20 passwd
2668897 -rw-r--r--. 2 root root 2092 Jun 17 00:20 passwd-hd
# 原來是指向同一個 inode 啊!這是個重點啊!另外,那個第二欄的鏈接數也會增加!
范例三:將 /tmp/passwd 創建一個符號鏈接
[root@study tmp]# ln -s passwd passwd-so
[root@study tmp]# ls -li passwd*
2668897 -rw-r--r--. 2 root root 2092 Jun 17 00:20 passwd
2668897 -rw-r--r--. 2 root root 2092 Jun 17 00:20 passwd-hd
2668898 lrwxrwxrwx. 1 root root 6 Jun 23 22:40 passwd-so -> passwd
# passwd-so 指向的 inode number 不同了!這是一個新的文件~這個文件的內容是指向
# passwd 的。passwd-so 的大小是 6Bytes ,因為 “passwd” 這個單字共有六個字符之故
[root@study tmp]# du -sb ; df -i .
6608 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/centos-root 10485760 109749 10376011 2% /
# 呼呼!整個容量與 inode 使用數都改變啰~確實如此啊!
范例四:刪除原始文件 passwd ,其他兩個文件是否能夠打開?
[root@study tmp]# rm passwd
[root@study tmp]# cat passwd-hd
.....(正常顯示完畢!)
[root@study tmp]# cat passwd-so
cat: passwd-so: No such file or directory
[root@study tmp]# ll passwd*
-rw-r--r--. 1 root root 2092 Jun 17 00:20 passwd-hd
lrwxrwxrwx. 1 root root 6 Jun 23 22:40 passwd-so -> passwd
# 怕了吧!符號鏈接果然無法打開!另外,如果符號鏈接的目標文件不存在,
# 其實文件名的部分就會有特殊的顏色顯示喔!
```

**Tips** 還記得[第五章](../Text/index.html#dir)當中,我們提到的 /tmp 這個目錄是干嘛用的嗎?是給大家作為暫存盤用的啊! 所以,您會發現,過去我們在進行測試時,都會將數據移動到 /tmp 下面去練習~ 嘿嘿!因此,有事沒事,記得將 /tmp 下面的一些怪異的數據清一清先!
要注意啰!使用 ln 如果不加任何參數的話,那么就是 Hard Link 啰!如同范例二的情況,增加了 hard link 之后,可以發現使用 ls -l 時,顯示的 link 那一欄屬性增加了!而如果這個時候砍掉 passwd 會發生什么事情呢?passwd-hd 的內容還是會跟原來 passwd 相同,但是 passwd-so 就會找不到該文件啦!
而如果 ln 使用 -s 的參數時,就做成差不多是 Windows 下面的“捷徑”的意思。當你修改 Linux 下的 symbolic link 文件時,則更動的其實是“原始文件”, 所以不論你的這個原始文件被鏈接到哪里去,只要你修改了鏈接文件,原始文件就跟著變啰! 以上面為例,由于你使用 -s 的參數創建一個名為 passwd-so 的文件,則你修改 passwd-so 時,其內容與 passwd 完全相同,并且,當你按下儲存之后,被改變的將是 passwd 這個文件!
此外,如果你做了下面這樣的鏈接:
> ln -s /bin /root/bin
那么如果你進入 /root/bin 這個目錄下,“請注意呦!該目錄其實是 /bin 這個目錄,因為你做了鏈接文件了!”所以,如果你進入 /root/bin 這個剛剛創建的鏈接目錄, 并且將其中的數據殺掉時,嗯! /bin 里面的數據就通通不見了!這點請千萬注意!所以趕緊利用“rm /root/bin ” 將這個鏈接文件刪除吧!
基本上, Symbolic link 的用途比較廣,所以您要特別留意 symbolic link 的用法呢!未來一定還會常常用到的啦!
* 關于目錄的 link 數量:
或許您已經發現了,那就是,當我們以 hard link 進行“文件的鏈接”時,可以發現,在 ls -l 所顯示的第二字段會增加一才對,那么請教,如果創建目錄時,他默認的 link 數量會是多少? 讓我們來想一想,一個“空目錄”里面至少會存在些什么?呵呵!就是存在 . 與 .. 這兩個目錄啊! 那么,當我們創建一個新目錄名稱為 /tmp/testing 時,基本上會有三個東西,那就是:
* /tmp/testing
* /tmp/testing/.
* /tmp/testing/..
而其中 /tmp/testing 與 /tmp/testing/. 其實是一樣的!都代表該目錄啊~而 /tmp/testing/.. 則代表 /tmp 這個目錄,所以說,當我們創建一個新的目錄時, “新的目錄的 link 數為 2 ,而上層目錄的 link 數則會增加 1 ” 不信的話,我們來作個測試看看:
```
[root@study ~]# ls -ld /tmp
drwxrwxrwt. 14 root root 4096 Jun 23 22:42 /tmp
[root@study ~]# mkdir /tmp/testing1
[root@study ~]# ls -ld /tmp
drwxrwxrwt. 15 root root 4096 Jun 23 22:45 /tmp # 這里的 link 數量加 1 了!
[root@study ~]# ls -ld /tmp/testing1
drwxr-xr-x. 2 root root 6 Jun 23 22:45 /tmp/testing1/
```
瞧!原本的所謂上層目錄 /tmp 的 link 數量由 14 增加為 15 ,至于新目錄 /tmp/testing 則為 2 ,這樣可以理解目錄的 link 數量的意義了嗎? ^_^
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀