Linux OSで"Failed unmounting"に苦しまされた話
この記事を作った経緯
書き込み中に気づかず再起動して300個ほどファイルを破損させたというのが始まり(そういえばちょくちょく数個ファイル壊れてた気が…)
解決方法
systemdにサービスを登録して再起動時やシャットダウン時にスクリプトを実行させる
環境
ハードウエア
ディスク構成補足
私の環境はソフトウェアRAIDでRAID5を構成しています。
md0p1は仮想的なデバイスで実際にはmdadmのドライバによって1個に見えるようになっています。
root/
┣OS等
┃
┗mnt/
┗md0p1/
┗今回問題になったデータ
スクリプトを作成してみる
まずファイルを用意する
sudo nano /etc/systemd/system/shutdown-commands.service
[Unit]
Description=Shutdown commands
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/bin/bash -c "sudo systemctl stop smbd && sudo systemctl stop nmbd && sudo umount -l /mnt/md0p1 && while grep -qs '/mnt/md0p1' /proc/mounts; do echo 'Unmount in progress...'; sleep 1; done"
[Install]
WantedBy=multi-user.target
WantedBy=halt.target
WantedBy=reboot.target
コマンド解説
"ExecStop="の先を書き換えればエラーの出ているドライブに対応できる、ただし使っていそうなサービスを事前に終了させる必要があります。
sudo systemctl stop smbd
sudo systemctl stop nmbd
上記は私の環境でファイル共有ソフト、Sambaが動いているため終了させるコマンドです。
sudo umount -l /mnt/md0p1
マウント解除コマンド、 -l はプロセスが使い終わったらマウント解除する様にするオプション
while grep -qs '/mnt/md0p1' /proc/mounts; do echo 'Unmount in progress...'; sleep 1; done"
1秒毎にマウントが解除できたか確認するコマンド、これがないとマウント解除出来ていないのにOSが終了する可能性があるため一応付けました。
スクリプトの適応
sudo systemctl daemon-reload
sudo systemctl enable shutdown-commands.service
デーモンをReloadさせてファイル追加を認識させてenableで有効化させるだけ
最後に
最後まで読んでいただきありがとうございました。お役に立てたら幸いです。