以非root用户身份,在CentOS5上使用chroot来运行CentOS6
如果有管理者权限,只需要正常地进行chroot即可,但在共享计算机等没有root权限的情况下努力的方法。
为了使dotnet core在CentOS5上运行,我努力尝试了一下。虽然进展得很顺利,但中途力不从心。
顺便说一下,通过chroot可以虚拟地提升操作系统的版本,但主机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
我用这个方法进入了CentOS5的虚拟root shell。
然后,最后一步是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を正常に動作させることができていません。
以下是中国的本地化版本:
然后,由于必须替换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文件夾從原始的CentOS 6映像中複製,並創建/proc/self/exe中的/opt/dotnet/dotnet符號鏈接。
然後,
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
从CentOS6镜像中升级GLIBC到2.14以上似乎是个不错的选择。。。
虽然目标还没达到,但可以使用yum,并且以非root用户的身份体验到类似root的感觉。
虽然在fakechroot中偶尔能看到原始路径名(/opt/centos6),让人有些担心,但由于CentOS6二进制文件可以运行,所以希望能对某人有帮助,我决定公开。