起動しなくなったMacからネットワーク経由でデータをサルベージする

morimorihogeです。早くも夏バテっぽいです。

昨日自宅でニコニコ動画を視聴するのに使っているiMacの調子が突如悪くなり、再インストールを迫られる自体になったので対処方法を記録しておきます。
ちなみに今回の対象機種はiMac Late 2012で、プリインストールOSはMountain Lion時代のものです。

再インストールの前に試すべきこと

再インストールは面倒な作業なので、なるべくやりたくないものです。
また、データが破損しただけだと思ったら実はハードウェア的にディスクが破損していて、再インストールしたけど結局無駄だったとか、実は悪いのはHDDじゃなくてメモリのエラーだった、なんていうことにもなりかねないので、まずは情報収集が大事です。

今回僕のiMacで出ていた症状は以下の通りでした。

  • 何か操作をする度に数分間レインボーカーソルが周り続け、ほとんど使い物にならない状態
  • マウスカーソルは正常に動く(完全にフリーズはしていない)
  • 再起動しても症状は変わらず

このような状態になったとき、まず最初に疑うのはディスク上のデータが論理的に破損しているケースになります。
今回はディスクから起動しているOSが既に不安定になってしまっているので、OS X復元モード(電源ON時にCommand + R)で起動します。

参考:OS X のキーボードショートカット

復元モードで起動したら「ディスクユーティリティ」を起動し、対象ディスクの「Repair Disk(ディスクの修復)」を実行します。
(Verify Disk(ディスクの検証)は自動的に修復前に実行されます)

Screen Shot 2014-07-09 at 12.10.55

停電などで電源が落ちたり、たまにkernel panicになって強制再起動などをしていた場合、ここで修復できる可能性があります。
また、色々なソフトをインストールしている場合「Repair Disk Permissions(アクセス権の修復)」も実行することで、挙動が改善される可能性があります。

というわけで、いつもは前述のディスク修復で問題無く調子が戻るのですが、今回は珍しく、修復に失敗してしまいました。

Screen Shot 2014-07-09 at 12.15.50

これはもうアカンやつや・・・ということで、この状態になるとOSがブートしなくなります(あちゃー。

ディスク以外の部分が影響している可能性も考え、念のためApple Hardware Test(電源ON時にDキー)を起動し、フルテストを走らせてみましたが、H/Wレベルでは異常はありませんでした。
これでほぼ確実にディスクが(論理的に)お亡くなりになってしまったことが窺えます。

参考:OS X Mountain Lion: 「Apple Diagnostics」または「Apple Hardware Test」を使用する

通常のデータサルベージ方法

OSが起動しない状態でのデータの吸い出しですが、通常はTarget Disk Mode(電源起動時にTキー)という、Mac本体を外付けディスクとして使えるモードを使うのが良いですが、最近のiMacにはFirewireコネクタが無いため、Thunderbolt経由になります。

参考:OS X Mountain Lion: ターゲット・ディスク・モードを使って 2 つのコンピュータ間でファイルを転送する

しかし、Thunderboltケーブルが手元に無い場合、バックアップ機と接続する手段が無くなってしまいました。

ネットワーク経由でデータをサルベージする

というわけで、ここからが本題になります。
OSは起動しない、Target Disk Modeも物理的に使えないという状況ですが、ネットワークは繋がっていますので、ネットワーク経由からデータを取り出してみます。
(必要なもの:ネットワーク上にsshサーバが起動しているLinux/Macホスト)

まず、復元モードで起動後、ユーティリティメニューからターミナルを起動します。

Screen Shot 2014-07-09 at 12.25.53

その後、シェルから「df」コマンドを実行し、/Volumes以下に「Macintosh HD」がマウントされていることを確認します。
この時点でMacintosh HDがマウントできていない場合、ファイルシステムレベルで壊れてしまっているのでもう諦める(もしくは市販のデータ復旧ソフトやデータ復元屋に委託する)しかないですが、見えている場合はデータを取り出せる可能性が出てきます。
システムディレクトリはともかくホームディレクトリの中身だけでも復旧してみましょう。

「/Volumes/Macintosh HD」以下が通常のOS X起動時のルートディレクトリになっているので、ユーザのホームディレクトリは「/Volumes/Macintosh HD/Users/#{ユーザ名}」になっています。
というわけで、以下のコマンドを使うことでホームディレクトリ内のデータを別のLinux/MacホストにSSH経由でコピーできます(ここではmorimoriユーザ)。
backup_serverはバックアップ先サーバのIPアドレスやホスト名、sshコマンド引数の/mnt/backup_directoryはバックアップ先サーバ上でファイルをコピーする先のディレクトリに置き換えて下さい。

$ cd /Volumes/Macintosh\ HD/Users/morimori
$ tar cvf . -|ssh morimori@backup_server "cd /mnt/backup_directory;tar xf -"

これで、tarコマンドで固めた内容をsshを通して別サーバ上で再度展開することができます。標準出力・標準入力を介して処理するため、一時ファイルのための領域は必要ありません。
ちなみに、rsyncは復元モードではコマンドが入っておらず、HDD上のプログラムはリンクしているdyldが見つからずに起動できません。また、scpでも良いですが、scpは小さなファイルが沢山ある場合、毎回sshコネクションを張り直す分遅いです。

また、転送するファイルが多い場合、転送中にMac側がsleepしてしまい、転送が止まってしまうことがありますが、これはもう一つターミナルのタブを開いて、

$ pmset sleep 0
$ pmset displaysleep 0
$ pmset disksleep 0

というコマンドを実行しておけばスリープを抑止することができます。sleepの設定だけで問題ないはずですが、displayが消えているとちゃんと動いているのか不安になるのでここではdisplay、diskもスリープしない設定にしました。

まとめ

そんなわけで、OSが起動できなくなったけどかろうじてディスクのmountはできる程度の壊れかたをしているMacからデータをサルベージできました。
ただ、これは苦し紛れな方法なので、本来ならTimeMachineなどで普段からバックアップしておくのが賢いです(今回のマシンは遊び端末なのでバックアップしてなかった)。
また、FileVaultが有効になっている場合だめかも。Recovery Keyがあれば復旧する方法はあるかもしれませんが、もっと面倒になることは間違いなさそうです。

なんにせよ、普段からバックアップはしておこうという教訓でした。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

morimorihoge

高校卒業後,学生をやりながらずっとWebアプリ開発に携わってきました.2010くらいまではPHP/Symfonyプログラマでしたが,それ以降のWeb開発はRailsほぼ一本に宗旨替えしました.開発とは別にサーバ構築・運用も10年以上やってきているので,要件定義から設計・実装・環境構築・運用まで一通り何でもこなせます.開発以外では季節により大学でWebサービス開発やプログラミング関連の非常勤講師もしており,技術の啓蒙・教育にも積極的に関わっています.最近はPM的な仕事が増えていますが,現役開発者としていつでも動ける程度にはコードもサーバも弄る日々を送っています.AWS 認定ソリューションアーキテクト – アソシエイトレベル取りました

morimorihogeの書いた記事

開発
RubyのArray(配列)の使い方

2017年03月15日

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ