/ 根目錄 ├── bin 存放用戶二進制文件 ├── boot 存放內核引導配置文件 ├── dev 存放設備文件 ├── etc 存放系統配置文件 ├── home 用戶主目錄 ├── lib 動態共享庫 ├── lost+found 文件系統恢復時的恢復文件 ├── media 可卸載存儲介質掛載點 ├── mnt 文件系統臨時掛載點 ├── opt 附加的應用程序包 ├── proc 系統內存的映射目錄,提供內核與進程信息 ├── root root 用戶主目錄 ├── sbin 存放系統二進制文件 ├── srv 存放服務相關數據 ├── sys sys 虛擬文件系統掛載點 ├── tmp 存放臨時文件 ├── usr 存放用戶應用程序 └── var 存放郵件、系統日志等變化文件
Linux 與其他類 UNIX 系統一樣並不區分文件與目錄:目錄是記錄了其他文件名的文件。使用命令 mkdir 創建目錄時,若期望創建的目錄的名稱與現有的文件名(或目錄名)重復,則會創建失敗。
# ls -F /usr/bin/zi* /usr/bin/zip* /usr/bin/zipgrep* /usr/bin/zipnote* /usr/bin/zipcloak* /usr/bin/zipinfo* /usr/bin/zipsplit* # mkdir -p /usr/bin/zip mkdir: cannot create directory `/usr/bin/zip': File exists
Linux 將設備當做文件進行處理,清單 2.展示了如何打開設備文件 /dev/input/event5 並讀取文件內容。文件 event5 表示一種輸入設備,其可能是鼠標或鍵盤等。查看文件 /proc/bus/input/devices 可知 event5 對應設備的類型。設備文件 /dev/input/event5 使用 read() 以字符流的方式被讀取。結構體 input_event 被定義在內核頭文件 linux/input.h 中。
清單 2. 打開並讀取設備文件int fd; struct input_event ie; fd = open("/dev/input/event5", O_RDONLY); read(fd, &ie, sizeof(struct input_event)); printf("type = %d code = %d value = %d\n", ie.type, ie.code, ie.value); close(fd);
我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。圖 1.展示了程序通過文件名獲取文件內容的過程。
圖 1. 通過文件名打開文件[root@gvtv svnmanager]# stat config.php File: "config.php" Size: 2556 Blocks: 8 IO Block: 4096 ???¨???? Device: 802h/2050d Inode: 11804169 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-10-31 10:10:23.490475413 +0800 Modify: 2013-10-31 10:08:40.868475483 +0800 Change: 2013-10-31 10:08:40.917475486 +0800 [root@gvtv svnmanager]# mv config.php config.php.linux [root@gvtv svnmanager]# stat config.php.linux File: "config.php.linux" Size: 2556 Blocks: 8 IO Block: 4096 ???¨???? Device: 802h/2050d Inode: 11804169 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2013-10-31 10:10:23.490475413 +0800 Modify: 2013-10-31 10:08:40.868475483 +0800 Change: 2013-10-31 11:47:20.973471459 +0800 [在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i(若是 AIX 系統,則使用命令 istat)。清單 3.中使用命令 mv 移動並重命名文件 glibc-2.16.0.tar.xz,其結果不影響文件的用戶數據及 inode 號,文件移動前後 inode 號均為:11804169。
為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。
link oldfile newfile ln oldfile newfile
由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性: