檔案系統

Linux 檔案系統結構與權限管理

Linux 目錄結構

Linux 使用樹狀目錄結構,所有內容都從根目錄 / 開始。

/bin, /sbin

  • /bin - 主要放置一般使用者可以操作的指令 (binary)
  • /sbin - 放置系統管理員可以操作的指令 (system binary)
  • 現代系統中通常連結到 /usr/bin, /usr/sbin

/boot

主要放置開機相關檔案:

  • vmlinuz - Linux kernel
  • initrd - 初始 RAM disk
  • grub - 開機載入程式設定

/dev

放置裝置檔案 (device files):

  • /dev/sda - 第一個 SATA 硬碟
  • /dev/null - 空裝置 (丟棄所有寫入)
  • /dev/zero - 提供無限的零
  • /dev/random - 隨機數產生器
  • /dev/tty - 終端機裝置

/etc

系統設定檔目錄:

  • /etc/passwd - 使用者帳號資訊
  • /etc/group - 群組資訊
  • /etc/fstab - 檔案系統掛載設定
  • /etc/hosts - 主機名稱對應
  • /etc/systemd/system - systemd 系統服務設定

/home

使用者家目錄:

  • /home/username - 各使用者的個人目錄
  • 存放使用者的個人檔案和設定

/lib, /lib64

系統函式庫:

  • 共享函式庫 (shared libraries)
  • kernel modules

/media, /mnt

  • /media - 可移除媒體自動掛載點 (USB, CD-ROM)
  • /mnt - 臨時掛載點 (手動掛載)

/opt

第三方軟體安裝目錄:

  • 選用的應用程式套件

/proc

虛擬檔案系統,提供程序和核心資訊:

  • /proc/cpuinfo - CPU 資訊
  • /proc/meminfo - 記憶體資訊
  • /proc/[pid] - 程序資訊

/root

root 使用者的家目錄

/run

執行時期變數資料:

  • 系統啟動後的運行時資料
  • tmpfs 檔案系統 (存在記憶體中)

/srv

服務資料目錄:

  • 系統提供的服務資料 (如 web, ftp)

/sys

虛擬檔案系統,提供核心資訊:

  • 硬體裝置資訊
  • 核心模組資訊

/tmp

臨時檔案目錄:

  • 所有使用者都可寫入
  • 系統重啟時通常會清空

/usr

使用者程式和資料:

  • /usr/bin - 使用者指令
  • /usr/sbin - 系統管理指令
  • /usr/lib - 函式庫
  • /usr/local - 本機安裝的軟體
  • /usr/share - 共享資料 (文件、圖示等)

/var

變動資料目錄:

  • /var/log - 系統記錄檔
  • /var/cache - 快取資料
  • /var/spool - 列印佇列等
  • /var/tmp - 臨時檔案 (重啟後保留)

Linux Permission System

Permission Types

Linux 檔案權限分為三種:

  • r (read) - 讀取權限 (4)
  • w (write) - 寫入權限 (2)
  • x (execute) - 執行權限 (1)

Permission Groups

權限分為三組:

  • User (u) - 檔案擁有者
  • Group (g) - 群組成員
  • Others (o) - 其他使用者

查看權限

ls -l filename
# -rwxr-xr-- 1 user group 1234 Jan  1 12:00 filename
# │└┬┘└┬┘└┬┘   │    │     │    │            │
# │ │  │  │    │    │     │    │            檔案名稱
# │ │  │  │    │    │     │    修改日期
# │ │  │  │    │    │     檔案大小
# │ │  │  │    │    群組
# │ │  │  │    擁有者
# │ │  │  others 權限
# │ │  group 權限
# │ user 權限
# 檔案類型 (-:檔案, d:目錄, l:連結)

chmod - 修改權限

數字模式

# rwx = 4+2+1 = 7
# rw- = 4+2 = 6
# r-x = 4+1 = 5

chmod 755 filename    # rwxr-xr-x
chmod 644 filename    # rw-r--r--
chmod 600 filename    # rw-------

符號模式

chmod u+x filename    # 使用者增加執行權限
chmod g-w filename    # 群組移除寫入權限
chmod o=r filename    # 其他人只有讀取權限
chmod a+r filename    # 所有人增加讀取權限

遞迴修改

chmod -R 755 directory/    # 遞迴修改目錄

chown - 修改擁有者

chown user filename              # 修改擁有者
chown user:group filename        # 同時修改擁有者和群組
chown -R user:group directory/   # 遞迴修改

chgrp - 修改群組

chgrp group filename             # 修改群組
chgrp -R group directory/        # 遞迴修改

Special Permissions

Setuid (SUID) - 4000

  • 執行時以檔案擁有者身份運行
chmod u+s filename
chmod 4755 filename

Setgid (SGID) - 2000

  • 執行時以群組身份運行
  • 目錄中建立的檔案繼承群組
chmod g+s filename
chmod 2755 filename

Sticky Bit - 1000

  • 只有檔案擁有者可刪除
  • 常用於 /tmp
chmod +t directory
chmod 1777 directory

Soft Link vs Hard Link

Hard Link (硬連結)

  • 指向相同的 inode
  • 刪除原檔案,連結仍可用
  • 不能跨檔案系統
  • 不能連結目錄
ln source.txt hardlink.txt

Soft Link / Symbolic Link (符號連結)

  • 指向檔案路徑
  • 刪除原檔案,連結失效
  • 可跨檔案系統
  • 可連結目錄
ln -s source.txt softlink.txt
ln -s /path/to/dir linkdir

查看連結

ls -l
# lrwxrwxrwx ... softlink.txt -> source.txt
#  ^
#  l 代表 symbolic link

ls -li  # 顯示 inode number

inode

什麼是 inode?

  • Index node,索引節點
  • 儲存檔案的 metadata (但不包含檔名)
  • 每個檔案都有一個 inode

inode 包含的資訊

  • 檔案大小
  • 擁有者 UID
  • 群組 GID
  • 權限
  • 時間戳記 (atime, mtime, ctime)
  • 資料區塊位置

查看 inode

ls -i filename        # 顯示 inode number
stat filename         # 詳細資訊
df -i                 # 查看 inode 使用情況

Mount Points

掛載檔案系統

# 掛載
mount /dev/sdb1 /mnt/usb

# 卸載
umount /mnt/usb

# 查看已掛載
mount | grep sdb1
df -h

/etc/fstab

開機自動掛載設定:

# <device>  <mount point>  <type>  <options>  <dump>  <pass>
/dev/sda1   /              ext4    defaults   0       1
/dev/sda2   /home          ext4    defaults   0       2

Swap Space (交換空間)

什麼是 Swap?

  • 虛擬記憶體 (Virtual Memory)
  • 當 RAM 不足時使用
  • 使用硬碟空間作為記憶體

查看 Swap

free -h           # 查看記憶體和 swap
swapon --show     # 查看 swap 詳細資訊

管理 Swap

# 啟用 swap
swapon /swapfile

# 停用 swap
swapoff /swapfile

# 建立 swap file
dd if=/dev/zero of=/swapfile bs=1G count=4
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile