使用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
文件,需要自己手动创建(如果有则修改)。
内容如下:
[storage]
driver = "overlay"
runroot = "/run/containers/storage"
graphroot = "/var/lib/containers/storage"
上面的配置是podman的默认配置,其中,driver
是驱动类型,默认为overlay
,需要填写,但是最好不要修改,因为原来的驱动类型就是overlay
; graphroot
就是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 root
、static dir
和volume 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 root
、static dir
和volume path
配置,也可以直接删除掉,让podman直接使用/etc/containers/storage.conf
中的配置。
注意,bolt_state.db
文件非常重要,如果之前已经有很多容器,则里面存储了很多非常重要的信息,如果丢失,则之前的容器就废了,所以在操作前一定要备份。