水深1024m

技術的なメモとか日記的なもの

dd と僕

自分のメインマシンこと MacBook ProSSDUbuntu インストールディスクを dd して破壊した。

正直書くのも憚られる話で、お前来年から本当に職業エンジニアになれんのって話なのだけど、
本当にクリティカルな状況下でやらかさないよう戒めとしてまとめることにした。
びっくりするほどレベルの低い話。

修士論文の提出も終わり、さてやっと研究室のサーバ環境を更新できるぜぐへへ、
とか思いながらとりあえず転がっていた HP MicroServer に Ubuntu を入れ、
作業用ストレージにしようとしていた。
自宅でも MicroServer を使っていたのでさくさくっと HDD を突っ込み、MicroServer には光学メディアドライブがないので USB メモリからインストールしようといつものようにインストールイメージをダウンロード。
光学メディアのないマシンにインストールを行う方法で代表的なものは、USB メモリ経由で行う方法か PXE ブートだろう。
以前作ってコメントアウト一行の解除で有効化できるようにしてあった PXE + TFTP 環境を使っていれば惨事は防げたと思う。
しかし僕は MBP に USB メモリを差し込み、いつものように dd で書き込みを行った。
行なってしまった。しかも sudo で。

一応それなりのサイズだし、USB2.0 経由なので書き込みにある程度時間がかかるはず。
だが実行のち、プロンプトが一瞬で戻ってきた。
「うおーずいぶん早いな、こんなもんだったっけ」とか思いつつ、ホームディレクトリに戻ろうと cd を入力してリターンキーを押す。
その瞬間ターミナルがグリッチした。
正確には、プロンプトの中にテキストカーソルがめり込んだ。
しかもリターンキーを叩くたびにめり込む箇所が変わる。なんだこれは。
えっ、と思いながら ls してみると、そこに表示されるリストの日本語は全て化け、サイズ表示さえもおかしなことになった。
はー、何かの拍子で LANG か文字コードが変わったりした?でもそんなことは一切してない、と思いながら echo $LANG したが、返ってくるのは ja_JP.UTF-8 という表示。
正直に言うと、最初にターミナルがグリッチした瞬間、自分が何をやったのか直感的には理解していたと思う。信じたくなかったけど。

もうこの段階で、ターミナルに残っていたコマンド履歴を見て、自分がしでかしたことを把握していた。既にパニック状態。
全てのアプリケーションはディスクアクセスした瞬間にクラッシュする。Chrome のタブさえ開けない。
システム領域はたぶんがっつり上書きされていて、メモリに乗っている部分だけが生きている状態なんだろうなと思った。
唯一使えたのは、起動したままのターミナルと夜フクロウくらいだった。
そのメモリ上の夜フクロウから最後に書き込んだのが下記。この投稿直後に夜フクロウもクラッシュした。

凄まじいやらかしどころではなく、既に勝負はついていた。
ターミナルは生きているからまだファイルを移すことくらいはできるのでは、と思い
scp を試したら、最初の1ファイルが転送できたので少しテンションが上がった。
しかし次の瞬間に OS がフリーズした。
決着はついた。僕にできることはマシンの電源を切り、再び投入し、リンゴマークの後に表示される駐車禁止みたいなマークを眺めるだけだった。
その時の僕の様子は下記の tweet に詳しく記載されている。

その日はもう何もできなかった。
小一時間ほど "どうしようBot" と化したあと、研究室の納会があったため偉大な先生方の前で先ほどの事象を報告し、「えっ論文のファイルは???」「論文本体は無事なんですがソースコードが…」みたいなやり取りをして、酒を飲みまくって寝た。

家に帰ってきて一応 Time Machine の日付を見たが、最後のバックアップは8月であった。
(家では基本的に MBP を断続的にしか使わないこともあり、中断されることが多かった)
その後しばらくの間はこの MBP について何かやる気が全く起きず、データ救出を試みたのは数日後。
とりあえず開腹して SSD を取り出し、testdisk をかける。
Deeper Search で複数パーティションが検出され、おおおーとテンションが上がったのもつかの間、
それは Lion がインストール時に作成する非常用ブートパーティションの残骸であった。
既に何をする気力も残っていないので、そのまま放置して、時間ができたら mountain lion でも入れなおすかーということになった。

事態が動いたのは最近。やっと OS を入れなおすくらいに気分が回復し、
mountain lion をダウンロードしてインストールをはじめる。
ここであることに気づいた。

「インストール時と全く同じセクタ、同じサイズでクイックフォーマットしてインストールすれば、インストール後に削除ファイル回復系のツールで取り出せるのでは???????」

全く大したことではないのだがそれなりに現実味があることもあり、久々にテンションが上がった。
はやる気持ちで OS をインストールし、PhotoRec をかけてみる。
ものすごい勢いでファイルがヒットしまくる。
ここまでくるとテンションは上がりっぱなしで、7割くらい理由不明な勝利の予感を感じていた。
対象ファイル数が膨大なだけに、探すのには骨が折れそう(PhotoRec ではファイルツリーやファイル名までは再現されない)だが、この中に修士課程を共に過ごしたファイルがあるというだけで元気が出る。

一日くらいかけてサーチが完了した。数万件のファイルがヒットして復元されている。
最初のディレクトリを探す。うーんアプリケーション関連のファイルしかなさそうだ。しかし Omnigraffle の内部ファイルっぽいものなど、かつて自分が使っていた環境にあったものがそこにはあり、この調子なら自分のユーザディレクトリ下にあったファイルが見つかるのも時間の問題だろう。
どうやれば早いかな、plist ファイルとか結構あるけど捜索対象ではないし消してしまうか、日本語を含むファイル探せば早いかな、etc....


自分でホームディレクトリに FileVault (暗号化) をかけていてどう頑張っても復旧が無理ということに気づくまで、そう時間はかからなかった。


かくして、僕の MBP は修士課程2年間を共に戦った頃の記憶を全て失い転生した。
dd するときは指差し確認。人間はミスをせずにはいられない生き物ですね。
おしまい。


追記
この話を大学関係のちょっとアレな友人たちとしていたところ、
犯罪者っぽいTシャツを作ってくれた。いい友人に囲まれて幸せです。
http://clubt.jp/product/249779.html
大事なオペレーションをする日にはこのTシャツを着ようと思う。

追記2
ブックマークコメントで「バックアップ取ってないのがそもそもの問題」というご指摘を多数いただきました。
全くもってその通りなのですが、被害状況についてちょっと盛っちゃった感があるので追記しておきます。
実際のところ、本文にもありますが"8月までは TimeMachine でバックアップが取れていた"という状態で、
2年間のうち半分以上くらいは救い出せそうな気配です。(実際のところこれから先使うファイルが無さそうなのでリストアしてませんが、モノ自体はそれなりに堅牢なストレージにあります)
自宅外で使うことがほとんどで、自宅でもバックアップが完了する前に出かけてしまうことが多々あったので
クラウドストレージにでも突っ込んでおくべきでしたね。反省。
他にも、プレゼンに使うファイルだとか、そういうものは別なサーバに移してあったりもするので
被害数としては正直そんなに多くないかもなーと思っています。むしろ"やっちまった"ことへの精神的なダメージが。
お仕事として触るものは当然2重3重4重くらいまでバックアップは考えるもので、
心配性なので(説得力0だけど)管理していたサーバのバックアップ状況とかをモニタしたりしているものですが、
自分の環境となるとまーそんなに大したものないしなーと思ってしまう節がありました。失ってから気づくパターンですね。

論文そのものはもちろん git で自分のローカル以外の場所で管理していたので被害はなく、
実験しながら書き換えていたソースコードとか置いていたデータに被害がという感じでした。
まあ、バックアップは取れていて大前提ということは間違いないですね。
ということで、追記でした。ふげー。

「セキュリティとトレードオフ」について思うこと

「セキュリティと利便性はトレードオフだ」って半分本当で半分ウソだと思う。
少なくともセキュリティ技術を学ぶ上で教わるべき話じゃない。
エンジニアとしてセキュリティに携わるなら、はじめからこっちを立てればあっちが立たないという思考をしちゃいけなくて、
本当に必要なセキュリティレベルを考えながら限界まで利便性を向上させようとするのが正しい考え方じゃないのかな。そういった手段がないなら作るっていうことも当然選択肢には入る。トレードオフ思考が先頭に来てると、いつの間にか内部でコンセンサスをとったり、実装したり、監査したり、そういったコストばかりとのバランスを考えてしまう気がする。
「本当に必要なセキュリティレベルを考え」っていうのが実は一番難しいところだと思うけど。

たまにセキュリティに関わってる人で「僕らの仕事は足を引っ張ること」みたいなギャグみたいなこと言う人いるんだけど絶対違うよね。
適切なセキュリティレベルが保たれていて、必要に応じてちゃんとアクセスできるっていうのは、
情報を預ける側からすれば安心できるのはきっとそうだと思うんだけど、同時にそれを扱う側も安心して扱えるってことだと思う。
例えば顧客情報が流出したとして、「少なくとも内部から持ちだされたものじゃない」みたいなことが
すぐに明確に分かることって、扱う側からすると(もちろん外部からだからオッケーみたいな話じゃなく)「自分はやってない!」っていう悪魔の証明みたいなことしなくて済むからそれなりに安心できるはず。
もちろん扱う側の意識とか知識もとても重要だと思う。だから、そこも含めて。
難しいと思うけどやりがいはすごく感じる。

足を引っ張るんじゃなくて、むしろ僕らが見てるから、できることは安心してなんでもやっていいよ、って後押しするくらいの仕事がしたいよね、という話です。

VMware Fusion 上の VM を GUI 無しで走らせる

高校時代とか大学1,2年の頃はパソコンとか持ってるだけで楽しいというか、
物理マシンを触れるだけで満足していて、一時期は家にマシンが5台くらいあったんだけど、
趣味が一回りしたのか、最近はできるだけ環境を小さくしようとする傾向にある。
Windows のゲームはほとんどやらないからでかいマシンは従兄弟にあげた。

で、自宅の電気代の1.5割くらいは食べているであろうサーバを VM に移したくなった。
主に仕事でプロトコルレベルでデバッグしたい時に相手先として使ったり、かなり昔にホストしていた Web サイトなんかがある程度で、もう物理マシンで動かしている意味があまり無い。
家には Mac mini があって常時稼動しているのでここで VM 化してしまってサーバに使っている
マシンを止めて部屋の温度を下げようと思った。

長々と書いておいてやっと本題だけど、Mac の仮想化環境としては基本的に VMware Fusion を使っている。
インストールおわったらコンソールとかいらないんだけど、Fusion ではウィンドウ消しておくとかいうことができないので普段使うときに鬱陶しい。
バックグラウンド的に、というかウィンドウ無しで動かす方法ないかなーと思ってたら headless mode っていうのがあるらしい。
http://macosx.seesaa.net/article/115038173.html
http://www.fierycode.com/mac-osx-lion-vmware-ubuntu-server

vmrun というコマンドラインツールを使う。

/Library/Application\ Support/VMware\ Fusion/vmrun -T fusion start [vmx のパス] nogui

こんな感じで起動すると確かに vmware-vmx が走ってマシンが起動した。
ただ、すでに Fusion が起動した状態で走らせると Fusion 上では起動状態にならず、
その状態で選択すると Fusion が落ちる。どうやら vmrun との間で同期とかはとってないっぽい。
ちなみにその状態で再度 Fusion を起動すると再度ウィンドウが上がってしまって逆戻りする。

というわけで、起動する前に Fusion からこの VM の登録を削除(ファイルは残す)してやった状態で起動すると、Fusion 上には表示されないが裏では VM が走っている状態になった。良い。

暇をみて設定を移行してサーバマシンはシャットダウンしようと思う。おしまい。