完全なパスが存在しないディレクトリパスを偽装する

完全なパスが存在しないディレクトリパスを偽装する

私は、ソース ファイルなどを参照するために絶対パスに依存するビルド システムを使用しています。さまざまなツールチェーンでビルドをテストする場合は、VM または chroot で src ディレクトリをマウントします。問題は、ホスト マシン上の 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 (または親ディレクトリのいずれか) にファイルを作成する権限すら持っていないかもしれません。ビルド システムを満足させるためにこのパスを偽装する方法はありますか?

答え1

最善の解決策は、ソース パスとインストール パスは同じではないことをビルド システムに教えることですが、それはできないと想定します。

最も簡単な方法は、ソースパスを のように簡単に再現できるものにすることです/var/tmp/mybuild。ビルドシステムがそれほど厄介でなければ、これをファイルが配置されている場所へのシンボリックリンクにするだけで十分です。ビルドシステムがシンボリックリンクを正規化するように要求する場合は、バインドマウント代わりに、bindfs では、ルート権限は必要ありません。ファイルを表示する場所に対する書き込み権限のみが必要です。

ソースシステムで対処できない場合は、別の方法として、特定のファイルアクセスをリダイレクトする動的ライブラリをプリロードする. これは、実行されるすべての実行ファイルが動的にリンクされていることを前提としています。リンクされた例のコードは、特定のファイルからこれを行う方法を示しています。パスが特定のプレフィックスで始まるすべてのファイルをリダイレクトするように調整できます。

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永続的なオーバーレイを使用して 内でビルドするのが良い選択肢です。このアプローチでは、実際のようにビルドされ、インストールされる場合もありますが、ファイルは「実際の」ファイル システムを汚染するのではなく、オーバーレイ内に保存されます。

テスト ビルドの結果をオーバーレイ内で見つける必要があるという欠点がありますが、同時に、連続したテスト ビルドの結果を保存できるという利点もあります。たとえば、比較したり、後で必要になる可能性のあるその他のフォレンジックを行うために保存できます。

関連情報