2011-01-05 27 views
20

爲什麼當您只知道其inode時無法訪問文件,而無需搜索鏈接到該inode的文件?一個到文件的硬鏈接只包含一個名字和一個數字,告訴你在哪裏可以找到與該文件有關的所有 real信息的索引節點。當我被告知沒有用戶模式直接使用inode編號打開文件時,我感到很驚訝。爲什麼不能通過inode操作文件?

這似乎是這樣一個無害和有用的系統提供的能力。爲什麼沒有提供?

+2

這樣做的用例是什麼? – user562374 2011-01-05 16:57:44

+0

@user這個問題受到了這個問題的啓發。 http://stackoverflow.com/questions/4605851/how-to-get-directory-name-by-inode-value-in-c我也可以看到它被用來傳遞一個文件給另一個有權訪問的用戶文件但沒有訪問我的目錄結構。 – 2011-01-05 17:08:03

+3

這正是不允許的原因。如果通過inode編號訪問文件是允許的,您可以簡單地嘗試每個inode編號並繞過所有目錄權限。 – 2011-03-12 05:56:18

回答

15

某些操作系統有那個設施。例如,OS X需要它來支持Carbon File Manager,在Linux上可以使用debugfs。當然,您可以通過find -inum從命令行在任何UNIX上執行此操作,但無法通過inode訪問文件的真正原因是它不是特別有用。它確實 kindof規避文件的權限,因爲如果有一個文件,你可以讀取一個文件夾,你不能讀取或執行,然後打開inode讓你發現它。

的原因,它是不是非常有用的是,你需要通過*stat()打電話找一個inode編號,此時你已經文件名(或開放FD)...或者你需要猜測inum。

+4

啊,但如果你關閉了文件,然後想重新打開它,那麼你就不必去統計它了。 – johnnycrash 2011-06-30 22:51:28

+0

@johnnycrash這是什麼讓你?當你要在一些非常慢的存儲介質上使用文件時,你無法談論任何有意義的性能增益。 – 2012-03-25 10:15:37

+3

@johnnycrash你不能確定你會打開相同的文件:相同的inode可能已經被文件系統銷燬並重新用於新文件,並且你不會有任何方法來檢查那事發生了。 – pqnet 2014-08-06 06:14:16

17

安全原因 - 要訪問文件,您需要文件權限AS WELL AS權限,以搜索所需文件所需的根目錄中的所有目錄。如果可以通過inode訪問文件,則可以繞過包含目錄上的檢查。

這允許您創建一個文件,可以由一組用戶(或一組組)訪問,而不是其他人 - 創建只能由用戶訪問的目錄(每個用戶一個目錄),然後將文件硬鏈接到所有這些目錄中 - 文件本身可供任何人訪問,但實際上只能由對其鏈接的目錄之一擁有搜索權限的人訪問。

+3

通過inode編號訪問文件的假設功能可能被限制爲「root」。 – 2014-09-25 22:47:36

4

回覆您的評論:要「傳遞文件」,您可以通過SCM_RIGHTS(請參閱man 7 unix)使用通過AF_LOCAL套接字傳遞的fd。

3

Btrfs對此具有ioctl(BTRFS_IOC_INO_PATHS added in this patch),但它不會嘗試檢查沿路徑的權限,並且僅保留給root用戶。

2

當然,如果你已經通過一個路徑查找文件,你不應該一次又一次地做這件事?

stat(f,&s); i=open(f,O_MODE); 

涉及兩個拖網通過目錄結構。這浪費了不必要的字符串操作的CPU週期。是的,精心設計的fs緩存將會消除臨時終端用戶的大部分低效率,但如果不是簡單的愚蠢,重複無故的工作就是醜陋的。

+0

您可以將inode存儲在數據庫中,並避免一些訪問週期,這是字符串操作的幾毫秒而非納秒級別。快1000倍,特別是如果您對inode編號進行排序。 – Lothar 2016-04-21 20:06:59

+0

這給了我一些想法。 @Lothar的評論是正確的:如果你繞過文件系統使用名字,你基本上必須使用數據庫來實現一些等價物。如果您通過over打開相同的文件,並希望唯一真正的問題可能是避免一次又一次解析同一目錄中的數百萬文件......解決方案?只是硬鏈接到包含更少文件的目錄中的這些文件。這將避免大部分丟失的CPU週期,基本上與inode訪問基本相同。 – kriss 2018-01-25 10:50:52

相關問題