由于实验室日常的工作环境就是不断在windows和ubuntu之间切换,不同电脑和工控机之间切换,还有程序在上位机和控制板直接来回传输,所以使用U盘拷贝或者FTP传输实在有点麻烦,而且程序编译出错之后修改,经常会忘记同步,最后不知道那个文件才是最终版。
之前使用一款比较好的软件叫做坚果云,是一款跨平台的文件同步软件,支持多用户,很适合实验室这样的工作场景,奈何奈何,坚果云每个月的上传和下载流量都是由限额的,到月清空,当同步的文件不大的时候还是不错的,但是同步文件巨大时就不那么好用了。
所以试着在自己的工控机中的ubuntu系统中搭建了Samba和NFS服务器,用于Linux和windows文件互传,Linux和Linux文件互传与同步。
直接打开 /etc/network/interfaces 文件,该文件在开始时,只有以下内容
auto lo
iface lo inet loopback
然后直接在文件的后面增加设置,修改后的内容变为
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.1.103
netmask 255.255.255.0
gateway 192.168.1.1
dns-nameservers 8.8.8.8
eth0 这个参数,应该和自己的机器ifconfig 输出相符,dns-nameservers 参数是一定要设置的,否则会无法上网。
在ubuntu 14.04 中,前面的设置和ubuntu 12.04 相同,但是还需要再修改一个文件 /etc/NetworkManager/NetworkManager.conf,将里面的 managed 参数设置为true,然后重启机器即可。
如果ping不通,修改 /etc/resolvconf/resolv.conf.d/base,增加
nameserver 8.8.8.8
nameserver 8.8.4.4
重启即可
首先需要修改 /etc/network/interfaces
增加
auto ens33
iface ens33 inet static
address 192.168.88.181
netmask 255.255.255.0
gateway 192.168.88.2
(注意,ubuntu 16之后的网卡名字不再是 eth0 之类,而是其他名字,例如作者这里就是 ens33,还有 dns-server 这一行一定要写,否则会设置失败)
修改/etc/NetworkManager/NetworkManager.conf 文件,将 managed 设置为 true
设置 /etc/resolvconf/resolv.conf.d/base,增加
nameserver 223.5.5.5
nameserver 223.6.6.6
因为机器在重启后,真正读取dns 的配置是在 /etc/resolv.conf,但是 /etc/resolv.conf 的数据来源于 /etc/resolvconf/resolv.conf.d/base
用户可以通过以下命令查看 /etc/resolvconf/resolv.conf.d/base 的值是否被刷到 /etc/resolv.conf 上
resolvconf -u
重启网络服务
/etc/init.d/networking restart
1、安装samba :一共有两个应用
安装samba:
sudo apt-get install samba
安装smbclient:
sudo apt-get install smbclient
2、如果想要完全卸载samba和配置文件
卸载samba:
sudo apt-get remove --purge samba
3. 添加Samba用户把当前用户添加为Samba用户,或者新建一个ubuntu用户作为Samba用户也可以
$ sudo smbpasswd -a redwall
设置Samba用户的密码,可以为空。
4. 配置共享目录
在ubuntu中新建 /home/redwall/share 文件夹
修改Samba配置文件
$ mkdir /home/redwall/share
$ sudo vim /etc/samba/smb.conf在最后一行添加如下代码
[share]
comment=samba ##这个是说明,随意填
path=/home/redwall/share
public=yes
writable = yes
create mask=0775
directory mask=0775
valid users=redwall
available = yes
browseable = yes
5、重启samba
sudo /etc/init.d/samba restart
6、查看ubuntu主机ip地址
$ ifconfig 假设地址为192.168.1.103
7、在windows中使用win+R输入 \\192.168.1.103 即可打开共享文件夹(或者打开浏览器输入,也可以是盘符的网络位置)
8、为了更方便地使用,我们可以将samba服务器映射到磁盘,按照如下的步骤即可将samba服务器映射到磁盘
1.打开计算机界面,点击映射网络驱动选项
2.在文件夹选项中输入对应的路径
3.点击确定,即可在计算机界面看见映射成功的磁盘了
上面的方法是window作为客户端,创建的share文件夹就是两个系统之间的共享的,不仅可以同步文件,还可以作为传输文件的管道。比起U盘或者FTP一个一个的传要方便的多。
linux终端作为客户端:第一种是使用smbclient访问samba服务器,第二种是直接将共享目录挂载到自己的电脑上,强烈推荐第二种。这种两种方法有点类似FTP传输文件的方法,连get和put的命令都是一样的,而挂载的方法也类似与NFS服务器。所以Linux和Linux之间我还是更喜欢NFS服务器来挂载。
1. smbclient安装
sudo apt-get install smbclient
2. 查看目录的所有共享目录
smbclient -L 192.168.1.103 #192.168.1.103是samba服务器IP
3. 连接共享目录
smbclient //192.168.1.103/share # IP地址后接共享目录
成功后出现提示符smb:\>,下面就可以开始操作。
4. smbclient 常用命令
?或help [command] 提供关于帮助或某个命令的帮助
![shell command] 执行所用的SHELL命令,或让用户进入 SHELL提示符
cd [目录] 切换到服务器端的指定目录,如未指定,则 smbclient 返回当前本地目录
lcd [目录] 切换到客户端指定的目录;
dir 或ls 列出当前目录下的文件;
exit 或quit 退出smbclient
get file1 file2 从服务器上下载file1,并以文件名file2存在本地机上;如果不想改名,可以把file2省略
mget file1 file2 file3 filen 从服务器上下载多个文件;
md或mkdir 目录 在服务器上创建目录
rd或rmdir 目录 删除服务器上的目录
put file1 [file2] 向服务器上传一个文件file1,传到服务器上改名为file2;
mput file1 file2 filen 向服务器上传多个文件
5. 将共享目录挂载到本地
mount -t cifs -o username=redwall,password=xxx //192.168.1.103/share ~/share
我的系统环境是Ubuntu14.04,内核版本3.19,挂载方式已经不支持smbfs,最新内核使用cifs。
NFS是Network File-System,作用是实现不同机器不同系统之间的文件共享。编好程序后,还可以通过nfs把可执行文件传输到开发板中,让其在开发板里运行的。NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPCserver 的一种呢。此外,不论是客户端还是服务器端,要使用 NFS 时,两者都需要启动 RPC 才行。
具体的步骤如下:
一、命令窗口: 1、sudo apt-get install nfs-kernel-server 2、sudo apt-get install rpcbind
客户端系统中也要安装: 1 . sudo apt-get install nfs-common
二、配置配置文件。安装好上面的软件后,会在/etc下出现一个名叫exports的文件(如果没有新建一个也可以),打开后可以看到如下内容: 这是一些注释,提示你怎样配置nfs。因为nfs是一种网络共享,所以首先要确定你想把哪个文件夹共享出来,目前假设共享的文件目录为 /home/redwall/catkin_ws/src,建议不要把共享的文件夹选的太大,那样会严重影响共享传输的速度;还要确定主机的IP地址是多少,目前先假设IP为192.168.1.103 配置时只需要在exports文件的末尾加上一句话:
/home/redwall/catkin_ws/src *(rw,sync,no_subtree_check,no_root_squash)
下面解释一下,总共需要写三部分的东西,第一部分就是 /home/redwall/catkin_ws/src,也就是待共享的目录,因为我主要写ROS程序,所以直接把ROS工作空间共享出去了。第二部分 * 是指在这个IP地址段192.168.1.103内可以共享,第三部分就是括号里的内容,就是参数,也是配置的重点地方,下面重点说一下: 第一个参数: rw: 可擦写的权限 ;ro: 只读的权限。
第二个参数: sync: 资料同步写入到内存与硬盘当中 ;async: 资料会先暂存于内存当中,而非直接写入硬盘
第三个参数:
1、no_root_squash: 登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有root的权限!这个项目极不安全,不建议使用!
2、root_squash: 在登入 NFS 主机使用分享之目录的使用者如果是root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成nobody那个身份。
3、all_squash: 不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody啦!
4、anonuid: 前面关于*_squash提到的匿名使用者的UID设定值,通常为nobody,但是你可以自行设定这个UID的值!当然,这个UID必需要存在于你的/etc/passwd当中!
5、anongid:同anonuid,但是变成group ID就是了。
三、启动nfs服务
1、保存上述配置文件后重启服务:
$ sudo /etc/init.d/rpcbind restart
$ sudo /etc/init.d/nfs-kernel-server restart
四、在客户端的终端中输入
# 可以查看服务器开放了哪些共享目录,例如:showmount -e 192.168.1.103
$ showmount -e [服务器IP地址]
# 例如:mount -t nfs -o nolock 192.168.1.103:/home/redwall/catkin_ws/src /mnt即:挂载成功后,访问本地/mnt目录时即是访问服务端的/home/redwall/catkin_ws/src的目录。
$ mount -t nfs -o nolock [服务器IP地址]:[共享目录路径] [本机用于挂载的路径]
# 如果想要与开发板进行nfs传输,则在开发板的Linux系统下的终端中输入:进入/mnt目录会发现有了
$ mount -t nfs 192.168.1.103:/home/redwall/catkin_ws/src /mnt -o nolock
# 取消挂载用
$ sudo umount /mnt