跳到主要內容

Linux操作不求人- 肆章之伍 - 伺服器架設(V) - 網路檔案伺服器 - NFS 與 SAMBA

     在 Linux 下,有許多透過網際網路或區域網路,來跨平台分享可讀寫磁碟空間的方法,其中最常用的就是 Network File System (NFS,https://en.wikipedia.org/wiki/Network_File_System ) 與為了與 MS Windows 平台分享的 Samba軟體(https://www.samba.org/samba/what_is_samba.html),而這些方法搭配硬體端的儲存陣列系統(如 RAID-6,https://en.wikipedia.org/wiki/RAID),便可成為一個現今相當夯的 Network Attached Storage( NAS ) 主機。

# NFS
     與其它安裝伺服器軟體相同的方法,我們僅需要使用 yum  install nfs-utils 來下載,下載後先利用 rpm -qa | grep rpcbind 確認是否有此檔,因為這在後面的 NIS 章節亦會用到,若無需再執行 yum install rpcbind 來下載,如圖4-41。







































(圖4-41)

接著,假設我們想要分享 /myshare 資料夾的內容,先利用使用指令 mkdir  /myshare 產生此資料夾,並利用 vim  /etc/exports 進入 nfs 的設定檔,來設定網路分享的磁碟空間,如下

/myshare  192.168.100.0/255.255.255.0(rw, sync, no_subtree_check, no_root_squash)
/*  分享 /myshare 資料夾預設能存取的 IP 範圍為 192.168.100.0 - 192.168.100.255(或使用 192.168.100.24 來表示。若要表示幾個IP主機,亦可用空格符號來分隔,如
/myshare   192.168.100.20(rw)   192.168.100.30(ro) 

請注意個主機IP間的符號 ( )空白字元,若為叢集式(Cluster)運算主機群,則通常設定會有一個母主機,分 /home 讓子機掛載  ),存取的權限為可讀寫(rw,故若需唯讀請設定 ro ),並同步寫入記憶體與硬碟中(sync),除此之外,亦開放遠端連入使用者,可使用root權限來讀取與寫入檔案(no_root_squash),故請注意使用時權限過大可能造成檔案的安全性問題,若擔心,請換成 root_squash 或是 all_squash 來降低權限。no_subtree_check 為無須確認其上層資料夾的權限,以加快速度。設定完儲存後離開,接著利用下面指令來啟動,並加入開機執行:
$  service nfs start
$  chkconfig --level 35 nfs on

/*  在 CentOS6_x64 下,筆者安裝好後,開機後已經有在背景執行 rcpbind 與 nfslock,故便無需再重啟此兩個被 nfs service 所依附的服務 */
接著我們利用 Nmap 軟體(https://nmap.org/),來掃瞄一下我們的分享 port,看是否有無 nfs 的服務 ,若無安裝 nmap ,可以利用指令 yum -y install nmap,來安裝。接著輸入
$  nmap -sT  127.0.0.1
/*  可以看到 127.0.0.1 (localhost) 開啟的對內 TCP 連線服務埠,如圖4-42-1  */

$  nmap  -sT  10.0.2.15
/*  筆者的虛擬機器下給的 IP 為 10.0.2.15 ,開啟對外TCP 連線服務的埠為圖4-42-2 黃框處 */
















(圖4-42-1)




(圖4-42-2)

由圖4-42-1 與圖4-42-2 可得知,僅有 ssh(22/tcp)、rpcbind(111/tcp)、nfs(2049/tcp)、mysql(3306/tcp),其中 rpcbind 與 nfs 便是我們要使用 nfs service 會用到的連線埠,請開啟iptables 防火牆設定允許,如下:
$  iptables  -A INPUT  -p  tcp  --dport 111,2049  -j  ACCEPT
$  iptables  -A INPUT  -p  udp  --dport 111,2049  -j  ACCEPT   # nfs 亦可以用udp連線
$  service  iptables  save

若想利用 tcp wrapper 在 /etc/hosts.allow 與 /etc/hosts.deny 做過濾條件,可用服務名稱 rpcbind 來指令,如在 /etc/hosts.deny 內加入如下:
rpcbind: ALL EXCEPT 10.0.2.0/24 192.168.100.0/24

並請記得設定 SELinux 的允許 /myshare 可讓 nfs 操作的權限,如下:
$  semanage fcontext  -a  -t  nfs_t  "/myshare(/.*)?"   
/* 原本預設 /var/ilb/nfs 為 nfs 分享資料夾,並使用 nfs_t 的 policy,可用 semanage fcontext -l | grep nfs 查詢,故將 policy 也設定到 /myshare 與其下層的子資料夾  */

$  restorecon  -Rv   /myshare

/*  其他權限,可參考 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-SELinux_Contexts_Labeling_Files-Persistent_Changes_semanage_fcontext.html。 */

接著輸入以下指令可以看到主機分享那些資料夾:
$  showmount  -e 
/* 參數 -e ,為列出 export 那些資料夾與那些主機可使用的清單  */

若要調整分享的資料夾,可以再利用 vim /etc/exports 編輯檔案並儲存後,直接使用以下(如圖4-43):
$  exportfs  -arv
/* 參數 -a ( all directories),為重新整理是否分享的全部資料夾,參數 -r  (re-export)為重新分享 ,真正的 export 參數,可用 cat /var/lib/nfs/etab 得知。 */











(圖4-43)

以上為 nfs 伺服器軟體端的設定,至於使用者連入端,可直接使用 mount 指令來掛載,假設要掛載有nfs 分享的資料夾如下(圖4-44):
$  mkdir /nfshome
$  mount -t  nfs  10.0.2.15:/home  /nfshome   # 參數 -t 指定檔案格式為 nfs
$  df  -h   # 看已掛上的磁碟狀態

這樣掛載成功後,使用者便可以藉由網路來連線到遠端的主機磁碟,並利用指令如
$ cp  -rudp  ~/*   /nfshome
來備分到遠端的含有磁碟陣列系統的主機,資料就可以有備無患,並實現異地備分的效果。














(圖4-44)

若要使用者連入端要設定開機掛載,如將遠端的 /home 掛載成為本機的 /home,則只要編輯 /etc/fstab 檔案,加入如圖 4-45黃框處內容,或可改為加入參數方式(如 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Storage_Administration_Guide/s1-nfs-client-config-options.html 與 http://nfs.sourceforge.net/nfs-howto/ar01s05.html )
10.0.2.15:/home   /home   nfs    bg,rw,hard,intr,rsize=8192,wsize=8192    0    0
/*  rsize 與 wsize 為讀寫的 buffer 容量,增加容量原則上可以加快存取的效率 */



(圖4-45)

若不想永久掛載在主機上,想需要時候再掛載,此時可利用 autofs 的功能(若無此軟體,請用yum -y install autofs 安裝,一般都已有預設安裝並開機執行,如應用於光碟機的掛載 ),確認您的主機 autofs 有開機啟動並背景執行後(若無,請使用 chkconfig --level 35 autofs on ),接著假設我們要讓掛載 nfs 磁碟的指令自動執行,一樣要掛載遠端 nfs server 的/home 成為連入端主機的 /mnt/nfshome 。首先創造一個 /etc/auto.mynfs  ,讓 autofs 執行的設定檔(map file),其內容如下 :
nfshome   -fstype=nfs,rw   10.0.2.15:/home   # 主機IP 10.0.2.15 利用 nfs 方法分享 /home

再將此設定檔加入 autofs 的執行內容檔 /etc/auto.master,用指令 vim /etc/auto.master,加入如圖4-46黃框處後儲存離開。





























(圖4-46)

圖4-46設定完後,再重新啟動 autofs 如下:
$ service  autofs  restart

此時可以直接使用 ls -al /mnt/nfshome,就可以看到掛載的內容,但卻不會在 df -h 看到,但可以查詢 df -h /mnt/nfshome,如圖4-47。若要調整掛載等待時間5分鐘無動作就卸載 ,可進入 /etc/autofs.conf,修改 timeout 參數。



















(圖4-47)

利用 nfs 掛載網路磁碟機後,若要備份或鏡像備份,可以利用 rsync 的支援 ssh 協定備份來增加安全性,指令如下:
$  rsync   -e  ssh   -av   --delete   10.0.2.15:/home/*    /home/remotehome
/* 如以上方式傳輸備份資料,才能利用 ssh 來達到傳輸資料加密的作用,參數 --delete 為刪除目的比來源多餘的檔案或資料夾,故成為鏡像備份,需增量備份的使用者請勿加此參數,使用時要注意。  */

以上為 nfs 軟體的伺服器與使用者連入端(客戶端)之操作方式,其他詳細的 nfs 參數設定,可參考 http://nfs.sourceforge.net/,http://nfs.sourceforge.net/nfs-howto/ar01s03.html

#SAMBA
另一套磁碟分享的軟體為SAMBA,且主要應用於與 MS Windows 的作業環境下分享(如Windows的碗路翻林網路芳鄰 ),我們一樣可以利用 yum 下載,如圖4-48,鍵入指令 yum install samba







































(圖4-48)

下載後,一樣編輯 samba 的設定檔 /etc/samba/smb.conf,與先前一樣,請先看清楚設定檔內的說明,因設定檔相當長,筆者亦僅列出需要修改之處,如下:
[global]
workgroup   =  mysamba                    #  工作群組名稱
netbios name  =  samba_server          
/* NetBIOS 使用的名稱(https://en.wikipedia.org/wiki/NetBIOS),可自訂  */

unix charset   =  utf8                           
/* 跟隨系統設定,使用 utf8 編碼以中英文檔名,https://en.wikipedia.org/wiki/UTF-8 */

security = user
passdb backend = tdbsam                 
/*  samba 改為使用 tdbsam 的帳密資料庫(https://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/passdb.html),並相容於舊的 smbpasswd */

display charset  =  utf8                       
/*  顯示文字之編碼,使用 utf8 編碼,unicode 編碼可見http://unicode.org/Public/UCD/latest/charts/CodeCharts.pdf  */

dos charset  =  cp950                             
/* 傳統 dos 編碼為 cp950,可來顯示 big5(https://en.wikipedia.org/wiki/Big5),其他編碼可至 Unicode Consortium 網站 http://unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/   查詢*/

hosts allow = 192.168.100.0/24   10.0.2.0/24    #  僅允許此兩個網域連入
encrypt passwords = yes          #  密碼須加密,針對Windows XP以上的登入
socket options = TCP_NODELAY  IPTOS_LOWDELAY  SO_RCVBUF=65536   SO_SNDBUF=65536
/*  減少TCP與傳輸延遲,並加大接收緩衝區與送出緩衝區至 64K  */

dns proxy = no
load printers = no   # 不允許 printer 分享
guest ok = no           # 不允許 guest 存取

tls enabled  = yes   #使用 tls 加密,與其他伺服器軟體一樣,要產生的金鑰與憑證
tls keyfile = /etc/samba/mysamba.key
tls certfile = /etc/samba/mysamba.pem

protocol = SMB2 # 為防止 wannacrypt 攻擊,會造成綁架軟體加密的 SMBv1

# 以上為全部共用的設定

[sambadisk]
comment = sambadisk    #  要分享的磁碟名稱sambadisk之說明文字
browseable = no         #  不要公布名稱於網路芳鄰上,請連入端自行利用網路磁碟機連線
path = /mysamba       # 要提供分享的來源資料夾               
writeable = yes            #  是否可寫入,若要利用 Samba 備份資料,請改 yes
printable = no              #  是否可列印
create mode = 0644        # 新增的檔案權限預設為 0644( u+rw, g+r, o+r )
directory mode = 0644   #  資料夾的權限,不能違反系統本身對分享資料夾的權限設定

# 以上為自訂分享磁碟名稱  sambadisk 的設定

並將不要分享的 [home] 與 [printers] 參數,用符號 ; 加前頭關閉,如圖4-49






































(圖4-49)

接著記得產生設定檔所設定tls加密用的金鑰與憑證檔(https://wiki.samba.org/index.php/Configuring_LDAP_over_SSL_(LDAPS)_on_a_Samba_AD_DC)
$  cd /etc/samba/
$  openssl  req  -nodes -x509 -days 3650 -newkey rsa:2048  -keyout  mysamba.key -out  mysamba.pem
/*  一樣產生十年的金鑰  */

以上設定完成後,可用指令 testparm 來測試參數是否正確,如圖4-50。

























(圖4-50)

接著要產生給 Samba 使用者登入的帳號,samba tdsam 帳號需要使用系統內已有的帳號名稱來轉換,假設我們系統內已經有之前產生過的帳號名稱 newuser ,新增 smaba 帳號如以下:
$ pdbedit -a -u newuser   
/*  參數 -a (add user)為新增 ,參數 -u (username)為後面接上使用者名稱  */

圖4-51可以看到想查詢有那些 Samba 的使用者,可以利用指令
$  pdbedit  -L    # 參數 -L 為列出使用者

並對照系統的使用者資訊檔案/etc/passwd,可以看出兩者確實使用一樣的 uid。







































(圖4-51)

接下來,一開始設定檔內的說明,就提醒我們要設定 SELinux 的 policy 與允許的 boolean
$  setsebool   -P   samba_domain_controller   on
$  setsebool   -P   samba_enable_home_dirs   on

如果是系統產生的檔案要分享(如 /var),請記得執行以下
$ setsebool  -P  samba_export_all_ro  on  # 或 setsebool -P samba_export_all_rw on

接著用以下對 Samba 分享您所建立的資料夾(非系統產生)來允許
$ chcon  -Rt  samba_share_t   /mysamba

最後要啟動 Samba 伺服器軟體,並加入開啟啟動 Samba服務
$  service smb start
$  chkconfig  --level 235  smb  on

若用 nmap 掃描一下TCP ,可知道多啟用了服務埠 139/tcp netbios-ssn 與 445/tcp microsoft-ds 記得要設定 iptables 允許這兩個連接埠之服務,如下:
$  iptables  -A INPUT  -p  tcp  --dport 139  -j  ACCEPT
$  iptables  -A INPUT  -p  tcp  --dport 445  -j  ACCEPT
$  service  iptables  save

以上設定完成後,就可以在連入端設定連入此 samb 伺服器,若連入端在 Linux 環境下,可以使用 mount -t cifs ( https://wiki.samba.org/index.php/LinuxCIFS_utils,https://access.redhat.com/solutions/448263 )來掛載,並須確認掛載來源與目的的資料夾皆存在
$  mkdir  /mysamba
$  mkdir  /media/sambadisk   # 假設要掛載到 /media/sambadisk
$  mount  -t  cifs   -o  username=newuser  //10.0.2.15/sambadisk \ /media/sambadisk







如果登入需要帳號密碼且僅需要讓newuser帳號與newuser的群組使用,則掛載時可利用

$ mount -t cifs -o \ uid=500,gid=500,username=newuser,password=newuserpassword \ //10.0.2.15/sambadisk  /media/sambadisk


若要在 MS Windows 下來掛載此 samba 網路磁碟,則點選本機(我的電腦),開啟視窗後,在點選連線網路磁碟機,如圖4-52 藍色箭頭處,便會出現中間的連線網路磁碟機視窗,緊接著在此視窗選擇磁碟機要掛載的代號,與輸入資料夾,如視窗範例,我們輸入以下即可:\\10.0.2.15\sambadisk
#請注意 MS Windows 下的斜線的方向為 \ 

若要登入時即連線,請勾選 登入時重新連線(R)。圖4-52為筆者使用 MS Windows 10 來連線 Samba 網路磁碟機的範例,其他 MS Windows 的版本,皆大同小異。



































(圖4-52)


以上為 Samba 伺服器軟體的設定,若需要更多詳細的參數設定,可參考 https://www.samba.org/samba/docs/using_samba/ch06.html。下一節,筆者要介紹 NIS 伺服器軟體,可用來與 NFS 結合作為同時管理多台的叢集式電腦架構的基礎,例如用利用 NFS 分享母電腦主機的 /home 與 /opt 或 /usr/,與利用 NIS 來分享登入的帳號密碼給子電腦主機(node),其中 node 主機內僅需要安裝系統 / (root) 與 swap (buffer),其他運算軟體與磁碟空間皆由母電腦主機提供,而子電腦主機僅提供自身運算資源來做平行運算,提升計算效率。




If you have any feedback or question, please go to my forum to discuss.

這個網誌中的熱門文章

Linux操作不求人- 肆章之壹 - 伺服器架設(I) - SSH(SFTP、SCP)、FTP伺服器與遠端連線

@ ssh, sftp      通常安裝好 CentOS6_x64 作業系統後,sshd, ssh daemon 的服務功能是預設開啟的,如筆者的前面篇章所述,預設的 iptables 防火牆設定,亦是開啟讓 ssh 的連線是可通過的,不僅可以連出,也可以被連入。若要確認是否有安裝 sshd 套件以及在啟動時的 runlevel 2 3 5 是否有被載入,可以使用以下指令搜尋: $   rpm  -qa  |   grep  openssh     #  ssh 與 sshd 連線服務皆由 openssh 應用軟體提供。 或使用以下 $   rpm  -qa  |   grep  ssh         #  比用關鍵字 openssh 搜尋更模糊,故符合的條件更多。      如圖4-1可以查詢到有關於 openssh-client 與 openssh-server 的套件, openssh-server 便是提供連入服務的軟體,openssh-client 為提供可以連出的工具。若無以上套件,則使用 yum install openssh ,則可下載安裝。 (圖4-1) 再接著輸入以下指令查詢到 sshd 這個服務,是否有再開機程序內載入,如圖4-2 $ chkconfig | grep ssh   # 查詢 sshd 是否有於 開機 runlevel 啟動 再利用以下指令,來查詢是否防火牆有允許連線 $ iptables  -L  |  grep ssh   # 出現如圖4-2 允許通過之條件 (圖4-2)      接下來,我們要先來調整 sshd 的設定檔,利用 vim  /etc/sshd/sshd_conf ,如圖4-3-1與4-3-2。因為設定檔參數很多,筆者為方便說明,將 /etc/sshd/sshd_conf 檔案內容分成兩張圖。 (圖4-3-1)

Linux 操作不求人系列 - 貳章之壹 - Shell Script 程式設計(I) - BASH

     本章開始進入Shell Scripts的程式設計,因為Linux Shell的種類相當多,故筆者僅挑選預設的Bash Shell 及 學術界常會使用的 C Shell (/bin/tcsh )來說明與對照,在此先說明。至於 Scripts 的概念,在前章就已經說明過,可視為前壹章的各項指令之組合,在令其在執行檔案裡,依序執行,如前章所看到的 /etc/profile 檔案,在其他軟體上,有點類似巨集(macro)的執行檔,或是MS Windows的批次檔(Batch)。先建立此概念後,我們可以先在Terminal的命令提示字元,使用 for 指令,如圖2-1,在 shell scripts 內為了重複做一件事,而僅修改某些變數值,我們會利用所謂的迴圈(loop)方式來完成,而 bash shell 內常用的是 for 或是 tcsh/csh shell 內的 foreach 。 (圖2-1)      圖 2-1第一個指令輸入 for 的宣告,後面接著 seq 為變數名稱,為了逐次接收  in 後面之陣列值(http://www.gnu.org/software/bash/manual/html_node/Arrays.html)(註:若加了  ; 則 do 便可寫在同一行),接著 > 的提示字元的等待輸入,便是還沒遇到 done 指令來結束 do 的動作,控制此提示字元的環境變數為 PS2 。,此例的 seq 值,依序為第一次讀入 first 字串並存入變數 seq 當其值,接著second、third,從 echo $seq 可以看出,接著設定一個變數 file 其值為 my開頭字串,緊接變數值 $seq(first、second、third),再接固定的 script.sh 字串,接著利用echo指令,印出變數值$file,檢查是不是我們預期的字串值(註:如果想要暫停,讓使用者可以看清楚再繼續,可以加上指令sleep 3,表示畫面停止三秒鐘),接著利用 touch 指令產生 $file 字串值的檔案,再將其利用 chmod 指令, u+x 參數為令僅創立此檔的使用者帳號可執行(若要改為同群組可執行,參數需改為 g+x )。故可看到第二個指令輸入 ls ,便列出自動批次

Linux操作不求人 - 伍章之陸 - Intel PXE 與利用 tftp + anaconda kickstart來自動部署系統

     現代的個人電腦與筆電爲了節能省碳,往往皆省略了光碟機的設置。雖然說 USB隨身碟亦可應用於安裝作業系統,但若遇到機房的大量機器需安裝之問題,亦不適合此種用光碟片或隨身碟逐臺安裝的方式,或是需準備多片光碟或隨身碟。故爲了大量安裝與部屬 Linux作業系統的機器,我們便可透過具有PXE功能之網路卡(https://en.wikipedia.org/wiki/Preboot_Execution_Environment),其所具備的網路開機的能力,來作透過網路方式來安裝與大量部署 CentOS Linux作業系統。其原理 wikipedia  的PXE說明,都解釋得很清楚,筆者不需要再 " 掉書包 ",在開發者大神面前班門弄斧,我們就直接來做做看。      首先,我們一樣透過 yum來安裝所需的 tftp伺服器軟體(http://www.jounin.net/tftpd32.html),利用PXE支援 tftp 透過 udp 埠號 69連線,來提供檔案的能力,給利用 PXE開機後安裝作業系統的機器,圖5-60   (圖5-60) 接著修改 tftp 設定檔 /etc/xinetd.d/tftp,如圖5-61,請記得 disable  要改為 no (圖5-61)      若要修改 server_args 參數為自訂的 tftp root 路徑,記得要變更 SELinux 的權限設定,如要改為/tftpboot,則使用指令 chcon  來調整,如以下: $ mkdir /tftpboot $ chcon  --reference /var/lib/tftpboot  /tftpboot 接著將 xinetd 與 tftp 加入開機啟動,並重啟動 xinetd,如下: $ chkconfig  --level  235  xinetd on $ chkconfig  --level  235  tftp  on $ service xinetd restart 開放防火牆通行 $ iptables -A INPUT -p udp --dport 69 -j ACCEPT $ service iptables re