คุณตั้งค่าการเมานต์ SSHFS ตรวจสอบว่าใช้งานได้ รีบูต Debian แล้วจู่ๆ ไดเร็กทอรีระยะไกลก็ว่างเปล่าอีกครั้ง คำสั่งแบบแมนนวลใช้งานได้เพราะคุณล็อกอินอยู่แล้ว เครือข่ายออนไลน์อยู่แล้ว และ SSH สามารถถามคำถามได้หากต้องการรหัสผ่านหรือการยืนยันคีย์โฮสต์ การเมานต์ตอนบูตเครื่องไม่มีความสะดวกสบายเหล่านั้น
วิธีแก้ไขที่ได้ผลคือการตั้งค่าการตรวจสอบสิทธิ์ SSH ให้เป็นแบบไม่โต้ตอบ สร้าง/etc/fstabรายการถาวร และบอก systemd ว่าระบบไฟล์นั้นขึ้นอยู่กับเครือข่าย คู่มือนี้เริ่มต้นด้วยการตั้งค่าที่ง่ายที่สุดที่ใช้งานได้ จากนั้นจึงเพิ่มตัวเลือกสำหรับเครือข่ายที่ช้าและการเชื่อมต่อ SSH ที่หลุด ตัวอย่างใช้user@server.example.com:/srv/dataเป็นไดเร็กทอรีระยะไกลและ/mnt/remoteเป็นจุดเชื่อมต่อในเครื่อง
ปัจจุบันหน้าแพ็กเกจของ Debian ระบุว่า SSHFS คือเวอร์ชัน 3.7.3 สำหรับ Debian 12 (Bookworm) และ SSHFS ใช้ระบบย่อย SFTP ที่จัดให้โดย SSH ดู รายละเอียดเพิ่มเติมได้ ที่หน้าแพ็กเกจ SSHFS ของ Debianและคู่มือ SSHFS จากแหล่งต้นทางการแก้ไขแพ็กเกจอาจแตกต่างกันไปในแต่ละรุ่นของ Debian แต่แนวทางการบูต-เมานต์ด้านล่างนี้อิงตามพฤติกรรมมาตรฐานของ fstab และ systemd
เหตุใดการเมานต์ SSHFS จึงใช้งานได้ด้วยตนเอง แต่ล้มเหลวเมื่อบูตเครื่อง?
สาเหตุหลักสามประการที่ทำให้การเชื่อมต่อล้มเหลว ได้แก่ ประการแรก การเชื่อมต่อ SSH อาจยังคงต้องการรหัสผ่าน วลีรหัสผ่าน หรือการยืนยันคีย์โฮสต์ครั้งแรก ซึ่งในระหว่างการบูตระบบนั้นไม่มีเทอร์มินัลให้ตอบคำถามเหล่านั้น ประการที่สอง การเมานต์อาจเริ่มต้นก่อนที่เครือข่ายหรือ DNS จะใช้งานได้อย่างสมบูรณ์ ประการที่สาม การเชื่อมต่อ SSH ที่ใช้งานมานานอาจใช้งานไม่ได้ในภายหลังเนื่องจากการหยุดชะงักของเครือข่าย
เอกสาร systemd ของ Debian อธิบายว่า_netdevตัวเลือกนี้บังคับให้การเมานต์ถือเป็นการเมานต์เครือข่าย การเมานต์เครือข่ายจะถูกจัดลำดับหลังจากnetwork-online.targetเอกสารเดียวกันนี้ยังระบุด้วยว่า/etc/fstabรายการต่างๆ จะถูกแปลงเป็นหน่วยการเมานต์ systemd ดั้งเดิมเมื่อบูตเครื่อง ดูsystemd.mount(5) ใน Debian
1. ติดตั้ง SSHFS และสร้างจุดเชื่อมต่อ (mount point)
ติดตั้งโปรแกรมไคลเอ็นต์ SSHFS ที่มาพร้อมกับแพ็กเกจ และสร้างไดเร็กทอรีภายในเครื่องที่จะใช้สำหรับเปิดเผยไฟล์ระยะไกล:
sudo apt update
sudo apt install sshfs
sudo mkdir -p /mnt/remote
SSHFS สร้างขึ้นบน FUSE ซึ่งเป็นอินเทอร์เฟซระบบไฟล์ในพื้นที่ผู้ใช้ของ Linux บน Debian 12 sshfsแพ็กเกจนี้ขึ้นอยู่กับ FUSE 3 และไคลเอ็นต์ OpenSSH
ติดตั้งแพ็กเกจ SSHFS และสร้างไดเร็กทอรีภายในเครื่องที่จะใช้เป็นจุดเชื่อมต่อ (mount point)
2. ตั้งค่าการตรวจสอบสิทธิ์ SSH ที่สามารถทำงานได้โดยไม่ต้องมีข้อความแจ้งเตือน
สำหรับการเมานต์ทั่วทั้งระบบที่เริ่มต้นโดย systemd การสร้างคีย์เฉพาะที่เป็นของ root นั้นทำได้ง่าย เนื่องจากตัวช่วยในการเมานต์ทำงานในฐานะ root ควรสร้างคีย์ที่ไม่มีรหัสผ่านเฉพาะในกรณีที่เครื่องนั้นได้รับความไว้วางใจ และคีย์นั้นถูกจำกัดไว้สำหรับวัตถุประสงค์นี้เท่านั้น:
sudo ssh-keygen -t ed25519 -f /root/.ssh/sshfs_remote
sudo ssh-copy-id -i /root/.ssh/sshfs_remote.pub user@server.example.com
คำสั่งที่สองโดยปกติจะขอรหัสผ่านบัญชีระยะไกลเพียงครั้งเดียว จากนั้นทดสอบตัวตนที่ถูกต้องโดยไม่ต้องมีการโต้ตอบ:
sudo ssh -i /root/.ssh/sshfs_remote -o BatchMode=yes user@server.example.com true
หากคำสั่งนั้นทำงานเสร็จสมบูรณ์โดยไม่มีข้อความแจ้งเตือนใดๆ แสดงว่าการตรวจสอบสิทธิ์พร้อมสำหรับการบูตแล้ว หากระบบขอให้ยืนยันลายนิ้วมือของเซิร์ฟเวอร์ ให้เชื่อมต่อแบบโต้ตอบหนึ่งครั้งในฐานะผู้ใช้ root ตรวจสอบลายนิ้วมือกับแหล่งที่เชื่อถือได้ และยอมรับ อย่าแก้ไขข้อผิดพลาดเกี่ยวกับคีย์โฮสต์โดยการปิดใช้งานการตรวจสอบโฮสต์
เอกสาร OpenSSH BatchMode=yesระบุเฉพาะสำหรับสคริปต์และงานแบตช์ เนื่องจากปิดใช้งานการป้อนรหัสผ่านและข้อความยืนยัน คีย์โฮสต์จะถูกตรวจสอบกับknown_hostsไฟล์ของผู้ใช้ ดูคู่มือ Debian ssh(1)และssh_config(5 )
เตรียมการเข้าถึง SSH โดยใช้คีย์ และตรวจสอบว่าสามารถเชื่อมต่อได้สำเร็จโดยไม่ต้องป้อนข้อมูลแบบโต้ตอบ
3. ยืนยันการเมานต์ SSHFS ด้วยตนเองก่อนแก้ไขไฟล์ fstab
อย่าทำการแก้ไขลำดับการบูตจนกว่าคำสั่ง SSHFS พื้นฐานจะทำงานได้ เมานต์ไดเร็กทอรีเพียงครั้งเดียวโดยใช้คีย์เดียวกัน:
sudo sshfs user@server.example.com:/srv/data /mnt/remote -o IdentityFile=/root/.ssh/sshfs_remote -o reconnect -o ServerAliveInterval=15 -o ServerAliveCountMax=3
ตรวจสอบว่าคุณสามารถแสดงรายการไฟล์ระยะไกลได้ จากนั้นยกเลิกการเชื่อมต่อก่อนทดสอบ fstab:
ls -la /mnt/remote
sudo fusermount3 -u /mnt/remote
คู่มือ SSHFS ฉบับดั้งเดิมแนะนำreconnectวิธีการเชื่อมต่อที่ถูกขัดจังหวะใหม่ นอกจากนี้ยังอธิบายถึงServerAliveIntervalวิธีป้องกันการเมานต์ที่ดูเหมือนค้างเมื่อการเชื่อมต่อ SSH ที่ไม่ได้ใช้งานถูกตัดขาดโดยไม่มีการแจ้งเตือน ด้วยช่วงเวลา 15 วินาทีและจำนวนการตรวจสอบที่ไม่ได้รับการตอบสนองตามค่าเริ่มต้นของ OpenSSH สามครั้ง การเชื่อมต่อที่ขาดจะถูกตรวจพบในเวลาประมาณ 45 วินาที ในที่นี้ได้เขียนจำนวนการตรวจสอบไว้อย่างชัดเจนเพื่อให้เห็นพฤติกรรมได้อย่างชัดเจน
4. เพิ่มรายการ SSHFS แบบถาวรลงในไฟล์ /etc/fstab
โปรดสำรองไฟล์ก่อนทำการแก้ไข:
sudo cp /etc/fstab /etc/fstab.backup
sudo nano /etc/fstab
เพิ่มบรรทัดเดียว:
user@server.example.com:/srv/data /mnt/remote fuse.sshfs _netdev,IdentityFile=/root/.ssh/sshfs_remote,BatchMode=yes,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,default_permissions 0 0
fuse.sshfsเครื่องมือการเมานต์ของ Debian เข้าใจชนิดย่อยนี้ คู่มือ SSHFS ต้นทางยังบันทึกเป็นsshfsประเภทระบบไฟล์ fstab และหมายเหตุ เพื่อความเข้ากันได้ คู่มือ fstab(5)fuse.sshfsของ Debian อธิบายฟิลด์ fstab ทั้งหกฟิลด์และแนะนำสัญกรณ์ชนิดย่อยของระบบไฟล์ เช่น.fuse.sshfs
| ตัวเลือก | เหตุใดจึงอยู่ที่นี่ |
_netdev | ทำให้ systemd มองว่าการเมานต์นั้นขึ้นอยู่กับเครือข่าย |
IdentityFile=... | เลือกใช้คีย์ส่วนตัวโดยตรง แทนที่จะพึ่งพาตัวแทนโต้ตอบ (interactive agent) |
BatchMode=yes | ล้มเหลวแทนที่จะรอการป้อนรหัสผ่านหรือการยืนยัน |
reconnect | อนุญาตให้ SSHFS สร้างการเชื่อมต่อที่ขาดหายไปขึ้นมาใหม่ได้ |
ServerAliveInterval=15 | ส่งสัญญาณตรวจสอบการเชื่อมต่อระดับ SSH ในช่วงเวลาที่ไม่ได้ใช้งาน |
ServerAliveCountMax=3 | จำกัดจำนวนการตรวจสอบการเชื่อมต่อที่ไม่ได้รับคำตอบก่อนที่จะตัดการเชื่อมต่อ SSH |
default_permissions | เปิดใช้งานการตรวจสอบสิทธิ์ในเครื่อง นอกเหนือจากการอนุญาตจากระยะไกล |
เพิ่มการเมานต์ SSHFS ลงในไฟล์ /etc/fstab โดยระบุตัวเลือกเครือข่าย ข้อมูลประจำตัว และการเชื่อมต่อใหม่ให้ชัดเจน
5. ทดสอบการตั้งค่าในไฟล์ fstab ก่อนรีบูตเครื่อง
การพิมพ์ผิดนั้น/etc/fstabแก้ไขได้ง่ายกว่ามากก่อนการรีบูต ให้ systemd โหลดหน่วยการเมานต์ที่สร้างขึ้นใหม่ จากนั้นทดสอบรายการนั้น:
sudo systemctl daemon-reload
sudo mount -a
findmnt -T /mnt/remote
ls -la /mnt/remote
หากmount -aไม่มีข้อผิดพลาดและfindmntรายงานfuse.sshfsแสดงว่าไวยากรณ์ fstab เป็นที่ยอมรับและระบบไฟล์จะถูกเมานต์คู่มือ mount(8) ของ Debian ยืนยันว่าmount -aเมานต์ระบบไฟล์ fstab ยกเว้นรายการที่ทำเครื่องหมายnoautoไว้
ตรวจสอบรายการในไฟล์ fstab ด้วยคำสั่ง mount -a, findmnt และหน่วยการเมานต์ systemd ที่สร้างขึ้นก่อนรีบูตเครื่อง
จะทำอย่างไรหากเครือข่ายไม่พร้อมใช้งานในเร็ววัน?
_netdevฟังก์ชันนี้ช่วยให้ systemd มีลำดับการทำงานที่ถูกต้อง แต่network-online.targetความแม่นยำนั้นขึ้นอยู่กับบริการจัดการเครือข่ายที่ให้บริการนั้นด้วย Wi-Fi, VPN, ความล่าช้าของ DHCP, ความล่าช้าของ DNS และสแต็กเครือข่ายที่ผิดปกติ อาจทำให้การเมานต์บูตทันทีไม่น่าเชื่อถือได้
ในกรณีนั้น ให้ใช้การเมานต์อัตโนมัติของ systemd เพื่อให้กระบวนการบูตสร้างจุดเมานต์อัตโนมัติและสร้างการเชื่อมต่อ SSHFS เฉพาะเมื่อมีการเข้าถึงครั้งแรกเท่านั้น/mnt/remoteเพิ่มx-systemd.automountตัวเลือกต่อไปนี้:
user@server.example.com:/srv/data /mnt/remote fuse.sshfs _netdev,x-systemd.automount,IdentityFile=/root/.ssh/sshfs_remote,BatchMode=yes,reconnect,ServerAliveInterval=15,ServerAliveCountMax=3,default_permissions 0 0
วิธีนี้มักเป็นตัวเลือกที่ดีกว่าสำหรับแล็ปท็อป ระบบ Wi-Fi หรือเซิร์ฟเวอร์ที่โฮสต์ระยะไกลอาจไม่สามารถใช้งานได้เป็นบางครั้ง หลักการทำงานจะเปลี่ยนไปเล็กน้อย: การเมานต์อัตโนมัติจะถูกเตรียมไว้ระหว่างการบูต แต่การเชื่อมต่อ SSH จริงจะเกิดขึ้นเมื่อเข้าถึงครั้งแรก หากแอปพลิเคชันใดต้องการให้เชื่อมต่อกับไดเร็กทอรีระยะไกลก่อนเริ่มทำงาน ให้คงการเมานต์เครือข่ายแบบปกติไว้ และกำหนดให้หน่วย systemd ของแอปพลิเคชันนั้นขึ้นอยู่กับหน่วยการเมานต์แทน
คุณต้องการ allow_other หรือไม่?
โดยค่าเริ่มต้น การเมานต์ FUSE จะสามารถเข้าถึงได้เฉพาะภายใต้สิทธิ์ที่เกี่ยวข้องกับบริบทการเมานต์เท่านั้น คู่มือ SSHFS allow_otherอธิบายถึงวิธีการอนุญาตให้ผู้ใช้ภายในเครื่องรายอื่นเข้าถึงได้ อย่าเพิ่มการอนุญาตนี้เว้นแต่ว่าบริการหรือบัญชีอื่น ๆ จำเป็นต้องใช้ไฟล์ที่เมานต์นั้นจริง ๆ
หากคุณใช้งานallow_otherโปรดตรวจสอบ/etc/fuse.confและทำความเข้าใจผลกระทบด้านความปลอดภัยของ FUSE ก่อน การใช้งานร่วมกับนั้นdefault_permissionsโดยทั่วไปแล้วเหมาะสม เพื่อไม่ให้ข้ามการตรวจสอบสิทธิ์ Unix ในเครื่อง บัญชี SSH ระยะไกลยังคงเป็นตัวกำหนดว่าเซิร์ฟเวอร์อนุญาตให้ดำเนินการใดได้บ้าง
การแก้ไขปัญหาการทำงานผิดพลาดของ SSHFS ในระหว่างการบูตเครื่อง
แท่นยึดรอรหัสผ่าน
ทำการทดสอบแบบไม่โต้ตอบซ้ำอีกครั้งsudo ssh ... -o BatchMode=yesหากล้มเหลว ให้แก้ไขการตรวจสอบสิทธิ์ด้วยคีย์สาธารณะก่อนที่จะแตะต้อง systemd คีย์ที่ได้รับการป้องกันด้วยรหัสผ่านจะต้องมีเอเจนต์หรือกลไกความลับในการบูตเครื่องอื่นด้วย การเมานต์ fstab แบบธรรมดาไม่สามารถพิมพ์รหัสผ่านให้คุณได้
การตรวจสอบคีย์โฮสต์ล้มเหลว
อย่าตั้งค่าStrictHostKeyChecking=noนี้เป็นการแก้ไขแบบเหมาหมด ตรวจสอบว่าเซิร์ฟเวอร์ได้รับการสร้างใหม่หรือมีการเปลี่ยนแปลงคีย์โฮสต์อย่างถูกต้องหรือไม่ การตรวจสอบคีย์โฮสต์ SSH เป็นมาตรการควบคุมความปลอดภัยเพื่อป้องกันการปลอมแปลงตัวตนและการโจมตีแบบคนกลาง (man-in-the-middle attacks)
การเมานต์ใช้งานได้หลังจากล็อกอิน แต่ใช้งานไม่ได้ระหว่างบูตเครื่อง
ตรวจสอบชื่อหน่วยที่สร้างขึ้นและบันทึกของหน่วยนั้น/mnt/remoteโดยปกติแล้ว systemd จะทำการหลีกเลี่ยงเส้นทางไปยังmnt-remote.mount:
systemctl status mnt-remote.mount
journalctl -b -u mnt-remote.mount
หากคุณเพิ่มสิ่งนี้x-systemd.automountโปรดตรวจสอบเพิ่มเติมด้วย:
systemctl status mnt-remote.automount
การเข้าถึงค้างหลังจากเซิร์ฟเวอร์หรือเครือข่ายหายไป
เปิดใช้ งาน Keepalive reconnectและ SSH keepalive แล้ว คู่มือ SSHFS ต้นฉบับเตือนว่า การทำงานของระบบไฟล์อาจหยุดชะงักอย่างไม่มีกำหนดหากตรวจไม่พบการเชื่อมต่อที่ขาด Keepalive ช่วยจำกัดขอบเขตการตรวจจับความล้มเหลว แต่ I/O ใดๆ ที่กำลังดำเนินการอยู่เมื่อการเชื่อมต่อขาดอาจยังคงล้มเหลวและอาจต้องลองใหม่อีกครั้งโดยแอปพลิเคชัน
วิธีตรวจสอบว่าการเชื่อมต่อยังคงใช้งานได้หลังจากการรีบูตหรือไม่
เมื่อmount -aดำเนินการสำเร็จแล้ว ให้รีบูตเครื่อง:
sudo reboot
หลังจากเชื่อมต่อใหม่แล้ว ให้ทำการตรวจสอบดังต่อไปนี้:
findmnt -T /mnt/remote
systemctl is-active mnt-remote.mount
ls -la /mnt/remote
หากคุณเลือกx-systemd.automountตัวเลือกนี้ หน่วยติดตั้งอาจไม่ทำงานจนกว่าจะมีการเข้าถึงครั้งแรก ตรวจสอบการติดตั้งอัตโนมัติก่อน จากนั้นจึงเรียกใช้งานด้วยคำสั่งls:
systemctl is-active mnt-remote.automount
ls -la /mnt/remote
findmnt -T /mnt/remote
การตั้งค่าที่ประสบความสำเร็จจะมีคุณสมบัติที่สังเกตได้สี่ประการ ได้แก่ การตรวจสอบสิทธิ์ SSH เสร็จสมบูรณ์โดยไม่ต้องมีการโต้ตอบใดๆ รายการใน fstab ผ่านการตรวจสอบmount -asystemd รู้จักการเมานต์ว่าเป็นแบบขึ้นอยู่กับเครือข่าย และสามารถเข้าถึงไฟล์ระยะไกลได้หลังจากการรีบูตที่สะอาด หากการตรวจสอบใดๆ ล้มเหลว ให้แก้ไขปัญหาในส่วนนั้นโดยตรง แทนที่จะเพิ่มตัวเลือกการเมานต์เพิ่มเติมแบบสุ่ม