从nfs启动最小文件系统

发布时间:2024-08-01  

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

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    ;:<刚刚复制的挂载目录>    /mnt 第五、在u-boot 修改一下bootargs参数         set bootargs noinitrd root=/dev/nfs......
    进行挂载。 在/etc/rc.d/rc.local中添加NFS服务器开机自启动脚本。 1 service nfs start 在NFS配置文件/etc/export中配置需要挂载......
    习驱动的道路上走了很多弯路,十分坎坷,尤其在nfs挂载时涉及到windows, ubuntu, 开发板三者网络配置,需要设置bootloader启动参数,安装和配置 nfs。这篇......
    脑直连的连接方式不能使用NFS挂载,开发板、电脑之间必须加一个交换机或者路由器,否则开发板没办法PING ubuntu,也就没办法使用NFS。 加路由器也是我们一直推荐的方式,所以买个路由器是必须的。 总结:开发......
    以Busybox软件为基础,介绍了一种实用的NFS根文件系统构建方法。1 嵌入式根文件系统简介Linux启动时,第一个必须挂载的就是根文件系统;若系统不能从指定设备上挂载根文件系统,则系......
    以后要移植驱动或者编写应用直接用nfs挂载方便,折腾了好几天终于把该踩得坑都填上了, 成功启动到shell,不过自学还是会走太多弯路呀。 2.网络环境配置   要实现从nfs启动开发板,首先......
    文件系统(NFS)是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制,通过对网络文件系统的支持,用户可以在本地系统上像操作本地分区一样来对远程主机的共享分区(目录)进行操作。对于Linux系统来说NFS......
    /initrd) support                       ()    Initramfs source file(s)  支持根文件的挂载,指定initrd,支持Ramdisk根文......
    的由友善之臂提供的mini2440的qtopia文件系统的截图: 友善之臂提供的qtopia文件系统在挂载时会初始化网卡,但我们是由nfs挂载的文件系统,这会导致nfs连接中断,挂载失败,所以用nfs挂载......
    将会panic,因为内核找不到文件系统。 4. 挂载jffs2在开发板中执行:[root@ www.linuxidc.com nfs]#dd if=jffs2.bin of=/dev/mtdblock00+1......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>