linux文件系統有兩層結構,邏輯結構和物理結構。也就是inode和block。
每個文件都有一個inode, 記錄文件屬性:權限,時間還有最重要的block號碼。
block是實際存放文件內容的地方。
但文件名不在這里。在哪?在目錄的block里面。
目錄也有一個唯一的inode,記錄內容與文件inode大體相似。
block是記錄該目錄下文件名,子目錄名與它們的inode信息的地方。
所以我們在找文件時,比如/etc/issue,先讀/目錄的inode,找到/的內容block,再從中找出etc/的inode,
然后讀etc/的block,找出issue的inode,再讀issue的block,得出內容。當然前提是所有權限支持。
這也是為什么新建文件,刪文件時要目錄權限配合的原因。
因為文件本身不記錄文件名,文件名記錄在其父目錄的block中。
那/目錄的inode記錄在哪里?這是雞生蛋,蛋生雞的問題。解決循環要有外力介入。
先有雞還是先有蛋?先有雞,因為雞是恐龍進化來的。恐龍下蛋,但那畢竟不是雞蛋.....
所以還是先有雞,后有雞蛋。這也解決了沒有雞蛋,雞是從哪里來的問題。
根目錄的inode是掛載時候記錄的,因此有了/的inode,找文件就是一路順藤摸瓜。
再談談linux下的link。
它分硬鏈接和軟鏈接兩種。軟鏈接應用較廣。
硬鏈接只是在相應目錄的block里面記錄了目標文件的inode。也就是多寫了一行。它,不是真正意義上的文件,沒有自己的inode,所以不會占用inode和block,但目標文件的inode引用計數會+1。
刪除目標文件,硬鏈接依舊可以打開,畢竟刪除只是刪block里的文件名映射而已,由於硬鏈接里有完整的文件名映射,所以依然可以打開。
軟鏈接則不同。軟鏈接記錄的是目標文件的文件名。會占用新的inode和block,block里記錄的是目標文件的文件名。打開軟鏈接時,先找到目標文件的文件名,在去相應目錄去找inode, 相當於中間多了一層。
刪除目標文件后,軟鏈接無法打開。因為目標文件的文件名已經被刪除,中間層不存在,所以即使目標文件的inode和block還在,但邏輯上它已經不存在了。所以無法打開。
但,無論更改軟鏈接或者硬鏈接,都相當於更改原文件!
另外新建目錄時會自動建兩個硬鏈接.和..,所以本目錄初始化時,link為2。上層目錄link數會+1.
ln 默認建硬鏈接,-s 建軟鏈接。