1. 程式人生 > >CentOS中誤刪除libc.so.6系統庫文件,如何恢復?

CentOS中誤刪除libc.so.6系統庫文件,如何恢復?

linux 系統 文件恢復

在做實驗的過程中,對於一些系統關鍵的庫,要小心使用,稍不留神就會造成系統的癱瘓,比如小編在做實驗的時候不小心將/lib64/libc.so.6這個系統共享庫給不小心刪除了,可能剛開始不知道這個庫的重要性,結果下一秒就後悔了,因為系統大部分的命令都不能正常使用了,會顯示一個:error while loading shared libraries: libc.so.6:cannot open shared object file: No such file or directory 提示當加載共享庫libc.so.6的時候找不到該文件,後來經過查找資料才得以解決,下面小編將我的方法分享給大家:技術分享

在開始解決問題之前我們首先的搞清幾個概念:

*Libc.so.6共享庫是幹什麽的?

*Selinux是什麽鬼?

*LD_ORELOAD是什麽東東?

經過小編在因特網上翻江倒海之後,終於弄清除了這些東西都是什麽鬼:

Libc.so.6共享庫是Linux平臺提供的C的標準庫,提供了函數的實現,大多數庫函數在libc中 ,這就解釋了為什麽缺少了這個庫那麽多的命令都運行不了了。

Selinux:以下解釋來自於百度文庫,SeLinux(Security-EnhancedLinux) 是美國國家安全局(NSA)對於強制訪問控制的實現,是 Linux歷史上最傑出的新安全子系統。NSA是在Linux社區的幫助下開發了一種訪問控制體系,在這種訪問控制體系的限制下,進程只能訪問那些在他的任務中所需要文件SeLinux是一種基於 域-類型 模型(domain-type)的強制訪問控制(MAC)安全系統,它由NSA編寫並設計成內核模塊包含到內核中,相應的某些安全相關的應用也被打了SeLinux的補丁,最後還有一個相應的安全策略。任何程序對其資源享有完全的控制權。

SELINUX有「disabled」「permissive」,「enforcing」3種選擇。

*Disabled就不用說了,

*permissive就是Selinux有效,

*Enforcing就是你違反了策略,你就無法繼續操作下去。

LD_ORELOAD簡介:在UNIX的動態鏈接庫的世界中,LD_PRELOAD就是這樣一個環境變量,它可以影響程序的運行時的鏈接(Runtimelinker),它允許你定義在程序運行前優先加載的動態鏈接庫。這個功能主要就是用來有選擇性的載入不同動態鏈接庫中的相同函數。通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。一方面,我們可以以此功能來使用自己的或是更好的函數(無需別人的源碼),而另一方面,我們也可以向別人的程序註入惡意程序,從而達到那不可告人的罪惡的目的。技術分享

以上都是概念的補充,接下來我們會用到。

造成系統找不到libc.so.6庫的原因有三種:

*)文件的名字被更改了,即重命名。

*)文件被移動到別的目錄了。

*)文件被刪除了。

針對以上三種情況,前兩種情況可以看作一種情況處理,文件還在,就是路徑系統找不到了,這種情況相對來說要好辦一點,對於第三種情況,文件整個都不存在了,這個時候我們就得借助外部的文件進行解決。

我們首先來看一下系統加載libc.so.6的路徑信息:技術分享

在系統中,libc.so.6的路徑明確指明是/lib64/libc.so.6如果此路徑發生變化或者文件名對不上號了,都會導致系統找不到該共享文件。

第一種:文件存在,系統找不到

對於這種情況,我們不能再將文件重新復制到或移動到原目錄中,因為mv和cp等大多數命令都不能執行了,所以我們看著就是挺著急沒辦法,首先我們來看一下這種情況:

技術分享

移動了libc.so.6文件

技術分享重命名了libc.so.6文件

ls命令和id命令都不能使用了,這個時候我們就用到LD_ORELOAD這個環境變量了,經過上面的知識補充,我們知道,通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。現在我們可以使用這個環境變量來臨時加載還存在但是不在原目錄或是名字被篡改了的庫文件,在臨時添加環境變量的後面接上我們要執行的命令就可以將libc.so.6庫恢復到原來的樣子,讓小編帶你進行實驗驗證:技術分享 將移動的文件恢復技術分享 將重命名的文件恢復

第二種:文件被刪除,不存在了

對於這種情況比較復雜,我們不能通過本地直接進行恢復,我們必須借助外面的文件進行恢復,具體的思路就是通過加載光盤系統文件,將該函數庫重新拷貝到本地系統中來,達到恢復的目的,讓小編畫圖來說明:

技術分享

我們要借助光盤系統將光盤系統中的/lib64/libc.so.6拷貝到本地系統的/lib64/中,達到恢復的目的。

光盤系統和本地系統都是Linux系統,所以有著相似的根目錄,需要把本地系統的根掛載到光盤系統根下的一個子目錄中,系統默認掛載到/mnt/sysconfig/下,這裏的/mnt/sysconfig/就是我們本地系統的,接下來跟隨小編來看一看具體的步驟吧。

首先小編先將我本地的libc.so.6文件刪除,為接下來的實驗做準備。

技術分享

技術分享

在沒有這個庫文件的情況下,我們是不能使用命令正常關機或重新啟動的,我們是在虛擬機的情況下進行的實驗所以此步驟僅供參考,不過原理都是一樣的。

我們要在虛擬機上進行強制重新啟動,如圖所示:

技術分享

在啟動前我們需要把系統鏡像掛載到CD/DVD(IDE)上,如下圖所示:

技術分享

當進入開機畫面的時候要快速的按一下ESC鍵,進入如下所示的界面,(我們要把鼠標點進虛擬機中,這樣執行的操作才是對虛擬機的指令,不要按的太快,別錯過這個界面。)選擇第三項:光盤驅動。

技術分享

這個時候我們會進入裝機引導界面,這幾項分別是:安裝或升級存在的系統、安裝系統用基本視頻驅動、恢復安裝的系統、從當地驅動器啟動、內存測試。我們要選擇恢復安裝的系統,如下圖所示:

技術分享

之後會進入選擇語言的界面,請根據以下小編的步驟一步步進行:

技術分享

技術分享

技術分享

技術分享

這裏顯示,你的系統將會被掛載到/mnt/sysimage目錄下,如果你想在root環境下操作,運行命令:chroot /mnt/sysimage

技術分享

技術分享

當你選擇OK之後系統就會Start shell,如下所示的命令行,此時,我們進入的是光盤系統下的Linux,切記,不要弄混亂了。

技術分享

這裏有必要說明以下,目前進入的系統是光盤中引導的Linux系統,不是真實的本地系統,我們真正的系統剛才也提示過了,被掛載到了/mnt/sysiconfig中,所以除了/mnt/sysiconfig下的東西,別的都是光盤系統中國的文件。

技術分享

我們的本地系統中沒有了libc.so.6這個文件,所以我們需要將光盤系統中的這個文件進行Copy到本地系統中,並放到原來的目錄下,這裏一定要看清楚自己所在的目錄,盡量使用相對路徑來進行復制:如小編操作所示:

技術分享

進行完文件的恢復之後,我們還要對本地系統下的selinux這個文件進行修改,根據我們前面的只是補充,我們知道selinux是一種強制訪問安全控制系統,當我們對系統中的重要文件進行了更改之後,重新啟動的過程中,這個安全控系統會檢測到我們對本地系統進行了更改,因為機器本身不具有檢測文件安全性的功能,所以機器本身能做的最好的決定就是,不讓你啟動,我們在上面的知識擴展中也了解到,selinux一共有三種選擇:

*Disabled就不用說了,是禁止的意思。

*permissive就是Selinux有效,

*Enforcing就是你違反了策略,你就無法繼續操作下去。

在我們知情的情況下,我們復制了該文件,並且該文件也是安全的,所以我們可以經SELIUNX的值修改為Disabled,不執行安全監測,可以讓我們正常啟動,當然在我們正常啟動並恢復後,我們可以再將該值修改回來,開啟安全監測功能。小編的操作如下:

技術分享

一定要記得,是需要對本地系統的selinux進行的操作,如果修改成了光盤系統中的selinux,那麽是不能正常啟動的。請一定確定路徑的正確性。

技術分享

nano編輯器中,我們修改好之後要進行ctrl + o進行保存,Ctrl +x進行退出。退出之後,我們進行重啟。

技術分享

等到重啟完成我們就可以進入正常的系統了,如下圖所示:

技術分享

通過這次的實驗和學習,我們不僅知道了如何恢復libc.so.6文件,(其實,這種方式也適用於其他重要文件的恢復)還學習到了三個知識點:

明白了libc.so.6文件的作用以及該文件對系統的重要性。

知道了selinux是一種基於-類型模型(domain-type)的強制訪問控制(MAC)安全系統

知道了LD_PRELOAD是一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫。通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。

收獲滿滿!技術分享


本文出自 “Linux運維” 博客,請務必保留此出處http://jk6627.blog.51cto.com/12002684/1952120

CentOS中誤刪除libc.so.6系統庫文件,如何恢復?