Mount
偽造不存在完整路徑的目錄路徑
我正在使用一個依賴絕對路徑來引用源文件等的建構系統。當我想使用不同的工具鏈測試建構時,我將 src 目錄安裝在 VM 或 chroot 中。問題是我的主機上的 src 目錄的路徑非常複雜——比如說 /a/b/c/d/src——它必須與安裝的路徑匹配。
我希望能夠將我的 src 目錄掛載在 /mnt/src 之類的地方,但我總是最終需要創建一個符號連結 /a/b/c/d/src 到 /mnt/src,或者只是將掛載點放在/a/b/c/d/src 直接。
在文件系統中有 /a/b/c/d 感覺很髒,通常你甚至可能沒有權限在 /a/b/c/d(或任何父目錄)中創建文件。有沒有辦法偽造這條路徑來安撫我的建構系統?
最好的解決方案是讓建構系統知道源路徑和安裝路徑不是一回事,但我假設你不能那樣做。
最直接的方法是將源路徑安排為可以輕鬆複製的東西,例如
/var/tmp/mybuild
. 如果建構系統不太令人討厭,那麼將其作為指向文件所在位置的符號連結就足夠了。如果建構系統堅持規範化符號連結,您應該能夠通過使用綁定掛載來欺騙它。使用 bindfs,您不需要 root 權限,您只需要對要使文件出現的位置具有寫入權限即可。如果您不能對源系統採取行動,另一種方法是預載入一個動態庫來重定向某些文件訪問。這假定所有將要執行的執行檔都是動態連結的。連結範例中的程式碼展示瞭如何從特定文件執行此操作;可以對其進行調整以重定向路徑以某個前綴開頭的所有文件。代替
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;