2人用コンピュータをインストールしました。コンピュータのオンボードグラフィックスカード(インテル)を使用して1台のX11サーバーを起動し、専用グラフィックカード(nvidia)を使用して別のX11サーバーを起動しました。 OpenGLを除くすべてがうまくいきます。現在、nvidiaパッケージとintel OpenGLパッケージの/libファイルの競合のため、nvidia-seatにのみOpenGLがあります。
あるユーザーに別のパスのライブラリを使用するように強制する方法はありますか?
私が見つけたすべての汎用/libはシステム全体(ldconfig)に影響します。 FUSEも考えてみましたが、一般的なセキュリティとパフォーマンスの問題が心配です。 chrootは、すべてのファイルを2倍にして維持する必要がない場合にのみ機能します。 Unionfsがユーザー依存のオーバーライドを許可している場合は正しいように見えますが、私はUnionfsを台無しにしたことはなく、それが可能であることを示唆しているものが見つかりませんでした。
答え1
プログラムが動的にリンクされている場合は、各セッションに対してLD_LIBRARY_PATHを定義して、IntelおよびNvidia共有ライブラリを含む他のディレクトリを指すように定義し、システムのデフォルトライブラリのみを/libに保存します。
答え2
次の試みは、同じXorgファイルツリーを含む2つの別々のchrootファイルツリーを使用して2つの異なるXorgサーバーを実行し、ユーザースペースでLD_LIBRARY_PATHを引き続き使用することでした。
Xorgを実行するには、すべてのXorg関連ライブラリとプログラムをchrootに入れる必要があります。これは、debian chrootなどの自動化されたツールを使用したり手動で実行したりできます。以下は、この作業を手動で行う方法の簡単な入門書です(実際には、以前はmuslシステムではかなりうまくいきました)。
- /X11/nvidia(および/X11/intel)などの別のchrootディレクトリを作成します。
- 以前のシステムのレイアウトを反映して、X11バイナリとライブラリをここに配置します(たとえば、Xorgを/ X11 / nvidia / usr / binに配置し、libX * .so *を/ X11 / nvidia / usr / libに配置し、Coreライブラリを/lib を /X11/nvidia/lib に - 通常はバージョン番号が前に付いているので、どのバージョンか簡単に見つけることができます。
- Xサーバーが依存するディレクトリ/usr/lib/X11または/usr/lib/xorgを忘れないでください。これには、さまざまなデバイス用のモジュールとドライバが含まれており、もちろんnvidia / intelドライバセクションも含まれています。
- /X11/nvidia/bin/sh や /X11/nvidia/sbin/modprobe などの項目が必要な場合があります。必要なディレクトリを作成し、ホストシステムのバイナリをここに配置します。
- /X11/nvidia/tmp、/X11/nvidia/var/lib/xkb、/X11/nvidia/var/logも必要です。
- この時点で、/X11/nvidiaを/X11/intelにコピーできます。
- 適切な場所で libglx.so ファイルやその他のドライバー部分を見つけてコピーします。
- /X11/nvidia/dev および /X11/intel/dev (以前に作成されたディレクトリ) のそれぞれに /dev マウントをバインドするか、後で strace ツールを使用して各デバイスがデバイスノードをコピーしようとするために必要なものが正確に何であるか監視できます。
- また、バインドマウントは/procおよび/sysです。
- / etc / X11にX11構成がある場合は、各デバイスの各構成を各chroot / etcディレクトリにコピーします。
この時点でchrootされたX11サーバーを準備する必要があります。ただし、多くのディストリビューション関連のエントリは他の最新の依存関係を課しているため、これを破ることができます(他のデーモンをchrootにコピーして起動する必要があるかもしれません)。
クライアントの設定:クライアントが他のドライバライブラリを指すようにするには、LD_LIBRARY_PATHを使用します。クライアントをchrootに入れることもできますが(ファイルツリーのレイアウトを大幅に変更する必要はありません)、最終的にシステムを2回ミラーリングすることがあります。
X11ソケットが失われても、クライアントは正常に接続する必要があります。これは、strace出力で見ることができる既存のソケットを必要とせずにconnect()を呼び出すときにXサーバーによって登録された抽象名を使用するためです。ただし、システムに既存のソケットが必要な場合は、mount /tmpをバインドする必要があります。
あるいは、Xorgサーバーを追跡してロードするための間違ったライブラリを見つけ、LD_PRELOADとLD_LIBRARY_PATHを使用して正しい場所を指すように努力する必要があります。ストレス働かなければならないrootとして(sudo -iを実行した場合、またはrootとしてログインした場合)そうでない場合は、これは間違いなくバグです。