2016年11月28日 星期一

Windows, Linux與 OS X的檔案分享方法 (File Sharing Methods among Windows, Linux and OS X)

不論是個人SOHO或是企業資訊環境,在不同電腦間進行檔案分享與資料交換為相當普遍的需求與操作,相同的作業系統之間的目錄檔案資源分享問題通常較小,因為它們採用相同的檔案系統、使用一樣的共享傳輸協定與服務、支援相同的驗證與加密方法 ;但若希望在不同的作業系統間進行檔案分享就極可能會遭遇到一些困難,因為不同系統間的預設檔案系統和資源分享協定通常並不相同,即便雙方採用相同的檔案傳輸或共用協定,也可能由於不同平台實作方法與預設組態值有所差異(例如驗證與加密方法)而導致無法順利的連接與傳送,倘使不透過網路傳輸分享檔案而直接以媒體交換,也可能遭遇到彼此間的檔案系統不相容或無法支援的問題,因此本文將探討如何在三大主流作業平台--Windows、Linux與Apple OS X之間進行檔案目錄互享共用的各種方法。

跨平台資料分享與交換方法

一般而言,使用者若需要在Windows、Linux與OS X作業系統之間進行檔案與目錄分享共用,則常見的方法大致有三種:

1. 使用行動儲存媒體 (USB行動碟、硬碟、SD卡)。

2. 透過檔案共享或檔案傳輸協定。
3. 透過雲端磁碟服務。

假若所處環境沒有網路或不使用網路而需要在不同系統交換或分享檔案,而且交換資料的機器均在手邊可直接觸及,則使用具熱拔插的行動式儲存媒體或裝置在電腦間拷貝來交換資料是最可行的方法,倘若環境具有區域網路,則採用網路共享協定來分享資料則是較方便方式,若欲交換資料的電腦並不在相同的區域網路,但均可以連上網際網路,則可以使用一些網際網路服務來達成交換分享檔案的目的,如 FTP、郵件附件,甚至社群即時通訊服務皆可,但如需經常傳送檔案,則採用雲端磁碟分享應為較佳的方式。

換言之,首先需考量是否透過網路分享,若否,則採用雙方均支援的行動儲存媒體以及選擇相容的檔案系統應是主要關鍵,另一方面,假若打算採用經由網路方式分享檔案,則可考慮採用具有遠端檔案系統存取能力的協定或者是純檔案傳的協定,前者通常透過掛接(mount)方式來讓遠端檔案系統成為本地裝置的目錄(Linux)或磁碟代號(Windows),然後即可直接存取,不需經由下載動作就直接可開啟、編輯與執行遠端檔案,目前主要有SMB/NFS/AFP等協定,後者則是需要將檔案下載或上傳至本機或遠端電腦才能夠開始使用檔案,並無法直接開啟檔案,其主要的協定有ftp、sftp、ftps、scp以及WebDAV等。

下圖說明了各種跨平台裝置的檔案分享方式:

sharemethods

 

由於不同版本的作業系統所支援的檔案分享傳輸協定和軟體版本不同,這可能是會影響到檔案分享的組態設定和結果,本文底下採用了Windows Server 2016、Windows 10、OS X 10.12 (sierra)、CentOS 7與Ubuntu 16.10等版本的作業系統來示範所有功能。

使用行動儲存媒體分享檔案資料

若不打算透過網路的傳輸方法來分享檔案,則採用行動儲存裝置或媒體於電腦間傳遞是最常見的方式,而USB行動碟和SD卡可謂最普遍的行動儲存媒體,不過如何選擇儲存媒體格式化時的檔案系統類型將影響並限制其資料交換的互通性,因為每個作業系統內定上所支援的原生檔案系統並不相同,支援其它檔案系統的讀寫程度也不同。

  • Windows 系統上有三個主要的檔案系統--FAT32、exFAT、NTFS,但並不支援MAC與Linux的原生檔案系統,除非您額外安裝第三方軟體。
  • MAC OS X原生使用「OS X 擴充格式」--HFS+為其主要的檔案系統,不過系統本身也可支援FAT32、exFAT檔系統的讀寫能力,但對於Windows 的NTFS檔安案系統就就只能夠以唯讀(Read-Only)方式存取,而Linux 的檔案系統基本上是不支援的,除非安裝額外的軟體。
  • Linux上較常使用的預設檔案系統有 ext2、ext3、ext4、xfs、ReiserFS.....等,但大部分的發行版本通常只要額外安裝適當的套件,就可支援FAT32、exFAT和NTFS等檔案系統的讀寫能力。

下表比較了三大作業系統預設支援的檔案系統情況以及若要支援其它檔案系統時需要安裝何種套件:

  Windows OS X Linux
FAT32

預設支援讀寫
(內建磁碟工具無法格式化超過32GB的分割區)
(可存取最大2TB磁碟區資料)

預設支援讀寫
(可格式化最大2TB分割區)
預設支援讀寫
exFAT 預設支援讀寫 預設支援讀寫
(需採主開機記錄架構(MBR),而非GUID分割區配置表(GUID),否則Windows將無法辨識)
預設不支援
(需安裝exfat-utils或exfat-fuse(fuse-exfat)二個套件)*
NTFS 預設支援讀寫 預設只支援唯讀功能
(安裝具有寫入能力的驅動程式,如 付費的Paragon NTFS for Mac 或Tuxera NTFS for Mac,免費的ntfs-3g, )
需安裝 ntfs-3g 才能夠裝載和讀寫 NTFS
(有些Linux發行版本預設已安裝,有些需手動安裝)
HFS+ 不支援
(可安裝免費HFSExplorer來唯讀HFS+檔案系統)
(購買可讀寫 能力的Paragon HFS+ for Windows或 MacDrive)
預設支援的原生檔案系統 預設不支援
(Centos可安裝kmod-hfsplus**, Ubuntu可安裝hfsprogs來唯讀HFS+)
(若需要寫入能力,則HFS+需停用journaling功能)
extfs 不支援
(使用付費的Paragon ExtFS for Windows)
不支援
(安裝免費的OSXFuse和FUSE-EXT2,新版OS X可能會有問題)
(安裝付費的Paragon extfs for MAC)
預設支援讀寫

* ububtu Linux 只需直接安裝-- sudo apt install exfat-utils exfat-fuse
   CentOS Linux 需先安裝其它儲存庫 (如 nux儲存庫),才能進行安裝:
   wget http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
   yum localinstall nux-dextop-release-0-1.el7.nux.noarch.rpm
   yum update
   yum -y install exfat-utils fuse-exfat
**需先安裝第三方儲存庫,如 ELRepo (rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm)

由上表分析可知,FAT32 提供了三種不同作業系統資料交換上的最佳相容性與互通性,但FAT32檔案系統卻有檔案大小、分割區大小和效能上的限制,其最大的缺點在於檔案有4GB的限制,另一方面,雖然實務上的最大可格式化的分割大小為2TB(理論可達8TB),但由於不同作業系統上所採用的工具支援度卻大不相同,以最普及的Windows系統為例,目前新版的磁碟工具最多只能格式化為32GB的分割區,超過32GB分割區格式化為FAT32將會失敗,但您可以使用第三方軟體來建立並格式化超過32GB的FAT32磁碟後仍可正常的讀寫存取,例如您手機上希望安裝超過32GB的SD卡,則需預先使用第三方磁碟工具將其格式化為FAT32,反而是另一個OS X 作業系統上內建的磁碟工具可以建立與格式化最大為2TB的FAT32磁區,總之,如果您需要拷貝大於4GB的檔案(例如虛擬磁碟檔,影片檔案)或使用超過2TB磁碟,則不需要購買付費軟體的前提下,建議於Windows與OS X間建議使用exFS,Windows與Linux間則可使用NTFS,而Linux與OS X間利用exFAT會是一可行方式。

利用網路分享資料檔案

許多場合或環境並無法直接使用儲存媒體在不同系統間交換資料,因此在(區域)網路連線環境下,採用共通的傳輸協定或雙方均可支援的傳輸服務來交換與共享資料是最直接的方式。

不過三大作業系統預設支援的遠端檔案統存取協定與傳輸服務並不相同,Windows 預設上採用Server Message Block(SMB)協定(又稱為Common Internet File System;CIFS),OS X原始上採用Apple Filing Protocol (AFP)協定,傳統的UNIX/Linux系統大多支援Network File System (NFS)協定,下表顯示三大作業系統支援遠端檔案系統分享協定的差異:

  Windows Linux OS X
SMB/CIFS 內建 安裝並設定samba 內建
NFS 安裝內建的Client for NFS和Server for NFS 安裝NFS套件 內建,需啟動nfsd
AFP 不支援 安裝並設定netatalk套件 內建

依經驗而言,SMB/CIFS為微軟預設的檔案印表機資源的共用協定,採用使用者層級的存取控制方式,SMBv3可支援傳輸加密功能以解決傳輸安全性問題,再加以OS X系統亦為內建支援,Linux需透過安裝SAMBA套件來提供SMB伺服服務,因此若需要在不同系統中利用網路共用分享檔案與列印資源,使用SMB/CIFS協定應該是最常被建議採用的協定。

至於NFS協定並非為個人或家庭網路所設計,其基本上採用主機為基礎的存取控制機制,但除非您直接允許所有匿名存取並設定寬鬆權限,否則需要設定二方的UID/GID對應問題,再加上NFS有2, 3, 4版的相容性問題、早期使用RPC動態連接埠問題而導致防火牆較不易設定問題,因此除非Linux/UNIX彼此之間資源共享檔案,否則一般在跨平台環境並不常使用NFS。

另一個OS X支援的AFP協定,Windows並不支援,除非您願意購買商用的產品,但Linux系統則可透過下載netatalk和afpfs-ng套件來支援AFP協定互享檔案資源。

下圖說明了三大主流作業系統彼此存取遠端檔案系統的可能協定和所需安裝的軟體或服務。

sharing

壹. SMB/CIFS協定

由於Windows作業系統的高度普及率,因此SMB/CIFS一向是目前區域網路環境下最普遍的檔案共享協定,SMBv3.1為目前最新版本,由於早期版本的SMB採用 NetBIOS的服務定位協定造成了過多廣播流量而有效率不佳的批評與印象,但較新版本SMB則是直接執行在 TCP 連接埠 445上,解決了部份效能上的問題,至於安全性的問題,隨著NT 4 SP3推出了數位簽署,降低了遭受中間人攻擊的風險,SMB 3版後新增了AES加密功能亦避免傳輸遭竊聽的可能,因此,SMBv3版後其整體上在犧牲部份效能下,安全性業已大幅提升,只不過不同的系統與軟體套件所支援的SMB版本不同,需經由連線協議後才會知道以何版本傳輸,您可以在連線後利用Windows系統上的Get-SmbConnection Powershell cmdlet來得知SMB連線所協議的版本。

Linux 設定為SMB伺服端與用戶端

Linux系統可利用知名的samba套件來提供SMB/CIFS共用目錄服務,基本做法及步驟說明如下:

(一) 安裝samba相關套件

首先,您必需安裝samba相關套件。
# yum -y install samba samba-client samba-common    (CentOS)
$ sudo apt-get install samba        (Ubuntu)

(二) 編輯與設定組態檔 (/etc/samba/smb.conf)

接下來,以任何您所熟悉的文書編輯器來編輯samba組態檔—/etc/samba/smb.conf (例如vi    /etc/samba/smb.conf),smb,conf有二個主要設定段,開頭的[Global]設定段為一般組態設定,後半段則為分享資源的設定段,經常存在一個預設的家目錄分享設定段--[homes]以及印表機資源分享設定段—[printers],最後的組態檔中您可以自行新增所欲分享的目錄段,不過smb.conf組態檔的組態項目與參數繁多,若需要較全面的了解,您需要自行參考書籍或相關文件手冊,底下吾人只編輯一個簡單的組態檔以便可以分享目錄給Windows或OS X系統連線使用。

首先,開頭的[globa]設定段如下所示:

workgroup = WORKGROUP    
security = user       
passdb backend = tdbsam
  • workgroup:定義Windows的工作群組名稱。
  • Security:設定使用者層級的安全性模式(user),這是預設且最簡單的安全性模式,伺服器透過用戶端提供的username/password來決定允許或拒絕存取。
  • passdb backend :Samba使用者帳號和密碼是與Linux本身的帳號系統分開的,較新版本的samba基於較安全及功能性考量,大多以tdbsam取代早期的smbpasswd的密碼維護方式,並利用pdbedit命令來管理使用者帳戶密碼。

smb.conf組態檔案後半段可以將預設已存在的[homes]、[printers]和自行新增的[共用目錄名稱]設定段以SMB資源的方式分享於網路上,並設定好使用者和主機存取控制機制,底下顯示了預設的[homes]設定段內容和二個自行定義的共用目錄段。

首先,底下的家目錄分享時設定為可瀏覽,可寫入,當使用者登入時會存取到其使用者名稱的家目錄(%S=the share's name),亦即當某username登入時會自動以其使用者名稱替代homes而成為共用目錄名稱,此外亦設定了使用者新增檔案和目錄時的預設權限。

[homes]
comment = Home Directories
browseable = no
writable = yes
valid users = %S
create mask = 0755
directory mask = 0755

下列自行定義的分享目錄[pub]為一允許讀取的SMB共用目錄,不過只有root、david與staff群組才能夠執行寫入的操作,不過為了達此目的,你還需要設定好此目錄檔案的rwx使用權限。

[pub]
comment = tpublic share directory
path = /pub
browsable = yes
guest ok = yes
writable = yes
write list = root david @staff

底下為第二個自行新增的SMB分享目錄--data目錄,只允許 root、david和henry三位使用者讀寫存取,而且還限制經需由192.168.2這個網段的機器才能夠存取。

[data]
comment = data folder
path=/data
valid users = root david henry
writable = yes
create mask = 0744
allow hosts = 192.168.2.

編輯完成後,請重新寫入儲存smb.conf檔案,然後執行 testparm 指令來檢查方才編輯的組態檔-/etc/samba/smb.conf 是否正確。

(三) 建立samba帳戶

由於Samba存取的使用者帳號和密碼是和Linux系統本身的帳號系分開的,針對已經存在的Linux使用者帳戶,若需要從Windows平台存取其Linux家目錄或其它共用目錄,需額外以pdbedit命令新增samba帳戶,例如替david這位使用者新增samba帳戶指令如下:

pdbedit -a david

然後輸入二次初始密碼,日後使用者可以自行使用smbpasswd指令變更其samba連線密碼。

(四) 新增防火牆規則和其它安全性規則

如果Linux系統啟用防火牆,則您還需要新增允許 SMB協定的連入防火牆規則才能夠接受連線。

# firewall-cmd --permanent --add-service=samba && firewall-cmd --reload    (CentOS)
$ sudo ufw allow samba     (Ubuntu)

若您的Linux有啟用SELinux,則還需要停用SELinux或是執行下列指令:

# setsebool -P samba_enable_home_dirs on
# setsebool -P samba_export_all_ro=1 samba_export_all_rw=1
# getsebool -a | grep samba_export
# semanage fcontext -at samba_share_t "/pub(/.*)?"
# restorecon /pub
# semanage fcontext -at samba_share_t "/data(/.*)?"
# restorecon /data

(五) 重新啟動 smb和nmb服務

最後,請(重新)啟用 smb和nmb服務以讓上述的變動生效並開始提供SMB共用檔案服務。

systemctl enable smb && systemctl enable nmb systemctl start smb && systemctl start nmb  (CentOS)
sudo systemctl restart smbd  && service restart nmbd      (Ubuntu)

另一方面,Linux系統若希望存取SMB網路共用,通常可以利用smbclient和mount這二個命令,smbclient 為一類似ftp命令的SMB檔案傳輸工具,可以用檢視瀏覽遠端伺服器的SMB資源外,還可以透過get和put指令來下載與上傳檔案,下圖為利用smbclient命令來瀏覽遠端Windows伺服器所分享的SMB資料夾,圖中最後出現一個 NT_STATUS_RESOURCE_NAME_NOT_FOUND的錯誤訊息,筆者懷疑這可能是smbclient依賴Windows早期的Computer Browser來列蒐集與列舉Windows網路的工作群組和網域內機器資訊,但新版的Windows 目前所採用的Network Discovery蒐集電腦資訊的方式已有所不同而導致的錯誤,但這並不影響接下來的檔案傳輸工作,因此在此視為可忽略的錯誤,不再細究。

smbclient1

下圖則是利用smbclient 的get/put指令成功的下載與上傳檔案的畫面。

smbclient2

不過Linux上較好的存取SMB資源的方式無非是採用mount的方式來掛載至本機的目錄來當成本機檔案系統來加以使用,mount指令語法如下:

mount -t cifs -o username=<使用者名稱>,password=<使用者密碼> //<電腦名稱或IP位址>/<共用資料夾/<掛接目錄>

下圖在Linux機器上以mount命令並利用了david這個使用者帳戶身份掛載了一部Windows電腦的/pub共用資料夾。

mountcifs

倘若Linux系統需要經常連接存取某個網路上的 SMB資源,則每次使用時均需要輸入如上述有些冗長的指令,著實不太方便,因此管理員可以透過編輯/etc/fstab檔案並新增以下一行(有六個欄位)內容,以便每次開機時會自動裝載這個共用資料夾至預先規劃的目錄,以省去日後使用前需輸入的麻煩:

//<電腦名稱或IP位址>/<共用資料夾/<掛接目錄> cifs _netdev,username=<使用者名稱>,password=<密碼>,dir_mode=0755,file_mode=0755  0 0

不過上述方法有項缺點,亦即將密碼資訊以明文方式直接曝露在/etc/fstab檔案內恐有安全上的疑慮,所以實務上另一種較安全的做法則是把使用者名稱與密碼分二行的儲存在一個檔案 (如下例新增 /root/sec.txt 檔案),內容如下:

username=david
password=123456

然後再以下列方式(於第四個選項欄位使用credentials參數)寫入/etc/fstab來設定開機時自動裝載。

//<電腦名稱或IP位址>/<共用資料夾/<掛接目錄> cifs credentials=/root/sec.txt,_netdev,dir_mode=0755,file_mode=0755  0 0

底下則為實際示範例子。

fstabsmb

值得特別一提的現象是當Linux系統利用smbclient命令連接OS X的SMB共用時,卻會發生無效簽署的錯誤(NTLMSSP NTLM2 packet check failed due to invalid signature)而被拒絕存取( NT_STATUS_ACCESS_DENIED),但使用匿名方式連線時,雖然會出現連線拒絶的錯誤,但仍可正確的顯示共用資料夾,此外,匿名身份get/put檔案時也是可以正常存取,但利用一般身份存取時郤又會產生驗證失敗而被拒絶存取。

linaccessosxerr1

為了判斷此一問題的緣由,吾人再直接以mount –t cifs命令掛載OS X伺服器的共用檔案夾時,畫面則會出現如下圖所示的 “Operation not supported”之錯誤。

linaccessosxerr2

經仔細推敲與研究,推判可能是OS X的SMB協定實作的預設驗證簽署方式與samba的實作有出入的關係,另外,OS X系統上所實作的SMB協定並不支援POSIX規範也許是另一項原因,因此,當作者第二次添加入 sec=ntlmssp和nounix這二個額外選項來掛載OS X共用資料夾時,發現就可正確連線、驗證與存取了。再進一步實驗確認,發現其實只要加上nounix選項來停用CIFS 的UNIX延伸功能即可讓Linux順利掛載 OS X的共用資料夾而解決這個問題。

linxaccessosx

OS X設定為SMB用戶端與伺服端

由於OS X內定就支援SMB/CIFS協定,所以設定 OS X 系統成為SMB伺服端,提供共享檔案夾讓其它電腦來存取檔案資源就顯得相當簡單,您只需要依循下列步驟:

  1. 請開啟「系統偏好設定」內的「共享」面板,然後再勾選「檔案共享」選項。
  2. 在「共享」設定頁中,右側會顯示目前已共用的檔案夾及允許存取的使用者和權限。
  3. 若要替OS X新增額外的SMB共用目錄,則「共用的檔案夾」下方的「+」號按鈕。
    osxshare
  4. 接下來的畫面中選取想要加入的SMB檔案夾,再按下「加入」。
    osxaddshare
  5. 下一步驟則是新增或移除允許存取的帳戶並設定好讀寫的使用權限。
    osxshareperm
  6. 請繼續勾選右側「選項」按鈕,接下來的設定頁請勾選「使用SMB共享檔案和資料夾」,並在下方的列示盒勾選需要存取此檔案夾的所有使用者帳戶,並正確的輸入其存取的密碼,完成後按下「好」和「完成」結束此設定視窗。
    osxshareuserspwd

另一方面,OS X系統欲存取網路檔案伺服器的SMB資料夾也很簡單,請使用 Finder 的「連接伺服器」功能(選取「前往-->連接伺服器」),然後輸入 「smb://ip位址或FQDN」網址。

ossmbaccess

接下來,輸入正確的使用者名稱和密碼,如果共用目錄權限和網路連線無問題,再選擇所欲存取的目錄即可順利存取到共用目錄,作者測試連線至Windows與Linux的SMB共用資料夾,一切順利並無問題。

ossmbaccess2

 

Windows 設定為SMB伺服端與用戶端

長久以來,Windows 預設上使用SMB/CIFS協定來分享檔案資料夾,因此提供了圖形介面、精靈程式、傳統命令指令、Powershell cmdlet等多種方式來新增SMB共用資料夾,這一部份應是常使用Windows系統的大多數人所熟悉的,因此在此並不詳細說明,您只要選擇熟悉的介面方法,創立目錄,新增共用並且針對適當的帳戶設定好正確的共用權限和NTFS使用者權限即可。

winaddshare

另一方面,Windows系統希望存取網路SMB共用檔案夾,也有多種不同的方法,一個較友善的方式是如果您網路上的機器均已經啟用了網路探索功能,則只需要在使用檔案總管上的網路來瀏覽區域網路中有提供SMB檔案資源的電腦,進而點擊即可存取之,另一種常用的方法是直接在「執行」對話視窗中輸入正確的UNC網路路徑( \\電腦名稱或IP位址[\共用資料夾] ),然後再輸入正確的認證帳戶密碼即可。

winsaccessshare

 

如果您需要以命令列的方式瀏覽或存取SMB網路共用,則可使用傳統指令net view 和 net use ,net view 用以顯示區域網路的電腦清單或指定電腦或指定網域的共享資源列表。

net view [\\電腦名稱| /domain[:網域名稱]]

net use 則可用來連接至網路的SMB共用並對映至本機磁碟代號來存取之。

net use [磁碟代號 | *] [\\電腦名稱\共用名稱[\子目錄]] [密碼 | *]] [/user:[網域名稱\]使用者名稱] [[/delete] | [/persistent:{yes | no}]]

下圖示範了以new view 命令檢查網路的SMB伺服器。

newview

下圖則是使用net use 命令連線網路共用並建立網路磁碟機。

netuse

最後,筆者利用一部最新的 Windows Server 2016作業系統存取OS X 10.12、CentOS 7、Ubuntu 6.10與一部網路上的NAS服器的共用資料夾後,再利用 powershell的 Get-SmbConnection 命令顯示了不同的作業系統使用了不同的SMB版本。

smbvers

貳. Network File System (NFS)

984年由 Sun公司發佈的網路檔案系統(NFS)為一分散式檔案系統,提供UNIX系統間目錄檔案共享機制,NFS協定讓存取遠端檔案就像存取本機檔案一樣容易。NFS為主從架構,伺服端負責匯出(export)檔案資源給其它系統,用戶端則掛接(mount)遠端伺服器的檔案資源至本機目錄以利存取,NFSFSv4協定的制訂工作已由 IETF(Internet Engineering Task Force) 接手開發,因此目前NFS也已是一個開放性的標準RFC協定,任何組織皆可以依據公告的標準實作它。

Linux 設定為NFS用戶端與伺服器

Linux系統支援NFS伺服服務以提供共用檔案資源,您需要執行以下步驟:

  1. 安裝 NFS相關套件
    不同的Linux發行版本,其NFS套件名稱並不一樣。
    # yum -y install nfs-utils    (CentOS Linux)
    $ sudo apt-get -y install nfs-kernel-server    (Ubuntu Linux)
  2. 建立 NFS共用目錄 
    接下來新增NFS共用目錄和一個測試檔案,並設定開放所有權限。
    mkdir /pub
    echo This is a test file > /pub/test.txt
    chmod -R 777 /pub
  3. 建立與編輯/etc/exports檔案
    /pub *(rw,sync,no_subtree_check)
    /home 192.168.2.0/24(rw,sync,no_root_squash,no_all_squash,no_subtree_check)
    下圖顯示了Linux系統利用/etc/exports檔案提供了二個共用的目錄
    linuxexports
  4. 變更過/etc/exports檔案後,請重新啟動服務。
    systemctl restart nfs-server     (CentOS)
    sudo systemctl restart nfs-kernel-server  (Ubuntu)

上述的/etc/exports檔案格式為:

目錄  主機名稱(選項)  機名稱(選項) ........

其中較為重要的選項為:

選項 說明
rw 允許讀取和寫入的存取模式
ro 只允許讀取的存取模式
root_squash 連線的用戶使用者如果是 root,身份將被壓縮轉變成匿名使用者,其 UID 與 GID 都會變成 nobody (nfsnobody) ,此選項用以避免root使用者從遠端連線時擁有root的權限
no_root_squash 連線的用戶使用者如果是 root,對於此分享的目錄具有 root 的權限
all_squash 不論連線的用戶使用者身份為何,都會被壓縮成為匿名使用者,通常是 nobody(nfsnobody)
kerberos 使用kerberos驗證方法來控制目錄存取
sync 資料寫入時會同步寫入記憶體和磁碟中
async 資料會先暫存記憶體中,而非直接寫入磁碟
anonuid 自訂匿名使用者(anonymous)的 UID,亦即代表 *_squash所使用的匿名使用者的UID
anongid 自訂匿名使用者(anonymous)的 GID,亦即代表 *_squash所使用的匿名使用者的GID

反之,Linux系統若要連線存取網路的nfs共用,則使用mount –t nfs命令即可,其基本語法如下:

mount -t nfs -o [掛載選項一,掛載選項二..........]  伺服器名稱或IP位址://目錄  /掛載點

不同系統與版本的NFS掛載選項和預設值可能不同,而常用的nfs掛載選項說明如下表: 

nfs 掛載選項 說明
hard 預設值,建立 hard mount 時 ,當無法成功掛上時,會不斷的嘗試,直到成功為止
soft 建立soft mount,當經過逾期時間仍無法成功掛上時,會出現錯誤訊息而不再嘗試掛載,以便可以較快速的重新取回系統控制權
rsize=n Read Block Size。從NFS伺服器一次讀取的位元數
wsize=n Write Block Size。從NFS伺服器一次寫入的位元數
timeo=n 掛載請求等待對方回應的時間,單位為1/10秒,預設為60
fg mount工作啟動於前景的執行工作,預設
bg mount工作啟動於背景的執行工作
tcp 使用TCP協定掛載目錄
udp 使用UDP協定掛載目錄

下圖顯示如何在CentOS 7的電腦上,檢視(showmount)、掛載(mount)和解除掛載(umount) Windows Server 2016和OS X Sierra二個作業系統所提供的NFS共用。

linuxmountnfs1

若您希望每次開機時就自動掛載這些二個NFS伺服器的目錄,則需要編輯/etc/fstab檔案,新增如下的二行:

fstabmountnfs

Windows 作業系統設定為NFS用戶端與伺服器

Windows作業系統可以支援NFS服務,但需先安裝NFS元件,Windows Server的NFS服務包括了"Server for NFS" 和 "Client for NFS" 二部份,因此可設定為NFS用戶端和伺服端,但Windows 8/10等桌面型作業系統只支援"Client for NFS",因此只能做為NFS用戶端。

桌面型作業系統(Windows 8/10)可經由「控制台\程式集\開啟或關閉Windows功能」途徑啟動『Windows功能』對話盒來新增『Service of NFS』這項功能,若為Windows伺服器(Windows Server 2012R2/2016)則需利用『伺服器管理員』工具內的『新增角色及功能精靈』程式來新增 『檔案和存放服務』角色下的『檔案和iSCSI服務/Server of NFS』服務以即功能中勺選 "Client for NFS"。

winsinstallnfs

 

Windows作業系統安裝了NFS元件後,若需要存取網路上NFS伺服器的共用目錄,只需如同Linux一般,採用如下的mount指令來掛接到可用的磁碟代碼即可:

mount 伺服器NFS目錄  *   或

mount \\伺服器\NFS目錄 *

如下圖為例,先利用showmount -e 檢查NFS目錄,然後再利用mount 指令掛接到磁碟機,掛接後可由mount指令了解掛接所使用的所有選項,最後,若不再需要使用NFS資源時,則可以利用umount 指令卸除掛接的磁碟機。

winsmount

上圖顯示可知預設掛接時預設使用的UID和GID為 -2,而這個UID/GID在Unix/Linux系統是不存在的,所以存取時乃是以匿名的方式存取,因此您可能必需變更UNIX/Linux伺服器的檔案目錄的擁有者、群組(可由UNIX指令chown變更)和使用權限(可由UNIX指令chmod變更),或設定UID與GID才不會產生掛接存取時權限不符合的錯誤問題。

另一方面,Windows Server 一旦安裝了Server for NF服務之後,每個資料夾的內容視窗就會額外多出了一個如下圖的『NFS共用』標籤,您可以在此設定頁中按下方的『管理NFS共用』按鈕來啟動另一個『NFS進階共用』設定視窗。

winsnfsfolder

在『NFS進階共用』設定視窗上勾選『共用此資料』項,並按下方的『權限』按鈕以設定充允許存取的主機並選擇唯讀或讀寫的權限,此外,由於Windows使用者帳戶並無UNIX的UID/GID設計,因此除非您要額外的去定義其UID/GID的對應,否則應依預設允許未對應的使用者存取。

winsnfsfolder2

設定OS X 為NFS用戶端和伺服端

MAC OS 源自於Mach和 BSD UNIX,因此已內建NFS用戶功能,可以直接使用mount指令掛接網路上的NFS目錄,下圖顯示了實例作法,值得留意的是您可能需要額外利用 –o resvport選項來令其使用小於1024的特權來源連接埠才不會發生錯誤。

macnfsclient

另一方面,OS X亦可設定為NFS伺服端並且提供NFS共用目錄,做法相當簡單:

  1. 編輯/etc/exports檔案,建立共用目錄。
  2. 啟動 nfsd。

OS X的/etc/exports檔案之內容格式與選項和Linux/Windows均不太一樣,常用的選項如下表:

-maproot=user:[group[:group...]]
以指出遠端的root使用者將被對映至某特定使用者和群組,可指定一個使用者(群組)名稱或使用者(群組)UID。
-mapall=user:[group[:group...]]
用以指出遠端的任何使用者將被對映至某特定使用者和群組
-ro -rw
以唯讀(或讀寫)方式提供檔案系統的存取
-kerb
    利用Kerberos伺服器來驗證及對映用戶端帳戶

底下範例以唯讀方式共用了/Users 這個目錄,並對映使用者為 nobody且限制了192.168.2.0/24網段內的機器才能夠存取。另一個共用目錄/test1則是允許讀寫並且映至root:wheel,因此您必需同時變更目錄擁有者、群組與權限,才會符合存取原意。

/Users -ro -mapall=nobody -network 192.168.2.0 -mask 255.255.255.0
/test1 -rw -mapall=root:wheel -network 192.168.2.0 -mask 255.255.255.0

參. Apple Filing Protocol (AFP)

AFP協定為 Apple專屬的檔案分享協定,其它非Apple 電腦較少支援它,微軟早期的Windows 2003/2000 Server作業系統還支援一個舊版的AFP 2.2服務--Services for Macintosh (SFM),但後續的Windows Server 2008版本就已將其移除,所以目前較新的Windows版本均已不再支援AFP,因此除非您希望在多部OS X機器之間要互享資料夾, 或要使用到OS X重量級的應用-Time Machine,否則在跨平台領域中的檔案夾分享,通常不會想要使用AFP協定。

Linux系統可透過安裝netatalk這個套件來支援AFP協定以便可以和OS X 共享檔案夾,底下示範如何在 Ubuntu 16.10 系統中下載、編輯、安裝及使用netatalk來支援 AFP協定檔案夾共享機制 ,雖然Ubuntu的儲存庫有提供netatalk套件,可透過apt直接安裝,但內容卻是舊本的netatalk 2.x,為了方便能與新版的OS X互用溝通,因此吾人必需自行到網路下載新版本的netatalk 3.x之 tar.gz(tar.bz2)檔案來編譯安裝。

  1. 預先安裝編譯執行時所需要套件。
    apt -y install build-essential libevent-dev libssl-dev libgcrypt-dev libkrb5-dev libpam0g-dev libwrap0-dev libdb-dev libtdb-dev libmysqlclient-dev avahi-daemon libavahi-client-dev libacl1-dev libldap2-dev libcrack2-dev systemtap-sdt-dev libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libio-socket-inet6-perl tracker libtracker-sparql-1.0-dev libtracker-miner-1.0-dev
  2. 從Sourceforge網站下載最新的netatalk版本,本文撰寫時為最新套件為 netatalk-3.1.10.tar.gz或netatalk-3.1.10.tar.bz2檔案,然後將下載的檔案解壓縮至目錄並進入此目錄。
    tar zxvf netatalk-3.1.10.tar.gz   或
    tar jxvf netatalk-3.1.10.tar.bz2
    cd netatalk-3.1.10
  3. 設定檢查編譯選項,建立 Makefile。
    ./configure \
        --with-init-style=debian-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-daemon=/usr/bin/dbus-daemon \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.
  4. 開始進行編譯與安裝,請留意是否有錯誤及編譯完成。
    make
    sudo make install
  5. 編譯完成後,請檢查版本,功能與相關路徑。
    /usr/local/sbin/netatalk -V
    /usr/local/sbin/afpd -V
    您將會看到如下的顯示畫面,說明了編譯所支援的功能以及組態檔案路徑:
    netatalkV
  6. 編輯與設定組態檔--/usr/local/etc/afp.conf 
    afp.conf組態檔有諸多選項,在此並不詳細說明,請自行參閱相關文件,底下只撰寫一個簡單的組態檔案,用以提供使用者家目錄和另一個/pub目錄的共用。
    [Global]

    [Homes]
    basedir regex = /home

    [pub]
    path = /pub
     
  7. 啟動 avahi-daemon和netatalk服務
    sudo systemctl enable avahi-daemon
    sudo systemctl enable netatalk
    sudo systemctl start avahi-daemon
    sudo systemctl start netatalk

另一方面,若希望Linux電腦可以取OS X上的AFP資料夾,您需要安裝一套AFP用戶端軟體,而afpfs-ng可能是目前唯一選擇,不過由於afpfs-ng 已經許久未更新其版本,它與新版的Linux可能會有搭配上的問題,建議您直接下載最近的原始碼來自行編譯安裝較不會產生問題。

底下為作者在CentOS 7上透過git方式下載最近的afpfs-ng原始來進行碼編譯與執行的步驟。

  1. 先安裝編譯與執行時所需要的套件(不同的Linux發行版本,其套件名稱可能會不一樣,您需要自行找出來)。
    yum -y install git fuse fuse-devel readline readline-devel libgcrypt-devel openssl098e-0.9.8e-29.el7.centos.2.i686
  2. 利用 git取得afpfs-ng原始碼。
    git clone https://github.com/simonvetter/afpfs-ng
    cd afpfs-ng
  3. 產生 Makefile、編譯並安裝
    ./configure
    make
    sudo make install

一旦編譯成功後,您需要先執行AFP連線工作階段管理程式-afpfsd。

afpfsd

接下來即可掛載OS X的AFP檔案夾來存取之,命令格式如下:

mount_afp "afp://username:password@servername/volumename" <mountpoint>

例如下面範例為作者利用mary這個帳戶存取 OS X系統的一個afp公用目錄。

centosacsafp

OS X 設定為 AFP伺服端與用戶端

若需要將 OS X某檔案夾設定為AFP目錄很容易,您只需要利用「共享」設定頁內的「選項」視窗,勾選『使用AFP共享檔案與檔案夾』。

osxafpshare

 

另一方面,OS X存取網路上的 AFP檔案夾只需要前往『連接伺服器』,輸入afp://開的網址以及正確的使用者名稱與密碼,所選擇檔案夾即可被自動裝載至/Volume/foldername目錄下來存取使用。

osxafpaccess

結語

在許多資訊環境下,在不同的電子裝置與系統間交換共享資料是相當普遍的需求,分享不同系統的資料檔案時端視是否利用或存在網路,若無法或不希望透過網路來分享檔案資料且裝置就在手邊,大概就屬藉助行動儲存媒體(USB行動碟、SD卡、行動硬碟...)最普及,因此這時關鍵在於選擇相容性的檔案系統,而FAT32無疑是目前市場上相容性最高的檔案系統,幾乎所有電子設備和系統均可支援,可惜的是FAT32有4GB檔案大小的限制和分割磁區限制,這對需要交換分享虛擬磁碟檔或影片檔案者這些可能超過4GB檔案者而言可能是個問題,這時NTFS和exFAT可能是另一種選擇,因為越來越多電子或資訊系統可支援此二種檔案系統。

另一方面,若希望透過網路來分享檔案資料,則選擇一個適當的遠端存取檔案系統與檔案共享協定是主要關鍵,SMB/NFS/AFP是為一般檔案伺服器上最常支援的案共享協定,原始上分別應用於Windows、UNIX/LINUX和 OS X系統上,因此若希望在這三大主流系統上分享檔案,由於Windows系統的普及性和其它系統也可支援的緣故,SMB協定經常是首選;雖然Windows與OS X也可直接支援NFS,而NFS則較適合Unix/Linux系統之間分享,AFP協定大概就是OS X間分享資料上屬最具效率,若您可以在Linux系統上安裝netatalk和afpfs-ng,則Linux亦可成為AFP伺服器和用戶端。不過上述SMB/NFS/AFP協定通常只建議應用於企業網路範籌,不建議在網際網路上直接使用,因為恐有高度安全性風險,如果需要在網際網路使用檔案分享,建議搭配虛擬私人網路 (VPN)使用。

此外,如果您只是要分享檔案的下載或上傳服務,則倒不一定要使用上述所建議的遠端檔案存取協定,採用一般簡單的檔案傳輸協定即能符合需求,如ftp、sftp、scp、http WebDAV,此外,隨著雲端磁碟使用的廣泛性,對於允許存取網際網路的(行動)裝置,直接利用https協定來分享檔案資料與磁碟則是另一種選擇。

總而言之,對於需要在不同裝置與系統分享檔案資源的使用者而言, 需考量不同系統間差異和兼容性、是否使用網路傳輸,(傳輸)安全性,分享效能之間的利弊得失後,再選擇最適當的方法。