环境搭建: ubuntu下TFTP、 NFS启动环境搭建
1、NFS 服务开启
安装 NFS 服务
$ sudo apt-get install nfs-kernel-server rpcbind
创建nfs文件夹
创建的 nfs 文件夹供 nfs 服务器使用,以后我们可以在开发板上通过网络文件系统来访问 nfs 文件夹
$mkdir nfs
配置nfs
sudo vim /etc/exports
参数值及 内容说明:
1、rw和ro:该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。
2、sync和async:sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!
3、no_root_squash和root_squash:客户端使用 NFS 文件系统的账号若为root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行;而all_squash,不论登入 NFS 的使用者身份为何都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 。
重启 NFS 服务
$ sudo /etc/init.d/nfs-kernel-server restart
2、tftp环境搭建
ubuntu主机作为tftp服务器,通过网络下载启动所需内核镜像、设备树到DRAM中
$ sudo apt-get install tftp-hpa tftpd-hpa
$ sudo apt-get install xinetd
TFTP 需要一个文件夹来存放文件,在用户目录下新建一个目录tftp
$ mkdir /home/jiabin/tftp
$ chmod 777 /home/jiabin/tftp
要给 tftpboot 文件夹权限,否则的话 uboot 不能从tftp文件夹里面下载文件
配置 tftp
新建文件/etc/xinetd.d/tftp,如果没有/etc/xinetd.d 目录的话自行
创建,然后在里面输入如下内容
server tftp
{
socket_type = dgram
protocol = udp
wait = yes
user =root
server =/user/sbin/in.tftpd
server_args = -s /home/jiabin/tftp/
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
启动 tftp 服务
$ sudo service tftpd-hpa start
修改/etc/default/tftpd-hpa文件内容如下:
TFTP_DIRECTORY 就是我们上面创建的 tftp 文件夹目录,以后就将所有需要通过TFTP 传输的文件都放到这个文件夹里面,并且要给予这些文件相应的权限
重启tftp服务器:
$ sudo service tftpd-hpa restart
3、开发板uboot环境设置
设置服务器的ip地址
# setenv serverip 128.255.1.99
设置开发板的IP地址
# setenv ipaddr 128.255.1.66
# setenv netmask255.255.255.0
# setenv gatewayip 128.255.1.1
保存
# saveenv
与服务器(ubuntu)网络测试:
提示 host is alive 就表示开发板和 Ubuntu 系统可以互通
nfs传输文件测试:
使用 nfs 命令来将 uImage 下载到开发板 DRAM 的 0X90100000 地址处,
命令如下:
#nfs 0X90100000 nfs 0x90100000 128.255.1.99:/home/jiabin/nfs/uImage
命 令 中 的 “ 0X90100000 ” 表 示 zImage 保 存 地 址 ,“128.255.1.99:/home/jiabin/nfs/uImage”表示 zImage 在128.255.1.99: 这个主机中,路径为/home/jiabin/nfs/uImage。下载过程如图 所示
tftp验证:
uboot 中的 tftp 命令格式如下:tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftp 命令不需要输入文件在 Ubuntu 中的完整路径,只需要输入文件名即可
4、配置嵌入式系统linux内核对NFS文件系统的支持
-> Networking support
-> Networking options
[*] IP: kernel level autoconfiguration
-> File systems
[*] Network File Systems
<*> NFS client support
<*> NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] Root file system on NFS
5、使用网络启动内核及文件系统
进入uboot命令行模式,环境变量如下:
bootloader#printenv
arch=arm
baudrate=115200
board=ft2004
board_name=ft2004
boot_cmdline=setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000'
boot_fdt=bootm 0x90100000 -:- 0x95000000
bootcmd=run distro_bootcmd
bootdelay=1
cpu=armv8
distro_bootcmd=run boot_cmdline; run load_kernel; run load_fdt; run boot_fdt
eth1addr=98:0e:24:39:d5:89
ethaddr=98:0e:24:39:d5:88
fdtcontroladdr=fae5a1d8
gatewayip=128.255.1.1
ipaddr=128.255.1.66
load_fdt=ext4load scsi 0:1 0x95000000 phytium-ft2004-linux.dtb
load_kernel=ext4load scsi 0:1 0x90100000 uImage
netmask=255.255.255.0
serverip=128.255.1.99
stderr=uart@28001000
stdin=uart@28001000
stdout=uart@28001000
tftp_fdt=tftpboot 0x95000000 phytium-ft2004-linux.dtb
tftp_kernel=tftpboot 0x90100000 uImage
tftp_start=run boot_cmdline; run tftp_kernel; run tftp_fdt; run boot_fdt
vendor=phytium
Environment size: 822/4092 bytes
重新设置环境变量
# setenv nfsbootargs 'setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/nfs nfsroot=128.255.1.99:/home/jiabin/nfs,vers=3 rw ip=dhcp''
# setenv net_start 'run nfsbootargs; run tftp_kernel;run tftp_fdt;run boot_fdt'
bootargs环境变量设置参考:
格式如下:
root=/dev/nfs nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>:<dns0-ip>:<dns1-ip>
<server-ip>:服务器 IP 地址,也就是存放根文件系统主机的 IP 地址,那就是 Ubuntu 的 IP地址,比如我的 Ubuntu 主机 IP 地址为 128.255.1.99。
<root-dir> :根文件系统的存放路径,比如我的就是/home/jiabin/nfs。
<nfs-options>:NFS 的其他可选选项,一般不设置。
<client-ip> :客户端 IP 地址,也就是我们开发板的 IP 地址,Linux 内核启动以后就会使用此 IP 地址来配置开发板。此地址一定要和 Ubuntu 主机在同一个网段内,并且没有被其他的设备使用,在 Ubuntu 中使用 ping 命令 ping 一下就知道要设置的 IP 地址有没有被使用,如果不能ping 通就说明没有被使用,那么就可以设置为开发板的 IP 地址,比如我就可以设置为128.255.1.66。
<server-ip> :服务器 IP 地址,前面已经说了。
<gw-ip> :网关地址,我的就是 128.255.1.1。
<netmask>:子网掩码,我的就是 255.255.255.0。
<hostname>:客户机的名字,一般不设置,此值可以空着。
<device> :设备名,也就是网卡名,一般是 eth0,eth1….,正点原子的 I.MX6U-ALPHA 开
发板的 ENET2 为 eth0,ENET1 为 eth1。如果你的电脑只有一个网卡,那么基本只能是 eth0。
这里我们使用 ENET2,所以网卡名就是 eth0。
<autoconf> :自动配置,一般不使用,所以设置为 off。
<dns0-ip> :DNS0 服务器 IP 地址,不使用。
<dns1-ip> :DNS1 服务器 IP 地址,不使用。
扩展:ramfs
ramfs
就是将文件系统和内核一起编译,编译出来的镜像就包括 内核本身和文件系统
内核打开ramfs
:
在Initramfs source file(s)
选项中,填入文件系统的路径即可。
ns0-ip> :DNS0 服务器 IP 地址,不使用。
:DNS1 服务器 IP 地址,不使用。
## 扩展:ramfs
`ramfs`就是将文件系统和内核一起编译,编译出来的镜像就包括 **内核本身和文件系统**
内核打开`ramfs`:
[外链图片转存中...(img-U7i60lSe-1700475767863)]
在`Initramfs source file(s)`选项中,填入文件系统的路径即可。