1. 下载一个指定版本的ubuntu base文件
Index of /ubuntu-base/releases
tar -xvf ubuntu-base-20.04.1-base-amd64.tar.xz -C .
cd ubuntu-base-20.04.1-base-amd64
2. 进入rootfs目录进行挂载:
sudo mount --bind /dev dev && \
sudo mount --bind /dev/pts dev/pts && \
sudo mount --bind /sys sys && \
sudo mount --bind /proc proc && \
sudo chroot $PWD
3. 编辑 etc/resolv.conf 并加入 nameserver 8.8.8.8
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf > /dev/null
4. 安装开发库
apt update
apt install libc6-dev libsystemd-dev libudev-dev libsdl2-dev libsystemd-dev libdbus-1-dev libmount-dev usbutils
# 对于依赖vulkan的还要安装以下库
apt install libvulkan1 libvulkan-dev vulkan-tools
5. 清理不必要的文件
apt clean
rm -rf /tmp/* /var/tmp/*
6. 退出并移除挂载
exit
sudo umount dev/pts dev sys proc
6. 修复权限
sudo chmod -R a+r ubuntu-base-20.04.1-base-amd64/
7. 将sysroot里的库软链接地址从绝对路径改成相对路径
apt install symlinks
symlinks -cr /
常见报错:
Reading package lists... Done
W: GPG error: http://security.ubuntu.com/ubuntu focal-security InRelease: Couldn't create temporary file /tmp/apt.conf.Q3Rffp for passing config to apt-key
E: The repository 'http://security.ubuntu.com/ubuntu focal-security InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
解决办法是:
chmod 1777 /tmp # 给/tmp赋予正确权限
apt clean 清理apt缓存
Error: Archives directory /var/cache/apt/archives/partial is missing. - Acquire (2: No such file or directory)
解决办法是:
mkdir -p /var/cache/apt/archives/partial
apt autoclean
8. 如何制作arm64的rootfs
步骤跟上面几乎一样,可以在arm64的docker里制作,借助本地运行arm64的docker:
sudo apt-get install qemu qemu-user-static binfmt-support
docker pull --platform=linux/arm64 arm64v8/ubuntu:22.04
9. mount & umount 的便捷脚本
#!/bin/bash
function mnt() {
echo "MOUNTING"
sudo mount -t proc /proc ${2}proc
sudo mount -t sysfs /sys ${2}sys
sudo mount -o bind /dev ${2}dev
sudo mount -o bind /dev/pts ${2}dev/pts
sudo chroot ${2}
}
function umnt() {
echo "UNMOUNTING"
sudo umount ${2}proc
sudo umount ${2}sys
sudo umount ${2}dev/pts
sudo umount ${2}dev
}
if [ "$1" == "-m" ] && [ -n "$2" ] ;
then
mnt $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umnt $1 $2
else
echo ""
echo "Either 1'st, 2'nd or both parameters were missing"
echo ""
echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
echo ""
echo "For example: ch-mount -m /media/sdcard/"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi