3.搭建tftp,nfs开发环境方便后面频繁更新kernel和dtb配置文件
时间:10-02
整理:3721RD
点击:
嵌入式开发更新kernel需要fastboot或者tf卡拷贝,tftp可以下载kernel和dtb系统配置文件。nfs可以很方便的更新系统程序,当然应用程序也可以很方便的更新,配合ssh,可以在一个键盘和显示器上完成所以工作,将是开发的必备手段。
第一步,ubuntu下安装tftp
sudo apt-get install tftpd
vim /etc/xinetd.d/tftp,修改成如下信息或者设定自己的tftp目录。
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
}
chmod 777 -R /tftpboot,记得添加权限。
sudo service xinetd restart
重启服务后者干脆重启系统。
第二步,ubuntu下安装nfs服务
sudo apt-get install nfs-kernel-server
vim /etc/exports -->
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/opt/nfs_dir/ *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
vim /etc/exports <--
最后一行添加/opt/nfs_dir/目录。记得创建此目录sudo mkdir /opt/nfs_dir/
exportfs -a
export
sudo service nfs-kernel-server start 重启服务
showmount -e查看一下是否成功。
第三步,将编译好的zImage和myir_ricoboard.dtb拷贝到tftp目录下。
第四部,将04-Linux_Source\Filesystem下的matrix-rootfs.tar.gz解压到/opt/nfs_dir中。
第五步,uboot中添加如下环境变量,可以saveenv保存下来,不然每次都需要输入一次。
setenv serverip 192.168.9.217
setenv ipaddr 192.168.9.221
setenv gatewayip 192.168.9.1
setenv dnsip2 192.168.9.1
setenv netmask 255.255.255.0
setenv fdtfile myir_ricoboard.dtb
setenv rootpath /opt/nfs_dir
setenv netboot "echo Booting from network ...; setenv autoload no; tftp ${loadaddr} ${bootfile}; tftp ${fdtaddr} ${fdtfile}; run netargs; bootz ${loadaddr} - ${fdtaddr}"
执行一下命令:
ping 192.168.9.217
link up on port 0, speed 100, full duplex
Using cpsw device
host 192.168.9.217 is alive
执行run netboot命令
我们可以看到kernel和文件系统都起来了,对比前面的kernel和文件系统,我们的tftp和nfs设置成功了。
补充:
1)Ethernet在uboot的启动流程
1.1根据芯片自身的架构调用uboot默认函数eth_initialize,可以在arch/arm/lib/board.c中调用,也可以在common/board_r.c中调用,这就要看芯片提供商的源代码结构
1.2eth_initialize函数调用miiphy_init,phy_init和eth_env_init初始化。
miiphy_init函数初始化mii的结构体;
phy_init是Ethernet芯片商的初始化函数
eth_env_init,查看环境变量中的文件名
1.3调用board_eth_init或者cpu_eth_init其一,看cpu提供商提供了哪个。
1.4 tftp实现在common/cmd_net.c中
int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int ret;
bootstage_mark_name(BOOTSTAGE_KERNELREAD_START, "tftp_start");
ret = netboot_common(TFTPGET, cmdtp, argc, argv);
bootstage_mark_name(BOOTSTAGE_KERNELREAD_STOP, "tftp_done");
return ret;
}
U_BOOT_CMD(
tftpboot, 3, 1, do_tftpb,
"boot image via network using TFTP protocol",
"[loadAddress] [[hostIPaddr:]bootfilename]"
);
TFTPGET标识调用到/net/net.c中,实现文件传输。Ethernet本身还有很多东西,大家有兴趣可以继续研究。
1.5 环境变量的定义结合eeprom一起看比较清晰。
1.6 run netboot中netargs设置是nfs成功的一个关键点,bootz是kernel启动的关键命令。
有了tftp和nfs我们就可以很方便的更新kernel和dtb配置文件和文件系统。
第一步,ubuntu下安装tftp
sudo apt-get install tftpd
vim /etc/xinetd.d/tftp,修改成如下信息或者设定自己的tftp目录。
service tftp
{
protocol = udp
port = 69
socket_type = dgram
wait = yes
user = nobody
server = /usr/sbin/in.tftpd
server_args = /tftpboot
disable = no
}
chmod 777 -R /tftpboot,记得添加权限。
sudo service xinetd restart
重启服务后者干脆重启系统。
第二步,ubuntu下安装nfs服务
sudo apt-get install nfs-kernel-server
vim /etc/exports -->
#
# Example for NFSv2 and NFSv3:
# /srv/homes hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes gss/krb5i(rw,sync,no_subtree_check)
#
/opt/nfs_dir/ *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
vim /etc/exports <--
最后一行添加/opt/nfs_dir/目录。记得创建此目录sudo mkdir /opt/nfs_dir/
exportfs -a
export
sudo service nfs-kernel-server start 重启服务
showmount -e查看一下是否成功。
第三步,将编译好的zImage和myir_ricoboard.dtb拷贝到tftp目录下。
第四部,将04-Linux_Source\Filesystem下的matrix-rootfs.tar.gz解压到/opt/nfs_dir中。
第五步,uboot中添加如下环境变量,可以saveenv保存下来,不然每次都需要输入一次。
setenv serverip 192.168.9.217
setenv ipaddr 192.168.9.221
setenv gatewayip 192.168.9.1
setenv dnsip2 192.168.9.1
setenv netmask 255.255.255.0
setenv fdtfile myir_ricoboard.dtb
setenv rootpath /opt/nfs_dir
setenv netboot "echo Booting from network ...; setenv autoload no; tftp ${loadaddr} ${bootfile}; tftp ${fdtaddr} ${fdtfile}; run netargs; bootz ${loadaddr} - ${fdtaddr}"
执行一下命令:
ping 192.168.9.217
link up on port 0, speed 100, full duplex
Using cpsw device
host 192.168.9.217 is alive
执行run netboot命令
我们可以看到kernel和文件系统都起来了,对比前面的kernel和文件系统,我们的tftp和nfs设置成功了。
补充:
1)Ethernet在uboot的启动流程
1.1根据芯片自身的架构调用uboot默认函数eth_initialize,可以在arch/arm/lib/board.c中调用,也可以在common/board_r.c中调用,这就要看芯片提供商的源代码结构
1.2eth_initialize函数调用miiphy_init,phy_init和eth_env_init初始化。
miiphy_init函数初始化mii的结构体;
phy_init是Ethernet芯片商的初始化函数
eth_env_init,查看环境变量中的文件名
1.3调用board_eth_init或者cpu_eth_init其一,看cpu提供商提供了哪个。
1.4 tftp实现在common/cmd_net.c中
int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
{
int ret;
bootstage_mark_name(BOOTSTAGE_KERNELREAD_START, "tftp_start");
ret = netboot_common(TFTPGET, cmdtp, argc, argv);
bootstage_mark_name(BOOTSTAGE_KERNELREAD_STOP, "tftp_done");
return ret;
}
U_BOOT_CMD(
tftpboot, 3, 1, do_tftpb,
"boot image via network using TFTP protocol",
"[loadAddress] [[hostIPaddr:]bootfilename]"
);
TFTPGET标识调用到/net/net.c中,实现文件传输。Ethernet本身还有很多东西,大家有兴趣可以继续研究。
1.5 环境变量的定义结合eeprom一起看比较清晰。
1.6 run netboot中netargs设置是nfs成功的一个关键点,bootz是kernel启动的关键命令。
有了tftp和nfs我们就可以很方便的更新kernel和dtb配置文件和文件系统。