File System over SSH Protocol

ปกติแล้ว Nautilus มันสามารถ connect network drive ผ่านทาง SSH ได้อยู่แล้ว โดยมันจำลองการทำงานเสมือนเป็น file system ผ่านทาง GNOME-VFS ซึ่งแปลว่ามันยังไม่ใช่ file system จริงๆ วันนี้คุยกับพี่ CoolNetClub ในห้อง #tlwg เรื่อง NFS กับ network drive ผ่าน SSH คุ้นๆ ว่าเคยเห็น sshfs แต่ยังไม่เคยลองซะที ก็เลยอาศัยโอกาสนี้ทดลองใช้ซักหน่อย

sshfs

sshfs อาศัย ssh/sftp/scp เป็นช่องทางในการ mount พื้นที่ในเครื่องๆ นึงมาเป็นส่วนนึงของ file system จริงๆ โดยใช้ Filesystem in Userspace (FUSE) ซึ่งเคอร์เนลของลินุกซ์สนับสนุนมาตั้งแต่รุ่น 2.6.14 สำหรับคนทีคอมไพล์เคอร์เนลเองก็ต้องคอนฟิก FUSE_FS=Y หรือ M ก็ได้

หลังจากได้เคอร์เนลที่สนับสนุน FUSE แล้ว ทีนี้ก็ติดตั้ง sshfs กัน .. บน Ubuntu ก็ง่ายหน่อย

# aptitude install sshfs

ซึ่งจะติดตั้ง sshfs พร้อมกับ dependencies (e.g. fuse-utils + libfuse2) ที่จำเป็น

จากนั้นเพิ่ม user ที่ต้องการใช้ FUSE เข้าไปอยู่ใน group fuse .. อันนี้จำเป็นต้องทำเพราะค่าปริยายแล้วโปรแกรมใน userspace มันบังคับให้เฉพาะ user ใน group fuse เท่านั้นที่ execute ได้

# usermod -G fuse -a username

ถ้าแก้ไข user ที่กำลัง login อยู่ อาจจะต้อง logout ออกจากระบบก่อน แล้ว login เข้ามาใหม่ถึงจะเริ่มมีผล

Mount!

สำหรับการใช้งานสำหรับคนที่คอมไพล์ FUSE_FS เป็นเคอร์เนลมอดูลก็สั่ง modprobe ซะก่อน

# modprobe fuse

จากนั้นก็สั่ง mount กัน

$ sshfs [email protected]:/path/ /mount/point/

sshfs ก็จะให้ใส่ password (หรืออาจจะต้องไม่ใส่ถ้าใช้ public-key authentication) พอผ่านขั้นตอน authentication ได้ sshfs ก็จะ mount /path/ บน host.domain.tld มาเป็นส่วนนึงของเครื่องที่เรียกใช้ sshfs .. ลองสั่ง mount ดูสักหน่อย

$ mount
...
...
...
sshfs#[email protected]:/path on /mount/point type fuse (rw,nosuid,nodev,max_read=65536,user=username)

จะเห็นว่า sshfs มัน mount พื้นที่ปลายทางมาเป็นส่วนนึงของ filesystem ของเราเรียบร้อย .. ทีนี้ทดสอบกันด้วยคำสั่งทั่วๆ ไปที่ทำงานกับ filesystem เช่น

$ ls /mount/point/

ก็จะเห็นไฟล์ที่อยู่บนเครื่อง host.domain.tld .. จะก๊อปปี้ไฟล์ ฯลฯ ก็ทำได้สบายๆ ไม่ต้องง้อ NFS

วิธี unmount ก็ใช้คำสั่ง fusermount -u เช่น

$ fusermount -u /mount/point

ปิดท้าย … สังเกตดูจะเห็นว่าการ mount / unmount FUSE ไม่จำเป็นต้องใช้สิทธิของ root เลย … เจ๋ง :D