这个是为融合版+zerotier做准备的,因为过程比较复杂所以先单独写一篇文章。

才不是怕忘了呢
这个方法同时在噢易云融合版服务器与idv终端安装,之所以不用voi终端,是因为voi最小系统啥都缺,太麻烦了。
之所以不用一键脚本,是因为服务端的源已经暂停服务了,客户端用一键脚本可能会导致环境出问题。
下面的方法均可在服务端客户端使用。

经过测试发现,编译安装zerotier时,会干掉idv(没准包括voi)的bt下发服务(具体原因查日志查不出来),已使用控制变量法证实是更新了gcc/c++之类环境导致的,结合我之前安装qbittorrent时对GCC环境以及libtorrent的版本要求限制,因此我怀疑是这个地方出问题了。以下内容仅供参考,建议使用下面的方法配置好环境后编译成rpm安装包。

BT分发出现异常
建议使用一键脚本或者编译成rpm后再进行安装的方法。

准备

以下内容仅供内部人员了解

根目录可写

出于防病毒的目的,根目录/默认是只读的,需要使用

mount -o remount,rw /

才能进行读写根目录。重启后失效。
修改/etc/fstab的内容为rw已无法生效了。

离线安装gcc

无论是客户端还是服务端都没完整安装gcc以及gcc-c++,因此我要编译只能先用rpm安装旧版的,然后再用编译安装新版的。
idv客户端操作系统环境为:

[root@idv-467b48 ~]# cat /etc/centos-release
Idv Client release 7.6.0 (Core) 
[root@idv-467b48 ~]# uname -a
Linux idv-467b48 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

虽然隐藏了具体版本,但看到熟悉的3.10基本上就感觉就是centos没错(废话)

获取gcc安装包

我是用的centos7.3的iso+在线镜像站获取的文件,需要以下文件:

[root@localhost gcc-6.3.0]# ll /root/rpm
总用量 56908
-rwxrwxrwx. 1 root root    53120 2月   5 21:00 bzip2-1.0.6-13.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  6225248 2月   5 20:49 cpp-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root 16957504 2月   5 20:49 gcc-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  7519876 2月   5 20:49 gcc-c++-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  3767280 2月   5 20:49 glibc-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root 12038164 2月   5 20:49 glibc-common-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  1106292 2月   5 20:49 glibc-devel-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   684244 2月   5 20:49 glibc-headers-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  1599280 2月   5 20:49 glibc-static-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   213324 2月   5 20:49 glibc-utils-2.17-157.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   184868 2月   5 20:49 gmp-devel-6.0.0-12.el7_1.x86_64.rpm
-rwxrwxrwx. 1 root root  5001232 2月   5 20:49 kernel-headers-3.10.0-514.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   155972 2月   5 20:49 libgomp-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root    51732 2月   5 20:49 libmpc-1.0.1-3.el7.x86_64.rpm
-rwxrwxrwx. 1 root root    32904 2月   5 20:49 libmpc-devel-1.0.1-3.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   306804 2月   5 20:49 libstdc++-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root  1574820 2月   5 20:49 libstdc++-devel-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   418184 2月   5 20:49 libstdc++-static-4.8.5-11.el7.x86_64.rpm
-rwxrwxrwx. 1 root root   208316 2月   5 20:49 mpfr-3.1.1-4.el7.x86_64.rpm
-rwxrwxrwx. 1 root root    69904 2月   5 20:49 mpfr-devel-3.1.1-4.el7.x86_64.rpm
-rwxrwxrwx. 1 root root    51044 2月   5 20:49 zlib-devel-1.2.7-17.el7.x86_64.rpm

你可以在http://vault.centos.org/7.3.1611/os/x86_64/Packages/获取对应的rpm包,大的版本要相同,小版本可以不一样,不然我不保证能装上去。

将这些文件单独存放到一个之前是空的文件夹中即可

安装gcc

这里安装gcc的同时也安装了gcc-c++
记得给权限:

chmod 777 -R /root/rpm

使用

rpm -ivh *.rpm --nodeps --force

即可批量安装,他们之间的依赖会自动排序安装。

验证

建议开个新终端,使用:

[root@idv-467b48 ~]# gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保

验证安装成功。
此时gcc-c++也安装成功了。
但这个gcc版本编译不了zerotier,需要手动更新。

The minimum compiler versions required are GCC/G++ 4.9.3 or CLANG/CLANG++ 3.4.2. (Install clang on CentOS 7 as G++ is too old.)

更新gcc

准备文件

建议使用6.3.0版的gcc,我试过4.9.3与10.2,编译zerotier均有报错,用6.3.0目前是最合适的。
使用cd /usr/local/src/进入目录,然后下载gcc-6.3.0.tar.gz后上传到这个目录

http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-6.3.0/gcc-6.3.0.tar.gz

使用tar -xvf gcc-6.3.0.tar.gz解压得到gcc-6.3.0文件夹,进入这个文件夹。
如果设备有联网执行./contrib/download_prerequisites
没网就手动下载以下四个依赖到上面解压的gcc-6.3.0文件夹中:

ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
ftp://gcc.gnu.org/pub/gcc/infrastructure/isl-0.15.tar.bz2

(地址扔浏览器就可以下载了)

以上四个依赖仅供gcc-6.3.0使用

然后使用:

tar -xjf mpfr-2.4.2.tar.bz2
chmod 777 -R mpfr-2.4.2
ln -sf mpfr-2.4.2 mpfr
 
tar -xjf gmp-4.3.2.tar.bz2
chmod 777 -R gmp-4.3.2
ln -sf gmp-4.3.2 gmp
 
tar -xvf mpc-0.8.1.tar.gz
chmod 777 -R mpc-0.8.1
ln -sf mpc-0.8.1 mpc
 
tar -xjf isl-0.15.tar.bz2
chmod 777 -R isl-0.15
ln -sf isl-0.15 isl

编译

mkdir -p /usr/local/build/gcc-6.3.0
cd /usr/local/build/gcc-6.3.0
/usr/local/src/gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

如果你没事可以用

make

单线程,如果要多线程就用

grep 'processor' /proc/cpuinfo | sort -u | wc -l

查看线程数,然后用一半的线程编译就行了。

make -j2

大概要等几小时。

然后使用

make install

安装,在新的终端使用gcc -v查看是否安装成功

[root@localhost ~]# gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:/usr/local/src/gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
线程模型:posix
gcc 版本 6.3.0 (GCC) 

对了,编译gcc非常占硬盘空间,编译前注意给根目录预留:
编译前:

[root@localhost gcc-6.3.0]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 3.8G     0  3.8G    0% /dev
tmpfs                    3.9G     0  3.9G    0% /dev/shm
tmpfs                    3.9G   12M  3.8G    1% /run
tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   44G  2.8G   42G    7% /
/dev/sda1               1014M  193M  822M   20% /boot
tmpfs                    781M     0  781M    0% /run/user/0

编译后:

[root@localhost ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
devtmpfs                 3.8G     0  3.8G    0% /dev
tmpfs                    3.9G     0  3.9G    0% /dev/shm
tmpfs                    3.9G   12M  3.8G    1% /run
tmpfs                    3.9G     0  3.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root   44G  8.1G   36G   19% /
/dev/sda1               1014M  193M  822M   20% /boot
tmpfs                    781M     0  781M    0% /run/user/0

用了近5G,如果硬盘空间不够会报奇怪的错误,比如:

In file included from /usr/local/src/gcc-6.3.0/libstdc++-v3/include/precompiled/stdc++.h:122:0:
/usr/local/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/include/shared_mutex:682:1: fatal error:can’t write PCH file: 设备上没有空间
 } // namespace
 ^
compilation terminated.
make[5]: *** [x86_64-pc-linux-gnu/bits/stdc++.h.gch/O2g.gch] 错误 1
make[5]: 离开目录“/usr/local/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/include”
make[4]: *** [all-recursive] 错误 1
make[4]: 离开目录“/usr/local/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3”
make[3]: *** [all] 错误 2
make[3]: 离开目录“/usr/local/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3”
make[2]: *** [all-stage1-target-libstdc++-v3] 错误 2
make[2]: 离开目录“/usr/local/build/gcc-6.3.0”
make[1]: *** [stage1-bubble] 错误 2
make[1]: 离开目录“/usr/local/build/gcc-6.3.0”
make: *** [all] 错误 2

由于idv终端自动安装给的根目录很小,/etc空间还足够大

[root@idv-467b48 gcc-6.3.0]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda5       4.7G  4.7G     0  100% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G  5.0M  1.9G    1% /dev/shm
tmpfs           1.9G   12M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
none            1.9G  460K  1.9G    1% /var/tmp
/dev/sda6        87G  373M   87G    1% /etc
/dev/sda2       477M  158M  291M   36% /boot
tmpfs           381M     0  381M    0% /run/user/0

因此可以把gcc安装到/etc目录

/etc/zerotier/
├── build
│   └── gcc-6.3.0
├── rpm
│   ├── bzip2-1.0.6-13.el7.x86_64.rpm
│   ├── cpp-4.8.5-11.el7.x86_64.rpm
│   ├── gcc-4.8.5-11.el7.x86_64.rpm
│   ├── gcc-c++-4.8.5-11.el7.x86_64.rpm
│   ├── glibc-2.17-157.el7.x86_64.rpm
│   ├── glibc-common-2.17-157.el7.x86_64.rpm
│   ├── glibc-devel-2.17-157.el7.x86_64.rpm
│   ├── glibc-headers-2.17-157.el7.x86_64.rpm
│   ├── glibc-static-2.17-157.el7.x86_64.rpm
│   ├── glibc-utils-2.17-157.el7.x86_64.rpm
│   ├── gmp-devel-6.0.0-12.el7_1.x86_64.rpm
│   ├── kernel-headers-3.10.0-514.el7.x86_64.rpm
│   ├── libgomp-4.8.5-11.el7.x86_64.rpm
│   ├── libmpc-1.0.1-3.el7.x86_64.rpm
│   ├── libmpc-devel-1.0.1-3.el7.x86_64.rpm
│   ├── libstdc++-4.8.5-11.el7.x86_64.rpm
│   ├── libstdc++-devel-4.8.5-11.el7.x86_64.rpm
│   ├── libstdc++-static-4.8.5-11.el7.x86_64.rpm
│   ├── mpfr-3.1.1-4.el7.x86_64.rpm
│   ├── mpfr-devel-3.1.1-4.el7.x86_64.rpm
│   └── zlib-devel-1.2.7-17.el7.x86_64.rpm
└── src
    ├── gcc-6.3.0
    └── gcc-6.3.0.tar.gz

在上文中,使用

mkdir -p /etc/local/build/gcc-6.3.0
cd /etc/local/build/gcc-6.3.0
/usr/local/src/gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib

然后make与make install

结束后使用make clean清理

检查是否安装完成。

[root@idv-36f9d5 ~]# gcc -v
使用内建 specs。
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-pc-linux-gnu/6.3.0/lto-wrapper
目标:x86_64-pc-linux-gnu
配置为:/etc/zerotier/src/gcc-6.3.0/configure --enable-checking=release --enable-languages=c,c++ --disable-multilib
线程模型:posix
gcc 版本 6.3.0 (GCC) 
[root@idv-36f9d5 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda5       4.7G  3.2G  1.3G   71% /
devtmpfs        1.9G     0  1.9G    0% /dev
tmpfs           1.9G  5.0M  1.9G    1% /dev/shm
tmpfs           1.9G   12M  1.9G    1% /run
tmpfs           1.9G     0  1.9G    0% /sys/fs/cgroup
none            1.9G  460K  1.9G    1% /var/tmp
/dev/sda6        87G  6.0G   81G    7% /etc
/dev/sda2       477M  158M  291M   36% /boot
tmpfs           381M     0  381M    0% /run/user/0

有点极限。

编译安装zerotier

编译

从GitHub下载zip,上传上去,解压,进入文件夹

unzip ZeroTierOne-master.zip
cd ZeroTierOne-master/

然后直接在文件夹内make即可,会有警告,可以无视,不影响使用。

make
make install

提示:

[root@idv-36f9d5 ZeroTierOne-master]# make install
mkdir -p /usr/sbin
rm -f /usr/sbin/zerotier-one
cp -f zerotier-one /usr/sbin/zerotier-one
rm -f /usr/sbin/zerotier-cli
rm -f /usr/sbin/zerotier-idtool
ln -s zerotier-one /usr/sbin/zerotier-cli
ln -s zerotier-one /usr/sbin/zerotier-idtool
mkdir -p /var/lib/zerotier-one
rm -f /var/lib/zerotier-one/zerotier-one
rm -f /var/lib/zerotier-one/zerotier-cli
rm -f /var/lib/zerotier-one/zerotier-idtool
ln -s ../../../usr/sbin/zerotier-one /var/lib/zerotier-one/zerotier-one
ln -s ../../../usr/sbin/zerotier-one /var/lib/zerotier-one/zerotier-cli
ln -s ../../../usr/sbin/zerotier-one /var/lib/zerotier-one/zerotier-idtool
mkdir -p /usr/share/man/man8
rm -f /usr/share/man/man8/zerotier-one.8.gz
cat doc/zerotier-one.8 | gzip -9 >/usr/share/man/man8/zerotier-one.8.gz
mkdir -p /usr/share/man/man1
rm -f /usr/share/man/man1/zerotier-idtool.1.gz
rm -f /usr/share/man/man1/zerotier-cli.1.gz
cat doc/zerotier-cli.1 | gzip -9 >/usr/share/man/man1/zerotier-cli.1.gz
cat doc/zerotier-idtool.1 | gzip -9 >/usr/share/man/man1/zerotier-idtool.1.gz

即安装完成
使用sudo zerotier-cli info查看是否安装完成。
大概会提示:

[root@idv-36f9d5 ZeroTierOne-master]# sudo zerotier-cli info
zerotier-cli: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by zerotier-cli)
zerotier-cli: /lib64/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by zerotier-cli)
zerotier-cli: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by zerotier-cli)
zerotier-cli: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by zerotier-cli)

这个错误,这个是因为之前安装gcc的时候旧的动态库没有更新的原因。
下面是解决方法

修复gcc动态库

使用strings /usr/lib64/libstdc++.so.6 | grep GLIBC查看现有动态库。

[root@idv-36f9d5 ZeroTierOne-master]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_DEBUG_MESSAGE_LENGTH

可以发现刚好缺3.4.20版本的gcc动态库。
执行以下命令,查找编译gcc时生成的最新动态库:

输出:

[root@idv-36f9d5 ZeroTierOne-master]# find / -name "libstdc++.so*"
/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/data/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/data/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/data/etc/zerotier/build/gcc-6.3.0/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/data/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/data/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/data/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/data/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22
/data/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/data/etc/zerotier/build/gcc-6.3.0/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so
/usr/lib64/libstdc++.so.6
/usr/lib64/libstdc++.so.6.0.19
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.19-gdb.pyc
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.22
/usr/local/lib64/libstdc++.so.6.0.22-gdb.py
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so
/usr/lib/gcc/x86_64-redhat-linux/4.8.2/32/libstdc++.so
[root@idv-36f9d5 ZeroTierOne-master]# 

其中/etc/zerotier/build/gcc-6.3.0/是我之前编译所在目录
找关键词

/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22

可以发现有

/etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22

使用

cp /etc/zerotier/build/gcc-6.3.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 /usr/lib64

复制后,修改系统默认动态库的指向,即:重建默认库的软连接。

切换工作目录至/usr/lib64

cd /usr/lib64

先确认下是否存在

[root@idv-36f9d5 lib64]# ll | grep libstdc++.so.6
lrwxrwxrwx   1 root root       19 2月   5 23:13 libstdc++.so.6 -> libstdc++.so.6.0.19
-rwxr-xr-x   1 root root   999944 11月  4 2016 libstdc++.so.6.0.19
-rwxr-xr-x   1 root root 11396352 2月   6 01:31 libstdc++.so.6.0.22

删除原来软连接:

rm -rf libstdc++.so.6

将默认库的软连接指向最新动态库:

ln -s libstdc++.so.6.0.22 libstdc++.so.6

默认动态库升级完成。重新运行以下命令检查动态库:

strings /usr/lib64/libstdc++.so.6 | grep GLIBC

[root@idv-36f9d5 lib64]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.14
GLIBC_2.17
GLIBC_2.3.2
......

还有一堆东西我就省略了。
证实存在GLIBCXX_3.4.22
再次执行sudo zerotier-cli info

[root@idv-36f9d5 lib64]# sudo zerotier-cli info
zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one
[root@idv-36f9d5 lib64]#

确认一切正常。
使用zerotier-cli join xxxxxxx加入,提示200即可。
如果还是提示:

zerotier-cli: missing port and zerotier-one.port not found in /var/lib/zerotier-one

那就执行

zerotier-one -d

即可。
(记得在zerotier后台允许这个设备并且勾上Allow Ethernet Bridging
使用ip a查看是否有被分配的ip

[root@idv-36f9d5 ZeroTierOne-master]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3d:33:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.123.179/24 brd 192.168.123.255 scope global dynamic eth0
       valid_lft 76696sec preferred_lft 76696sec
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:a6:28:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:a6:28:72 brd ff:ff:ff:ff:ff:ff
5: ztly5xszje: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether d2:18:e9:a1:5b:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.195.51/24 brd 192.168.195.255 scope global ztly5xszje
       valid_lft forever preferred_lft forever

我这里是有的。

开机启动

由于安全考虑,系统开机启动修改并隐藏了systemctl监听目录
而我尝试了rc.local开机执行脚本失败与crontab -e保存不了配置后
想到了开机必会启动sshd,我可以用systemctl的联动机制。
首先进入之前zerotier编译目录

cd /etc/zerotier/zerotier/ZeroTierOne-master

然后使用

cp debian/zerotier-one.service /etc/systemd/system

官方的service文件。

sudo systemctl daemon-reload
sudo systemctl enable zerotier-one
sudo systemctl start zerotier-one

这里的enable没用,只不过是为了确保systemctl手动启动zerotier有效。

[root@idv-36f9d5 ZeroTierOne-master]# systemctl status zerotier-one
● zerotier-one.service - ZeroTier One
   Loaded: loaded (/etc/systemd/system/zerotier-one.service; enabled; vendor preset: disabled)
   Active: active (running) since 六 2021-02-06 01:41:58 CST; 6s ago
 Main PID: 75682 (zerotier-one)
    Tasks: 3
   CGroup: /system.slice/zerotier-one.service
           └─75682 /usr/sbin/zerotier-one

2月 06 01:41:58 idv-36f9d5 systemd[1]: Started ZeroTier One.
2月 06 01:41:58 idv-36f9d5 systemd[1]: Starting ZeroTier One...

然后编辑sshd的service

vi /usr/lib/systemd/system/sshd.service

添加一行

Wants=zerotier-one.service

这样在启动sshd时会联动启动zerotier
重新载入配置文件systemctl daemon-reload,随后重启.
证实可以开机启动:

[root@idv-36f9d5 ~]# systemctl status zerotier-one
● zerotier-one.service - ZeroTier One
   Loaded: loaded (/etc/systemd/system/zerotier-one.service; enabled; vendor preset: disabled)
   Active: active (running) since 六 2021-02-06 01:50:44 CST; 55s ago
 Main PID: 1764 (zerotier-one)
    Tasks: 7
   CGroup: /system.slice/zerotier-one.service
           └─1764 /usr/sbin/zerotier-one

2月 06 01:50:44 idv-36f9d5 systemd[1]: Started ZeroTier One.
2月 06 01:50:44 idv-36f9d5 systemd[1]: Starting ZeroTier One...
2月 06 01:50:44 idv-36f9d5 zerotier-one[1764]: sendto: Network is unreachable
2月 06 01:50:44 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/peers.d/0cccb752f7.peer (unable to open)
2月 06 01:51:14 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/peers.d/0cccb752f7.peer (unable to open)
2月 06 01:51:14 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/networks.d/0cccb752f7ce37d3.conf (unable to open)

自动配置网卡正常

[root@idv-36f9d5 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3d:33:e5 brd ff:ff:ff:ff:ff:ff
    inet 192.168.123.179/24 brd 192.168.123.255 scope global dynamic eth0
       valid_lft 86311sec preferred_lft 86311sec
3: ztly5xszje: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN group default qlen 1000
    link/ether d2:18:e9:a1:5b:6b brd ff:ff:ff:ff:ff:ff
    inet 192.168.195.51/24 brd 192.168.195.255 scope global ztly5xszje
       valid_lft forever preferred_lft forever
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:a6:28:72 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:a6:28:72 brd ff:ff:ff:ff:ff:ff

可以ping通服务器。

[root@idv-36f9d5 ~]# ping 192.168.195.110
PING 192.168.195.110 (192.168.195.110) 56(84) bytes of data.
64 bytes from 192.168.195.110: icmp_seq=1 ttl=64 time=2.09 ms
64 bytes from 192.168.195.110: icmp_seq=2 ttl=64 time=2.44 ms
64 bytes from 192.168.195.110: icmp_seq=3 ttl=64 time=2.92 ms
64 bytes from 192.168.195.110: icmp_seq=4 ttl=64 time=2.22 ms
64 bytes from 192.168.195.110: icmp_seq=5 ttl=64 time=2.27 ms
64 bytes from 192.168.195.110: icmp_seq=6 ttl=64 time=2.37 ms

2月 06 01:50:44 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/peers.d/0cccb752f7.peer (unable to open)
2月 06 01:51:14 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/peers.d/0cccb752f7.peer (unable to open)
2月 06 01:51:14 idv-36f9d5 zerotier-one[1764]: WARNING: unable to write to file: /var/lib/zerotier-one/networks.d/0cccb752f7ce37d3.conf (unable to open)

报错,目前来看不影响使用,可能是记录被分配的ip以及预存内网ip/arp之内的。是因为开机后根目录又只读了。
目前来看不影响使用,但看起来不舒服。

开机根目录可写

为了永久生效,我就写一个脚本

#!/bin/sh
mount -o remount,rw /

保存为rw.sh,我存放为/root/rwdisk.sh

chmod 755 /root/rwdisk.sh

然后创建开机执行

/etc/systemd/system/rwdisk.service

[Unit]
Description=rwdisk

[Service]
ExecStart=/root/rwdisk.sh

[Install]
WantedBy=multi-user.target

随后常规操作

systemctl daemon-reload
systemctl enable zerotier-one
systemctl start zerotier-one

然后在zerotier-one.service添加

Wants=rwdisk.service

如下所示:

[root@idv-36f9d5 ~]# cat /etc/systemd/system/zerotier-one.service
[Unit]
Description=ZeroTier One
After=network-online.target
Wants=network-online.target
Wants=rwdisk.service


[Service]
ExecStart=/usr/sbin/zerotier-one
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

然后systemctl daemon-reload,重启后查看/根目录是否可写.

[root@idv-36f9d5 ~]# findmnt 
TARGET                           SOURCE                       FSTYPE     OPTIONS
/                                /dev/sda5                    ext4       rw,relatime,data=ordered
... ...

zerotier也没报无法写入错了

[root@idv-36f9d5 ~]# systemctl status zerotier-one
● zerotier-one.service - ZeroTier One
   Loaded: loaded (/etc/systemd/system/zerotier-one.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2021-02-07 02:02:19 CST; 2min 14s ago
 Main PID: 1116 (zerotier-one)
    Tasks: 7
   CGroup: /system.slice/zerotier-one.service
           └─1116 /usr/sbin/zerotier-one

2月 07 02:02:19 idv-36f9d5 systemd[1]: Started ZeroTier One.
2月 07 02:02:19 idv-36f9d5 systemd[1]: Starting ZeroTier One...
2月 07 02:02:19 idv-36f9d5 zerotier-one[1116]: sendto: Network is unreachable

请勿在生产环境下这样操作。

延时

在上面又出现新的问题

zerotier-one[1116]: sendto: Network is unreachable

需要在启动的时候延时一下,添加:

ExecStartPre=/bin/sleep 10

即可

如下所示

[root@idv-36f9d5 ~]# cat /etc/systemd/system/zerotier-one.service
[Unit]
Description=ZeroTier One
After=network-online.target
Wants=network-online.target
Wants=rwdisk.service


[Service]
ExecStartPre=/bin/sleep 10
ExecStart=/usr/sbin/zerotier-one
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

延时10s,就没错误了。
出现这个原因是因为要等待系统配置完成网卡与分区状态。


参考:
噢易技术知识库
Centos7离线安装gcc
CentOS7升级GCC4.9.3
Ubuntu 离线安装gcc (非root用户)
CentOS 查看系统 CPU 个数、核心数、线程数
zerotier/ZeroTierOne
Raspberry Pi 编译安装 ZeroTier
解决类似 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 的问题

最后修改:2022 年 05 月 10 日
如果觉得我的文章对你有用,请随意赞赏