问题标签 [overlayfs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
220 浏览

linux - 将 docker 实例迁移到另一台服务器

我正在尝试将现有的 docker 安装迁移到新服务器。我从旧主机的 /var/lib/docker 创建了一个 tar 文件,并在 /var/lib/docker 中解压了新主机上的 tar 文件夹。

下一个文件夹似乎使用了大部分空间:

在新主机上启动 docker 服务时,我可以启动旧容器。但它们不包含任何数据。是否有可能以某种方式让我的旧容器在新主机上运行并保持它们的数据持久化?

在新服务器上运行后,我可以创建新容器并开始使用持久卷。

0 投票
3 回答
597 浏览

docker - docker容器内的overlayfs

是否可以在(特权)docker 容器中安装覆盖 fs?至少我的直观方法(在容器外运行良好)失败了:

附加信息:

  • Docker 版本 18.09.1,构建 4c52b90
  • 内核 4.19.0-8-amd64
  • Debian 10(主机和 docker-image)
0 投票
1 回答
263 浏览

docker - 当 docker 容器使用主机挂载的卷启动时,磁盘 I/O 是多少?如何减少它?

在 RHEL上运行带有主机安装卷的 docker 容器时docker,我观察到在容器启动之前docker-compose有大量磁盘 I/O(使用)。dstatI/O 与dockerd进程相关联,我可以通过挂载或移除主机卷来明确增加或减少 I/O。如果我不挂载任何主机卷,容器会立即启动。如果我挂载的卷覆盖了文件系统的大部分,则 I/O 非常重要,在我的情况下,大约需要 20 Gb,这大约需要三分钟才能启动容器。在某些情况下,这会导致docker-compose up编排简单地超时。

典型的运行命令如下所示

无论卷是否是预定义的命名卷,以及是否使用语法将其标记为只读,都会发生 I/O。但是在定义外部命名卷时,它看起来像这样:

我假设 I/O 与覆盖文件系统有关,但我找不到任何关于正在写入的内容、写入位置以及如何优化配置以在容器启动之前需要更少 I/O 的明确解释. 明明不是整卷的内容,所以好像有什么区别?但是,想象一下我有某种大规模的数据管道,并且我想将我的容器指向包含 TB 文件的主机源或目标目录......如何安装主机卷而不影响容器启动延迟?

更新: 根据@BMitch 的指导,我专注于 SELinux 相关":z"标签。

简要历史: 最初(大约在发布前一年)没有此标签的 RHEL w/SELinux 服务器上的 docker 容器无法访问已安装的卷。尽管--volumes-from是一个不同的 cli 选项,但它具有其他来源在解决访问问题时所指的最佳解释:

像 SELinux 这样的标签系统要求在安装到容器中的卷内容上放置适当的标签。如果没有标签,安全系统可能会阻止在容器内运行的进程使用内容。默认情况下,Docker 不会更改操作系统设置的标签。要更改容器上下文中的标签,您可以将两个后缀 :z 或 :Z 添加到卷挂载中。这些后缀告诉 Docker 重新标记共享卷上的文件对象。z 选项告诉 Docker 两个容器共享卷内容。因此,Docker 使用共享内容标签来标记内容。共享卷标允许所有容器读/写内容。Z 选项告诉 Docker 使用私有非共享标签标记内容。

这个解释伴随着一个警告:其他地方:

使用 Z 选项绑定挂载系统目录(例如 /home 或 /usr)会使您的主机无法运行,您可能需要手动重新标记主机文件。

所以我用过":z",有时":ro,z"一切都很好。

事实证明,这个标签导致了预启动磁盘 I/O。我不太了解 SELinux 的安全性和标签,但我想 I/O 是在挂载卷时实际更改文件标签,因此文件越多,磁盘 I/O 越长。

我的观察是删除标签,什么都不做,会导致相同的行为。这意味着 docker 引擎现在的默认行为是将 SELinux 挂载的卷视为标记为":z". 我相信这是过去一年可能引入的一种新行为……或其他一些系统更改……因为现在可以在没有标签的情况下访问卷(或者标签可能是永久性的,允许后续的 docker 访问)。

但是,删除:z并不能解决 I/O 和较长的启动时间。然后我发现这个 github 对话声称 :z 和 :Z 都是潜在危险的选择和评论:

如果您的容器确实需要更广泛地访问系统目录,那么将“--security-opt label:disable”与“docker run”命令一起使用是更好的选择。请注意,使用上述选项将禁用对该容器的 SELinux 检查。

所以我添加了这个选项,事实上,卷是可访问的,并且磁盘 I/O和启动延迟为零(或最小)。

话虽如此,我真的不明白它的影响,--security-opt label:disable并欢迎任何额外的建议或解释。

0 投票
0 回答
41 浏览

filesystems - 我的嵌入式 linux 映像中的 /proc/filesystems 中没有 overlayfs

我用 yocto 为我的主板构建了一个嵌入式 linux Image,它可以正常工作。我想使用覆盖文件系统在只读根文件系统之上设置可写根文件系统覆盖。但该图像似乎不支持它,因为 /proc/filesystems 中没有覆盖文件!

如何为我的图像添加overlayfs支持?

0 投票
0 回答
55 浏览

linux - 单个大文件上的 OverlayFS

我想解决以下一组约束:

  1. 我希望能够挂载一个大型(16gb)远程文件的副本
  2. 如果应用程序写入文件的一部分,则将其写入本地副本,而不是通过网络同步
  3. 如果文件的一部分被读取,如果它以前被应用程序写入,它将读取本地副本。如果它从未被写入,它将首先从远程复制到本地,然后从本地读取
  4. 在写入之前从未读取过的文件部分不应通过网络传输(这是最重要的约束)
  5. 该文件将始终具有相同的大小,因此当我们从文件中读取特定字节时应该发生什么,永远不会有歧义。

造成这些限制的原因是,单个文件的绝大部分永远不会被读取,这样的文件很多(每个文件至少有一小部分被读取),并且网络带宽极其有限。

OverlayFS 非常接近我想要的。如果我能够在文件级别而不是目录级别应用overlayfs,我将使用(可能是安装了nfs 的)远程文件作为.lower_file和一个空的稀疏文件作为upper_file.

有什么可以让我做上述事情的吗?

0 投票
0 回答
136 浏览

raspberry-pi - RPi OverlayFS 和只读也将外部安装的驱动器变为只读/仅根

背景

我最近发现并尝试OverlayFSraspi-configRPi3 上使用openmediavault. 我正在尝试OverlayFS,因为 sdcard 上的系统太脆弱了。到目前为止,此功能能够防止 sdcard 出现故障。

问题

激活后,安装的外部硬盘似乎是“只读”的OverlayFS。更准确地说,外部驱动器是 root-only,它可以用sudo或在sudo su. 这是相当不方便的,因为该系统被配置为媒体中心,并且对所有内容都使用超级用户访问是没有意义的。

驱动器中的所有目录和文件似乎都在drwxr-xr-x并且root作为所有者和组(我没有注意是否在激活 OverlayFS 时是相同的情况)

进步与尝试

  • 我尝试添加rw/etc/fstab重新mount -a安装。但它仍然不能写给其他人。
  • sudo chmod +w执行但不生效。
  • sudo chown pi:pi结果是Operation not permitted
  • 修改/etc/fstab为 include rw,nofail,驱动器仍然是 root-only 访问。

问题

我仍在学习OverlayFS+read-only设置的性质,我有以下问题:

  1. 是因为OverlayFS+read-only设置,外部驱动器以 root 访问权限安装吗?

  2. 是否可以将OverlayFS+read-only与可写外部驱动器一起使用?

  3. 如果那不可能,在可写入外部驱动器的同时保护 sdcard 的任何其他技巧?

任何建议表示赞赏~

0 投票
0 回答
133 浏览

lxc - LXC 和 ZFS 问题中的 K0s

我正在尝试使用 ZFS 让 K0s 在 Ubuntu 20.04 上的 LXC (LXD) 容器中工作,并且我已经成功克服了 apparmor 挑战(至少目前如此),但在安装阶段遇到了 overlayfs 问题。

以前有没有人遇到过这个问题并有解决方案/解决方法?

问候, 马特

0 投票
0 回答
40 浏览

docker - 在 x86_64 上运行的 ARM 的 Docker 映像中使用交叉编译器覆盖本机编译器

现在,借助qemu-static. 粗略地说,这种方法允许 Linux 启动器检测二进制的 ARM 体系结构并将其传递给仿真器,为用户无缝地传递。尽管很多人甚至似乎在 CI 中部署了这种方法,但它在执行许多常规任务(例如编译)时速度很慢。简单的项目可能需要几个小时才能通过模拟器进行编译。这可以改进吗?

似乎有一个微不足道的改进想法。为什么不在 Docker 容器中使用 x86_64-arm 交叉编译器覆盖 ARM 编译器?它应该可以通过 Docker 覆盖实现,并且应该提供原生工具链的性能和效率。到目前为止,我没有看到有人这样做。

为了隐藏 ARM 编译器并用交叉编译器覆盖它,许多文件夹和单个文件必须被屏蔽(可以从包列表中获取)。你会如何建议执行这样的叠加?

0 投票
1 回答
114 浏览

docker - 将 overlay2 存储驱动程序与覆盖文件系统一起使用

目标

我在 live CD 中运行 docker,我想缓存 docker build 的结果,主要是在我重新启动到这张 live CD 时。我的想法是建立一个overlayfsin /var/lib/docker. 所以,我有以下内容/etc/fstab

但是,我想使用overlay2存储驱动程序。我很难让两者合作。我尝试了两种方法来使它起作用。

方法一(docker服务前mount

1a。启动docker.{socket,service}systemd 单元。

1b。开始overlayfs

这两个步骤都成功执行。但是,如果我尝试构建/运行新图像,则会收到以下错误。

失败类型 1

失败类型 2

方法二(服务mountdocker

2a. 开始overlayfs

2b。启动docker.{socket,service}systemd 单元。

2a. 成功(当然),但是 2b。失败。我试图捕获下面的一些 systemd 日志,以帮助诊断此问题。

失败类型 1

运行命令

journalctl

0 投票
0 回答
19 浏览

docker - buildx 和容器文件夹结构和overlayfs

我正在构建一个容器来托管一个基于 php 的 Web 应用程序,该应用程序带有一个带有 nginx 的 mariadb (mysql) 后端。当我运行 adocker buildx build ...时,它会处理整个 Dockerfile,其中包括:

. 拥有我所有的文件和子文件夹当它运行时,它会将所有内容存储在 /var/lib/buildkit/runc-overlayfs/snapshots/snapshots/63/fs/app...

为什么它会这样做,我如何使应用程序文件夹起作用或移动到 /app?mkdir 不这样做。cp不会做。它只是在这些 overlayfs 文件夹中构建更多文件夹。旁注 - 我似乎也无法整理这些文件/文件夹。如果我添加一个 RUN chown ...,它会将它们放入自己的快照中,我猜这会创建更多层。