[分享] 實作 GNU/Linux 的資源回收筒

常言道:『飲水思源』,在 Open Source 的世界裡,我們常常需要別人的幫助,但是在您有所心得的時候請記得分享給大家,『幫助人是快樂的喔』。歡迎您在使用 debian 的過程中的任何心得分享給大家。

[分享] 實作 GNU/Linux 的資源回收筒

文章Tetralet » 週三 9月 08, 2004 9:43 am

所需套件:

 libtrash

有一些軟體,如:Linux 下的 recover,或是 MS Windows 下的 FinalData(商業軟體),
可以經由掃瞄整顆硬碟,把所有堪用的檔案救回來。

 註:筆者試過 FinalData,它有時候即使救回來的檔案也是不能用的。所以不要太依賴這套軟體呀!

而 LibTrash 的方法則完全不同,它會去攔截所有的檔案 I/O 的系統呼叫,在所有可能會進行檔案刪除動作之前將原始資料另外放置到『資源回收筒』中,如果您不小心誤刪了檔案時還可以從『資源回收筒』裡把原始資料找回來。

但缺點是您的硬碟往往很快就爆掉了,所以要記得常常去清理呀!


在安裝了 LibTrash 之後,
只要在環境變數中指定了 LD_PRELOAD,
那麼 LibTrash 的功能就會啟動。
以下為 LibTrash 設定檔,~/.libtrash 之參數說明:
代碼: 選擇全部
# DEBUG, PERSONAL_CONF_FILE, WARNING_STRING 這三個設定為編譯時的選項,無法在此變更。
# UNCOVER_DIRS 這個設定必須以環境變數的方式存在。
# PROTECT_TRASH 這個設定可以以環境變數的方式存在。

# 在設定檔中不要使用引號,在項目和設定值中以 = 隔開。
# 在以 ; 分隔的設定值間注意不要加上空白。

# 在 LibTrash 執行時要不要秀出運行訊息(在此設定無效)
DEBUG = NO

# 指定個人的設定檔名稱(在此設定無效)
PERSONAL_CONF_FILE = .libtrash

# 如果 SHOULD_WARN 設定為 YES 時所秀出的訊息(在此設定無效)
WARNING_STRING = Remember that libtrash is disabled.

# 是否攔截 unlink() (the one found in GNU libc)
INTERCEPT_UNLINK = YES

# 如果在呼叫 rename() (the one found in GNU libc) 時覆蓋了檔案,是否進行攔截
INTERCEPT_RENAME = YES

# 如果在呼叫 fopen() (the one found in GNU libc) 時截短了檔案,是否進行攔截
INTERCEPT_FOPEN = YES

# 如果在呼叫 freopen() (the one found in GNU libc) 時截短了檔案,是否進行攔截
INTERCEPT_FREOPEN = YES

# 如果在呼叫 open() (the one found in GNU libc) 時截短了檔案,是否進行攔截
INTERCEPT_OPEN = YES

# 被攔截後的檔案要送到 Home Dirtory 的哪一個資料夾中
TRASH_CAN = Trash

# 如果 LibTrash 在執行過程中出現了問題時所採取的行動
# ALLOW_DESTRUCTION:執行原始命令,如:刪除檔案
# PROTECT:回報錯誤,並中斷原始命令的執行
IN_CASE_OF_FAILURE = PROTECT

# 如果關閉 LibTrash,是否要顯示警告訊息
SHOULD_WARN = YES

# 是否保護『資源回收筒』裡的檔案不被刪除
PROTECT_TRASH = YES

# 不受保護檔案的類型
IGNORE_EXTENSIONS = o;log;aux

# 是否不保謢隱藏檔案
IGNORE_HIDDEN = YES

# 是否不保謢以 '~' 結尾的文字備份檔
IGNORE_EDITOR_BACKUP = YES

# 是否不保謢以 '#' 開頭的文字暫存檔
IGNORE_EDITOR_TEMPORARY = YES

# 是否保謢 LibTrash 的設定檔
LIBTRASH_CONFIG_FILE_UNREMOVABLE = YES

# 是否對於 Home Directory 之外的檔案進行保護
# 注意:UNREMOVABLE_DIRS 裡的檔案將不受保護
#    TEMPORARY_DIRS 的檔案將不受保護
#    如果所保護的檔案和 Trash Can 不在同一個磁碟分割區中,
#    LibTrash 將會使用『複製』的方法將檔案移到 Trash Can 中
GLOBAL_PROTECTION = YES


# 攔截 Home Directory 之外的檔案時,
# 把它們集中在 Trash Can 裡的哪一個目錄下
TRASH_SYSTEM_ROOT = SYSTEM_ROOT


# 設定絕對無法更動的目錄
# 注意:這個設定可以被 UNCOVER_DIRS 這個環境變數所蓋過
#UNREMOVABLE_DIRS =
UNREMOVABLE_DIRS=/bin;/boot;/dev;/etc;/lib;/sbin;/usr

# 必須以環境變數的方式存在。用來暫時讓 UNREMOVABLE_DIRS 或 PROTECT_TRASH 失效
UNCOVER_DIRS =

# 指定暫存檔存放位置。裡面的檔案將不受保護
TEMPORARY_DIRS = /tmp;/var

# 指定使用者暫存檔存放位置。裡面的檔案將不受保護
USER_TEMPORARY_DIRS =

# 指定可卸載媒體存放位置。裡面的檔案將不受保護
REMOVABLE_MEDIA_MOUNT_POINTS = /mnt

# 指定不受保護的檔案
EXCEPTIONS = /etc/mtab;/etc/resolv.conf;/etc/adjtime;/etc/upsstatus;/etc/dhcpc

# 指定不受保護的檔案的 Regular Expression
IGNORE_RE =

設定好了 LibTrash 後,將以下指令寫在 ~/.bashrc 中,
讓使用者一登入就啟用 LibTrash:
代碼: 選擇全部
LD_PRELOAD=/usr/lib/libtrash/libtrash.so
export LD_PRELOAD
alias TrashON="export TRASH_OFF=NO"
alias TrashOFF="export TRASH_OFF=YES"
TrashOFF

然後,可以使用 TrashON 來啟用 LibTrash 的功能。使用 TrashOFF 來把它關掉。


但 root 最好不要隨時啟用這個功能,否則在安裝、編譯軟體或是修改系統設定檔時常常會被 LibTrash 影響而出現一大堆奇怪的現象。


如果您在啟用了 LibTrash 之後,
就一直出現這種類似訊息:
代碼: 選擇全部
error while loading shared libraries: /usr/lib/libtrash/libtrash.so: cannot open shared object file: No such file or directory

然後就幾乎任何指令都無法使用了...

這很有可能是因為您未安裝 libtrash 套件就啟用了 LibTrash。
解決方案就只要把 LD_PRELOAD 環境變數給清除掉即可。
例:
代碼: 選擇全部
unset LD_PRELOAD


還有,由於 LibTrash 會隨時攔截所有的檔案 I/O 的系統呼叫,
將被刪除的檔案另外備份起來,
可想而之,
在您刪除較大的檔案,如 ISO 檔時,將會浪費大量的時間和磁碟空間來備份這個大檔案。
所以如果在刪除大量的檔案時,如果有必要的話,可以考慮把 LibTrash 給關掉。


後記:

 筆者日前在進行一些文件之翻譯時,
 一不小心使用 tar 指令把我一整天的心血給蓋掉了。
 還好我事前有啟用 LibTrash,
 這些被蓋掉的檔案很輕易得就被找回來了。
 所以,建議您不妨啟用這個功能,
 在需要它出場的時候,它可是價值連城的王牌哦!
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

文章Tetralet » 週二 6月 14, 2005 10:10 am

前幾天才偶然發現,
如果是使用 startx 來啟動 X Window 的話,
很可是用 ssh-agent 來呼叫 x-session-manager 的。
(請檢查 /etc/X11/Xsession.options 裡的設定)

在此情況下,似乎是為了安全上的考量,
LD_PRELOAD 這個環境變數可能會被清掉,
因而導致 LitTrash 失效,請特別注意...
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

文章訪客 » 週二 5月 09, 2006 10:09 am

Tetralet前輩您好
小弟發現libtrash好像只能在下rm指令時才有效
如果我用rox-filer右鍵按刪除的話
.trash裡頭就不會保留我所刪除的檔案
請問是否有什麼辦法可以讓libtrash抓到rox所刪的檔案呢?
謝謝您~


小弟的libtrash設定如下:

# DEBUG, PERSONAL_CONF_FILE, WARNING_STRING 這三個設定為編譯時的選項,無法在此變更。
# UNCOVER_DIRS 這個設定必須以環境變數的方式存在。
# PROTECT_TRASH 這個設定可以以環境變數的方式存在。

# 在設定檔中不要使用引號,在項目和設定值中以 = 隔開。
# 在以 ; 分隔的設定值間注意不要加上空白。

# 在 LibTrash 執行時要不要秀出運行訊息(在此設定無效)
DEBUG = NO

# 指定個人的設定檔名稱(在此設定無效)
PERSONAL_CONF_FILE = .libtrash

# 如果 SHOULD_WARN 設定為 YES 時所秀出的訊息(在此設定無效)
WARNING_STRING = Remember that libtrash is disabled.

# 是否攔截 unlink() (the one found in GNU libc)
INTERCEPT_UNLINK = YES

# 如果在呼叫 rename() (the one found in GNU libc)時覆蓋了檔案,是否進行攔截
INTERCEPT_RENAME = YES

# 如果在呼叫 fopen() (the one found in GNU libc)時截短了檔案,是否進行攔截
INTERCEPT_FOPEN = YES

# 如果在呼叫 freopen() (the one found in GNU libc)時截短了檔案,是否進行攔截
INTERCEPT_FREOPEN = YES

# 如果在呼叫 open() (the one found in GNU libc)時截短了檔案,是否進行攔截
INTERCEPT_OPEN = YES

# 被攔截後的檔案要送到哪一個資料夾中
TRASH_CAN = Trash

# 如果 LibTrash 在執行過程中出現了問題時所採取的行動
# ALLOW_DESTRUCTION:執行原始命令,如:刪除檔案
# PROTECT:回報錯誤,並中斷原始命令的執行
IN_CASE_OF_FAILURE = PROTECT

# 如果關閉 LibTrash,是否要顯示警告訊息
SHOULD_WARN = YES

# 是否保護『資源回收筒』裡的檔案不被刪除
PROTECT_TRASH = NO

# 不受保護檔案的類型
IGNORE_EXTENSIONS = o;log;aux

# 是否不保謢隱藏檔案
IGNORE_HIDDEN = NO

# 是否不保謢以 '~' 結尾的文字備份檔
IGNORE_EDITOR_BACKUP = NO

# 是否不保謢以 '#' 開頭的文字暫存檔
IGNORE_EDITOR_TEMPORARY = NO

# 是否保謢 LibTrash 的設定檔
LIBTRASH_CONFIG_FILE_UNREMOVABLE = YES

# 是否對於 Home Directory 之外的檔案進行保護
# 注意:UNREMOVABLE_DIRS 裡的檔案將不受保護
#    TEMPORARY_DIRS 的檔案將不受保護
#    如果所保護的檔案和 Trash Can 不在同一個磁碟分割區中,
#    LibTrash 將會使用『』的方法將檔案移到 Trash Can 中
GLOBAL_PROTECTION = YES


# 攔截 Home Directory 之外的檔案時,
# 把它們集中在 Trash Can 裡的哪一個目錄下
TRASH_SYSTEM_ROOT = SYSTEM_ROOT


# 設定絕對無法更動的目錄
# 注意:這個設定可以被 UNCOVER_DIRS 這個環境變數所蓋過
#UNREMOVABLE_DIRS =
UNREMOVABLE_DIRS=/bin;/boot;/dev;/etc;/lib;/sbin;/usr

# 必須以環境變數的方式存在。用來暫時讓 UNREMOVABLE_DIRS 或
PROTECT_TRASH 失效
UNCOVER_DIRS =

# 指定暫存檔存放位置。裡面的檔案將不受保護
TEMPORARY_DIRS = /tmp;/var

# 指定使用者暫存檔存放位置。裡面的檔案將不受保護
USER_TEMPORARY_DIRS =

# 指定可卸載媒體存放位置。裡面的檔案將不受保護
REMOVABLE_MEDIA_MOUNT_POINTS = /mnt/auto

# 指定不受保護的檔案
EXCEPTIONS = /etc/mtab;/etc/resolv.conf;/etc/adjtime;/etc/upsstatus;/etc/dhcpc

# 指定不受保護的檔案的 Regular Expression
IGNORE_RE =
訪客
 

Re: [分享] 實作 GNU/Linux 的資源回收筒

文章THQ » 週一 12月 21, 2009 12:04 pm

存放被刪除的檔案只能放在家目錄嗎
Linux才是最強的!!
THQ
活潑的高中生
活潑的高中生
 
文章: 492
註冊時間: 週二 1月 04, 2005 9:11 pm


回到 share

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客