2010-09-17 36 views
0

我做了一個很棒的oops,但該文件仍然處於打開狀態並正在使用中。什麼api可以用來創建到ext2/3的現有inode的硬鏈接

關注中(Link to a specific inode),從/proc/###/fd/### 複製到一個新的文件,因爲是沒有用的:

  1. 文件被改變
  2. 的文件大小爲40G和磁盤已滿(150MB免費)

我試圖重新鏈接到文件系統(取消刪除它)。

COMMAND PID USER FD  TYPE    DEVICE  SIZE  NODE NAME 
vmware-vm 4281 root 126u  REG    253,0 40020664320 10928132 /var/mnt/partial.img 

我用「wc/proc/4281/fd/126」打開文件,然後暫停它。

我使用debugfs(靈感來自dag wieers)在文件系統上創建了一個鏈接,然後編輯目錄條目以將刪除的時間設置爲0,更新鏈接數。重啓並運行fsck一切正常。

This is a kernel mod to do it,我還沒有測試過。

+0

釋放一些空間讓你可以複製它。 – 2010-09-17 21:03:16

+0

爲什麼這樣?這是ServerFault的理想選擇 - 管理員可能會了解更多技巧。 – Dummy00001 2010-09-17 21:41:42

+0

我使用debugfs完成了將其重新鏈接到文件系統的任務。 – 2010-09-20 13:04:03

回答

1

花了一點點來弄清楚你在問什麼。

有沒有用戶的土地API來做到這一點,我知道。如果能夠用打開的文件描述符創建一個鏈接將會很好,當然,如果文件描述符不在磁盤上,或者新路徑沒有與該文件位於同一個磁盤上,這當然會失敗,但是我不知道這樣的事情。

這個原因的部分原因是,實際上文件不再需要在磁盤上。它可以完全(或部分)在文件系統的緩存中生存。操作系統可能會決定不將該文件的更改刷新到磁盤,因爲它可能認爲這樣做並不重要(除非需要釋放一些RAM)。

+0

我對第三段沒有說服力,但我同意'沒有用戶空間API'部分。 – 2010-09-17 21:03:56

+0

@Jonathan Leffler:你說得對,這可能並不是沒有系統調用的原因(它實際上可能是相反的方向,現在我想到了)我認爲不會將未鏈接的文件刷新到磁盤除了冬眠的情況外,對於操作系統來說是合理的行爲。 – nategoose 2010-09-17 21:12:42

+0

我同意數據不會刷新到磁盤(並且系統可能會盡量避免這樣做) - 但是如果緩衝池需要空間,系統仍然可以將其寫入磁盤。 inode的存在是爲了存儲相關信息,並且會在塊被添加到文件時被精確地維護,等等。沒有引用inode的目錄條目。 – 2010-09-17 21:17:14

2

我知道的最好方法是使用gdb並附加到仍然打開文件的進程,然後手動調用gdb中的庫函數以打開一個新文件並將文件內容複製到新文件中。

1

由於安全原因,您想要的系統調用,想法 - 將文件描述符鏈接到一個新名稱 - 過去曾提議並拒絕過幾次(在LKML上多次討論):如果文件被刪除,它被刪除,時期。 (請參閱下面的Edit1。)

很多面向安全的應用程序都依賴於它們已刪除的文件的行爲,但它們保持文件描述符處於打開狀態,無法再次重新打開。要做到這一點,一方面在鏈接上存在過於嚴格的權限(只有所有者只能讀取),另一方面是缺少系統調用。


我試圖取消刪除。
1.文件正在改變
2. 40G和磁盤已滿

你的運氣了。您無法爲已刪除(尚未打開)的文件提供新名稱。學習使用rm -i(我討厭默認的RedHat用於root shell的別名,但最終學會了喜歡它們)。


EDIT1評論到這裏@ephemient另一響應,拉着我才懶的refernces查找自己:

用戶土地API之前已經長大,並擊落了幾次Linux世界;理由是安全相關的,而不是與文件系統磁盤格式相關。 lkml.org/lkml/1998/3/8/1 lkml.org/lkml/2002/1/19/16 lkml.org/lkml/2003/4/6/112 et al。

+0

如果root可以運行debugfs和/或安裝內核mod,那麼安全性是否明智,那麼userland選項限制爲root還有哪些安全問題? – 2010-09-20 13:20:03

+0

/proc/*/fd/*可以由課程根目錄讀取 – 2010-09-20 13:20:37

+0

@Jason:在Linux中,「根」本身不再存在。它只是用戶啓用每個[能力](http://linux.die.net/man/7/capabilities)。使用內核選項,可以禁用可加載模塊(我聽說這是安全增強安裝的慣例) - 但不是由文件系統實現的系統調用。不久之後,潛在的安全問題就超過了系統調用的好處。 – Dummy00001 2010-09-20 16:41:16

相關問題