VM重启后Docker启动失败,报bbolt无效空闲列表页错误求助
Docker重启后启动失败:bbolt数据库freelist损坏故障排查与修复
问题现象
此前正常运行的Docker在VM重启后无法启动,执行sudo systemctl start docker命令启动失败,通过journalctl -u docker -f -n 1000查看日志,出现以下panic错误:
panic: invalid freelist page: 0, page type is unknown<00> goroutine 1 [running, locked to thread]: go.etcd.io/bbolt.(*freelist).read(0x5631b1518790?, 0x7fb8b81a5000) /root/rpmbuild/BUILD/src/engine/vendor/go.etcd.io/bbolt/freelist.go:267 +0x22e go.etcd.io/bbolt.(*DB).loadFreelist.func1() /root/rpmbuild/BUILD/src/engine/vendor/go.etcd.io/bbolt/db.go:415 +0xb8 sync.(*Once).doSlow(0xc0006361c8?, 0x10?) /usr/local/go/src/sync/once.go:74 +0xc2 sync.(*Once).Do(...) /usr/local/go/src/sync/once.go:65 go.etcd.io/bbolt.(*DB).loadFreelist(0xc000636000?) /root/rpmbuild/BUILD/src/engine/vendor/go.etcd.io/bbolt/db.go:408 +0x47 go.etcd.io/bbolt.Open({0xc00075e570, 0x21}, 0x75e570?, 0x0) /root/rpmbuild/BUILD/src/engine/vendor/go.etcd.io/bbolt/db.go:290 +0x40c github.com/moby/buildkit/solver/bboltcachestorage.NewStore({0xc00075e570, 0x21}) /root/rpmbuild/BUILD/src/engine/vendor/github.com/moby/buildkit/solver/bboltcachestorage/storage.go:26 +0x2e github.com/docker/docker/builder/builder-next.newGraphDriverController({_, _}, {_, _}, {0xc0011faee8, {0xc00083cf90, 0x18}, {0xc000c833e0, 0x24}, {0xc00118fc20, ...}, ...}) /root/rpmbuild/BUILD/src/engine/builder/builder-next/controller.go:287 +0x1179 github.com/docker/docker/builder/builder-next.newController({_, _}, {_, _}, {0xc0011faee8, {0xc00083cf90, 0x18}, {0xc000c833e0, 0x24}, {0xc00118fc20, ...}, ...}) /root/rpmbuild/BUILD/src/engine/builder/builder-next/controller.go:61 +0xe5 github.com/docker/docker/builder/builder-next.New({_, _}, {0xc0011faee8, {0xc00083cf90, 0x18}, {0xc000c833e0, 0x24}, {0xc00118fc20, {0x5631b219b080, 0xc001358e90}, ...}, ...}) /root/rpmbuild/BUILD/src/engine/builder/builder-next/builder.go:113 +0x152 main.newRouterOptions({0x5631b2197ca8, 0xc000743aa0}, 0xc000b34000, 0xc000bd2240) /root/rpmbuild/BUILD/src/engine/cmd/dockerd/daemon.go:351 +0x808 main.(*DaemonCli).start(0xc000daa040, 0xc000a1e150) /root/rpmbuild/BUILD/src/engine/cmd/dockerd/daemon.go:265 +0x12a8 main.runDaemon(...) /root/rpmbuild/BUILD/src/engine/cmd/dockerd/docker_unix.go:14 main.newDaemonCommand.func1(0xc000b58000?, {0xc000b0a390?, 0x3?, 0x3?}) /root/rpmbuild/BUILD/src/engine/cmd/dockerd/docker.go:39 +0x94 github.com/spf13/cobra.(*Command).execute(0xc000b58000, {0xc000052090, 0x3, 0x3}) /root/rpmbuild/BUILD/src/engine/vendor/github.com/spf13/cobra/command.go:916 +0x862 github.com/spf13/cobra.(*Command).ExecuteC(0xc000b58000) /root/rpmbuild/BUILD/src/engine/vendor/github.com/spf13/cobra/command.go:1044 +0x3bd github.com/spf13/cobra.(*Command).Execute(...) /root/rpmbuild/BUILD/src/engine/vendor/github.com/spf13/cobra/command.go:968 main.main() /root/rpmbuild/BUILD/src/engine/cmd/dockerd/docker.go:109 +0x18c docker.service: Main process exited, code=exited, status=2/INVALIDARGUMENT docker.service: Failed with result 'exit-code'. Failed to start Docker Application Container Engine.
排查思路
从日志栈可以明确:故障源于Docker BuildKit使用的bbolt数据库文件损坏,具体是数据库的freelist(空闲页链表)页无效,属于磁盘文件写入异常,基本是VM异常重启时未完成磁盘刷写导致的。
解决建议
修复步骤
- 停止所有Docker相关服务:
sudo systemctl stop docker docker.socket containerd - 备份损坏的数据库文件(避免后续需要恢复):
sudo cp /var/lib/docker/buildkit/cache.db /var/lib/docker/buildkit/cache.db.bak - 删除损坏的数据库文件:
sudo rm /var/lib/docker/buildkit/cache.db - 重新启动Docker服务:
sudo systemctl start docker
验证
- 检查Docker状态:
systemctl status docker,确认服务处于active (running)状态 - 测试容器运行:
docker run --rm hello-world,验证基础功能正常
预防措施
- 避免VM异常重启,重启前先正常停止Docker服务:
sudo systemctl stop docker - 定期清理BuildKit缓存:
docker builder prune,减少数据库文件大小,降低损坏风险 - 确保VM存储介质可靠性,必要时使用带日志的文件系统(如ext4、XFS)
内容的提问来源于stack exchange,提问作者tanmoy
相关产品推荐
相关产品推荐

