TA的每日心情 | 开心 2016-7-19 10:35 |
---|
签到天数: 8 天 连续签到: 1 天 [LV.3]偶尔看看II
|
本帖最后由 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的根文件系统,
解压到ROOTFS目录下,如下图
这是一个根文件系统的目录结构,由于我们下载的是CORE版,所以只包括最基本的文件系统,很多实用程序及工具都没有包括,另外也没有进行配置。
接下来使用CHROOT来实现最小系统的定制。如何进入CHROOT系统需要执行一系列的命令,这里贡献一个老外写的进入CHROOT的脚本,如下- function 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}
- }
- function 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
- elif [ "$1" == "-u" ] && [ -n "$2" ];
- then
- umnt $1 $2
- else
- echo ""
- echo "Either 1'st, 2'nd or both parameters were missing"
- echo ""
- echo "1'st parameter can be one of these: -m(mount) OR -u(umount)"
- echo "2'nd parameter is the full path of rootfs directory(with trailing '/')"
- echo ""
- echo "For example: ch-mount -m /media/sdcard/"
- echo ""
- echo 1st parameter : ${1}
- echo 2nd parameter : ${2}
- fi
复制代码 只需要执行sudo bash chroot.sh -m rootfs命令就可以进行chroot模式,这里的chroot.sh是脚本程序的名称,rootfs是具体的根文件解压后的目录名。
进入CHROOT主要做一些实际的配置工作,如添加一个用户名,配置终端参数,安装一些基本的网络配置程序(PING,IFCONFIG及桥接需要的一些实用工具)。
因为进入CHROOT之后基本上与使用普通的LINUX系统差别不大,所以这里也不详述。
本次定制的根文件系添加一个用户espresso,密码为bin,具体命令如下- 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的配置脚本如下- # This file is part of systemd.
- #
- # systemd is free software; you can redistribute it and/or modify it
- # under the terms of the GNU Lesser General Public License as published by
- # the Free Software Foundation; either version 2.1 of the License, or
- # (at your option) any later version.
- [Unit]
- Description=Getty on %I
- Documentation=man:agetty(8) man:systemd-getty-generator(8)
- Documentation=http://0pointer.de/blog/projects/serial-console.html
- After=systemd-user-sessions.service plymouth-quit-wait.service
- After=rc-local.service
- # If additional gettys are spawned during boot then we should make
- # sure that this is synchronized before getty.target, even though
- # getty.target didn't actually pull it in.
- Before=getty.target
- IgnoreOnIsolate=yes
- # On systems without virtual consoles, don't start any getty. Note
- # that serial gettys are covered by serial-getty@.service, not this
- # unit.
- ConditionPathExists=/dev/tty0
- [Service]
- # the VT is cleared by TTYVTDisallocate
- ExecStart=-/sbin/agetty --login-pause --autologin espresso --noclear %I $TERM
- Type=idle
- Restart=always
- RestartSec=0
- UtmpIdentifier=%I
- TTYPath=/dev/%I
- TTYReset=yes
- TTYVHangup=yes
- TTYVTDisallocate=yes
- KillMode=process
- IgnoreSIGPIPE=no
- SendSIGHUP=yes
- # Unset locale for the console getty since the console has problems
- # displaying some internationalized messages.
- 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=
- [Install]
- WantedBy=getty.target
- DefaultInstance=ttyMV0
复制代码 ESPRESSOBIN中的SERIAL终端名称为ttyMV0,这里按要求修改即可。另外这里设定了SERIAL的自动登录,为了更安全的操作,没有使用ROOT用户登录,使用的是新建立的用户espresso来登录,如果需要执行管理操作,使用sudo即可实现。
其它一些基本的修改还包括locale及tzdata的修改,使得系统适合本地情况,这里定制将locale设置为en_US.UTF-8,时区设定为Asia/Shaihai。如下- espresso@espresso:~$ locale
- LANG=en_US.UTF-8
- LANGUAGE=
- LC_CTYPE="en_US.UTF-8"
- LC_NUMERIC="en_US.UTF-8"
- LC_TIME="en_US.UTF-8"
- LC_COLLATE="en_US.UTF-8"
- LC_MONETARY="en_US.UTF-8"
- LC_MESSAGES="en_US.UTF-8"
- LC_PAPER="en_US.UTF-8"
- LC_NAME="en_US.UTF-8"
- LC_ADDRESS="en_US.UTF-8"
- LC_TELEPHONE="en_US.UTF-8"
- LC_MEASUREMENT="en_US.UTF-8"
- LC_IDENTIFICATION="en_US.UTF-8"
- LC_ALL=
- espresso@espresso:~$ date
- Wed Apr 5 20:38:31 CST 2017
复制代码 接下来将KERNEL整合到ROOTFS中,形成完整的系统镜像。
将编译好的内核boot文件夹复制到ROOTFS的boot,将内核模块文件夹复制到/lib/modules下,即完成系统整合。
现在可以来测试系统启动情况了,如有必要,还要修改UBOOT的环境变量,给出本人的环境变量供参考。- Marvell>> print
- baudrate=115200
- bootargs=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000 root=/dev/mmcblk0p1 rw rootwait
- 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
- bootdelay=3
- 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
- console=console=ttyMV0,115200 earlycon=ar3700_uart,0xd0012000
- env=image_name boot/Image
- eth1addr=00:00:00:00:51:82
- eth2addr=00:00:00:00:51:83
- ethact=neta0
- ethaddr=F0:AD:4E:03:5F:1B
- ethprime=egiga0
- fdt_addr=0x1000000
- fdt_high=0xffffffffffffffff
- fdt_name=boot/dts/marvell/armada-3720-community.dtb
- fdtaddr=1ff8bdec
- filesize=bc5200
- gatewayip=10.4.50.254
- get_images=mmc dev 0; fatload mmc 0 $kernel_addr $image_name; fatload mmc 0 $fdt_addr $fdt_name; run get_ramfs
- get_ramfs=if test "${ramfs_name}" != "-"; then setenv ramfs_addr 0x3000000; tftp $ramfs_addr $ramfs_name; else setenv ramfs_addr -;fi
- hostname=marvell
- image_name=/boot/Image
- initrd_addr=0xa00000
- initrd_size=0x2000000
- ipaddr=0.0.0.0
- kernel_addr=0x2000000
- loadaddr=0x2000000
- loads_echo=0
- netdev=eth0
- netmask=255.255.255.0
- ramfs_addr=-
- ramfs_name=-
- root=root=/dev/mmcblk0p2 rw
- rootpath=/srv/nfs/
- serverip=0.0.0.0
- set_bootargs=setenv bootargs $console $root ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:none nfsroot=$serverip:$rootpath $extra_params
- stderr=serial
- stdin=serial
- stdout=serial
- Environment size: 1639/65532 bytes
复制代码 这里重点要注意fdt_name及image_name这两个值要设置正确,否则会找不到启动内核及DTB文件。
启动后的画面如下
按回车键后自动登录,如下
UBUNTU 16的版本,妥妥的。
接下来测试下网络,先查看网络的基本情况如下- espresso@espresso:~$ ifconfig
- eth0 Link encap:Ethernet HWaddr f0:ad:4e:03:5f:1b
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:532
- RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- Interrupt:9
- lo Link encap:Local Loopback
- inet addr:127.0.0.1 Mask:255.0.0.0
- UP LOOPBACK RUNNING MTU:65536 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1
- RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
- wan Link encap:Ethernet HWaddr f0:ad:4e:03:5f:1b
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:0 errors:0 dropped:0 overruns:0 frame:0
- TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
复制代码 现在还没有IP地址,使用DHCP来获取IP地址,如下- <blockquote>wan Link encap:Ethernet HWaddr f0:ad:4e:03:5f:1b
复制代码 已通过DHCP获取到了IP地址,使用PING命令测试网络连通- espresso@espresso:~$ ping -c 4 baidu.com
- PING baidu.com (180.149.132.47) 56(84) bytes of data.
- 64 bytes from 180.149.132.47: icmp_seq=1 ttl=55 time=34.6 ms
- 64 bytes from 180.149.132.47: icmp_seq=2 ttl=55 time=34.2 ms
- 64 bytes from 180.149.132.47: icmp_seq=3 ttl=55 time=34.3 ms
- 64 bytes from 180.149.132.47: icmp_seq=4 ttl=55 time=33.9 ms
- --- baidu.com ping statistics ---
- 4 packets transmitted, 4 received, 0% packet loss, time 3005ms
- rtt min/avg/max/mdev = 33.950/34.310/34.659/0.315 ms
- espresso@espresso:~$
复制代码 基本搞定。
稍后会放出适合直接写入SD卡的IMG镜像文件。 |
|