【问题标题】:How can one file `/etc/hosts` with 256 bytes use `1.9M` inode?一个 256 字节的文件 `/etc/hosts` 如何使用 `1.9M` inode?
【发布时间】:2021-06-06 21:58:55
【问题描述】:

我使用 docker 来做一些事情。但运行大约 15 天后,inode 已耗尽。 docker 中df -i 的输出为:

Filesystem       Inodes   IUsed    IFree IUse% Mounted on
overlay         3276800 1965849  1310951   60% /
tmpfs          16428916      17 16428899    1% /dev
tmpfs          16428916      15 16428901    1% /sys/fs/cgroup
shm            16428916       1 16428915    1% /dev/shm
/dev/vda1       3276800 1965849  1310951   60% /etc/hosts
tmpfs          16428916       1 16428915    1% /proc/acpi
tmpfs          16428916       1 16428915    1% /proc/scsi
tmpfs          16428916       1 16428915    1% /sys/firmware

hosts文件内容:

127.0.0.1 xxx xxx
127.0.0.1 localhost.localdomain localhost
127.0.0.1 localhost4.localdomain4 localhost4

::1 xxx xxx
::1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6

为什么主机可以使用这么多的 inode?如何恢复?

【问题讨论】:

  • 文件里面有什么?
  • 只有 256 个字节。
  • @stdunbar 我已经发布了文件内容。
  • 你在开发文件上做过fsck 吗?我很长时间没有使用任何形式的*nix,但应该有一个不会进行更改的分析开关。检查手册页。然后,当您确信这是正确的尝试时,您可以修复磁盘。
  • 如果您从主机运行docker volume ls 会发生什么?也尝试运行docker volume prune(同样,在主机上)。

标签: docker inode


【解决方案1】:

在容器内,该文件是一个绑定挂载。挂载统计信息来自文件最初所在的底层文件系统,在本例中为 /dev/vda1。它们不是单个文件的统计信息,它只是挂载显示绑定挂载数据的方式。覆盖文件系统也是如此,因为它也基于不同的底层文件系统。由于每个文件系统都相同,因此您会看到每个文件系统完全相同的挂载统计信息。

因此,您正在耗尽主机文件系统上的 inode,可能是 /var/lib/docker 文件系统,如果您没有配置单独的挂载,它将是 /(根)文件系统。为什么您在该文件系统上使用如此多的 inode 将需要您进行调试以查看是什么创建了这么多文件。通常,您会希望通过将 /var/lib/docker 设为单独的分区,或将其符号链接到另一个您有更多空间的驱动器来将 docker 与根文件系统分开。

作为另一个例子来证明这些都是一样的:

$ df -i /var/lib/docker/.
Filesystem                          Inodes   IUsed    IFree IUse% Mounted on
/dev/mapper/bmitch--t490--vg-home 57098240 3697772 53400468    7% /home

$ docker run -it --rm busybox df -i
Filesystem              Inodes      Used Available Use% Mounted on
overlay               57098240   3697814  53400426   6% /
tmpfs                  4085684        17   4085667   0% /dev
tmpfs                  4085684        16   4085668   0% /sys/fs/cgroup
shm                    4085684         1   4085683   0% /dev/shm
/dev/mapper/bmitch--t490--vg-home
                      57098240   3697814  53400426   6% /etc/resolv.conf
/dev/mapper/bmitch--t490--vg-home
                      57098240   3697814  53400426   6% /etc/hostname
/dev/mapper/bmitch--t490--vg-home
                      57098240   3697814  53400426   6% /etc/hosts
tmpfs                  4085684         1   4085683   0% /proc/asound
tmpfs                  4085684         1   4085683   0% /proc/acpi
tmpfs                  4085684        17   4085667   0% /proc/kcore
tmpfs                  4085684        17   4085667   0% /proc/keys
tmpfs                  4085684        17   4085667   0% /proc/timer_list
tmpfs                  4085684        17   4085667   0% /proc/sched_debug
tmpfs                  4085684         1   4085683   0% /sys/firmware

从那里您可以看到 /etc/resolv.conf/etc/hostname/etc/hosts 是每个绑定挂载都返回到 /var/lib/docker 文件系统,因为 docker 为每个容器创建和维护这些。

如果删除容器会释放大量 inode,请检查您的容器以查看您是否正在修改/创建容器文件系统中的文件。这些都将作为容器移除的一部分被删除。您可以通过docker diff $container_id

查看当前创建的文件(不会捕获创建然后删除但仍由进程保持打开的文件)

【讨论】:

  • 但是当我使用docker stop xxxdocker rm xxx 时,它就被释放了。以此类推,我使用docker run -v xxx:xxx将docker中的worker目录(不是/etc/hosts)挂载到宿主文件系统,它不再增加了。
猜你喜欢
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
  • 2015-11-11
  • 2017-04-17
  • 1970-01-01
  • 2014-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多