到底該如何理解Unix/Linux的文件系統?看這篇就知道了
上周在部署 rails 應用時遇到一個和文件權限有關的問題,后來通過查閱 “UNIX/Linux 系統管理技術手冊” 這本書解決了問題, 解決問題后, 覺得不能淺嘗而止于是又花了些時間把”UNIX/Linux 系統管理技術手冊” 這本書的第 6 章” 文件系統” 讀了幾遍, 讀完了還是覺得有些不過癮, 那就寫個讀書筆記吧。
文件樹的組織
關于 UNIX 家族的文件系統的組織說的好聽點是約定優于配置,說的難聽點就是組織混亂,互不兼容,各有山頭。 幸運的是對于一些比較重要的目錄, 在各系統中逐漸形成了一種比較通用的標準,其內容如下表,我們在安放文件時可以參考此表。
標準目錄及內容
路徑名 | 操作系統 | 內容 |
---|---|---|
/bin | 所有 | 最核心的操作系統命令 |
/boot | LS | 內核和加載內核所需要的文件 |
/dev | 所有 | 偽終端, 磁盤, 打印機等的設備項 |
/etc | 所有 | 關鍵的啟動文件和配置文件 |
/home | 所有 | 用戶默認的主目錄 |
/kernel | S | 內核組件 |
/lib | 所有 | 庫, 共享庫和部分 C 編譯器 |
/media | LS | 可移動介質上文件系統的掛載點 |
/mnt | LSA | 可移動介質的臨時掛載點 |
/opt | 所有 | 可選的應用軟件包 (尚未廣泛使用) |
/proc | LSA | 所有正在運行進程的信息 |
/root | LS | 超級用戶的主目錄 |
/sbin | 所有 | 系統最小規模運行所需的命令 |
/stand | H |
獨立的工具,磁盤格式化工具 ,診斷工具等 |
/tmp | 所有 | 每次重新引導就消失的臨時文件 |
/usr | 所有 | 次要文件和命令的層次結構 |
/usr/bin | 所有 | 大多數命令和可執行文件 |
/usr/include | 所有 | 編譯 C 程序的頭文件 |
/usr/lib | 所有 | 庫; 供標準程序使用的支持文件 |
/usr/lib64 | L | 在 64 位 Linux 發行版本上的 64 位庫 |
/usr/local | 所有 |
本地軟件 (用戶所編寫或者安裝的軟件); /usr/ 的鏡像結構 |
/usr/sbin | 所有 | 不太關鍵的系統管理命令和修復命令 |
/usr/share | 所有 | 多種系統共同的東西 |
/usr/share/man | 所有 | 聯機用戶手冊 |
/usr/src | LSA | 非本地包軟件的源代碼 (非廣泛使用) |
/usr/tmp | 所有 | 更多的臨時空間 (每次重新引導仍然保留) |
/var | 所有 | 系統專用數據和配置文件 |
/var/adm | 所有 |
各種不同的東西: 日志, 系統設置記錄 ,奇怪的管理信息 |
/var/log | LSA | 各種系統日志文件 |
/var/spool | 所有 | 供打印機,郵件等使用的假脫機目錄 |
/var/tmp | 所有 |
更多的臨時空間 (在重新引導以后 ,文件予以保留) |
PS: L=Linux, S=Solars, H=HP-UX, A=AIX
文件類型
可以認為 UNIX 家族的文件有 7 種類型,
- 普通文件
- 目錄
- 字符設備文件
- 塊設備文件
- 本地域套接口
- 有名管道 (FIFO)
- 符號鏈接
可以使用命令 ls -ld 來查看文件的類型。ls 命令輸出的***個字符表示類型。
- $ ls -ld /usr/include
- drwxr-xr-x 257 root wheel 8738 12 12 00:27 /usr/include
第 1 個字符是 d, 表示 /usr/include 是一個目錄。
ls 命令使用的文件類型代碼
文件類型 | 符號 | 創建方式 | 刪除方式 |
---|---|---|---|
普通文件 | - | 編輯器, cp 等 | rm |
目錄 | d | mkdir | rmdir, rm -r |
字符設備文件 | c | mknod | rm |
塊設備文件 | b | mknod | rm |
本地域套接口 | s | socket(2) | rm |
有名管道 | p | mknod | rm |
符號鏈接 | l | ln -s | rm |
文件權限
使用命令 ls -ld 查看某個文件 file.txt,
- -rw-rw-r-- 1 hope 123 Feb 03 15:36 file.txt
- - rw- rw- r-- 1 hope 123 Feb 03 15:36 file.txt
- File owner group everyone else links owner size mod date file name
***個符號: -, 表示這是個文件,如果此符號是 d 則表示這是個目錄 第二個符號: rw-, 表示用戶對此文件有讀寫權限, 用二進制表示是: 110, 用八進制表示是: 6 第三個符號: rw-, 表示用戶所在的組對此文件有讀寫權限, 用二進制表示是: 110, 用八進制表示是: 6 第四個符號: r–, 表示其他的人對此文件有讀權限, 用二進制表示是: 100, 用八進制表示是: 4
file.txt 完整的權限 (即包括了用戶,用戶所在組和其他人的權限) 可以用八進制數表示為: 664。
如果我們需要讓某個文件有和 file.txt 的一樣的權限,可以使用下面的命令:
- chmod 664 abcfile.txt
可以通過 chmod 的權限編碼表 來生成合適的八進制數權限。
chmod 的權限編碼
八進制 | 二進制 | 權限 |
---|---|---|
0 | 000 | — |
1 | 001 | –x |
2 | 010 | -w- |
3 | 011 | -wx |
4 | 100 | r– |
5 | 101 | r-x |
6 | 110 | rw- |
7 | 111 | rwx |
chmod 助記語法例子
規則 | 含義 |
---|---|
u+w |
為文件的屬組添加寫的權限, 比如 chmod u+w file.txt |
ug=rw,o=r | 賦予屬主和屬組讀 / 寫的權限, 賦予其他人讀的權限 |
a-x |
刪除全部 3 種類別用戶 (屬主 / 屬組 / 其他人) 的執行權限 |
ug=srx,o= |
設置文件的 setuid 和 setgid 位, 并且只給屬主 和屬組賦予讀 / 執行的權限 |
g=u | 讓屬組的權限跟屬主的權限完全一樣 |
- u 代表 user 即屬主
- g 代碼 group 即屬組
- o 代表 other 即其他人
- a 代表 all 即所有人