Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save leolovenet/46ac7b8e71c86b0e96ff7f0080b44c79 to your computer and use it in GitHub Desktop.
Save leolovenet/46ac7b8e71c86b0e96ff7f0080b44c79 to your computer and use it in GitHub Desktop.
On Centos7, use chroot to install a new version of glibc and create a new independent system, enabling continued use of VSCode Remote Development(>=1.99)
#!/bin/bash
yum groupinstall "Development Tools" -y
yum install gmp-devel mpfr-devel libmpc-devel -y
# 安装 glibc-2.35
cd /usr/local/src || exit
wget https://ftp.gnu.org/gnu/glibc/glibc-2.35.tar.gz
tar -xvzf glibc-2.35.tar.gz
mkdir build && cd build || exit 1
../configure --prefix=/home/local/glibc-2.35 --enable-kernel=3.2 --enable-multi-arch --enable-stack-protector=strong --with-headers=/usr/include
make -j8 && make install
# 安装 gcc-11.5.0
cd /usr/local/src || exit
wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-11.5.0/gcc-11.5.0.tar.gz
tar -zxf gcc-11.5.0.tar.gz
cd gcc-11.5.0 || exit 1
./contrib/download_prerequisites
mkdir build && cd build || exit 1
../configure --prefix=/home/local/gcc-11.5.0 --enable-languages=c,c++ --disable-multilib
make -j8 && make install
# 拷贝文件到 chroot 环境
mkdir -p /home/chroot
rsync -a /etc /home/chroot/
rsync -a /usr /home/chroot/
rsync -a /opt /home/chroot/
rsync -a /var /home/chroot/
rsync -a /root /home/chroot/
cd /home/chroot &&
mkdir -p boot proc sys dev dev/pts dev/shm tmp var run run/dbus root root/bin home home/leo usr/local/openresty/nginx/logs &&
ln -s usr/lib . &&
ln -s usr/lib64 . &&
ln -s usr/bin . &&
ln -s usr/sbin . &&
# cd /home/chroot/lib64 && ls -ahl | grep "\->" | grep "\-2.17"
# <更新系统配置> ,使用 glibc-2.35
cd /home/chroot/lib64 && rm ld-linux-x86-64.so.2 && ln -s /home/local/glibc-2.35/lib/ld-linux-x86-64.so.2 .
cd /home/chroot/lib64 && rm libanl.so.1 && ln -s /home/local/glibc-2.35/lib/libanl.so.1 .
cd /home/chroot/lib64 && rm libBrokenLocale.so.1 && ln -s /home/local/glibc-2.35/lib/libBrokenLocale.so.1 .
cd /home/chroot/lib64 && rm libcrypt.so.1 && ln -s /home/local/glibc-2.35/lib/libcrypt.so.1 .
cd /home/chroot/lib64 && rm libc.so.6 && ln -s /home/local/glibc-2.35/lib/libc.so.6 .
cd /home/chroot/lib64 && rm libdl.so.2 && ln -s /home/local/glibc-2.35/lib/libdl.so.2 .
cd /home/chroot/lib64 && rm libm.so.6 && ln -s /home/local/glibc-2.35/lib/libm.so.6 .
cd /home/chroot/lib64 && rm libnsl.so.1 && ln -s /home/local/glibc-2.35/lib/libnsl.so.1 .
cd /home/chroot/lib64 && rm libnss_compat.so.2 && ln -s /home/local/glibc-2.35/lib/libnss_compat.so.2 .
cd /home/chroot/lib64 && rm libnss_db.so.2 && ln -s /home/local/glibc-2.35/lib/libnss_db.so.2 .
cd /home/chroot/lib64 && rm libnss_dns.so.2 && ln -s /home/local/glibc-2.35/lib/libnss_dns.so.2 .
cd /home/chroot/lib64 && rm libnss_files.so.2 && ln -s /home/local/glibc-2.35/lib/libnss_files.so.2 .
cd /home/chroot/lib64 && rm libnss_hesiod.so.2 && ln -s /home/local/glibc-2.35/lib/libnss_hesiod.so.2 .
cd /home/chroot/lib64 && rm libpthread.so.0 && ln -s /home/local/glibc-2.35/lib/libpthread.so.0 .
cd /home/chroot/lib64 && rm libresolv.so.2 && ln -s /home/local/glibc-2.35/lib/libresolv.so.2 .
cd /home/chroot/lib64 && rm librt.so.1 && ln -s /home/local/glibc-2.35/lib/librt.so.1 .
cd /home/chroot/lib64 && rm libutil.so.1 && ln -s /home/local/glibc-2.35/lib/libutil.so.1 .
cd /home/chroot/lib64 && rm libstdc++.so.6 && ln -s /home/local/gcc-11.5.0/lib64/libstdc++.so.6 .
cd /home/chroot/lib64 && rm libgcc_s.so.1 && ln -s /home/local/gcc-11.5.0/lib64/libgcc_s.so.1 .
cd /home/chroot/lib64 && rm libquadmath.so.0 && ln -s /home/local/gcc-11.5.0/lib64/libquadmath.so.0 .
cd /home/chroot/lib64 && rm libgomp.so.1 && ln -s /home/local/gcc-11.5.0/lib64/libgomp.so.1 .
if false; then
#恢复
cd /home/chroot/lib64 && rm ld-linux-x86-64.so.2 && ln -s ld-2.17.so ld-linux-x86-64.so.2
cd /home/chroot/lib64 && rm libanl.so.1 && ln -s libanl-2.17.so libanl.so.1
cd /home/chroot/lib64 && rm libBrokenLocale.so.1 && ln -s libBrokenLocale-2.17.so libBrokenLocale.so.1
cd /home/chroot/lib64 && rm libcrypt.so.1 && ln -s libcrypt-2.17.so libcrypt.so.1
cd /home/chroot/lib64 && rm libc.so.6 && ln -s libc-2.17.so libc.so.6
cd /home/chroot/lib64 && rm libdl.so.2 && ln -s libdl-2.17.so libdl.so.2
cd /home/chroot/lib64 && rm libm.so.6 && ln -s libm-2.17.so libm.so.6
cd /home/chroot/lib64 && rm libnsl.so.1 && ln -s libnsl-2.17.so libnsl.so.1
cd /home/chroot/lib64 && rm libnss_compat.so.2 && ln -s libnss_compat-2.17.so libnss_compat.so.2
cd /home/chroot/lib64 && rm libnss_db.so.2 && ln -s libnss_db-2.17.so libnss_db.so.2
cd /home/chroot/lib64 && rm libnss_dns.so.2 && ln -s libnss_dns-2.17.so libnss_dns.so.2
cd /home/chroot/lib64 && rm libnss_files.so.2 && ln -s libnss_files-2.17.so libnss_files.so.2
cd /home/chroot/lib64 && rm libnss_hesiod.so.2 && ln -s libnss_hesiod-2.17.so libnss_hesiod.so.2
cd /home/chroot/lib64 && rm libpthread.so.0 && ln -s libpthread-2.17.so libpthread.so.0
cd /home/chroot/lib64 && rm libresolv.so.2 && ln -s libresolv-2.17.so libresolv.so.2
cd /home/chroot/lib64 && rm librt.so.1 && ln -s librt-2.17.so librt.so.1
cd /home/chroot/lib64 && rm libutil.so.1 && ln -s libutil-2.17.so libutil.so.1
cd /home/chroot/lib64 && rm libstdc++.so.6 && ln -s libstdc++.so.6.0.19 libstdc++.so.6
cd /home/chroot/lib64 && rm libgcc_s.so.1 && ln -s libgcc_s-4.8.5-20150702.so.1 libgcc_s.so.1
cd /home/chroot/lib64 && rm libquadmath.so.0 && ln -s libquadmath.so.0.0.0 libquadmath.so.0
cd /home/chroot/lib64 && rm libgomp.so.1 && ln -s libgomp.so.1.0.0 libgomp.so.1
fi
#挂载必要的系统文件
mount -t proc proc /home/chroot/proc
mount --bind /sys /home/chroot/sys
mount --bind /dev /home/chroot/dev
mount --bind /dev/pts /home/chroot/dev/pts
mount -t tmpfs -o rw,nosuid,nodev,mode=755 tmpfs /home/chroot/run
mount --bind /run/dbus /home/chroot/run/dbus
mount --bind /root/bin /home/chroot/root/bin
mount --bind /home/leo /home/chroot/home/leo
mount --bind /dev/shm/ /home/chroot/dev/shm
mount --bind /usr/local/openresty/nginx/logs /home/chroot/usr/local/openresty/nginx/logs
if false; then
#卸载必要的系统文件
umount /home/chroot/proc
umount /home/chroot/sys
umount /home/chroot/dev/pts
umount /home/chroot/dev
umount /home/chroot/run/dbus
umount /home/chroot/run
umount /home/chroot/root/bin
umount /home/chroot/home/leo
umount /home/chroot/dev/shm
umount /home/chroot/usr/local/openresty/nginx/logs
fi
# 进入 chroot 环境
chroot /home/chroot
#####################
# 以下命令只需要执行一次
#####################
vim ~/.bashrc
export GLIBC_VERS="glibc-2.35"
export GLIBC_PATH="/home/local/$GLIBC_VERS"
export PATH="$GLIBC_PATH/sbin:$GLIBC_PATH/bin:$PATH"
#export LD_LIBRARY_PATH="$GLIBC_PATH/lib:$LD_LIBRARY_PATH:/usr/lib64:/usr/local/lib64:/usr/lib:/usr/local/lib"
#创建 locale 相关文件
/home/local/glibc-2.35/bin/localedef -v -c -i en_US -f UTF-8 en_US.UTF-8
cd /home/local/glibc-2.35/etc/ && \
ln -s /usr/share/zoneinfo/Asia/Shanghai ./localtime && \
ln -s /etc/protocols ./protocols && \
ln -s /etc/services ./services && \
ln -s /etc/nsswitch.conf ./nsswitch.conf
#创建 ld.so.conf
cat >/home/local/glibc-2.35/etc/ld.so.conf <'EOF'
include /etc/ld.so.conf.d/*.conf
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/lib
EOF
# ⚠️注意⚠️, 运行 ldconfig 会导致 `/usr/lib64/libc.so.6` 恢复, 需要退出 chroot 环境, 重新运行上面的 <更新系统配置> 命令
/home/local/glibc-2.35/sbin/ldconfig
#创建 gcc wrapper
mv /opt/rh/devtoolset-11/root/usr/bin/gcc /opt/rh/devtoolset-11/root/usr/bin/gcc.real
cat >/opt/rh/devtoolset-11/root/usr/bin/gcc <'EOF'
#!/bin/bash
/opt/rh/devtoolset-11/root/usr/bin/gcc.real -B/home/local/glibc-2.35/lib "$@"
EOF
# change Port 1122
vim /etc/ssh/sshd_config
#开启 sshd
/usr/sbin/sshd
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment