移植ubuntu 16.04.4 到arm平台(i.MX6UL)

2019-07-13 07:03发布

原文地址:https://blog.csdn.net/sinat_37141443/article/details/80882219 入门级文档。 由于工作需求,开始尝试移植ubuntu 16.04 根文件系统到i.MX6UL平台。以前主要从事一些单片机方面的开发,开始做linux上的开发也是有点摸不着头脑,到处搜索,尝试,在此做一下开发笔记。 开发环境:VM 14 Pro 操作系统:ubuntu 16.04 开发板:飞凌 OKMX6UL -C2 V1.0 ( i.MX6UL )  1.下载根文件系统 首先创建保存路径  
  1. $ mkdir ~/image
  2. $ cd image
  3. $ mkdir ubrfs16.04.4
  4. $ cd ubrfs16.04.4
下载官方根文件系统。其他资料里提到的都是ubuntu-core,但进入到 http://cdimage.ubuntu.com/ ,发现文件命名方式和以前不一样了,于是我选择了ubuntu-base-16.04.4-base-armhf.tar.gz,先进入到保存文件系统的目录,我的目录是 ~/image/ubrfs16.04.4 下载ubuntu-base-16.04.4-base-armhf.tar.gz, $ wget http://cdimage.ubuntu.com/ubuntu-base/releases/16.04.4/release/ubuntu-base-16.04.4-base-armhf.tar.gz 解压文件系统,一定要用root权限解压,否则后面会出现各种奇怪的问题。(已经踩过坑了,多么痛得领悟。。。),我选择直接在当前目录解压。 $ sudo tar zxf ubuntu-base-16.04.4-base-armhf.tar.gz 解压后得到  
  1. $ ls
  2. bin dev home media opt root sbin sys ubuntu-base-16.04.4-base-armhf.tar.gz var
  3. boot etc lib mnt proc run srv tmp usr
2.安装qemu-user-static工具 安装qemu-user-static工具 sudo apt-get install qemu-user-static 拷贝qemu-arm-static到刚刚解压出来的目录 $ sudo cp /usr/bin/qemu-arm-static ./usr/bin/ 3.网络配置 修改根文件系统软件源 $ sudo vim ./etc/apt/sources.list 添加ubuntu arm源,我选择的是中科大的源  
  1. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
  2. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
  3. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
  4. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
  5. deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
  6. deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
  7. deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
  8. deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
  9. deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
  10. deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
为了制作成功的根文件系统能够联网,可以直接拷贝本机的dns配置文件到根文件系统的相应位置, $ sudo cp /etc/resolv.conf ./etc/resolv.conf 4.挂在根文件系统并chroot 首先在本机挂载刚刚下载好的文件系统,联网完成相应的配置,然后载烧录到开发板上。 需要挂载proc, sys, dev, dev/pts等文件系统。 挂载过程的bash脚本内容:  
  1. #!/bin/bash
  2. echo "MOUNTING"
  3. sudo mount -t proc /proc /home/phy/image/debian-rootfs/proc
  4. sudo mount -t sysfs /sys /home/phy/image/debian-rootfs/sys
  5. sudo mount -o bind /dev /home/phy/image/debian-rootfs/dev
  6. sudo mount -o bind /dev/pts /home/phy/image/debian-rootfs/dev/pts
  7. sudo chroot /home/phy/image/debian-rootfs/
卸载过程的bash脚本内容:  
  1. #!/bin/bash
  2. echo "UNMOUNTING"
  3. sudo umount /home/phy/image/debian-rootfs/proc
  4. sudo umount /home/phy/image/debian-rootfs/sys
  5. sudo umount /home/phy/image/debian-rootfs/dev/pts
  6. sudo umount /home/phy/image/debian-rootfs/dev
当然我们也可以编写一个bash脚本ms.sh来完成挂载和卸载操作,首先回到ubrfs16.04.4的上一级目录,并创建ms.sh文件, $ cd ~/image $ vim ms.sh 创建ms.sh文件内容如下:  
  1. #!/bin/bash
  2. mnt ()
  3. {
  4. echo "MOUNTING"
  5. sudo mount -t proc /proc ${2}proc
  6. sudo mount -t sysfs /sys ${2}sys
  7. sudo mount -o bind /dev ${2}dev
  8. sudo mount -o bind /dev/pts ${2}dev/pts
  9. sudo chroot ${2}
  10. }
  11. umnt ()
  12. {
  13. echo "UNMOUNTING"
  14. sudo umount ${2}proc
  15. sudo umount ${2}sys
  16. sudo umount ${2}dev/pts
  17. sudo umount ${2}dev
  18. }
  19.  
  20. if [ "$1" = "-m" ] && [ -n "$2" ];
  21. then
  22. mnt $1 $2
  23. echo "mnt -m pwd"
  24. elif [ "$1" = "-u" ] && [ -n "$2" ];
  25. then
  26. umnt $1 $2
  27. echo "mnt -u pwd"
  28. else
  29. echo ""
  30. echo "Either 1'st, 2'nd or bothparameters were missing"
  31. echo ""
  32. echo "1'st parameter can be one ofthese: -m(mount) OR -u(umount)"
  33. echo "2'nd parameter is the full pathof rootfs directory(with trailing '/')"
  34. echo ""
  35. echo "For example: ch-mount -m/media/sdcard/"
  36. echo ""
  37. echo 1st parameter : ${1}
  38. echo 2nd parameter : ${2}
  39. fi
上面脚本参考了https://blog.csdn.net/mountzf/article/details/51707853,做了一些修改,function的定义方式做了修改参考中的文件运行时一直报错,研究了一下,定义方式有点问题,毕竟没有专门学shell,基础太弱了,废了一些时间。 挂载根文件系统 $ sudo sh ms.sh -m /home/phy/image/ubrfs16.04.4/ 其中-m表示挂载,-u表示卸载,后面的路径为解压获得的根文件系统所在的路径。chroot后  
  1. MOUNTING
  2. root@phy-VM:/# ls
  3. bin dev home media opt root sbin sys ubuntu-base-16.04.4-base-armhf.tar.gz var
  4. boot etc lib mnt proc run srv tmp usr
5.安装软件 首先更新源 apt update 更新完成,安装必要软件,这个根据需求安装就可以了。  
  1. apt install sudo
  2. apt install language-pack-en-base
  3. apt install ssh
  4. apt install net-tools
  5. apt install ethtool
  6. apt install ifupdown
  7. apt install iputils-ping
  8. apt install rsyslog
  9. apt install htop
  10. apt install vi
6.用户配置 设置root密码 passwd root 创建用户 adduser phy 设置主机名称和本机IP  
  1. echo "i.MX6" > /etc/hostname
  2. echo "127.0.0.1 localhost" >> /etc/hosts
  3. echo "127.0.1.1 i.MX6" >> /etc/hosts
7.配置串口和网络dhcp 首先配置串口,这里踩了几次坑,下载到板子上以后发现串口无法输出到超级终端,找了很多方案,终于试出来了,需要做一个链接才行。 ln -s /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@ttymxc0.service 由于我用的是i.mx6ul的平台,需要添加一个名为getty@ttymxc0.service的链接,连接到getty@.service服务。i.mx的平台是ttymxc0,其他平台的名字就不清楚了。如果确定不了名字,一个比较笨的方法就是先把制作好的根文件系统下载到开发板上,超级终端上查看打印出来的log,会在 waiting for device dev-ttymxc0.device 时出现 [Time out] ,Dependency failed for Serial Getty on ttymxc0. 由此就可以知道了。   配置DHCP,也可以等下载到开发板之后在配置,但启动时会很慢。  
  1. echo auto eth0 > /etc/network/interfaces.d/eth0
  2. echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
  3. /etc/init.d/networking restart
推出根文件系统 exit 卸载根文件系统 $ sudo sh ms.sh -u /home/phy/image/ubrfs16.04.4/ 8.制作镜像 进入到根文件系统目录 $ cd ubrfs16.04.4   压缩生成.bz2的镜像 $ sudo tar jcf ubuntu-16.04.4-core-armhf.tar.bz2 * 压缩生成的.bz2镜像文件  
  1. $ ls
  2. bin   dev  home  media  opt   root  sbin  sys  ubuntu-16.04.4-core-armhf.tar.bz2  var
  3. boot  etc  lib   mnt    proc  run   srv   tmp  usr
  9.烧写镜像 我采用的mfgtools来烧写u-boot、zImage、rootfs.tar.bz2文件。飞凌开发板提供的资料将烧写不同类型的系统写成不同类型的VB脚本文件。 首先将上面生成的压缩文件ubuntu-16.04.4-core-armhf.tar.bz2更名为rootfs.tar.bz2, mv ubuntu-16.04.4-core-armhf.tar.bz2 rootfs.tar.bz2 并将文件转到宿主计算机,我用的win10系统。由于mfgtools只有windows版,所以想用它,就只能在windows下。我采用的是文件共享的方式将文件从虚拟机中拷贝到宿主计算机。 在windows系统下将rootfs.tar.bz2拷贝到 ../mfgtools/Profiles/Linux/OS Firmware/files/linux/console/目录下 然后运行脚本烧写到开发板。   附录 mfgtools工具中,ucl2.xml文件中有这么一段  
  1. Formatting rootfs partition
  2. rootfs.tar.bz2" ifdev="MX6UL MX7D">Sending and writting rootfs
  3. Finishing qt4 write
  4. Unmounting rootfs partition
  5. Done
其中写了烧写rootfs文件的地址和文件名,也可修改它来更改下载镜像的名字。   参考:   1.定制适用于ARM平台的Ubuntu rootfs(根文件系统):https://blog.csdn.net/mountzf/article/details/51707853   2.移植ubuntu core到Arm开发板:https://blog.csdn.net/kickxxx/article/details/15341079 --------------------- 作者:Vincent_Penn 来源:CSDN 原文:https://blog.csdn.net/sinat_37141443/article/details/80882219?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!