在我们做嵌入式Linux开发的时候,需要安装一些环境以方便我们的开发,本篇文章就来介绍一下TFTP、NFS、SSH和FTP的作用和环境搭建(以Ubuntu为例)。
TFTP
(Trivial File Transfer Protocol
) 是一个简化的的文件传输协议(FTP
),它可以用来在两个通过网络相连的主机之间传输文件。
它是一个轻量级的协议,所以没有提供像FTP
或SFTP
的一些高级特性,但它广泛用于网络设备的配置、固件更新等场景。
1、安装TFTP服务器
打开终端,输入apt
指令来更新本地软件包列表,然后安装TFTP服务器:
sudo apt update
sudo apt install tftpd-hpa
如下图所示:
安装完成后,输入下面的指令来确定TFTP服务器是否成功安装和运行。
sudo systemctl enable tftpd-hpa
我们可以配置TFTP服务器在每次系统启动的时候就自动运行:
sudo systemctl enable tftpd-hpa
在安装完成后,TFTP服务器将监听UDP端口69,为了能将文件通过TFTP服务器传输到其它的系统,需要保证:
2、配置TFTP服务器
TFTP的配置文件在/etc/default/tftpd-hpa
,打开这个文件:
sudo nano /etc/default/tftpd-hpa
文件的内容如下所示:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
我们修改为:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure --create"
TFTP_USERNAME
:表示TFTP执行时使用的用户TFTP_DIRECTORY
:TFTP的工作目录
sudo chown -R $USER TFTP_DIRECTORY
TFTP_ADDRESS
:默认是:69
,这里设置为0.0.0.0:69
,表示服务器接受来自端口69上任何客户端的连接。TFTP_OPTIONS
:允许为TFTP服务器指定特定参数(-c,-s
)TFTP_OPTIONS
可以设置TFTP服务器的各种行为,包括超时、安全设置、块大小、传输大小限制以及与文件传输操作相关的其他参数。这里使用了-s
(--secure
)标志,其他可能的标志包括-c
(--create
)、-a
(--address
)、-u
(--user
)等。不指定-c
标志将禁止任何已连接的客户端向服务器上传新文件。
3、创建TFTP工作目录
配置完上面的文件后,创建一个共享的目录并设置相应的权限以允许不同的用户(客户端)访问它。
sudo mkdir -p /var/lib/tftpboot
sudo chown -R nobody:nogroup /var/lib/tftpboot
sudo chmod -R 777 /var/lib/tftpboot
nobody:nogroup
:在Ubuntu中,/etc/passwd
中有个nobody
用户,/etc/group
中有个nogroup
组,在客户端访问TFTP的时候,服务端就会转化为这个用户组的用户权限来访问,这里设置一下所有者以让客户端能够正常访问。最后,重启TFTP服务器来让配置生效:
sudo systemctl restart tftpd-hpa
为了测试TFTP服务端,我们可以安装最常用的TFTP客户端:tftp-hpa
在另一台电脑中:
sudo apt install tftp-hpa
下载服务端TFTP工作目录下的文件到客户端
tftp -g -r 文件名 IP地址
假设目录下有一个1.txt
,且服务端(Ubuntu)的IP为192.168.31.120
我们可以输入
tftp -g -r 1.txt 192.168.31.120
这样服务端的1.txt就下载到客户端了:
上传客户端文件到服务端
tftp -p -l 文件名 IP地址
如下图所示,客户端传输2.txt
到服务端:
服务端收到文件:
NFS(网络文件系统,Network File System
)是一种分布式文件系统协议,允许我们挂载远程的目录。这让我们能够管理不同位置的存储空间,多个客户端也可以更改这个空间。
我们在开发的过程中,如果我们更改了Linux内核或者设备树,就需要重新将镜像烧写到NAND/SD/EMMC等设备中,然后由UBoot拷贝到RAM。这样就很麻烦,我们就可以在UBoot中利用NFS来从远程的主机(如Ubuntu)中加载内核和设备树到开发板的RAM中。
(1)服务端
服务端需要安装nfs-kernel-server
:
sudo apt update
sudo apt install nfs-kernel-server
(2)客户端
客户端需要安装nfs-common
:
sudo apt update
sudo apt install nfs-common
创建目录
sudo mkdir /var/nfs/general -p
作为安全措施,NFS会把所有来自客户端的root操作转化到nobody:nogroup
用户组。所以我们需要改变目录的属性来让客户端有访问权限。
sudo chown nobody:nogroup /var/nfs/general
/etc/exports
是NFS服务器配置文件,用于定义需要分享的目录以及访问这些目录的权限。打开这个文件:
sudo nano /etc/exports
这个文件中的每一行表示一个配置,语法如下:
directory_to_share client(share_option1,...,share_optionN)
client
可以是IP地址、主机名或网络范围我们需要为每个待共享的目录创建一行配置。其中,client_ip
需要更改为实际的IP,设置为*
表示允许所有IP。
/var/nfs/general client_ip(rw,sync,no_subtree_check)
rw
:使客户端具有读写权限sync
:强制NFS在回复之前将更改写入磁盘。这能保证文件的一致性,但降低了文件操作速度async
:数据先写到缓存区,再写到磁盘里中。这样有更好的性能,但可能会导致数据丢失或损坏。no_subtree_check
:默认情况下,NFS会检查用户访问的文件所在的子目录是否在/etc/exports
中,即每个子目录都要在这个exports
声明,否则禁止访问。该选项把这个特性关闭。nohide
:与no_subtree_check
类似,所有子目录都要在exports
中声明了才显示。该选项则设置显示所有的子目录。no_root_squash
:默认情况下,假设客户端处于root
状态,它对于NFS的访问的权限会被映射为非特权。该选项则允许映射root
特权。insecure
:默认情况下,NFS客户端必须使用保留端口(端口号大于1024)进行连接。我常用的NFS配置为:(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
。如下图所示:
sudo /etc/init.d/nfs-kernel-server restart
首先看一下防火墙是否启用,如果启用,看一下当前禁用的规则:
sudo ufw status
我这里没有打开:
如果打开了,我们要确保客户端的IP允许访问我们的NFS服务端
sudo ufw allow from client_ip to any port nfs
client_ip
为客户端的IP首先创建一个挂载的目录
sudo mkdir -p /nfs/general
假设服务端IP为192.168.31.120
,挂载服务端的NFS目录:
mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.31.120:/var/nfs/general /nfs/general
我们可以使用df -h
查看挂载结果:
此时服务端的/var/nfs/general
目录就和客户端的挂载目录/nfs/general
中的内容同步了。
SSH服务允许用户通过远程终端连接到Ubuntu服务器,进行各种管理操作。这使得管理员可以在任何地方进行系统管理和维护,而无需直接访问服务器。这里我们的用途实际就是在Windows中通过SSH软件来访问Ubuntu的终端。
输入以下指令安装:
sudo apt-get install openssh-server
这里的SSH软件我使用MobaXterm
,设置服务端的IP和用户名端口:
点击连接后会提示输入密码,然后就进入终端了:
Ubuntu和Windows之间的文件互传,我们可以使用FTP协议来实现。当然虚拟机有VMTOOLS,只是使用FTP的话,在同一个局域网内就都可以传输。
1、安装FTP服务
sudo apt-get install vsftpd
2、更改配置
sudo vi /etc/vsftpd.conf
将这两个配置前面的#
删掉:
write_enable=YES
:开启FTP的写权限,即允许FTP用户上传文件或者修改服务器上的文件local_umask=022
:控制新创建的文件和目录的默认权限的。022
表示不设置特殊权限,用户有rwx
权限,组有rx
权限,其他人有rx
权限。3、重启vsftp服务
sudo /etc/init.d/vsftpd restart
4、使用FTP客户端连接
这里以FileZilla为例进行连接:
主机设为Ubuntu的IP,端口为FTP默认端口21,用户名和密码就是Ubuntu登陆时的用户名和密码。连接成功后我们就可以看到Ubuntu中的文件:
我们就可以将WIndows中的文件传入Ubuntu了。