소스 파일 등에 대한 절대 경로를 참조하는 빌드 시스템을 사용하고 있습니다. 다른 툴체인을 사용하여 빌드를 테스트하려면 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
지속적인 오버레이를 사용하여 자체적으로 구축하는 것이 좋은 선택이 될 것입니다. 이렇게 하면 실제처럼 구축하고 설치할 수 있지만 파일은 "실제" 파일 시스템을 오염시키는 대신 오버레이에 남게 됩니다.
단점은 커버리지 계층에서 테스트 빌드 결과를 찾아야 한다는 점이지만, 동시에 이는 비교 또는 기타 후속 포렌식을 위해 연속 테스트 빌드의 결과를 유지하는 이점이 있을 수 있습니다. 할 것.