學會這個騷操作,再也不怕從刪庫到跑路

刪庫是不可能刪庫的,這輩子都不可能刪庫的,刪根行嗎?
滿足你:

[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號來識別文件,而非文件名。

作爲用戶我們打開一個文件,在系統內部的流程是這樣的:

  1. 系統找到這個文件名對應的inode 號碼
  2. 通過inode號碼,獲取inode信息
  3. 根據inode信息,找到文件數據所在的block,讀出數據

同樣的Linux系統是通過link的數量來控制文件刪除的,刪除指的是文件名到inode的鏈接被刪除了,但是文件在磁盤上的block數據塊並未被刪除。

所以我們想要恢復,只需要恢復對應的inode節點號就可以恢復數據,但前提是,數據沒有被覆蓋掉。
那麼問題來了: 誤刪除文件之後,我們第一時間要做的事情是什麼?

  • 辭職跑路
  • 卸載要恢復的文件分區
  • 要恢復的分區以只讀的形式掛載

跑路是不可能跑路的,這輩子都不會跑路的!

在這裏插入圖片描述

如果誤刪除文件或者數據我們怎麼辦?

既然事情已經發生,作爲運維我們只能上手解決,還好我遇到了它。extundelete

在這裏插入圖片描述

下載網址:http://sourceforge.net/

實驗思路:

  1. 虛擬機新加一塊硬盤(此硬盤用於創建數據,刪除數據,恢復數據的模擬)
  2. 對新加的硬盤sdb進行分區,格式化,以及掛載
  3. 在新盤上進行創建數據,然後刪除數據
  4. 對數據進行恢復

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來恢復數據。

切記:任何補救措施都是事故,並不會顯得有多高大上,高大上的運維應該是做好線上線下運維規範,確保不出現運維事故。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章