オーバーレイをインストールするには、およびlowerdir
オプションを提供upperdir
します。workdir
設置(8)またはデータ取付(2)、コンマを避けるためにどのようなロジックを適用する必要がありますか?私は二重カンマと引用符を試しましたが、成功しませんでした。
私が望んでいたものとまったく一致しない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
ノート: カーネルがスペース、タブ、改行、小数点の 3 桁のバックスラッシュ文字をエスケープしている間、カンマもエスケープしましたが成功しません\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'
カーネルが8進数でエスケープするのは/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; }
バックスラッシュが横にある文字をエスケープしていることがわかります(したがって、以下で発生する可能性のある特定のコンマ処理を防止します)。