3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

non-rootユーザでchrootしてCentOS5上でCentOS6を動かす

Last updated at Posted at 2018-07-08

管理者権限を持っていたら、普通に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のバイナリが動いているところもあるので、誰かの役に立てばと思い公開。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?