Skip to content

antony@notes:~/suse$ cat "The-Linux-Filesystem.md"

The Linux Filesystem

2023-04-02· suse ·SUSE Linux Enterprise Server

The Linux Filesystem

Preface

本文主要介紹在 Linux 的檔案系統中,了解什麼是 FHS 、根目錄下一層的那些子目錄代表那些含意、檔案和連結分為哪些類別。

可以透過點擊展開以下目錄,選擇想看的內容,跳轉至特定章節

:::warning

:::spoiler 文章目錄

[TOC]

:::

Understand the Filesystem Hierarchy Standard

Filesystem Hierarchy Standard (FHS)

檔案系統階層標準

  • 目標 : 讓使用者可以瞭解到已安裝軟體通常放置於那個目錄下
  • LSB(Linux Standards Base)規範的一部分
  • 定義哪些目錄必須位於第一層,以及這些目錄包含哪些內容。
  • 定義兩層層次結構
    • 頂層目錄(最上層的目錄在根目錄下)
    • 第二層在 /usr/var 目錄下
  • 這個規範考慮了三個設計因素
    • Compartmentalization (隔離性)
    • Writability (可寫性)
    • Shareability (共享性)

The Linux File System Structure

根目錄/

指的是文件系統樹的最高層。這個 root partition 在系統啟動時首先被掛載。所有的程序 在系統啟動時運行的所有 程序都必須在這個 partition 中。

以下目錄必須在 root partition 中。

  • /bin - 使用者二進位檔案 (在單人維護模式下還能夠被操作的指令)
  • /dev - 設備文件
  • /etc - 配置文件(系統主要的設定檔)
  • /lib - 程序庫(程式的相依檔)
  • /sbin - 系統二進製文件 (開機過程中所需要的,裡面包括了開機、修復、還原系統所需要的指令。)

所有使用者的基本二進製文件 (/bin)

在沒有安裝其他文件系統時需要的可執行文件。 例如,系統啟動、處理文件和配置所需的程序。

  • /bin/bash - bash shell
  • /bin/cat - 顯示文件內容
  • /bin/cp - 拷貝文件
  • /bin/dd - 按 byte-wise (字節順序) 複製文件
  • /bin/gzip - 壓縮文件
  • /bin/mount - 掛載文件系統
  • /bin/rm - 刪除文件
  • /bin/vi - 編輯文件

System Binaries (/sbin)

管理系統的,只有系統管理員可以使用,而一般使用者無法直接使用,因此它不在普通用戶的路徑中。

  • /sbin/yast - 管理工具
  • /sbin/fdisk - 修改磁碟分區
  • /sbin/fsck* - 文件系統檢查
  • /sbin/mkfs* - 創建文件系統
  • /sbin/shutdown - 關閉系統

Libraries (/lib)

許多程序都有它們需要的共同功能。這些功能可以被保存在一個共享庫中。庫被稱為共享對象,以.so擴展名結尾。

/lib 中的函式庫通常被 /bin/sbin 中的程式所使用,子目錄中還有其他的函式庫,而核心模組則位於 /lib/modules

64-Bit Libraries (/lib64)

64 位元函式庫 (/lib64) 與 /lib 目錄相似,這是一個依賴於架構的目錄,有些系統支援不同的二進位格式,可能需 要不同版本的同一個共用程式庫。

Configuration Files (/etc)

包含了系統和服務的設定檔,大部分都是 ASCII 檔案。 一般使用者可以讀取大部分的檔案,但這可能會造成安全問題,因為一些檔案中可能包含了密碼,所以這些檔案只能被 root 使用者讀取。 依照 FHS 的規範,這裡不允許放置可執行的檔案,但子目錄中可以包含 shell scripts。幾乎每個安裝的服務都至少 有一個設定檔在 /etc 或其子目錄中。

  • /etc/SuSE-release - 安裝系統的版本
  • /etc/DIR_COLORS - ls命令的顏色
  • /etc/fstab - 用於要安裝的文件系統
  • /etc/profile - Shell登錄腳本
  • /etc/passwd - 用戶數據庫,密碼除外
  • /etc/shadow - 密碼和密碼信息
  • /etc/group - 用戶群組的數據庫
  • /etc/cups/* - 用於CUPS打印系統
  • /etc/hosts - 主機名稱到 IP 地址
  • /etc/motd - 登錄後的信息
  • /etc/issue - 登錄前的信息
  • /etc/sysconfig/* - 系統配置文件

/usr 目錄下層的架構與內容

/usr 目錄通常包含應用程式、圖形介面檔案、程式庫、本地程式、文件等系統資源。/usr 的意思是 Unix System Resources。

  • /usr/X11R6/:X Window 系統檔案。
  • /usr/bin/:幾乎所有可執行的檔案。
  • /usr/lib/:程式庫和應用程式目錄。
  • /usr/local/:本地安裝的程式(如果 /usr 從網路掛載,則在本地系統上)。此內容不會被系統更新覆寫。
  • /usr/sbin/:系統管理程式。
  • /usr/share/doc/:文件。
  • /usr/src/:核心和程式原始碼。
  • /usr/share/man/:手冊頁面。

/opt 可選應用程式目錄

  1. 存放可選的或第三方的應用程序,不被認為是 “發行版的一部分”,在這裡存儲他們的靜態文件。
  2. 如果應用程式被認為是 Linux 發行版的一部分,通常會安裝在 /usr/lib/ 而非 /opt
  3. 在安裝時,會為每個應用程式的檔案創建一個目錄,目錄名稱是應用程式的名稱。例如,/opt/novell

The Boot Directory (/boot)

  • Contains static boot loader files for GRUB2. (GRUB = Grand Unified Boot Loader)
  • Contains the kernel and initrd file identified with the links vmlinuz and initrd.

管理員的家目錄 (/root)

root 使用者的家目錄,不同於普通使用者的家目錄 /home。 必須位於 root 分割區中,這樣 root 才能始終使用其配置的環境登錄系統。

使用者目錄 (/home)

每個系統使用者都有一個指定的文件區域,登錄後成為當前工作目錄。預設情況下,這些目錄存在於 /home 中。/home 中的檔案和目錄可能位於另一個分割區或網路上的另一台電腦中。 使用者的個人資料和設定檔可以在此處找到:

  • .profile - 使用者私有的登錄腳本
  • .bashrc - bash 的設定檔
  • .bash_history - 以前在 bash 中執行的命令

Mount Point for Removable Media (/run/media/<user>/*)

可移除(動)媒體的掛載點,名稱取決於被掛發現的設備。

Examples:

  • /run/media/media_name/ (Created if labeled media is inserted)
  • /run/media/cdrom/
  • /run/media/dvd/
  • /run/media/usbdisk/

Temporarily Mounted File Systems (/mnt)

用於整合臨時使用的文件系統的標準目錄。文件系統用 mount 命令安裝,用 umount 命令刪除。子目錄默認不存在, 也不會自動創建。

Service Data Directories (/srv)

包含不同服務的子目錄。

Examples: /srv/www - 用於 Apache Web 伺服器 /srv/ftp - 用於 FTP 伺服器

Variable Files (/var)

包含了系統在運作時可以修改的檔案。 重要的子資料夾包括:

  • /var/lib/ - 變數資料庫,例如資料庫檔案。
  • /var/log/ - 服務的紀錄檔。
  • /var/run/ - 關於正在運行的程序的資訊。
  • /var/spool/ - Queues (例如印表機、電子郵件)。
  • /var/lock/ - 多使用者存取時所需的鎖定檔案。

Temporary Area (/tmp)

Where programs create temporary files while they are running

裝置檔案 (/dev)

每個系統的硬體元件都有一個相對應的檔案代表它,但不包括網路卡,因為這些是核心模組。

應用程式讀取和寫入這些檔案,以操作硬體元件。

有兩種裝置檔案:

  • Character-oriented - 連續裝置(例如印表機、磁帶和滑鼠)
  • Block-oriented - 硬碟和 DVD

與裝置驅動程式之間的連接,是透過核心通道所使用的 major device numbers (主要裝置編號)實現的。

當使用 ls -l 命令時,檔案大小會被裝置編號所取代,例如 8,0。 在過去,這些檔案是透過 mknod 命令手動創建的,但現在當裝置被核心偵測到時,它們是由 udev 自動創建的。

一些重要的裝置檔案:

  • Null device(黑洞裝置): /dev/null
  • Zero device(零號裝置): /dev/zero
  • System Console(系统控制台): /dev/console
  • Virtual Terminal(虛擬終端機): /dev/tty1
  • Serial ports(串列埠): /dev/ttyS0
  • Parallel port(並列埠): /dev/lp0
  • Floppy disk drive(軟碟機): /dev/fd0
  • Hard drive(硬碟): /dev/sda
  • Hard disk partition(磁碟分割區): /dev/sda1
  • CD-ROM drive(光碟機): /dev/scd0

Process Files (/proc)

這是一個虛擬的檔案系統,僅存在於記憶體中,用於顯示系統上正在運行的程序的當前狀態。

這些檔案不佔用磁碟空間,因為它們的檔案大小永遠是0。

包含有關單個程序的資訊的目錄以程序的 PID 號碼命名。一些數值可以被修改以實時更改系統運行方式。但這些修改 在重新啟動後都會失效。 以下是一些例子:

  • /proc/cpuinfo/ - CPU 的資訊
  • /proc/dma/ - DMA 埠的使用
  • /proc/interrupts/ - 中斷的使用
  • /proc/ioports/ - I/O 埠的使用
  • /proc/filesystems/ - Kerneal 已知的檔案系統格式
  • /proc/modules/ - 啟用的模組
  • /proc/mounts/ - 掛載的檔案系統
  • /proc/net/* - 網路資訊和統計
  • /proc/partitions/ - 現有的分割區
  • /proc/bus/pci/ - 連接的 PCI 裝置
  • /proc/bus/scsi/ - 連接的 SCSI 裝置
  • /proc/sys/* - System and kernel information
  • /proc/version - Kernel version

System Information Directory (/sys)

這也是一個虛擬的檔案系統,僅存在於記憶體中,檔案大小永遠是0。 它提供的資訊

  • hardware buses
  • hardware devices
  • active devices
    • drivers。

主要是記錄核心與系統硬體資訊較相關的資訊。 包括目前已載入的核心模組與核心偵測到的硬體裝置資訊等等。


Understand the Linux File Types

Linux File Types

7 Different types of files:

  • Normal files
  • Directories
  • Links
  • Sockets
  • Pipes (FIFOs)
  • Block Devices
  • Character Devices

Normal Files and Directories

  • Normal files
    • Sets of data addressed with one name (用一個名稱來命名的資料集合)
    • Examples:
      • ASCII 文字檔案
      • 可執行檔案
      • 圖片檔案
  • Directories
    • Organize files on the disk
    • 包含檔案和子目錄
    • Implement the hierarchical file system (實現檔案系統的階層結構)

Linux Link Types (1 of 2)

  • Hard Links 硬連結 - 在硬碟上的一個檔案可以有多個名稱(或稱為「硬連結」) - 但是所有的名稱都指向同一個 inode(即資料區塊)。 - 因此,硬連結的檔案都必須存在於同一個檔案系統中。
  • Symbolic Links 符號連結 - References to other files on the disk - The inode contains a reference to another file name - 被引用的文件可以存在於同一個文件系統或其他文件系統中。 - 符號鏈接可以引用一個不存在的文件(broken link)。

Hard links

A hard link is a directory reference, or pointer, to a file on a storage volume. The name associated with the file is a label stored in a directory structure that refers the operating system to the file data. As such, more than one name can be associated with the same file. When accessed through different names, any changes made will affect the same file data.

Symbolic links

A symbolic link contains a text string that is interpreted and followed by the operating system as a path to another file or directory. It is a file on its own and can exist independently of its target. If a symbolic link is deleted, its target remains unaffected. If the target is moved, renamed or deleted, any symbolic link that used to pointto it continues to exist but now points to a non-existing file.

What is inode

每一個 inode 都有號碼,而 inode 的內容在記錄檔案的 metadata 以及該檔案實際資料是放置在哪幾號 block 內。

inode 記錄的檔案資料至少有底下這些:

  • 檔案的存取模式(read/write/excute)
  • 檔案的擁有者與群組(owner/group)
  • 檔案的容量大小
  • 檔案建立或狀態改變的時間(ctime)
  • 最近一次的讀取時間(atime)
  • 最近修改的時間(mtime)
  • 定義檔案特性的旗標(flag),如 SetUID…
  • 該檔案真正內容的指向 (pointer)

每個檔案固定會佔用一個 inode

小總結

檔案系統基本上就是一個資料庫,用來追蹤一個儲存裝置中的檔案。 對於一般的檔案,會指定資料區塊來儲存檔案的資料,同時也會分配一個「inode」(索引節點)來指向這些資料區塊 ,並儲存檔案的 metadata ,接著才會指派一個檔名給這個「inode」。

  • Hard link,是指一個現有「inode」的另一個檔名。
  • Symbolic link,會分配一個新的「inode」並指定一個新的檔名給它,但是這個「inode」會參考另一個檔名而非資 料區塊。你可以透過使用 ls -i 指令來觀察檔名和「inode」之間的關係。

Device Files

  • 代表硬體設備(除了網卡)
  • 連接 hardware devices (硬體設備) 與 kernel drivers (核心驅動程式) 之間的橋樑
  • 核心驅動程式從 device file 中讀取資料,並將資料寫入該檔案
  • 核心會將資料以正確的格式傳遞給實際的硬體設備
  • 種類:
    • Block Devices (區塊設備)
    • Character Devices (字元設備)
    • Created automatically by the OS (udev) (由作業系統(udev)自動建立)

描述

  • 每個硬體設備都有一個代表它的 Device File (設備檔案)。
  • 網卡是 interfaces (介面)。
  • 現今,當核心發現設備時,作業系統(udev)會自動建立設備檔案。
  • Block Devices (區塊設備) 通常會以 512 位元組為一個單位,讀取/寫入資訊。
  • Character Devices (字元設備)則是以單個字元為單位,讀取/寫入資訊。

Linux Device Names for Hard Drives

  • 第一個初始化的硬碟 = /dev/sda
  • 第二個初始化的硬碟 = /dev/sdb

Partition numbers 被附加到設備名稱上:

  • 第一塊硬碟上的第一個磁碟分割區 : /dev/sda1
  • 第一塊硬碟上的第二個磁碟分割區 : /dev/sda2
  • 第三個硬碟上的第一個磁碟分割區 : /dev/sdc1
  • 第一塊硬碟上的第一個 logical partition (邏輯分區) : /dev/sda5
  • 第一塊硬碟上的第二個 logical partition (邏輯分區) : /dev/sda6

Character Devices

字符設備直接提供對硬體設備的 unbuffered access (無緩衝訪問)。

  • 有時被稱為 raw devices (原始設備)
  • 字符設備有許多不同的選擇,使其使用和應用廣泛而多樣
System InitializationAdministration and Monitoring