系统移植基本操作
开发环境
开发机:Ubuntu 20.04(虚拟机)
开发板:三星exynos-4412 fs4412核心板+华清远见外设板
系统启动顺序
上电—> 引导程序(Bootloader)—> 内核(kernel)—> 设备树(dtb)—> 根文件系统(rootfs)
前期系统配置
Ubuntu中网络设置
因为该开发板有网口,所以我们选择网线进行数据传输(串口通信太慢了)。首先保证Ubuntu可以访问百度(现在百度就是拿来Ping的),然后使用ifconfig查看Ubuntu的IP,并且记录下来。
有条件的可以使用交换机或者路由器讲Ubuntu和开发板连接起来,确保他们在一个网段。(这里需要的网络知识就后面找个时间写一个文档)
现在假设他们物理上是在一个网段,然后我们使用串口连接Windows,使用hypertrm(超级终端)工具连接开发板,注意设置连接的波特率为115200。
开发板上的设置
上电后,我们就进入了u-boot的引导(默认在3S内按任意键打断启动,否则开发板会进行加载内核步骤),然后我们使用如下命令去设置开发板的网络信息,请根据自己的网络所属网段以及Ubuntu的IP进行设置。
set ipaddr 192.168.12.233 //设置【目标机】开发板的ip地址;
set serverip 192.168.12.120 //设置【开发主机】ubuntu的ip地址;
set gatewayip 192.168.12.1 //设置网关
set netmask 255.255.255.0 //设置子网掩码
save //保存环境变量到emmc中;
设置好后一定要使用save将设置的信息保存在emmc中,否则只有这一次生效。
pri //查看u-boot的配置信息
接下来在超级终端中使用ping Ubuntu的IP去查看网络是否设置成功。如果成功就继续下面的步骤,没有成功就找出问题并解决。
Ubuntu上的tftp
为了可以使用网络进行数据传输,我们选择tftp去进行传输,首先在Ubuntu上安装tftp服务器,步骤如下
0.检查是否安装过tftp
sudo apt-cache policy tftpd-hpa
1. 安装tftp服务器:
sudo apt-get install tftpd-hpa tftp-hpa
注意:虚拟机需要连外网,也就是能够ping www.baidu.com
2. 配置tftp服务器:
sudo vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp" #用户的使用命令;
TFTP_DIRECTORY="/tftpboot" #共享文件的路径;
TFTP_ADDRESS="0.0.0.0:69" #服务器的ip地址和端口号;
TFTP_OPTIONS="-l -c -s"
根文件系统下面创建目录tftpboot,修改共享文件的权限
sudo chmod 0777 /tftpboot
3. 启动tftp服务器
sudo service tftpd-hpa restart //重启
4. 将需要传输的文件存储在共享目录中(/tftpboot)
5. 测试是否成功安装
tftp 127.0.0.1
tftp>get <filename>
tftp>q
网络环境测试
在Ubuntu中将镜像文件uImage;exynos4412-fs4412.dtb;ramdisk.img拷贝到/tftpboot下
在u-boot中输入如下命令使用tftp加载内核、设备树、根文件系统以启动系统,测试网络环境。
tftp 41000000 uImage //下载内核
tftp 42000000 exynos4412-fs4412.dtb //下载设备树
tftp 43000000 ramdisk.img //下载根文件系统
bootm 41000000 43000000 42000000
内核地址 根文件系统地址 设备树地址
注意:地址顺序不能出错;
设置启动参数,以便在板子上电后可以自动去tftp服务器上下载所需文件
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; tftp 43000000 ramdisk.img\; bootm 41000000 43000000 42000000
使用boot可以让板子加载内核。
boot
交叉编译器安装
1. 将gcc-4.6.4.tar.xz 拷贝到虚拟机的某一个目录中
cp gcc-4.6.4.tar.xz ~/workspace/fs4412
2. 进入到所对应的目录中,解压gcc-4.6.4.tar.xz
cd ~/workspace/fs4412
tar -xvf gcc-4.6.4.tar.xz
3. 进入到gcc-4.6.4目录中,通过pwd查看绝对路径;
cd gcc-4.6.4/bin
pwd === > /home/CodeDrawing/workspace/fs4412/gcc-4.6.4/bin
4. 修改PATH的值;
进入到/etc/bash.bashrc,在文件的最前面添加
sudo vim /etc/bash.bashrc
export PATH=$PATH:/home/CodeDrawing/workspace/fs4412/gcc-4.6.4/bin
5. 重启;
source /etc/bash.bashrc
6.测试:
a.生成可执行文件:arm-none-linux-guneabi-gcc 1.c
b.拷贝执行文件到下载目录: cp a.out /tftpboot
c.在板子上使用tftp下载a.out到板子上: tftp -g -r a.out 192.168.12.120 (注:板子和Ubuntu必须在同一网段)
注:使用tftp上传文件到服务器 tftp -p -r a.out 192.168.12.120
d.修改a.out权限:chmod 777 a.out
e.执行a.out: ./a.out
nfs文件系统
使用tftp服务在某些情况下不太方便,所以这里使用nfs网络文件系统来是我们平时的编译等操作更加方便。
开发机上的步骤
0. 查看是否安装过nfs服务器:
sudo apt-cache policy nfs-kernel-server
1. 安装nfs服务器
sudo apt-get install nfs-kernel-server
2. 配置nfs服务器
1) 拷贝day1镜像目录下的根文件系统rootfs.tar.xz到开发主机中的一个目录(例如/source/nfs)
cp rootfs.tar.xz /source/nfs
2) 进入到rootfs.tar.xz所对应的目录中
cd /source/nfs
3) 解压根文件系统
tar -xvf rootfs.tar.xz
4) 进入到rootfs目录,使用pwd确定所对应的绝对路径
cd rootfs
pwd ----> /source/nfs/rootfs 就是用来挂载的共享路径;
5) 修改nfs配置文件 sudo vim /etc/exports
在文件的尾部添加代码:
/source/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)
注意:路径需要和根文件系统的实际路径一致;
3. 启动nfs服务器:
sudo service nfs-kernel-server restart
开发板的步骤
设置启动命令:
set bootcmd tftp 41000000 uImage\; tftp 42000000 exynos4412-fs4412.dtb\; bootm 41000000 - 42000000
设置启动参数:
set bootargs root=/dev/nfs nfsroot=192.168.12.111:/source/nfs/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.12.58 clk_ignore_unused=true
当出现[root@farsight ]#后说明成功
nfs的问题解决
一、
/*Ubuntu 18.04 nfs 默认为协议3和协议4,但是 我的uboot 默认启动的是协议2的形式
如: /srv/homes hostname1(rw,sync,no_subtree_check)
若想要求 nfs 支持协议2,就在/etc/default/nfs-kernel-server末尾加一句:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
*/
二、
1)把nfs配置文件备份
sudo mv /etc/default/nfs-kernel-server /etc/default/nfs-kernel-server.back
2) 替换nfs配置文件
把day1镜像目录下的nfs-kernel-server拷贝到/etc/default目录下
sudo cp nfs-kernel-server /etc/default
3) 重启nfs服务
sudo service nfs-kernel-server restart
4) 重新挂载到开发板
把内核设备树根文件系统烧写到EMMC上,直接启动
a) 拷贝第一天/镜像文件/ramdisk.img拷贝到虚拟机/tftpboot目录下
b) 烧写内核镜像到EMMC上
# tftp 41000000 uImage
# movi write kernel 41000000
c) 烧写设备树文件到EMMC上
# tftp 41000000 exynos4412-fs4412.dtb
# movi write dtb 41000000
d) 烧写文件系统镜像到EMMC上
# tftp 41000000 ramdisk.img
#movi write rootfs 41000000 3000000
e) 设置启动参数
# set bootcmd movi read kernel 41000000\;movi read dtb 42000000\;movi read rootfs 43000000 3000000\;bootm 41000000 43000000 42000000
# set bootargs
# saveenv
f) 重新启动开发板,u-boot自动加载、执行内核