# 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
```