【问题标题】:Use quotactl system call inside docker container在 docker 容器中使用 quotactl 系统调用
【发布时间】:2019-03-24 12:29:20
【问题描述】:

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

XFS 文件系统只能通过绑定挂载访问,因此我尝试使用主机和容器中的存储设备进行系统调用(例如 /dev/sda2/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)

【问题讨论】:

  • /dev/sda5 是否存在于容器中?
  • 这就是我忘记检查的内容,我对 docker 很陌生。我以为它确实在那里,因为像 df 这样的程序告诉我。谢谢
  • 现在我通过使用 --device 和 docker run 解决了这个问题,但现在我收到“不允许操作”错误。是否也可以解决这个问题?
  • 我认为对于qoutactl,您只需要root,找不到它需要的任何功能。在 docker 中会很难...,尝试使用--privileged 运行或授予`--cap-add SYS_ADMIN`
  • 刚刚在 Linux 源码中找到了原因:elixir.bootlin.com/linux/latest/source/fs/quota/quota.c#L43 --privileged 成功了。

标签: linux docker system-calls


【解决方案1】:

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 2018-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多