Fedora 31 にアップグレードするとDocker(moby-engine)が動かなくなる場合の仮対応

# 状況 
Fedora を31 にアップグレードすると、Docker が起動しなくなってしまった。


```console
# systemctl start docker                                                                                                                                                                                                       .130
Job for docker.service failed because the control process exited with error code.
See "systemctl status docker.service" and "journalctl -xe" for details.
```


journalctl でログを見ると、以下のようなメッセージが出力されていました。


```text
myserver systemd[1]: Starting Docker Application Container Engine...
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="libcontainerd: new containerd process, pid: pppp"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="failed to rename /var/lib/docker/tmp for background deletion: %!s(<nil>). Deleting synchronously"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man ...
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="devmapper: Base device already exists and has filesystem xfs on it. User specified filesystem  will be ignored."
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="[graphdriver] using prior storage driver: devicemapper"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=info msg="Graph migration to content-addressability took 0.00 seconds"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Your kernel does not support cgroup memory limit"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find cpu cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find blkio cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="Unable to find cpuset cgroup in mounts"
myserver dockerd[pppp]: time="yyyy-mm-ddThh:mm:ss.SSS" level=warning msg="mountpoint for pids not found"
myserver dockerd[pppp]: Error starting daemon: Devices cgroup isn't mounted
```


その中で、`Error starting daemon: Devices cgroup isn't mounted` というメッセージが今回の直接的な原因とみて、これを起点に調査を開始したところ、以下のページがヒットしました。

- Bug 1746355 - Error starting daemon: Devices cgroup isn't mounted
    - https://bugzilla.redhat.com/show_bug.cgi?id=1746355

原因としてはFedora 31 からsystemd が使うcgroup がcgroup v1 からcgroup v2 に変更されたためで、Docker(moby-engine) がまだそれに対応していないためです。
Fedora チームとしては、Docker の対応を待つ方針のようで、Fedora サイドからDocker に合わせて対応することはなさそうです。

しかしDocker が使えなくなるのは、人によってはかなり困ることになるかと思います。
ということでFedora 31 にて、かろうじてDocker を動かす方法について、備忘録として残しておこうと思います。

# 起動kernel コマンドラインパラメータの変更 
cgroup v2 を使用しないようにするために、起動時のkernel コマンドラインパラメータにて`unified_cgroup_hierarchy=0` (false)を指定するようにします。
これを0 に設定することでハイブリットもしくはレガシーなcgroup ヒエラルキを使用するようになります。

`/etc/sysconfig/grub` ファイルを開き、`GRUB_CMDLINE_LINUX` 変数の値を以下のように変更します。


```text:/etc/sysconfig/grub
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet console=ttyS0,115200"
↓　↓　↓
GRUB_CMDLINE_LINUX="rd.lvm.lv=fedora/root rd.lvm.lv=fedora/swap rhgb quiet console=ttyS0,115200 systemd.unified_cgroup_hierarchy=0"
```


変更が完了したら、grub.cfg ファイルのリビルドを行います。


```console:grub.cfgのリビルド
  # BIOS boot の場合
# grub2-mkconfig -o /boot/grub2/grub.cfg
  # EFI boot の場合
# grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg
```


リビルドが完了したらOS を再起動し、Docker が正常に起動することを確認してください。

# まとめ 
Fedora にてDocker を使っている場合は、まだFedora 31 にアップグレードしないほうが良いかも知れません。
Fedora 31 にアップグレードしてしまった人は、Docker(moby-engine) がcgroup v2 に対応するのも時間の問題と思うので、それまでは本対応を実施して運用をするのが良いでしょう。

# 参考 
- Bug 1746355 - Error starting daemon: Devices cgroup isn't mounted
    - https://bugzilla.redhat.com/show_bug.cgi?id=1746355

- 26.5. CUSTOMIZING THE GRUB 2 CONFIGURATION FILE
    - https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/sec-customizing_the_grub_2_configuration_file

- systemd
    - https://www.freedesktop.org/software/systemd/man/systemd.html