PR

「ディスクの不正な取り出し」警告対策:Sleep/Awakeを検出してUSB HDDをunmount/mountする

MacBook Pro RetinaにUSBハブを接続し、作業しています。

USBハブには、以下製品を接続しています。

  • バックアップ用USB HDD
  • USB キーボード
  • USB マウス

作業している間、不満は特にありません。

MacBook Pro RetinaがSleepモードに入っている状態で、MacBook Pro Retinaを持ち出したり、
別の場所へ移動させようとUSBハブを抜くと

当然ながら「ディスクの不正な取り出し」警告が表示されます。
「ディスクの不正な取り出し」
電源を入れて、ディスクの取り出し操作をすれば警告は表示されませんが、毎回面倒な手順だと感じ始めていました。

Sleep、特に作業しているわけではありません。
作業している間は、バックアップしてほしい、
MacBook Pro RetinaがSleepしている間はいつでもUSBハブを抜いていい状態にしておきたい

という欲望がでてきました。

実現したいこと

Sleep状態に入ることを察知したら、diskutil umount でUSB HDDをいつでも抜ける状態にする
自分でMacを起動、diskutil mount でバックアップ可能な状態にする

やりたいことは非常に単純です。

どうやってSleep/Awakeを検出するのか

これが大きな問題です。

単純に実現するならAppleScriptです。AppleScriptでSleep/Awakeを検出できるのか
調べてみると、AppleScriptでの検出は難しそうです。
Power ManagerやSleepWatchなるものがあるようです。

探している中で、IORegisterForSystemPowerなるAPIを知りました。

どうやら簡単に自分で作れそうな予感がしてきました。

Sleep/Awakeを検出してShellScriptを呼び出すPowerNotifyd

ソース等は、githubに登録してみました。
https://github.com/macyarounanoka/PowerNotifyd

~/Library/LaunchAgentsフォルダにplist形式のファイルを置くことで、自分がログインしている間に自動実行・自動停止するプログラムを制御できます。
また、launchctlコマンドでloadすることで強制的に開始状態にできます。

install.shを実行するとこのあたりの制御を実行します。

PowerNotifyd/scripts/SystemWillSleep

システムがスリープに入る前に呼び出されるスクリプトです。
アンマウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemWillSleep
#!/bin/sh

diskutil umount /dev/disk2s2

(viの代わりにテキストエディタ等で編集しても構いません)

/dev/disk2s2は、USB HDDデバイスを意味しています。(Mac野郎なのかの環境)

接続している数で変化するので、USB HDDを接続した状態で以下dfコマンドを実行して調べてください。
$ df
Mounted onにラベル名があります。これでHDDを特定して、Filesystem項目の/dev/disk?s?を選定します。

PowerNotifyd/scripts/SystemHasPoweredOn

システムが起動完了状態になると呼び出されるシェルスクリプトです。
マウントするコマンドを登録します。
vi ~/PowerNotifyd/scripts/SystemHasPoweredOn
#!/bin/sh

diskutil mount /dev/disk2s2

(viの代わりにテキストエディタ等で編集しても構いません)

起動

起動は、install.shがエラーなく完了している時点で終了しています。
$ launchctl list | grep PowerNotifyd

local.PowerNotifydが見つかるはずです。見つかる場合は、実行中の証です。

/var/log/system.logにもstart、及びSleep/Awakeイベントで実行が記録されるようになっています。

とりあえず目的は達成

Sleep状態になるとUSB HDDがアンマウントされ、いつでもUSBハブが抜ける状態になりました。
MacBook Pro Retinaを起動するとUSB HDDがあればマウントされるようになりました。

タイトルとURLをコピーしました