在 ramdisk(tmpfs)上运行 cachefilesd 缓存以进行 PXE NFS 启动

在 ramdisk(tmpfs)上运行 cachefilesd 缓存以进行 PXE NFS 启动

我正在通过 PXE 运行 ubuntu 20.04 LTS(内核5.4.0-81-generic),并且希望添加本地缓存。因为我不想在所有设备上都设置一个用于缓存的分区,所以我希望为此使用 ramdisk。

我已设法fsc在启动过程中启用该选项这个答案

但是,当我运行该cachefilesd服务时,它会失败,-95: Operation not supported.这可能是因为tmpfs不支持user_xattr必需的。

我读过了这里您可以编译/修补内核以启用user_xattr,尽管这存在安全风险。除了维护麻烦之外,我不希望走那么远,也不想在每次内核更新时都花大力气来自动化它。

我读过了这里(德语)和而且它回复

它表明您可以创建一个 tmpfs,然后创建一个环回设备,将其格式化为 ext4,然后在其上运行您的 fs-cache。

但是,由于我使用的是 PXE 并且 NFS 挂载点是,那么我在启动期间(最好是在启动/之前)该如何执行此操作?cachedfilesd.service

我的引导程序(vesamenu.c32

# [...]
label                   ubuntunfs
        menu label      ^Ubuntu NFS
        text help
Run ubuntu from Network File System.
        endtext
        kernel          ubuntu/boot/vmlinuz
        initrd          ubuntu/boot/initrd.img
        append          root=/dev/nfs nfsroot=192.168.1.5:/srv/tftp/ubuntu,rw,fsc,relatime ip=dhcp rw
# [...]

我的 fstab

/proc    /proc    proc    defaults   0 0
/sys     /sys     sysfs   defaults   0 0
/dev/nfs /        nfs     defaults,relatime,fsc   1 1

# ramdisk for fs-cache for nfs
tmpfs    /media/ramdisk    tmpfs    defaults,size=5%      0       0

none            /tmp            tmpfs   defaults        0       0
none            /var/run        tmpfs   defaults        0       0
none            /var/lock       tmpfs   defaults        0       0
none            /var/tmp        tmpfs   defaults        0       0

我的 /etc/cachefilesd.conf

dir /media/ramdisk
tag mycache
brun 90%
bcull 70%
bstop 30%
frun 90%
fcull 70%
fstop 30%

culltable 14

答案1

我通过 systemd 服务完成了此操作。

[Unit]
Description=Cache creator
Before=cachefilesd.service

[Service]
ExecStart=/bin/bash -c "dd if=/dev/zero of=/media/ramdisk/cache.ext4 bs=1k count=`df /media/ramdisk | tail -n 1 | sed -e 's/ \+/ /g' | cut -d ' ' -f 2` && mke2fs /media/ramdisk/cache.ext4 && mount -o rw,noatime,nodiratime,user_xattr /media/ramdisk/cache.ext4 /media/cache/"
Restart=no
Type=oneshot

[Install]
WantedBy=multi-user.target

该脚本将dframdisk 的 1k 块计数(来自)作为dd的输入文件(if=)参数的输入,否则 dd 将返回错误代码,因为磁盘已满,并且&&在这种情况下无法工作。显然,这仅在 ramdisk 为空时才有效。

相关内容