という話をザックリと。
Mirror-DTC とは?
で、公開されているデスクトップのリモートアクセス用のソフトウェア。いわゆる VNC や RDP の類い。
なお、 Mirror-DTC は、 ソフトウェア は実行バイナリがコンパイルされた状態で配布されている、 無償利用が可能な クローズドソース なソフトウェアです。(いわゆる フリーソフト の類い)
Mirror-DTC の Ubuntu 16.04 用 Client を NixOS で実用したとは?
それで、Mirror-DTC は公式には、
- Windows 7 - Windows 10(Client, Server)
- OSX 10.8 - macOS 10.13 (Client, Server)
- Ubuntu 14.04 LTS - Ubuntu 16.04 LTS (Client, Server)
- Android 2.3 - Android 7.1 (Client)
という環境での動作がサポートされていているものの、Linux 用の Executable Binary は Ubuntu 用しか存在せず、 Ubuntu 系 Distro 以外での動作はサポート外で、かつ、色々ハックしないと動かない、と言う面倒な感じになる。
……のだけれども、そう言う 特定 Distro 向けの Executable Binary を編集して利用可能にする 、 というのは NixOS では割と普通に行われる手法 なので、 今回はその辺りを自前で行なった 。
で、ゴチャゴチャと解説してきたけど、実際に使っている nixpkgs
向けのパッケージ定義はコチラ:
{ stdenv, requireFile, unzip, patchelf, xorg, gtkmm3, atkmm, pangomm, cairomm, glibmm, glib, gtk3, gdk_pixbuf, libsigcxx, expat, zlib, libdrm, libpulseaudio }: stdenv.mkDerivation rec { name = "mirror-dtc-client-${version}"; version = "1.3.1"; src = requireFile { name = "MirrorDTC_U131.zip"; sha256 = "1i3s7sxb4y7vqsql0d1k400cqy1pmjmh3zvcpy9bmi8779n0kyh3"; url = "http://t-ishii.la.coocan.jp/hp/mc/index.html"; }; nativeBuildInputs = [ unzip patchelf ] ; buildInputs = (with xorg; [ libpthreadstubs libxcb libxshmfence libXdamage libXfixes libX11 libXxf86vm libXext libXau libXdmcp ]) ++ [ gtkmm3 atkmm pangomm cairomm glib glibmm gtk3 gdk_pixbuf libsigcxx zlib libdrm libpulseaudio stdenv.cc.cc ]; libPath = (stdenv.lib.makeLibraryPath buildInputs) + ":/run/opengl-driver/lib"; unpackPhase = '' unzip ${src} ''; dontStrip = true; dontPatchelf = true; installPhase = '' mkdir -p $out/bin cp MirrorDTC_U131/Client/bin/MCClient.ini $out/bin cp MirrorDTC_U131/Client/bin/mcclientu1604_64 $out/bin/mcclient patchelf \ --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" \ --set-rpath ${libPath} \ $out/bin/mcclient ''; }
それで、本当にコレで動くのか、と言うと、ワリとすんなり動いていて、 実際 Dell XPS 9560 と Mac mini late 2012 を Etherenet 経由で直結してその上で Mirror-DTC を動かしているけど、本当に普通に動く。
ちなみに、 Mac mini late 2012 の macOS High Sierra 環境は、
[#FIXME:embed:title=Mac mini late 2012 と Dell XPS 9560 で最高の Retina Mac 環境を手にいれた話]
で紹介した手法を使い、
Headless で、かつ 4k (実際には 3k) での表示可能にした
という状態で運用している。
但し、NixOS での動作は、公式の動作確認からは外れるし、あと、 そもそも個人の方が開発されている 無料ソフトウェア なので、 実際に実用する際にはその辺りは念頭に入れておくこと。
以上
ちなみに、NixOS で実行バイナリを編集して云々する場合、
ldd
で実行バイナリが依存する動的ライブラリを調べる- そのライブラリのパスを
patchelf
でrpath
に仕込む - かつ、実行バイナリの
interpreter
に$(cat $NIX_CC/nix-support/dynamic-linker)
で NixOS の glibc にリンクさせる
という手法で、おおよそはなんとかなったりする。
ただ、中には Golang の Exectable Binary の様に、
patchelf
と 相性が悪いモノも存在するので、その辺りは自前でコンパイルをがんばるか、
あるいは、LD_LIBRARY_PATH
を設定した上、linux-ld.so
に引数で直接バイナリを指定する、とかしか多分方法はないと思います。