# CentOS 7 rescue mode ###### tags: `系統`, `Linux` ## 如何進入救援模式 - 本次因為升級系統原生模組套件glibc2.17>2.18導致系統錯亂無法開啟,故需要進入救援模式救援資料庫資料。 - 透過VMware 啟動虛擬機 - 載入畫面Centos7 loading 快速按鍵`ESC` 進入開機選單 <img src="https://i.imgur.com/szAQH1e.png" width=700> - 點擊透過CD-ROM 開機 <img src="https://i.imgur.com/ZwcnIiA.png" width=700> - 點擊trouble shooting <img src="https://i.imgur.com/4VIhiil.png" width=700> - 點擊rescue <img src="https://i.imgur.com/gmUM9l1.png" width=700> - enter 進入模式 <img src="https://i.imgur.com/ltnvBLM.png" width=700> - 選1 <1(完整模式),2(讀取模式),3(略過shell),4(離開,重開機Quit)> <img src="https://i.imgur.com/wVghedC.png" width=700> - 預設系統安裝路徑/mnt/sysimage - 以root 身份進入系統bash `chroot /mnt/sysimage` <img src="https://i.imgur.com/iUg7OVr.png" width=700> - 無法使用chroot 系統: [參考連結](https://blog.csdn.net/geniusle201/article/details/115245073) 進入系統資料夾 ``` cd /mnt/sysimage ``` 檢查Bash連結 ``` ldd bin/bash ``` <img src="https://i.imgur.com/2yiCkHw.png"> 複製並覆蓋檔案 ``` mkdir lib64 cp /lib64/ld-linux-x86-64.so.2 ./lib64/ mkdir ./lib/x86_64-linux-gnu cp /lib/x86_64-linux-gnu/liblsp.so ./lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libtinfo.so.5 ./lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libdl.so.2 ./lib/x86_64-linux-gnu/ cp /lib/x86_64-linux-gnu/libc.so.6 ./lib/x86_64-linux-gnu/ /bin/bash ./bin ``` 測試 ``` chroot /mnt/sysimage ``` <img src="https://i.imgur.com/iUg7OVr.png" width=700> ## 於救援模式建立連線 參考來源: [網址](https://www.golinuxcloud.com/enable-ssh-configure-network-in-rescue-mode/) - 取得連線資訊-裝置名稱 (確認有state up) ``` ip link ``` - 建立 啟用ip ``` ip link set dev ens129 up ``` - 新增ip 位址 ``` ip addr add 192.1.68.5.1 dev ens129 ``` - check ip ``` ip a ``` - 設定route ``` ip route add default via 192.168.5.1 ``` - check route ``` ip route ``` - 測試 ``` ping 192.168.5.1 ``` ## 使用救援模式備份檔案 參考資源: [網址](http://tecmint.com/transfer-mysql-databases-from-old-to-new-server/) - 備份mysql 資料庫完整folder ``` rsync -avz /var/lib/mysql/* user@ip:/var/lib/mysql/ ``` ## remove ssh fingerprint ``` ssh-keygen -R 192.168.5.1 ``` # mongodb repair ## 安裝與損壞系統的mongodb同版本資料庫 [安裝教學網址](https://docs.mongodb.com/v4.2/tutorial/install-mongodb-on-red-hat/) - db版本確認(於rescue mode): ``` mongod --version ``` <img src="https://i.imgur.com/OU2ijg0.png" width=750> - 變更原始mogodb path DB資料名稱備存 ``` mv /var/lib/mongo /var/lib/mongo_origin ``` - 遠端傳遞至虛擬機 ``` rsync -avz /var/lib/mongo/* user@ip:/var/lib/mongo/ ``` - `systemctl start mongodb` 啟動失敗 - 直接使用 指令起服務 ``` mongod --dbpath /var/lib/mongo --fork --logpath /var/log/mongodb ``` - 出現錯誤 透過拿掉--fork 檢視錯誤,並排除錯誤 - 檢查/etc/mongod.conf 內的logpath 與db path 是否為 - `/var/lib/mongo` - `/var/log/mongodb/mongodb.log` ``` cat /etc/mongod.conf ```   - 成功啟動後將資料透過mongo 備份指令 輸出資料庫 - 進入mongodb 並秀出所有DB,確認是否成功載入過去Databases ``` mongo show dbs exit ``` <img src="https://i.imgur.com/kZHpMUv.png"> - 使用mongo備份指令 `mongodump -h 127.0.0.1 -d <dbName> -o /var/lib/mongo_origin/backup/` ``` mongodump -h 127.0.0.1 -d admin -o /var/lib/mongo/backup/ mongodump -h 127.0.0.1 -d config -o /var/lib/mongo/backup/ mongodump -h 127.0.0.1 -d finform -o /var/lib/mongo/backup/ mongodump -h 127.0.0.1 -d finproduct -o /var/lib/mongo/backup/ mongodump -h 127.0.0.1 -d local -o /var/lib/mongo/backup/ mongodump -h 127.0.0.1 -d test -o /var/lib/mongo/backup/ ``` - 確認完成備份後,移除所有mongodb server 資料,並重新安裝 ``` sudo yum erase mongodb-org* yum install -y mongodb-org ``` - 啟動mongo服務 ``` systemctl start mongod ``` - 成功後 將資料還原至mongo服務內 ``` mongorestore --db admin --verbose admin/ mongorestore --db config --verbose config/ mongorestore --db finform --verbose finform/ mongorestore --db finproduct --verbose finproduct/ mongorestore --db local --verbose local/ mongorestore --db test --verbose test/ ``` - 進入mongo並確認是否存在 ``` mongo show dbs exit ``` - 完成 <img src="https://i.imgur.com/kZHpMUv.png"> --- # glibc2.18 install <Warning!!! it will make system unboot> [reference link](https://serverfault.com/questions/894625/safely-upgrade-glibc-on-centos-7) ``` wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz tar zxvf glibc-2.18.tar.gz cd glibc-2.18 mkdir build cd build ../configure --prefix=/opt/glibc-2.18 make -j4 sudo make install ``` ``` patchelf --set-interpreter /opt/glibc-2.18/lib/ld-linux-x86-64.so.2 <your program want to use glibc2.18> ``` ## install patchelf [reference link](https://snapcraft.io/install/patchelf/rhel) - install epel-realease ``` rpm -ivh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm ``` - install snap ``` sudo yum install snapd ``` - enable snapd ``` sudo systemctl enable --now snapd.socket ``` - link snap ``` sudo ln -s /var/lib/snapd/snap /snap ``` - install patchelf ``` sudo snap install patchelf --edge --classic ``` - install patchelf from yum ``` yum install patchelf ```