要安装覆盖层,请给出lowerdir
,upperdir
并且workdir
作为选项安装(8)或数据安装(2),应用什么逻辑来转义逗号?我尝试过双逗号,甚至引用都没有成功。
我发现有两种解决方法并不完全是我想要的:
相对路径:只要最后一个组件没有逗号,以下工作有效:
mkdir /tmp/a,b /tmp/a,b/{upper,lower,work,merged} cd /tmp/a,b sudo mount \ -t overlay \ -o 'lowerdir=./lower,upperdir=./upper,workdir=./work' \ overlay \ '/tmp/a,b/merged'
但我强调,如果最后一个组件包含逗号,它就不起作用。
安装后移动路径:我相信内核会保留
inode
轨道,因为选项值/proc/self/mountinfo
不会改变:mkdir /tmp/a\ b /tmp/a\ b/{upper,lower,work,merged} sudo mount \ -t overlay \ -o 'lowerdir=/tmp/a b/lower,upperdir=/tmp/a b/upper,workdir=/tmp/a b/work' \ overlay \ '/tmp/a b/merged' mv '/tmp/a b' '/tmp/a,b' fgrep merged /proc/self/mountinfo 314 86 0:56 / /tmp/a,b/merged rw,relatime shared:217 - overlay overlay rw,lowerdir=/tmp/a\040b/lower,upperdir=/tmp/a\040b/upper,workdir=/tmp/a\040b/work
笔记:当内核转义空格、制表符、换行符和具有三位十进制数字的反斜杠字符时,我也尝试转义逗号但\044
没有成功,似乎它想再次转义反斜杠。
答案1
反斜杠将转义它。由于 mount 命令按原样发送它(可以看出斯特雷斯),这必须是使用反斜杠对其进行转义的内核。
mount -t overlay \
-o 'lowerdir=/tmp/a\,b/lower,upperdir=/tmp/a\,b/upper,workdir=/tmp/a\,b/work' \
overlay '/tmp/a,b/merged'
我认为内核在八进制中的转义/proc/mounts
是为了帮助解析器:a,
始终是分隔符。然后由解析器最终解析\134\054
为路径或文件名的一部分。\,
,
这是overlayfs处理内核选项的一部分,在linux/fs/overlayfs/super.c
:
static char *ovl_next_opt(char **s) { char *sbegin = *s; char *p; if (sbegin == NULL) return NULL; for (p = sbegin; *p; p++) { if (*p == '\\') { p++; if (!*p) break; } else if (*p == ',') { *p = '\0'; *s = p + 1; return sbegin; } } *s = NULL; return sbegin; }
其中可以看到反斜杠转义了它旁边的字符(从而避免了下面可能发生的对逗号的特定处理)。