OSXシングルユーザーモードでUSBメモリをマウントする
@daichirata会社のiMacをYosemiteにアップデートした際に、徳が足りず何かが色々とうまく行かなかったせいでOSが起動しなくなってしまった。PRAMやSMCのクリアでもどうにもならず(そもそもリセットで何とかなった試しは無いが)、半ば諦めつつシングルユーザーモードで起動した所ログイン出来たのでUSBメモリをマウントしてデータを復旧した。
シングルユーザーモードで起動する方法は、
- Macの電源を落とす
- 電源を入れた直後に、「command + s」を押す
この際に、私の環境ではiPhoneとか周辺機器をつないでいる場合シングルユーザーモードが起動せずハマったので気をつけた方がいい。PRAMをリセットするとスピーカー音量もクリアされてしまうのでひたすら起動音をオフィスに流すことになる。PRAMはリセットしないほうがいいと思う。それか最後の手段に取っておくべきだ。
USBメモリのマウント
シングルユーザーモードでログインした場合ルートデバイスがReadOnlyでマウントされている。ログインした際のコンソールの最後にも出力されているが、
mount –uw /
コマンドを実行することで書き込みが出来るようになるので色々と試行錯誤したい場合は実行しておく。ログインした際の出力には他にもfsckとか有用な事が書かれているしOSXのバージョンによっても微妙に更新されているようなのでしっかりと読んでおいたほうが良い。
肝心のUSBメモリだが、シングルユーザーモードではデーモンが起動しないためUSBメモリをつないでも自動的にマウントされて書き込めるなんてことは無い。なので自分でマウントあるいはフォーマットからやる必要がある。USBメモリ以外の外部のストレージを繋いでいない場合、disk1s2
というデバイスとしてos側から見えるのでそのデバイスをマウントしてあげよう。
まずUSBメモリが何のファイルシステムでフォーマットされているかを確認する。
fstyp /dev/disk1s2
ntfsとかhfsと出力されるはずなので、次はマウント用のディレクトリを作成する。
midir -p /tmp/mnt/drive2
最後に、先程のファイルシステムに合わせてマウントする。
mount –t hfs /dev/disk1s2 /tmp/mnt/drive2
後はデータをマウントしたディレクトリに移動してサルベージしてあげよう。
余談
ちなみに、USBメモリを使わずともSambaとかnfsとかのネットワークストレージに接続するとか、そもそもログインできてるならscpとかで他のマシンに転送すればいいかと最初は思っていたが上で書いたようにデーモンが起動しないためネットワーク周りの機能が使えないのでダメだった。(/etc/rc.d以下の起動スクリプトを手動で実行すれば行けるみたいだが徳が足りないのかうまく行かなかった。)
これを機にOSXのある程度の環境構築を自動化したのでその知見はそのうち書きたい。特に、defaults周りはあまりまとまった情報が無いので積極的に公開していくことで皆から知見を分けてもらいつつ徳を積みたい。