OverlayFS 有一个workdir
选项,除了两个其他目录lowerdir
和upperdir
,它需要是一个空目录。
不幸的是,overlayfs 的内核文档并没有过多地讨论这个选项的用途。
“workdir”必须是与 upperdir 位于同一文件系统上的空目录。
对于只读覆盖,workdir
可能是upperdir
. 这让我知道它与编写合并文件有关。
请解释workdir
在合并目录中写入或更改文件时发生的情况。为什么可写性upperdir
不够?
我一直在阅读有关联合文件系统的信息,该系统使用户能够同时将多个文件系统挂载到另一个文件系统之上。
但是,我在决定使用哪个(Unionfs vs Aufs vs Overlayfs vs mhddfs)时遇到了麻烦,为什么我没有在任何地方找到有关该主题的具体信息。我知道例如,overlayFS 已被主流 Linux 内核采用,这意味着它可能会得到更广泛的采用。如果有人能给我一些观点,我将不胜感激。
此外,我无法通过 LVM(由用户在单独的问题中推荐)或 RAID 设置之类的东西找到联合文件系统的任何构想用例,除非 LVM 需要格式化所有驱动器,如果您已经在驱动器上有有价值的数据。
我希望能够将覆盖挂载的上层文件系统的更改合并到下层文件系统。
我对在线(即在安装叠加层时合并)和离线(卸载叠加层然后合并)解决方案都感兴趣。
我找到了几个离线解决方案,我已将其添加为答案。
有谁知道任何在线解决方案?最好有一个“提交”类型的命令,您可以在仍安装覆盖层时运行以合并图层。
在以下问题中提出了类似的问题,但没有答案:
这些帖子中的评论提出了不同的mergefs和bcache,它们都解决了特定的用例,但不是覆盖提供的通用文件系统不可知的用例。
我的目标是拥有一个带有快照的安全文件系统沙箱,可用于任何 Linux 应用程序上的任何(如果可行)底层文件系统,允许您在准备好时回滚更改或手动提交它们。
我怀疑现代主流 Linux 具有所有必要的内置功能,这要归功于过去几年的所有沙箱/虚拟化创新,如果我知道如何使用它们就好了。
我希望 Linux 的OverlayFS在写入较低的文件时表现得像AUFS。我希望它写入到较低的目录。例如,我有两个名为L/lower
和 的文件U/upper
。
mount -t overlay -o lowerdir=L,upperdir=U,workdir=W overlay X
Run Code Online (Sandbox Code Playgroud)
这将合并L
并U
到名为单OverlayFS目录X
。所以现在这两个文件可以作为X/lower
和访问X/upper
。
然后我通过OverlayFS目录修改下层文件。这是它对我行为不端的地方:
echo 'This is a modification' >> X/lower
Run Code Online (Sandbox Code Playgroud)
它实际上并不修改较低的文件L/lower
。相反,它创建了一个新的上层文件,U/lower
并在那里写入我的修改。这不是我想要的。我想X
作为一个方便的单一访问点进行编辑。
如何进行修改以X/lower
写入L/lower
?
如何正确使用 OverlayFS 来保护我的根文件系统?
我有一个从 SD 卡启动和运行的嵌入式系统。由于它会突然断电,我想保护根文件系统。OverlayFS似乎是最简单的解决方案,但我发现的示例通常不涉及根文件系统和/或使用对我不利的 tmpfs,因为我的内存很少。
我正在使用CONFIG_OVERLAY_FS=y
启用的Linux 内核 4.4.0 。我的文件系统是xenial-base-armhf.tar.gz
,我已经完成了apt install -y overlayroot
。
我的 SD 卡看起来像:
# fdisk -l /dev/mmcblk1
Disk /dev/mmcblk1: 29 GiB, 31104958464 bytes, 60751872 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7f56a0ab
Device Boot Start End Sectors Size Id Type
/dev/mmcblk1p1 * 2048 1050623 …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来查询已挂载的覆盖文件系统 ( overlayfs
) 以检查它的上下目录,但直到现在我还没有找到任何合适的命令。有没有办法做这样的检查?
我overlayfs
使用如下命令安装了该命令:
mount -t overlayfs -o lowerdir=/mnt/root-ro,upperdir=/data/root-rw overlayfs-root ${rootmnt}
Run Code Online (Sandbox Code Playgroud)
该mount
命令没有给我足够的信息:
root@ubuntu12:~# mount -l
overlayfs-root on / type overlayfs (rw)
/dev/sda1 on /mnt/root-ro type ext4 (ro,relatime,data=ordered) [ROOT]
/dev/sdb1 on /data type ext4 (rw,errors=remount-ro) [DATA]
Run Code Online (Sandbox Code Playgroud) /var/log
我想使用overlayfs,而不是仅仅安装tmpfs 。
因此,结果应该是:日志写入 RAM,新旧引导日志可通过同一路径访问。有时,更改会通过脚本写入磁盘。
重点是要加快一点速度,并确保 SSD 免受多次写入的影响。
(我在 puppy linux 中看到了类似的事情,不是针对日志,而是针对 root 的所有更改,但如果不安装它就无法执行相同的操作,文档没有帮助)
我将根据答案对浏览器 cookie/缓存执行相同的操作。但持久写入将在浏览器关闭时完成。无法关闭浏览器缓存,至少需要小缓存才能在我的 Web 开发中出现与用户因缓存而出现的相同错误。
我是 Linux 新手。我将 armbian 安装到 SD 卡上,一切正常。SD卡是64GB的。然后我安装了 docker.io、docker-compose 和 portainer,仅此而已。
\n当我使用 lsblk 检查磁盘空间时:
\n # lsblk\nNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT\nmmcblk0 179:0 0 59.5G 0 disk\n\xe2\x94\x9c\xe2\x94\x80mmcblk0p1 179:1 0 512M 0 part /boot\n\xe2\x94\x94\xe2\x94\x80mmcblk0p2 179:2 0 58.4G 0 part /\nmmcblk1 179:32 0 14.6G 0 disk\nmmcblk1boot0 179:64 0 4M 1 disk\nmmcblk1boot1 179:96 0 4M 1 disk\nzram0 254:0 0 50M 0 disk /var/log\nzram1 254:1 0 929.4M 0 disk [SWAP]\n
Run Code Online (Sandbox Code Playgroud)\n然后用 df:
\n# df -h\nFilesystem Size Used Avail Use% Mounted on\nudev …
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置一个 PXEboot 环境,其中基本系统(通过 NFS 提供给 PXE 客户端)是只读的,根文件系统是一个覆盖文件系统,只读 NFS 基本系统作为lowerdir 和一个 tmpfs作为上层/工作目录。
我编辑了一个 AuFS initramfs 脚本来使用 OverlayFS,它运行良好,除了当您尝试编辑位于 lowerdir 中的文件(例如 /etc/environment)时,它以只读方式打开,即对于新文件(例如 /etc/foobar)或已复制到上层目录的文件,情况并非如此。通过在尝试编辑文件之前简单地进行触摸可以缓解该问题,但是,它不太理想并且可能会破坏其他应用程序。
AuFS 没有这个问题。有什么建议吗?这是 initramfs 脚本的相关部分(在 /etc/initramfs-tools/scripts/init_bottom/00_overlayfs_init 中),为简洁起见进行了编辑。
mkdir /overlay
mkdir /local
mkdir /remote
# mount the temp file system and move real root out of the way
mount -t tmpfs none /local
mount --move ${rootmnt} /remote
mkdir /local/rw
mkdir /local/work
mount -t overlayfs -o lowerdir=/remote,upperdir=/local/rw,workdir=/local/work overlay /overlay
#test for mount points on overlay file system
[ -d /overlay/ro ] …
Run Code Online (Sandbox Code Playgroud) 我一直在尝试将根(/)挂载为overlayfs。
操作系统正在通过 NFS 启动到 RAM。我在 initrd 中添加了一个预安装脚本,它创建了“work”、“upper”和“lower”目录。
在引导过程中,我将 NFS 的内容复制到“较低”目录。之后 Overlayfs 将被挂载到 ${rootmnt} 中。
最后,init 脚本 chroots 到 ${rootmnt} (接下来,从真正的 root 初始化等等......)并且操作系统工作正常。
当然,我看不到“工作”和“上层”目录。我怎样才能做到这一点?我必须在 initrd 中更改什么?