# FHS 上課檔案 [TOC] ## 什麼是 FHS - FHS 全名:Filesystem Hierarchy Standard(檔案系統階層標準) - ex: windows 系統中的 C、D、E槽 - ex: OS 系統中的目錄架構 - 定義:定義 Linux 系統中,所有目錄及子目錄架構及目錄內容 - 目的:讓使用者瞭解已安裝的軟體通常是放在哪個目錄下 ::: info ### FHS 出現的契機 - 越來越多人、企業利用 Linux 系統開發應用程式 - 每個人對於配置目錄及文件想法不同 - => 很難管理 :-1: - 制定一個標準方便管理 :+1: ::: ## FHS 架構 ![](https://hackmd.io/_uploads/HkB2xSJS2.png) > photo from: [照片來源](https://hackmd.io/@ncnu-opensource/book/https%3A%2F%2Fhackmd.io%2FPubDEY-tSKuAsszd1xiK1w%3Fview) - FHS 的結構為一層一層的,像樹一樣(Tree) - FHS 萬物皆檔案 - 在 Linux 系統中,一切皆檔案 - 硬體、軟體、文件... ## `/` Root - `/` = root(根目錄) - Linux系統中最重要的目錄,是所有目錄的根源 - 是整個電腦系統的根本 - ![](https://hackmd.io/_uploads/HyZ9tLFJp.png) - 比喻成樹木的話,即為所有分支的源頭 - 開機、還原、系統修復等動作皆與根目錄有關 - 具備修復、系統的重要資料 :::info - `cd` = Change Directory - 切換目錄 - `ls` = 列出目前目錄的檔案及目錄列表 - `-l`: 顯示詳細資訊 - ![](https://hackmd.io/_uploads/HyXz38t1a.png) - ![](https://hackmd.io/_uploads/H1LpYnzep.jpg) - 白色:檔案類型 - 紅色:檔案權限 - 橘色:連結數 - 黃色:檔案擁有者 - 綠色:檔案所在群組 - 藍色:檔案大小 - 桃紅色:最後修改日期 - 紫色:目錄或檔案名稱 - `-a`: 可以顯示所有檔案(顯示隱藏的檔案與目錄) - `-F`: 顯示檔案類型 - `-r`: 以反向排序列出檔案 - `-R`: 列出目錄下所有檔案,包含目錄下的資料夾內的所有檔案 - `-t`: 依照檔案建立時間列出 - `-S`: 依照檔案大小排序 ::: ### `/root` - 放置系統管理者的家目錄 - 系統中的神 - 可使用救援模式(root) :::info #### 什麼是 super user - 整個Linux作業系統中,最高權限的使用者 - root - 權限很高不建議直接使用 root,下錯指令就 gg - 當我們需要使用較高權限怎麼辦? - `sudo` : 可以用來取得 root 權限 ::: ### `/home` - `/home` ![](https://hackmd.io/_uploads/rJM4ZHyBn.png) - 系統預設的使用者家目錄 - 新增一個一般使用者帳號時,此使用者的家目錄應該會此目錄底下 :::info - 代號: - `~` 目前使用者的家目錄 - `~` <使用者名稱>` 此使用者的家目錄 ::: ## 根目錄下的子目錄 ### `/bin` Binary - `/bin` = binary - 放一些一般使用者可以操作的[基礎指令](https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s04.html) ![](https://hackmd.io/_uploads/H1m0lHyr2.png) - `/bin` 底下的指令可以被 root 與一般帳號所使用 - e.g. `cat`, `mkdir` 等指令 :::info - `cat`: 將檔案內容印出 - `mkdir`: 建立目錄 ::: ### `/sbin` Super user Binaries - `sbin` Super user Binaries - 放置一些[超級使用者權限才能使用的指](https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s16.html),以及一些一般使用者可以使用的指令 - 包括開機、修復、還原系統所需要的指令 - 與系統管理有關的指令 - e.g. `shutdown`, `update`, `ifconfig` :::success #### ifconfig - 安裝 ```bash= sudo apt install net-tools ``` - 輸入 `ifconfig` 查看目前啟用的網路介面 - ![](https://hackmd.io/_uploads/SycnTKtkT.png) - 關閉網路介面卡 - 網卡關掉就不能上網 - ❗要記得網卡名稱,不然關上就打不開了❗ ```bash= ifconfig <網卡名稱> down ``` - 開啟網路介面卡 ```bash= ifconfig <網卡名稱> up ``` - 查看所有網卡 ```bash= ifconfig -a ``` - 查看指定網卡: ```bash== ifconfig <網卡名稱> ``` ::: ### `/lib` - `/lib`= Library ![](https://hackmd.io/_uploads/S13EWr1rh.png) - 系統函式庫和核心函式庫 - ex:開機時使用的函式庫, - `/bin` 或 `/sbin` 底下指令會呼叫的函式庫 :::info #### 什麼是函示庫? - 程式的圖書館 - 就像是一群已經寫好的 Function 包起來變成一個 Library,當我要使用這個 Function 時,我們只需要 import 包含這個 Funtion 的 Library。 - 例子:如果我們要做高登食譜裡的糖醋排骨,我們只需要在高登食譜中的目錄中去目錄中尋找糖醋排骨,在根據裡面的食材和步驟做糖醋排骨。 - 目錄就等於 `lib`,食材及步驟等於 Function #### 什麼是 binary? - binary file = 二進位檔案 - 電腦檔案分為 binary file 和 ASCII(純文字檔案) - 二進位檔是將資料以二進位的格式儲存,例如影像檔或執行檔 - 一般文書處理軟體並不能處理二進位檔,如果以記事本開啟二進位檔,只會出現一堆亂碼 - 64 or 32 lib - lib64,支援 64 位元的函式庫 - lib32,支援 32 位元的函式庫 - 查看你是 64 bit 還是 32 bit ```bash= uname -a ``` ::: ### `/etc` :::success #### vim - 安裝 ```bash= sudo apt-get install vim ``` - 編輯相關指令 - i: 進入編輯模式 - esc:離開編輯模式 - 儲存、離開等指令 - `:w`:存檔 - `:q`:離開 vim - `:!`:強制執行 - [其他 vim 相關指令連接](https://linux.vbird.org/linux_basic/centos7/0310vi.php) - [成大資工Wiki](http://wiki.csie.ncku.edu.tw/vim/vimrc#%E4%BB%8B%E9%9D%A2%E5%84%AA%E5%8C%96) ::: - `/etc` - 放置系統主要的設定檔案 - 帳號密碼、系統的主要設定、各種服務的啟動檔 - 通常一般使用者可以查看此目錄中的檔案,但只有 root 可以修改 ![](https://hackmd.io/_uploads/B1EuyW1ep.png) - `/etc/passwd`:使用者資訊,一般使用者就可以查看 ![](https://hackmd.io/_uploads/HyDR1Wke6.png) - 使用者名稱 - 密碼欄位 - 為什麼顯示的是 `X` - 不安全` - 使用者 ID 號碼 (UID) | UID 範圍 | ID 使用者特性 | | ---------------- | -------------- | | 0 | 系統管理員 | | 1 ~ 999 | 預留給系統使用 | | 1000 ~ 4294967295 | 一般使用者 | - 使用者的群組 ID 號碼 (GID) - 使用者名稱 - 使用者家目錄 - 登入後使用的 shell 的路徑 - 不能亂刪 :::success ### Demo 修改使用者家目錄 ::: - `/etc/shadow`:真正放置使用者密碼的地方,原理是將 `/etc/passwd` 的檔案加密移至 `/etc/shadow` ,且只有 root 可以查看,防止破譯 - 使用者名稱 - 密碼:已被編碼(雜湊)處理(不可逆) | 符號 | 符號意義 / 雜湊方法 | | ----------- | ------------------- | | ! | 被禁用 | | * | 不能登入 | | `$1$` | MD5 | | `$2a$` / `$2y$` | Blowfish | | `$5$` | SHA-256 | | `$6$` | SHA-512 | - 上次密碼變更日期 - 密碼最短使用期限 - 變更密碼之後,如果還要更改密碼,必須等的時間,單位為天 - 若此欄位為空白或 0,表示停用此功能,隨時可更改。 - 密碼最長使用期限 - 一組密碼最久可以使用的時間,然後就要更改密碼,單位為天 - 密碼過期後,仍可以使用,但在下次登入時,系統會要求使用者立即變更密碼 - 若此欄位是空的,則代表停用此功能 - 若此欄位為 99999 表示密碼不需要重新設定 :::info - 若密碼最長使用期限的值小於密碼最短使用期限,則此使用者就會不能更改自己的密碼 - 使用者 123 - 密碼最短使用期限: 100 - 密碼最長使用期限: 10 ::: - 密碼需要變更前的警告 - 上例 7 表示 7 天內系統會警告帳號 - 密碼過期前多久,系統會對使用者發出警告,單位為天 - 若此欄位為空白或 0,表示停用此功能 - 密碼過期的放寬時間 - 當密碼過期後,使用者還有多久的時間可以登入更改密碼,單位為天 - 如果此欄位是空的則代表關閉此功能 - 帳號過期日期 - 從 1970 年 1 月 1 日算起的天數 - 如果此欄位是空的則代表關閉此功能 - `/etc/group`:放置關於系統管理員對使用者和使用者群組管理文件 - 群組名稱:不可重複 - 群組密碼:通常不需要設定(空白或 x) - 群組 ID (GID) - 支援的帳號名稱 ### `/boot` - `/boot`= bootstrap ![](https://hackmd.io/_uploads/BkJ1Zr1Bh.png) - 放置系統開機時會使用的相關載入檔 - 包括 Linux 核心檔案以及開機選單與開機所需設定檔 - `initrd.img` - Initial ramdisk - 在啟動階段會被 Linux 呼叫 - 縮短開機時間 - 暫時的 root file system,用於全新安裝,crash急救,網路開機等時候 - 需要在掛載檔案系統前準備好,但還沒有工具 - `/etc/grub` - 開機管理模式 - 支援多個作業系統啟動 - ![](https://hackmd.io/_uploads/r1IxmpGlp.png) > [照片來源](https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.fosslinux.com%2F115040%2Fa-complete-guide-to-installing-grub-bootloader-on-linux.htm&psig=AOvVaw20FScA40KSVLd3udLGZkpD&ust=1695978468270000&source=images&cd=vfe&opi=89978449&ved=0CBEQjRxqFwoTCKj9gKP6zIEDFQAAAAAdAAAAABAg) ### `/dev` - `/dev`= device ![](https://hackmd.io/_uploads/SJ21ZHJSn.png) - 任何硬體裝置與周邊設備的相關資料,都以檔案型態儲存在`/dev`中 - 在 Linux 中,**所有東西都以檔案存在** - ex:鍵盤、滑鼠等 - `/dev/input` - 放置外接式設備資訊的目錄 - 滑鼠 - `/dev/null`:空裝置 - 一個特殊的裝置檔案 - 丟棄一切寫入其中的數據 - 被稱為黑洞 - 小測試 ```bash= cat <檔案名稱> > /dev/null ``` :::info #### Bash 環境中的資料流導向 - 標準輸入 (stdin) - 代碼: 0 - `<` - `<<` - 標準輸出 (stdout) - 代碼: 1 - `>`: 覆蓋 - `>>`: 累加 - 標準錯誤輸出 (stderr) - 代碼: 2 - `2>`: 覆蓋 - `2>>`: 累加 <!-- - 其他 - `|`: pipelines, 把前一個指令的輸出當下一個指令的輸入 ```bash= ls -al /dev | grep null ``` - `&`: 背景執行 - `$`: --> ::: ### `/mnt` ![](https://hackmd.io/_uploads/BJd8bBJSn.png) - 為管理員、使用者**手動**掛上(mount)的目錄 - 暫時掛載某些**額外**的裝置 - 與 `/media` 不同的是,`/mnt` 需要系統管理員手動掛載至目錄 - 以前只有 `/mnt` 沒有 `/media` - `/mnt` 掛載不會顯示在 nautilus left panel :::info #### 什麼是掛載 - 由作業系統使一個儲存裝置(諸如硬碟、CD-ROM或共享資源)上的電腦檔案和目錄可供使用者通過電腦的檔案系統訪問的一個過程 - 將裝置的檔案(萬物皆檔案)放在系統的某個位置使他們連接 - ex: 在本機安裝一台光碟機,這台光碟機就會掛載在 `/dev` 裡面,光碟機的檔案會自動放在 `/media` 中 ::: ### `/media` ![](https://hackmd.io/_uploads/SyiHZrkBn.png) - 放置可以移除的自動裝置掛載目錄 - ex:軟碟、光碟、DVD - 但並非所有 Linux 都會自動掛載(Ubuntu 會) :::info #### 怎麼區分 `/dev`、`/mnt`、`/media` | 目錄 | 目錄內容 |例如在 Ubuntu 上接 USB| | -------- | -------- | -------- | | `/dev` | 放置各種硬體設備檔案 | 只要 USB 成功連接上了電腦,`/dev` 下就會顯示 USB 的設備檔 | | `/media` | 放置可移除的裝置**自動掛載**的目錄 | **系統**會自動將 USB 中的檔案掛載到 `/media` | | `/mnt` | 放置臨時**手動**掛載的目錄 | **系統管理員**可以手動將 USB 中的檔案手動掛載至 `/mnt` | - 如果系統管理員沒有特別將 USB 中的檔案手動掛載至 `/mnt`,則 `/mnt` 不會顯示 USB 中的檔案 ! ::: ### `/opt` - 放置第三方軟體的目錄 - 怕這個檔案汙染系統的話,可以把雜七雜八的東西放在這裡 - ex:chrome :::info ### 什麼是第三方軟體? - 額外安裝到 Linux 中的軟體 - 透過非 `apt install` 指令安裝的,都安裝至 `/opt` - ex: dpkg #### apt v.s. dpkg - 方便軟體的安裝、更新及移除的工具 - dpkg = Debian Packager - 基礎工具 - 可以直接透過 .deb檔案將套件安裝至系統上 - 只能處理單一檔案 - `dpkg -i <package.deb>` - apt = Advanced Packaging Tools - 高級工具 - 將dpkg再包一層的套件管理系統 - 同時會下載和安裝相關的軟體及套件 ::: :::success ### 小實作 - 安裝第三方軟體: Chrome - 下載安裝檔 ```bash= wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb ``` - 安裝 ```bash= sudo dpkg -i google-chrome-stable_current_amd64.deb ``` - 如果是 M1 的同學請用以下方法 ```bash= sudo apt install chromium-browser ``` ::: ### `/srv` - srv = service - 放置一些 Ubuntu 規定的網路服務啟動後所需取用的資料目錄 ![](https://hackmd.io/_uploads/rkTvWrJrh.png) - ex:`/srv/ftp` ### `/tmp` - 放置暫存檔案 (雜七雜八的東西) ![](https://hackmd.io/_uploads/Hkd_ZHJBn.png) - 不適合放重要資料,因開機時通常 `tmp` 的資料會刪除 - 任何人都能夠存取 - 容易被放病毒 - 解決方法:提高權限 - `/tmp` 的權限是 777 - 777:所有使用者與群組的權限可讀可寫可執行 - 因為 /tmp 是讓所有使用者暫存檔案的地方,所以要可讀可寫 ### `/run` - 放置系統開機後在運作後所產生的資訊 - 不建議放重要檔案 - 放置臨時檔案的目錄 - ![](https://hackmd.io/_uploads/BkxY-SJr3.png) - ex: .pid - 內容只有一行,紀錄目前的 process 的 id 是多少 (pid) - 防止同個 service 同時啟動多個副本 - 會導致這些副本互相搶資源 - 啟動服務前會先檢查有沒有 .pid - 有,就停止啟動服務 - 沒有,就啟動服務,然後把此服務的 pid 存進 `<service> .pid` - 其它同一個 service 的多餘 process 則自動退出 - 當關閉服務時,`<service>.pid `也會跟著被刪除 (kill) ### `/usr` 及其子目錄 - `/usr`: Unix software resource 縮寫 - 放置 Unix 作業系統軟體資源,相關軟體、服務等,非使用者資料 - 跟系統核心運作無關的一些可有可無的檔案 ![](https://hackmd.io/_uploads/H1qtZByHn.png) - 安裝時此目錄會佔用最多磁碟容量 #### `/usr/bin` - 放置一般使用者能夠使用的指令 - 使用者安裝的程式的指令會在這裡 - 此目錄下不能再有子目錄 #### `/usr/sbin` - 非系統平時運作所需要的指令 - 通常給超級使用者使用 #### `/usr/lib` - 額外安裝的函示庫存放在此 - ex: python 的函式庫 :::info #### 合併 - 2021 Feb 將以下目錄合併 - `/bin` 和 `/usr/bin` - `/sbin` 和 `/usr/sbin` - `/lib` 和 `/usr/lib` - 現在是都一樣的功能 ::: :::warning #### 為什麼需要有 `/usr/bin` ? - 合併前 `/usr` 意思非 Unix software resource,而是 user - 原始目錄目的:在一開始開發的時候,使用的是 1.5 MB 的 disks,後來當這個硬碟滿了後,才創建 `/usr` 目錄 - `/bin` 放置的是系統必備的二進位檔案,且需要在 `/usr/bin` 安裝前就可以使用 - `/usr/bin` 放置的檔案包含系統核心操作的非必備檔案,像是一些應用軟體工具的執行黨 - ex:c++、gcc ::: :::info #### 差異 | 目錄 1 | 功能 | 目錄 2 | 功能 | | ------ | ---- | ------ | ---- | | `/bin` | 單用戶模式時,系統啟動或修復時所需的執行檔案。 | `/usr/bin` | 普通用戶使用且不需要啟動的檔案 | | `/sbin` | 只有 super user 可執行且系統必備的檔案,非一般使者執行的檔案。 | `/usr/sbin` |只有super user 可執行但非系統平時運作所需要的指令 | | `/lib` | `/bin` 或 `/sbin` 函式庫,主要是系統運行所需的函式庫 | `/usr/lib` |`/usr/bin` 和 `/usr/sbin` 的函式庫,多為系統的普通使用的函式庫 | ::: #### `/usr/local` - 放置管理員自行安裝的軟體(非系統預設提供的),方便管理 ![](https://i.imgur.com/IJXOk6Z.png) - 此目錄下也有 `/bin` 、`/etc` 、`/include` 、`/lib` 等目錄 - 軟體升級新版系統或新發行版時,可以安裝在這 - 為避免影響原系統中的軟體 - 無須重新安裝全部程式 - 可以與原先系統提供軟體版本做區分 :::info #### `/usr/local/bin`、`/usr/local/sbin` 及 `/usr/local/lib` - `/usr/local` 放置的是 使用者自己安裝的應用程式相關檔案,非操作系統本身的檔案 - 下載應用軟體或編譯原先軟體的檔案後,編輯後的 `./configure` 系統通常會預設 `prefix` 至 `/usr/local` - `./configure --prefix/usr/bin/` - `/usr/local/bin` 儲存以上軟體的一般使用者執行檔案 - `/usr/local/sbin` 儲存以上軟體的超級使用者才能執行的檔案 - `/usr/local/lib` 放置`/usr/local/bin` 跟`/usr/local/sbin` 的函式庫 > 跟 /opt 差異: > /opt 裝得是一些系統使用者自行安裝的較混雜的軟體 ::: :::info #### 什麼是 prefix ? - prefix = 配置安裝路徑 - 避免雜亂 - 容易刪除或複製 - 可以與其他原先檔案做區隔,較不會污染其他目錄 - 可以使用 prefix 指定:`./configure --prefix=/usr/lcoal/test` - 相關的檔案就會都放在 `/usr/lcoal/test` ::: ### `/var` 及其子目錄 - `/var` = variable - 記載著各種系統上的變數的地方,針對常態性變動的檔案 - 系統開始運行後,會漸漸開始佔用硬碟容量 - 快取 (cache)、紀錄檔 (log file) 以及某些軟體運作所產生的檔案 - 適合存放需要頻繁改寫的檔案 - ex: mysql 的檔案 #### `/var/cache` - 放置程式本身運作過程中會產生的一些暫存檔 - `/var/cache/apt`:放置apt 命令安裝的 package - 下載過程時會先儲存在 `/var/cache/apt/archives/partial` 中 - 下載完畢後,會被轉移至 `/var/cache/apt/archives` 目錄中 - 如果需要重新下載應用程式,系統會在此目錄中尋找並獲取暫存黨,不需要重新安裝,節省安裝時間 #### `/var/lib` - 放置程式運作過程中需要使用到的資料檔案 - ex:MySQL 的 data base 跟 table 通常都會存在 /var/lib :::info #### About `/var/lib` - `/var/lib` and `/usr/lib` have a similar purpose. - Cause `/var` is variable so the directory in `/var/lib` is writable. - The `/usr` directory which is often required to be read-only. - ex: 如果我使用 MySQL,我的 MySQL 函式庫檔案會放在 `/usr/lib`,但我需要寫入 MySQL 的資料庫會放在 `/var/lib`,且資料庫內容會因為寫入而一直變更 ::: #### `/var/lock` - 放置被上鎖的檔案 - 當一個檔案正在使用時一次只能被一個應用程式使用時,因此當檔案被使用時,需將檔案上所防止他人使用。 - 避免兩個檔案同時運作是發生問題 - 目前此目錄也已被挪到/run/lock 中! #### `/var/log` - 放置登入檔案的目錄 - 非常重要,因此目錄紀錄了系統的重要訊息及錯誤訊息等,如果沒有紀錄的話可能會不知道有問題,也無法進一步解決問題 - `/var/log/syslog`:紀錄系統登入資訊記錄及Kernel錯誤或警示資訊記錄等等 - 設定檔案在`/etc/syslog.conf` or `/etc/rsyslog.conf` - `/var/log/boot.log` or `/var/log/bootstrap.log`:記錄系統開機或者服務啟動時,顯示的啟動或關閉訊息 - `/var/log/mail.log`:紀錄郵件的往來資訊 - `/var/log/wtmp` : 記錄登入者的相關資訊 - `var/log/btmp` : 紀錄登入失敗的資訊 #### `/var/mail` - 放置個人郵箱信件的目錄 - 目前這個目錄也被放置到 /var/spool/mail/目錄中 #### `/var/spool` - 放置佇列資料 - 佇列資料 : 排隊等待其他程式使用的資料 - ex: 要列印東西 - 使用後的資料通常會被刪除 ## 沒在 FHS 但重要的目錄 ### `/lost+found` - 如果系統檔案發生錯誤,會將遺漏的訊息放置到此目錄 - 通常此目錄為空白的 - ext2/3/4 有此目錄 - reiserfs、tmpfs 沒有此目錄 ### `/proc` - `/proc` = process:放置系統中處理程序及執行緒的相關狀態資訊 - 目錄本身是一個虛擬檔案系統(virtual filesystem) - 目錄中放置的資料是在記憶體中,因此不佔硬體空間 - 使用 `ls -l`查看大小為 0 - 檔案可讀可寫 - ex: 系統核心、process 資訊、周邊裝置的狀態、網路狀態等等 - `/proc/cpuinfo`:紀錄 cpu 相關資訊 - `/proc/interrupts`:紀錄系統中產生的中斷的詳細信息 ### `/sys` - `/sys` = sysytem - 記錄 kernel (核心) 與系統硬體相關的資訊 - ex: 已載入的核心模組、核心偵測到的硬體設備資訊 - 與 `/proc` 相似,同樣為虛擬檔案系統,不佔硬體空間 - 可以說是新的 `/proc` - `/sys/devices`:紀錄系統設備,並按照設備類型分類