主机配置:Ubuntu 18.04
- 配置基本服务
下载安装依赖
sudo apt install debootstrap qemu qemu-user-static qemu-system qemu-utils qemu-system-misc binfmt-support dpkg-cross debian-ports-archive-keyring --no-install-recommends
生成目标镜像,配置环境
dd if=/dev/zero of=rootfs.img bs=1M count=4096
mkdir rootfs
mkfs.ext4 rootfs.img
sudo mount rootfs.img rootfs
执行下debootstrap
sudo debootstrap --arch=riscv64 --foreign --keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg --include=debian-ports-archive-keyring sid ./rootfs http://deb.debian.org/debian-ports
如果遇到GPG error: E852514F5DF312F6
,需要更新下本地钥匙串。
wget http://ftp.cn.debian.org/debian/pool/main/d/debian-ports-archive-keyring/debian-ports-archive-keyring_2022.02.15_all.deb
sudo dpkg -i debian-ports-archive-keyring_2022.02.15_all.deb
基本文件系统就准备好了
- 编译安装最新版的QEMU
安装依赖。
sudo apt-get install -y pkg-config git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
下载,配置QEMU并编译
wget https://download.qemu.org/qemu-7.0.0.tar.xz
tar -xf qemu-7.0.0.tar.xz
cd qemu-7.0.0/
./configure --static --target-list=riscv64-linux-user
make
将QEMU打包成 DEB
并安装
sudo apt-get install checkinstall
sudo checkinstall make install
sudo apt-get install ./*.deb
或直接安装
sudo make install
- 配置
binfmt
chrootの先で
/usr/bin/qemu-riscv64-static
が実行できること。riscv64が実行できるbinfmtが準備されていること。
先复制一份
qemu-riscv64-static
を./riscv/usr/bin/qemu-riscv64-static
に置いているが、今回の目的であれば、/usr/bin/qemu-riscv64-static
に直におく必要はない。chrootの先で/usr/bin/qemu-riscv64-static
というバイナリが存在しさえすればいいだけなので。
sudo cp -rf /usr/bin/qemu-riscv64-static rootfs/usr/bin/
配置binfmt
的magic
和mask
cat > /tmp/riscv64 <<- EOF
package qemu-user-static
type magic
offset 0
magic \x7f\x45\x4c\x46\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xf3\x00
mask \xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff
interpreter /usr/bin/qemu-riscv64-static
EOF
导入binfmt
sudo update-binfmts --import /tmp/riscv64
检查一下有没有配置成功
ls /proc/sys/fs/binfmt_misc/riscv64
-> /proc/sys/fs/binfmt_misc/riscv64
(如果没有输出,sudo systemctl restart binfmt-support 一下)
进入
chroot
环境sudo chroot rootfs/
配置目标
rootfs
先让debootstrap
把事情干完。
/debootstrap/debootstrap --second-stage
再配置下软件源
cat >/etc/apt/sources.list <<EOF
deb http://ftp.ports.debian.org/debian-ports sid main
deb http://ftp.ports.debian.org/debian-ports unstable main
deb http://ftp.ports.debian.org/debian-ports unreleased main
deb http://ftp.ports.debian.org/debian-ports experimental main
EOF
安装软件包
apt-get update
apt-get install -y util-linux haveged openssh-server systemd kmod initramfs-tools conntrack ebtables ethtool iproute2 iptables mount socat ifupdown iputils-ping vim neofetch sudo chrony pciutils
配置网络
mkdir -p /etc/network
cat >/etc/network/interfaces <<EOF
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
EOF
cat >/etc/resolv.conf <<EOF
nameserver 1.1.1.1
nameserver 8.8.8.8
EOF
配置分区
cat >/etc/fstab <<EOF
LABEL=rootfs / ext4 user_xattr,errors=remount-ro 0 1
EOF
配置root
密码
echo "root:riscv" | chpasswd
清理缓存
apt-get clean
rm -rf /var/cache/apt/
退出chroot
,解除挂载
exit
sudo umount rootfs
输出得到的rootfs.img
就是目标根文件。