Chinaunix首页 | 论坛 | 博客
  • 博客访问: 106229
  • 博文数量: 28
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 300
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-10 09:48
文章分类

全部博文(28)

文章存档

2010年(1)

2009年(27)

我的朋友

分类: LINUX

2009-08-08 17:07:55

一、NFS服务和RPC
1、NFS启动的时候会启用未被使用的小于 1024 的端口作为监听传输使用,,并主动的向 RPC 注册,因此RPC知道NFS对应使用的端口。
2、RPC使用固定的port 111端口来监听用户端的需求并且回报给用户端正确的NFS端口。让用户端可以连结到正确的NFS端口上。
所以:NFS服务必须启动RPC服务
 
二、NFS的安装
 
[root@linux ~]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1
[root@linux ~]# rpm -qa | grep nfs
system-config-nfs-1.3.23-1.el5
nfs-utils-lib-1.0.8-7.2.z2
nfs-utils-1.0.9-33.el5

如果没有以上的文件。则通过 install nfs-utils 安装
 
三、NFS的档案存取权限
 
 当 用户dmtsai 进入去访问到NFS共享目录后,所以可能就会发现几个情况∶
 
  • NFS server/NFS client 刚好有相同的帐号与群组
    则此时使用者可以直接以 dmtsai 的身份进行伺服器所提供的档案系统之存取。

  • NFS server 的 501 这个 UID 帐号对应为 vbird
    若 NFS 伺服器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时, 则用户端的 dmtsai 可以存取伺服器端的 vbird 这个使用者的档案喔!只因为两者具有相同的 UID 而已。这就造成很大的问题了!因为没有人可以保证用户端的 UID 所对应的帐号会与伺服器端相同, 那伺服器所提供的资料不就可能会被错误的使用者乱改?

  • NFS server 并没有 501 这个 UID
    另一个极端的情况是,在伺服器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者, 一般 NFS 的匿名者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的帐号名称通常是 nobody ,我们的 CentOS 则取名为 nfsnobody 。

  • 如果使用者身份是 root 时
    有个比较特殊的使用者,那就是每个 Linux 主机都有的 UID 为 0 的 root 。 想一想,如果用户端可以用 root 的身份去存取伺服器端的档案系统时,那伺服器端的资料哪有什么保护性? 所以在预设的情况下, root 的身份会被主动的压缩成为匿名者
  •  
    四、NFS服务的配置文档
    [root@linux ~]# vi /etc/exports
     
    /tmp          *(rw,no_root_squash,sync)
    /home/public  192.168.1.0/24(rw,sync)    *(ro,sync)
    /home/test    192.168.1.100(rw,sync)
    /home/linux   *.zwt.com(rw,all_squash,anonuid=502,anongid=502,sync)
     
     
    权限参数说明∶
    rw∶read-write,可读写的权限;
    ro∶read-only,只读的权限;
    sync∶资料同步写入到记忆体与硬盘当中;
    async∶资料会先暂存于记忆体当中,而非直接写入硬盘!
    no_root_squash∶
    如果登录NFS 主机使用分享目录的用户是 root 的话,那么对于这个分享的目录来说,他就具有 root 的权限! 这个项目不安全,不建议使用!

    root_squash∶
    在如果登录NFS 主机使用分享目录的用户是 root 的,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody(nfsnobody) 那个系统帐号的身份;

    all_squash∶
    不论登录 NFS 的用户身份为何, 他的身份都会被压缩成为匿名使用者,通常也就是 nobody(nfsnobody)

    anonuid∶
    anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名使用者的 UID 设定值,通常为 nobody(nfsnobody),但是您可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于您的 /etc/passwd 当中!

    anongid∶同 anonuid ,但是变成 group ID 就是了!
     
     
    依照上文编辑的exports后,权限会是什么情况呢?让我们来检查一下∶

  • 用户端与主机端具有相同的 UID 与帐号∶
    假设我在 192.168.1.100 登入这部 NFS (IP 假设为 192.168.1.2) 主机,并且我在 192.168.1.100 的帐号为 dmtsai 这个身份,同时,在这部 NFS 上面也有 dmtsai 这个帐号, 并具有相同的 UID ,果真如此的话,那么∶
    1. 由于 192.168.1.2 这部 NFS 主机的 /tmp 权限为 -rwxrwxrwt ,所以我 (dmtsai 在 192.168.1.100 上面) 在 /tmp 底下具有存取的权限,并且写入的档案所有人为 dmtsai ;
    2. 在 /home/public 当中,由于我有读写的权限,所以如果在 /home/public 这个目录的权限对于 dmtsai 有开放写入的话,那么我就可以读写,并且我写入的档案所有人是 dmtsai 。但是万一 /home/public 对于 dmtsai 这个使用者并没有开放可以写入的权限时, 那么我还是没有办法写入档案喔!这点请特别留意!
    3. 在 /home/test 当中,我的权限与 /home/public 相同的状态!还需要 NFS 主机的 /home/test 对于 dmtsai 有开放权限;
    4. 在 /home/linux 当中就比较麻烦!因为不论您是何种 user ,您的身份一定会被变成 UID=40 这个帐号!所以,这个目录就必需要针对 UID = 40 的那个帐号名称,修改他的权限才行!
  • 用户端与主机端的帐号并未相同时∶
    假如我在 192.168.1.100 的身份为 vbird ,但是 192.168.1.2 这部 NFS 主机却没有 vbird 这个帐号时,情况会变成怎样呢?
    1. 我在 /tmp 底下还是可以写入,但是写入的档案所有人变成 nobody 了;
    2. 我在 /home/public 里面是否可以写入,还需要视 /home/public 的权限而定,不过,反正我的身份就被变成 nobody 了就是;
    3. /home/test 的观点与 /home/public 相同!
    4. /home/linux 底下,我的身份就被变成 UID = 40 那个使用者就是了!
  • 当用户端的身份为 root 时∶
    假如我在 192.168.1.100 的身份为 root 呢? root 这个帐号每个系统都会有呀!权限变成怎样呢?
    1. 我在 /tmp 里面可以写入,并且由于 no_root_squash 的参数,改变了预设的 root_squash 设定值,所以在 /tmp 写入的档案所有人为 root 喔!
    2. 我在 /home/public 底下的身份还是被压缩成为 nobody 了!因为预设属性里面都具有 root_squash 呢!所以,如果 /home/public 有针对 nobody 开放写入权限时,那么我就可以写入,但是档案所有人变成 nobody 就是了!
    3. /home/test 与 /home/public 相同;
    4. /home/linux 的情况中,我 root 的身份也被压缩成为 UID = 40 的那个使用者了!
  • [root@linux ~]# /etc/init.d/portmap start
    # portmap 根本就不需要设定!只要直接启动他就可以啦!启动之后,会出现一个 port 111 的 sunrpc 的服务,那就是 portmap 啦!也就是RPC服务。
    [root@linux ~]# /etc/init.d/nfs start
    [root@linux ~]# /etc/init.d/nfslock start(增加一些 NFS 伺服器的资料一致性功能)
    [root@linux nfs]# /etc/init.d/nfslock restart
    Stopping NFS locking:                                      [  OK  ]
    Stopping NFS statd:                                        [  OK  ]
    Starting NFS statd:                                        [  OK  ]

     
    五、NFS应用的相关命令
     
    1、查看下RPC服务的注册状态
    [root@linux nfs]# rpcinfo -p localhost(查看下RPC服务的注册状态)
       program vers proto   port
        100000    2   tcp    111  portmapper
        100000    2   udp    111  portmapper
        100024    1   udp    868  status
        100024    1   tcp    871  status
        100011    1   udp    796  rquotad
        100011    2   udp    796  rquotad
        100011    1   tcp    799  rquotad
        100011    2   tcp    799  rquotad
        100003    2   udp   2049  nfs
        100003    3   udp   2049  nfs
        100003    4   udp   2049  nfs
        100021    1   udp  32771  nlockmgr
        100021    3   udp  32771  nlockmgr
        100021    4   udp  32771  nlockmgr
        100003    2   tcp   2049  nfs
        100003    3   tcp   2049  nfs
        100003    4   tcp   2049  nfs
        100021    1   tcp  33250  nlockmgr
        100021    3   tcp  33250  nlockmgr
        100021    4   tcp  33250  nlockmgr
        100005    1   udp    823  mountd
        100005    1   tcp    826  mountd
        100005    2   udp    823  mountd
        100005    2   tcp    826  mountd
        100005    3   udp    823  mountd
        100005    3   tcp    826  mountd

    可以发现

    • portmap 启动的 port 在 111;
    • NFS 启动的 port 在 2049;
    • 其他 rpc.daemons 启动的 port 则是随机产生的,因此需向 port 111 注册。
    2、查看NFS服务关于目录权限设定的资料(可以看到一些默认的权限参数。比如root_squash,no_all_squash,anonuid=65534等。)
     
    [root@linux nfs]# tail /var/lib/nfs/etab
    /home/public    192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /home/test      192.168.1.100(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /home/linux     *.zwt.com(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=502,anongid=502)
    /home/public    *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /tmp    *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)

    3、显示设定的NFS共享(exports资料内容)

    [root@linux nfs]# showmount -e localhost
    Export list for localhost:
    /tmp         *
    /home/linux  *.zwt.com
    /home/test   192.168.1.100
    /home/public (everyone)

    4、重新挂载一次 /etc/exports 的设定
    [root@linux ~]# exportfs -arv
    exporting 192.168.0.100:/home/test
    exporting 192.168.0.0/24:/home/public
    exporting *.linux.org:/home/linux
    exporting *:/home/public
    exporting *:/tmp

    六、NFS用户端使用。

    你要如何挂载 NFS 伺服器所提供的档案系统呢?基本上,可以这样做∶

    1. 确认本地端已经启动了 portmap 服务!
    2. 扫瞄 NFS 伺服器分享的目录有哪些,并了解我们是否可以使用 ();
    3. 在本地端建立预计要挂载的挂载点目录 (mkdir);
    4. 利用 mount 将远端主机直接挂载到相关目录。
    [root@linux ~]# /etc/init.d/portmap start
    [root@linux ~]# /etc/init.d/nfslock start
    # 一般来说,系统预设会启动 portmap ,不过鸟哥之前关闭过,所以要启动。
    # 另外,如果伺服器端有启动 nfslock 的话,用户端也要启动才能生效!
     
    [root@linux ~]# showmount -e  NFSserver的IP
     
    [root@linux ~]# mkdir -p /home/nfs/public
     
    [root@linux ~]# mount -t nfs 192.168.1.2:/home/public /home/nfs/public
    # 注意一下挂载的语法!『 -t nfs 』指定档案系统类型,
    # IP:/dir 则是指定某一部主机的某个提供的目录!
     
    [root@linux ~]# df
    Filesystem    1K-blocks      Used Available Use% Mounted on
    ....中间省略....
    192.168.1.2:/home/public
                           1984032     36800   1844800   2% /home/nfs/public

    [root@linux ~]# umount /home/nfs/public
     
     
    此外。除了 NFS 服务器需要保护之外,我们取用人家的 NFS 档案系统也需要自我保护才行啊! 那要如何自我保护啊?可以透过 mount 的指令参数来做。
     
    [root@linux nfs]# umount /home/nfs/public
    [root@linux nfs]# df
    Filesystem           1K-blocks      Used Available Use% Mounted on
    /dev/sda7             10371664   3385124   6451176  35% /
    /dev/sda5              1984016     36812   1844792   2% /home
    /dev/sda3              4956316    204208   4496276   5% /var
    /dev/sda2              4956316    141220   4559264   4% /opt
    /dev/sda1               101086     12512     83355  14% /boot
    tmpfs                   237656         0    237656   0% /dev/shm
    [root@linux nfs]# mount -t nfs -o nosuid,noexec,nodev,rw \
    > 192.168.1.2:/home/public /home/nfs/public
    # 通常这样你所挂载的这个档案系统就只能作为资料存取之用了

    [root@linux nfs]# mount
    省略...
    192.168.1.2:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,addr=192.168.1.2)

    更多的参数可以参考 man nfs 。

    * 将 NFS设置 开机即挂载
    [root@linux ~]# vi /etc/fstab
    192.168.0.2:/home/public   /home/nfs/public   nfs   nosuid,noexec,nodev,rw,
    bg,soft,rsize=32768,wsize=32768   0   0
     
     
    七、使用将NFS自动挂载卸载功能。
     
    当有客户端数据包需求的时候,则自动挂载NFS服务端得共享目录,超过一定时间后,客户端则主动卸载。
    可以使用autonfs功能。
     
    1、首先在用户端编辑/etc/auto.master
    [root@linux ~]# vi /etc/auto.master
    /home/nfs  /etc/auto.nfs
     
    # 内容很简单,只要有用户端的用来提供挂载的主目录和 一个挂载内容的文件即可。 这个文件名可以自行设定的,通常可使用 /etc/auto.nfs 来命名
     
    2、建立并编辑这个 提供挂载内容信息的文件。
     
    [root@linux ~]# vi /etc/auto.nfs
    public  -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/home/public
    test -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/home/test
    temp    -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.2:/tmp
     
     /home/nfs/public
     /home/nfs/test
     /home/nfs/temp
    可以不需要提前建立的
    3、启动服务并使用
     
    [root@linux ~]# /etc/init.d/autofs start
     
    [root@linux ~]# cd /home/nfs/public
    [root@linux ~]# mount; df
    不会有跟192.168.1.2有关的NFS挂载信息
    [root@linux public]# pwd
    /home/nfs/public

    #这个目录产生了,如果mount;df一下的话,
    也能看到跟192.168.1.2有关挂载信息了。
     


     
    阅读(1437) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~