救回檔案

回覆文章
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

救回檔案

文章 yehlu »

http://www.linuxuser.com.tw/power/list2.php?id=2215

BACK>>
Linux檔系統的反刪除方法
Linux檔系統的反刪除方法

  作為一個多用戶、多工的作業系統,Linux下的檔一旦被刪除,是難以恢復的。儘管刪除命令只是在檔節點中作刪除標記,並不真正清除檔內容,但是其他用戶和一些有寫盤動作的進程會很快覆蓋這些資料。不過,對於家庭單機使用的Linux,或者誤刪檔後及時補救,還是可以恢復的。

1.Ext2檔系統結構的簡單介紹

  在Linux所用的Ext2檔系統中,檔是以塊為單位存儲的,默認情況下每個塊的大小是1K,不同的塊以塊號區分。每個檔還有一個節點,節點中包含有檔所有者,讀寫許可權,檔類型等資訊。對於一個小於12個塊的檔,在節點中直接存儲檔資料塊的塊號。如果檔大於12個塊,那麼節點在12個塊號之後存儲一個間接塊的塊號,在這個間接塊號所對應的塊中,存儲有256個檔資料塊的塊號(Ext2fs中每個塊號佔用4位元組,這樣一個塊中所能存儲的塊號就是 1024/4=256)。如果有更大的檔,那麼還會在節點中出現二級間接塊和三級間接塊。

2。恢復被誤刪檔的方法

  大多數Linux發行版都提供一個debugfs工具,可以用來對Ext2檔系統進行編輯操作。不過在使用這個工具之前,還有一些工作要做。

  首先以唯讀方式重新掛載被誤刪的檔所在分區。使用如下命令:(假設文件在/usr分區)

mount –r –n –o remount /usr

-r表示唯讀方式掛載;-n表示不寫入/etc/mtab,如果是恢復/etc上的檔,就加上這個參數。如果系統說xxx partion busy,可以用fuser命令查看一下是哪些進程使用這個分區上的檔:

fuser –v –m /usr

如果沒有什麼重要的進程,用以下命令停掉它們:

fuser -k –v –m /usr

然後就可以重新掛載這些檔系統了。

  如果是把所有的檔統一安裝在一個大的/分區當中,可以在boot提示符下用linux single進入單用戶模式,儘量減少系統進程向硬碟寫入資料的機會,要不乾脆把硬碟掛在別的機器上。另外,恢復出來的資料不要寫到/上面,避免破壞那些有用的資料。如果機器上有dos/windows,可以寫到這些分區上面:

mount –r –n /dev/hda1 /mnt/had

然後就可以執行debugfs:(假設Linux在 /dev/hda5)

#debugfs /dev/hda5

就會出現debugfs提示符debugfs:

使用lsdel命令可以列出很多被刪除的檔的資訊:

debugfs:lsdel
debugfs: 2692 deleted inodes found.
Inode Owner Mode Size Blocks Time deleted
164821 0 100600 8192 1/ 1 Sun May 13 19:22:46 2001
…………………………………………………………………………………
36137 0 100644 4 1/ 1 Tue Apr 24 10:11:15 2001
196829 0 100644 149500 38/ 38 Mon May 27 13:52:04 2001

debugfs:

  列出的檔有很多(這
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

◇ [chat] 搶救過去!!!! (ext2 undelete)

文章 yehlu »

http://bbs.ee.ntu.edu.tw/boards/Linux/19/1/84.html

◇ [chat] 搶救過去!!!! (ext2 undelete)

作者: thhsieh (居士) 看板: Linux
標題: [chat] 搶救過去!!!! (ext2 undelete)
時間: Tue Feb 2 14:53:04 1999

以下內容可能很多人早就知道了,但我想可能還是對某些人有用,所以就
post 上來大家參考 (嗯! 最近算物理問題算得煩透了,就當我無聊灌灌
水吧 :-)))

===========================================================================

發信人: thhsieh (居士), 信區: SM
標 題: [Sys] 搶救過去!!!! (ext2 undelete)
發信站: 冷月流蘇BBS驛站 (Mon Feb 1 17:21:11 1999) , 轉信

本系的 BBS 系統真是多災多難 (嗯 .... 其實是因為我的疏忽,才會這麼多災
多難 ....) ,繼這幾日系統時間不正確,造成許多人的 ID 被誤砍後,又一次
因系統設定上的問題,將 BBS 的重要備份檔給殺了。這件事是學弟發現後告訴
我的,當我上站來一見到他的 mail, 當真是欲哭無淚,差點沒去撞牆。那個備
分檔有多重要呢? 這麼說吧! 所有等待我們恢復舊信件的使用者資料全在
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

Linux檔系統的反刪除(undelete)方法

文章 yehlu »

http://gdfan.twbbs.org/blog/2006/04/22/502

Linux 連線版上有人 post 出如何救回不小心刪除檔案的方法,為了怕自己忘記,在這裡記下:

有 2 篇相關文章:
文章1
文章2

大致上的步驟:

1.mount -o remount,ro /dev/hda3 以read-only 重新 mount
2.使用 debugfs 工具,配合檔案的刪除時間,找出 block 編號
3.用 lsdel 命令,stat <inode> 命令,以及 dump <inode> 命令救回檔案
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

利用Samba 3實作網路資源回收筒機制

文章 yehlu »

http://www.ascc.sinica.edu.tw/nl/95/2213/02.txt

《資訊應用》

利用Samba 3實作網路資源回收筒機制

呂紹勳

Samba為Linux作業系統與Windows作業系統間的溝通橋樑,由於有
了Samba的出現,讓Windows作業系統的使用者從此得以使用網路芳
鄰的方式,找尋到Linux機器所分享出來的資料夾及印表機,並存取
其中的資源。

Samba在實務上的應用最常見的乃是做為檔案伺服器(File Server),
亦即是大家最常講的網路硬碟的使用。在從前Samba 2.X版的時代,
一般使用者經常會遇到的問題,便是誤刪了檔案伺服器裡的資料,
而後緊張地向資訊技術人員求救,希望能夠將該誤刪的資料給救回
來。

這其中牽涉到了兩個問題:

1.如果檔案伺服器有做備份的話:此時可以從備份伺服器中將該誤
刪的資料給回復還原回來;但這也不是最完美的情況,原因在於
假若該使用者所刪除的資料是該日上午九點以後所修改完畢的新
資料,然而備份伺服器並非每小時都在進行備份,也因此就算資
訊技術人員想要將該檔案救回來,也只能從備份伺服器上進行回
復還原的動作。是故,所救回來的資料,只是前一晚11:00時所備
份的;這也就意味著,使用者做了一整個早上的白工,一事無成,
如【圖一】所示的畫面。

2.如果檔案伺服器沒有做備份:這個情況就更慘了,使用者誤刪的
資料,就完完全全從這個世界上消失了。在上面的第一種情況裡,
若是使用者只對資料做了些許的修改,就算誤刪了,資訊技術人
員所救回來的資料,仍然對他有極大的幫助,因為他只要再針對
他做過的修改部份重新再做過一遍即可;但若是遇到第二種情況,
則是整個檔案完全不見。假設這個檔案真的非常重要,甚至關係
到整個企業或組織的命脈,其嚴重情形,不言可喻。

在Samba 2.X版的時代,並沒有網路資源回收筒的機制,因此,如
一旦發生了像上述的問題時,對資訊技術人員來說,是個無解的難
題;但自從Samba 3出現以後,上述的問題便不再是個困擾了,原因
在於Samba 3擁有網路資源回收筒機制,前提只在您必須記得去啟用
該項功能。

啟用Samba 3網路資源回收筒的功能後,假設未來真的不幸遇到使
用者誤刪了Samba檔案伺服器上的資料,資訊技術人員亦可以很快速
地在Samba 伺服器上其所設置的資源回收筒中迅速找到該資料,並
將其還原。

筆者在這裡,不多加敘述Samba資源回收筒的理論,有興趣的讀者,
請逕自連上Samba官方網站上去閱讀。筆者參考了Internet上許多有
關Samba網路資源回收筒的專文,並利用手邊的機器實做了一番,很
高興地,筆者成功了,也因此將該操作步驟及思考流程撰寫本文,
以期讓更多的使用者瞭解到Samba 3的妙用。

首先,筆者先敘述一下整個Lab環境、實做的流程,以及要完成的
目標。

1.作業系統為CentOS 4.3 Linux。

2.於該Linux系統上啟用Samba功能。

3.在Linux上建立兩個帳號(登入Linux的系統帳號及Samba帳號),
一個為alex,另一個為daphne。

4. alex及daphne同屬mis部門;兩人可透過網路芳鄰的方式,在Samba
Server所分享出來的資料夾裡建立屬於自己的Folder,就算是同
屬mis部門的其他人,也無法進入該個人所建立的資料夾中。

5. alex及daphne可在Samba Server所分享的資料夾裡,建立檔案,
只有同屬mis部門的人可以讀取,但不允許刪除。也就是說,只有
擁有者(建立該檔案的人)才可以刪除。

6.假若alex誤刪了Samba Server上的檔案(alex.txt),該 Samba
Server的系統管理員,可利用Samba網路資源回收筒的機制,將該
檔案迅速救回來。

在上述這樣的前提下,筆者假設各位讀者們已經具備基本架設Samba
Server的能力,因此並不會講解架設Samba Server的步驟。

相信大家都瞭解,Samba Server最重要的設定檔是位於『/etc/samba』
下的『smb.conf』;而我們若是想啟用Samba Server的網路資源回
收筒功能,亦是在『smb.conf』去做設定,所以讀者們首先必須利
用編輯軟體,如vi等,去編輯此一檔案。

在這檔案中,筆者除了希望達成網路資源回收筒的機制外,亦希
望在『/』目錄下,建立一個share的網路分享資料夾,以期讓mis部
門的人能將該資料夾當作網路硬碟使用,藉以存放資料。

透過Windows網路芳鄰的方式,存取share資料夾時,該資料夾裡
面的檔案權限為:『所有mis部門的人都可以read;而只有建立該檔
案的人擁有rwx的權限』。

此外,該share資料夾裡的Folder權限為:『每個mis部門的人,
都可以建立屬於自己的Folder,但是只有建立該Folder的人可以對
該Folder擁有完全控制(rwx)的權限,其餘的人則完全無法存取該
Folder』。

上述smb.conf設定的內容,則如【圖二】所示。

在【圖二】的設定裡,我們設定了網路資源回收筒的機制,大家
一定很好奇,什麼是『recycle:keeptree』、『recycle:versions』
及『recycle:repository』?以下筆者將為這三個重要設定的選項
做個簡單的解釋。

1.『recycle:keeptree = yes』,這個選項的意義為刪除的資料。
到了網路資源回收筒後,仍然保有其樹狀結構,比方說使用者alex
在「alex資料夾下刪除了一個叫做alex.doc檔案」;未來在Samba
網路資源回收筒內,資訊技術人員便可以找到一個名為alex的人,
其有個資料夾叫做alex,而在該alex資料夾裡有個alex.doc檔案。
簡言之,從檔案結構的觀點來看,其表示意義為→資源回收筒資
料夾/alex(使用者帳號)/alex(Folder)/alex.doc(File)』。

2. 『recycle:versions = yes』,這個選項的意義是會為您保留相
同的檔案名稱,未來若您將該檔案刪除,並重新建立一個檔名一
模一樣的檔案,將來某一天,若您又把這個新檔案給刪除了,資
訊技術人員會在Samba網路資源回收筒內看到兩個檔名一模一樣的
檔案,但是其會以日期及時間做區隔,並不會像一般的資料夾一
樣,不允許有兩個相同檔名的檔案存在。舉例來說,您於Samba
Server有一個檔案名為『test.doc』,您於2006/6/6將其刪除,
而後您於2006/6/7重新建立一個檔名為test.doc的檔案,但您又
於2006/6/8將其刪除。此時,資訊技術人員便會在Samba的網路資
源回收筒內,看到兩個test.doc的檔案,但它們是以日期做區隔
的,並不會有衝突的情形產生。

3. 『recycle:repository = ../Garbage/ %u』。由於資源回收筒
的位置,並無法以絕對路徑做設定,也因此筆者將資源回收筒的
路徑從原先的『/share』路徑,使用相對路徑指定的方式指向『/』
目錄下的『Garbage』資料夾;而『%u』的意義則為使用者的帳
號,亦即若alex刪除了檔案,就會在『/Garbage』資料夾內建立
一個名為alex的資料夾,進而存放其所刪除的資料。

剛剛我們曾經提到,需要在『/』目錄下建立一個網路資源回收筒
Garbage的資料夾,此一資料夾由於未來mis群組的人,比方說alex、
dpahne等所刪除的資料,都會被擺放到「/Garbage」資料夾內,所
以該資料夾的權限設定應為mis群組的人,擁有『rwx』的權限。

另外,我們未來也希望alex及daphne透過網路芳鄰存取『/share』
資料夾的時候,alex所建立的檔案,daphne及mis群組的人只有read
的權限,但不能刪除alex的檔案;相反的,daphne所建立的檔案也
只有alex及mis群組的人員可以讀取,但沒有權限刪除daphne的檔案。

為了達成這樣的目的,我們必須使用特殊權限的方式來完成,也
就是採用sticky的方法。要使用sticky,必須在命令列上鍵入
『chmod o+t 資料夾名稱』的方式來完成。以這個例子而言,就是
鍵入『chmod o+t /share』,完成後,其資料夾的檔案權限,就會
如同【圖三】所示的畫面。

當完成上述這些Samba Server的準備工作後,現在我們只需要將
Samba的Daemon啟動,即可讓Windows作業系統的人,透過網路芳鄰
或是Access UNC Share的方式來存取Samba Server所分享出來的資
料夾,當然前提是您必須擁有正確的帳號及密碼,如【圖四】所示。

現在假設使用者alex已經順利存取到『/share』資料夾內的內容,
並建立了一個名為alex.txt檔案,假設alex想要將這個alex.txt檔
案刪除,當他按下yes的選項後,如【圖五】所示,則此一alex.txt
檔案便會立刻被移至網路資源回收筒內。

在過去沒有Samba網路資源回收筒的年代,alex.txt這個檔案被使
用者刪除,無論是在使用者的windows資源回收筒裡,或是在之前儲
存alex.txt的Samba伺服器上的垃圾桶內,完全找不到alex.txt這個
檔案;這也就意味著,這個檔案從此在世界上消失,不復存在。但
在Samba 3出現後,此一情況全部都改觀了。以剛剛使用者alex刪除
了他自己所擁有的alex.txt這個例子來看,只要alex求助於資訊技
術人員,希望能將檔案救回,資訊技術人員應該能夠輕易辦到。

因為在這個例子裡,資訊技術人員,只需要到Samba Server上的
Garbage資料夾內,就可以發現alex.txt檔案,而後利用『cp -p 檔
案名稱複製的目的地』的指令,即可以輕鬆地將檔案還原給使用者,
如【圖六】所示的畫面。

最後有一點值得我們大家注意的是,由於未來透過網路芳鄰方式
刪除的檔案都會被擺放到Garbage資料夾內,所以其檔案量的成長是
相當可觀的,也因此我們必須定期去清理該資料夾,以避免塞爆磁
碟空間。

在Linux上架設Samba Server,使之成為檔案伺服器,現已廣為大
家所接受並採用。假若您想對Samba Server上的檔案,維護更加周
全的話,請記得採用Samba 3 的網路資源回收筒機制。
(本文作者任職於數學所資訊室)
yehlu
Site Admin
文章: 3245
註冊時間: 2004-04-15 17:20:21
來自: CodeCharge Support Engineer

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

文章 yehlu »

http://moto.debian.org.tw/viewtopic.php ... cb9cdaa266

所需套件:

 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,
 這些被蓋掉的檔案很輕易得就被找回來了。
 所以,建議您不妨啟用這個功能,
 在需要它出場的時候,它可是價值連城的王牌哦!
_________________
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血
回覆文章

回到「Linux」