Debian でパスワードリカバリーをする

Hyper-V に入れていた Debian のパスワードが分からなくなった。いや、ユーザ名すら分からなくなったw 再インストールをしても良いが、消すのも勿体ないのでパスワードリカバリーをする。
最近の *nix って、シングルユーザモードでもパスワードが要求されますからねぇ。

# GRUB で、起動オプションを編集する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/0783b211-3fda-a162-55f1-bbeaf8e464e7.png)
通常起動の項目を選択したまま e を入力することで GRUB の編集モードに入る。どうも emacs っぽいキーバインドのエディタらしいです。vi だったら使えるのですが emacs はちょっと... nano はもっと無理。

linux ～ の行の最後に init=/bin/bash を追加 (ここでの編集は保存されないので、間違えたら再起動しましょう🤭)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/4e3d10f7-d473-c469-021e-26546e9ec147.png)
書き換えたら [Ctrl]+[x] で起動します。

# シングルユーザモードで起動し、ディスクをマウント
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/caaca412-8485-996a-4b47-b6598518d60c.png)
はい、bash が起動しました。ここまで来たら、昔のシングルユーザモードと同じですね。
取りあえず df -h とか mount とかで、ディスクが繋がっているか見たら
```tcsh:
mount -o rw /
vipw
cap_mkdb
shutdown -r
```
あ、いや、これは　FreeBSD 的？
正しくは　[Reset a lost root password in under 5 minutes](https://opensource.com/article/18/4/reset-lost-root-password) こちらを。
それ以前に、キーボードの入力を全く受け付けない！何もコマンドが打てないんですけども！！！
仕方が無いので、別の Debian でマウントして書き換えましょう。

# Live CD イメージを拾ってくる
さすがに Debian をもう一つインストールするのは大変なので、
[cdimage.debian.or.jp について](https://www.debian.or.jp/cdimage/) からリンクを辿り、[理研](http://ftp.riken.jp/Linux/debian/debian-cd/) 辺りから [debian-live-11.3.0-amd64-cinnamon.iso](http://ftp.riken.jp/Linux/debian/debian-cd/11.3.0-live/amd64/iso-hybrid/) とやらをダウンロード。あまり聞き覚えがないなと思ったら cinnamon って GNOME 3ベースの新しいデスクトップ環境なんですね。

# リカバリー用の仮想 PC を作る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/237a7a09-60b4-f8df-7477-eb09fa973c07.png)
色々と設定するのも面倒なので、CD だけ読み込ませて作成。作成できたら接続 & 起動。CD から起動のために [Enter]。([Enter]を叩くのが遅れると、ネットワークからの起動になってタイムアウトしますので、[Ctrl]+[Alt]+[Del] などでやり直して下さい)

# Live CD の起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/062e345c-06d0-b8cd-6722-b7c1e7da7c67.png)
一番上の `Debian GNU/Linux Live (kernel 5.10.0-13-amd64)` を選んで [Enter]。
CD　からの起動なので少し時間がかかりますが、待ちます。待ちます。待ちます。

待った甲斐がありました。メモリを無駄遣いするウィンドウ環境が起動してきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/c012191a-7ee7-20a9-e838-6e81a952a71a.png)

でも、まだ目的のディスクは接続されていません。なので、自動的に作成された HDD を目的のディスクと入れ替えます。設定を開いて、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/db73cd37-54f7-a7d7-65de-691d47f0fecd.png)

仮想ディスクを目的のディスクを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/6a70c847-9464-7e65-1039-ef892aadaa2a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/0e1e9fb0-8af1-5b8e-ede5-7ba2a6a2857c.png)
目的のディスクを選択したら適用をクリック。(root パスワードを忘れた Debian はシャットダウンしておくこと)

ターミナルからディスクを確認
btrfs の LVM 環境だけど、大丈夫かな？
```bash:lvm を確認
root@debian:~# lvmdiskscan
  /dev/loop0 [       2.38 GiB]
  /dev/sda1  [     512.00 MiB]
  /dev/sda2  [     488.00 MiB]
  /dev/sda3  [     599.02 GiB] LVM physical volume
  0 disks
  3 partitions
  0 LVM physical volume whole disks
  1 LVM physical volume
root@debian:~# lvscan
  ACTIVE            '/dev/RIBBON-vg/root' [<598.07 GiB] inherit
  ACTIVE            '/dev/RIBBON-vg/swap_1' [976.00 MiB] inherit
```
心配無用、無事見えました。こいつをマウントしましょう。

ちなみに /dev/mapper にも vg が見えるので、こちらをマウントしても構いません。どちらも同じものを差しています。
```tcsh:vg は、複数の表現方法があります
% ls -l /dev/RIBBON-vg /dev/mapper
/dev/RIBBON-vg:
total 0
lrwxrwxrwx 1 root root 7 May  8 10:37 root -> ../dm-0
lrwxrwxrwx 1 root root 7 May  8 10:37 swap_1 -> ../dm-1

/dev/mapper:
total 0
lrwxrwxrwx 1 root root       7 May  8 10:37 RIBBON--vg-root -> ../dm-0
lrwxrwxrwx 1 root root       7 May  8 10:37 RIBBON--vg-swap_1 -> ../dm-1
crw------- 1 root root 10, 236 May  8 10:37 control
```

# マウント
マウントポイントを作成してマウントします
```bash:ディスクをマウント
root@debian:~# mkdir /tmproot
root@debian:~# mount /dev/RIBBON-vg/root /tmproot
root@debian:~# df -h
Filesystem                   Size  Used Avail Use% Mounted on
udev                         933M     0  933M   0% /dev
tmpfs                        192M  944K  191M   1% /run
/dev/sr0                     2.8G  2.8G     0 100% /run/live/medium
/dev/loop0                   2.4G  2.4G     0 100% /run/live/rootfs/filesystem.squashfs
tmpfs                        959M  234M  725M  25% /run/live/overlay
overlay                      959M  234M  725M  25% /
tmpfs                        959M     0  959M   0% /dev/shm
tmpfs                        5.0M     0  5.0M   0% /run/lock
tmpfs                        959M  4.0K  959M   1% /tmp
tmpfs                        192M   92K  192M   1% /run/user/1000
tmpfs                        192M   44K  192M   1% /run/user/0
/dev/mapper/RIBBON--vg-root  599G  6.3G  591G   2% /tmproot
root@debian:~#
```

後は簡単ですね。

# chroot する
chroot から抜けられるように bash をもう一つ噛ませる。
そして、マウントしたディスクへ chroot (@rootfs と言うディレクトリの下にルートディレクトリがあります)
カーネルファイルのファイル名やらタイムスタンプやらが変わったので chroot できたようです。
```bash:chroot
root@debian:~# ls -l /vmlinuz
lrwxrwxrwx 1 root root 28 Mar 26 15:23 /vmlinuz -> boot/vmlinuz-5.10.0-13-amd64
root@debian:~# bash
root@debian:~# chroot /tmproot/\@rootfs/
root@debian:/# ls -l vmlinuz
lrwxrwxrwx 1 root root 27 Dec 10 21:52 vmlinuz -> boot/vmlinuz-5.10.0-9-amd64
```
カーネルファイルのバージョンが変わりました (0-13 → 0-9)

# ユーザ名の確認とパスワードの初期化
```bash:
root@debian:/# less /etc/passwd
....登録されているユーザを確認

root のパスワードを変更
root@debian:/# passwd
New password:
Retype new password:
passwd: password updated successfully

一般ユーザのパスワードを変更
root@debian:/# passwd abc123
New password:
Retype new password:
passwd: password updated successfully

終わったので chroot から抜ける
root@debian:/# exit
root@debian:~# ls -l /vmlinuz
lrwxrwxrwx 1 root root 28 Mar 26 15:23 /vmlinuz -> boot/vmlinuz-5.10.0-13-amd64
```
chroot を抜けて新しいカーネルファイル (-13) が見えますね。

# ディスクをアンマウントして、shutodwn
自分のため、みんなのため、念のため、おまじないを唱えてから unmount。そして、shutodnw。
```bash:
root@debian:~# sync ; sync ; sync
root@debian:~# umount /tmproot
root@debian:~# shutdown -h now
```
シャットダウンをしておかないと、仮想ハードディスクファイルがロックされて起動できません。

# パスワードを忘れた debian を起動して確認
無事、ログインできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306041/e10b101d-bba9-aa26-0591-e5463054730e.png)
無事ログインできたら、リカバリー用の仮想 PC を削除。また、仮想ディスクも作成されているのでそれも削除しましょう。(間違えて、必要なディスクイメージを削除しないように！！！)

# 面倒くさいことしてるなぁ
パスワードが分からなくなった PC で Live ディスクから起動すれば良いんですが、何度やっても DVD から起動できなかったので、別に仮想 PC を作成しました。残念。