16.1 访问NFS存储

前面介绍了使用本地存储,本章介绍使用网络上的存储设备。NFS全称是网络文件系统,所实现的是Linux和Linux之间的共享。
下面的练习我们将会在server上创建一个文件夹/share,然后通过NFS把它共享,然后在server2上把这个共享文件夹挂载到/nfs上,如图16-1所示。
RHCE9学习指南 第16章 访问NFS存储及自动挂载-LMLPHP
图16-1 本实验拓扑图
首先在srever上启动nfs-server服务并设置开启自动启动,命令如下。

[root@server ~]# systemctl enable nfs-server --now
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@server ~]#

创建准备共享的目录/share,命令如下。

[root@server ~]# mkdir /share
[root@server ~]#

在/etc/exports中把目录/share共享出去,命令如下。

[root@server ~]# cat /etc/exports
/share	*(rw,no_root_squash)
[root@server ~]#

这里*的意思是表示任何客户端都可以访问/share目录。
让共享生效,命令如下。

[root@server ~]# exportfs -arv
exporting *:/share
[root@server ~]# 

在server上配置防火墙放行nfs,命令如下。

[root@server ~]# firewall-cmd --add-service=nfs --permanent 
success
[root@server ~]# firewall-cmd --add-service=rpc-bind --permanent 
success
[root@server ~]# firewall-cmd --add-service=mountd --permanent 
success
[root@server ~]# firewall-cmd  --reload
success
[root@server ~]# 

关于防火墙的配置在后续会有专门章节讲解。
在server2上访问这个共享文件夹,首先使用showmount查看服务器上共享的目录,命令如下。

[root@server2 ~]# showmount -e 192.168.26.101
Export list for 192.168.26.101:
/share *
[root@server2 ~]#

把服务器上共享的目录挂载到本地/nfs目录上,命令如下。

[root@server2 ~]# mount 192.168.26.101:/share /nfs
[root@server2 ~]#

查看挂载情况,命令如下。

[root@server2 ~]# df -hT | grep nfs
192.168.26.101:/share nfs4       50G  5.0G   46G   10% /nfs
[root@server2 ~]#

这里可以看到,已经挂载好了。
如果希望开机能够自动挂载,则写入/etc/fstab中,命令如下。

[root@server2 ~]# tail -1 /etc/fstab
192.168.26.101:/share	/nfs	nfs	 defaults	0 0
[root@server2 ~]#

16.2 自动挂载

自动挂载的意思是,把一个外部设备/dev/xx和某个目录/dir/yy关联起来。平时/dev/xx是否挂载到了/dir/yy上不需要考虑,但访问/dir/yy时,系统就知道要访问设置/dev/xx中的数据,这个时候系统会自动地将/dev/xx挂载到/dir/yy上。
安装软件包的步骤如下。
步骤1:挂载光盘,命令如下。

[root@server2 ~]# mount /dev/cdrom /mnt
mount: /mnt: WARNING: device write-protected, mounted read-only.
[root@server ~]#

这里准备把光盘作为yum源。
步骤2:编写repo文件,命令如下。

[root@server2 ~]# cat /etc/yum.repos.d/aa.repo 
[aa]
name=aa
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0

[bb]
name=bb
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0
[root@server ~]#

开始安装autofs,命令如下。

[root@server2 ~]# yum install autofs -y
Updating Subscription Management repositories.
	...输出...
已安装:
  autofs-1:5.1.7-27.el9.x86_64 
完毕!
[root@server2 ~]#

启动autofs并设置开机自动启动,命令如下。

[root@server2 ~]# systemctl enable autofs --now
Created symlink /etc/systemd/system/multi-user.target.wants/autofs.service → /usr/lib/systemd/system/autofs.service.
[root@server2 ~]#

下面练习把光盘自动挂载到/zz/dvd上,先把/zz创建出来,命令如下。

[root@server2 ~]# mkdir /zz
[root@server2 ~]#

记住这里不需要创建目录/zz/dvd,这个目录会自动创建。
在/etc/auto.master.d/目录中创建一个后缀为autofs的文件,后缀必须是autofs,这里创建的是aa.autofs,命令如下。

[root@server2 ~]# cat /etc/auto.master.d/aa.autofs
/zz	/etc/auto.aa
[root@server2 ~]# 

这里的意思是把哪个外部设备挂载到/zz的哪个子目录中由/etc/auto.aa决定,注意:内容使用tab进行分隔,一个或者多个tab键都可以,但不要使用空格。下面创建/etc/auto.aa,命令如下。

[root@server2 ~]# cat /etc/auto.aa 
dvd	-fstype=iso9660,ro	:/dev/cdrom
[root@server2 ~]#

这个文件的格式如下。
子目录 -fstype=文件系统,选项1,选项2 :外部设备
这里外部设备如果是本地磁盘或光盘,冒号前面保持为空,但是冒号不能省略。如果是其他机器上共享的目录,则写远端的IP。
结合/etc/auto.master.d/aa.autofs整体的意思是,当访问/zz/dvd时,系统会自动把/dev/cdrom挂载到/zz/dvd上。
重启autofs服务,让我们刚做的配置生效,命令如下。

[root@server2 ~]# systemctl restart autofs
[root@server2 ~]# 

确认现在光盘是没有挂载到/zz/dvd上的,而且/zz目录中也没有dvd目录,命令如下。

[root@server2 ~]# mount | grep -v auto | grep zz 
[root@server2 ~]# ls /zz
[root@server2 ~]#

下面我们访问/zz/dvd,命令如下。

[root@server2 ~]# ls /zz/dvd
AppStream  EFI  extra_files.json  images  media.repo  RPM-GPG-KEY-redhat-release           
BaseOS     EULA  GPL    isolinux  RPM-GPG-KEY-redhat-beta  TRANS.TBL
[root@server2 ~]#

因为访问这个目录时能触发自动挂载,系统自动创建/zz/dvd并把/dev/cdrom挂载到这个目录,再次验证挂载情况,命令如下。

[root@server2 ~]# mount | grep -v auto | grep zz 
/dev/sr0 on /zz/dvd type iso9660 (ro,relatime,nojoliet,check=s,map=n,blocksize=2048)
[root@server2 ~]#

可以看到,现在已经挂载上去了。
练习:
下面练习自动挂载NFS共享文件夹。整个实验思路如下。
在server上创建一个用户mary,家目录指定为/rhome/mary。在server2上也创建一个用户mary,家目录也指定为/rhome/mary,但是server2上mary并不把这个家目录创建出来,如图16-2所示。
RHCE9学习指南 第16章 访问NFS存储及自动挂载-LMLPHP
图16-2 自动挂载实验拓扑图
通过NFS把server上的/rhome共享出去,在server2上配置autofs,把192.168.26.101上的/rhome/mary关联到server2上的/rhome/mary中。
这样当server2上使用mary登录时会自动登录到/rhome/mary,这样就会触发autofs自动把192.168.26.101:/rhome/mary挂载到server2的/rhome/mary目录上,这样server2上的mary也就有了家目录。

在server上创建/rhome目录,然后创建用户mary,家目录设置为/rhome/mary,用户的uid设置为3001,命令如下。

[root@server ~]# mkdir /rhome
[root@server ~]# useradd -u 3001 -d /rhome/mary mary
[root@server ~]# echo haha001 | passwd --stdin mary
更改用户 mary 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server ~]# 
[root@server ~]# ls /rhome/
mary
[root@server ~]#

此时在server上mary用户就创建好了,且mary的家目录也是存在的。

在server2上创建/rhome目录,然后创建用户mary,家目录设置为/rhome/mary。因为指定了-M选项,这个目录并没有被创建,用户的uid设置为3001,记住必须要保持和server上的mary具有相同的uid,命令如下。

[root@server2 ~]# mkdir /rhome
[root@server2 ~]# useradd -u 3001 -d /rhome/mary -M  mary
[root@server2 ~]# echo haha001 | passwd --stdin mary
更改用户 mary 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@server2 ~]# ls /rhome/
[root@server2 ~]# 

这里可以看到,mary的家目录/rhome/mary并没有被创建出来。
在server2上切换到mary用户,命令如下。

[root@server2 ~]# su - mary
su: 警告:无法更改到 /rhome/mary 目录: 没有那个文件或目录
[mary@server2 root]$ exit
注销
[root@server2 ~]#

在server2上因为没有mary没有家目录,所以会出现上述警告信息,exit退回到root用户。
在server上通过NFS把/rhome共享出去,编辑/etc/exports内容如下。

[root@server ~]# cat /etc/exports
/share	*(rw,no_root_squash)
/rhome	*(rw,no_root_squash)
[root@server ~]#

这样就把/rhome共享出去了,然后让此共享生效。

[root@server ~]# exportfs -arv
exporting *:/rhome
exporting *:/share
[root@server ~]# 

切换到server2上开始配置autofs,创建/etc/auto.master.d/bb.autofs,内容如下。

[root@server2 ~]# cat /etc/auto.master.d/bb.autofs 
/rhome	/etc/auto.bb
[root@server2 ~]#

到底把哪个外部设备挂载到/rhome下的哪个子目录中由/etc/auto.bb决定。
下面创建/etc/auto.bb,内容如下。

[root@server2 ~]# cat /etc/auto.bb
mary	-fstype=nfs,rw	192.168.26.101:/rhome/mary
[root@server2 ~]#

结合/etc/auto.master.d/bb.autofs整体的意思是,当访问/rhome/mary时,会自动的把192.168.26.101:/rhome/mary挂载到server2上的/rhome/mary目录上。
重启autofs,命令如下。

[root@server2 ~]# systemctl restart autofs
[root@server2 ~]# 

确认现在/rhome/mary是没有挂载任何东西的,命令如下。

[root@server2 ~]# mount | grep -v auto | grep rhome
[root@server2 ~]# 

下面在server2上切换到mary上,记住通过su - mary不是通过su mary,命令如下。

[root@server2 ~]# su - mary
[mary@server2 ~]$ pwd
/rhome/mary
[mary@server2 ~]$ exit
注销
[root@server2 ~]# 

我们知道 su - mary,用户切换到mary的同时也会切换到mary的家目录,这样会触发autofs,再次查看挂载情况,命令如下。

[root@server2 ~]# mount | grep -v auto | grep rhome
192.168.26.101:/rhome/mary on /rhome/mary type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.26.102,local_lock=none,addr=192.168.26.101)
[root@server2 ~]#

这里可以看到,已经顺利挂载了。

作业:

作业1.在server上创建三个用户用户,满足如下要求:
1.user1,家目录为/rhome/user1,uid为4001。
2.user2,家目录为/rhome/user2,uid为4002。
3.user3,家目录为/rhome/user3,uid为4003。
密码分别设置为haha001。
答案:
先按题目要求把这三个用户创建出来,命令如下。

[root@server ~]# useradd -d /rhome/user1 -u 4001 user1
[root@server ~]# useradd -d /rhome/user2 -u 4002 user2
[root@server ~]# useradd -d /rhome/user3 -u 4003 user3
[root@server ~]# 

为这三个用户分别设置为密码为haha001。

[root@server ~]# echo "user1:haha001" | chpasswd
[root@server ~]# echo "user2:haha001" | chpasswd
[root@server ~]# echo "user3:haha001" | chpasswd
[root@server ~]#

检测这三个用户的家目录也是创建出来了的,命令如下。

[root@server ~]# ls /rhome/
mary  user1  user2  user3
[root@server ~]#

作业2.在server2上创建三个用户用户,满足如下要求:
1.user1,家目录为/rhome/user1,uid为4001。
2.user2,家目录为/rhome/user2,uid为4002。
3.user3,家目录为/rhome/user3,uid为4003。
密码分别设置为haha001,但是在server2上并不把这3个用户的家目录创建出来。

答案:
按题目要求把三个用户创建出来,命令如下。

[root@server2 ~]# useradd -d /rhome/user1 -u 4001 -M user1
[root@server2 ~]# useradd -d /rhome/user2 -u 4002 -M user2
[root@server2 ~]# useradd -d /rhome/user3 -u 4003 -M user3
[root@server2 ~]#

这里加上-M选项指的是不创建家目录。
为这3个用户设置密码为haha001。

[root@server2 ~]# echo "user1:haha001" | chpasswd
[root@server2 ~]# echo "user2:haha001" | chpasswd
[root@server2 ~]# echo "user3:haha001" | chpasswd
[root@server2 ~]#

测试这3个用户现在是没有家目录的,命令如下。

[root@server2 ~]# ls /rhome/
mary
[root@server2 ~]#

在/rhome下并没有user1、user2、user3这3个目录。

[root@server2 ~]# su - user1
su: 警告:无法更改到 /rhome/user1 目录: 没有那个文件或目录
[user1@server2 root]$ exit
注销
[root@server2 ~]#

因为user1并不存在家目录/rhome/user1所以通过su - user1切换到user1的时候会有警告信息。
作业3.在server2上配置自动挂载autofs,使得在server2上执行下面命令时:
执行su - user1时自动创建把server上的/rhome/user1挂载到/rhome/user1上
执行su - user2时自动创建把server上的/rhome/user2挂载到/rhome/user2上
执行su - user3时自动创建把server上的/rhome/user3挂载到/rhome/user3上

答案:
在章节16.2里server2已经安装过软件包autofs了,如果没有请自行安装。

创建/etc/auto.master.d/bb.autofs内容如下。
[root@server2 ~]# cat /etc/auto.master.d/bb.autofs
/rhome		/etc/auto.bb
[root@server2 ~]#

注意,此文件的后缀要为autofs,内容以隔开。
创建文件/etc/auto.bb内容如下。

[root@server2 ~]# cat /etc/auto.bb
user1              -fstype=nfs,rw	192.168.26.101:/rhome/user1
user2              -fstype=nfs,rw	192.168.26.101:/rhome/user2
user3              -fstype=nfs,rw	192.168.26.101:/rhome/user3
[root@server2 ~]#

注意此文件的内容不必以作为分隔符。看这个文件的结构,每行第一部分如果是user1,则最后也是user1,第一部分是user2则最后也是user2。可以看出每行的最后一部分是和第一部分是一样的,所以/etc/auto.bb的内容也可以写成如下内容。

cat /etc/auto.bb
*              -fstype=nfs,rw	192.168.26.101:/rhome/&

这里第一列的符号匹配任何字符,不管是user1、user2、user3都能匹配,最后的符号&表示和第一列的符号保持相同的内容,即*匹配了user1,则&就是user1的意思。
然后重启autofs,命令如下。

[root@server2 ~]# systemctl restart autofs
[root@server2 ~]#

再次执行命令su - user1,结果如下。

[root@server2 ~]# su - user1
[user1@server2 ~]$ pwd
/rhome/user1
[user1@server2 ~]$ exit
注销
[root@server2 ~]#

可以看到此时没有出现刚才的警告信息了,说明已经正确的挂载了,使用如下命令检查。

[root@server2 ~]# mount | grep -v auto | grep user1
192.168.26.101:/rhome/user1 on /rhome/user1 type nfs4 (rw,relatime,vers=4.2,...输出...)
[root@server2 ~]#

也可能看到此时已经正确的挂载了。

01-08 22:10