首页 > 解决方案 > 在 docker 容器中使用 quotactl 系统调用

问题描述

我想在 docker 容器中使用 XFS 文件系统配额来限制某些目录的大小。我已经将 quotactl 放在了 seccomp 白名单中(我完全知道这不安全),但现在我得到一个 no such file or directory 错误。

XFS 文件系统只能通过绑定挂载访问,因此我尝试使用主机和容器中的存储设备进行系统调用(例如/dev/sda2and /dev/sda5),但它们都不起作用。完全相同的程序在主机系统上运行良好。

编辑:这是 strace 告诉我的:

# On host system
quotactl(QCMD(Q_XSETQLIM, PRJQUOTA), "/dev/sda5", 0, {d_version=1, d_flags=XFS_PROJ_QUOTA, d_fieldmask=0x8, d_id=0, d_blk_hardlimit=20480, d_blk_softlimit=0, d_ino_hardlimit=0, d_ino_softlimit=0, d_bcount=0, d_icount=0, d_itimer=0, d_btimer=0, d_iwarns=0, d_bwarns=0, d_rtb_hardlimit=0, d_rtb_softlimit=0, d_rtbcount=0, d_rtbtimer=0, d_rtbwarns=0}) = 0
# Inside container
quotactl(QCMD(Q_XSETQLIM, PRJQUOTA), "/dev/sda5", 0, {d_version=1, d_flags=XFS_PROJ_QUOTA, d_fieldmask=0x8, d_id=0, d_blk_hardlimit=20480, d_blk_softlimit=0, d_ino_hardlimit=0, d_ino_softlimit=0, d_bcount=0, d_icount=0, d_itimer=0, d_btimer=0, d_iwarns=0, d_bwarns=0, d_rtb_hardlimit=0, d_rtb_softlimit=0, d_rtbcount=0, d_rtbtimer=0, d_rtbwarns=0}) = -1 ENOENT (No such file or directory)

标签: linuxdockersystem-calls

解决方案


在评论的帮助下,我能够解决这个问题,您需要做三件事才能在quotactldocker 容器中使用:

  • 对容器使用您自己的 seccomp 配置并将quotactl系统调用列入白名单
  • 使用命令行选项将设备添加到容器--device=/dev/sdXX:/dev/sdXX
  • 以特权模式运行容器--privileged

推荐阅读