使用podman容器时,podman会默认使用/var/lib/containers路径作为存储路径,可能会导致根磁盘空间占用过大,那如何修改podman的存储路径呢?本文将带你一起来探讨。

前几天公司的服务器根目录磁盘空间不足了,经过查找问题,发现podman的存储占用空间非常大,达到近300G,为了腾出空间,网上找了一些资料,并且在自己的虚拟机中先尝试一下,发现是可以(笔者的思路是使用Linux的符号链接方式,即关闭所有容器及容器服务后,把/var/lib/containers目录移动到有足够空间的磁盘,再将之符号链接为/var/lib/containers),再在服务器上去操作,但是还是没有成功,主要是gitlab在修改了路径后无法启动。但是发现重启服务后,根目录空间的居然多出了60G左右,由于是公司服务器,gitlab中有很多项目代码,既然有空间了,就不用再修改存储路径了。

今天有空了,想把之前在自己虚拟机上的修改过的podman存储路径还原回来,却发现按之前的方法无法还原了。

结合在网上的找到的资料,这里记录一下修改podman存储路径的方法。OS环境为Ubuntu 2110和2204版本。

一、关闭所有容器及容器服务

注意在修改前需要关闭所有容器,可以使用Cockpit系统在Web中关闭容器及以下几个服务:

  • podman
  • podman-restart
  • podman-auto-update
  • containerd
  • 建议关闭所有snap.microk8s开头的服务

如果不想重启电脑,记住关闭了哪些服务,后面再启动起来。不想记那改完后,重启一下电脑。

二、复制目录

关闭了容器及服务后,就可以把/var/lib/containers目录移动到有足够空间的地方了。

三、修改配置

podman会根据/etc/containers/storage.conf中的配置来改变podman的存储路径,但是这并不是绝对的,感觉像是BUG一样。

ubuntu系统中/etc/containers下并没有storage.conf文件,需要自己手动创建(如果有则修改)。

内容如下:

1[storage]
2driver = "overlay"
3runroot = "/run/containers/storage"
4graphroot = "/var/lib/containers/storage"

上面的配置是podman的默认配置,其中,driver是驱动类型,默认为overlay,需要填写,但是最好不要修改,因为原来的驱动类型就是overlaygraphroot就是podman的存储路径,runroot是运行路径,这些都可以改为自定义的路径。这里主要是修改 graphroot路径。

修改完成后,可以使用sudo podman info命令来查看是否生效:

四、修改数据库

podman在数据库中可能会存储有运行配置,默认是在/var/lib/containers/storage/libpod/bolt_state.db中的,所以如果该数据库中存储了运行配置,则只修改了/etc/containers/storage.conf中的配置是不起作用的,podman会优先使用数据库中存储的配置,这点很坑。我们在修改了/etc/containers/storage.conf中的配置后,可以使用如下的命令来查看详细信息:

sudo podman info --log-level=debug

可以看到podman在初始化boltdb后使用了数据库中的配置来重载graph rootstatic dirvolume path

所以如果bolt数据库存储了相关配置,那么无论怎么修改/etc/containers/storage.conf中的配置都会被重载而不起作用。

bolt_state.db又是一种小众的数据库,格式为bolt,不能直接查看和修改,需要使用专门的bolt数据库工具才能查看和修改。

https://github.com/etcd-io/bbolt页面罗列了不少bolt工具,笔者选用了 boltdbweb这款Go写的Web工具来查看和修改。

打开runtime-config可以看到里面有graph-root就是podman的存储路径,

这里可以修改graph rootstatic dirvolume path配置,也可以直接删除掉,让podman直接使用/etc/containers/storage.conf中的配置。

注意,bolt_state.db文件非常重要,如果之前已经有很多容器,则里面存储了很多非常重要的信息,如果丢失,则之前的容器就废了,所以在操作前一定要备份。