歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux資訊 >> Linux文化 >> Debian下通過SSHFS/SHFS掛載遠程文件

Debian下通過SSHFS/SHFS掛載遠程文件

日期:2017/2/27 11:53:14   编辑:Linux文化

大家可能知道並用過在linux上通過smb,nfs來進行遠程文件系統的共享,可是大家是否知道我們現在還可以通過ssh來進行遠程文件系統的共享。你可能會說這有什麼希奇的,不就是ssh遠程登錄嘛,再不就是sftp或者scp之類的方式,總之,這些東西熟的不能再熟了。可是我在這裡要說的可不是這些東西,我要說的是通過sshfs來將遠程主機的文件系統掛載到本地,之後就可以像使用本地文件系統一樣使用遠程文件系統了。看到這裡,大家是否覺得有興趣了呢?接下來讓我們看看到底怎麼來作到這點。

實際上,使用sshfs掛載遠程主機的方法還不只一種,目前我知道的方法有三種,第一種是通過基於lufs的sshfs子系統來完成,第二種是通過基於fuse的sshfs程序來完成,而第三種直接通過內核支持的shfs模塊就可以了。經測試,通過第二種方法來掛載的遠程主機文件系統比第一種方法要穩定的多,而第三種方法是最簡單也是跟系統接合最好的。第一種方法如果跟autofs來配合,可以更方便的掛載遠程文件系統,不過在這樣掛載的文件系統上直接打開歌曲或者電影之類的文件可能有些問題,我在以這種方式掛載的系統上聽歌時,如果再對這個文件系統上的其他文件進行操作,歌曲就會停止播放。而通過後兩種方法掛載的系統就沒有這個問題。所以我們這裡只說明後兩種方法。第一種方法大家如果有興趣可以自己研究。

這裡以debian系統來作說明是因為我使用的系統是debian,我沒有在其他linux系統上做過實驗,但其他linux系統應該也是可以的。

一、通過sshfs掛載遠程主機文件系統

首先,需要下載sshfs,這一步很簡單:

# apt-get install sshfs

另外它是基於fuse模塊的,所以必須要保證你的內核模塊裡已經有了這個模塊,debian系統的內核默認是沒有編譯這個模塊的,不過安裝這個模塊在debian下很簡單,首先下載fuse的源碼包和工具包以及編譯需要用到的程序。

# apt-get install fuse-source fuse-utils debconf-utils debhelper dpatch gettext html2text intltool-debian po-debconf devscripts kernel-package dpkg-dev module-assistant

設置環境變量:

# export KVERS=$(uname -r)

# export KSRC=/usr/src/kernel-headers-$KVERS

下載內核頭文件:

# apt-get install kernel-headers-$KVERS

現在進入/usr/src內可以找到頭文件和fuse模塊的源碼包,然後我們解壓編譯。

# cd /usr/src

# tar jxvf fuse.tar.jz

編譯fuse模塊:

# cd /usr/src/modules/fuse

# debian/rules binary_modules

好,完成編譯,編譯完的debian包可以在/usr/src/modules/(或者/usr/src/)中找到。

安裝剛剛編譯的fuse模塊。

# dpkg -i /usr/src/modules/fuse*.deb

好了現在第一步完成了。下面可以測試一下是否可以使用sshfs了。

首先創建一個掛載點(這裡我以remotehost這個名字為例,你可以使用任何你喜歡的名字):

# mkdir /mnt/remotehost 然後可以試試是否可以掛載遠程主機文件系統了。首先我們要有一台可以通過ssh遠程登錄的機器,假設這台機器是192.168.1.1吧,它不需要作什麼設置,只要保證它ssh服務是打開的,我們就可以掛載它的文件系統了。

# sshfs [email protected]:/ /mnt/remotehost -o sshfs_sync -o default_permissions,allow_other, allow_root,kernel_cache,hard_remove

現在它可能會提示輸入密碼,輸入ssh登錄時需要的遠程主機的root帳號密碼就可以了。現在看一下是否掛載好了。

# cd /mnt/remotehost # ls

如果掛載成功,現在應該可以看到遠程機器的文件了。而且你如果使用X Window,你還可以通過文件管理器來浏覽查看文件,就象使用本地硬盤一樣方便了。

卸載文件系統也很簡單,只需要輸入:

# umount /mnt/remotehost

就可以了。怎麼樣,不錯吧?

怎麼,你還覺得麻煩?是啊,現在每次都要通過命令行才能掛載,卸載,而且每次還都要輸入密碼,我也覺得好麻煩啊。如果能在開機時自動掛載,關機重啟時自動卸載就方便了。別著急,下面我來介紹一種方法來實現這個願望。此法乃原創,不足之處希望大家批評指正。

首先要解決的是怎樣免去輸入密碼這一步,這個簡單,在debian參考手冊的9.5.3節──用更少的密碼建立連接中可以查到。這裡就不轉載了。這裡只就這個例子來說明一下。

首先要保證192.168.1.1上的/etc/ssh/sshd_config中設置了”PubkeyAuthentication yes”然後在本地以root帳號執行以下操作,之所以使用root帳號是因為掛載文件系統時需要用root帳號。

# ssh-keygen -t rsa # cat ~/.ssh/id_rsa.pub | ssh [email protected] "cat - >>.ssh/authorized_keys"

這裡第一條命令執行時,可能讓你輸入passphrase,保留為空直接回車就可以了。而執行第二條命令時,需要輸入遠程系統root帳號的密碼,這時必須輸入正確的密碼才能成功。

現在可以試試我們上面的操作是否起作用了。

# ssh [email protected]

如果不需要密碼就已經登錄了遠程系統的話,那麼恭喜你,成功了!現在退回到你自己的系統來繼續完成下面最重要的工作吧,創建自動啟動腳本。

進入/etc/init.d目錄,創建下面兩個文件。

第一個文件是mountsshfs,下面是文件內容。

#!/bin/sh # # mountsshfs Mount SSH filesystems. # # Version: @(#)mountsshfs 1.00-1 15-Apr-2005 [email protected] #

PATH=/sbin:/usr/sbin:/bin:/usr/bin export PATH

# # Mount SSH file systems in /etc/sshfstab. # echo -n "Mounting SSH filesystems..." if [ -f /etc/sshfstab ] ; then ( cat /etc/sshfstab ; echo ) | sed -e '/^#/d' -e '/^$/d' | ( while read host mount_point sshfs_options fuse_options do sshfs $host $mount_point -o $sshfs_options -o $fuse_options done ) fi echo "done"

: exit 0

第二個文件是umountsshfs,下面是文件內容。

#!/bin/sh # # umountsshfs Unmount SSH filesystems. # # Version: @(#)umountsshfs 1.00-1 15-Apr-2005 [email protected] #

PATH=/sbin:/usr/sbin:/bin:/usr/bin export PATH

# # Unmount SSH file systems in /etc/mtab. # echo -n "Unmounting SSH filesystems..." if [ -f /etc/mtab ] ; then ( cat /etc/mtab ; echo ) | sed -e '/^#/d' -e '/^$/d' | ( while read host mount_point options do if echo $host | awk '{ if ( substr($0, 1, 6) == "sshfs#" ) exit 0; else exit 1 }' ; then umount $mount_point fi done ) fi echo "done"

: exit 0

好了,接下來到/etc目錄下來創建一個sshfstab,這個文件功能跟fstab類似,不過這裡面只包含需要開機是掛載的sshfs文件系統,而不包括其他文件系統的信息。我們還是以上面的例子來創建這個文件:

# /etc/sshfstab: SSH file system information. # # [email protected]:/ /mnt/remotehost sshfs_sync default_permissions,allow_other,allow_root, kernel_cache,hard_remove

這個文件中要掛載的系統可以包含多行,其中掛載點必須保證已經創建,上面的啟動腳本中不包含創建掛載點這步。

好了現在可以用:

# /etc/init.d/mountsshfs

來掛載所有的sshfs遠程文件系統了。然後用:

# /etc/init.d/umountsshfs

可以卸載所有已掛載的sshfs遠程文件系統。現在我們要把它添加到啟動裡面去。在/etc/rc0.d,/etc/rc6.d中分別創建一個指向/etc/init.d/umountsshfs的軟連接,注意軟連接的名字關系到執行順序。

# cd /etc/rc0.d # ln -s ../init.d/umountsshfs S15umountsshfs # cd /etc/rc6.d # ln -s ../init.d/umountsshfs S15umountsshfs

在/etc/rc2.d,/etc/rc3.d,/etc/rc4.d,/etc/rc5.d中分別創建一個指向/etc/init.d/mountsshfs的軟連接,注意軟連接的名字關系到執行順序。

# cd /etc/rc2.d # ln -s ../init.d/mountsshfs S85mountsshfs # cd /etc/rc3.d # ln -s ../init.d/mountsshfs S85mountsshfs # cd /etc/rc4.d # ln -s ../init.d/mountsshfs S85mountsshfs # cd /etc/rc5.d # ln -s ../init.d/mountsshfs S85mountsshfs

好了。現在重新啟動機器就可以了發現遠程文件系統現在已經成了你的“本地”文件系統了!

二、通過shfs掛載遠程主機文件系統

前面介紹的那種方法雖然可以在開機自動掛載,關機和重啟可以自動卸載sshfs文件系統了,但是它不能用mount來直接指定-t參數來掛載,因此也不能直接加到/etc/fstab種,而且用df也不能列出那樣的分區,所以你可能希望如果能像掛載普通分區那樣掛載sshfs文件系統就好了。這也不是不可能的,下面介紹的這種方法就可以滿足我們這個願望,它是通過內核的shfs模塊來實現的,它支持2.4.10以上和2.6的內核。這種方式我認為是最方便的。下面我們就看看怎麼來使用它。

首先你要保證你的系統已經安裝了shfs模塊,如果你是默認的debian內核,它是沒有這個模塊的,但是不用著急,我們可以跟上面編譯fuse模塊那樣去編譯這個shfs模塊,方法類似。因此下面只列出命令,不再詳細解釋了。

# apt-get install shfs-source shfs-utils debconf-utils debhelper dpatch gettext html2text intltool-debian po-debconf kernel-package module-assistant

# export KVERS=$(uname -r)

# export KSRC=/usr/src/kernel-headers-$KVERS

# apt-get install kernel-headers-$KVERS

# cd /usr/src

# tar jxvf shfs.tar.jz

# cd /usr/src/modules/shfs

# debian/rules binary_modules

# dpkg -i /usr/src/modules/shfs*.deb

好了,現在shfs模塊已經編譯安裝好了,現在可以直接用mount命令來掛載分區了。

# mount -t shfs [email protected]:/ /mnt/remotehost -o rmode=755,preserve

這裡假設/mnt/remotehost目錄已經按照前面那種方法建好了。現在可以跟上面一樣使用/mnt/remotehost來存取遠程主機的文件系統了,是不是很方便啊?

好了,如果想要開機掛載,關機重啟卸載就更方便了。首先還是要做免去ssh登錄密碼輸入這步,這同上面那種方法中介紹的一樣,這裡就不在重復了。下面假設這步工作已經完成了,然後只需要修改一下/etc/fstab就可以了。而不再需要自己去編寫什麼mountsshfs,umountsshfs腳本,也不在需要建立/etc/sshfstab這個文件了。

[email protected]:/ /mnt/remotehost shfs rmode=755,preserve 0 0

添加上面這行到/etc/fstab中,就可以直接開機掛載了,關機和重啟卸載了,非常簡單。


Copyright © Linux教程網 All Rights Reserved