Learning Objectives
- 說明 FHS 標準的目的,以及根目錄底下 /etc、/home、/usr、/var 等主要目錄的用途
- 分辨絕對路徑與相對路徑,會用 /、.、..、-、~ 這些路徑符號
- 用 cd 切換目錄、用 pwd 顯示目前目錄,並用 pwd -P 看出符號連結指向的實際位置
- 用 ls 的 -a、-A、-F、-l、-d、-t、-r 選項檢視檔案,依時間由舊到新列出目錄內容
一棵從 / 長出來的目錄樹
Windows 有 C 槽、D 槽,每個磁碟各自一棵樹。Linux 只有一棵樹,所有的檔案與目錄都從根目錄 / 開始往下延伸;
第二顆硬碟、USB 隨身碟也是「掛」在這棵樹的某個目錄底下(例如 /media、/mnt)。
每個目錄放什麼,不是各家發行版本自己決定的,而是依照 FHS(Filesystem Hierarchy Standard,檔案階層標準)。
FHS 3.0 由 Linux 基金會在 2015 年發布,目的是讓開發者與使用者在不同的發行版本上,都能在相同的位置找到同一類檔案:
設定檔一定在 /etc、紀錄檔一定在 /var/log。
FHS:根目錄底下的主要目錄
| 目錄 | 用途 |
|---|---|
/ |
根目錄,所有目錄的起點 |
/etc |
系統與服務的設定檔,例如 /etc/passwd、/etc/hosts |
/home |
一般使用者的家目錄,例如 /home/student |
/root |
系統管理員 root 的家目錄(不在 /home 底下) |
/usr |
系統安裝的程式與共用資料:/usr/bin 指令、/usr/lib 函式庫、/usr/share 文件與手冊、/usr/local 自行安裝的軟體 |
/var |
經常變動的資料:/var/log 紀錄檔、/var/cache 快取、/var/www 網站檔案、/var/lib 程式的狀態資料 |
/tmp |
暫存檔,所有使用者都能寫入,重新開機時通常會清空 |
/boot |
開機需要的檔案,包含 Linux 核心 |
/dev |
裝置檔,例如硬碟 /dev/sda |
/proc、/sys |
核心與硬體的即時資訊,不是真的存在磁碟上的檔案 |
/run |
開機以來的執行期資料(PID 檔等),重新開機就清空 |
/opt |
第三方的套裝軟體 |
/media、/mnt |
掛載 USB 隨身碟、光碟或其他磁碟的位置 |
/srv |
這台主機對外提供服務的資料 |
/bin、/sbin、/lib |
早期放基本指令與函式庫的地方;在現在的 Ubuntu 上,它們是指向 /usr/bin、/usr/sbin、/usr/lib 的符號連結 |
FHS 依「能不能與其他電腦共享」與「內容會不會變動」把目錄分成四類:
| 可共享(shareable) | 不可共享(unshareable) | |
|---|---|---|
| 靜態(static) | /usr(系統軟體)、/opt(第三方軟體) |
/etc(設定檔)、/boot(開機檔案) |
| 變動(variable) | /var/mail(郵件信箱)、/var/spool/news(新聞群組) |
/var/run(PID 檔)、/var/lock(鎖定檔) |
/usr 屬於靜態資料,除了安裝、移除軟體之外一般不會修改,所以可以唯讀掛載、甚至讓多台電腦共用。
投影片與許多中文教材把 usr 解釋成 Unix Software Resource(Unix 軟體資源);不論名稱由來,現在的 /usr 放的就是系統安裝的程式與共用資料。
/var 則相反,紀錄檔、快取會一直長大,需要定期檢查。
在 Ubuntu 上,
/var/run與/var/lock是指向/run與/run/lock的符號連結。
路徑符號、絕對路徑與相對路徑
| 符號 | 意思 |
|---|---|
/ |
放在最前面代表根目錄;放在中間是目錄名稱之間的分隔符號 |
. |
目前這一層目錄 |
.. |
上一層目錄 |
- |
前一個工作目錄(cd - 回到上一個所在的地方) |
~ |
目前使用者的家目錄;~ben 是使用者 ben 的家目錄 |
絕對路徑以 / 開頭,從根目錄一路寫到目標,不論現在在哪裡,指的都是同一個位置:
student@ubuntu:~$ cd /var/log
student@ubuntu:/var/log$ cd /usr/bin
student@ubuntu:/usr/bin$ cd /
student@ubuntu:/$
相對路徑不以 / 開頭,以目前所在的目錄為起點:
student@ubuntu:/$ cd var
student@ubuntu:/var$ cd log
student@ubuntu:/var/log$ cd ..
student@ubuntu:/var$ cd ..
student@ubuntu:/$
| 優點 | 缺點 | |
|---|---|---|
| 絕對路徑 | 精確,不必考慮現在在哪裡 | 比較長 |
| 相對路徑 | 簡短,在附近的目錄之間移動很方便 | 結果取決於目前所在的目錄 |
投影片在家目錄(
root@vm:~#)執行cd var就進了/var,那是投影片的筆誤:cd var是相對路徑, 要在/底下執行才會到/var;在家目錄執行會出現No such file or directory。
cd 與 pwd
| 寫法 | 作用 |
|---|---|
cd /var |
用絕對路徑切換到 /var |
cd log |
用相對路徑進入目前目錄底下的 log |
cd 或 cd ~ |
回到自己的家目錄 |
cd .. |
到上一層目錄 |
cd - |
回到前一個所在的目錄,並印出那個目錄的路徑 |
cd ~ben |
到使用者 ben 的家目錄(要有權限才進得去) |
pwd(print working directory)印出目前所在的目錄。遇到符號連結(symbolic link,類似 Windows 的捷徑)時,兩個選項的結果不同:
| 寫法 | 印出 |
|---|---|
pwd 或 pwd -L |
邏輯路徑:你是「經過哪個連結」走進來的 |
pwd -P |
實際路徑:連結真正指向的位置 |
$ ln -s /home/student/Documents /tmp/mylink # 建立符號連結
$ cd /tmp/mylink
$ pwd
/tmp/mylink
$ pwd -P
/home/student/Documents
Ubuntu 21.04 起,新建立的家目錄權限是 750,其他一般使用者進不去,所以
cd ~ben通常會出現Permission denied;權限在下一課說明。
ls:檢視檔案與目錄
ls [選項] [檔名或目錄]
| 選項 | 作用 |
|---|---|
-a |
列出全部,包含以 . 開頭的隱藏檔,以及 .、.. |
-A |
和 -a 一樣列出隱藏檔,但不列 . 與 .. |
-F |
在名稱後面加上類型記號:/ 目錄、* 可以執行、@ 符號連結 |
-l |
詳細清單:類型與權限、連結數、擁有者、群組、大小、修改時間、名稱 |
-d |
列出目錄本身,而不是目錄裡的內容;常和 -l 一起用:ls -ld /etc |
-t |
依修改時間排序,最新的在最前面 |
-r |
反過來排序;-ltr 就是依時間由舊到新,最新的在最後面 |
-h |
搭配 -l,大小以 K、M、G 顯示 |
-R |
連同子目錄裡的內容一起列出 |
投影片寫
-t依「建立時間」排序;實際上是依修改時間(mtime),ls -l顯示的也是修改時間。
在真的終端機上,ls 會用顏色區分類型:藍色是目錄、亮綠色是可以執行的檔案、天藍色是符號連結、紅色是壓縮檔。
Linux 沒有「副檔名」的規定。 .txt、.sh 只是幫人辨識的命名習慣;一個檔案能不能執行,取決於它有沒有執行(x)權限,
而不是名稱的結尾。ls -F 標上 * 的檔案就是有執行權限的檔案。
看懂剛才的輸出
cd -除了切換目錄,還會印出切換到的路徑(/var/log),方便確認自己回到哪裡。ls -a比ls多出.、..與.bashrc、.profile這些隱藏檔;它們是 bash 的設定檔,平常不需要看到,所以預設隱藏。ls -F的run.sh*表示這個檔案有執行權限,Documents/表示是目錄。ls -ld /etc只有一行,是/etc自己的資訊;少了-d會列出/etc裡面幾百個檔案。ls -ltr的最後一行是最近修改過的項目。找「剛剛被改過的設定檔」或「最新的紀錄檔」時,ls -ltr很常用。- 走進符號連結後再
cd ..,回到的是/tmp(連結所在的地方),而不是/home/student;bash 預設依邏輯路徑移動。
想一想:FHS 與路徑
想修改網路服務的設定檔,最可能在哪個目錄底下找到?
目前在 /var/log,下列哪一個指令和 cd /var 的效果相同?
下列哪一個是絕對路徑?
想一想:cd、pwd 與 ls
/tmp/mylink 是指向 /home/student/Documents 的符號連結。執行 cd /tmp/mylink 後再執行 pwd -P,會印出什麼?
想依修改時間由舊到新列出 /usr/share,讓最新的項目出現在最後一行,要用哪一個指令?
ls -a 與 ls -A 的差別是?
重點精華回顧
- Linux 只有一棵目錄樹,從根目錄
/開始;FHS 標準規定每個目錄的用途。 /etc設定檔、/home使用者家目錄、/rootroot 的家目錄、/usr系統程式與共用資料、/var經常變動的資料(/var/log紀錄檔)、/tmp暫存檔。- 路徑符號:
/根目錄與分隔、.目前目錄、..上一層、-前一個目錄、~家目錄。 - 絕對路徑以
/開頭,精確;相對路徑以目前目錄為起點,簡短。 cd切換目錄(不加參數回家目錄、cd -回到前一個目錄);pwd顯示目前目錄,pwd -P顯示符號連結的實際位置。ls常用選項:-a/-A隱藏檔、-F類型記號、-l詳細資訊、-d目錄本身、-t依修改時間、-r反向;ls -ltr由舊到新。- Linux 沒有副檔名的規定,能不能執行取決於執行權限。