云服务器下,与嵌入式板子传递文件的几种方式
注:本文使用的是阿里云,其他云服务器的安全组配置应该大同小异
想一步到位的可以直接看 三、nfs
一、ftp、sftp、scp
三者均为文件传输协议,传递单一文件,需要帐号与密码
1、ftp
命令:
ftp ip
例如:
ftp 192.168.1.1
使用put上传文件,get下载文件
2、sftp
命令:
sftp user@ip
例如:
sftp root@192.168.1.1
同样使用put上传,get下载。不同的是sftp基于ssh,更安全。
3、scp
命令:
上传:scp 本地文件 目标地址:/文件目录
scp localfile user@ip:/direction
例如:
scp temp root@192.168.1.1:/home
下载:scp 目标地址:/文件 本地目录
scp user@ip:/direction/remotefile localdir/
例如:
scp root@192.168.1.1:/home/temp ./
如果远端的ssh的端口号不为22,例如为222 则命令为:
上传:
scp -P 222 temp root@192.168.1.1:/home
下载:
scp -P 222 root@192.168.1.1:/home/temp ./
scp同样是基于ssh的,十分安全。但相比于sftp,需要知道文件的确切位置。
以上三种方法在板子上操作起来都十分不方便,没办法快速的传递多个文件。
二、tftp
玩过Linux嵌入式开发板的对这个协议应该不陌生,许多课程也使用该协议传递文件。
下面介绍如何在Ubuntu 20.04.3上部署
1、下载tftp
sudo apt install tftpd-hpa tftp-hpa
#tftpd-hpa是服务器端
#tftp-hpa 是客户端
2、创建tftp服务器的文件目录
可以在任意地方创建,例如home目录下
mkdir /home/tftpServer
chmod 777 /home/tftpServer #需要修改权限为0777
3、修改配置文件
/etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tftpServer" #目录与第2步创建的一致
TFTP_ADDRESS=":69"
TFTP_OPTIONS="-l -c -s"
/etc/xinetd.d/tftp
server tftp {
ocket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/tftpServer -c #目录与第2步创建的一致
disable = no #一定得是no
er_source = 11
cps = 100 2
}
4、重启服务器
sudo /etc/init.d/tftpd-hpa restart
sudo /etc/init.d/xinetd reload
sudo /etc/init.d/xinetd restart
5、云服务器安全组添加端口
在云服务器的安全组中添加如下端口
6、测试
服务器 在/home/tftpServer 目录下放文件temp
板子使用:
下载:
tftp -g -r remoteFile ip
例如:
tftp -g -r temp 192.168.1.1
上传:
tftp -p -l localFile ip
例如:
tftp -p -l temp 192.168.1.1
三、nfs
这是最推荐的方法,以上的方法,都无法做到多文件互通共享,而nfs是最方便的
板子可通过nfs挂载服务器的一个文件目录到板子的任意目录下(一般为/mnt)
服务器对nfs服务器文件目录做的修改,在板子上可直接看到。而且对于内存空间小的板子来说,可以使用更大的空间存储文件
下面介绍如何在云服务器上使用nfs服务器
1、下载
sudo apt-get install nfs-kernel-server
2、创建nfs服务器的文件目录
mkdir /home/nfsShare
sudo chmod 777 /home/nfsShare
3、修改配置文件
/etc/exports
添加:
/home/nfsShare *(insecure,rw,sync,no_root_squash,no_subtree_check)
NFS服务需要开启 mountd,nfs,nlockmgr,portmapper,rquotad这5个服务.
其中nfs、portmapper的端口是固定的.
另外 mountd,nlockmgr 服务的端口是随机分配的.
所以需要给mountd,nlockmgr设置固定的端口。
/etc/default/nfs-kernel-server
修改mountd端口
#将mountd 端口号固定为10000
RPCMOUNTDOPTS="--manage-gids --port 10000"
/etc/sysctl.conf
修改 nlockmgr端口
系统控制文件,用于配置系统信息。其中配置的内容对应了 /proc/sys/ 目录下的子目录及文件。
需要使用 sysctl -p 来生效配置。
# nfs 固定nlockmgr端口号
fs.nfs.nlm_udpport=10013
fs.nfs.nlm_tcpport=10013
4、重启服务器
sysctl -p
systemctl restart rpcbind.service
systemctl restart nfs.service
sudo /etc/init.d/nfs-kernel-server restart
5、云服务器安全组添加端口
查看使用的端口号是否为配置的端口号
rpcinfo -p
结果:
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100005 1 udp 10000 mountd
100005 1 tcp 10000 mountd
100005 2 udp 10000 mountd
100005 2 tcp 10000 mountd
100005 3 udp 10000 mountd
100005 3 tcp 10000 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049
100003 3 udp 2049 nfs
100227 3 udp 2049
100021 1 udp 10013 nlockmgr
100021 3 udp 10013 nlockmgr
100021 4 udp 10013 nlockmgr
100021 1 tcp 10013 nlockmgr
100021 3 tcp 10013 nlockmgr
100021 4 tcp 10013 nlockmgr
上面打印的所有端口都得开放,不仅只是2049这个端口
6、测试
在nfs服务器文件目录下,添加文件temp
在板子上执行
mount -t nfs -o nolock 192.168.1.1:/home/nfsShare /mnt -o proto=tcp
可以在板子的/mnt目录下看到temp文件即为成功
四、常见错误
1、mount.nfs: access denied by server while mounting xxx
可能是因为我们设定的固定端口号过大,修改/etc/exports
/home/nfsShare *(insecure,rw,sync,no_root_squash,no_subtree_check)
2、nfs time out xxx
可能是防火墙,关闭防火墙即可
如果是云服务器,则可能是端口未开放,可以看本文第三章的第3节