⚠この記事はブログ移転前のアーカイブです

Macのストレージ問題を解決する方法にSDカードやUSBメモリを利用する事が多いですよね。最近だとMacの筐体から飛び出さないような特殊形状のSDカードもあります。しかし問題点が。SDカードを挿したままMacの蓋を閉じると完全なスリープに移行せず、スリープ状態にも関わらずバッテリーがモリモリ減っていくことがあります。

対策としてTranscendのJetDrive Lite では、JetDrive Toolboxを導入することでスリープ時にSDカードを自動アンマウントするようなパワーセーブ機能があります。通常のSDカードやMicroSDカード使用者は、Jettisonという600円ほどのシェアウェアを使うことで対策ができます。

いやしかし、自力でなんとかならないものか、、、と思って調べたらフリーソフトウェアとシェルスクリプトで上記機能を実現できたので書き残しておきます。

用意するもの

以上です。SleepWatcherはMacのスリープ時と復帰時にトリガーして指定のスクリプトを実行することができるソフトウェアです。ソースも付いてくるみたいです。

インストール

ダウンロードしたファイルを解凍すると以下のファイルが出てくるかと思います。

├── ReadMe.rtf
├── config
│   ├── de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist
│   ├── de.bernhard-baehr.sleepwatcher-20compatibility.plist
│   ├── rc.sleep
│   └── rc.wakeup
├── sleepwatcher
├── sleepwatcher.8
└── sources
    ├── Makefile
    ├── sleepwatcher.c
    └── sleepwatcher.xcodeproj
        ├── bb.pbxuser
        ├── bb.perspectivev3
        └── project.pbxproj

ターミナルを起動して解凍したフォルダに移動しましょう。

ターミナル上で

sudo cp ./sleepwatcher /usr/local/sbin
sudo cp ./sleepwatcher.8 /usr/local/share/man/man8
sudo cp ./config/de.bernhard-baehr.sleepwatcher-20compatibility.plist /Library/LaunchDaemons/de.berhard-baehr.sleepwatcher.plist
sudo cp ./config/rc.* /etc/
sudo mkdir -p /opt/sdsleep
sudo chmod -R 660 /opt/sdsleep
sudo touch /opt/sdsleep/disk
sudo touch /opt/sdsleep/sleep.log

とします。/etc/以下に rc.sleep と rc.wakeup があり、これがsleepwatcherのトリガー時に実行されるスクリプトとなります。

rc.sleepとrc.wakeupの最後の行にそれぞれ・・・

# rc.sleep
# Auto Unmount
volume="SDcard"
path=`diskutil info /Volumes/$volume | awk 'match($0, /\/dev\/disk.*$/) {print substr($0, RSTART, RLENGTH)}'`
disk=`echo $path | awk 'match($0, /disk.*$/) {print substr($0, RSTART, RLENGTH)}'`
touch /opt/sdsleep/disk
echo $disk > /opt/sdsleep/disk
/usr/sbin/diskutil unmount $disk
echo "[`date +%Y%m%d_%H:%M:%S`] Unmounted $path" >> /opt/sdsleep/sleep.log

rc.sleepのvolumeには、いまマウント中のSDカードの名称を入れてください。

# rc.wakeup
# Auto Mount
touch /opt/sdsleep/disk
disk=`cat /opt/sdsleep/disk`
/usr/sbin/diskutil mount /dev/$disk
echo "[`date +%Y%m%d_%H:%M:%S`] Mounted $disk" >> /opt/sdsleep/sleep.log

保存したら、再起動してください。

起動後、しばらくしたらMacの蓋を閉じて、しばらくしたらまた開いてください。/opt/sdsleep/sleep.log にマウントとアンマウントのログが出ていれば成功です。

# /opt/sdsleep/sleep.log
[20170101_12:00:01] Unmounted /dev/disk3s2
[20170101_12:01:01] Mounted disk3s2
[20170101_12:02:01] Unmounted /dev/disk3s2
[20170101_12:03:01] Mounted disk3s2

注意点

  • DropBoxなどのクラウドストレージをSDで同期している場合、DropBox等のエージェントアプリによってSDカードが常にビジー状態になるので自動アンマウントできないことがあります。
  • HDD等の回転体ストレージの場合、スピンアップ時間を考慮して自動マウント時にsleepコマンドで少し時間を開けてからマウントすると良いでしょう。
  • macOS Sierraで確認しています。他のバージョンではわかりません。
  • 普通にSDカード挿すとはみ出るので、Mac Book Pro/Air用MicroSDアダプタを使用するのがおすすめです。
  • 基本的にはSleepWatcherに同梱されているReadMe.rtfを読もう

もう電源に悩まされない。出先に持っていって50%とかだったら絶望するタイプなのでとても精神的に楽になりました。

私はMicroSDをこれに挿して使ってます。

JetDrive LiteってMacの世代によってサイズが異なるんですね。間違って買わないように・・・