
저는 참조 소스 파일 등에 대한 절대 경로에 의존하는 빌드 시스템을 사용하고 있습니다. 다른 툴체인을 사용하여 빌드를 테스트하려면 VM 또는 chroot에 src 디렉터리를 마운트합니다. 문제는 내 호스트 컴퓨터의 src 디렉터리 경로가 매우 복잡하고(예: /a/b/c/d/src) 마운트된 경로와 일치해야 한다는 것입니다.
내 src 디렉토리를 /mnt/src와 같은 곳에 마운트하고 싶지만 결국 /mnt/src에 대한 심볼릭 링크 /a/b/c/d/src를 만들거나 마운트 지점을 다음 위치에 두어야 합니다. /a/b/c/d/src 직접.
파일 시스템에 /a/b/c/d가 있으면 지저분하게 느껴지며 일반적으로 /a/b/c/d(또는 상위 디렉토리)에 파일을 생성할 권한조차 없을 수도 있습니다. 내 빌드 시스템을 달래기 위해 이 경로를 가짜로 만들 수 있는 방법이 있나요?
답변1
가장 좋은 해결책은 소스 경로와 설치 경로가 동일하지 않다는 것을 빌드 시스템에 가르치는 것이지만, 나는 그렇게 할 수 없다고 가정하겠습니다.
가장 간단한 방법은 소스 경로를 다음과 같이 쉽게 재현할 수 있도록 배열하는 것입니다./var/tmp/mybuild
. 빌드 시스템이 그다지 불쾌하지 않다면 파일이 있는 위치에 대한 심볼릭 링크를 만드는 것으로 충분합니다. 빌드 시스템이 심볼릭 링크 정규화를 요구한다면, 다음을 사용하여 이를 속일 수 있어야 합니다.바인드 마운트대신에. binfs를 사용하면 루트 권한이 필요하지 않으며 파일을 표시하려는 위치에 대한 쓰기 권한만 있으면 됩니다.
소스 시스템에서 조치를 취할 수 없는 경우 대체 접근 방식은 다음과 같습니다.특정 파일 액세스를 리디렉션하는 동적 라이브러리를 미리 로드합니다.. 이는 실행될 모든 실행 파일이 동적으로 링크되어 있다고 가정합니다. 링크된 예제의 코드는 특정 파일에서 이를 수행하는 방법을 보여줍니다. 경로가 특정 접두사로 시작하는 모든 파일을 리디렉션하도록 조정할 수 있습니다. 바꾸다
if (!strcmp(path, FROM)) {
path = TO;
}
…
return ret;
(테스트되지 않은) 것과 같은 것으로
char *other_path = NULL;
if (!strncmp(path, FROM, strlen(FROM))) {
other_path = malloc(strlen(path) - strlen(FROM) + strlen(TO) + 1);
if (other_path == NULL) return -ENOENT; // return NULL in fopen
memcpy(other_path, TO, strlen(TO));
memcpy(other_path + strlen(TO), path + strlen(FROM), strlen(path) - strlen(FROM) + 1);
path = other_path;
}
…
free(other_path);
return ret;
답변2
테스트 빌드의 잔여물로 "호스트"를 오염시키는 것을 방지하는 것이 목표라면 firejail
영구 오버레이를 사용하여 내부를 구축하는 것이 좋은 선택이 될 것입니다. 이러한 접근 방식을 사용하면 실제처럼 빌드하고 설치할 수도 있지만 파일은 "실제" 파일 시스템을 오염시키기보다는 오버레이로 종료됩니다.
오버레이 내에서 테스트 빌드 결과를 찾아야 한다는 단점이 있지만 동시에 이는 비교 또는 나중에 필요할 수 있는 기타 포렌식 등을 위해 연속적인 테스트 빌드 결과를 보존할 수 있는 장점이 있습니다. 하다.