apt get package making - downgoon/hello-world GitHub Wiki

ubuntu 制作 apt-get 源

有了制作 rpm 源的基础,制作 deb 源是大体一样的。需要的东西:

  • deb 包:用工具提前把 deb 包制作好。
  • meta 信息:用dpkg-scanpackages工具,生成 deb 包对应的meta信息。
  • HTTP服务:一个HTTP服务,把生成的meta和deb都放一个目录,并通过HTTP对外提供访问。当然也可以本地 file:// 方式或者 ftp:// 方式。

温馨提醒

尽管deb包是ubuntu上的,但是提供apt-get源,却也可以在centos上,只需要安装dpkg-scanpackages工具即可(它包含在dpkg-dev包里,dpkg-dev表示dpkg的开发版,才包含dpkg-scanpackages),执行命令:

$ yum install dpkg-dev

源制作

HTTP 源

apt-get的HTTP源与yum的有所不同:yum的包和相关meta是在同一个目录下,而apt-get的包和相关目录是有规定的层次的(类似maven的src/main/java和test/main/java,有这种约定)。

服务端配置

假设我们有一个 boxstore 目录,用来存放盒子应用(名字类似AppStore),它的目录结构:

[root@XXX]# tree boxstore
boxstore    # 存放软件的根目录
├── dists  # 约定的meta输出目录 (名字必须叫 dists )
│   └── trusty  # 约定的子目录  (名字必须叫 trusty, 或者其他规定的名字)
│       └── main # 约定的子目录  (名字必须叫 main,或者其他规定的名字)
│           └── binary-armhf  # 不同平台的包,armhf是CPU名。也有叫 binary-x86等的。
│               └── Packages.gz # 生成的meta包,名字必须叫 Packages.gz
└── packs   # 存放 .deb 软件的子目录,名字可以自定义
    └── boxeden_0.2.2_armhf.deb  # .deb 软件,可以多个。

5 directories, 2 files
  • 生成目录结构
cd boxstore
mkdir -p packs dists/trusty/main/binary-armhf
# tree .
.
├── dists
│   └── trusty
│       └── main
│           └── binary-armhf
└── packs
  • 存软件于packs
cp XXX/boxeden_0.2.2_armhf.deb boxstore/packs/
  • 生成meta信息
cd boxstore
dpkg-scanpackages packs /dev/null | gzip > dists/trusty/main/binary-armhf/Packages.gz -r
  • 配置HTTP服务

只需用 nginx,提供一个文件目录浏览服务即可:

location /boxstore {
         alias /path/to/boxstore;
         autoindex on;
         autoindex_exact_size  off;
         autoindex_localtime on;
}

用浏览器访问:http://host:port/boxstore/

客户端配置

  • 添加HTTP源

制作完HTTP源后,就需要在客户端的 apt-get 里添加 HTTP 源。 编辑 /etc/apt/sources.list 文件,增加一行:

$ vim /etc/apt/sources.list
deb [arch=armhf]  http://10.213.42.230/boxstore/ trusty main

因为我们上面只生成了 binary-armhf,针对 armhf 体系的,所以deb [arch=armhf]源限定只提供armhf。末尾的 trusty main 是固定的,跟dists/trusty/main/binary-armhf是对应的。

  • 更新源信息
apt-get update
  • 安装boxeden
apt-get install boxeden
  • 设置代理

有的时候客户端网络环境要求必须设置代理才能访问某些HTTP服务,apt-get 支持 ---proxy 参数设置代理,也支持 http_proxy环境变量:

export http_proxy=http://10.77.145.90:8080
export https_proxy=$http_proxy
export no_proxy="localhost,127.0.0.1,*.local,10.213.42.230"

本地源

apt-get 除了支持 HTTP源外,还支持 FTP 和 本地源。本地源的.deb包 和 meta 信息可以放同一个目录(这点跟yum是一样的)。

依然以 /path/to/boxstore 目录为例,子目录 packs 存放 .deb包,并且直接在 packs 子目录下生成meta信息。

  • 生成meta
cd boxstore
dpkg-scanpackages packs /dev/null | gzip > packs/Packages.gz -r
  • 查看packs
# ls -l packs/
总用量 1120
-rw-r--r-- 1 root root 1139546 4月   4 10:34 boxeden_0.2.2_armhf.deb
-rw-r--r-- 1 root root     405 4月   4 11:08 Packages.gz
  • 客户端配置

编辑 /etc/apt/sources.list 文件,增加一行:

$ vim /etc/apt/sources.list
deb file:///path/to/boxstore/ packs/

注意:格式上,packs 前面有个空格,后面有个斜杠。

  • 更新源并安装
apt-get update
apt-get install boxeden
  • 思考题

本地源安装 和 dpkg -i boxeden_0.2.2_armhf.deb 安装方式有什么区别? 相同点是.deb包都从本地读取,不同点是本地源安装时,会自动分析包的依赖,并下载(除了配置本地源,还需配置依赖包对应的HTTP源);而后者只能手工安装依赖。


参考资料