给 deepin 修包(创世篇)

安装最新最热的 deepin

如果你使用了物理板卡,那么你可以在文档列表中找到对应的安装教程。如果你没有板卡那么可以参考Cherrling的教程用qemu来启动,或者在开发板漂流计划中白嫖一个。

获取应用

丢掉所有的工作流和坑,只是拽源码打包的话,你应该在

1
sudo vim /etc/apt/sources.list

将 community 和 ci 源对应行复制粘贴,并将粘贴行前的 deb 改为 deb-src 。这两个源码源是最终我们确定一个软件包是否真实存在的最终判据,具体原因在《给 deepin 修包(入世篇)》进行讲解。

假设说你要打 gperf ,那你可以使用

1
sudo apt source gperf

获得源码包。

创建一个干净的 rootfs

为了防止你打的包被奇怪的依赖项干扰,确保这个包能够在所有的同系统环境下工作,我们需要创建一个干净的 rootfs 并在内部操作打包的其他操作。注意这里所有的修包的改动都应在新建的 rootfs 之外完成,否则文件从 rootfs 移出后所属用户和用户组依然为 root ,会为后续工作带来不便。

以下命令看起来多而复杂,实际上使用的时候中间打分号然后复制粘贴即可。

使用如下的命令可以创建一个 rootfs 并把刚才获得的 gperf 丢到 rootfs 中打包。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
mkdir rootfs ; cd rootfs

# 通过软件源构建 rootfs
sudo mmdebstrap < /etc/apt/sources.list > chroot.tar
sudo tar xvf chroot.tar

# 一些 java 和日志相关的依赖需要这三个根目录的子目录,进行挂载
# 如果你在修包的半路重启了开发板,应当重新挂载这三个目录
sudo mount --bind /dev ./dev
sudo mount --bind /proc ./proc
sudo mount --bind /sys ./sys

# 这个新的 rootfs 没有 bash 高亮之类的我们熟悉的功能,把 dotfile 丢进去
# quiltrc-dpkg 是什么在《入世篇》说...
sudo cp ~/.bashrc ~/.quiltrc-dpkg ./root

# 一股脑把要打包的东西全丢进来
sudo cp -r ../gperf* ./root

# 进入 rootfs
sudo chroot .

接下来就在这个新环境中操作……

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 将 locale 退回 POSIX ,防止 locale 缺失依赖导致的终端输出混乱
# 这个 unset 每次推出并进入 rootfs 都应该运行一次
unset LANG ; unset LANGUAGE

# 由于 apt 默认对 ca-certificates 进行校验而我们的 rootfs 中没有对应的证书,暂时绕过它,安装证书
echo 'Acquire::https::Verify-Peer "false";' > /etc/apt/apt.conf.d/99verify
apt update
apt install -y ca-certificates
rm /etc/apt/apt.conf.d/99verify

# 安装修包需要的基本依赖
apt install debhelper build-essential devscripts quilt pristine-tar lintian
cd gperf-3.1/

# 避免循环依赖设置环境变量,然后安装源码包构建时需要的依赖
export DEB_BUILD_PROFILES=nocheck ; apt build-dep .

# 打包!
dpkg-buildpackage -j8 -us -uc

如果最后出现了 complete 之类的字样,恭喜你,打包成功。不过还得检查一下包的质量……

1
lintian ../*.changes

这里的输出信息可能很多,尤其许多软件包本身不是在 RISC-V 设备上进行首次构建的,所以绝大多数关于 architecture 的警告都可以忽略,只要检查诸如不可复现之类的架构无关的错误即可。具体的信息在lintian tags中有介绍。

如果 lintian 的检查通过了,那你的包理论上就应该没什么问题了。

但是这只是一个没什么坑的包,甚至是一个游离于整个 deepin 工作流之外的早已稳定的包,而且 debian 文件夹是什么,循环依赖又是什么,这里都没有解释。这些内容等到《入世篇》再说。

工作完成后就可以释放打包的空间了:

1
2
3
4
5
6
7
8
# 退出rootfs
exit

# 取消挂载
sudo umount ./dev ; sudo umount ./proc ; sudo umount ./sys

# 删除 rootfs ,这里不使用 sudo 会由于权限不足无法删除。
sudo rm -rf rootfs
Maybe making a better tomorrow...
Built with Hugo
Theme Stack designed by Jimmy