overlayroot でルートファイルシステムを読み取り専用にしたところ、docker が使えなくなりました。
OS は Ubuntu 20.04 です。
overlayroot を有効にする方法などについては以前の記事を参考にしてください。
問題点
Docker がインストールされている環境で、overlayroot でルートファイルシステムを読み取り専用にした場合、docker コマンドを実行すると以下のようなエラーが発生します。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
いろいろ調べてみた結果、基本的に overlayroot が有効な状態では docker は使えないようです。
一応以下にあるやり方で docker コンテナを立ち上げるところまではできました。
- https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link
- https://github.com/docker/for-linux/issues/775
しかし、そもそも Docker ボリュームには DB のデータなどを逐次格納していっているので、tmpfs 上(=メモリ上)だとメモリがすぐ枯渇してしまいそうです。
また、Docker コンテナ・イメージをアップデートしたい場合にも困ります。
というわけで、少なくとも /var/lib/docker
の領域はパーティションを分けるしかないじゃないかというところに行き着きました。
以下のページでも書き込み可能としたい場合はパーティションを分ける方法が紹介されています。
また、Docker に関するベストプラクティスでも、コンテナ用にパーティションを分けるとあります。
その上で、Docker コンテナも read-only で起動すれば、ルートファイルシステムだけでなく Docker コンテナも保護できそうです。
対処方法
とりあえず以下のようにパーティションを分けることで overlayroot と docker の共存ができました。
パス | マウントポイント |
---|---|
/dev/sda1 | EFI システムパーティション |
/dev/sda2 | / |
/dev/sda3 | /var |
この状態で overlayroot をインストールし、/etc/overlayroot.local.conf
に overlayroot="tmpfs:recurse=0"
を記載します。
コマンド一発でやる場合は以下です。
$ echo 'overlayroot="tmpfs:recurse=0"' | sudo tee -a /etc/overlayroot.local.conf
overlayroot のインストールや設定については以前の記事を参考にしてください。
今回はルートファイルシステムのみを読み取り専用にするので、tmpfs:recurse=0
を指定するらしいです。
以下が参考になりました。
これで再起動すれば、ルートファイルシステムのみが読み取り専用となり、/var
は読み書き可能な状態となります。
docker も普通に使えました。
参考 URL
- https://superuser.com/questions/1526682/docker-in-overlayroot-environment-invalid-cross-device-link
- https://github.com/docker/for-linux/issues/775
- https://armadillo.atmark-techno.com/index.php/blog/10899/8648
- https://armadillo.atmark-techno.com/forum/armadillo/7894
- https://spin.atomicobject.com/2015/03/10/protecting-ubuntu-root-filesystem/
- https://kurosute.com/raspberrypi-overlayroot/
- https://qiita.com/kakkie/items/c4a9a2f2a9e4e802ca0b
- https://gihyo.jp/admin/serial/01/ubuntu-recipe/0568