移植ubuntu16.04到arm/aarch64

#移植ubuntu16.04 到arm

ubuntu-base是一个基础的Ubuntu系统,可以理解为最小的Ubuntu系统,本文适用所有arm/aarch64

1.下载ubuntu for arm的源码

[wget方式 32 for arm](wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.4/release/ubuntu-base-16.04.4-base-armhf.tar.gz )
[wget方式 64 for arm](wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.2-base-arm64.tar.gz )

2.安装qemu-user-static

sudo apt-get install qemu-user-static

3.解压ubuntu源码到自己的目录

mkdir $(xxxx)/ubuntu16.04
sudo tar -zxvf ubuntu-base-16.04.4-base-armhf.tar.gz -C $(xxxx)/ubuntu16.04

拷贝qemu-arm-static/qemu-aarch64-static到刚刚解压出来的目录
sudo cp /usr/bin/qemu-arm-static $(xxxx)/ubuntu16.04/usr/bin/
为了制作成功的根文件系统能够联网,可以直接拷贝本机的dns配置文件到根文件系统的相应位置
sudo cp /etc/resolv.conf $(xxxx)/ubuntu16.04/etc/resolv.conf

4.qemu挂载

挂在根文件系统并chroot,首先在本机挂载刚刚下载好的文件系统,联网完成相应的配置,然后载烧录到开发板上,需要挂载proc, sys, dev, dev/pts等文件系统,可以写个脚本,如下

#!/bin/bash 
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} 
}
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 
	echo "mnt -m pwd" 
elif [ "$1" = "-u" ] && [ -n "$2" ]; 
then 
	umnt $1 $2 
	echo "mnt -u pwd" 
else 
	echo "" 
	echo "Either 1'st, 2'nd or bothparameters were missing" 
	echo "" 
	echo "1'st parameter can be one ofthese: -m(mount) OR -u(umount)" 
	echo "2'nd parameter is the full pathof rootfs directory(with trailing '/')" 
	echo "" 
	echo "For example: ch-mount -m/media/sdcard/" 
	echo "" 
	echo 1st parameter : ${1} 
	echo 2nd parameter : ${2} 
fi

然后执行脚本
sudo sh ms.sh -m $(xxxx)/ubuntu16.04
终端响应如下

zw@zw-pc:~/work/v1.2/ubuntu$ sudo sh ms.sh -m ./ubuntu16.04/
[sudo] password for zw: 
MOUNTING
root@zw-pc:/# ls
bin  boot  dev	etc  home  lib	media  mnt  opt  proc  root  run  sbin	srv  sys  tmp  usr  var
root@zw-pc:/# 

5.更新源并安装必要的软件

apt-get update

apt-get install python3
apt-get install vim
apt-getinstall net-tools
apt-get install iputils-ping
apt-get install iproute2
apt-get install isc-dhcp-client
apt-get install telnetd

6.设置root密码,增加新的普通用户

passwd root
adduser xxxxx

7.修改/etc/fstab

根据自己的情况

# stock fstab - you probably want to override this with a machine specific one

/dev/root            /                    auto       defaults              1  1
proc                 /proc                proc       defaults              0  0
devpts               /dev/pts             devpts     mode=0620,gid=5       0  0
tmpfs                /run                 tmpfs      mode=0755,nodev,nosuid,strictatime 0  0
tmpfs                /var/volatile        tmpfs      defaults              0  0

# uncomment this if your device has a SD/MMC/Transflash slot
dev/mmcblk0p3       /media/card          ext4       defaults  0  0

8.执行exit和解绑

exit
sudo sh ms.sh -u $(xxxx)/ubuntu16.04

终端回应如下

root@zw-pc:/# exit
exit
mnt -m pwd
zw@zw-pc:~/work/v1.2/ubuntu$ sudo sh ms.sh -u ./ubuntu16.04/
[sudo] password for zw: 
UNMOUNTING
mnt -u pwd
zw@zw-pc:~/work/v1.2/ubuntu$ 

遇到的问题

1.提示
xxxx is not in the sudoers file. This incident will be reported.
解决方法
在/etc/sudoer文件中添加如下

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
autobrain ALL=(ALL) ALL

# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL

2.提示
sudo: unable to resolve host xxxx但sudo 还是可以正常执行,
解决方法
在/etc/hosts添加

127.0.0.1 localhost.localdomain localhost
127.0.0.1 autobrain

3.串口无法进入到控制台
解决方法

cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@ttyS2.service
ln -s /lib/systemd/system/serial-getty@ttyS2.service /etc/systemd/system/getty.target.wants/
再修改/lib/systemd/system/serial-getty@ttyS2.service把里面的“%i.device”改为“%i”
posted @ 2022-04-27 10:31  tccxy  阅读(1244)  评论(0编辑  收藏  举报