天嵌 ARM开发社区

 找回密码
 注册
查看: 2803|回复: 2

论道,不论术,6Q移植ubuntu

[复制链接]
igbt70 发表于 2019-8-15 14:41:50 | 显示全部楼层 |阅读模式
      所谓道也就是法则,可以说成思想,所谓术,乃是技术,去操作的过程。
     ARM移植ubunt一直是网友们追寻的重点问题,此论坛有多处问如何移植ubunt到6Q,为何迟迟没有去回答呢?一直没有在论坛搜到答案,所以发此贴,昭告本论坛技术,大家出来回答问题了。
    上个月领导吩咐我在6Q上移植下ubuntu,搜了下百度,搜出来一个移植16.04的教程,看过心血来潮,随即下载Ubuntu arm core 文件系统。按照教程往下操作的时候发现一个问题,竟然没有提到etc目录的配置,打开fstab文件,里面啥都没有,此刻觉得很反常。随后停下一直没动,后来一直在反思,如果没有一个正确的理论做指导,直接抄袭人家操作,这岂不是跟抄作业没有区别。
    现在好多程序员代码都是从百度或谷歌拷贝,从不考虑那天服务器坏了能继续写代码,此刻已经无奈了,最起码人家API的实现过程可以看下嘛,但是从来不考虑。
     经过一系列的思想斗争,觉得程序员必须要有修养,绝不能停留在术的层面。
     那么,下面该讨论下如何移植ubunt移植ARM了。
     先上之间的移植ubuntu16.04的教程:
       1, 下载ubuntu-base-16.04.4-base-armhf.tar.gz
        $ sudo tar zxf ubuntu-base-16.04.4-base-armhf.tar.gz
         解压后得到
         $ ls
            bin   dev  home  media  opt   root  sbin  sys  ubuntu-base-16.04.4-base-armhf.tar.gz  var
            boot  etc  lib   mnt    proc  run   srv   tmp  usr
           file
           然后看看他的内核版本,发现是3.2.0的内核版本。
            $ cd sbin
            $ file fsck
              fsck: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.2.0, BuildID[sha1]=0x10da5d1c95079350998c243b510fb6fe2940c3c4, stripped
             在这边有些疑惑了,我的内核版本是3.0的版本,不知道兼容不兼容
              file ./ss
               ./ss: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.31, not stripped
             上面标出红色的是我之前文件系统命令的linux版本。
           2.安装qemu-user-static工具
              安装qemu-user-static工具
              sudo apt-get install qemu-user-static
             拷贝qemu-arm-static到刚刚解压出来的目录
           3.网络配置
修改根文件系统软件源
$ sudo vim ./etc/apt/sources.list
添加ubuntu arm源,我选择的是中科大的源
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-updates main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-backports main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-proposed main multiverse restricted universe
deb-src http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial-security main multiverse restricted universe
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脚本内容:
#!/bin/bash
echo "MOUNTING"
sudo mount -t proc /proc /home/phy/image/debian-rootfs/proc
sudo mount -t sysfs /sys /home/phy/image/debian-rootfs/sys
sudo mount -o bind /dev /home/phy/image/debian-rootfs/dev
sudo mount -o bind /dev/pts /home/phy/image/debian-rootfs/dev/pts        
sudo chroot /home/phy/image/debian-rootfs/
卸载过程的bash脚本内容:
#!/bin/bash
echo "UNMOUNTING"
sudo umount /home/phy/image/debian-rootfs/proc
sudo umount /home/phy/image/debian-rootfs/sys
sudo umount /home/phy/image/debian-rootfs/dev/pts
sudo umount /home/phy/image/debian-rootfs/dev
当然我们也可以编写一个bash脚本ms.sh来完成挂载和卸载操作,首先回到ubrfs16.04.4的上一级目录,并创建ms.sh文件,
$ cd ~/image
$ vim ms.sh
创建ms.sh文件内容如下:
#!/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
上面脚本参考了https://blog.csdn.net/mountzf/article/details/51707853,做了一些修改,function的定义方式做了修改参考中的文件运行时一直报错,研究了一下,定义方式有点问题,毕竟没有专门学shell,基础太弱了,废了一些时间。
挂载根文件系统
$ sudo sh ms.sh -m /home/phy/image/ubrfs16.04.4/
其中-m表示挂载,-u表示卸载,后面的路径为解压获得的根文件系统所在的路径。chroot后
MOUNTING
root@phy-VM:/# ls
bin   dev  home  media    opt   root  sbin  sys  ubuntu-base-16.04.4-base-armhf.tar.gz  var
boot  etc  lib     mnt    proc  run   srv   tmp  usr

5.安装软件
首先更新源
apt update
更新完成,安装必要软件,这个根据需求安装就可以了。
apt install sudo
apt install language-pack-en-base
apt install ssh
apt install net-tools
apt install ethtool
apt install ifupdown
apt install iputils-ping
apt install rsyslog
apt install htop
apt install vi  
6.用户配置
设置root密码
passwd root
创建用户
adduser phy
设置主机名称和本机IP
echo "i.MX6" > /etc/hostname
echo "127.0.0.1 localhost" >> /etc/hosts
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,也可以等下载到开发板之后在配置,但启动时会很慢。
echo auto eth0 > /etc/network/interfaces.d/eth0
echo iface eth0 inet dhcp >> /etc/network/interfaces.d/eth0
/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镜像文件
$ ls
bin   dev  home  media  opt   root  sbin  sys  ubuntu-16.04.4-core-armhf.tar.bz2  var
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下。我采用的是文件共享的方式将文件从虚拟机中拷贝到宿主计算机。
    教程已经完毕,可是我没有发现etc的配置,很奇怪,难道说,没有一个正确的思想做指导我真的要停止在这边吗,希望论坛技术出来给我指导下,谢谢   


 楼主| igbt70 发表于 2019-8-16 15:39:09 | 显示全部楼层
发现此论坛就是一个死区,2天了都没人游览我的帖子,就算管理员给个消息闪两下,心里也比较舒服了,不给力啊
 楼主| igbt70 发表于 2019-8-16 15:43:51 | 显示全部楼层
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-20 15:09 , Processed in 1.046875 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表