Linux-目錄結構及文件系統
1.Linux 系統的頂層目錄結構
/ 根目錄
├── bin 存放用戶二進制文件
├── boot 存放內核引導配置文件
├── dev 存放設備文件
├── etc 存放系統配置文件
├── home 用戶主目錄
├── lib 動態共享庫
├── lost+found 文件系統恢復時的恢復文件
├── media 可卸載存儲介質掛載點
├── mnt 文件系統臨時掛載點
├── opt 附加的應用程序包
├── proc 系統內存的映射目錄,提供內核與進程信息
├── root root 用戶主目錄
├── sbin 存放系統二進制文件
├── srv 存放服務相關數據
├── sys sys 虛擬文件系統掛載點
├── tmp 存放臨時文件
├── usr 存放用戶應用程序
└── var 存放郵件、系統日誌等變化文件
2.文件系統
在 Linux 上文件被分成兩個部分:用戶數據 (user data) 與元數據 (metadata)。
用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;
而元數據則是文件的附加屬性,如文件大小、創建時間、所有者等信息。在 Linux 中,元數據中的 inode 號(inode 是文件元數據的一部分但其並不包含文件名,inode 號即索引節點號)才是文件的唯一標識而非文件名。文件名僅是為了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。圖 1.展示了程序通過文件名獲取文件內容的過程。
圖 1. 通過文件名打開文件
在 Linux 系統中查看 inode 號可使用命令 stat 或 ls -i(若是 AIX 系統,則使用命令 istat),如:
stat /home/harris/source/glibc-2.16.0.tar.xz
File: `/home/harris/source/glibc-2.16.0.tar.xz‘
Size: 9990512 Blocks: 19520 IO Block: 4096 regular file
Device: 807h/2055d Inode: 2485677 Links: 1
Access: (0600/-rw-------) Uid: ( 1000/ harris) Gid: ( 1000/ harris)
...
...
# mv /home/harris/source/glibc-2.16.0.tar.xz /home/harris/Desktop/glibc.tar.xz
# ls -i -F /home/harris/Desktop/glibc.tar.xz
2485677 /home/harris/Desktop/glibc.tar.xz
3.鏈接:
為解決文件的共享使用,Linux 系統引入了兩種鏈接:硬鏈接 (hard link) 與軟鏈接(又稱符號鏈接,即 soft link 或 symbolic link)。
鏈接為 Linux 系統解決了文件的共享使用,還帶來了隱藏文件路徑、增加權限安全及節省存儲等好處。
3.1硬鏈接:若一個 inode 號對應多個文件名,則稱這些文件為硬鏈接。換言之,硬鏈接就是同一個文件使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬鏈接可由命令 link 或 ln 創建。如下是對文件 oldfile 創建硬鏈接。
1 2 |
link oldfile newfile
ln oldfile newfile
|
由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此硬鏈接存在以下幾點特性:
- 文件有相同的 inode 及 data block;
- 只能對已存在的文件進行創建;
- 不能交叉文件系統進行硬鏈接的創建;
- 不能對目錄進行創建,只可對文件創建;
- 刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。
inode 號僅在各文件系統下是唯一的!!!!!當 Linux 掛載多個文件系統後將出現 inode 號重復的現象,因此,硬鏈接不能跨文件系統!!
3.2軟鏈接:
若文件用戶數據塊中存放的內容是另一文件的路徑名的指向,則該文件就是軟連接。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接有著自己的 inode 號以及用戶數據塊,如
軟鏈接的創建與使用沒有類似硬鏈接的諸多限制:
- 軟鏈接有自己的文件屬性及權限等;
- 可對不存在的文件或目錄創建軟鏈接;
- 軟鏈接可交叉文件系統;
- 軟鏈接可對文件或目錄創建;
- 創建軟鏈接時,鏈接計數 i_nlink 不會增加;
- 刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接被稱為死鏈接(即 dangling link,若被指向路徑文件被重新創建,死鏈接可恢復為正常的軟鏈接)。
軟鏈接展示:
# ls -li
total 0
// 可對不存在的文件創建軟鏈接
# ln -s old.file soft.link
# ls -liF
total 0
789467 lrwxrwxrwx 1 root root 8 Sep 1 18:00 soft.link -> old.file
// 由於被指向的文件不存在,此時的軟鏈接 soft.link 就是死鏈接
# cat soft.link
cat: soft.link: No such file or directory
// 創建被指向的文件 old.file,soft.link 恢復成正常的軟鏈接
# echo "This is an original file_A" >> old.file
# cat soft.link
This is an original file_A
// 對不存在的目錄創建軟鏈接
# ln -s old.dir soft.link.dir
# mkdir -p old.dir/test
# tree . -F --inodes
.
├── [ 789497] old.dir/
│ └── [ 789498] test/
├── [ 789495] old.file
├── [ 789495] soft.link -> old.file
└── [ 789497] soft.link.dir -> old.dir/
註意:當然軟鏈接的用戶數據也可以是另一個軟鏈接的路徑,其解析過程是遞歸的。但需註意:軟鏈接創建時原文件的路徑指向使用絕對路徑較好。使用相對路徑創建的軟鏈接被移動後該軟鏈接文件將成為一個死鏈接!!!!!!
4.鏈接命令
在 Linux 中查看當前系統已掛著的文件系統類型,除上述使用的命令 df,還可使用命令 mount 或查看文件 /proc/mounts。
如:
# mount
/dev/sda7 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
...
...
none on /run/shm type tmpfs (rw,nosuid,nodev)
命令 ls 或 stat 可幫助我們區分軟鏈接與其他文件並查看文件 inode 號,但較好的方式還是使用 find 命令,其不僅可查找某文件的軟鏈接,還可以用於查找相同 inode 的所有硬鏈接,如:
使用命令 find 查找軟鏈接與硬鏈接,
// 查找在路徑 /home 下的文件 data.txt 的軟鏈接
# find /home -lname data.txt
/home/harris/debug/test2/a
// 查看路徑 /home 有相同 inode 的所有硬鏈接
# find /home -samefile /home/harris/debug/test3/old.file
/home/harris/debug/test3/hard.link
/home/harris/debug/test3/old.file
# find /home -inum 660650
/home/harris/debug/test3/hard.link
/home/harris/debug/test3/old.file
// 列出路徑 /home/harris/debug/ 下的所有軟鏈接文件
# find /home/harris/debug/ -type l -ls
656662 0 lrwxrwxrwx 1 harris harris 1 Sep 1 14:37 /home/harris/debug/test2/b -> a
656627 0 lrwxrwxrwx 1 harris harris 8 Sep 1 14:37 /home/harris/debug/test2/a ->
data.txt
789467 0 lrwxrwxrwx 1 root root 8 Sep 1 18:00 /home/harris/debug/test/soft.link ->
old.file
789496 0 lrwxrwxrwx 1 root root 7 Sep 1 18:01
/home/harris/debug/test/soft.link.dir -> old.dir
轉:https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html
Linux-目錄結構及文件系統