재정의된 설치 옵션에서 쉼표를 피하는 방법

재정의된 설치 옵션에서 쉼표를 피하는 방법

오버레이를 설치하려면 lowerdir및 옵션을 제공 upperdir하십시오 .workdir설치(8)또는 데이터설치(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
    

노트: 커널이 공백, 탭, 줄 바꿈 및 소수점 세 자리의 백슬래시 문자를 이스케이프하는 동안 쉼표도 이스케이프 처리했지만 \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;
}

백슬래시가 옆에 있는 문자를 이스케이프하는 것을 볼 수 있습니다(따라서 아래에서 발생할 수 있는 특정 쉼표 처리를 방지함).

관련 정보