1.前言
开发环境 Ubuntu server 18.04,因为找到的资料使用的nand是64M的,而我手上的板子是256M,所以资料里的镜像bin文件不能直接用,会有个ecc的问题,因为他在64M的nand上用的是yaffs而256M的nand上只能用yaffs2,又由于水平不足,其实就是懒,所以不想去修改相关代码而选择从nfs上启动根文件系统,毕竟以后要移植驱动或者编写应用直接用nfs挂载方便,折腾了好几天终于把该踩得坑都填上了, 成功启动到shell,不过自学还是会走太多弯路呀。
2.网络环境配置
要实现从nfs启动开发板,首先要让虚拟机和开发板建立网络连接,因为我的虚拟机是通过vmnet8来net的方式连接外网,所以我选择让vmnet0桥接到usb网卡上来连接开发板。
以管理员身份运行虚拟网络编辑器,配置vmnet0如下:
然后再给虚拟机添加一个网卡,指定连接到vmnet0:
进入虚拟机给虚拟网卡分配地址:
sudo vim /etc/netplan/00-installer-config.yaml #具体文件名不同虚拟机各不相同,tab补全即可
我的配置如下:
network:
version: 2
bonds: {}
bridges: {}
ethernets:
ens33:
addresses:
- 192.168.112.3/24
dhcp4: false
dhcp6: false
gateway4: 192.168.112.2
nameservers:
addresses:
- 192.168.112.2
ens35:
addresses:
- 192.168.8.3/24
dhcp4: false
dhcp6: false
routes:
- to: 192.168.8.0/24
via: 192.168.8.2
vlans: {}
wifis: {}
根据上面总结的ip设置网关等参数,ens35 就是vmnet0,桥接到usb网卡上,注意不要使用gateway4配置网关否则开机生成双默认网关,虚拟机连外网会有问题
如果没有ens35可以先用 ifconfig -a 查看再用 ( ifconfig 网卡名 up )开启对应网卡。
route -n
使用上面的命令查看路由表如下:
streleizia@ubuntu:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.112.2 0.0.0.0 UG 0 0 0 ens33
192.168.8.0 0.0.0.0 255.255.255.0 U 0 0 0 ens35
192.168.8.0 192.168.8.2 255.255.255.0 UG 0 0 0 ens35
192.168.112.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
streleizia@ubuntu:~$
可以看到默认只有一个默认路由(destination 为 0.0.0.0)的网关为外网网卡(192.168.112.2)这样访问外网的流量就不会错误地发到内网网关那里。
另外双网卡可能会导致主机(windows)的联网出现问题,可以查看主机路由表(cmd 下输入route print查看)再删除指向usb网卡的路由即可,并且配置外网网卡的默认路由如下:
IPv4 路由表
===========================================================================
活动路由:
网络目标 网络掩码 网关 接口 跃点数
0.0.0.0 0.0.0.0 192.168.1.1 192.168.1.107 35
127.0.0.0 255.0.0.0 在链路上 127.0.0.1 331
127.0.0.1 255.255.255.255 在链路上 127.0.0.1 331
127.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
192.168.1.0 255.255.255.0 在链路上 192.168.1.107 291
192.168.1.107 255.255.255.255 在链路上 192.168.1.107 291
192.168.1.255 255.255.255.255 在链路上 192.168.1.107 291
192.168.112.0 255.255.255.0 在链路上 192.168.112.1 291
192.168.112.1 255.255.255.255 在链路上 192.168.112.1 291
192.168.112.255 255.255.255.255 在链路上 192.168.112.1 291
224.0.0.0 240.0.0.0 在链路上 127.0.0.1 331
224.0.0.0 240.0.0.0 在链路上 192.168.112.1 291
224.0.0.0 240.0.0.0 在链路上 192.168.1.107 291
255.255.255.255 255.255.255.255 在链路上 127.0.0.1 331
255.255.255.255 255.255.255.255 在链路上 192.168.112.1 291
255.255.255.255 255.255.255.255 在链路上 192.168.1.107 291
===========================================================================
永久路由:
网络地址 网络掩码 网关地址 跃点数
0.0.0.0 0.0.0.0 192.168.1.1 1
===========================================================================
192.168.1.1是家里路由器的地址
最后注意将主机的usb网卡配置到和虚拟机同网段下,如图:
总结:
usb网卡ip 手动配置为:192.168.8.2
虚拟机ip手动配置为: 192.168.8.3 网关为 192.168.8.2
开发板ip手动配置为: 192.168.8.100网关为 192.168.8.2(后面会配置)
互相ping一下如果能ping通就算成功了,如果ping Windows 主机无返回是因为主机防火墙没关(只影响ping,不影响后面的nfs和tftp的传输),另外linux的虚拟机防火墙也有可能会是开启状态,关掉就行了
3.配置软件环境
网路搭建完成,剩下就是安装各种软件了,在ubuntu下使用以下命令安装软件包:
sudo apt-get install tftpd tftp xinetd nfs-kernel-server vsftpd
然后逐一配置:
首先配置ftp:
sudo vi /etc/vsftpd.conf
将其中以下配置前的#号去掉
#local_enable=YES
#write_enable=YES
保存后使用以下命令重启服务:
sudo /etc/init.d/vsftpd restart
其次配置tftp:
先在喜欢的位置创建一个文件夹,我选则的是在home目录下创建nfs_root目录,别忘了 sudo chmod 777 nfs_root -R 给所有用户添加权限
streleizia@ubuntu:~/nfs_root$ pwd
/home/streleizia/nfs_root #可以看到路径为:/home/streleizia/nfs_root
streleizia@ubuntu:~/nfs_root$ tree -d
.
├── fs_mini #busybox安装在这个文件夹里
│ ├── bin
│ ├── dev
│ ├── etc
│ │ └── init.d
│ ├── lib
│ ├── mnt
│ ├── proc
│ ├── root
│ ├── sbin
│ ├── sys
│ ├── tmp
│ └── usr
│ ├── bin
│ └── sbin
└── fs_mini_mdev
├── bin
├── dev
├── etc
│ └── init.d
├── lib
├── mnt
├── proc
├── root
├── sbin
├── sys
├── tmp
└── usr
├── bin
└── sbin
30 directories
streleizia@ubuntu:~/nfs_root$
sudo vi /etc/xinetd.d/tftp
打开配置文件后输入以下内容:
service tftp
{
socket_type =dgram
protocol =udp
wait =yes
user =root
server =/usr/sbin/in.tftpd
server_args =-s /home/streleizia/tftp_root #注意这里的路径和上面创建的一致
disable =no
per_source =11
cps =100 2
flags =IPv4
}
sudo /etc/init.d/xinetd restart
重启服务没有报错就ok
sudo vi /etc/exports
最后配置nfs:
打开nfs的配置文件添加配置内容如下:
# /etc/exports: the access control list for filesystems which may be exported
# to NFS clients. See exports(5).
#
# 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)
/home/streleizia/workspace/yaffs2_tool/nfs_root *(rw,sync,no_root_squash) #这里我创建了三个nfs目录分别是用不同方式构建的根文件系统
/home/streleizia/nfs_root/fs_mini *(rw,sync,no_root_squash) #注意观察和上面创建的目录路径一致
/home/streleizia/nfs_root/fs_mini_mdev *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart
重启服务没有报错就ok
重点来了,unbuntu18.04自动安装的nfs版本太高和2.6.22kernel的版本不符,导致nfs不能挂载,内核卡在:
VFS: Unable to mount root fs via NFS, trying floppy
解决方法参考文章:
https://blog.csdn.net/Qiuoooooo/article/details/112601940
即:在/etc/default/nfs-kernel-server添加RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog",重启NFS即可
4.测试nfs
tftp配和uboot烧写内核镜像,这里不再赘述详细方法,注意使用配套的根文件系统和内核镜像,最好是在nand上可以正常启动,在uboot中设置启动参数如下:
bootargs=noinitrd root=/dev/nfs nfsroot=192.168.8.3:/home/streleizia/nfs_root/fs_mini ip=192.168.8.100:192.168.8.3:192.168.8.2:255.255.255.0:linux:eth0:off init=/linuxrc console=ttySAC0
boot内核,输出信息,成功启动到busybox命令行!
drivers/hid/usbhid/hid-core.c: v2.6:USB HID core driver
TCP cubic registered
NET: Registered protocol family 1
s3c2440-sdi s3c2440-sdi: CMD[TIMEOUT] #5 op:APP_CMD(55) arg:0x00000000 flags:0x0875 retries:0 Status:nothing to complete
s3c2440-sdi s3c2440-sdi: CMD[TIMEOUT] #6 op:APP_CMD(55) arg:0x00000000 flags:0x0875 retries:0 Status:nothing to complete
s3c2440-sdi s3c2440-sdi: CMD[TIMEOUT] #7 op:ALL_SEND_OCR(1) arg:0x00000000 flags:0x0861 retries:0 Status:nothing to complete
s3c2440-sdi s3c2440-sdi: powered down.
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
eth0: link down
IP-Config: Complete:
device=eth0, addr=192.168.8.100, mask=255.255.255.0, gw=192.168.8.2,
host=linux, domain=, nis-domain=(none),
bootserver=192.168.8.3, rootserver=192.168.8.3, rootpath=
Looking up port of RPC 100003/2 on 192.168.8.3
相关文章