如何通过 systemd 挂载单元挂载包含非 ASCII(西里尔字母)字母的文件夹?

如何通过 systemd 挂载单元挂载包含非 ASCII(西里尔字母)字母的文件夹?

我想为下一fstab行创建等效的 systemd 安装单元

/dev/sdc1 /жышы ext4 defaults 1 2

诸如此类的东西
жышы.mount

[Unit]
Description= /dev/sdc1 to /жышы

[Mount]
What=/dev/sdc1
Where=/жышы
Type=ext4

[Install]
WantedBy=multi-user.target

是的,我尝试使用systemd-escapefor 单位文件名和 for Where,但没有成功。我更好的方法是:
xd0xb6xd1x8bxd1x88xd1x8b.mount

[Unit]
Description= /dev/sdc1 to /жышы

[Mount]
What=/dev/sdc1
Where='/жышы'
Type=ext4

[Install]
WantedBy=multi-user.target

这个变体几乎可以工作(单位文件名没有错误),但安装/dev/sdc1到自动创建的文件夹/xd0xb6xd1x8bxd1x88xd1x8b代替/жышы。

请帮忙解决这个烂摊子。

答案1

man systemd.mount

挂载单元必须以其控制的挂载点目录命名。示例:挂载点 /home/lennart 必须在单元文件 home-lennart.mount 中配置。有关用于将文件系统路径转换为单元名称的转义逻辑的详细信息,请参阅systemd.unit(5)

好的,所以从man systemd.unit

转义算法的操作如下:给定一个字符串,任何“/”字符都被替换为“-”,所有其他非 ASCII 字母数字、“:”、“_”或“.”的字符都被替换。被 C 风格的“\x2d”转义所取代。此外, ”。”当它作为转义字符串中的第一个字符出现时,将被替换为此类 C 样式转义。

当输入符合绝对文件系统路径时,该算法会稍微扩展:根目录“/”的路径被编码为单破折号“-”。此外,在转换之前,所有前导、尾随或重复的“/”字符都会从字符串中删除。示例:/foo//bar/baz/ 变为“foo-bar-baz”。

这种转义是完全可逆的,只要知道转义的字符串是否是路径(路径和非路径字符串的转义结果不同)。该systemd-escape(1)命令可用于对任意字符串应用和反转转义。用于systemd-escape --path转义路径字符串,否则systemd-escape不使用--path

所以,我们跑

systemd-escape --path /жышы

并得到

\xd0\xb6\xd1\x8b\xd1\x88\xd1\x8b

所以,\xd0\xb6\xd1\x8b\xd1\x88\xd1\x8b.mount是正确的文件名。反斜杠很重要!

相关内容