見出し画像

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で有効化させるだけ

最後に

最後まで読んでいただきありがとうございました。お役に立てたら幸いです。


この記事が気に入ったらサポートをしてみませんか?