查看: 4803|回复: 0

【Marvell ESPRESSObin】定制全新的系统镜像(基于UBUNTU 16.04)

[复制链接]
  • TA的每日心情
    开心
    2016-7-19 10:35
  • 签到天数: 8 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2017-4-5 20:13:39 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 netlhx 于 2017-4-5 20:59 编辑

    严格来讲,定制一个全新的系统镜像包括三个部分:UBOOT, KERNEL及ROOTFS。

    由于官方给出的资源中,UBOOT部分的烧录还没有完整的资料(如哪位有该资料,请告知,感谢!),所以虽然有源码,但是也不敢轻易乱动。KERNEL部分请参考tjcfeng的帖子,这里不再讨论。

    本文介绍使用ubuntu 16提供的ROOTFS并将之与KERNEL整合,实现自己的定制系统。

    http://cdimage.ubuntu.com/ubuntu-base/releases这里下载UBUNTU 16的根文件系统,

    TIM截图20170405201840.png

    解压到ROOTFS目录下,如下图

    TIM截图20170405202049.png

    这是一个根文件系统的目录结构,由于我们下载的是CORE版,所以只包括最基本的文件系统,很多实用程序及工具都没有包括,另外也没有进行配置。

    接下来使用CHROOT来实现最小系统的定制。如何进入CHROOT系统需要执行一系列的命令,这里贡献一个老外写的进入CHROOT的脚本,如下
    1. function mnt() {
    2.     echo "MOUNTING"
    3.     sudo mount -t proc /proc ${2}proc
    4.     sudo mount -t sysfs /sys ${2}sys
    5.     sudo mount -o bind /dev ${2}dev
    6.     sudo mount -o bind /dev/pts ${2}dev/pts
    7.     sudo chroot ${2}
    8. }

    9. function umnt() {
    10.     echo "UNMOUNTING"
    11.     sudo umount ${2}proc
    12.     sudo umount ${2}sys
    13.     sudo umount ${2}dev/pts
    14.     sudo umount ${2}dev

    15. }


    16. if [ "$1" == "-m" ] && [ -n "$2" ] ;
    17. then
    18.     mnt $1 $2
    19. elif [ "$1" == "-u" ] && [ -n "$2" ];
    20. then
    21.     umnt $1 $2
    22. else
    23.     echo ""
    24.     echo "Either 1'st, 2'nd or both parameters were missing"
    25.     echo ""
    26.     echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
    27.     echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
    28.     echo ""
    29.     echo "For example: ch-mount -m /media/sdcard/"
    30.     echo ""
    31.     echo 1st parameter : ${1}
    32.     echo 2nd parameter : ${2}
    33. fi

    复制代码
    只需要执行sudo bash chroot.sh -m rootfs命令就可以进行chroot模式,这里的chroot.sh是脚本程序的名称,rootfs是具体的根文件解压后的目录名。

    进入CHROOT主要做一些实际的配置工作,如添加一个用户名,配置终端参数,安装一些基本的网络配置程序(PING,IFCONFIG及桥接需要的一些实用工具)。

    因为进入CHROOT之后基本上与使用普通的LINUX系统差别不大,所以这里也不详述。

    本次定制的根文件系添加一个用户espresso,密码为bin,具体命令如下
    1. useradd -m -g users -G sudo,audio,video,staff espresso
    复制代码
    安装的实用软件包主要有:
    • dhcp
    • ping
    • bridge-utils
    • net-utils
    • ssh

    实际上现在还只是一个最小系统,以后联网后,需要什么就安装什么。

    根文件系统的定制相对简单,不过官方的教程是根据14.04来介绍的,在UBUNTU 16中,已经使用了SYSTEMD代替了SYSV的INIT脚本,所以在定制过程中serial的启用碰到了问题,就是串口不能登录了,在系统启动后终端完全不能用,好在有GOOGLE,爬文后,修改TTY的配置脚本如下
    1. #  This file is part of systemd.
    2. #
    3. #  systemd is free software; you can redistribute it and/or modify it
    4. #  under the terms of the GNU Lesser General Public License as published by
    5. #  the Free Software Foundation; either version 2.1 of the License, or
    6. #  (at your option) any later version.

    7. [Unit]
    8. Description=Getty on %I
    9. Documentation=man:agetty(8) man:systemd-getty-generator(8)
    10. Documentation=http://0pointer.de/blog/projects/serial-console.html
    11. After=systemd-user-sessions.service plymouth-quit-wait.service
    12. After=rc-local.service

    13. # If additional gettys are spawned during boot then we should make
    14. # sure that this is synchronized before getty.target, even though
    15. # getty.target didn't actually pull it in.
    16. Before=getty.target
    17. IgnoreOnIsolate=yes

    18. # On systems without virtual consoles, don't start any getty. Note
    19. # that serial gettys are covered by serial-getty@.service, not this
    20. # unit.
    21. ConditionPathExists=/dev/tty0

    22. [Service]
    23. # the VT is cleared by TTYVTDisallocate
    24. ExecStart=-/sbin/agetty --login-pause --autologin espresso --noclear %I $TERM
    25. Type=idle
    26. Restart=always
    27. RestartSec=0
    28. UtmpIdentifier=%I
    29. TTYPath=/dev/%I
    30. TTYReset=yes
    31. TTYVHangup=yes
    32. TTYVTDisallocate=yes
    33. KillMode=process
    34. IgnoreSIGPIPE=no
    35. SendSIGHUP=yes

    36. # Unset locale for the console getty since the console has problems
    37. # displaying some internationalized messages.
    38. Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

    39. [Install]
    40. WantedBy=getty.target
    41. DefaultInstance=ttyMV0
    复制代码
    ESPRESSOBIN中的SERIAL终端名称为ttyMV0,这里按要求修改即可。另外这里设定了SERIAL的自动登录,为了更安全的操作,没有使用ROOT用户登录,使用的是新建立的用户espresso来登录,如果需要执行管理操作,使用sudo即可实现。

    其它一些基本的修改还包括locale及tzdata的修改,使得系统适合本地情况,这里定制将locale设置为en_US.UTF-8,时区设定为Asia/Shaihai。如下
    1. espresso@espresso:~$ locale
    2. LANG=en_US.UTF-8
    3. LANGUAGE=
    4. LC_CTYPE="en_US.UTF-8"
    5. LC_NUMERIC="en_US.UTF-8"
    6. LC_TIME="en_US.UTF-8"
    7. LC_COLLATE="en_US.UTF-8"
    8. LC_MONETARY="en_US.UTF-8"
    9. LC_MESSAGES="en_US.UTF-8"
    10. LC_PAPER="en_US.UTF-8"
    11. LC_NAME="en_US.UTF-8"
    12. LC_ADDRESS="en_US.UTF-8"
    13. LC_TELEPHONE="en_US.UTF-8"
    14. LC_MEASUREMENT="en_US.UTF-8"
    15. LC_IDENTIFICATION="en_US.UTF-8"
    16. LC_ALL=
    17. espresso@espresso:~$ date
    18. Wed Apr  5 20:38:31 CST 2017
    复制代码
    接下来将KERNEL整合到ROOTFS中,形成完整的系统镜像。

    将编译好的内核boot文件夹复制到ROOTFS的boot,将内核模块文件夹复制到/lib/modules下,即完成系统整合。

    现在可以来测试系统启动情况了,如有必要,还要修改UBOOT的环境变量,给出本人的环境变量供参考。
    1. Marvell>> print
    2. baudrate=115200
    3. bootargs=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000 root=/dev/mmcblk0p1 rw rootwait
    4. bootcmd=mmc dev 0; ext4load mmc 0:1 $kernel_addr $image_name;ext4load mmc 0:1 $fdt_addr $fdt_name;setenv bootargs $console root=/dev/mmcblk0p1 rw rootwait; booti $kernel_addr - $fdt_addr
    5. bootdelay=3
    6. bootmmc=mmc dev 0; ext4load mmc 0:1 $kernel_addr $image_name;ext4load mmc 0:1 $fdt_addr $fdt_name;setenv bootargs $console root=/dev/mmcblk0p1 rw rootwait; booti $kernel_addr - $fdt_addr
    7. console=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000
    8. env=image_name boot/Image
    9. eth1addr=00:00:00:00:51:82
    10. eth2addr=00:00:00:00:51:83
    11. ethact=neta0
    12. ethaddr=F0:AD:4E:03:5F:1B
    13. ethprime=egiga0
    14. fdt_addr=0x1000000
    15. fdt_high=0xffffffffffffffff
    16. fdt_name=boot/dts/marvell/armada-3720-community.dtb
    17. fdtaddr=1ff8bdec
    18. filesize=bc5200
    19. gatewayip=10.4.50.254
    20. get_images=mmc dev 0; fatload mmc 0 $kernel_addr $image_name; fatload mmc 0 $fdt_addr $fdt_name; run get_ramfs
    21. get_ramfs=if test "${ramfs_name}" != "-"; then setenv ramfs_addr 0x3000000; tftp $ramfs_addr $ramfs_name; else setenv ramfs_addr -;fi
    22. hostname=marvell
    23. image_name=/boot/Image
    24. initrd_addr=0xa00000
    25. initrd_size=0x2000000
    26. ipaddr=0.0.0.0
    27. kernel_addr=0x2000000
    28. loadaddr=0x2000000
    29. loads_echo=0
    30. netdev=eth0
    31. netmask=255.255.255.0
    32. ramfs_addr=-
    33. ramfs_name=-
    34. root=root=/dev/mmcblk0p2 rw
    35. rootpath=/srv/nfs/
    36. serverip=0.0.0.0
    37. set_bootargs=setenv bootargs $console $root ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:none nfsroot=$serverip:$rootpath $extra_params
    38. stderr=serial
    39. stdin=serial
    40. stdout=serial

    41. Environment size: 1639/65532 bytes
    复制代码
    这里重点要注意fdt_name及image_name这两个值要设置正确,否则会找不到启动内核及DTB文件。

    启动后的画面如下

    2017-04-05_204815.png

    按回车键后自动登录,如下

    2017-04-05_204919.png

    UBUNTU 16的版本,妥妥的。

    接下来测试下网络,先查看网络的基本情况如下
    1. espresso@espresso:~$ ifconfig
    2. eth0      Link encap:Ethernet  HWaddr f0:ad:4e:03:5f:1b
    3.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    4.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    5.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    6.           collisions:0 txqueuelen:532
    7.           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    8.           Interrupt:9

    9. lo        Link encap:Local Loopback
    10.           inet addr:127.0.0.1  Mask:255.0.0.0
    11.           UP LOOPBACK RUNNING  MTU:65536  Metric:1
    12.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    13.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    14.           collisions:0 txqueuelen:1
    15.           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    16. wan       Link encap:Ethernet  HWaddr f0:ad:4e:03:5f:1b
    17.           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    18.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    19.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    20.           collisions:0 txqueuelen:1000
    21.           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    复制代码
    现在还没有IP地址,使用DHCP来获取IP地址,如下
    1. <blockquote>wan       Link encap:Ethernet  HWaddr f0:ad:4e:03:5f:1b
    复制代码
    已通过DHCP获取到了IP地址,使用PING命令测试网络连通
    1. espresso@espresso:~$ ping -c 4 baidu.com
    2. PING baidu.com (180.149.132.47) 56(84) bytes of data.
    3. 64 bytes from 180.149.132.47: icmp_seq=1 ttl=55 time=34.6 ms
    4. 64 bytes from 180.149.132.47: icmp_seq=2 ttl=55 time=34.2 ms
    5. 64 bytes from 180.149.132.47: icmp_seq=3 ttl=55 time=34.3 ms
    6. 64 bytes from 180.149.132.47: icmp_seq=4 ttl=55 time=33.9 ms

    7. --- baidu.com ping statistics ---
    8. 4 packets transmitted, 4 received, 0% packet loss, time 3005ms
    9. rtt min/avg/max/mdev = 33.950/34.310/34.659/0.315 ms
    10. espresso@espresso:~$
    复制代码
    基本搞定。

    稍后会放出适合直接写入SD卡的IMG镜像文件。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-20 13:21 , Processed in 0.113179 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.