という話をザックリと。
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]] 環境は、
で紹介した手法を使い、
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
に引数で直接バイナリを指定する、とかしか多分方法はないと思います。