JetDrive Lite 360(256GB SD 카드)를 구입해 Dropbox 전용 로컬 저장장치로 사용하려했는데, 문제가 있었다.

  • MacBook Pro가 잠자기에 들어가면 외장 저장장치는 연결이 해제된다(언마운트된다).
  • 잠자기에서 깨어나면 연결이 복구(마운트)될 때까지 Dropbox에서 로컬 경로가 사라졌다고 난리다(연결되도 Dropbox는 인지하지 못한다).
  • JetDrive Lite를 인식하고 나면, Dropbox는 다시 파일을 인덱싱하느라 시간을 잡아 먹는다(테더링이 필요한 순간이면 엄청난 데이터를 소진할 게 뻔하다).
  • JetDrive Lite를 위해 트랜샌드가 만든 애플리케이션이 있지만 OS X의 표준 디렉터리를 따르지 않고 떡하니 /디렉터리 밑에 디렉터리를 만들고 마음대로 쓰고 있어서 마음에 들지 않는다(순전히 내 취향 탓).

이 문제들을 sleepwatcher를 사용해 해결했다.

먼저 brew를 통해 sleepwatcher를 설치하고, OS X이 시작할 때 launchctl데몬이 자동으로 실행하도록 등록해준다.

brew update && brew install sleepwatcher
sudo ln -sfv /usr/local/opt/sleepwatcher/*.plist /Library/LaunchDaemons/
launchctl load /Library/LaunchDaemons/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist

OS X에서 pidof 명령어를 찾아보니 없다. 구글링해서 찾아낸 다음 pidof 셸 스크립트를 작성해서 /usr/local/bin에 넣어두었다.

#!/bin/sh
# /usr/local/bin/pidof
ps axc|awk "{if (\$5==\"$1\") print \$1}";

pidof 파일 퍼미션을 변경한다.

chmod a+x /usr/local/bin/pidof

JetDrive를 SD 카드 슬롯에 꽂고, diskutil list 명령으로 디바이스 파일 이름을 확인해둔다(MacBook/MacBookPro라면 보통 /dev/disk2가 JetDrive 드라이브에 할당된 이름이다).

diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +499.0 GB   disk1
                                 Logical Volume on disk0s2
                                 A96CA842-418C-4D7A-A27E-6B7CD9A89BFC
                                 Unencrypted
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *259.7 GB   disk2
   1:                  Apple_HFS Jetdrive                259.7 GB   disk2s1

잠자기에 들어갈 때 sleepwatcher가 실행할 ~/.sleep셸 스크립트를 작성한다: Dropbox가 실행 중이면 자동으로 종료하고 상태를 기록해둔 다음, JetDrive를 언마운트한다.

#!/bin/sh

DROPBOX=$(/usr/local/bin/pidof Dropbox)

if [ "$DROPBOX" != "" ]; then
        osascript -e 'tell application "Dropbox" to quit'
        touch /tmp/dropbox
        echo "off" > /tmp/dropbox
fi

diskutil unmountDisk /dev/disk2 > /dev/null 2>&1

이제, 깨어날 때 sleepwatcher가 실행해주는 셸 스크립트인 ~/.wakeup을 작성한다.

#!/bin/sh

diskutil mount /dev/disk2s1 > /dev/null 2>&1

DROPBOX=$(cat /tmp/dropbox)
if [ "$DROPBOX" == "off" ]; then
        osascript -e 'tell application "Dropbox" to launch'
        rm /tmp/dropbox
fi

셸 스크립트들 퍼미션은 700(rwx------)을 주었다. 테스트해보니 잘 된다. 이것으로 엇그제부터 골머리 앓던 문제를 해결했다.

UPDATE(Mar 6, 2015)

  • 뚜껑을 덮지 않은 상태에서 잠자기에 들어가니 스크립트가 동작하지 않았다. Mac용 안티바이러스 애플리케이션을 사용 중인데, JetDrive를 통째로 Exclusions 목록에 집어넣어두니 스크립트가 동작한다.
  • /Library/LaunchDaemons//Library/LaunchAgents/, ~/Library/LaunchAgents/,/Library/PrivilegedHelperTools/에서 지금은 사용하지 않는 애플리케이션과 연결된 파일들을 모두 제거했다(Mac에서 애플리케이션을 제거하려면 그냥 삭제하면 된다고 보통 알고 있지만, 여전히 찌꺼기 파일들이 남을 수 있다).