使用 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%以上。

  • itwiki/migrate-with-chroot.txt
  • 最后更改: 2024/01/20 13:46
  • ovwx@live.io