参考链接https://www.linuxprobe.com
Samba 跨平台的文件共享 linux-linux linux-windows /etc/samba/smb.conf 里面 []这个名字为挂载时填写的名字 vim /etc/fstab //192.168.161.40/database_test /ddd cifs credentials=/root/auth.smb 0 0 nfs vim /etc/exports /database 192.168.161.*(rw,sync,root_squash) showmount -e 192.168.161.40 vim /etc/fstab 192.168.161.40:/database /database nfs default 0 0 mount -a FTP文件传输服务确实可以让主机之间的文件传输变得简单方便,但是FTP协议的本质是传输文件,而非共享文件,因此要想通过客户端直接在服务器上修改文件内容还是一件比较麻烦的事情。 SMB(Server Messages Block,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题 Samba服务程序的配置方法与之前讲解的很多服务的配置方法类似,首先需要先通过Yum软件仓库来安装Samba服务程序(Samba服务程序的名字也恰巧是软件包的名字): yum install samba 主配置文件 /etc/samba/smb.conf 由于在Samba服务程序的主配置文件中,注释信息行实在太多,不便于分析里面的重要参数,因此先把主配置文件改个名字,然后使用cat命令读入主配置文件,再在grep命令后面添加-v参数(反向选择),分别去掉所有以井号(#)和分号(;)开头的注释信息行,对于剩余的空白行可以使用^$参数来表示并进行反选过滤,最后把过滤后的可用参数信息通过重定向符覆盖写入到原始文件名称中。执行过滤后剩下的Samba服务程序的参数并不复杂,为了更方便读者查阅参数的功能,表12-1罗列了这些参数以及相应的注释说明。 mv /etc/samba/smb.conf /etc/samba/smb.conf_bak cat /etc/samba/smb.conf.bak|grep -v "#"|grep -v ";"|grep -v "^$" > /etc/samba/smb.conf 表12-1 Samba服务程序中的参数以及作用 [global] #全局参数。 workgroup = MYGROUP #工作组名称 server string = Samba Server Version %v #服务器介绍信息,参数%v为显示SMB版本号 log file = /var/log/samba/log.%m #定义日志文件的存放位置与名称,参数%m为来访的主机名 max log size = 50 #定义日志文件的最大容量为50KB security = user #安全验证的方式,总共有4种 #share:来访主机无需验证口令;比较方便,但安全性很差 #user:需验证来访主机提供的口令后才可以访问;提升了安全性 #server:使用独立的远程主机验证来访主机提供的口令(集中管理账户) #domain:使用域控制器进行身份验证 passdb backend = tdbsam #定义用户后台的类型,共有3种 #smbpasswd:使用smbpasswd命令为系统用户设置Samba服务程序的密码 #tdbsam:创建数据库文件并使用pdbedit命令建立Samba服务程序的用户 #ldapsam:基于LDAP服务进行账户验证 load printers = yes #设置在Samba服务启动时是否共享打印机设备 cups options = raw #打印机的选项 [homes] #共享参数 comment = Home Directories #描述信息 browseable = no #指定共享信息是否在“网上邻居”中可见 writable = yes #定义是否可以执行写入操作,与“read only”相反 [printers] #打印机共享参数 comment = All Printers path = /var/spool/samba #共享文件的实际路径(重要)。 browseable = no guest ok = no #是否所有人可见,等同于"public"参数。 writable = no printable = yes Samba服务程序的主配置文件与前面学习过的Apache服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,只要将表12-2中的参数写入到Samba服务程序的主配置文件中,然后重启该服务即可。 12-2 用于设置Samba服务程序的参数以及作用 vim /etc/samba/smb.conf 参数 作用 [database] 共享名称为database comment = Do not arbitrarily modify the database file 警告用户不要随意修改数据库 path = /home/database 共享目录为/home/database public = no 关闭“所有人可见” writable = yes 第1步:创建用于访问共享资源的账户信息。在RHEL 7系统中,Samba服务程序默认使用的是用户口令认证模式(user)。这种认证模式可以确保仅让有密码且受信任的用户访问共享资源,而且验证过程也十分简单。不过,只有建立账户信息数据库之后,才能使用用户口令认证模式。另外,Samba服务程序的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪,由此引发错误 pdbedit命令用于管理SMB服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”。在第一次把账户信息写入到数据库时需要使用-a参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了。pdbedit命令中使用的参数以及作用如表12-3所示。 表12-3 用于pdbedit命令的参数以及作用 参数 作用 -a 用户名 建立Samba用户 -x 用户名 删除Samba用户 -L 列出用户列表 -Lv 列出用户详细信息的列表 #systemctl restart smb #systemctl enable smb [root@linuxprobe ~]# pdbedit -a -u linuxprobe #必须是已经存在的用户 useradd -d /home/liangjiancong -s /sbin/nologin ljc pdbedit -a -u ljc 第2步:创建用于共享资源的文件目录。在创建时,不仅要考虑到文件读写权限的问题,而且由于/home目录是系统中普通用户的家目录,因此还需要考虑应用于该目录的SELinux安全上下文所带来的限制。在前面对Samba服务程序配置文件中的注释信息进行过滤时,这些过滤的信息中就有关于SELinux安全上下文策略的说明,我们只需按照过滤信息中有关SELinux安全上下文策略中的说明中给的值进行修改即可。修改完毕后执行restorecon命令,让应用于目录的新SELinux安全上下文立即生效。 #ll -ldZ /etc/samba drwxr-xr-x. root root system_u:object_r:samba_etc_t:s0 /etc/samba/ mkdir /home/database chown -Rf linuxprobe:linuxprobe /home/database semanage fcontext -a -t samba_etc_t /home/database restorecon -Rv /home/database restorecon -Rv /home/database/* 第3步:设置SELinux服务与策略,使其允许通过Samba服务程序访问普通用户家目录。执行getsebool命令,筛选出所有与Samba服务程序相关的SELinux域策略,根据策略的名称(和经验)选择出正确的策略条目进行开启即可: getsebool -a |grep samba setsebool -P samba_enable_home_dirs=on 第4步:在Samba服务程序的主配置文件中,根据表12-2所提到的格式写入共享信息。在原始的配置文件中,[homes]参数为来访用户的家目录共享信息,[printers]参数为共享的打印机设备。这两项如果在今后的工作中不需要,可以删除 vim /etc/samba/smb.conf [root@linuxprobe ~]# vim /etc/samba/smb.conf [global] workgroup = MYGROUP server string = Samba Server Version %v log file = /var/log/samba/log.%m max log size = 50 security = user passdb backend = tdbsam load printers = yes cups options = raw [database] comment = Do not arbitrarily modify the database file path = /home/database public = no writable = yes 第5步:Samba服务程序的配置工作基本完毕。接下来重启smb服务(Samba服务程序在Linux系统中的名字为smb)并清空iptables防火墙,然后就可以检验配置效果了。 [root@linuxprobe ~]# systemctl restart smb 2.1.2 Windows挂载共享 无论Samba共享服务是部署Windows系统上还是部署在Linux系统上,通过Windows系统进行访问时,其步骤和方法都是一样的。下面假设Samba共享服务部署在Linux系统上,并通过Windows系统来访问Samba服务。Samba共享服务器和Windows客户端的IP地址可以根据表12-4来设置。 Samba共享服务器和Linux客户端各自使用的操作系统以及IP地址 yum -y install cifs-utils 在Linux客户端,按照Samba服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件中。为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅root管理员才能够读写: [root@linuxprobe ~]# vim auth.smb username=linuxprobe password=redhat domain=MYGROUP [root@linuxprobe ~]# chmod -Rf 600 auth.smb 现在,在Linux客户端上创建一个用于挂载Samba服务共享资源的目录,并把挂载信息写入到/etc/fstab文件中,以确保共享挂载信息在服务器重启后依然生效: [root@linuxprobe ~]# mkdir /database [root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 //192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0 [root@linuxprobe ~]# mount -a Linux客户端成功地挂载了Samba服务的共享资源。进入到挂载目录/database后就可以看到Windows系统访问Samba服务程序时留下来的文件了(即文件Memo.txt)。当然,我们也可以对该文件进行读写操作并保存。 [root@linuxprobe ~]# cat /database/Memo.txt i can edit it . 出现问题?大胆提问! 因读者们硬件不同或操作错误都可能导致实验配置出错,请耐心再仔细看看操作步骤吧,不要气馁~ Linux技术交流请加A群:560843(满),B群:340829(推荐),C群:463590(推荐),点此查看全国群。 *本群特色:通过口令验证确保每一个群员都是《Linux就该这么学》的读者,答疑更有针对性,不定期免费领取定制礼品。 12.2 NFS网络文件系统 如果大家觉得Samba服务程序的配置太麻烦,而且恰巧需要共享文件的主机都是Linux系统,刘遄老师非常推荐大家在客户端部署NFS服务来共享文件。NFS(网络文件系统)服务可以将远程Linux系统上的文件共享资源挂载到本地主机的目录上,从而使得本地主机(Linux客户端)基于TCP/IP协议,像使用本地主机上的资源那样读写远程Linux系统上的共享文件。 由于RHEL 7系统中默认已经安装了NFS服务,外加NFS服务的配置步骤也很简单,因此刘遄老师在授课时会将NFS戏谑为Need For Speed。接下来,我们准备配置NFS服务。首先请使用Yum软件仓库检查自己的RHEL 7系统中是否已经安装了NFS软件包: [root@linuxprobe ~]# yum install nfs-utils Loaded plugins: langpacks, product-id, subscription-manager (1/2): rhel7/group_gz | 134 kB 00:00 (2/2): rhel7/primary_db | 3.4 MB 00:00 Package 1:nfs-utils-1.3.0-0.el7.x86_64 already installed and latest version Nothing to do 第1步:为了检验NFS服务配置的效果,我们需要使用两台Linux主机(一台充当NFS服务器,一台充当NFS客户端),并按照表12-6来设置它们所使用的IP地址。 表12-6 两台Linux主机所使用的操作系统以及IP地址 主机名称 操作系统 IP地址 NFS服务端 RHEL 7 192.168.10.10 NFS客户端 RHEL 7 192.168.10.20 另外,不要忘记清空NFS服务器上面iptables防火墙的默认策略,以免默认的防火墙策略禁止正常的NFS共享服务。 [root@linuxprobe ~]# iptables -F [root@linuxprobe ~]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] 第2步:在NFS服务器上建立用于NFS文件共享的目录,并设置足够的权限确保其他人也有写入权限。 [root@linuxprobe ~]# mkdir /nfsfile [root@linuxprobe ~]# chmod -Rf 777 /nfsfile [root@linuxprobe ~]# echo "welcome to linuxprobe.com" > /nfsfile/readme 第3步:NFS服务程序的配置文件为/etc/exports,默认情况下里面没有任何内容。我们可以按照“共享目录的路径 允许访问的NFS客户端(共享权限参数)”的格式,定义要共享的目录与相应的权限。 例如,如果想要把/nfsfile目录共享给192.168.10.0/24网段内的所有主机,让这些主机都拥有读写权限,在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失,以及把来访客户端root管理员映射为本地的匿名用户等,则可以按照下面命令中的格式,将表12-7中的参数写到NFS服务程序的配置文件中。 表12-7 用于配置NFS服务程序配置文件的参数 参数 作用 ro 只读 rw 读写 root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 sync 同时将数据写入到内存与硬盘中,保证不丢失数据 async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 请注意,NFS客户端地址与权限之间没有空格。 [root@linuxprobe ~]# vim /etc/exports /nfsfile 192.168.10.*(rw,sync,root_squash) 第4步:启动和启用NFS服务程序。由于在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call,远程过程调用)服务将NFS服务器的IP地址和端口号等信息发送给客户端。因此,在启动NFS服务之前,还需要顺带重启并启用rpcbind服务程序,并将这两个服务一并加入开机启动项中。 [root@linuxprobe ~]# systemctl restart rpcbind [root@linuxprobe ~]# systemctl enable rpcbind [root@linuxprobe ~]# systemctl start nfs-server [root@linuxprobe ~]# systemctl enable nfs-server ln -s '/usr/lib/systemd/system/nfs-server.service' '/etc/systemd/system/nfs.target.wants/nfs-server.service' NFS客户端的配置步骤也十分简单。先使用showmount命令(以及必要的参数,见表12-8)查询NFS服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”。 表12-8 showmount命令中可用的参数以及作用 参数 作用 -e 显示NFS服务器的共享列表 -a 显示本机挂载的文件资源的情况NFS资源的情况 -v 显示版本号 [root@linuxprobe ~]# showmount -e 192.168.10.10 Export list for 192.168.10.10: /nfsfile 192.168.10.* 然后在NFS客户端创建一个挂载目录。使用mount命令并结合-t参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP地址、服务器上的共享目录以及要挂载到本地系统(即客户端)的目录。 [root@linuxprobe ~]# mkdir /nfsfile [root@linuxprobe ~]# mount -t nfs 192.168.10.10:/nfsfile /nfsfile 挂载成功后就应该能够顺利地看到在执行前面的操作时写入的文件内容了。如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中: [root@linuxprobe ~]# cat /nfsfile/readme welcome to linuxprobe.com [root@linuxprobe ~]# vim /etc/fstab # # /etc/fstab # Created by anaconda on Wed May 4 19:26:23 2017 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/rhel-root / xfs defaults 1 1 UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2 /dev/mapper/rhel-swap swap swap defaults 0 0 /dev/cdrom /media/cdrom iso9660 defaults 0 0 192.168.10.10:/nfsfile /nfsfile nfs defaults 0 0 12.3 AutoFs自动挂载服务 无论是Samba服务还是NFS服务,都要把挂载信息写入到/etc/fstab中,这样远程共享资源就会自动随服务器开机而进行挂载。虽然这很方便,但是如果挂载的远程资源太多,则会给网络带宽和服务器的硬件资源带来很大负载。如果在资源挂载后长期不使用,也会造成服务器硬件资源的浪费。可能会有读者说,“可以在每次使用之前执行mount命令进行手动挂载”。这是一个不错的选择,但是每次都需要先挂载再使用,您不觉得麻烦吗? autofs自动挂载服务可以帮我们解决这一问题。与mount命令不同,autofs服务程序是一种Linux系统守护进程,当检测到用户试图访问一个尚未挂载的文件系统时,将自动挂载该文件系统。换句话说,我们将挂载信息填入/etc/fstab文件后,系统在每次开机时都自动将其挂载,而autofs服务程序则是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。 [root@linuxprobe ~]# yum install autofs Loaded plugins: langpacks, product-id, subscription-manager This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. rhel | 4.1 kB 00:00 Resolving Dependencies --> Running transaction check ---> Package autofs.x86_64 1:5.0.7-40.el7 will be installed --> Processing Dependency: libhesiod.so.0()(64bit) for package: 1:autofs-5.0.7-40.el7.x86_64 --> Running transaction check ---> Package hesiod.x86_64 0:3.2.1-3.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: autofs x86_64 1:5.0.7-40.el7 rhel 550 k Installing for dependencies: hesiod x86_64 3.2.1-3.el7 rhel 30 k Transaction Summary ================================================================================ Install 1 Package (+1 Dependent package) Total download size: 579 k Installed size: 3.6 M Is this ok [y/d/N]: y Downloading packages: -------------------------------------------------------------------------------- Total 9.4 MB/s | 579 kB 00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : hesiod-3.2.1-3.el7.x86_64 1/2 Installing : 1:autofs-5.0.7-40.el7.x86_64 2/2 Verifying : hesiod-3.2.1-3.el7.x86_64 1/2 Verifying : 1:autofs-5.0.7-40.el7.x86_64 2/2 Installed: autofs.x86_64 1:5.0.7-40.el7 Dependency Installed: hesiod.x86_64 0:3.2.1-3.el7 Complete! 处于生产环境中的Linux服务器,一般会同时管理许多设备的挂载操作。如果把这些设备挂载信息都写入到autofs服务的主配置文件中,无疑会让主配置文件臃肿不堪,不利于服务执行效率,也不利于日后修改里面的配置内容,因此在autofs服务程序的主配置文件中需要按照“挂载目录 子配置文件”的格式进行填写。挂载目录是设备挂载位置的上一级目录。例如,光盘设备一般挂载到/media/cdrom目录中,那么挂载目录写成/media即可。对应的子配置文件则是对这个挂载目录内的挂载设备信息作进一步的说明。子配置文件需要用户自行定义,文件名字没有严格要求,但后缀建议以.misc结束。具体的配置参数如第7行的加粗字所示。 [root@linuxprobe ~]# vim /etc/auto.master # # Sample auto.master file # This is an automounter map and it has the following format # key [ -mount-options-separated-by-comma ] location # For details of the format look at autofs(5). # /media /etc/iso.misc /misc /etc/auto.misc # # NOTE: mounts done from a hosts map will be mounted with the # "nosuid" and "nodev" options unless the "suid" and "dev" # options are explicitly given. # /net -hosts # # Include /etc/auto.master.d/*.autofs # +dir:/etc/auto.master.d # # Include central master map if it can be found using # nsswitch sources. # # Note that if there are entries for /net or /misc (as # above) in the included master map any keys that are the # same will not be seen as the first read key seen takes # precedence. # +auto.master 在子配置文件中,应按照“挂载目录 挂载文件类型及权限 :设备名称”的格式进行填写。例如,要把光盘设备挂载到/media/iso目录中,可将挂载目录写为iso,而-fstype为文件系统格式参数,iso9660为光盘设备格式,ro、nosuid及nodev为光盘设备具体的权限参数,/dev/cdrom则是定义要挂载的设备名称。配置完成后再顺手将autofs服务程序启动并加入到系统启动项中: [root@linuxprobe ~]# vim /etc/iso.misc iso -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom [root@linuxprobe ~]# systemctl start autofs [root@linuxprobe ~]# systemctl enable autofs ln -s '/usr/lib/systemd/system/autofs.service' '/etc/systemd/system/multi-user.target.wants/autofs.service' 接下来将发生一件非常有趣的事情。我们先查看当前的光盘设备挂载情况,确认光盘设备没有被挂载上,而且/media目录中根本就没有iso子目录。但是,我们却可以使用cd命令切换到这个iso子目录中,而且光盘设备会被立即自动挂载上。我们也就能顺利查看光盘内的内容了。 [root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.0G 15G 17% / devtmpfs 905M 0 905M 0% /dev tmpfs 914M 140K 914M 1% /dev/shm tmpfs 914M 8.9M 905M 1% /run tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/sda1 497M 119M 379M 24% /boot [root@linuxprobe ~]# cd /media [root@linuxprobe media]# ls [root@linuxprobe media]# cd iso [root@linuxprobe iso]# ls -l total 812 dr-xr-xr-x. 4 root root 2048 May 7 2017 addons dr-xr-xr-x. 3 root root 2048 May 7 2017 EFI -r--r--r--. 1 root root 8266 Apr 4 2017 EULA -r--r--r--. 1 root root 18092 Mar 6 2012 GPL dr-xr-xr-x. 3 root root 2048 May 7 2017 images dr-xr-xr-x. 2 root root 2048 May 7 2017 isolinux dr-xr-xr-x. 2 root root 2048 May 7 2017 LiveOS -r--r--r--. 1 root root 108 May 7 2017 media.repo dr-xr-xr-x. 2 root root 774144 May 7 2017 Packages dr-xr-xr-x. 24 root root 6144 May 7 2017 release-notes dr-xr-xr-x. 2 root root 4096 May 7 2017 repodata -r--r--r--. 1 root root 3375 Apr 1 2017 RPM-GPG-KEY-redhat-beta -r--r--r--. 1 root root 3211 Apr 1 2017 RPM-GPG-KEY-redhat-release -r--r--r--. 1 root root 1568 May 7 2017 TRANS.TBL [root@linuxprobe ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/rhel-root 18G 3.0G 15G 17% / devtmpfs 905M 0 905M 0% /dev tmpfs 914M 140K 914M 1% /dev/shm tmpfs 914M 8.9M 905M 1% /run tmpfs 914M 0 914M 0% /sys/fs/cgroup /dev/cdrom 3.5G 3.5G 0 100% /media/iso /dev/sda1 497M 119M 379M 24% /boot 1.要想实现linux与windows之间文件共享,可以使用Samba, NFS仅能实现Linux系统之间文件共享 2.pdbedit命令是用于管理Samba服务程序的账户信息数据库 3.Linux系统中使用Samba程序来共享资源的步骤:首先应该创建密码认证文件以及挂载目录,然后把挂载信息写入到/etc/fstab文件中,最后执行mount -a 4.需要安装NFS,yum -y install nfs-utils 5.客户端查看远程NFS服务器上的共享资源使用 showmount命令来查看 6.autofs服务程序,实现动态灵活的设备挂载操作,而且只有检测到用户视图访问一个尚未挂载的文件系统,才自动挂载