Local Debug rootfs.img

rootfs.img本地调试

在x86主机上,使用systemd-container容器技术进行。

sudo apt-get install -y qemu qemu-user-static binfmt-support systemd-container
gunzip rootfs.img.gz
#保留原文件的解压方法
gunzip -c rootfs.img.gz > rootfs.img
sync
[ -d /rootfs ] && sudo umount /rootfs || true
[ -d /rootfs ] && sudo rm -rf /rootfs || true
sudo mkdir -p /rootfs
sudo mount rootfs.img /rootfs
sudo systemd-nspawn --bind /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static -D /rootfs

其中 –bind参数 就是绑定/映射的意思,前面是宿主机地址,后面是nspawn容器地址

比如绑定当前目录到 容器里的 /build 目录:

sudo systemd-nspawn -q --bind /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static --bind $(pwd):/build -D /rootfs

查看版本构建信息:

cat /etc/product-info.build

查看已经安装的deb包列表

dpkg-query -W --showformat='${Package} ${Version}\n'

当然也可以编译deb包,不过相比准备好的docker编译环境,需要手动装一些工具链

apt update #更新apt仓库索引,这步一定要做
apt -y install pbuilder git aptitude dpkg-dev \
     autoconf automake autopoint autotools-dev bsdmainutils cmake cmake-data debhelper dh-autoreconf \
     dh-strip-nondeterminism file gettext gettext-base groff-base intltool-debian m4 man-db po-debconf \
     procps build-essential fakeroot dh-make equivs devscripts quilt

个别软件包安装时需要_apt账户,警告信息:

No sandbox user '_apt' on the system, can not drop privileges

解决办法:

adduser --force-badname --system --no-create-home _apt

如果 只是想下载源码 而不编译 ,则 只需要 安装 dpkg-dev即可。

apt policy可以查看软件包的来源仓库优先级,数字越大,优先级越高。

apt policy wget

apt source下载代码 或者 用 git clone代码仓库

cd /build
apt source wget
cd wget-1.17.1

生成dsc

dpkg-source -b .

安装编译依赖, 依赖于debian/control文件的正确性

bash -x /usr/lib/pbuilder/pbuilder-satisfydepends
#或者用devscripts提供的脚本处理依赖(速度更快)
mk-build-deps -ir

如果想要编译debug包(dbgsym),可以先安装一个脚本deb包:

apt install -y pkg-create-dbgsym

编译deb包, 如果 deb项目是quilt格式,请参考 #54

一般用法: dpkg-buildpackage -us -uc

CI的deb构建参数:
DEB_BUILD_OPTIONS=nocheck dpkg-buildpackage -rfakeroot -d -uc -us -F -J6

编译后的清理

dpkg-buildpackage -Tclean

因linux存在缓存机制,不会立即保存文件到磁盘,要么等,要么在需要立即写盘时输入: sync

首先 exit 退出容器环境

#卸载挂载点
sync
sudo umount /rootfs
sync

#本地调试,倒是**不需要**压缩rootfs.img

#如果需要传递给他人,可以压缩rootfs.img
pigz --fast rootfs.img
sync
e2fsck -f rootfs.img
resize2fs rootfs.img 10G

文档信息