linux文件共享之nfs和smaba

                                        nfs和samba


1、NFS簡介

    NFS(Network File System)即網絡文件系統,是FreeBSD支持的文件系統中的一種,它允許網絡中的計算機之間通過TCP/IP網絡共享資源。在NFS的應用中,本地NFS的客戶端應用可以透明地讀寫位於遠端NFS服務器上的文件,就像訪問本地文件一樣。

    類unix系統之間實現文件共享功能,不能實現跟windows系統之間實現共享;


2、NFS工作過程:

    nfs依賴於rpc服務才能工作;

nfs工作過程:nfs客戶端/nfs服務端

1、nfs服務端,在本地分區上創建一個extX的文件系統,並將該分區掛載至一個空目錄上,注意,此時在服務端,文件系統是extX;

2、nfs服務端,上有個nfs協議,他的目的是,監聽服務端套接字,接入用戶關於nfs協議的請求,去幫忙訪問本地基於extX文件系統的目錄數據;

3、nfs客戶端也是利用nfs協議。當有用戶訪問關於遠程nfs服務端數據時,其實是啓用nfs協議利用rpc的遠程過程調用,去調用nfs服務端的extX文件系統的分區目錄數據;

注意:nfs客戶端能夠直接操作本地映射的關於nfs服務器上的資源,是通過客戶端利用vfs文件系統轉換成nfs結合rpc的遠程過程調用來完成的;

nfs服務端,監聽關於nfs協議的rpc套接字,將用戶請求的資源直接映射到本地的其他文件系統的資源目錄中;

nfs客戶端其實是通過nfs協議+rpc的遠程過程調用去訪問遠程nfs服務端資源的。資源並不是指nfs文件系統格式的資源。他只是一個協議;

先由rpc監聽111端口,再轉到nfs的2049端口;


3、NFS安裝:

    nfs程序包:nfs-utils

    [root@localhost ~]# yum -y install nfs-utils           :安裝nfs服務;

    [root@localhost ~]# yum -y install rpcbind             :安裝rpc服務;

    [root@localhost ~]# service nfs start
    啓動 NFS 服務:                                            [確定]
    關掉 NFS 配額:                                            [確定]
    啓動 NFS mountd:                                          [確定]
    啓動 NFS 守護進程:                                        [確定]
    正在啓動 RPC idmapd:                                      [確定]
    [root@localhost ~]# service nfs status
    rpc.svcgssd 已停
    rpc.mountd (pid 2200) 正在運行...
    nfsd (pid 2215 2214 2213 2212 2211 2210 2209 2208) 正在運行...
    rpc.rquotad (pid 2196) 正在運行...
    [root@localhost ~]#                                         :安裝和啓用nfs服務;


    [root@localhost ~]# rpcinfo -p localhost                    :查看nfs啓用了哪些進程,及進程端口號;


4、配置和使用nfs:

    nfs服務端配置:

    共享方式:

    在服務端上將共享目錄導出到nfs共享目錄,然後配置權限,客戶端就能訪問了;

    nfs共享目錄的配置格式:

        文件系統    客戶端1(文件系統屬性) 客戶端2(文件系統屬性)

    文件系統:要共享的目錄;

    客戶端:

        主機地址。1.1.1.1;

        網絡名,test.aaa.com;

        網段地址,1.1.1.0/24;

    文件系統屬性:也叫共享權限,多個屬性用逗號分開;

rw:讀寫;

asvnc:異步(默認);

sync:同步(性能差);

root_squash:壓縮root用戶(默認)。如果使用客戶端root去訪問服務端nfs共享時,則需要基於imapd,自動將root通過網絡訪問時轉換爲nfsnobody用戶(guest賬戶);

注意:guest用戶的權限是很小的,壓縮很安全;

no_root_squash:不壓縮root用戶(不安全);

注意:root可以直接使用自身去訪問nfs共享目錄了,權限無限制;

all_squash:壓縮所有用戶。客戶端所有用戶都不能使用自己的什麼去訪問服務端上的共享目錄(“不能拿自己家的鑰匙去開別人家的門”)。提高服務端安全;

anonuid或anongid:指定匿名用戶映射爲系統上的UID和GID。默認是映射到nfsnobody這個guest賬號上來。提高服務端安全;

id nfsnobody :查看guest賬號的uid和gid

nohide:隱藏交叉導出時的目錄文件,允許交叉掛載;

例如:/var/nfstest/ 導出來,被客戶端掛載了。/var/nfstest/a/導出來,也被客戶端掛在了。現在不想讓雙方客戶端看到對方的掛載目錄下的文件,怎麼辦?就是設置nohide屬性,掛載到/var/nfstest/下的客戶端無法看到/var/nfstest/a/下的所有文件了。安全;

crossmnt:允許交叉掛載。意義同上反過來;


    示例1:將NFS服務器上的目錄/var/nfstest共享出去;

    [root@localhost ~]# vim /etc/exports

        /var/nfstest    172.16.0.0/16(rw,no_root_squash)         :讀寫掛載,且不壓縮root賬戶

    [root@localhost ~]# mkdir /var/nfstest

    [root@localhost ~]# service nfs restart


    客戶端操作:

    [root@localhost ~]# mkdir /mnt/nfs

    [root@localhost ~]# mount -t nfs 172.16.1.107:/var/nfstest /mnt/nfs
    [root@localhost ~]# cd /mnt/nfs/

    [root@localhost nfs]# touch aa.txt
    [root@localhost nfs]# touch bb.txt
    [root@localhost nfs]# ll
    總用量 0
    -rw-r--r--. 1 root root 0 4月   4 21:19 aa.txt
    -rw-r--r--. 1 root root 0 4月   4 21:19 bb.txt
    [root@localhost nfs]#

                            :客戶端使用掛載的方式,來訪問nfs服務端上的文件內容,二者內容是同步的;


    示例2:文件共享權限:

    場景:在nfs服務端上各自創建一個賬號,且uid一樣。觀察相互在共享目錄下創建文件後,各自看到的文件屬主和屬組;

    nfs服務端:

    [root@localhost ~]# useradd -u 502 hadoop
    [root@localhost ~]# vim /etc/exports

            /var/nfstest    172.16.0.0/16(rw,no_root_squash)

    [root@localhost ~]# setfacl -m u:502:rwx /var/nfstest/       :爲hadoop賬號設置訪問共享目錄的權限;

    [root@localhost ~]# service nfs restart


    nfs客戶端:

    [root@localhost /]# useradd -u 502 nfsuser
    [root@localhost /]# mount -t nfs 172.16.1.107:/var/nfstest /mnt/nfs/
    [root@localhost /]#                                          :客戶端上創建同uid的賬號:

    

    [root@localhost /]# su - nfsuser
    [nfsuser@localhost ~]$
    [nfsuser@localhost ~]$
    [nfsuser@localhost ~]$ cd /mnt/nfs/
    [nfsuser@localhost nfs]$ touch test1.txt
    [nfsuser@localhost nfs]$ touch test2.txt
    [nfsuser@localhost nfs]$ ll
    總用量 0
    -rw-r--r--. 1 root   root   0 4月   4 21:19 aa.txt
    -rw-r--r--. 1 root   root   0 4月   4 21:19 bb.txt
    -rw-rw-r--. 1 nobody nobody 0 4月   4 21:28 test1.txt
    -rw-rw-r--. 1 nobody nobody 0 4月   4 21:28 test2.txt
    [nfsuser@localhost nfs]$         :使用新建的賬號去共享目錄中創建兩個文件;

    發現:使用這個uid編號跟服務端uid編號一樣的用戶去創建文件是的屬主和屬組都是nobody,並不是自己;


    [root@localhost ~]# useradd -u 509 aaa
    [root@localhost ~]# su - aaa
    [aaa@localhost ~]$ cd /mnt/nfs/
    [aaa@localhost nfs]$ touch ttt.txt
    touch: 無法創建"ttt.txt": 權限不夠
    [aaa@localhost nfs]$      

    發現:當我在客戶端上重新再創建一個用戶時,切換到該用戶,去共享目錄下新建文件,提示權限不夠;


    來到nfs服務端:

    [root@localhost ~]# cd /var/nfstest/
    [root@localhost nfstest]# ll
    總用量 0
    -rw-r--r--. 1 root   root   0 4月   4 21:19 aa.txt
    -rw-r--r--. 1 root   root   0 4月   4 21:19 bb.txt
    -rw-rw-r--. 1 hadoop hadoop 0 4月   4 21:28 test1.txt
    -rw-rw-r--. 1 hadoop hadoop 0 4月   4 21:28 test2.txt
    [root@localhost nfstest]# 

    發現:原本在客戶端上創建的文件的屬主和屬組變成了hadoop了;


    權限總結:

    1、nfs客戶端用戶在訪問時,其實是映射到服務端上同uid的用戶權限上了;

    2、服務端同uid用戶的權限就是客戶端用戶的權限;

    3、共享目錄的權限是文件系統跟nfs配置權限的交集;

    4、客戶端用戶在共享目錄下創建的文件統統都會顯示成nobody用戶;


    因此,客戶端用戶要想在共享目錄中有權限,需要兩點兒:

    1、客戶端上用戶的uid編號在服務端上必須也有;

    2、服務端同uid賬號的對共享目錄擁有權限;

    

5、nfs服務端端口優化:

    問題:nfs服務端啓動後,基於rpc的進程會從rpc中隨機得到一個端口號,次端口號有可能會被其他已知服務佔用。因此要固定下來;

    

    [root@localhost nfstest]# vim /etc/sysconfig/nfs

        MOUNTD_PORT=892

        STATD_PORT=662

        STATD_OUTGOING_PORT=2020         :去掉這些原有的註釋,啓用固定端口;

    [root@localhost nfstest]# service nfs restart

    [root@localhost nfstest]# rpcinfo -p localhost      :查看被gudingde端口號;

    

    結束!


2、Samba簡介:

    Samba是在Linux和UNIX系統上實現SMB協議的一個免費軟件,由服務器及客戶端程序構成。SMB(Server Messages Block,信息服務塊)是一種在局域網上共享文件和打印機的一種通信協議,它爲局域網內的不同計算機之間提供文件及打印機等資源的共享服務。SMB協議是客戶機/服務器型協議,客戶機通過該協議可以訪問服務器上的共享文件系統、打印機及其他資源。通過設置“NetBIOS over TCP/IP”使得Samba不但能與局域網絡主機分享資源,還能與全世界的電腦分享資源。

    可以實現linux與windows,linux與linux系統之間的文件共享。不基於nfs;


    1、samba安裝:

    客戶端程序:samba-client;

    服務器端程序:samba;

    

    [root@localhost ~]# yum -y install samba

    [root@localhost samba]# service smb start
    啓動 SMB 服務:                                            [確定]
    [root@localhost samba]# service nmb start
    啓動 NMB 服務:                                            [確定]
    [root@localhost samba]#                                    :啓動samba服務;


    2、samba用戶:

    在系統用戶的基礎之上,爲該用戶創建訪問samba服務de密碼即可;

    

    3、samba服務的配置文件:

vim /etc/samba/smb.conf

#開頭的都是純文字註釋信息;

;開頭的都是可啓用的註釋選項;

workgroup = :工作組名稱;

server string = :顯示的samba服務器版本;

 

netbios name = :netbios的名稱;

interfaces = :表示samba啓用的監聽接口;

hosts allow = :表示訪問控制白名單。允許哪些段的主機訪問;

注意:如果啓用了,沒寫到這裏的都會拒絕掉。因爲它是白名單。沒寫入白名單的都拒絕;

log file = :日誌文件位置。%m:宏,表示客戶端名稱。所以,每個客戶端都會生成一個日誌文件;

max log size = :日誌文件最大大小;

security = :安全級別(默認);

user:根據賬號密碼認證;

share:無需賬號密碼,直接訪問;

server:集中式賬號密碼;

passdb backend = :賬號密碼的存放格式。默認是tdbsam;

 

域:

sercurity = domain :這是域下的安全級別,domain;

passdb backend = :賬號密碼存放格式;

password server = :域認證服務器名;

 

名稱解析選項:wins是windows的本地名稱解析服務;

wins support =  :是否啓用wins;

wins server =   :wins服務器;

wins proxy =   :wins的代理;

dns proxy =

 

打印機選項:共享打印機

load printers = :加載打印服務;

 

文件系統選項;

            ........
        

[共享名]                               :共享名;

comment =       :共享備註信息;

path =          :實際共享目錄路徑;

guest ok =      :是否允許來賓賬號查看某些目錄;

public =        :登錄samba的用戶不是某些共享目錄的屬主和屬組時,是否允許瀏覽和顯示;

browseable =    :登錄samba的用戶不是當前共享目錄的屬主和屬組時,是否允許瀏覽和顯示

也就是說,一個目錄在共享目錄下,當用戶不屬於我的屬主和屬組時,當該用戶訪問時,我是否顯示出來。最好別顯示,爲了安全;

writable =      :是否啓用共享可寫權限。針對全部訪問者;

write list =    :共享可寫用戶列表。只針對該列表中的用戶;

read only =     :是否允許只讀。定義了只讀,則write list和writable=yes就沒有意義了;

    

    示例1:我爲samba服務器端創建用戶,提供文件共享:
    [root@localhost ~]# smbpasswd -a centos
    New SMB password:
    Retype new SMB password:
    Added user centos.
    [root@localhost ~]# 

    [root@localhost ~]# smbpasswd -a hadoop
    New SMB password:
    Retype new SMB password:
    Added user hadoop.


    [root@localhost ~]# service smb restart
    關閉 SMB 服務:                                            [確定]
    啓動 SMB 服務:                                            [確定]
    [root@localhost ~]# service nmb restart
    關閉 NMB 服務:                                            [確定]
    啓動 NMB 服務:                                            [確定]
    [root@localhost ~]#
                                        :重啓samba服務;


    驗證上面創建的用戶是否能夠登錄samba服務端:

    在windows是上使用unc的方式訪問:

wKioL1Uf1_2ibkokAADDjxfgCXg785.jpg


    輸入hadoop的用戶名和密碼,成功訪問到samba中的共享目錄:其實訪問的是用戶自己的家目錄;

wKiom1Uf102BPxYcAAEcVH54JrI618.jpg

wKioL1Uf2MLBLVAQAABNnbWtSC0832.jpg


    示例2:基於用戶控制,訪問公共共享目錄;

    [root@localhost ~]# mkdir /share/test -pv
    mkdir: 已創建目錄 "/share"
    mkdir: 已創建目錄 "/share/test"
    [root@localhost ~]# setfacl -m u:centos:rwx /share/test/
    [root@localhost ~]# vim /etc/samba/smb.conf 

                   [myshared]
                    comment = my share test
                    path = /share/test
                    writable = yes                             :添加共享記錄,將目錄共享出去;

    [root@localhost ~]# testparm                                :檢測一下配置文件中的內容;


    [root@localhost ~]# service smb restart
    關閉 SMB 服務:                                            [確定]
    啓動 SMB 服務:                                            [確定]
    [root@localhost ~]# service nmb restart
    關閉 NMB 服務:                                            [確定]
    啓動 NMB 服務:                                            [確定]
    [root@localhost ~]#                                         :重啓一下samba服務;


    使用客戶端去測試:

        使用centos帳號去測試:

wKioL1Uf2yLA4-1FAAEmi-ZXy8s213.jpg


        可以看到,能夠顯示新建的共享目錄了。因爲設置了文件acl,使得centos賬戶可以訪問這個目錄:

wKiom1Uf2jvgprcFAABjTzURfwc095.jpg

        可以新建文件:

wKioL1Uf3PTQOiKaAACGIGDIzdA403.jpg

        

            再次使用hadoop登錄查看:

wKioL1Uf3AGhKqgIAAEwut8IChs180.jpg

            

        ok,都能看到新建的共享目錄了:

wKioL1Uf3A-j-OEUAAB4OSMZiS8949.jpg

    但是hadoop卻沒權限使用該共享目錄;

        wKioL1Uf3J3wb4_FAAD5RYqE8rk162.jpg

        注意:共享文件的最終權限取決於文件系統和共享權限二者的交集;

        提醒:

        基於windows客戶端去訪問共享時,由於緩存的原因,可能導致有時不能更換賬號,可以如下解決:

        cmd

        net use

        net use \\共享服務器ip /del                                    :清楚共享賬號緩存;

    4、smbclient命令:一種使用在samba客戶端上的命令:

        1、查看samba服務器上的所有共享目錄:

           格式:smbclient -L SERVER -U USERNAME

            例如:

            [root@localhost ~]# smbclient -L 172.16.1.105 -U hadoop
            Enter hadoop's password:
            Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]

            Sharename       Type      Comment
            ---------       ----      -------
            myshared        Disk      my share test
            IPC$            IPC       IPC Service (Samba Server Version 3.6.23-14.el6_6)
            hadoop          Disk      Home Directories
            Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]

            Server               Comment
            ---------            -------
            LOCALHOST            Samba Server Version 3.6.23-14.el6_6

            Workgroup            Master
            ---------            -------
            MYGROUP              LOCALHOST
            WORKGROUP            CHEN
            [root@localhost ~]#                   :可以看到剛剛新建的共享目錄了;


        2、以交互式的方式連入samba服務器共享目錄:

        格式:smbclient //SERVER/SHARED -U USERNAME

        如:

        [root@localhost ~]# smbclient //172.16.1.105/myshared -U centos
        Enter centos's password:
        Domain=[MYGROUP] OS=[Unix] Server=[Samba 3.6.23-14.el6_6]
        smb: \> ls                                    :輸入命令,去操作共享目錄中的內容;


    5、掛載共享目錄至客戶端本地:

    1、臨時掛載:

    格式:mount -t cifs //server/shared /path/to/mount_point -o username=smbuser

    

    [root@localhost ~]# mkdir /mnt/samba
    [root@localhost ~]# mount -t cifs //172.16.1.105/myshared /mnt/samba -o username=centos
    Password:

    [root@localhost samba]# ll
    總用量 0
    -rwxr--r--. 1 centos centos 0 4月   5 04:39 新建文本文檔.txt
    [root@localhost samba]#                                        :臨時執行一次手動掛載;


    2、開機自動掛載:

    vim /etc/fstab

     //172.16.1.105/myshared /mnt/samba cifs    defaults,_netdev,username=centos,password=password2020      [root@localhost /]# mount -a                    :重載/etc/fstab文件;
    [root@localhost /]# 

    [root@localhost /]# mount
        /dev/mapper/VolGroup-lv_root on / type ext4 (rw)
        proc on /proc type proc (rw)
        sysfs on /sys type sysfs (rw)
        devpts on /dev/pts type devpts (rw,gid=5,mode=620)
        tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
        /dev/sda1 on /boot type ext4 (rw)
        none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
        //172.16.1.105/myshared on /mnt/samba type cifs (rw)   :可以看到,成功被掛載了;

        注意:/etc/fstab中有個參數:“_netdev”:表示當無法掛載時放棄掛載。因爲共享是基於網絡的,當無法掛載時,服務器是無法開機的。所以,要主動放棄;


    [root@localhost /]# cd /mnt/sa——mba/
    [root@localhost samba]#
    [root@localhost samba]# ll
    總用量 0
    -rwxr--r--. 1 centos centos 0 4月   5 04:39 新建文本文檔.txt
    [root@localhost samba]#                                     :掛載成功;


    6、web方式管理配置samba:

    [root@localhost /]# yum -y install samba-swat xinetd        :安裝samba-swat和xinetd服務;

    [root@localhost /]# vim /etc/xinetd.d/swat

                  port            = 901                               :端口號默認901;

                  only_from       = 172.16.0.0/16                     :修改客戶端限制;

                  disable         = no                                :修改此處爲“no”;

    [root@localhost /]# service xinetd start
    正在啓動 xinetd:

    [root@localhost /]# chkconfig | grep swat
    swat:              啓用                                        :啓用samba-swat;


    web訪問配置:成功訪問,可以執行配置了;

wKioL1Uf5q7jyAHAAAGL28uh2QI264.jpg


結束!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章