目前ubuntu主机是20.04,尝试基于24.04的base镜像制作rootfs出错,就又基于20.04的base做了。
安装正点原子的《ubuntu移植参考手册》
host安装qemu
配置rootfs的apt source.list
注意要用http,不能用https
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
#deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal main restricted universe multiverse
#deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-updates main restricted universe multiverse
#deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-backports main restricted universe multiverse
#deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu-ports/ jammy main restricted universe multiverse
#准备 mount.sh
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
fi
挂载rootfs到主机
./mount.sh -m xx/ xx为镜像目录
apt update遇到问题
root@zxwl-OptiPlex-7070:/# apt update
Get:1 http://mirrors.aliyun.com/ubuntu-ports focal InRelease [265 kB]
Get:2 http://mirrors.aliyun.com/ubuntu-ports focal-security InRelease [128 kB]
Err:1 http://mirrors.aliyun.com/ubuntu-ports focal InRelease
Couldn't create temporary file /tmp/apt.conf.kSonVN for passing config to apt-key
Err:2 http://mirrors.aliyun.com/ubuntu-ports focal-security InRelease
Couldn't create temporary file /tmp/apt.conf.ObYn9U for passing config to apt-key
Get:3 http://mirrors.aliyun.com/ubuntu-ports focal-updates InRelease [128 kB]
Err:3 http://mirrors.aliyun.com/ubuntu-ports focal-updates InRelease
Couldn't create temporary file /tmp/apt.conf.z5b3L5 for passing config to apt-key
Get:4 http://mirrors.aliyun.com/ubuntu-ports focal-backports InRelease [128 kB]
Err:4 http://mirrors.aliyun.com/ubuntu-ports focal-backports InRelease
Couldn't create temporary file /tmp/apt.conf.iueape for passing config to apt-key
Reading package lists... Done
W: GPG error: http://mirrors.aliyun.com/ubuntu-ports focal InRelease: Couldn't create temporary file /tmp/apt.conf.kSonVN for passing config to apt-key
E: The repository 'http://mirrors.aliyun.com/ubuntu-ports focal 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.
W: GPG error: http://mirrors.aliyun.com/ubuntu-ports focal-security InRelease: Couldn't create temporary file /tmp/apt.conf.ObYn9U for passing config to apt-key
chmod 777 /tmp 就解决了
安装需要的软件
apt update
apt upgrade
apt install sudo
sudo apt install openssh-server
sudo apt install libc6
apt install vim
apt install net-tools
apt install ethtool
apt install ifupdown
apt install iputils-ping
apt install openssh-server # ssh可以访问
apt install binutils #包含strings命令,可以查看glibc版本
umount
./mount.sh -u xx/ xx为镜像目录
make image
shell代码
#!/bin/bash
rootfs_dir=$1
rootfs_file=$2
rootfs_mnt="mnt"
if [ ! $rootfs_dir ] || [ ! $rootfs_file ];
then
echo "Folder or target is empty."
exit 0
fi
if [ -f "$rootfs_file" ]; then
echo "-- Delete exist $rootfs_file ..."
rm -f "$rootfs_file"
fi
echo "-- Create $rootfs_file ..."
dd if=/dev/zero of="$rootfs_file" bs=4M count=6144
sudo mkfs.ext4 -F -L linuxroot "$rootfs_file"
if [ ! -d "$rootfs_mnt" ]; then
mkdir $rootfs_mnt
fi
echo "-- Copy data to $rootfs_file ..."
sudo mount $rootfs_file $rootfs_mnt
sudo cp -rfp $rootfs_dir/* $rootfs_mnt
sudo sync
sudo umount $rootfs_mnt
rm -r $rootfs_mnt
echo "-- Resize $rootfs_file ..."
/sbin/e2fsck -p -f "$rootfs_file"
/sbin/resize2fs -M "$rootfs_file"
echo "-- Done."