mac接続のUSB-HDDが自動スリープ「ディスクの不正な取り出し」で困った時の対処法
強制終了が必要になってしまうアプリは、Visual Studio Codeです。ファイルを編集しながら、ターミナル操作がアプリ内で完結しているところが便利です。
マウントしたSSDボリューム上のワークスペースを開いている状況で、「ディスクの不正な取り出し」が発生、Visula Studio Codeのウィンドウが無反応になります。
複数のウィンドウでワークスペースを開いています。別に開いているウィンドウは生きているので、macOSは無応答と認識しません。
ただmacOSのアプリ強制終了操作では、全部終了となってしまうのでこれもまた困ってしまうポイントでした。
同じような症状で悩まれている方はこれからご紹介する方法をチェックしてみてください。この方法ではおそらく、スリープ復帰後に発生しやすい「ディスクの不正な取り出し」は直りません。
mac接続のUSB-HDDを自動スリープさせない方法で改善しました
自動スリープはアクティブではない状況が一定時間続く、使っていない状況になることが条件です。外付けUSB HDD/SSDのアクセスランプが光っていない状態が続いている状況ですね。そのためこの非アクティブ状況をなくすことでmac接続のUSB-HDDが自動スリープしないように制御することにしています。
外付けUSB HDD/SSDのアクセスランプがチカチカひかる状況をスケジュールで一定間隔に発生させます。対象のボリュームがマウントされている、特定のアプリ(Visual Studio Code)が動いている、この条件が成立する場合にチカチカさせます
HDDをチカチカさせる
該当USBハードディスクのボリュームにアクセスすることでHDDはチカチカします。読み取り操作、書き込み操作でアクティブにすることができます。ここでは読み取り操作に限定しています。macOS側でキャッシュすることもあるので続けて同じ操作をしてもチカチカしないこともあります。
確実にアクティブにしたい場合、キャッシュの有無に関わらず必ずチカチカするdiskutilコマンドがオススメです。infoパラメータでUSBストレージの情報を確認することができます。この操作は毎回確実にチカチカさせることができます。
例えば以下のようなコマンドです。(デバイス名はご自身の環境に合わせて変えてください。)
diskutil info /dev/disk2s2
数分間キャッシュされることもあります。こちらのlsコマンドでチカチカできます。(ボリューム名はご自身の環境に合わせて変えてください。)
ls /Volumes/work
HDDをアクティブにするシェルスクリプトを作る
対象のボリュームがマウントされていることをmountコマンドで確認します。MOUNTPOINTはご自身の環境に合わせて変えてください。特定のアプリ(Visual Studio Code)が動いていることをpgrepで確認します。SERVICEは特定アプリを変更したい場合に変えてください。ElectronはVisual Studio Codeのプロセス名(/Application/Visual Studio Code/Contents/MacOS/Electron)です。
ボリュームがマウントされている&特定アプリが動作している条件のシェルスクリプトとボリュームがマウントされている条件だけのシェルスクリプトの2種類をご紹介しています。状況に合わせて使い分けできます。
シェルスクリプトのファイル名は~/local/bin/health-check-transcend.shとしています。
【ボリュームがマウントされている&特定アプリが動作している条件のシェルスクリプト】
#!/bin/bash
MOUNTPOINT="/Volumes/work"
SERVICE="Electron"
if mount | grep "$MOUNTPOINT" > /dev/null
then
if pgrep "$SERVICE" > /dev/null
then
ls "$MOUNTPOINT" > /dev/null
fi
fi
【ボリュームがマウントされている条件のシェルスクリプト】
#!/bin/bash
MOUNTPOINT="/Volumes/work"
if mount | grep "$MOUNTPOINT" > /dev/null
then
ls "$MOUNTPOINT" > /dev/null
fi
このファイルを作ったら、sh ~/local/bin/health-check-transcend.shと打ち込んでエラーが無いこと、チカチカすることをチェックしておくと安心です。lsコマンドの場合、キャッシュが働くため連続実行してもしばらくチカチカしません。
以下コマンドで実行権限を与えます。
chmod +x ~/local/bin/health-check-transcend.sh
次に、作成したHDDをアクティブにするシェルスクリプトを一定間隔で呼び出します。
HDDをアクティブにするコマンドを一定間隔で呼び出す
以下LaunchAgentを利用して5分(300秒)間隔で呼び出す定義です。
ファイル名は、~/Library/LaunchAgents/local.mac.transcend.plistとしています。ファイル名は、ドメイン(逆順)+名称のパターンが一般的です。ローカル環境なのでlocal、macの名称をmacにしているのでmac、今回使っているストレージのケースがtranscend、定義ファイルの拡張子plistという構成です。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>local.mac.transcend</string>
<key>ProgramArguments</key>
<array>
<string>/Users/macyarounanoka/local/bin/health-check-transcend.sh</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
<key>StandardOutPath</key>
<string>/Users/macyarounanoka/local/var/transcend.log</string>
<key>StandardErrorPath</key>
<string>/Users/macyarounanoka/local/var/transcend.err.log</string>
</dict>
</plist>
太字の部分はお使いの環境に合わせて修正する必要がありそうな部分です。
label:.plistを除いたファイル名を記載します。ここで指定した文字列がlaunchctl listで表示されます。
ProgramArguments:HDDをアクティブにするシェルスクリプトのフルパスを指定します。
StartInterval(*1):起動する間隔を秒で指定します。
StandardOutPath:標準出力に吐き出されたメッセージを残すファイル名をフルパスで指定します。(今回のスクリプトでは何も出力しないので空のファイルが作成されます)
StandardErrorPath:標準エラー出力に吐き出されたメッセージを残すファイル名をフルパスで指定します。(こちらも通常空ファイルになります。)上手く動作指定ない場合、このファイルの中身を確認することで原因がわかることがあります。
*1日時を指定することもできます。こちらのQiitaの情報が詳しかったです。
~/Library/LaunchAgents/フォルダにplistファイルを配置する後、スケジュールをアクティブにする操作が必要です。以下操作でアクティブにすることができます。
launchctl load ~/Library/LaunchAgents/local.mac.transcend.plist
【Launch Agentの登録・確認・削除操作】
- 未登録であることの確認方法
launchctl list | grep local.mac.transcend
- スケジュールのアクティブ化
launchctl load ~/Library/LaunchAgents/local.mac.transcend.plist
- 登録されたことの確認
launchctl list | grep local.mac.transcend
- 0 local.mac.transcend - スケジュールの非アクティブ化
launchctl unload ~/Library/LaunchAgents/local.mac.transcend.plist
- 未登録であることの確認
launchctl list | grep local.mac.transcend
mac作業中に突然「ディスクの不正な取り出し」が発生現象はなくなりました。
一連の設定で一定間隔にUSB外付けストレージのアクセスランプをチカチカさせることができたでしょうか?mac野郎なのかは、この設定でmacで作業しているのにも関わらず突然「ディスクの不正な取り出し」が発生していた現象は、無くなりました。
今回のこの操作は、読み取り専用コマンドで実現しています。そのため書き込み上限が心配なSSDでも安心して使えます。
対処法は、ここで終了です。ここからは、原因と症状が発生した環境のご紹介です。
自動スリープで「ディスクの不正な取り出し」が発生するのはUSB外付けHDDが原因?
自動スリープで「ディスクの不正な取り出し」が発生するのは、macOSなのか、macOSのUSBドライバなのか、USB外付けHDDなのかどれが原因でしょうか?
macOSは、「可能な場合はハードディスクをスリープさせる」システム環境設定があります。これが原因でしょうか?違いました
可能な場合はハードディスクをスリープさせる
この設定を選択すると、ドライブに対するファイルの読み書きが行われていないときは、ハードドライブのモーターの電源が切られます。ソリッドステートドライブ (SSD) には可動部品がないので、この設定を選択しても、Mac コンピュータで SSD にのみデータを保管している場合は効果がありません。
内蔵または外付けのドライブが SSD ではなく、ハードウェアに継続的にアクセスして読み書きできた方が作業効率が上がる App (プロ向けのオーディオ/ビデオ編集ソフトウェアなど) を使う場合は、このオプションの選択を解除してみてください。
support.apple.com:Mac で省エネルギー設定を使う
- あくまで可能な場合です。
- 内蔵または外付けのドライブが対象です
「可能な場合はハードディスクをスリープさせる」設定はOFFの状態で自動スリープで「ディスクの不正な取り出し」が発生しています。
=>macOSが原因ではなさそう。
macOSのUSBドライバやUSB外付けHDD、どちらかが要因では?と思うのですが、これ以上の追求は難しかったです。
macOSのUSBドライバ説に関しては、apple.com(usサイトのフォーラム)に散見できます、対処方法が無いのでお手上げです。
SSDのクロージャーとしてTranscend StoreJet 25S3を利用しています。こちらのAmazonのレビュー(Transcend StoreJet 25S3 USB3.0 アルミニウム製SSD/HDDケースTS0GSJ25S3のレビュー)の「パワーセーフモード(10分)からの復旧に失敗」の投稿をみて、ピン!?ときました。Transcend StoreJet 25S3のパワーセーブモードが自動スリープの要因!っぽいです
「ディスクの不正な取り出し」が発生する構成と症状
現象が起きているMacの本体は、MacBook Pro Mid2015 2.2GHz Corei7 メモリ16GBモデルです。
外付けストレージは、USB外付けケース(Transcend StoreJet 25S3 USB3.0 アルミニウム製SSD/HDDケースTS0GSJ25S3)とSamsung SSD 500GB 850 EVOの組み合わせです。
500GBのストレージはMacOS拡張(ジャーナリング)フォーマットで利用しています。
MacのオススメエディタのVisual Studio Codeで、上記ボリューム上のプロジェクトを利用しています。
Visual Studio Codeは常時起動状態で、Visual Studio Code上のターミナルなども利用しています。
「ディスクの不正な取り出し」が発生する兆候は?つかめませんでした。
kernel.log(log stream)で発生したタイミングの前に特定のログがあるのかと思いましたが、一切ありませんでした。
(「ディスクの不正な取り出し」が発生後、すぐに自動的にマウントし、アンマウントから回復しているログは確認できます。)
この時、上記ボリュームを開いていたVisual Studio Codeは、入力を一切受け付けない状況です。
以前は、ウィンドウの閉じる(赤い丸)をクリックすると、応答しません、閉じますか?的なメッセージが表示されていました。
最近は、同じことをしても、反応が一切ありません。仕方なく強制終了しています。
Visual Studio Codeは、こういった強制終了でも、編集中の状態は、編集中で復旧できていいです。
あとがき
この記事を書いた2019.8時点では、今回ご紹介したような方法で解決しました。macOS Big Surなど新しいmacOSではフルアクセスコントロールの設定が必要になるかもしれません。
2021年2月時点は、ストレージを新しいHDDケース+SSD2TBの組み合わせに変更しています(詳しくはこちら)。この組み合わせで気がついたのですが、この記事で書いたようなことをしない状態でも自動スリープ「ディスクの不正な取り出し」のパターンは発生していません。ケース選びは慎重に行いました。この成果かもしれません。
macOSもバージョンアップしているため、全く同じ状況での評価とはなりません。もし現時点のmacOS Big Surでも自動スリープ「ディスクの不正な取り出し」 で困っているなら、ケースの変更で直るかも(断定はできませんがmac野郎なのかの環境では発生していませんよ)。
交換して気がついたポイントはもう一つありました。自動スリープ「ディスクの不正な取り出し」現象が発生していたSSD、交換前のベンチマークで数値がとても悪くなっていた【SSDパフォーマンスの低下】(画面ダンプ撮り忘れ、特にランダムWriteが目立っていた)と記憶しています。直接的な因果関係は推測でしかありません。ただ再フォーマットで治ったかもしれないと後で気がつきました(このSSDは現在WIndowsノートで普通に使えています)。自動スリープ「ディスクの不正な取り出し」現象は当時使い始めてから長らく発生していないと記憶しています(若干あやふや、困るような頻度ではないのは確かです)。フォーマットは前後の準備が面倒です。確かな方法ではないので、お勧めする方法ではありません。ただmac野郎なのかとしては、その当時の自分に、「試すべきだ」と言ってやりたいです。
コメントシステムを利用したくない方はお問い合わせからお願いします。
2013.8.19 DISQUS(外部コメントサービス)の利用を開始しました。
Facebook, google, Twitter等のアカウントで投稿可能です。