使用 CHROOT 完全迁移一个软件环境
因为 PYTHON 环境搭建有些过于复杂了,特别是在应用调用了很多第三方库的情况下,转移到新的系统上面去运行更是可能错误百出,因此将整个环境打包迁移是最好的选择
打包整个环境
除自己开发的部分外,系统的基础软件包也可以在网上下载一个与你当前服务器一致的 rootfs 包,然后解压到特定目录,这样生成的环境可能会干净一些。
mkdir /opt/rootfs mkdir /opt/rootfs/usr mkdir /opt/rootfs/etc mkdir /opt/rootfs/root mkdir /opt/rootfs/dev mkdir /opt/rootfs/tmp chmod +t /opt/rootfs/tmp #添加 STICKY 位,TMP目录标准配置 mkdir /opt/rootfs/sys #这个很多应用可能用不到 cp -rpf /bin /opt/rootfs cp -rpf /sbin /opt/rootfs cp -rpf /usr/share /opt/rootfs/usr cp -rpf /lib /opt/rootfs cp -rpf /lib64 /opt/rootfs cp -rpf /usr/bin /opt/rootfs/usr cp -rpf /usr/sbin /opt/rootfs/usr cp -rpf /usr/lib /opt/rootfs/usr cp -rpf /usr/lib64 /opt/rootfs/usr cp -rpf /usr/libexec /opt/rootfs/usr cp -rpf /etc/bashrc /opt/rootfs/etc cp -rpf /etc/profile /opt/rootfs/etc cp -rpf /etc/passwd /opt/rootfs/etc cp -rpf /etc/shadow /opt/rootfs/etc cp -rpf /root/.bashrc /opt/rootfs/root #/etc/profile, /etc/bashrc, ~/.bashrc 是BASH的初始化文件,导入前可以简化掉一些不用的东西 cp -rpf /opt/micromamba /opt/rootfs/opt #这个是你的PYTHON软件环境
注意:在这里复制的时候,建议带上 -L
参数,这样在遇到软链接时,系统会复制软链接对应的文件,而不是拷贝个链接过来,导致后面命令不可用。在之前还可以在要复制的目录下面使用以下命令清理一次无效的软链接
for f in $(find $1 -type l); do [ ! -e $f ] && rm -f $f; done
为环境挂载设备文件
不挂载的话可能导致部分功能异常
mount -t proc /proc /opt/rootfs/proc mount --bind /sys /opt/rootfs/sys mount --bind /dev /opt/rootfs/dev mount --bind /dev/pts /opt/rootfs/dev/pts #某些终端模拟器应用如TMUX会需要 mount --bind /dev/shm /opt/rootfs/dev/shm
注意:除可以使用 –bind
进行挂载外,还可以使用 –rbind
或者 -R
进行递归挂载,比较典型的就是/dev
目录下还有一些其他挂载点,如/dev/shm
, /dev/pts
等,使用递归挂载时,会一起全部挂载了,但这样的话你可能就会不知道究竟挂载了多少资源,导致你想卸载的时候无法umount,因此最好还是不选择 rbind ,这样我们可以清楚挂载了哪些资源上去。
切换到指定环境并试运行软件包
chroot /opt/rootfs/ micromamba activate PY377 #START-SERVER, 启动PYTHON编写的服务程序
我们可以注意到使用CHROOT迁移环境还是具有一定的复杂性的,如果没有涉及发行版本变化太大的话,还是使用 conda-pack 去迁移环境更好,这样环境会更干净一些,如果按照本文方式去迁移的话,一个应用就至少3~4个G了,但这样的话在新机器上正常运行的概率可以达到95%以上。