背景

由于之前需要研究 eBPF,安装了最新的 Ubuntu 21.10,之前也在这个系统中多次编译过 Linux 5.16 内核,今天准备研究下 Docker,发现居然没有安装,安装后发现 Docker 服务无法启动,查看日志如下:

Apr 15 14:32:54 ubuntu21 kernel: [  539.239900] loop0: detected capacity change from 0 to 209715200
Apr 15 14:32:54 ubuntu21 kernel: [  539.281632] loop1: detected capacity change from 0 to 4194304
Apr 15 14:32:54 ubuntu21 kernel: [  539.312291] device-mapper: table: 253:1: thin-pool: unknown target type
Apr 15 14:32:54 ubuntu21 kernel: [  539.312370] device-mapper: ioctl: error adding target to table
Apr 15 14:32:54 ubuntu21 dockerd[2414]: time="2022-04-15T14:32:54.250403471Z" level=error msg="[graphdriver] prior storage
 driver devicemapper failed: devicemapper: Error running deviceCreate (CreatePool) dm_task_run failed"
Apr 15 14:32:54 ubuntu21 dockerd[2414]: failed to start daemon: error initializing graphdriver: devicemapper: Error runnin
g deviceCreate (CreatePool) dm_task_run failed

花了一些时间最后定位是编译配置内核时 CONFIG_DM_THIN_PROVISIONING 选项没有配置,导致缺少一个 dm_thin_pool 的模块,致使 Docker 服务无法启动。

接下来就重新编译安装内核模块,但尝试多次均出现这个错误:

  INSTALL /lib/modules/5.16.5/kernel/net/sched/sch_teql.ko
  SIGN    /lib/modules/5.16.5/kernel/net/sched/sch_teql.ko
  INSTALL /lib/modules/5.16.5/kernel/net/tls/tls.ko
cp: error writing '/lib/modules/5.16.5/kernel/net/tls/tls.ko': No space left on device
make[1]: *** [scripts/Makefile.modinst:81: /lib/modules/5.16.5/kernel/net/tls/tls.ko] Error 1
make[1]: *** Deleting file '/lib/modules/5.16.5/kernel/net/tls/tls.ko'
make: *** [Makefile:1772: modules_install] Error 2

之前从没有出现过这个错误,我以为是 /root 目录磁盘空间满了,只好 df 命令看了下:

root@ubuntu21:~/linux-5.16.5# df -h
Filesystem                         Size  Used Avail Use% Mounted on
tmpfs                               95M  832K   94M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv   19G   15G  3.4G  81% /
copymods                           471M  468M  2.7M 100% /usr/lib/modules
tmpfs                              471M     0  471M   0% /dev/shm
tmpfs                              5.0M     0  5.0M   0% /run/lock
/dev/sda2                          974M  232M  675M  26% /boot
tmpfs                               95M  4.0K   95M   1% /run/user/0

看到这行

copymods                           471M  468M  2.7M 100% /usr/lib/modules

这是什么鬼!居然内核模块单独安装到了一个 copymods 的文件系统,这个大小只有471M,已经没有空间了!!!

解决办法

按这个线索搜索,原来是系统安装了 cloud-initramfs-copymods 这个软件,接下来

apt-get remove cloud-initramfs-copymods

将这个软件卸载,重启系统,然后重新安装内核模块,Docker 服务可以正常启动了!

感想

如果喜欢折腾编译内核之类的操作,还是尽量少用很新的 Linux 发行版,不知道会突然出现什么幺蛾子,网上资料也很少!

今日我遇到这个问题就发文记录下来,避免后人走弯路。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐