2022/05/10

空き容量ゼロになったiPhoneのリンゴループ状態を無理やり復活させた

ブログなんて書くのは何年振りだろうと思いつつ、備忘録として超久々に記事を起こしてみる。

家族のうち一人はスクショ魔なのだが、結果iPhone本体の空き容量不足になってiPhoneを正常に動作しなくさせてしまうことが1年に何度か起こる。

たいていの場合はホーム画面のアプリアイコンが一部正常に表示されなくなり、慌てていろんなデータを消して事なきを得るのだが、今回はどうやらiPhoneの空き容量警告が出ても「あとでちょっと消そう」と削除を後回しにして写真やスクショを撮り続けてしまい、とどめを刺してしまったらしい

思い返すと前回(2022年2月下旬)も同じように容量枯渇事案を発生させており、その時は本当にリンゴループになってしまった。

ググった結果

  • リカバリーモードに突入する
  • iTunesとiPhoneをLightningケーブルで接続する
  • iTunesから「アップデート」を実行する
    • 失敗したら再び最初から
  • アップデートが完了したら、iPhoneがデータの回復を試行するので気長に待つ
  • うまくいけば万歳

という技を見つけ、当時は何とか写真もLINEも無事データを回復させることができた。

参考:【長文】容量オーバーによるリンゴループからのリカバリーループになったiphoneが奇跡的にデータそのままで復活した話 - 色々情報サイト

そして2022年2月の事案以後、口を酸っぱくして「データを消せ、常に空き容量は総容量の1割である25GBを維持しろ、フラッシュメモリを痛めるのでiPhone自体が壊れるぞ」と何度も脅していたのだが……

喉元過ぎれば熱さを忘れるとは言ったもの、結局元の木阿弥で3か月足らずで再びiPhoneの空き容量を枯渇させてしまったのだ。

症状としては前回と同じように

  • ホームボタンのアイコンが一部消えている
  • 写真の削除を実行しても写真が消えない

と、いかにもダメな感じ満点。

今回も、

  • iPhoneのバックアップはiCloudがいっぱいなので取れていない
  • LINEのトーク履歴データも同様にバックアップは取れていない
  • でもLINEのデータは絶対に失いたくない 
  • 写真のデータはGoogleフォトにある程度バックアップされているはずだが、できれば消さないでほしい

とのリクエストだ。無茶言うな。

さすがに空き容量を少しでも確保しないことには何も作業を進められないので、最後の1点はデータ救出とGoogleフォトへの保存(これによりiPhone本体にデータがなくても参照できる)を行うことを条件に諦めてもらい、iPhone上からのデータ削除には同意してもらった。

ただ、今回は絶望的なことに、空き容量が本当にないのだ。ゼロなのだ。 

とりあえずOSが生きているうちにフルバックアップを取るのが定石だろうと思ってLightningケーブルをiPhoneに刺したところ……
本当に空き容量が無かったからなのだろうか、ケーブルをつないだ瞬間画面が真っ暗になり、真ん中に小さく回転する読み込みマークが表示されてしまった。

「SpringBoardが落ちたときと一緒だ」と一瞬で感じてしまった。
脱獄犯だったからこそわかるこの感触。。。

ホーム画面がクラッシュして、真ん中に小さく回転する読み込みマークが表示され、iOSが再起動し、リンゴマークが表示された後再び起動するがまたロックを解除するとホーム画面が落ちる、の繰り返し。

試しにリカバリーモードに突入してiTunesから「アップデート」を実行してみたが、アップデート作業は一向に進まずiPhoneはホッカイロよりも熱くなってしまった。

嫌な予感がしたのでケーブルを引き抜き無理やりアップデートを中止してiPhoneを強制再起動。

その後iPhoneはリカバリーモードのままで、改めてPCとiPhoneを接続したところ、 iTunesからは「このiPhoneは復元する必要があります」的なメッセージを告げられる。実質的な死亡宣告だ。

さすがに「はいそうですか、データには死んでもらいます」とは言えないので、何とか模索することとしたい。

まずはリカバリーモードから抜けて、ひとまず一瞬ホーム画面が表示される状態まで戻って作戦を立て直したい。

リカバリーモードに一度入ってしまうと基本的には復活できないので、サードパーティーのソフト(今回は「Tenorshare ReiBoot」にした)を使ってリカバリーモードを解除した。

そのうえで再び電源を入れると、ロック画面が表示され、パスコードを入力するとホーム画面が落ちて、リンゴマークが表示された後再び起動する、を繰り返すようになった。

SpringBoardが一度起動するのが不幸中の幸いで、PCにつないでいると、iPhoneが再起動してロックを解除した瞬間にデバイスの認識音が鳴ってInternal Storageとして1~2分ほど認識されていた。

この間に何らかの手法を使って本体から写真データだけでも救い出し、空き容量を少しずつ開けることで、iPhoneフルバックアップ取得を目指すことにした。

脱獄犯愛用のiFunBoxがこんなところで役立つとは思わなかったが、以下のような手順を踏んで空き容量も確保し、バックアップ取得と初期化、バックアップからの復旧を終えてiPhoneのデータ喪失を伴わず(厳密にいえばすでにバックアップ済みの写真はiPhone上から消しているが)復活させることができた。

  1. あらかじめiTunesを終了し、iFunBoxを起動しておく
  2. iPhoneを起動し、ロックを解除
  3. 画面が真っ暗になったので、すぐにLightningケーブルを使ってiPhoneとPCを接続
  4. iFunBoxがiPhoneを認識したら、「ツールボックス」→「システムユーザーファイル」に進み、 [User File]\DCIM を開く。
  5. DCIMフォルダの中にある写真データ(=カメラロール内の写真)を少しずつPCにコピー。
    (すでにコピー済みのデータがあることが確信できていれば、別にコピーせずともよい)
    自分の場合は一度に300枚くらいが限界だった。
  6. 途中でiOSが死んで接続が切れるので、Lightningケーブルを抜き、2.に戻る。
  7. 写真データのコピーが終わったら or 諦めたら、次に写真データを消していく。
    2.~4.までは同じ。そして、DCIMフォルダ内の「123APPLE」のような3桁数字+APPLE/SYNCD/IMPRTなどの文字列で構成されるフォルダを順々に消していく。
    • おススメはデータの古い順、つまりDCIMフォルダ内のサブフォルダの連番が若いフォルダから順々に一つ一つ消していくことだ。
    • iPhone上に残しておいてもいい直近の写真データがあるならば、頭の数字が大きい「nnnAPPLE」フォルダを1つか2つくらい残しておいてもいい。
  8. 削除中にiOSが死んだら、Lightningケーブルを抜き、7.の作業を続ける。
    ちなみにだいたい50GB分くらいのデータを消した後は、iPhoneがクラッシュしなくなった。
    • 今回はiPhoneがクラッシュしなくなったタイミングで、Googleフォトアプリを起動して、Googleフォトに未バックアップだった写真もアップロードした。
    • この手の復旧作業は3度目なのだが、もう「二度とやりたくない」のでGoogleフォトにバックアップ後は直近2週間分(それでも写真は4,000枚弱ある)の写真データだけ残して、あとはすべて強制削除を執行した。
  9. 写真の削除が終わったら、iFunBoxを使って [User File]\PhotoData\photos.sqlite もPCに念のためコピーしておく。photos.sqlite-shmとphotos.sqlite-walは残しておく(とりあえず残しておいても動作に影響は出なさそうだった。)。
    • DCIMフォルダ内のデータを直接削除したため、写真アプリのデータベースに不整合が発生してしまう。これを解消するために、データベースファイルを削除する。
      削除操作を行わないと、写真アプリの挙動が不安定になったり、存在しない写真が写真アプリ上に表示されて項目自体を削除することができなくなったりするおそれがある。
  10. 9.でPCにコピーしたphotos.sqliteを削除する。
    • この後、作業が終わるまでiPhone上のカメラアプリや写真アプリは起動しないこと。
  11. iTunesを使ってフルバックアップを取る。
  12. iPhoneを「復元」して初期化する。
  13. 復元完了後、11.で取得したバックアップを復元する。
  14. 写真アプリを起動し、そのまま待つ。photos.sqliteが再構築され、徐々にカメラロール内の件数が増えていくはず。

以上で、iPhoneの完全初期化によるデータ喪失を伴わず、リンゴループ状態(とほぼ同様)の容量不足になったiPhoneを復活させることができた。

本件事案の張本人としてはLINEのデータが一番大事らしく、それを消さずに済むことができてよかったらしい。

お礼としてコロットのラップドクレープ2個(カスタードといちご味)をもらった。

なんとも破格な技術料だ。

ちなみに世の中のiPhone復旧データ業者のホームページを見ると、システム障害の場合は6万円くらいかかるケースもあるらしい。

今回のように自己修復できたのでラッキーだったが、一番はこういう事態に陥らないこと。

こまめにバックアップを取り、空き容量は総容量の1割を下回らないよう常に気を付ける。これが鉄則だと思う。

……さすがに今回は170GBくらいの空き容量を用意したから、きっと来年くらいまでは持ちこたえてくれると思いたい。

2020/09/05

Hyper-V上で動くUbuntu 20.04LTSで拡張セッションを使うには

2年半ぶりの更新です。

いろいろと技術ネタを書こうと思いつつ,仕事に気力を奪われ更新する余裕もなく。

というわけで,今回はHyper-V上で動くUbuntu20.04LTSで拡張セッションを使うための方法を,備忘録がてらまとめます。

ちなみに試した限り,XubuntuなどのUbuntu派生ディストリビューションではうまく動きませんでした。

用意するもの

  • Windows 10 Proが入ったPC
    • Hyper-Vが有効化されている前提
  • 十分なメモリ
  • 十分な記憶領域(SSDがおすすめ)
  • Ubuntu 20.04 LTS の 64bit版インストールISOイメージ
  • インターネット接続
  • やる気
  • 時間(30分くらい)

手順

  1.  Hyper-Vマネージャーを開き,右側の「操作」ペインから「新規」をクリックした後,「仮想マシン」を選んで仮想マシンを新規作成します。
    「クイック作成」は試していないけど,うまく動かない気がするのでやめておいたほうが無難。
  2. ウィザード画面が出てくるので,まずは次へ。
  3. 適当にいい感じの名前を付けましょう。
    お好みで「別の場所に格納する」を選んでもいいです。これを選ぶとVirtual Machineフォルダにぐちゃぐちゃに放り込まれることが防げます(と思っている)。
  4. 仮想マシンの世代を選びます。BIOSベースかEFIベースか,ですね。
    どっちを選んでも正直良いんですが,物理の光学ドライブをVMから触れるようにしたかったら第1世代にする必要があります。
    今回は別に光学ドライブにアクセスできる必要もないので,第2世代をチョイス。
  5.  割り当てるメモリ量を指定します。
    最初は1024MBが指定されていますが,4GBくらいは割り当ててあげたほうが快適に動作するように思います。メモリが余っていれば8GB割り当ててもよし。
  6. ネットワークの設定をします。
    仮想マシンがインターネットにつながるよう,適切なネットワークアダプタを選んでください。
    仮想スイッチを自分で作っているならお好みのスイッチを選びましょう。
    よくわかんない場合はとりあえずDefault Switchを選んでおけばよし。
  7. 仮想ハードディスクを作ります。
    お好みではありますが,とりあえず動かすだけなら64GBもあれば十分。
    仮想ハードディスクなんてOSを動かすためのもので,大事なファイルなんて保存しませんもんね?
    (ファイルを保存したければクラウドなりNASにでも突っ込むのがベターだと個人的には思います)
  8. 最後に,インストールメディアを指定します。
    「参照」ボタンを押して,あらかじめ用意されているUbuntu 20.04のインストールISOイメージを選びます。
  9. 「完了」ボタンを押してウィザードを終了します。
  10. Hyper-V マネージャに戻ったら,今しがた作成した仮想マシンを選んで右クリックし,「設定」を選びます。
  11. セキュアブートの設定を変えないと,起動しません。
    テンプレートのプルダウンを押して,「Microsoft UEFI 証明機関」を選びます。
    面倒だったらセキュアブートを無効にしてもよいです(ただし,起動時にVM上のUEFIが赤い警告表示を出してきます。)。
  12. 統合サービスのうち,「ゲストサービス」もせっかくなので有効にしておきます。
  13. もしほかにも変えたい設定があれば,この時に変えておくとよいです。
    私は動的メモリの設定やプロセッサの数,チェックポイント(VMWare Workstationで言うところのスナップショット)の作成関係あたりを変更しました。
    特に,「自動チェックポイントを使用する」が有効になっていると,ことあるごとにチェックポイントが作成されてしまい,ホスト側のディスク領域が圧迫されます。
    そのほか,ホスト側をシャットダウンしたりVMを一時停止するときにメモリの情報を書き込む先であるスマートページングファイルの場所を変更しておくのもいいでしょう。あっという間にSSDの寿命が削られそうなので,今回はスマートページングファイルの保存場所をSSDではなくHDDにしています。


  14. 設定ができましたので,「OK」を押して設定画面を閉じます。
  15. Hyper-Vマネージャから作成したVMを選択して,起動します。
  16. Ubuntuが起動したら,インストールしましょう。
    左側の言語一覧から一番下にある「日本語」を選んで,「Ubuntuをインストール」を押します。
  17. キーボード設定をします。基本的にはデフォルトのままで特にいじらず次に進んでOK。
    英字キーボードを使ってる人とかはいい感じの設定を選んでください。
  18. インストールのオプションが設定できます。
    この辺りは用途に合わせてお好みで。
  19. インストール先を選びます。
    「ディスクを削除してUbuntuをインストール」を選択でOK。「インストール」を押します。
  20. ディスクの変更について警告が出たら,「続ける」を押して次に進みます。
    出来立てほやほやの仮想ハードディスクなので,書き込まれて困るものなんぞ何もない。
  21. タイムゾーンを選びます。
    「どこに住んでいますか?」と聞かれた道府県にお住まいの方,気持ちをぐっとこらえてTokyoを選び,「続ける」を押しましょう。
  22. ユーザー名とパスワードを設定します。
    このとき,「ログイン時にパスワードを要求する」を選んでいることを確認してください。自動ログインの場合,拡張セッションがうまく動かない場合があります。
  23. インストールが終わるまで気長に待ちます。SSDなら5分もあれば終わるはずです。
  24. 再起動を求められたら,「今すぐ再起動する」ボタンを押してVMを再起動します。
  25. 今しがたUbuntuをインストールしたVMが起動したら,作成したユーザーでログインします。
  26. 親切な画面が出てきますが,今回はとりあえず「スキップ」しておきます。
    もし気になる場合は,一通り終わった後で設定メニューからオンラインアカウントの追加をしてください。
  27. Livepatchも同様にスキップするので,右上の「次へ」ボタンを押します。
  28. 情報の送信はお好みで。どちらかを選んで「次へ」を押します。
  29. 位置情報サービスを有効にするかを選び,「次へ」を押します。
    こちらもどちらにするかはお好みでどうぞ。
  30. ウェルカムウィザードはこれで完了です。「完了」ボタンを押してウィザードを閉じます。
  31. ソフトウェアの更新をおすすめする画面が出てきたら,「後で通知する」を選んでいったん画面を閉じます。
  32. 端末を開き,以下のコマンドを実行して,カーネルやソフトウェアをアップデートします。また,お好みで3行目に書いているautoremoveを行って,不要なソフトウェアを消してもよいです。
    ~$ sudo apt update
    ~$ sudo apt upgrade
    ~$ sudo apt autoremove
  33. アップデートがいったん終わったら,再起動しておきます。
    再起動の代わりにシャットダウンして,チェックポイントを作成しておくのもよいですね。
    ~$ sudo reboot now
  34. 再起動が完了したら再びログインし,端末を開きます。
    端末の開き方はググってください。
  35. 以下のコマンドを1行ずつ実行し,Gitをインストールしつつ,拡張セッションに必要なものをインストールスクリプトをGithubから拾ってきます。
    偉い人がプルリクを投げてくれているので,それを使いましょう。
    ~$ sudo apt install git
    ~$ git clone https://github.com/microsoft/linux-vm-tools.git
    ~$ cd linux-vm-tools/
    ~$ git fetch --all
    ~$ git pull origin pull/106/head:pull_106
    ~$ git checkout pull_106
    ~$ cd ubuntu/20.04/
    ~$ sudo bash ./install.sh

  36. インストールのスクリプトが終わると,「Reboot your machine to begin using XRDP.」と表示されます。

    言われたとおりに再起動しておきましょう。
    端末を閉じて,右上の電源アイコンのボタンから再起動してください。
    ~$ sudo reboot now をたたいてもよいのですが,経験上なぜかコマンドをたたいた場合は途中で止まってしまうように感じているのでおすすめしません。
  37. 再起動が終わったら,ログインし,もう一度スクリプトを実行します。
    端末を開いて,以下のコマンドを1行ずつ実行してください。
    ~$ cd linux-vm-tools/ubuntu/20.04/
    ~$ sudo bash ./install.sh
  38. VMをシャットダウンします。
    右上のボタンを押してGUIから「電源オフ」を選ぶのがおすすめです。
    ~$ sudo halt を叩いてもよいんですが,何回かUbuntu環境を作る中で試した経験からすると,シャットダウンが途中で止まることがあるような気がします。
    電源が落ちるまで結構時間がかかることもありますが,気長に待ってください(さすがに1時間待っても落ちなかったらおかしいので,停止してよいです。。
  39. 今度はホスト側のWindows 10 Proで,Powershellを管理者として開きます。
    スタートボタンを右クリックして,「Windows Powershell (管理者)」を選べばOK。
  40. Powershellで以下のコマンドを叩いて,現在のVMの状態を確認します。
    なお,<your_vm_name>は作成したVMの名前に置き換えてください。ダブルクオーテーション( " )でくくることもお忘れなく。
    (Get-VM -VMName <your_vm_name>).EnhancedSessionTransportType
    実行した結果,「VMBus」と表示されていることを確認してください。
  41. 以下のコマンドを実行します。なお,<your_vm_name>は作成したVMの名前に置き換えてください。ダブルクオーテーション( " )でくくることもお忘れなく。
    Set-VM -VMName <your_vm_name>  -EnhancedSessionTransportType HvSocket
  42. もう一度40.と同じコマンドを実行し,結果が「HvSocket」に変わっていればOKです。
  43. Ubuntu 20.04を入れたVM を起動します。
  44. 拡張セッションの画面が表示されれば成功です。
    「接続」を押すと拡張セッションでUbuntu 20.04に接続されます。
    なお,Ubuntu側でデーモンが立ち上がっていない可能性があるので,接続ボタンを押すのは少し待ってからにしましょう。
  45. Xorgの画面が表示されたら,usernameとpassword欄にそれぞれユーザ名とパスワードを入力し,OKを押せばログインできます。

最後に

途中からスクリーンショットを撮るのは端折り始めたけれど,ここまで書くと意外と長い道のりだったなぁ。やっぱりQiitaとかに頻繁に記事を書いている人はすごい。

それでは皆様,楽しいHyper-Vライフを!!

参考にしたサイトとか