オーバーライドされたインストールオプションでカンマを回避する方法

オーバーライドされたインストールオプションでカンマを回避する方法

オーバーレイをインストールするには、およびlowerdirオプションを提供upperdirします。workdir設置(8)またはデータ取付(2)、コンマを避けるためにどのようなロジックを適用する必要がありますか?私は二重カンマと引用符を試しましたが、成功しませんでした。

私が望んでいたものとまったく一致しない2つの解決策を見つけました。

  1. 相対パス:以下は、最後のコンポーネントにカンマがない限り機能します。

    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'
    

    ただし、最後のコンポーネントにコンマが含まれていると機能しないことを強調します。

  2. インストール後のパスの移動: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;
}

バックスラッシュが横にある文字をエスケープしていることがわかります(したがって、以下で発生する可能性のある特定のコンマ処理を防止します)。

関連情報