到现在,应该可以进行软件安装的实践了。
前面学习Python时,就像搭建一个Linux的服务器环境,一直没有成功,现在尝试在CentOS6.10上搭建Python3.8环境。
安装软件前,需要的前置条件
其一就是网络是连通的,Linux上安装软件,大都需要从网络上安装,这就要求网络畅通,前面的网络属性配置就是做这个准备的。
网络配置,主要涉及本机的IP地址配置,默认网关设置,dns服务器配置。
我的机器使用的是虚拟机,虚拟机的网络配置中用的是:NAT模式(N):用于共享主机的IP地址
虚拟网络编辑器配置:
NAT设置...
DNS设置...
DHCP设置
在安装的Linux上,网卡配置为dhcp获取地址。以CentOS6.10为例
在安装完CentOS6.10后,我只改动了/etc/sysconfig/network-scripts/ifcfg-eth0中ONBOOT=yes,默认是no,然后网络就通了。
也就是在虚拟机中,选了NAT模式,并且其IP获取方式为dhcp,则先由dhcp服务器(IP为254)分配IP,然后其NAT设置中的网关IP,以及DNS设置,会覆盖虚拟机中的相关设置。
关于DNS,这里显示是192.168.138.2,是网关的IP,也就是NAT设备,在使用DNS时,192.168.138.2会再使用其配置的DNS服务器,就是上图中配置的DNS服务器。
有时不知什么原因,IP地址有了(dhcp分配IP成功),就是联不通互联网,一般是默认路由和DNS没有加载成功,这时手工添加默认路由和DNS服务器就行了。
安装软件需要的前置条件
其二就是yum源指定要正确,就是/etc/yum.repo.d/CentOS-Base.repo配置要正确。
系统默认安装的yum源,对于CentOS6.x,一定要修改,不能使用mirrorlist。系统默认的配置:
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
$releasever是主版本号,如6或7,$basearch是基础架构,一般是x86_64(或i386),$infra一般是stock,所以,变量替换后就是:
mirrorlist=http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock,结果如下
如果改成release=6,则结果反馈为:Invalid release/repo/arch combination,查看一个6版本的readme:
说明CentOS 6已经死亡,即不支持了。这时要自己找还提供源的地址,如腾讯的源:
修改repo文件,将mirrorlist改为baseurl=https://mirrors.tencent.com/centos/6.10/os/x86_64/,自己使用,gpgcheck可以设为0,其他的源也是可以修改的,如updates和extras
当然,也可以设置使用光盘作为源,系统默认使用CentOS-Media.repo作为本地光盘的yum源配置,
使用前,需要挂载光盘,否则运行yum会出错.
挂载光盘如:mount /dev/cdrom /media/CentOS,注意挂载点要是上面三个中的一个
克隆机器的网卡修改,启动克隆的系统,查看网络
发现网卡名变成了eth1
先修改主机名称:hostname study610-f2
修改/etc/sysconfig/network,永久改变主机名
看一下网卡配置文件,以及网络接口识别命名的udev规则配置文件
在/etc/sysconfig/network-scripts/目录下,存在ifcfg-eth0配置文件,其配置是DEVICE为eth0,MAC地址是00:0C:29:06:F1:18,这些都是克隆时拷贝自原系统的设置,再看/etc/udev/rules.d/下,网络接口命名规则是根据70-persistent-net.rules来的,其内有两条,第一条是克隆自原系统的,第二条是内核识别的新系统的设备,所以修改这个配置,删掉第一条,修改第二条的NAME为eth0,再修改ifcfg-eth0配置:
重新启动系统。
一、外围支撑软件的安装
打算使用源码编译安装方式安装Python3.8,需要编译器等软件,安装Development tools软件包组和 Server Platform Development软件包组。
还需要其他一些依赖包:zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
部分包没有安装
yum groupinstall "Development tools"
yum groupinstall "Server Planform Development"
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
以上步骤,依赖包和编译需要的工具安装完毕。
二、解决完依赖包问题,就可以安装Python3.8了,看起来很简单,下载源码,然后执行configure、make、make install三步就可以了。
实际安装,会遇到很多问题:
其一是openssl,默认系统安装的是open1.0.1e版本,好像是Python3.8版本需要更高版本的openssl;
其二是sqlite3问题,系统默认已经安装了3.6.20,但是测试安装django后,新增app时提示错误找不到sqlite3模块;
其三是Python多版本问题,系统已经安装了Python2.6.6
查看openssl默认安装情况:
可以看到,按装的位置主要有这几类:
/usr/bin :openssl是二进制可执行程序,即主程序
/etc/pki:相关的配置文件
/usr/lib64:链接库文件
/usr/lib64/openssl/engines:各种安全算法引擎库文件
/usr/share/doc:各种文档文件
/usr/share/man:man手册文件,又分为man1、man5和man7子目录
安装了openssl-devel,还包括了include头文件目录:
查看sqlite安装情况:
查看python安装情况:
三、安装Python3.8
下载源码:Python-3.8.18.tar.xz
执行:tar -xvf Python-3.8.18.tar.xz,会在当前目录下生成Python3.8.18目录
执行:./configure,生成Makefile文件
查看Makefile文件(其中部分):
# Install prefix for architecture-independent files
prefix= /usr/local
# Install prefix for architecture-dependent files
exec_prefix= ${prefix}
# Install prefix for data files
datarootdir= ${prefix}/share
# Expanded directories
BINDIR= ${exec_prefix}/bin
LIBDIR= ${exec_prefix}/lib
MANDIR= ${datarootdir}/man
INCLUDEDIR= ${prefix}/include
CONFINCLUDEDIR= $(exec_prefix)/include
SCRIPTDIR= $(prefix)/lib
ABIFLAGS=
# Detailed destination directories
BINLIBDEST= $(LIBDIR)/python$(VERSION)
LIBDEST= $(SCRIPTDIR)/python$(VERSION)
INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION)
CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION)
# Symbols used for using shared libraries
SHLIB_SUFFIX= .so
EXT_SUFFIX= .cpython-38-x86_64-linux-gnu.so
LDSHARED= $(CC) -shared $(PY_LDFLAGS)
BLDSHARED= $(CC) -shared $(PY_CORE_LDFLAGS)
LDCXXSHARED= $(CXX) -shared
DESTSHARED= $(BINLIBDEST)/lib-dynload
# OpenSSL options for setup.py so sysconfig can pick up AC_SUBST() vars.
OPENSSL_INCLUDES=
OPENSSL_LIBS=-lssl -lcrypto
OPENSSL_LDFLAGS=
默认安装路径是/usr/local,也就是prefix=/usr/local
执行:make test,发现
这个版本的python需要openssl1.0.2或1.1
不去管这些,直接make install,在/usr/local下的相关子目录下生成相应文件
bin目录下保存了可执行程序,执行python3
可见Python3.8是安装成功的,执行pip3 list
pip3执行就不成功,ssl模块有问题,这就是上面说的openssl版本不对造成的。
四、安装openssl高版本
这里安装openssl1.1.1w,下载openssl-1.1.1w.tar.gz
执行:tar -xzvf openssl-1.1.1w.tar.gz
执行./config,openssl使用的是config,而不是configure,但效果是一样的,不带任何选项,默认还是安装到/usr/local
其后生成的Makefile中,有如下内容:
安装的最高层目录是/usr/local,OPENSSLDIR是/usr/local/ssl,即配置文件目录,库文件目录是libdir,即是/usr/local/lib64,引擎目录是/usr/local/lib64/engines-1.1
直接执行,make和make install
查看安装位置:
因为新版本的安装位置变了,所以现在与老版本形成共存的状态,而Python安装使用openssl,是安装原来的位置去找openssl,所以需要将原来的版本替换掉:
备份老版本:
可执行程序(二进制程序):
头文件目录:
将新版本链接到老版本的位置,实现替换,即升级老版本。
升级链接库文件:
最后一条写错了,是libcrypto.so
将新的库文件的路径写入/etc/ld.so.conf,然后ldconfig -v使其生效
在/etc/ld.so.conf.d/下新建openssl1.1.conf,将/usr/local/lib64写入其中
然后重新编译安装python3.8,然后pip3就可用了
五、重新安装openssl1.1.1
恢复虚拟机快照至第二步,重新安装openssl1.1.1,这次安装加上选项,安装到不同位置,通过上面的安装过程,可以看到,Python和openssl都安装到了/usr/local/bin下,很混乱。
再看Makefile:
此时的安装位置为/usr/local/openssl1.1,配置文件在/usr/local/openssl1.1/ssl下,库文件路径是/usr/local/openssl1.1/lib
执行make && make install
完成后:
对老版本进行替换:
配置库文件路径写入/etc/ld.so.conf,然后ldconfig -v使其生效
再次安装python3.8
测试:
测试Django:
创建项目没有问题,创建应用时,提示找不到模块“_sqlite3”
六、重新安装Python3.8,安装到独立的目录下
系统重回到刚安装完openssl1.1.1w的状态,完成openssl升级。
#!/bin/bash
mv /usr/bin/openssl /usr/bin/openssl.bak
mv /usr/include/openssl /usr/include/openssl.bak
ln -s /usr/local/openssl1.1/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl1.1/include/openssl/ /usr/include/openssl
mv /usr/lib64/libssl.so /usr/lib64/libssl.so.bak
mv /usr/lib64/libcrypto.so /usr/lib64/libcrypto.so.bak
ln -s /usr/local/openssl1.1/lib/libssl.so.1.1 /usr/lib64/libssl.so
ln -s /usr/local/openssl1.1/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so
cd /etc/ld.so.conf.d/
touch openssl1.1.conf
echo "/usr/local/openssl1.1/lib" > openssl1.1.conf
ldconfig -v
python3.8安装:./configure --prefix=/usr/local/python3.8 && make && make install
这次安装Python3.8单独安装在自己独立的路径下,避免与其他程序包混交在一块。
问题是需要添加运行路径,其不在PATH环境变量中,不能直接运行python3
七、重新安装Python3.8,安装到独立的目录下,同时不升级openssl(个人推荐)
系统重回到刚安装完openssl1.1.1w的状态,不升级(这里说的不升级,是不对老版本的文件进行替换,即不执行前面脚本的mv和ln命令行),只添加和加载动态链接库:
cd /etc/ld.so.conf.d/
touch openssl1.1.conf
echo "/usr/local/openssl1.1/lib" > openssl1.1.conf
ldconfig -v
python3.8安装:./configure --prefix=/usr/local/python3.8 --with-openssl=/usr/local/openssl1.1 && make && make install
configure的--with-openssl参数指定安装的高版本openssl的位置,就可以直接使用这个版本的openssl,而不会去找默认的openssl安装位置。
可以看到这种安装方法也能成功安装python和pip,不需要对openssl做过多的操作。
现在问题主要是Python和pip的路径问题,不能直接运行python3和pip3,因为PATH中没有对应的路径。
将python3和pip3的路径加到PATH中:
编辑~/.bashrc,增加一行:export PATH=/usr/local/python3.8/bin:$PATH
保存后,执行source ./.bashrc
现在python3和pip3运行的问题视乎解决了,但是考虑一下,还是有问题的:
只能以python3和pip3来运行新版本,运行python和pip,还是运行python2的版本,解决的方法是在python3安装目录的bin目录下,创建链接:
ln -s /usr/local/python3.8/bin/python3 /usr/local/python3.8/bin/python
ln -s /usr/local/python3.8/bin/pip3 /usr/local/python3.8/bin/pip
重启启动系统,再运行python,就是python3了。
但问题是,系统中有些软件使用的python2版本,其脚本如果直接写的python,就会变成使用python3,有可能造成版本不匹配的问题。
不管怎样,我个人认为这种方法算是最好的了,其他的脚本中可能写的是#!/usr/bin/python,写了全路径,就会调用老版本。
每个版本中都创建python和pip软链接,想使用哪个版本,将哪个版本的路径加到PATH的最开始,使用其他版本时,可以直接使用pythonx.x,也可以使用绝对路径/usr/local/pythonx.x/bin/python
用了将近一个周的时间捣鼓这个软件安装,感觉这个Linux使用真的是很麻烦很难。
下一步就是解决sqlite3的问题了。