文章目錄
刪庫是不可能刪庫的,這輩子都不可能刪庫的,刪根行嗎?
滿足你:
[root@zmgaosh ~]# rm -rf /
rm: 在"/" 進行遞歸操作十分危險
rm: 使用 --no-preserve-root 選項跳過安全模式
[root@zmgaosh ~]#
寫在前面:
博主是一名投身教培事業的標準八零後,叛逆而且追求自由,暱稱取自於蘇軾的《水調歌頭》中的“高處不勝寒”,時刻提醒自己要耐得住寂寞,受的了孤獨,在技術的道路上,不畏艱難,勇往直前。
我已經將全部的linux運維體系整理到了gitee上,https://gitee.com/gaosh08/LinuxFamily
歡迎star,投稿,交流,後續還會有python系列和java系列。
今天我們不刪數據庫,我們來聊聊誤刪除文件如何能不能恢復?
- 能
- 不能
你選哪個,答案是能,這事我們得先從原理講起
Linux操作系統文件刪除原理
Linux文件系統由三部分組成:文件名,inode,block
zmedu.txt -->inode --> block
文件名 存放文件元數據信息 真正存放數據
文件存儲在硬盤上,硬盤的最小存儲單位叫做“扇區”(Sector)。每個扇區儲存512字節(相當於0.5KB)。
操作系統讀取硬盤的時候,不會一個個扇區的讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次性讀取一個“塊”(block)。這種由多個扇區組成的“塊”,是文件存取的最小單位。“塊”的大小,最常見的是4KB,即連續八個sector組成一個block。
文件數據都儲存在“塊”中,那麼很顯然,我們還必須找到一個地方儲存文件的“元信息”,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元信息的區域就叫做inode,中文譯名爲"索引節點"。
我們訪問的任何數據,都是先找到inode,然後根據inode去找到相應硬盤的位置。如果沒有inode號,就無從找到硬盤上的數據。
這個inode號在哪裏呢?
[root@zmgaosh ~]# ls -i b.txt
262170 b.txt
從上個例子看一看到b.txt的inode號是262170
-在inode裏面包含的元信息,具體內容如下:
- Size 文件的字節數
- Uid 文件擁有者的User ID
- Gid 文件的Group ID
- Access 文件的讀、寫、執行權限 文件的時間戳,共有三個:
Change 指inode上一次變動的時間
Modify指文件內容上一次變動的時間
Access 指文件上一次打開的時間 - Links 鏈接數,即有多少文件名指向這個inode
- Inode文件數據block的位置
- Blocks 塊數
- IO Blocks 塊大小
- Device 設備號碼
我們還可以通過stat來查看inode的信息
[root@zmgaosh ~]# stat b.txt
文件:"b.txt"
大小:25 塊:8 IO 塊:4096 普通文件
設備:fd01h/64769d Inode:262170 硬鏈接:1
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近訪問:2020-06-19 20:55:39.327737431 +0800
最近更改:2020-06-19 20:55:34.924697772 +0800
最近改動:2020-06-19 20:55:34.926697790 +0800
創建時間:-
敲黑板: 在Linux操作系統中,文件名只是inode號碼便於識別的綽號,操作系統通過inode號來識別文件,而非文件名。
作爲用戶我們打開一個文件,在系統內部的流程是這樣的:
- 系統找到這個文件名對應的inode 號碼
- 通過inode號碼,獲取inode信息
- 根據inode信息,找到文件數據所在的block,讀出數據
同樣的Linux系統是通過link的數量來控制文件刪除的,刪除指的是文件名到inode的鏈接被刪除了,但是文件在磁盤上的block數據塊並未被刪除。
所以我們想要恢復,只需要恢復對應的inode節點號就可以恢復數據,但前提是,數據沒有被覆蓋掉。
那麼問題來了: 誤刪除文件之後,我們第一時間要做的事情是什麼?
- 辭職跑路
- 卸載要恢復的文件分區
- 要恢復的分區以只讀的形式掛載
跑路是不可能跑路的,這輩子都不會跑路的!
如果誤刪除文件或者數據我們怎麼辦?
既然事情已經發生,作爲運維我們只能上手解決,還好我遇到了它。extundelete
下載網址:http://sourceforge.net/
實驗思路:
- 虛擬機新加一塊硬盤(此硬盤用於創建數據,刪除數據,恢復數據的模擬)
- 對新加的硬盤sdb進行分區,格式化,以及掛載
- 在新盤上進行創建數據,然後刪除數據
- 對數據進行恢復
1 . 新加硬盤
2. 進行分區
[root@gaosh63 /]# fdisk /dev/sdb #對sdb進行分區
Command (m for help): n #創建一個新分區
Command action
e extended
p primary partition (1-4)
p #創建一個主分區
Selected partition 1
Last cylinder, +cylinders or +size{K,M,G} (1428-2610, default 2610): +1G #指定分區大小
Command (m for help): w #保存
[root@gaosh63 ~]#reboot
或
[root@gaosh63 ~]# partx -a /dev/sdb #獲得新分區表
3. 使用新的分區表,格式化並掛載:
[root@gaosh63 /]# mkdir /tmp/sdb #創建掛載點
[root@gaosh63 ~]# mkfs.ext4 /dev/sb1 #格式化
[root@gaosh63 ~]# mount /dev/sdb1 /tmp/sdb/ #掛載
4. 複製一些測試文件,然後把這些文件刪除,然後演示恢復:
[root@gaosh63 ~]# cp /etc/passwd /tmp/sdb1/
[root@gaosh63 ~]# cp /etc/hosts /tmp/sdb/
[root@gaosh63 ~]# echo aaa > a.txt
[root@gaosh63 ~]# mkdir -p /tmp/sdb/a/b/c
[root@gaosh63 ~]# cp a.txt /tmp/sdb/a/
[root@gaosh63 ~]# cp a.txt /tmp/sdb/a/b/
[root@gaosh63 ~]# touch /tmp/sdb/a/b/text.txt #創建一個空文件,看空文件是否能夠恢復
開始刪除文件:
[root@gaosh63 ~]# cd /tmp/sdb/
[root@gaosh63 sdb]# ls
a hosts lost+found passwd
[root@gaosh63 sdb]# rm -rf a hosts passwd
誤刪除文件後我們要第一時間卸載分區或者以只讀方式掛載:
[root@localhost ~]#cd /root
[root@localhost ~]# umount /tmp/sdb
5. 安裝extundelet 進行文件的恢復操作
1) 上傳extundelete到linux中:
2) 解壓並安裝extundelte
[root@gaosh63 extundelete-0.2.4]# tar jxvf extundelete-0.2.4.tar.bz2
[root@gaosh63 ~]# cd extundelete-0.2.4
[root@gaosh63]# yum install e2fsprogs-devel
[root@gaosh63 extundelete-0.2.4]# ./configure #檢查系統安裝環境
[root@gaosh63 extundelete-0.2.4]# make -j 4 #編譯
[root@gaosh63 extundelete-0.2.4]# make install #安裝
3) 嘗試進行恢復
方法1:通過inode結點恢復
方法2:通過文件名恢復
方法3:恢復某個目錄,如目錄a下的所有文件:
方法4:恢復所有的文件
[root@gaosh63 ~]# mkdir test #創建一個目錄使用於存放恢復的數據
[root@gaosh63 ~]# cd test/
首先我們要通過inode結點找到被刪除的文件名:
[root@gaosh63 test]# extundelete /dev/sdb1 --inode 2
. 2
lost+found 11
passwd 12 Deleted
hosts 13 Deleted
a 7313 Deleted
然後我們開始恢復:
方法1:通過inode結點恢復
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-inode 12
NOTICE: Extended attributes are not restored.
Loading filesystem metadata ... 9 groups loaded.
Loading journal descriptors ... 63 descriptors loaded.
[root@gaosh63 test]# ls
RECOVERED_FILES
查看是否與源文件一樣:
[root@gaosh63 test]# diff /etc/passwd RECOVERED_FILES/file.12 # 沒有任何輸出,說明 恢復成功,只是文件名不一樣
方法2:通過文件名恢復
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-file passwd
[root@gaosh63 test]# diff /etc/passwd RECOVERED_FILES/passwd # 沒有任何輸出,說明一樣,這次文件名也一樣了
方法3:恢復某個目錄,如目錄a下的所有文件:
[
root@gaosh63 test]# extundelete /dev/sdb1 --restore-directory a
[root@localhost ~]# tree RECOVERED_FILES/
RECOVERED_FILES/
├── a
│ ├── a.txt
│ └── b
│ └── a.txt
├── file.12
└── hosts
下面是原來的目錄結構:
├── a.txt
└── b
├── a.txt
├── c
└── kong.tx
由上圖可見空文件是無法恢復的。
方法4:恢復所有的文件
[root@gaosh63 test]# extundelete /dev/sdb1 --restore-all
總結:備份數據是王道
當數據被誤刪(一般指的是物理文件損壞或者rm導致的誤刪)造成數據丟失,你會如何處理?
- 如果有備份,可以通過mysqldump+binlog來實現全量恢復,xtrabackup來實現增量恢復
- 沒有備份但是做了主從同步,或者雙主結構,可以把從庫提升爲主庫來恢復數據
- 如果你們公司沒有備份,也沒有從庫,可以通過extundelete來恢復數據。
切記:任何補救措施都是事故,並不會顯得有多高大上,高大上的運維應該是做好線上線下運維規範,確保不出現運維事故。