Mirror-DTC の Ubuntu 16.04 用 Client を NixOS で実用してみた

という話をザックリと。

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 9560Mac mini late 2012 を Etherenet 経由で直結してその上で Mirror-DTC を動かしているけど、本当に普通に動く。

ちなみに、 Mac mini late 2012macOS High Sierra 環境は、

で紹介した手法を使い、

Headless で、かつ 4k (実際には 3k) での表示可能にした

という状態で運用している。

但し、NixOS での動作は、公式の動作確認からは外れるし、あと、 そもそも個人の方が開発されている 無料ソフトウェア なので、 実際に実用する際にはその辺りは念頭に入れておくこと。

以上

ちなみに、NixOS で実行バイナリを編集して云々する場合、

  • ldd で実行バイナリが依存する動的ライブラリを調べる
  • そのライブラリのパスを patchelfrpath に仕込む
  • かつ、実行バイナリの interpreter$(cat $NIX_CC/nix-support/dynamic-linker) で NixOS の glibc にリンクさせる

という手法で、おおよそはなんとかなったりする。

ただ、中には GolangExectable Binary の様に、 patchelfと 相性が悪いモノも存在するので、その辺りは自前でコンパイルをがんばるか、 あるいは、LD_LIBRARY_PATH を設定した上、linux-ld.so に引数で直接バイナリを指定する、とかしか多分方法はないと思います。

nyarlaが大体

Scrapbox.io でコメントや意見を書く