平台:Ubuntu32位虚拟机 目标平台:海思Hi3559V100 工欲善其事必先利其器,在进行嵌入式linux开发的时候需要搭建一个能够调试的环境,在电脑上无疑是最好最方便的了。至于虚拟机怎么搭建就不多说了,这里我用的32位的Ubuntu16.04主要是方便编译之前文章中自己写的OS 首先安装aarch64-linux-gnu工具链
apt-cache search aarch64-linux-gnu-gcc
接下来选择一个你需要的gcc版本就可以了 刚开始的时候使用的GCC版本稍微低一点,避免出现因为版本过新导致的故障。
sudo apt-get install gcc-4.9-aarch64-linux-gnu-gcc
对于一个烧录都好半个小时乃至一个小时的系统来说debug一次真的真的太心累了,直接是对人的折磨,所以虚拟机是非常有必要的,arm环境的模拟器用的qemu,还是老样子直接安装就好了。
sudo apt-get install qemu qemu-user-static
然后开始着手模拟一个base ubuntu的arm64环境 首先下载rootfs
mkdir ~/rootfs && cd ~/rootfs
wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.1/release/ubuntu-base-16.04.2-base-arm64.tar.gz
mkdir ubuntu-rootfs
tar -xvf ubuntu-base-16.04.2-base-arm64.tar.gz -C ubuntu-rootfs
cd ubuntu-rootfs
ls
把qemu的静态模拟器放到根目录下面去
cp /usr/bin/qemu-aarch64-static usr/bin
cp -b /etc/resolv.conf etc/
写一个用来挂载分区的bash shell,内容如下:
#!/bin/bash
function mount() {
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 umount() {
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
mount $1 $2
elif [ "$1" == "-u" ] && [ -n "$2" ];
then
umount $1 $2
else
echo ""
echo "第1个参数和第2个参数都是必要参数"
echo ""
echo "第1个参数为-m时候为挂载、为-u的时候为卸载"
echo "第二个参数表示需要挂载的根文件目录)"
echo ""
echo ".eg: ch-mount -m ./workspace/rootfs/"
echo ""
echo 1st parameter : ${1}
echo 2nd parameter : ${2}
fi
通过ch-mount.sh脚本chroot到arm64的文件系统下
./ch-mount.sh -m ubuntu-rootfs
这个时候就进来到虚拟机的根目录下面来了,此时arm64的文件也能执行了
(我这里是用windows去连接ubuntu linux的虚拟机的,在linux下执行也是同样的道理) 此时需要配置一下基本的工具环境
apt-get install net-tools network-manager openssh-server
注意:openssh-server工具很重要,在没有屏幕的情况下使用开发板没有ssh连接就是一摸黑
passwd yourusername
passwd root
你要是嫌麻烦可以直接把你的虚拟机的shadow、group、passwd三个文件直接复制到目标arm linux的/etc文件夹里面
sudo cp /etc/{shadow,group,passwd} /workspace/ubuntu-rootfs/etc
设置主机名
echo 'ubuntu.arm64' > /etc/hostname
海思的到此结束了,因为串口输出也不是这里输出的,直接跳到下一步,海思的ubuntu系统修改后面我会给出,基本上到此为止的东西只需要复制到海思的目标板上去不覆盖原有的就行了,因为海思板子是官方给的busybox的,所以整起来有点麻烦。 其他ARM64的板子继续
因为暂时未安装桌面,所以这里的配置要具体和内核中登录的串口的设备对应起来,不然对导致无法通过串口登录的问题。 在 /etc/init/ 下添加或修改ttyS0.conf
start on stopped rc or RUNLEVEL=[12345]
stop on RUNLEVEL [!12345]
respawn
exec /sbin/getty -L 115200 tty000 vt102
白板上别忘了在/etc/prifile里写
echo "Start SSH server"
/usr/bin/sshd
这里我的登录串口为tty000,因为不同板子有所差异,我ZYNQ的板子是ttyACM0.所以还是要根据板子进行调整。
退出arm64模拟文件系统
exit
./ch-mount -u ubuntu-rootfs
这里有两种操作任选一个都可以
make_ext4fs -s -l 1024M rootfs.ext4 ./rootfs
形如make_ext4fs -s -l 314572800 -a root -L linux ./rootfs_qt.img ./root
make_ext4fs [ -l <len> ] [ -j <journal size> ] [ -b <block_size> ] [ -g <blocks per group> ] [ -i <inodes> ] [ -I <inode size> ] [ -L <label> ] [ -f ] [ -a <android mountpoint> ] [ -z | -s ] [ -J ] <filename> [<directory>]
dd if=/dev/zero of=ubuntu-rootfs.img bs=1M count=2048
sudo mkfs.ext4 ubuntu-rootfs.img
将arm64文件系统内容制作到ubuntu-rootfs.img
mkdir ubuntu-mount
sudo mount ubuntu-rootfs.img ubuntu-mount/
sudo cp -rfp ubuntu-rootfs/* ubuntu-mount/
sudo umount ubuntu-mount/
e2fsck -p -f ubuntu-rootfs.img
resize2fs -M ubuntu-rootfs.img
打开你的板子不出意外远程ssh也可以连接了