探索Linux核心 | 解讀/bin、/dev和/usr等重要檔案架構


本文詳細的說明Debian系統中的檔案結構,從根目錄出發往下延伸三個階級的資料夾,說明每個資料夾的用途、名稱以及存放的內容,並實際走訪安裝好的系統進行拆解分析。{alertInfo}

目錄

    前言

    筆者剛接觸Linux時,很不習慣要用終端機開啟檔案系統才能複製或貼上檔案。而每個檔案又有不同權限要顧及,最麻煩的是上網找到了解法,卻不知道那個檔案放在茫茫大海中的何處,就還要再搜尋檔案在哪裡。

    為了讓大家使用Ubuntu, Debian或者任何Linux分支系統能夠更順利,這篇文章把檔案系統的結構與內容攤開來給大家看,趕快收藏起來方便查找檔案在哪裡吧!

    這篇文章參考李博明先生的著作:64位元 Debian Linux作業系統實務 Buster版, pp.167-169, Sep, 2020

    Debian檔案系統與多數Linux檔案系統一樣,主要從根目錄開始分成幾大類

    以下是筆者電腦的檔案系統,從最底層目錄出發往下延伸三個階級,列出常用的/bin, /mnt,/ usr等等,實際上還是會因為使用者安裝的軟體還有系統版本有些許差異,還請讀者留意

    
    /			根目錄,系統最上層
    /bin			Binaries, 給所有使用者的必要執行檔
    /boot			開機核心(kernel)映像檔以及啟動必要資訊, Bootloader等等
    ┖―/grub			給Grub Bootloader存放之目錄
    /dev			Device, 所有裝置的目錄,包含硬碟,週邊界面等等
    /etc			Etcetera,系統所有設定檔目錄,包含使用者安裝的軟體
    ┖―/Gtk3.0			Gtk3.0 插件的統設定檔
    /home			使用者家目錄,同Windows下使用者資料夾
    /lib			Library, 系統用到的動態連結函式庫與核心模組目錄
    ┖―/modules		Module, 系統用到的核心模組目錄
    /lib32			Library 32bit, 系統用到的32位元動態連結函式庫 (現已改成連結)
    /lib64			Library 64bit, 系統用到的64位元動態連結函式庫 (現已改成連結)
    /lost+found		修理硬碟時儲存檔案的目錄
    /media			可疑除媒體之掛載目錄,如USB,外接硬碟等等
    /mnt			臨時掛載目錄
    /opt			Option, 使用者自訂軟體安裝目錄
    /proc			Process, 核心與行程所使用到之虛擬檔案系統
    /root			root之家目錄
    /run			系統執行之資訊如pid, lock等內容
    /sbin			System Binaries, 進行系統操作時,所使用的執行檔存放目錄
    /srv			Service, 儲存由主機提供服務的目錄
    ┖―/ftp			File Transfer Protocol, 儲存ftp service的資料目錄
    /sys			System, 儲存系統核心,韌體與資訊之目錄
    /tmp			Temporary, 暫存檔目錄
    /usr			User System Resources, 儲存動態主要執行檔, 動態連結函式庫等等之目錄
    ┠━/bin			一般使用者所使用之可執行檔存放目錄
    ┠━/games		系統內建遊戲安裝目錄
    ┠━/include		C語言必須包含之標頭檔目錄
    ┠━/lib			動態連結函式庫檔案存放目錄
    ┠━/local		系統管理員自訂軟體安裝目錄
    ┠━/bin			系統管理員安裝之可執行檔目錄
    ┠━/etc			系統管理員自行安裝軟體設定檔目錄
    ┠━/games			系統管理員自行安裝遊戲目錄
    ┠━/include	    	系統管理員自行安裝C語言必須包含之標頭檔目錄
    ┠━/lib			系統管理員自行安裝動態連結函式庫檔案存放目錄
    ┠━/sbin		    系統管理員自行安裝之操作系統執行檔存放目錄
    ┠━/share		系統管理員自行安裝之分享檔案目錄
    ┠━/src			Source, 系統管理員自行編輯軟體原始碼目錄
    ┠━/sbin			比較不重要之系統執行檔存放目錄	
    ┠━/share		與系統架構無關之資料檔案目錄
    ┖―/src			 Linux 原始碼編譯目錄
    /var			Variable data files, 存放系統各種資料檔目錄
    ┖―/www			 提供www資料之存放目錄
    /backups		Advanced Package Tool, APT備份目錄
    /cache			應用程式快取
    /log			系統日誌檔目錄
    /spool			應用程式排存資料目錄
    /lock			應用程式鎖定檔目錄
    
    讀者可以開啟終端機並使用tree指令來描繪從當前資料夾下方的檔案樹狀圖
    $ tree -L 3
    再輸入之前可以先移動到根目錄"/",在輸入指令,這樣能夠從根目錄開始往下繪製檔案樹狀圖。在這個指令中,-L能指定要繪製幾階的樹狀圖。

    接著,讓我們按照順序了解每個資料夾在做什麼吧

    /bin, /usr/bin, /usr/local/bin

    /bin的內容是所有使用者都可以用且為必要執行檔,如ls, bash, cat等等。
    /usr/bin存放的是所有使用者非必要執行檔,如unzip等等。
    /usr/local/bin則是使用者自行安裝的執行檔,像是firefox, chrome等等。
    Debian 在buster版本將原本的/bin指向/usr/bin,只保留後者作為系統的必要執行檔資料夾

    /sbin, /usr/sbin, /usr/local/sbin

    /sbin的內容是系統管理員可以用且為必要執行檔,如fdick, ifconfig, mount等等。
    /usr/sbin存放的是系統管理員非必要執行檔,如laptop-detect等等。
    /usr/local/sbin則是系統管理員自行安裝的執行檔,像是fan-control, sensors-detect等等。

    /boot, /boot/grub

    boot存放的檔案主要以核心為主,主要在目錄會有幾個檔案

    config-5.10.0-8-amd64

    這個檔案室主要核心編譯檔,版本是5.10.0-8, CPU架構是x64,這個設定檔讓我們可以依照其設定編譯自己Linux核心

    initrd.ing-5.10.0-8-amd64

    這個檔案是核心的initrd (Initial Ram Disk)映像檔,是Linux一開機時載入的小系統,詳細說明可以看Linux系統啟動程序的說明。

    system.map-5.10.0-8-amd64

    這是核心必要符號表(Symbol Table)

    vmlinuz-5.10.0-8-amd64

    這才是最後編譯完的Linux系統核心

    efi/

    這是存放EFI Bios開機時會用到的檔案

    grub/

    存放Boot Loader相關資料,其中/boot/grub/grub.cfg是Debian預載的系統啟動引導程式設定檔,可以調整內部設定來設定開機選單。

    /dev

    Linux系統將裝置都看成一個檔案,對裝置讀寫就是對檔案進行讀寫。
    其中/dev資料夾下的裝置型別有以下幾大類:

    光碟機,硬碟機

    光碟機與硬碟機都是字元讀寫裝置,在使用到的時候是以一個block來進行存取的。
    其中按照編號光碟機會以sr-作為前綴,硬碟機則依照介面分成SATA(sd)與傳統機械硬碟(hdd-)而現在比較新的使用M.2介面,或者嵌入式系統用的SD卡,則可能是(nvme-)或者(mmcblk-)前綴
    可以觀察檔案類別的名字是否為disk來判斷,下圖筆者就只有m.2硬碟與外接sd卡,因此只有nvme與mmcblk兩個裝置,後面的數字則是代表硬碟的第幾個分割區。
    可使使用指令來找出電腦的硬碟設備
    $ ls -l /dev |grep disk

    終端機


    終端機,TeleTYpe(tty) 在早期電腦發展時,所有的指令與程式碼都要經營終端機顯示給使用者看,很像現今的螢幕但是畫質更低,甚至是使用紙帶當成終端介面的。
    為了讓電腦達到多人多工的效果,發展出一台主機多個終端機的結構。
    而在Linux系統中,終端機使用tty簡稱,在Linux桌面環境中只需要按下Alt+F2就可以叫出第二個終端視窗,登入第二個使用者帳號。

    串列埠

    我們常在微處理機上使用的串列終端機(Serial Terminal)則是以ttyS表示,S代表Serial。多數時候ttyS會是USB-UART轉換器、USB-I2C轉換器等等。

    USB

    而USB滑鼠、搖桿等裝置則會顯示在/dev/input目錄下方


    特殊裝置

    為了讓系統使用起來更方便,開發者在/dev資料夾下方利用"裝置即檔案"的概念建立了一些特別的裝置檔,這些檔案並沒有物理上對應到的裝置,而是供給特殊用途。

    /dev/null
    這個裝置可以接收一切訊息,但不會產生輸出,是個用來丟棄一切資料的裝置,也可以把他理解成黑洞,會吞噬所有訊息。
    當我們寫程式或者不想顯示系統回傳資料時,可將系統訊息寫入/dev/null中就不會出現在使用者視窗,若我們讀取/dev/null這個裝置,會得到EOF(End of File)的訊息。
    /dev/random
    這是一個產生亂數的裝置,在密碼學以及需要亂數的場合非常有用。
    /dev/stderr, /dev/stdin, /dev/stdout
    stderr: 標準錯誤輸出裝置,用來輸出錯誤訊息的,通常是螢幕
    stdin: 標準輸入裝置,一般是鍵盤
    stdout: 標準輸出裝置,用來輸出正常訊息的
    /dev/zero
    產生空字元的裝置,一般與"dd"指令合用,將硬碟或檔案全寫入0,例如:
    $ dd if=/dev/zero of=test.img bs=1M count=100
    接著用hexdump來看img檔案的內容,可以發現全部都是0
    $ hexdump test.img

    /etc

    /etc資料夾存放系統、網卡、開機時該載入的模組直到使用者的Chrome瀏覽器設定都在這邊,因此/etc是輩分電腦時依定要備份的目錄,主要重要的項目有以下:

    /init.d

    init.d的後綴.d並不是副檔名是d的意思,而是指這是一個directory的意思。
    這個資料夾存放的主要是系統會啟動的服務,包含網路初始化、鍵盤初始化等,也是系統載入核心後第一個啟動的程序"init"的設定檔所在地。

    /udev

    放udev(userspace implementation of device file system)所需要的重要檔案(rules)。
    先前/dev目錄中提到連接帝腦的裝置都被視為檔案,那如何將裝置轉換成對應的檔案則要透過"udev"來管理編譯。
    udev 可以利用裝置的屬性,例如: vender ID, device ID,來動態識別裝置,並為裝置建立一個具有一致性且專屬的名稱。
    udev 允許以定義 rules 的方式,來對同一個裝置設定同一個名稱,不管這個裝置是連接在 port 上。

    /X11

    如果電腦有安裝桌面環境系統,/etc/X11就是桌面系統的設定檔所在位置,包含視窗管理員(Windows Manager)的設定等等。

    /skel

    存放使用者模板的位置,當新增使用者時系統可以直接拿模板的內容為新使用者進行設定。

    /rc*.d

    這組資料夾可能同時有rc0.d 到rc6.d 以及 rcS.d,這是用來告訴Linux系統在哪一個"啟動級別" (run level) 要執行那些工作。
    rc就是Run Command的簡稱,其中run level是由 Linux Standard Base 制定的。
    目前的LSB規範在第5版,將啟動級別分成0~6 與特殊的單一使用者S (Single) 共八種,run level0~6則分別對應到rc0.d~~rc6.d,而ruun level S則對應到rcS.d。
    系統會優先執行rcS.d下的腳本,之後才執行其他數字資料夾的腳本。
    rc0.d: 系統關閉時使用的腳本。
    rc1.d: 單使用者模式(root),這時使用者只能是root,為系統維護用。
    rc2.d: 多使用者模式,這時沒有啟動網路謝面與網路服務。
    rc3.d: 多使用者模式,開機後進入文字模式,沒有圖形介面但有網路。
    rc4.d: 暫時不使用,保留給未來的run level。
    rc5.d: 多使用者模式,開機後進入圖形化介面,需要XWindow環境。
    rc6.d: 系統重新開機用。
    rcS.d: 單一使用者模式,不啟動網路與伺服器程式,為系統維護用。
    詳細介紹可以參考: Linux Pi的奇幻旅程(16)-大改造(續)

    /home, /root

    這個資料夾存放使用者的檔案,包含下載、桌面、音樂等等,假如user叫habonroof,使用者資料會放在/home/habonroof/
    但root使用者獨立出來放的,同時一般使用者是無法對這個資料夾進行讀取與寫入的。

    /lib, /usr/lib, /usr/local/lib

    這三個目錄都是存放動態連結函示庫(Dynamic Linking Library, DLL),而動態連結是指當程式需要用到Library時才進行連結,這樣可以避免程式在編譯時由相對的"靜態連 結"導致的檔案肥大。
    但另一方面若使用者將Linux kernel移植到擴充性較差的平台時,則多半換選用SLL(Static Link Library)避免不必要的開發困境,但缺點就是每次更新核心時都需要將函示庫 重新編譯。
    /lib:系統用到的動態連結函示庫與核心模組。
    /usr/lib:動態連結函示庫檔案存放目錄。
    /usr/local/lib:使用者自行安裝之動態連結函示庫檔案存放目錄。
    與/bin檔案夾一樣,Debian在buster將/lib目錄與/usr/lib目錄整合再一起,而為了保留相容性,原本的/lib變成連結檔連結到/usr/lib。

    /lib32, /lib64

    這兩個檔案是個別針對32-bit 與 64-bit的程式所對應的動態連結函示庫。
    /mnt, /media 這兩個目錄是用來掛載儲存裝置的目錄,如果沒有掛載裡面都是空的。
    掛載的指令可以用"mount"來執行。

    /opt, user/local

    這兩個目錄都是存放自行安裝的軟體,但/usr/local是給系統管理員安裝的,而/opt則是一般外加應用程式的附加軟體。
    一個人使用習慣,可以把大型軟體安裝在/opt,小型軟體安裝在/usr/local。

    /proc, /sys

    /proc存放核心與行程所使用的虛擬檔案系統,也可理解成proc/顯示了系統當前狀態。
    如輸入指令
    $ cat /proc/cpuinfo
    可以得到系統CPU的資訊,其他像是: diskstatus表示目前磁碟狀態,devices表示目前裝置狀,dma 表示目前DMA狀態,interrupts表示目前中斷狀態,meminfo表示目前記憶體狀態等等。
    /sys 則是做即插即用裝置的設定,是一個以sysfs檔案系統所掛載之目錄。目錄裡有一些檔案可以偵測目前系統狀態如: /sys/block 可以看到系統中有偵測到的磁碟狀態。
    如輸入指令
    $ ls /sys/block
    會回傳目前電腦連接的硬碟設備。
    依照個人使用習慣,可以把大型軟體安裝在/opt,小型軟體安裝在/usr/local。

    /tmp

    暫存檔案目錄,重新開機會消失。

    /usr

    使用者的雜項目錄,像windows中 C:\windows與C:\Program Files的混和體。

    /var

    這個資料夾會是系統Cracker入侵系統後第一個要處理的地方,因為這裡會有它登入的足跡。
    身為一個間諜一定要把自己的紀錄抹除,以下介紹常用的系統紀錄與日誌檔案。

    /log

    裏頭含有相當重要的系統日誌檔,包含哪個IP從哪裡登入系統,登入成功或失敗等等資訊。

    /log/auth

    相當重要的資料夾,這個檔案紀錄有誰得到root權限,還有誰嘗試登入卻失敗的紀錄。

    /dmesg

    紀錄系統設備訊息(Device Message),包含從系統啟動的一瞬間開始初始化紀錄、啟動紀錄等等。

    /log/syslog

    紀錄系統發生過的訊息,例如無線上網的過程等等。

    /var/cache

    存放APT套件管理程序的暫存檔案,如.deb之類的。

    /var/lock

    有些程式一次只能限一個使用者執行,如aptitude。當有人執行apt時會在這個資料夾建立一個檔案來避免其他程序衝突。

    總結

    這篇文章列出Linux檔案系統中常見到的資料夾,並針對其應用進行說明。在使用Linux系統的時候總是會留有Windows系統的習慣,常常去找C槽、我的電腦在哪裡,但是有經驗一點的使用者會知道實際上作業系統沒辦法看到C曹跟其他槽同時並列在一個資料夾下面,Windows的檔案總管介面其實是經過特殊設計才讓使用者可以點進C槽的。
    除此之外,筆者也很鼓勵大家平常有空或者進行軟體更新的時候可以留意每一個應用程式的位置,或者系統正在對什麼檔案進行操作,相信這小小觀察在未來能夠更理解每個資料夾的用途與說明!

    Post a Comment

    留個言吧

    較新的 較舊