Ubuntu 20.04でTimeshiftを使ってLUKSによって暗号化されている環境をリストアしてみた

### リストアする必要に迫られた経緯

普段、仕事で使用している「[Dell Latitude 3420](https://www.dell.com/ja-jp/shop/%E3%83%87%E3%83%AB%E3%81%AE%E3%83%8E%E3%83%BC%E3%83%88%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3/dell-latitude-3420-build-your-own/spd/latitude-14-3420-laptop/al3420)」がある日突然PC本体からもイヤホンからも音が出ない状態になり（正確にはアプリによって音が出たり出なかったりという状態だったのでハードウェアの問題ではなさそうと判断）、Ubuntuでソフトウェア的な音声トラブルについてググってみると、音声関係の「alsa」、「pulseaudio」を再インストールすると復活したという情報を得たので、素直に「alsa」と「pulseaudio」をアンインストールしてインストールしたところ、依存関係の問題が発生して一部のパッケージがインストールできず。
依存関係で問題が出ていたパッケージ群をえーい！とアンインストールしてから「alsa」と「pulseaudio」をインストールするとなんとか入ったので胸を撫で下ろしたものの、PCを再起動するとUbuntuがいつまで経っても起動してこない状態に。
これはやってしまったということで、今回Timeshiftを使ったリストアにトライしてみました。

---

### 前準備

[Timeshiftのバックアップ先は外付けのハードディスクにしていた](https://qiita.com/akase244/items/76a074b812a52068b1c8)ので、まずはリストア先となるPC本体にUbuntuをクリーンインストールします。（※ディスクをLUKSで暗号化した状態でインストール）
今回はDellが提供している「[Dell OS Recovery Tool](https://www.dell.com/support/home/ja-jp/drivers/osiso/linux)」を使って再インストールを行いました。手順については以前まとめているので、[こちら](https://qiita.com/akase244/items/82e7ec3e052a4b815654)を参照してもらえるとよいかと思います。

---

### Timeshiftをインストール

Ubuntuのインストールが完了したらTimeshiftをインストールします。

```
$ sudo apt update
$ sudo apt install -y timeshift
```

---

### Timeshiftのバックアップデータが入っている外付けディスクを接続

バックアップ先の外付けディスクも暗号化しているのでUSBの接続時にパスフレーズを入力します。

![スクリーンショット 2022-08-29 20.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/dd2104b8-e037-bb7c-4ec2-09b121f9f9d6.png)

---

### Timeshiftのリストア対象データの「/etc/crypttab」をリネームする

Timeshiftのリストア対象データに「/etc/crypttab」が含まれた状態でリストアを行うと「update-initramfs」が実行されるタイミングで以下のようなエラーメッセージが表示される場合があります。

```
initramfs を生成しています...
update-initramfs: Generating /boot/initrd.img-5.14.0-1045-oem
cryptsetup: ERROR: Couldn't resolve device
    UUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
```

この問題を避けるために、外付けディスクに収録されているリストア対象の「/etc/crypttab」を「/etc/crypttab.orig」にリネームしておきます。

```
$ cd /media/PATH_TO/timeshift/snapshots/2022-08-01_14-14-33/localhost/
$ sudo mv etc/crypttab etc/crypttab.orig
```

---

### Timeshiftを起動して初期設定

Timeshiftを起動するとセットアップウィザードが自動的に実行されるので設定していきます。

「スナップショットタイプ」は「RSYNC」を選択します。（バックアップ取得時に設定していた値を選択する）
![Screenshot from 2022-08-29 11-59-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/b3f5498a-0ed9-5422-f012-afc56d67e3c0.png)

「スナップショットの場所」は外付けディスクを選択します。
![Screenshot from 2022-08-29 12-00-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/5539a3ce-271a-5236-faa4-d5038d0d2178.png)

定期実行については今回のタイミングでは特に設定しない状態としておきます。
![Screenshot from 2022-08-29 12-00-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/b651bc3d-c519-518d-30e2-185d0757d19c.png)

ホームディレクトリをバックアップ対象とするかを必要に応じて設定します。
![Screenshot from 2022-08-29 12-00-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/a34eea92-6927-1919-09c1-51f6d839e75d.png)

「完了」をクリックしてセットアップウィザードを終了します。
![Screenshot from 2022-08-29 12-00-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/ca194c21-c8ec-e9e5-1651-0cae60f572f7.png)

---

### Timeshiftでリストアを実行

スナップショット（バックアップファイル）の一覧からリストア対象を選択します。
![Screenshot from 2022-08-29 12-01-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/9e709f0f-953a-6c11-d24e-c7f6800792a4.png)


リストア先のパスに合わせて、どのデバイスのデータを元にするかを選択します。
![Screenshot from 2022-08-29 14-33-34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/ba1c8191-90d3-5d40-745f-6584beb0151b.png)

`/boot`、`/boot/efi`がどのデバイスに対応するかを確認したい場合は以下のコマンドを実行します。

```
$ df |grep boot
/dev/nvme0n1p2               719936   213536    453936  32% /boot
/dev/nvme0n1p1               523248     5372    517876   2% /boot/efi
```

「ブートローダーオプション」ボタンをクリックして、必要に応じてチェックを付けます。
それぞのオプションは以下のコマンドに対応しているようです。
- GRUB2の（再）インストール: grub2-install
- initramfsを更新する: update-initramfs
- GRUBメニューを更新する: update-grub

![Screenshot from 2022-08-29 14-34-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/01344d7e-0481-f86e-e724-ee41ad599c4f.png)

※`/boot`、`/boot/efi` のリストア元の選択状況によっては、バックアップを取得している時点と今回のクリーンインストールの時点では暗号化を行っているデバイス（ `/dev/nvme0n1p3` ）のUUIDが変わっているため、「GRUBメニューを更新する」にチェックしておかないと以下のようなエラーが発生します。

```
error: Secure Boot forbids loading module from (hd0,gpt2)/grub/x86_64-efi/bfs.mod.
error: Secure Boot forbids loading module from (hd0,gpt2)/grub/x86_64-efi/afs.mod.
error: Secure Boot forbids loading module from (hd0,gpt2)/grub/x86_64-efi/affs.mod.
error: no such device: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.
```

※`update-grub`を実行すると`/boot/grub/grub.cfg`内のUUIDが書き換わるようです。

「ブートローダーオプション」の画面を閉じて、「次へ」をクリックしてしばらくすると新規作成や復元対象のファイルの解析が行われます。
![Screenshot from 2022-08-29 14-34-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/cb2832f2-dbf6-0482-6d24-d8de0e519058.png)
![Screenshot from 2022-08-29 14-37-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/41d2578b-740f-2a7f-55ae-2e2810a943a4.png)

ファイルの解析が終わるとリストアされるファイルの一覧が表示されるので、問題ないことを確認します。
![Screenshot from 2022-08-29 14-43-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/c1df80be-fcc0-a938-b6e7-aa07776c6410.png)

リストアされるファイルの一覧を確認して「次へ」をクリックするとリストアが開始されます。
![Screenshot from 2022-08-29 14-44-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/297bce43-f876-7dd1-4734-03942d46a4e9.png)

---

### initramfsの画面で暗号化されているデバイスをマッピング

リストアが完了すると自動的に再起動が行われ、`/etc/crypttab`が存在しない状態なのでinitramfsの画面が表示されます。

```
BusyBox v1.30.1 (Ubuntu 1:1.30.1-4ubuntu6.4) built-in shell (ash) 
Enter 'help' for a list of built-in commands.

(initramfs)
```

`cryptsetup`コマンドでデバイスのマッピング処理を行います。
パスフレーズが求められるので、クリーンインストール時に設定しておいた暗号化のパスフレーズを入力します。

```
(initramfs) cryptsetup open /dev/nvme0n1p3 nvme0n1p3_crypt
WARNING: Locking directory /run/cryptsetup is missing!
Enter passphrase for /dev/nvme0n1p3:
```

パスフレーズの入力が終わったら`exit`でinitramfsの画面を抜けます。

```
(initramfs) exit
```

---

### Ubuntuのログイン画面からログイン

通常のUbuntuのログイン画面が表示されるのでログインを行う。

![スクリーンショット 2022-08-29 21.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/3180acf5-18d0-347c-c6e3-359dd75c34a2.png)

---

### 各UUIDを調整

事前にリネームしておいた `/etc/crypttab.orig` を元に戻します。

```
$ sudo mv /etc/crypttab.orig /etc/crypttab
```

`blkid`コマンドで各UUIDを確認する。

```
$ blkid
・
・
/dev/nvme0n1p1: UUID="E062-8D62" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="14fd5246-ffd8-4c91-9d8b-94af1c845d3f"
/dev/nvme0n1p2: UUID="68523f89-adf4-4c2f-8344-1f764aeb7f46" TYPE="ext4" PARTUUID="e03c86ef-6d3b-4e0d-9d5b-3f2e6971db13"
/dev/nvme0n1p3: UUID="de3c5036-fbbe-4a01-85e2-9bef206e5ee0" TYPE="crypto_LUKS" PARTUUID="45bcdc41-9b30-43fe-a738-5ff3b78d2670"
```

`blkid`コマンドで確認した「/dev/nvme0n1p3」のUUIDを「/etc/crypttab」に書き写します。

```
$ sudo vim /etc/crypttab
nvme0n1p3_crypt UUID=de3c5036-fbbe-4a01-85e2-9bef206e5ee0 none luks,discard
```

`blkid`コマンドで確認した「/dev/nvme0n1p1」、「/dev/nvme0n1p2」のUUIDを「/etc/fstab」に書き写します。

```
$ sudo vim /etc/fstab
・
・
/dev/mapper/vgubuntu-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/nvme0n1p2 during installation
UUID=68523f89-adf4-4c2f-8344-1f764aeb7f46 /boot           ext4    defaults        0       2
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=E062-8D62  /boot/efi       vfat    umask=0077      0       1
/dev/mapper/vgubuntu-swap_1 none            swap    sw              0       0
```

---

### aptコマンドでパッケージの更新

`apt`コマンドでパッケージの更新を行います。

```
$ sudo apt update
$ sudo apt dist-upgrade
```

`sudo apt dist-upgrade` を実行すると、Secure Bootの設定が求められます。
![Screenshot from 2022-08-29 15-17-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/a92a96bf-5e44-ca9d-68c2-59accf7bab6a.png)

Secure Boot用のパスワードを16文字以内で入力します。
![Screenshot from 2022-08-29 15-18-20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/e7247a60-7853-404e-b72a-7c5b4242d478.png)

パスワードの確認入力を行います。
![Screenshot from 2022-08-29 15-19-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/e5289781-5780-11c1-18f6-0ab500e47768.png)

---

### initramfs、GRUBの更新

`/etc/crypttab`、`/etc/fstab`を編集したので再度initramfs、GRUBを更新します。

```
$ sudo update-initramfs -uk all
$ sudo update-grub
```

---

### 再起動後に「Perform MOK management」の設定

Secure Bootの設定後、1回目の再起動のタイミングで「Perform MOK management」と表示されるので、メニューから「Continue boot」を選択します。
![スクリーンショット 2022-08-29 21.55.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/000da247-4848-72f3-bebd-80f542dd0718.png)

---

### 「Please unlock disk」画面の表示


「Perform MOK management」の設定後にinitramfsの画面ではなく「Please unlock disk nvme0n1p3」と表示されれば全ての設定が完了です。
![Screenshot from 2022-08-29 23-41-42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/4b6d65f1-a0cf-0c28-b73c-a6e646f9c170.png)

---

### Timeshiftによるリストア後の問題点

Timeshiftによるリストア後に以下の問題が見つかったので個別に対応した。

- snapでインストールしていた、1password、spotify、zoom-clientなどが起動しなくなった。
    - snap経由でインストールしたアプリケーションは日本語変換など何かと問題が多かったので、これを機にすべてapt経由でインストールするようにした。
    - 1passwordの起動時にsyslogに `Aug 29 16:57:03 akase244-Latitude-3420 1password_1password.desktop[15048]: cannot perform operation: mount --rbind /dev /tmp/snap.rootfs_mZ3FF3//dev: No such file or directory` のようなエラーが出力されていました。
- Dockに「お気に入りに追加」で追加していたアプリケーションが消えて、Dockの表示がデフォルト状態に戻った。
- Mozc（日本語変換）の設定がデフォルト状態に戻った。
- Tweaksで設定していたキーバインドのカスタマイズがデフォルト状態に戻った。
- 「端末」のウィンドウサイズやフォント指定がデフォルト状態に戻った。

---

### まとめ

- バックアップ超大事
- バックアップを元にしたリストア検証大事。
- 無駄にTimeshiftに詳しくなった。
- 無事に音が出るようになった。めでたし、めでたし。