最近编写的一个python程序需要制作一个安装脚本,之前其实是有安装脚本的,但是是基于在线安装的,要制作一个离线的安装包,最终发布在ubuntu中。整个安装大约分成三个部分:
- apt install 安装包
- 源代码安装
- pip 安装python程序包
由于源代码安装比较简单,一般通用步骤就是./configure && make && make install
这里就不表述了,具体参考不同的软件源代码即可。
APT本地源制作
下载相关的安装包
首先下载相关的安装包肯定是从一台可以联网的相同版本的操作系统中下载安装。这里推荐使用阿里的源http://mirrors.aliyun.com,具体配置可参考网上。
之前网上很多方法说从/var/cache/apt/archives
,这里特别提醒使用此方法最好是在一个纯净的操作系统全部在线安装一遍库,并且安装完之后需要立即保存下来,从名字上看这本身就是一个缓存的库,不太适应,这里我没有使用这种方式。
直接采用apt-get download
来下载需要下载的包,比如需要下载make
,则使用apt-get download make
,一开始下载完之后到目标机去安装,总是提示缺少很多相关的依赖库,还需要再次调用apt-get download
,很麻烦。从网上发现,可以利用apt-cache depends
来获取相关包的依赖,ubuntu 16可以使用apt depends
,因此从网上找来相关代码进行批量下载:
function getDepends()
{
# use tr to del < >
ret=`apt-cache depends $1|grep Depends |cut -d: -f2 |tr -d "<>"`
echo $ret
}
for var in $*
do
libs=$var
echo "download $libs"
# download libs dependen. deep in 3
i=0
while [ $i -lt 3 ] ;
do
let i++
echo $i
# download libs
newlist=" "
for j in $libs
do
added="$(getDepends $j)"
echo "$j depended $added"
newlist="$newlist $added"
echo "download $j"
apt-get download $j
done
libs=$newlist
done
done
其中 $* 是同时下载多个安装包
3是表示下载多少层级的安装依赖包,3即表示两级依赖,一般来说3基本可以满足大部分安装的需求
制作本地安装包源
这里我的文件路径是/home/xxx/libs/ubuntu/apt/*.deb
制作索引文件
cd /home/xxx/libs/ubuntu
apt-ftparchive packages apt/. > apt/Packages
cd apt
gzip -c Packages > Packages.gz
如果只有以上的命令,在接下来制作索引中并使用apt-get install
过程中会提示未
Install these packages without verification? [y/N]
况且所有使用apt-get install -y
或者apt-get update -y
命令的全部报错,因为以上安装并没有签名。
因此最好需要把这些本地源也进行签名
制作签名密钥
使用的是gpg,参考资料[1]制作
在目标机使用apt-get
命令之前导入已制作好的key
apt-key add libs/ubuntu/xxx.gpg
制作好密钥之后就要将这些安装进行签名,这里有几条重要的命令如下:
cd /home/xxx/libs/ubuntu
apt-ftparchive release apt/. > apt/Release
### 输入前面设置的GPG KEY密码
cd apt
gpg --clearsign -o InRelease Release
gpg -abs -o Release.gpg Release
到此,deb包的索引目录即制作完成。将libs目录拷贝到目标机,这里依然选在/home/xxx/
目录下
创建本地索引目录
这一步比较简单,包括上一步所提到的
apt-key add libs/ubuntu/xxx.gpg
在制作本地索引,网上很多说法是将文件/etc/apt/sources.list
备份,删除等,再将本地源写入到这入文件中,我觉得这背离了开发中不随意修改的宗旨。我是在目录/etc/apt/sources.list.d
中创建xxx.list
,因此完整的创建本地索引大致命令如下:
if [ -f /etc/apt/sources.list ]; then
mv /etc/apt/sources.list /etc/apt/sources.list.bak
fi
apt-key add libs/ubuntu/lalon.gpg
cat > /etc/apt/sources.list.d/xxx_archive.list <<EOF
deb file:$INSTALL_HOME/libs/ubuntu apt/
EOF
chmod -R 777 $LALON_HOME/libs/ubuntu/apt
apt-get update && apt-get upgrade
备份sources.list是因为,在离线环境无法在线update,而我脚本设置了
set -e
错误即退出,有sources.list肯定无法更新会退出,所以把其移动成.bak文件了。
网上有很多说法是说要把deb目录改成777,我并没有试为什么,因为我直接就把脚本给写上了,也就懒的试了。有兴趣的朋友可以告诉我
至此在本地就可以愉快的使用apt-get install
命令了。
PIP离线安装
pip 包下载
这里同样推荐使用https://mirrors.aliyun.com/pypi/simple/进行下载,当然其他的源也可以,看网速而已。
pip包的下载比apt的包下载简单多了,只需要简单的一条命令即可把相关的依赖包都下载下来
pip download -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
requirements.txt是需要安装的pip包,在线安装的命令即
pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
只需要把install 改成download即可
pip的离线安装
这里离线安装也很简单
pip install --no-index --find-links $INSTALL_HOME/libs/pip/ -r requirements.txt
至此离线的依赖包即可全部安装了。
【参考资料】
[1]https://www.cnblogs.com/silvermagic/p/7665841.html
还有很多忘了,看到了再补充