文件服务——NFS和SAMBA

一、NFS服务介绍

1.1 NFS(Network File System)网络文件系统

  • 主要用于Linux系统上实现文件共享的一种协议,其客户端主要是Linux
  • 没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用
  • 支持多节点同时挂载及并发写入
  • 为企业集群中web server提供后端存储

1.2 主要组件

  • RPC(Remote Procedure Call Protocol):远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。
    rpcbind //负责NFS的数据传输,远程过程调用 tcp协议 端口111
    nfs-utils //控制共享哪些文件,权限管理

二、 NFS服务器搭建

2.1 软件安装

[root@review1 ~]# rpm -aq|grep ^nfs
nfs-utils-1.2.3-39.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64
[root@review1 ~]# rpm -q rpcbind
rpcbind-0.2.0-11.el6.x86_64
  • 配置文件介绍
/etc/exports  man 5 exports

共享目录        共享选项
/nfs/share      *(ro,sync)
共享主机:
*   :代表所有主机
192.168.0.0/24:代表共享给某个网段
192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享给不同网段
192.168.0.254:共享给某个IP
*.itcast.com:代表共享给某个域下的所有主机
共享选项:
ro:只读
rw:读写
sync:实时同步,直接写入磁盘
async:异步,先缓存在内存再同步磁盘
anonuid:设置访问nfs服务的用户的uid,uid需要在/etc/passwd中存在
anongid:设置访问nfs服务的用户的gid
root_squash :默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人server端是它自己,client端是nobody。
no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。
all_squash: 不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody

说明:
anonuid和anongid参数和all_squash一起使用。
all_squash表示不管是root还是其他普通用户从客户端所创建的文件在服务器端的拥有者和所属组都是nfsnobody;服务端为了对文件做相应管理,可以设置anonuid和anongid进而指定文件的拥有者和所属组。

注意:在客户端看到的文件的属组和属主和在服务端看到的并不相同。

2.2 NFS服务设置

server:

[root@review1 ~]# mkdir -p /share/nfs      //创建共享目录
[root@review1 ~]# vim /etc/exports             //将共享目录写入文件中
1 /share/nfs *(rw)
                                    //配置文件内容,写法及参数可以查看man
[root@review1 ~]# service rpcbind restart      //先重启rpcbind
Stopping rpcbind:                                          [  OK  ]
Starting rpcbind:                                          [  OK  ]
[root@review1 ~]# service nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]

client:
//挂载使用
[root@redis_slave ~]# mount.nfs 192.168.221.129:/share/nfs /nfs_test/
[root@redis_slave ~]# ls /nfs_test/
file1  file2  file3  file4  file5
[root@redis_slave ~]# cd /nfs_test/
[root@redis_slave nfs_test]# ls
file1  file2  file3  file4  file5                   //挂载成功

注意: 写入时需考虑共享文件夹是否有写入权限。

三、SAMBA服务

3.1 Samba介绍

  • SMB(Server Message Block)协议实现文件共享,也称为CIFS(Common Internet File System )
  • 是Windows和类Unix系统之间共享文件的一种协议
  • 客户端主要是Windows;支持多节点同时挂载以及并发写入
  • 主要用于windows和Linux下的文件共享、打印共享
  • 实现匿名与本地用户文件共享

Samba服务的主要进程:

  • smbd进程 控制发布共享目录与权限、负责文件传输 TCP 139 445
  • nmbd进程 用于名称解析netbios UDP 137 138 ;基于NETBIOS协议获得计算机名称——>解析为相应IP地址,实现信息通讯
    NetBIOS是Network Basic Input/Output System的简称,一般指用于局域网通信的一套API
  • 配置文件:
/etc/samba/smb.conf
[global]  全局选项
    workgroup = MYGROUP                 定义samba服务器所在的工作组
    server string = Samba Server Version %v         smb服务的描述
    log file = /var/log/samba/log.%m            日志文件
    max log size = 50                   日志的最大大小KB  
    security = user             认证模式:share匿名|user用户密码|server外部服务器用户密码
    passdb backend = tdbsam         密码格式
    load printers = yes         加载打印机
    cups options = raw          打印机选项
[homes]                 局部选项(共享名称)
    comment = Home Directories      描述
    browseable = no      隐藏共享名称
    writable = yes      可读可写
[printers]      共享名称
    comment = All Printers       描述
    path = /var/spool/samba  本地的共享目录
    browseable = no  隐藏
    guest ok = no ——>   public = no  需要帐号和密码访问
    writable = no  ——>  read only =yes 不可写 
    printable = yes      打印选项
  • 启动samba服务
[root@samba-server ~]# service smb start
Starting SMB services:                                     [  OK  ]
[root@samba-server ~]# service nmb start
Starting NMB services:                                     [  OK  ]

3.2 客户端工具使用方法

[root@samba-client ~]# yum -y install samba-client  //安装客户端


[root@samba-client ~]# smbclient -L //192.168.221.129   //匿名查看共享的文件
Enter root's password: 
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]

    Sharename       Type      Comment
    ---------       ----      -------
    IPC$            IPC       IPC Service (Samba Server Version 3.6.9-164.el6)
Anonymous login successful
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]

    Server               Comment
    ---------            -------
    SAMBA-SERVER         Samba Server Version 3.6.9-164.el6

    Workgroup            Master
    ---------            -------
    MYGROUP              SAMBA-SERVER
  • 在samba服务器上添加用户
[root@samba-server samba]# smbpasswd -a test1
New SMB password:
Retype new SMB password:
Added user test1.

注意:此用户一定要是系统中本来就有的用户,否则无法添加!

[root@samba-server samba]# smbpasswd -a test2
New SMB password:
Retype new SMB password:
Failed to add entry for user test2.    //test2系统中不存在,添加失败。
  • 指定用户访问成功:
[root@samba-client ~]# smbclient //192.168.221.129/test1 -U test1 
Enter test1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.9-164.el6]
smb: \> 
//登录的地方为test1的系统中的家目录(/home/test1)

注意:访问时IP地址后面跟着的是标签名,不是文件夹地址!

  • 查看samba中有哪些用户
[root@samba-server devops]# pdbedit -L
test1:502:

3.3 创建新的共享模块

[root@samba-server ~]# vim /etc/samba/smb.conf 

290 [devops]
291         comment=samba-server test
292         path =/devops               //模块所指向的文件夹
293         public =no                  //匿名用户可否访问
294         read only =no               //是否允许写入操作
295         printable = yes             
//其他相关模块参数,可参考配置文件。

注意:

如果访问被拒绝要注意: ①配置文件中是否给与权限。②文件夹是否有访问权限。

smb: \> mkdir test2
NT_STATUS_MEDIA_WRITE_PROTECTED making remote directory \test2  //没有写权限

samba服务器中控制命令

smb: \test2\> ?      //help和?都可以查看帮助
?              allinfo        altname        archive        blocksize      
cancel         case_sensitive cd             chmod          chown          
close          del            dir            du             echo           
exit           get            getfacl        geteas         hardlink

总结:

  1. samba服务默认是基于用户名和密码认证的服务。
  2. samba服务的用户必须是samba服务器上存在的用户,密码必须是samba数据库里的密码,本地也要有这个用户。
  3. 对于发布的共享资源,默认情况下本地用户是可以访问的,匿名用户是否访问看是否打开public=yes

3.4 访问控制

控制读写权限       //写在模块里
    writable = yes/no
    readonly = yes/no

如果资源可写,但只允许某些用户可写,其他都是只读
write list = admin, root, @staff(用户组)
read list = mary, @students

控制访问对象
    valid users = tom mary 
    invalid users = tom
注意:以上两个选项只能存在其中一个

网络访问控制:
hosts deny = 192.168.0.   拒绝某个网段
host allow = 192.168.0.254  允许某个IP
hosts deny = all  拒绝所有
hosts allow = 192.168.0. EXCEPT 192.168.0.254  允许某个网段,但拒绝某个单个IP
注意:deny和allow同时存在,allow优先

3.5 挂载使用

[root@samba-client /]# mount.cifs -o user=stu1,pass=123456 //192.168.221.129/share /stu1
[root@samba-client /]# df -h
Filesystem                   Size  Used Avail Use% Mounted on
/dev/mapper/vg_min1-lv_root   13G  1.6G   11G  14% /
tmpfs                        491M     0  491M   0% /dev/shm
/dev/sda1                    485M   33M  427M   8% /boot
/dev/sr0                     4.2G  4.2G     0 100% /mnt/dvd
//192.168.221.129/share       13G  1.3G   11G  11% /stu1
(reverse-i-search)`mount ': ^Cunt -t cifs  -o user=test,pass=123456  //192.168.221.129/devops/test /samba

注意:
① 挂载IP后面写的是标签名,不是路径。

② 注意用户名密码,不能写错,一定要是samba服务器里的,不然只会报权限拒绝,不会报用户名密码错误。

③注意分享文件格式,如果将printable设置为yes,分享的文件夹会变为Printer类型,那么用-o就无法挂载了,会显示文件夹不存在。