NFS服务、内核配置菜单
一、NFS网络服务的应用场景
各种应用程序属于根文件系统rootfs的一部分,现在如果要更新一个应用程序,需要将它放到
根文件系统rootfs_ext4.img这个文件中,还得用fastboot下载烧写,将来错了,还需要修改,下载烧写开发效率很低,关键是降低了EMMC的使用寿命。
干脆采用NFS网络服务,就是在上位机部署一个NFS网络服务的共享目录,将来各种应用程序放在上位机编辑和交叉编译,然后让下位机利用NFS网络服务到上位机找到共享目录,一旦找到共享目录就可以直接在下位机运行,以后应用程序出错了,只需在上位机修改和交叉编译,下位机直接运行即可,无需频繁的下载烧写,大大提高了开发效率也提高了EMMC的使用寿命。
二、配置NFS网络服务
获取内核源码,并且烧写uImage到下位机(具体步骤详见Linux内核)
上位机网络配置,给上位机配置一个静态IP,同时下位机和上位机网线连接,如果是虚拟机需要映射网口到虚拟机上。
如果是虚拟机,并且用USB转网口的同学(针对于电脑没有网口的同学),还需要将USB转网口映射到虚拟机里:
首先打开虚拟机启动上位机linux系统,然后点击虚拟机软件上方的"虚拟机"->可移动设备->ASIX AX88772C->连接 ,也就是让它跑到虚拟机里面去,此时虚拟机linux系统可以使用USB转网卡了!
如果不是用USB转网卡的,而是用电脑自带网口,不需要做这些映射工作!
配置静态IP
上位机安装NFS网络服务
如果是自己安装的ubuntu系统,还需要执行以下两个命令安装和修改配置文件
sudo apt-get install nfs-kernel-server
然后上位机修改NFS配置文件(18.04系统之后的ubuntu系统都需要添加此配置)
sudo vim /etc/default/nfs-kernel-server 在文件最后添加:
RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog"
保存退出即可
2.上位机指定NFS网络服务的共享目录
sudo vim /etc/exports 在文件最后添加:
/opt/rootfs *(rw,sync,no_root_squash)
保存退出即可
说明:
/opt/rootfs:将上位机的/opt/rootfs目录作为共享目录
将来下位机可以访问这个共享目录中的文件和目录
*:任何一个IP地址的客户端都可以来访问
rw:下位机可以对共享目录中的文件进行读或者写
sync:下位机如果修改了,同步更新上位机对应的文件
no_root_squash:普通用户也可以访问sudo service nfs-kernel-server restart //只要修改了exports配置文件,必须重新启动NFS网络服务
下位机linux系统启动之后,在下位机linux系统命令行终端执行以下linux命令:
ifconfig eth0 192.168.1.110 //给下位机的网卡配置IP地址,此IP地址必须和上位机的IP地址192.168.1.8在同一个网段
ping 192.168.1.8 //下位机ping上位机,保证网络是联通状态
出现类似:64 bytes from 192.168.1.8: seq=0 ttl=64 time=3.598 ms 信息表示网络联通了
按ctrl+c退出ping命令
继续执行:
mount -t nfs -o nolock 192.168.1.8:/opt/rootfs /mnt
说明:
mount:挂接命令
-t nfs:采用NFS网络服务来访问共享目录
-o nolock:对共享的文件不进行加锁访问
结果:利用NFS网络服务,将上位机/opt/rootfs共享目录挂接到下位机的/mnt目录上,以后在下位机访问mnt
目录就是在访问上位机的/opt/rootfs目录
cd /mnt //等价于进入上位机的/opt/rootfs共享目录中
ls
bin sbin etc .... helloworld helloworld.c
./helloworld //在下位机运行上位机的helloworld可执行文件
下位机的linux系统利用NFS网络服务偷摸的将上位机的helloworld下载到下位机的内存并且启动
好处:以后只需在上位机编辑和交叉编译程序,下位机利用NFS网络服务找到共享目录里面的文件并且运行即可
不用频繁的下载烧写,大大提高了开发效率,大大提高了EMMC的使用寿命
三、内核菜单
什么是内核菜单,一张图解释。如果后面需要将自定义的一些驱动支持也使用这样的菜单给予用户进行配置(在内核中添加一个自己驱动程序的配置选项,将来用户可以通过菜单来支持或者不支持自己的驱动),那么就需要了解内核菜单是如何实现的?
只需两个文件即可搞定:Kconfig和Makefile
了解Kconfig和Makefile文件
Kconfig文件
1.功能:生成一个菜单选项,将来通过make menuconfig供用户进行选择或者不选择操作
2.关键字:
config: 用于生成一个配置选项,生成配置选项的名称:CONFIG_XXX
生成的配置选项CONFIG_XXX给Makefile使用
例如:config HELLOWORLD
结果:最终生成一个选项,其名称为:CONFIG_HELLOWORLD
tristate:表示生成的配置菜单对应的操作方式有三种:“<>”
1.按Y键选择为*,表示将来把这个菜单选项对应的驱动程序和uImage编译在一起将来生成的配置选项CONFIG_XXX=y(其值为y)
类似:静态库
2.按N键选择为空,表示对应的驱动不进行编译,也就不支持了
3.按M键选择为M,表示将对应的驱动和uImage分开编译
类似:动态库
例如:tristate "hello,world"
将来make menuconfig中就会出现配置菜单选项的提示信息:helloworld
bool:表示生成的配置选项的操作方式有两种:“[]”
1.按Y键选择为*,表示将来把这个菜单选项对应的驱动程序和uImage编译在一起将来生成的配置选项CONFIG_XXX=y(其值为y)
类似:静态库
2.按N键选择为空,表示对应的驱动不进行编译,也就不支持了
help:表示配置选项的帮助信息
例如:help
this is a test 将来通过按?键可以查看这个菜单的帮助信息
#Kconfig
config HELLOWORD
#前方空格是<TAB键>
tristate "helloword1"
help
this is a welcome command!
config HELLOWORD1
bool "helloword2"
help
this is a hello command!
make menuconfig
按/键搜索“HELLOWORLD”或者"HELLOTARENA"得到菜单的位置
按Y键选择为*,保存退出
vim .config //此文件保存着当前内核所有的配置结果,此文件是隐藏文件
搜索HELLOWORLD或者HELLOTARENA,结果:
CONFIG_HELLOWORLD=y
CONFIG_HELLOTARENA=y
表示将来这个选项对应的驱动会和uImage编译在一起
make menuconfig
按/键搜索"HELLOWORLD"
按M键选择为M,保存退出
vim .config
搜索CONFIG_HELLOWORLD=m
表示将来这个选项对应的驱动会和uImage分开编译
make menuconfig
按/键搜索"HELLOWORLD"或者"HELLOTARENA"
按N键取消选中,保存退出
vim .config
搜索CONFIG_HELLOWORLD is not set,也就是其值为空 表示对应的驱动程序将来不会被编译
内核的Makefile
目的:按照指定的编译方式来编译驱动程序(在一起,分家,不编译)
语法: obj-$(CONFIG_XXX) += 驱动文件.o
说明:
1.如果按Y键选择为*,CONFIG_XXX=y,Makefile展开得到:
obj-y += helloworld.o 将来把helloworld.c和uImage编译在一起
2.如果按M键选择为M,CONFIG_XXX=m,Makefile展开得到:
obj-m += helloworld.o 将来把helloworld.c和uImage分开编译,编译生成helloworld.ko
3.如果按N键选择为空,CONFIG_XXX=空,Makfile展开得到:没有,不编译