管理者権限を持っていたら、普通にchrootすればよいのだけど、共用パソコンなどでroot権限なしで頑張る方法。
dotnet coreをCentOS5でも動かしたくて頑張ってみた。惜しいところまではいったけど、途中で力尽きた。
ちなみに、chrootでOSのバージョンを疑似的に上げられるのは、ホストLinuxカーネルが対応している最大のglibcのバージョンまで。
CentOS5->6は可能だけど、5->7は無理。
必要なもの:fakeroot, fakechroot
https://github.com/mackyle/fakeroot
https://github.com/dex4er/fakechroot/wiki
それぞれgit cloneして、configure, make, make installだったと思う。(適当)
これらをインストールした先は
/opt/fakeroot
/opt/fakechroot
とする。
CentOS6のファイルたちは適当にdockerあたりで最小構成でpullして
docker run -it centos:centos6 /bin/bash
で起動して、
/bin
/etc
/lib
/lib64
/sbin
/usr
/var
辺りをコピーしてくる。細かいところは普通にchrootするときにmknod, mountしないといけないファイル以外全部取ってくればよい。
最低限chrootバイナリを持っているイメージを使用すること。持っていたら/usr/sbin/chrootにある。
取ってきたファイルは、CentOS5では
/opt/centos6
に置くとする。
fakechrootの場合、mknod, mountは出来ないので、その代わり
ln -s /dev /opt/centos6/dev
ln -s /proc /opt/centos6/proc
などとすれば、fakechroot後にそのディレクトリが見える。
いよいよ疑似CentOS6に入る。
FAKECHROOT_ELFLOADER=/opt/centos6/lib64/ld-2.12.so LD_PRELOAD=/opt/fakeroot/lib/libfakeroot.so:/opt/fakechroot/lib/fakechroot/libfakechroot.so /opt/centos6/lib64/ld-2.12.so --library-path /opt/centos6/lib64:/opt/centos6/lib:/opt/centos6/usr/lib64:/opt/centos6/usr/lib --inhibit-rpath /lib64:/lib:/usr/lib64:/usr/lib /opt/centos6/bin/bash
これで、疑似的にrootになったCentOS5のシェルに入れる。
で、最後にchrootしてCentOS6へ。
export LD_LIBRARY_PATH=/opt/centos6/lib:/opt/centos6/lib64:/opt/centos6/usr/lib64:/opt/centos6/usr/lib
/opt/centos6/usr/sbin/chroot /opt/centos6
そのあと、gccを入れ替えないとdotnet coreが動かないのでソースからgccをコンパイルして入れ替えたけど、まだ、
bash-4.1# /opt/dotnet/dotnet
realpath(): Too many levels of symbolic links
Failed to resolve full path of the current executable [/proc/self/exe]
となってしまって、dotnet coreは動いていない。
dotnet coreは何やら/proc/self/exeに作られたシンボリックリンクから自分の実行ファイル名をとってきているっぽい。
そこで、/procはもとのCentOS6のイメージからフォルダごとコピーしちゃって、/opt/dotnet/dotnetのシンボリックリンクを/proc/self/exeに作る。
すると、
bash-4.1# /opt/dotnet/dotnet
Usage: dotnet [options]
Usage: dotnet [path-to-application]
Options:
-h|--help Display help.
--version Display version.
path-to-application:
The path to an application .dll file to execute.
動いた!
ただ、動かしたいC#のプロジェクトに入って、/opt/dotnet/dotnet runすると、
bash-4.1# /opt/dotnet/dotnet run
Failed to load3▒++, error: /opt/centos6/lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/centos6/opt/dotnet/host/fxr/2.0.0/libhostfxr.so)
The library libhostfxr.so was found, but loading it from /opt/dotnet/host/fxr/2.0.0/libhostfxr.so failed
- Installing .NET Core prerequisites might help resolve this problem.
http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
となる。GLIBCを2.14以上に上げたCentOS6イメージからとってくれば良さそうではある。。。
まだ目的は達成していないけど、yumも使えるし、non-rootでrootっぽい雰囲気は味わえる。
ところどころ元のパス名(/opt/centos6)が見えたりするのが不安なfakechrootではあるけど、CentSO6のバイナリが動いているところもあるので、誰かの役に立てばと思い公開。