Ubuntu离线安装包制作

2019-05-09  本文已影响0人  qboy0000

最近编写的一个python程序需要制作一个安装脚本,之前其实是有安装脚本的,但是是基于在线安装的,要制作一个离线的安装包,最终发布在ubuntu中。整个安装大约分成三个部分:

  1. apt install 安装包
  2. 源代码安装
  3. 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
还有很多忘了,看到了再补充

上一篇下一篇

猜你喜欢

热点阅读