Linux 學習筆記(五)文件系統

1 文件樹的組織

下表列出了一些比較重要的標準目錄。

路徑名 內容
/bin 獲得最小的系統可操作性所需要的命令
/boot 內核和加載內核所需的文件
/dev 終端、磁盤、Modem等的設備項
/etc 關鍵的啓動文件和配置文件
/home 用戶的主目錄
/lib C 編譯器的庫和部分 C 編譯器
/media 可移動介質上文件系統的安裝點
/opt 可選的應用軟件包(尚未廣泛使用)
/proc 所有正在運行進程的映像
/root 超級用戶的主目錄(經常就是 / )
/sbin 引導、修復或者恢復系統的命令
/tmp 每次重新引導就消失的臨時文件
/usr 存放大多數標準程序的地方,以及在線用戶手冊和絕大多數庫文件
/usr/bin 大多數標準命令和可執行文件
/usr/include 編譯 C 程序的頭文件
/usr/lib 庫,供標準程序使用的支持文件
/usr/man 聯機用戶手冊
/usr/sbin 系統管理命令和修復命令
/usr/share 多種系統共同的東西(只讀)
/usr/share/man 聯機用戶手機
/usr/src 非本地軟件包的源代碼
/usr/local 本地軟件(用戶所編寫或者安裝的軟件)
/usr/local/bin 本地的可執行文件
/usr/local/etc 本地系統配置文件和命令
/usr/local/lib 本地的支持文件
/usr/local/sbin 靜態鏈接和本地系統維護命令
/usr/local/src 本地軟件包的源代碼
/var 系統專用數據和配置文件
/var/adm 各種不同的東西:日誌、系統設置記錄、奇怪的管理信息
/var/log 各種系統日誌文件
/var/spool 供打印機、郵件等使用的假脫機目錄
/var/tmp 更多的臨時空間(在重新引導以後,文件予以保留)

根文件系統包括根目錄和最小的一組文件和子目錄,包含內核的那個文件位於根文件系統中的 /boot 目錄下,它的名字通常以 vmlinuz 開頭。存放設置文件的 /dev 目錄(除了 /dev/pts 它單獨安裝)、存放關鍵系統文件的 /etc 目錄、存放重要工具的 /sbin/bin 目錄,有時候還有用來存入臨時文件的 /tmp 目錄都是根文件系統的一部分。

目錄 /usr/var 也非常重要。 /usr 是存放大多數標準程序的地方,它還有其他一些內容,例如在線用戶手冊和絕大多數庫文件。把 /usr 作爲單獨的文件系統並非嚴格要求,但出於管理上的方便,幾乎總是這麼設置。爲了讓系統能夠最終啓動到多用戶模式,必須有 /usr/var 這兩個目錄。

/var 存放有假脫機目錄、日誌文件、記帳信息和其他各種快速增長或變化的東西以及隨主機不同而有所不同的東西。由於 /var 包含有日誌文件,而日誌文件會隨着故障出現的次數增多而增多,所以,如果可行的話,把 /var 放置在它自己的文件系統上是一個好主意。

用戶的主目錄 /home 應該保存在單獨的文件系統上,這個單獨的文件系統通常安裝在根目錄中。還可以用單獨的文件系統存儲佔用空間較大的東西,例如源代碼庫和數據庫等。

2 文件類型

Linux 定義了 7 種文件類型。即使在開發人員把精彩的新內容添加到文件樹中(比如在 /proc 下列出的進程信息)的時候,仍然必須讓新內容看起來像下面 7 種類型之一:

  • 普通文件
  • 目錄
  • 字符設備文件
  • 塊設備文件
  • 本地域套接口
  • 有名管道(FIFO)
  • 符號鏈接

下表是 ls 命令使用的文件類型代碼

文件類型 符號 創建方式 刪除方式
普通文件 - 編輯器,cp rm
目錄 d mkdir rmdir , rm -r
字符設備文件 c mknod rm
塊設備文件 b mknod rm
本地域套接口 s socket rm
有名管道 p mknod rm
符號鏈接 l ln -s rm

2.1 普通文件

普通文件只是一個裝字節的包而已;Linux 並沒有就其內容規定任何結構。文本文件、數據文件、可執行程序和共享庫都作爲普通文件存儲。普通文件既能順序存取,也能隨機存取。

2.2 目錄

目錄包含按名字對其他文件的引用。用戶可以使用 mkdir 命令來創建目錄,使用 rmdir 命令來刪除空目錄,使用 rm -r 命令來刪除非空目錄。

2.3 字符設備文件和塊設備文件

設備文件讓程序能夠同系統的硬件和外圍設備進程通信。在配置內核的時候,那麼知道怎樣同系統的每個設備進程通信的模塊就被鏈入內核。用於某個特定設備的模塊叫做設備驅動程序,它負責管理該設備的凌亂細節。

設備驅動程序提供了一個標準的通信接口,該接口看起來就好像是一個普通文件。當內核接到一個對字符或塊設備文件的請求時,它就簡單地把這個請求傳遞給適當的設備驅動程序。不過,區分設備文件和設備驅動程序是很重要的。設備文件只是用來同設備驅動程序進行通信的結合點。它們並不是設備驅動程序本身。

字符設備文件讓與之相關的驅動程序做它們自己的輸入和輸出緩衝。塊設備文件由處理塊數據 I/O 的驅動程序使用,並要求內核爲它們提供緩衝。

設備文件用兩個數字來表示其特徵,這兩個數字分別叫做主設備號和次設備號。主設備號告訴內核該文件訪問哪個驅動程序,次設備號告訴驅動程序對哪個物理單元尋址。例如:

$ ls -l /dev/lp0
crw-rw-— 1 root lp 6, 0 2012-12-14 14:16 /dev/lp0

6, 0 – Linux 系統上的主設備號 6 表示並行端口驅動程序。第一個並行端口(/dev/lp0)的主設備號爲 6,次設備號爲 0。

2.4 本地域套接口

套接口(socket)就是在進程之間讓它們以“clean”的方式進行通信的連接。Linux 提供了幾種不同類型的套接口,其中大多數涉及使用網絡。本地域套接口只能從本地主機訪問,並且是通過文件系統對象而不是網絡端口來使用。它們有時稱爲“UNIX 域套接口(Unix Domain Socket)”。

儘管套接口文件對於其他進程是可見的目錄項,但是通信連接之外的進程不能夠讀寫它們。使用本地域套接口的一些標準工具有打印系統、X Window 系統和 syslog。

2.5 有名管道

與本地域套接口類似,有名管道能讓運行在同一主機上的兩個進程之間進行通信。它們也稱爲“FIFO文件”(First In, First Out)。有名管道使用 mknod 來創建,使用 rm 命令進行刪除。

2.6 符號鏈接

符號鏈接或者叫做“軟”鏈接通過名字指向文件。符號鏈接使用 ln -s 來創建,使用 rm 進行刪除,具體的使用方法及說明可以通過 man ln 進行查詢。

3 文件屬性

在傳統的 UNIX 和 Linux 文件系統模型中,每個文件都有一組 9 個權限位用來控制誰能夠讀寫和執行該文件的內容。這 9 位和另外影響到可執行程序運行的 3 個權限位一起,構成了文件的“模式”(mode)。

這 12 個模式位和 4 位的文件類型信息一起保存在一個 16 位的字中,這 4 個文件類型位在文件創建時設定並且不能修改,但是 12 個模式位可以由文件的屬主或超級用戶使用 chmod 命令來修改。使用 ls -l 可以查看這些位的值(對於目錄來說,可以使用 ls -ld)。

$ ls -l /bin/gzip
-rwxr-xr-x 1 root root 57388 2010-08-17 14:57 /bin/gzip

第一個字段指定該文件的類型和模式。第一個字符是“-”,因此這個文件是普通文件,參見文件類型一表。

這個字段中接下來的 9 個字符就是 3 組權限位。這些組的順序是“user-group-other”,每組中位的次序是“read-write-execute”。ls 用字母來顯示它們:r 表示 read, w 表示 write, x 表示 execute。在這個例子中,屬主對該文件擁有全部的訪問權限,其他人只擁有讀取和執行的權限。

3.1 chmod: 改變權限

chmod 命令改變文件的權限。只有文件的屬主和超級用戶才能夠修改它的權限。

下表說明了每個三位組的 8 種可能組合,其中的 r, wx 分別代表 read, write, execute

八進制 二進制 權限
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 711 myprog 賦予屬主所有的權限,而只給其他人賦予執行權限。

chmod 的助記語法的全部信息可以在 chmod 的手冊頁中找到。其規則的一些示例如下表所示:

規則 含義
+w 爲所有人添加寫入的權限
ug=rw,o=r 賦予 user 和 group 成員讀取/寫入的權限,賦予其他人讀取的權限
a-x 刪除全部 3 種類別用戶(user, group, other)的執行權限
ug=srx,o= 設置文件的 setuid 和 setgid 位,並且只給 user 和 group 賦予讀取/執行的權限
g=u 讓 group 的權限跟 user 一樣

用戶還可以通過類比一個現有的文件來指定要分配的權限模式。

$ chmod --reference=filea fileb

fileb 的權限模式和 filea 的權限模式一樣。

chmod 可以使用 -R 選項遞歸地更新某個目錄下文件的權限。使用助記語法格外有用,因爲沒有明確設置的任何位,其值都保持不變:

$ chmod -R g+w mydir

mydir 及其所有的內容增加了 group 的寫入權限,同時又不會弄錯目錄以及程序的執行位。

3.2 chown: 改變歸屬關係和組

chown 命令改變文件和文件的屬組所有權。chown 語法和 chmod 類似,只不過它的第一個參數以 user:group 的形式指定了新的屬主和屬組。屬主和屬組之一都可以爲空。

類似 chmodchown 也提供了遞歸的 -R 標誌,能夠改變一個目錄以及在它之下所有文件的設定。

傳統的 UNIX 系統使用一個單獨的 chgrp 命令去改變一個文件的屬組。Linux 也一樣提供了 chgrp 命令。它的用法與 chown 命令基本相同。

3.3 umask: 分配默認的權限

用戶可以使用內建的 shell 命令 umask 來影響分配給新創建文件的默認權限。umask 用一個三位數字的八進制值形式來指定,這個值代表要“剝奪”的權限。當創建文件時,它的權限就設置爲創建程序請求的任何權限去掉 umask 禁止的權限。

umask 的三位數字所對應的權限如下表所示:

八進制 二進制 權限
0 000 rwx
1 001 rw-
2 010 r-x
3 011 r--
4 100 -wx
5 101 -w-
6 110 --x
7 111 ---

例如,umask 027 允許屬主具有所有權限,但禁止屬組的定稿權限,並且不允許其他任何用戶有任何權限。默認的 umask 值是 022,在 /etc/profile 中設置。在給新用戶提供的 .profile 樣本文件中,也可以提供一個合適的默認值。

4 安裝和卸載文件系統

現代 Linux 支持不只一種基於磁盤的文件系統。現在最好的一類文件系統包括:作爲大多數 Linux 發行版本默認文件系統的 ext4fs/ext3fs,還有 ReiserFS、IBM 的 JFS 和 SGI 的 XFS。ext2fs 雖然比較老了,但所有的發行版本都支持它,將來很長一段時間也仍然會保持對它的支持。在 Linux 系統上也實現了許多外來的文件系統,比如在微軟 Windows 上使用的文件系統 FAT、FAT32 和 NTFS,CD-ROM 上使用的 ISO-9660 文件系統以及 DVD-ROM 上使用的 UDF(Universal Disk Format)文件系統。Linux 支持的文件系統數量超過了任何一種別的 UNIX 變體。它提供的豐富選擇賦予了用戶更多的靈活性,而且更易於和別的系統共享文件。具體所支持的文件系統種類可通過 man mount 命令進行查詢。

在 Linux 系統上通過 mount 命令將文件系統掛載到文件樹上,umount 命令用來卸載文件系統。mount 把現有文件樹中的一個目錄映射爲新加入的文件系統的根,這個目錄叫做掛載點(mount point),默認使用方法爲:

$ sudo mount /dev/hda4 /userdir

將把存儲在磁盤分區上由 /dev/hda4 表示的文件系統安裝到路徑 /userdir 下。隨後可以使用 ls /userdir 命令來查看這個文件系統的內容。以下是幾種掛載不同文件系統的示例:

4.1 掛載 CD-ROM ISO9660 文件系統:

$ sudo mount -t iso9660 -o ro,nosuid,nodev,uhelper=udisks,uid=1000,gid=1000, \
iocharset=utf8,mode=0400,dmode=0500 /dev/cdrom /mnt/cdrom

/dev/cdrom 掛載到 /mnt/cdrom 目錄下,-t 選項指定文件系統類型 iso9660,並且設置成只讀模式(ro),屏蔽掉 setuidsetgid 位(nosuid),對文件系統上的字符設備文件或塊設備文件不解釋(nodev),歸屬於 uid=1000 的用戶,gid=1000 的屬組,使用 utf-8 字符編碼來查看(iocharset=utf8),文件模式設爲屬主對其具有讀取權限,其他人沒有任何權限(mode=0400),目錄設爲屬主對其具有讀取和執行權限,其他人沒有任何權限(dmode=0500)。

如果你手頭上擁有一份 CD-ROM 的光盤鏡像文件(一般以 .iso 結尾),可以將其當成 LOOP 設備加載到文件樹下面來進行查看或操作。只需在上例中加入 loop 選項即可。

$ sudo mount -t iso9660 -o loop,ro,nosuid,nodev,uhelper=udisks,uid=1000, \
gid=1000,iocharset=utf8,mode=0400,dmode=0500 ~/file.iso /mnt/cdimage

這樣就可以對用戶目錄下的光盤鏡像文件 file.iso 進行查看了。

4.2 掛載 DVD-ROM UDF 文件系統:

方法與掛載 iso9660 文件系統類似,只需將 -t iso9660 修改成 -t udf 即可。

4.3 掛載 vfat 文件系統:

$ sudo mount -t vfat -o rw,nosuid,nodev,uhelper=udisks,uid=1000, \
gid=1000,shortname=mixed,dmask=0077,utf8=1,showexec,flush /dev/sdb4 /mnt/fatfs

4.4 掛載 ntfs 文件系統

非常有意思的一點就是在我所測試的 Ubuntu 10.10 和 Fedora 17 的發行版本上,已經專門提供了 ntfsmount 工具來處理 ntfs 文件系統的掛載問題。如果你的發行版上也提供了該工具的話,可以直接使用以下命令掛載 ntfs 文件系統:

$ sudo ntfsmount -o rw,nosuid,nodev /dev/sda5 /mnt/ntfs

4.5 掛載 ext4/ext3/ext2 文件系統

直接掛載

$ sudo mount -t <ext4|ext3|ext2> -o rw,nosuid,nodev,uhelper=udisks \
/dev/sdb2 /mnt/point

關於更詳細的掛載說明請參考 mount 的在線幫助手冊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章