![재정의된 설치 옵션에서 쉼표를 피하는 방법](https://linux55.com/image/164165/%EC%9E%AC%EC%A0%95%EC%9D%98%EB%90%9C%20%EC%84%A4%EC%B9%98%20%EC%98%B5%EC%85%98%EC%97%90%EC%84%9C%20%EC%89%BC%ED%91%9C%EB%A5%BC%20%ED%94%BC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
오버레이를 설치하려면 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'
커널이 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; }
백슬래시가 옆에 있는 문자를 이스케이프하는 것을 볼 수 있습니다(따라서 아래에서 발생할 수 있는 특정 쉼표 처리를 방지함).