搭建apt源(ubuntu18版)

在ubuntu18搭建自用的apt源。

  • 服务器端搭建web http服务,客户端修改apt的source.list文件使用搭建的源。

  • 对于服务器端,需要生成Package信息和Release信息以供客户端拉取时知悉有哪些安装包,并且进行GPG密钥比对。

  • 服务器端需要使用GPG生成公钥,然后客户端添加该公钥,如此在进行更新和下载时才能通过GPG的密钥比对。

需要安装

1
2
3
4
apache # web http服务
gpg # 生成密钥
dpkg-dev # 生成package信息
apt-mirrors # 也许需要-同步各大软件源

新建一个文件夹用于存放安装包

1
2
3
4
5
$ mkdir repo && cd repo
#搭建http服务
$ apt-get install Apache2
$ systemctl status apache2 # 查看状态 处于running
$ systemctl start apache2  # 状态未运行 执行打开服务

访问 http://192.168.10.5/可看到页面。 使用软连接ln -s /repo /var/www/html/ubuntu,打开``http://192.168.10.5/ubuntu即可访问/repo`下的安装包.

搭建

1
2
3
4
5
#需要先安装 gpg 生成key
$ apt-get install pgp 
$ gpg --gen-key # 生成
$ gpg --list-keys #查看
$ gpg --export-secret-key keyName > ./lk.asc # 将对应的key导出文件

注意:每次添加新的安装包时都需要更新信息!!!!

1
2
3
4
5
# 生成相关信息---每次添加新的安装包都需要更新
$ dpkg-scanpackages -m . > Packages  # 扫描 Debian 包生成 Packages 文件
$ apt-ftparchive release . > Release # 生成 Release 文件
$ gpg --armor --detach-sign -o Release.gpg Release # 生成 Release.gpg
$ gpg --clearsign -o InRelease Release # 生成 InRelease

使用

主要需要更改source.list和添加源服务器的密钥

1
2
3
4
5
6
7
8
9
$ wget http://192.168.10.5/ubuntu/lk.asc   # 下载密钥,前提是服务器已经上传
$ sudo apt-key add lk.asc  # 添加密钥
# 编辑 /etc/apt/source.list 替换为以下内容
$ deb [trusted=yes] http://192.168.10.5/ubuntu  ./
# 更新源
$ apt-get update
$ apt-get install whois   #安装测试
# 删除apt源的公钥
$ apt-key del '3C10 8EFB E970 F6E2 199E  7FAA 4B58 941A AEE3 5EFC'

问题

1
2
3
4
5
6
# 遇到apache 403
设置软链接吧,不要更改默认目录
检查防火墙 检查端口 
# 客户端显示GPG ERROR
添加导入的密钥吧
# 客户端apt-get update显示 签名无效

更新

使用脚本下载包,你可以在当前目录下得到archives目录,下载的安装包就在其中:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
apt-get clean
mkdir -p log
touch log/package.log
logfile=log/package.log
ret=""
function getDepends()
{
   echo "fileName is" $1>>$logfile
   # use tr to del < >
   ret=`apt-cache depends $1|grep Depends |cut -d: -f2 |tr -d "<>"`
   echo $ret|tee  -a $logfile
}
## packages: 下载包列表
packages="wget telnet"
for package in $packages
do
	apt install $package --reinstall -d -y # 先下载软件包
	libs = $package # 需要获取其所依赖包的包
	# 递归三层下载依赖包 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)"
        	newlist="$newlist $added"
        	apt install $added --reinstall -d -y # 下载依赖包...递归
    	done
    	libs=$newlist
	done
done 
cp -r /var/cache/apt/archives ./

生成相关信息—每次添加新的安装包都需要更新。

1
2
3
4
dpkg-scanpackages -m . > Packages  # 扫描 Debian 包生成 Packages 文件
apt-ftparchive release . > Release # 生成 Release 文件
gpg --armor --detach-sign -o Release.gpg Release # 生成 Release.gpg
gpg --clearsign -o InRelease Release # 生成 InRelease

查看软件包的依赖apt-cache depends packageName 只下载不安装 apt install $packageName --reinstall -d -y 两者结合,先查看软件包的依赖包,然后依次下载并且再次递归查看依赖包的依赖。

参考

如何将GPG私钥和公钥导出到文件

ubuntu 创建本地deb软件库时,对Release文件做gpg签名 v2

Ubuntu 搭建 APT 仓库

哦吼是一首歌。
Built with Hugo
Theme Stack designed by Jimmy