/bin/bashを削除してしまった場合の復旧方法
職場の人間がうっかり/bin/bashを消したので、調べつつ対処した。
その時のメモ。
というか、/bin/bash消しといて何もしてないけど動かなくなりました!はねえわ
そもそも/bin/bashを削除するとどうなるのか
今回想定する環境としては、
- CentOS7
- ユーザのデフォルトシェルは/bin/bash
まずは事象再現のため、/bin/bashを削除してみる。
[root@localhost ~]# ls /bin/bash /bin/bash [root@localhost ~]# [root@localhost ~]# rm -f /bin/bash [root@localhost ~]# [root@localhost ~]# ls /bin/bash ls: cannot access /bin/bash: No such file or directory [root@localhost ~]#
無事(?)削除できた。
このタイミングで、既にsshでのログインが出来なくなっている。
正確に言うと、sshでの認証処理は出来ているが、デフォルトシェルが存在しないため、シェルの起動に失敗している状態。
この状態で再起動してみる。
ユーザ名・パスワードを入力すると、
何事も無かったかのようにログイン画面に戻る。
これは、rootユーザのデフォルトシェルである/bin/bashが存在しないため。
レスキューモードでの起動
こうなってしまうと、通常の起動では復旧が難しいので、レスキューモードで起動する。
GRUBメニューにて、[e]キーを押下する。
設定編集画面にて「linux16」の項目末尾に、以下の起動オプションを追加する。
systemd.unit=rescue.target init=/bin/sh
initオプションを指定することで、起動時にsystemdの代わりに/bin/shを実行させるよう設定する。
追加後、[Ctrl-x]を押下して起動させる。
/bin/bashの復旧
レスキューモードで起動したので、/bin/bashを復旧する。
ファイルシステムは、/sysrootでreadonlyでマウントされている。
/bin/bashを配置する必要があるため、書き込み可能になるよう、マウントし直す。
:/# mount -o remount,rw /sysroot
これで/sysrootに書き込めるようになったので、/bin/bashをコピー。
:/# cp /bin/bash /sysroot/bin/bash :/# :/# ls -l /sysroot/bin/bash -rwxr-xr-x 1 root 0 964544 Jan 19 08:47 /sysroot/bin/bash :/#
再起動後、無事にログインできるようになった。