![如何通过 systemd 挂载单元挂载包含非 ASCII(西里尔字母)字母的文件夹?](https://linux22.com/image/218988/%E5%A6%82%E4%BD%95%E9%80%9A%E8%BF%87%20systemd%20%E6%8C%82%E8%BD%BD%E5%8D%95%E5%85%83%E6%8C%82%E8%BD%BD%E5%8C%85%E5%90%AB%E9%9D%9E%20ASCII%EF%BC%88%E8%A5%BF%E9%87%8C%E5%B0%94%E5%AD%97%E6%AF%8D%EF%BC%89%E5%AD%97%E6%AF%8D%E7%9A%84%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%9F.png)
我想为下一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-escape
for 单位文件名和 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
是正确的文件名。反斜杠很重要!