如何基于ubuntu base制作一个可用于交叉编译的sysroot

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容