由于实验室日常的工作环境就是不断在windows和ubuntu之间切换,不同电脑和工控机之间切换,还有程序在上位机和控制板直接来回传输,所以使用U盘拷贝或者FTP传输实在有点麻烦,而且程序编译出错之后修改,经常会忘记同步,最后不知道那个文件才是最终版。

       之前使用一款比较好的软件叫做坚果云,是一款跨平台的文件同步软件,支持多用户,很适合实验室这样的工作场景,奈何奈何,坚果云每个月的上传和下载流量都是由限额的,到月清空,当同步的文件不大的时候还是不错的,但是同步文件巨大时就不那么好用了。

       所以试着在自己的工控机中的ubuntu系统中搭建了Samba和NFS服务器,用于Linux和windows文件互传,Linux和Linux文件互传与同步。

由于工控机每次启动,ip地址可能会更换,所以设置静态ip

  • 【ubuntu 12.04】 vmware 桥接模式
直接打开  /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 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
重启即可
  • 【ubuntu 16.04】
首先需要修改 /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

2. Samba服务器搭建,主要用于window和Linux文件互传和同步

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。

3. NFS服务器搭建,主要用于Linux和Linux文件挂载

        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