问题:安装 Docker 后无法启动服务,报错文件系统不支持

环境:从网络启动的树莓派 4B | boot via pxe over NFS

解决办法:VFS 或者 loop device 下面别看了,最终解法把 docker rootfs 挂载到 samba 目录中

背景描述:

  • 这个问题的标题可能有点难理解,场景是没有 SD 卡的树莓派,使用 PXE 从网络启动,本地无盘,root 目录在远端的 NFS 上,当安装好 docker 后发现无法启动服务,报错文件系统不支持
  • 看起来 docker 是不支持跑在 NFS 文件系统架构中的,查询 docker 文档后有两种解决办法
    • 一种是 VFS,解决比较简单,改参数就行,缺点是速度慢,而且占用存储空间相当多,我粗略算了一下,至少 5 倍
    • 另一种是挂在 loop device,是比较推荐的做法,但是不好扩容,可以一开始建大一点

解法一:

直接修改 docker 配置文件,将文件系统修改为 vfs 后,重启服务即可

1
2
sudo systemctl stop docker
vi /etc/docker/daemon.json

改成这样:

1
2
3
{
"storage-driver": "vfs"
}

启动服务,观察文件系统为 vfs

1
2
sudo systemctl start docker
docker info

解法二:挂在一个虚拟设备

创建一个 img 文件,容量为 1G,你可以改 count 数字调整到 2G 3G

1
2
3
4
5
6
7
losetup -fP loopbackfile.img
losetup -a
mkfs.ext4 /root/loopbackfile.img
mkdir /loopfs
mv /var/lib/docker /var/lib/docker2
mount -o loop /dev/loop0 /var/lib/docker
rsync -xa --progress /var/lib/docker2/ /var/lib/docker2/

挂载它,并格式化

1
2
sudo systemctl start docker
docker info

查看大小:

1
df -hP /var/lib/docker

重启 docker 服务,观察文件系统

1
2
sudo systemctl start docker
docker info

当后续要扩容 img 文件时:

  • 先卸载挂载点

    1
    umount /var/lib/docker
  • 删除 loop device

    1
    losetup -d /dev/loop0
  • 重建 img 文件,循环上述步骤

文档参考:

Use the VFS storage driver | Docker Documentation

How to create virtual block device (loop device/filesystem) in Linux – The Geek Diary