debootstrap制作arm平台linux
参考资料
一、自动安装
1、组件安装
sudo apt install -y qemu-user-static
sudo apt install -y ubuntu-dev-tools
sudo apt install -y debootstrap
2、命令说明
sudo debootstrap --arch |平台| |发行版本代号| |目录| |安装源|
3、安装debian
sudo mkdir /mnt/debian
sudo debootstrap --arch armhf buster /mnt/debian https://mirrors.tuna.tsinghua.edu.cn/debian/
#常见架构i386、amd64、armel、armhf、arm-64
#下面是debian 11 架构arm-64
#sudo debootstrap --arch arm64 bullseye /mnt/debian_arm64 https://mirrors.tuna.tsinghua.edu.cn/debian/
4、复制qemu
sudo cp /usr/bin/qemu-arm-static /mnt/debian/usr/bin/
5、进入目录更新组件
sudo chroot /mnt/debian
echo "debian-arm" >/etc/hostname
echo "127.0.0.1 localhost" >/etc/hosts
echo "127.0.0.1 debian-arm" >/etc/hosts
echo "nameserver 8.8.8.8" >/etc/resolv.conf
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#只启动shell下面不是必选项
#apt install net-tools vim sudo bash-completion systemd systemd-coredump makedev locales openssh-server pciutils usbutils
passwd root
adduser test
exit
6、制作文件
sudo dd if=/dev/zero of=debian.img bs=1 count=0 seek=1024M
sudo mkfs.ext4 debian.img
sudo mount debian.img /mnt/temp
sudo cp -ar /mnt/debian/* /mnt/temp/
sudo umount /mnt/temp
#空间不足时
#qemu-img resize debian.img +2G
$resize2fs /dev/vda
7、模拟启动
sudo qemu-system-arm -M virt -cpu cortex-a7 -nographic -smp 4 -m 1024 \
-kernel zImage \
-append "console=ttyAMA0,115200 init=/sbin/init root=/dev/vda rw ip=dhcp" \
-drive format=raw,if=none,file=debian.img,id=ha,index=0 -device virtio-blk-device,drive=ha \
-netdev bridge,br=virbr0,id=net0 -device virtio-net-device,netdev=net0,mac=12:22:33:44:55:66
启动界面
[ OK ] Started Getty on tty1.
[ OK ] Started Serial Getty on ttyAMA0.
[ OK ] Reached target Login Prompts.
Debian GNU/Linux 10 test-linnux ttyAMA0
test-linnux login: root
二、手工制作
wget https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cdimage/ubuntu-base/releases/21.04/release/ubuntu-base-21.04-base-armhf.tar.gz
sudo rm -rf /mnt/ubuntu
sudo mkdir /mnt/ubuntu
sudo tar -xvf ubuntu-base-21.04-base-armhf.tar.gz -C /mnt/ubuntu
sudo cp /usr/bin/qemu-arm-static /mnt/ubuntu/usr/bin
sudo mount -t proc /proc /mnt/ubuntu/proc
sudo mount -t sysfs /sys /mnt/ubuntu/sys
sudo mount -o bind /dev /mnt/ubuntu/dev
sudo mount -o bind /dev/pts /mnt/ubuntu/dev/pts
#sudo cp /etc/apt/sources.list /mnt/ubuntu/etc/apt/
sudo cp /etc/resolv.conf /mnt/ubuntu/etc/
sudo chroot /mnt/ubuntu
echo "nameserver 8.8.8.8" >/etc/resolv.conf
echo "ubuntu-arm" >/etc/hostname
echo "127.0.0.1 localhost" >/etc/hosts
echo "127.0.0.1 ubuntu-arm" >/etc/hosts
#passwd root
#adduser test
apt update
apt install -y wget net-tools systemd makedev locales vim openssh-server sudo bash-completion rsyslog
apt install -y systemd-coredump
apt install -y iproute2 udhcpc iputils-ping
exit
#Geographic area: 6 Time zone: 70
#下面运行一次
sudo umount /mnt/ubuntu/proc
sudo umount /mnt/ubuntu/sys
sudo umount /mnt/ubuntu/dev/pts
sudo umount /mnt/ubuntu/dev
#可能要重启一次
sudo rm ubuntu.img
sudo dd if=/dev/zero of=ubuntu.img bs=1 count=0 seek=2048M
sudo mkfs.ext3 ubuntu.img
sudo mount ubuntu.img /mnt/temp
sudo cp -ar /mnt/ubuntu/* /mnt/temp/
sudo umount /mnt/temp
#安装shell
#apt install -y gnome-core gnome-shell gnome-session
apt install xfce4
systemctl set-default multi-user.target
systemctl set-default graphical.target
#ttyAMA0 system 启动
sudo cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@ttyAMA0.service
sudo ln -s /lib/systemd/system/serial-getty@ttyAMA0.service /etc/systemd/system/getty.target.wants/serial-getty@ttyAMA0.service
#"%i.device”这个好像不用改
#sudo cp /mnt/temp/etc/init/tty1.conf /mnt/temp/etc/init/ttyS0.conf
#exec /sbin/getty -L 115200 ttyS0 vt102
测试结果
systemd[1]: Detected virtualization qemu.
Welcome to Ubuntu 21.04!
[ OK ] Started Serial Getty on ttyAMA0.
[ OK ] Reached target Login Prompts.
Starting Hostname Service...
Ubuntu 21.04 ubuntu-arm ttyAMA0
ubuntu-arm login:
三、盒子定制测试
前面作为学习用,下面找个盒做下试验,这个比较浪费时间,所选用盒子资料太少。主要集中在kernel编译烧录和arm-linux版本选择,调试排查错误。
1、ubuntu 下制作镜像文件,过程基本同上。
sudo debootstrap --arch armhf jessie /mnt/jessie http://mirrors.aliyun.com/debian/
sudo cp /usr/bin/qemu-arm-static /mnt/jessie/usr/bin/
sudo mount -t proc /proc /mnt/jessie/proc
sudo mount -t sysfs /sys /mnt/jessie/sys
sudo mount -o bind /dev /mnt/jessie/dev
sudo mount -o bind /dev/pts /mnt/jessie/dev/pts
sudo chroot /mnt/jessie
echo "jessie-arm" >/etc/hostname
echo "127.0.0.1 localhost" >/etc/hosts
echo "127.0.0.1 jessie-arm" >/etc/hosts
echo "nameserver 8.8.8.8" >/etc/resolv.conf
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
passwd root
adduser test
apt-get update
apt-get upgrade
exit
sudo umount /mnt/jessie/proc
sudo umount /mnt/jessie/sys
sudo umount /mnt/jessie/dev/pts
sudo umount /mnt/jessie/dev
sudo dd if=/dev/zero of=jessie.img bs=1 count=0 seek=2048M
sudo mkfs.ext4 jessie.img
sudo mount jessie.img /mnt/temp
sudo cp -ar /mnt/jessie/* /mnt/temp/
sudo umount /mnt/temp
sudo tune2fs -m 5 jessie.img
2、盒子配置
硬件
1 cpu: armv7_a7X4
2 内存: 1G
3 mmc: 8G
4 usb: X2
5 hdmi: X1
6 sd: X1
setenv baudrate 115200
setenv ethaddr 00:00:00:00:00:00
setenv ipaddr 192.168.1.100
setenv netmask 255.255.255.0
setenv gatewayip 192.168.1.1
setenv serverip 192.168.1.10
setenv bootdelay 5
setenv bootcmd 'mmc read 0x0 0x1000000 0x1000 0x4000;bootm 0x1000000;'
tftp 0x1000000 kernel.bin;
mmc write 0x0 0x1000000 0x1000 0x4000
setenv bootargs ' init=/bin/init console=ttyAMA0,115200 root=/dev/mmcblk0p6 rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(fastboot),1M(bootargs),10M(kernel),2048M(linux),2048M(ubuntu),2048M(debian),128M(free) '
saveenv
reset
===============
mount /dev/mmcblk0p5 /mnt/rootfs
mkdir /mnt/rootfs/test
cp -r /kmod /mnt/rootfs
cp -r /dev /mnt/rootfs/test
cp -r /dev /mnt/rootfs
==============
#vi /mnt/rootfs/bin/init
=============
#!/bin/sh
#开启autofs和复制dev后可注释掉
#mount -t proc proc /proc
#mount -vt sysfs sysfs /sys
#mount -v --bind /test/dev /dev
#mount -o bind /test/dev/pts /dev/pts
cd /
cd kmod
./load
cd /
exec /sbin/init
:wq
chmod 777 /mnt/rootfs/bin/init
#cp 文件
mount /dev/mmcblk0p4 /test
cp /test/usr/lib /usr
cp /test/usr/share /usr
....
3、网络配置
#手工设置
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.1.1
#自动设置
vi /etc/network/interfaces
auto lo
iface lo inet loopback
# To use dhcp:
#
# auto eth0
# iface eth0 inet dhcp
auto eth0
iface eth0 inet static
address 192.168.1.100
network 192.168.1.0
netmask 255.255.255.0
broadcast 192.168.1.255
gateway 192.168.1.1
4、 桌面和vnc
#安装
apt-get install sudo net-tools xrdp xfce4 tightvncserver
#启动
vncserver :1 -geometry 800x600 -depth 16 -pixelformat rgb565
#关闭
vncserver -kill :1
#连接
IP:5901
5、shell启动界面
systemd[1]: systemd 215 running in system mode. (+PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR)
systemd[1]: Detected architecture 'arm'.
Welcome to Debian GNU/Linux 8 (jessie)!
[ OK ] Reached target Multi-User System.
[ OK ] Reached target Graphical Interface.
Starting Update UTMP about System Runlevel Changes...
[ OK ] Started Update UTMP about System Runlevel Changes.
Debian GNU/Linux 8 jessie-arm ttyAMA0
jessie-arm login:
6、xfce4 图形界面vnc连接
7、问题
1、ttyAMA0登录
vi /etc/inittab
T2:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
2、内核devtmpfs支持
CONFIG_DEVTMPFS=y
CONFIG_DEVTMPFS_MOUNT=y
3、内核CGROUPS支持
CONFIG_CGROUPS=y
#其他配置按需修改:
CONFIG_AUTOFS4_FS=y
CONFIG_FHANDLE=y
CONFIG_EXPORTFS=y
CONFIG_UNIX_DIAG=y
4、soket: Permission deniedsoket
ping 127.0.0
setcap cap_net_raw+p /bin/ping
vi /etc/group
inet:x:3003:root
net_raw:x:3004:root
cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@ttyAMA0.service
ln -s /lib/systemd/system/serial-getty@ttyAMA0.service /etc/systemd/system/getty.target.wants/serial-getty@ttyAMA0.service
#临时将"%i.device”改为“%i”,仍然报错但可登录,将这两行注释后不再报错,影响不大先不管吧。
#key的问题 --keyring=/usr/share/keyrings/ubuntu-archive-keyring.gpg
8、尝试
音视频涉及HDMI驱动,这个比较复杂,未深入研究,以后有时间来玩。
已测试成功部分:
1、实现ssh连接
2、实现hdmi播放mp3
3、实现hdmi播放mp4 画面不太正常,未分析。
4、实现hdmi显示xfce4
5、优化启动脚本及流程(暂时没时间)