其他分享
首页 > 其他分享> > 移植busybox 以及从nfs启动系统

移植busybox 以及从nfs启动系统

作者:互联网

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

我的配置如下:

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: {}

ens35 就是vmnet0桥接到usb网卡上,注意不要使用gateway4配置网关否则开机生成双默认网关,虚拟机连外网会有问题

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目录


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
eth0: link up, 100Mbps, full-duplex, lpa 0x4DE1
Looking up port of RPC 100005/1 on 192.168.8.3
VFS: Mounted root (nfs filesystem).
Freeing init memory: 128K
init started: BusyBox v1.7.0 (2008-01-22 10:04:09 EST)
starting pid 751, tty '': '/etc/init.d/rcS'

Please press Enter to activate this console.
starting pid 754, tty '/dev/ttySAC0': '/bin/sh'
# ls
bin      etc      linuxrc  proc     sbin     tmp
dev      lib      mnt      root     sys      usr
#

 

 

标签:busybox,0.0,192.168,255.255,nfs,链路,root,移植
来源: https://www.cnblogs.com/streleizia/p/16602558.html