Mount Synology NAS vào Kubuntu/Ubuntu Desktop bằng rclone VFS Cache
Hướng dẫn triển khai mount Synology NAS từ xa (qua WireGuard) thành một “ổ đĩa làm việc” trên Linux Desktop, dùng rclone với VFS cache thay cho Synology Drive và CIFS/SMB.
Bối cảnh
Tình huống thực tế: máy Kubuntu Desktop đặt tại văn phòng, Synology NAS đặt tại homelab ở nhà, kết nối với nhau qua WireGuard site-to-site tunnel. Nhu cầu là truy cập NAS như một ổ đĩa cục bộ để làm việc hằng ngày — mở file, sửa code, đọc tài liệu — mà không phải đồng bộ toàn bộ dữ liệu xuống máy.
Ba hướng tiếp cận phổ biến, và lý do tôi loại bỏ hai trong số đó:
Synology Drive Client. Cơ chế của Drive là sync — chọn folder nào thì nó kéo toàn bộ folder đó xuống đĩa local. Không có cache theo nhu cầu (on-demand), không giới hạn được dung lượng chiếm dụng một cách linh hoạt. Với một NAS chứa hàng trăm GB, đây là phương án ngốn ổ cứng laptop nhanh chóng. Đây chính là lý do ban đầu khiến tôi phải tìm giải pháp khác.
CIFS/SMB mount qua fstab. Mount được, mọi ứng dụng nhìn thấy như ổ local, setup đơn giản. Nhưng với workload làm việc thực tế thì điểm yếu lộ rõ:
- Metadata operations chậm.
lsmột thư mục nhiều file, file search, file manager indexing — mỗi thao tác đều đi qua network. - Không có local cache. Mỗi lần đọc một file đã đọc rồi vẫn phải kéo lại qua đường truyền.
- Editor/IDE (VSCode…) mở project trên CIFS mount bị lag rõ rệt do số lượng lớn lời gọi
stat(). git statustrên repo lớn cực kỳ chậm.- VPN drop khiến ứng dụng đang mở file bị treo hoặc lỗi.
CIFS chấp nhận được nếu chỉ thao tác file Office/tài liệu lác đác. Với code repo hay workload metadata-heavy thì không dùng nổi.
rclone mount với VFS cache. Đây là giải pháp tôi chọn. Lý do kỹ thuật cụ thể ở phần sau.
Tại sao chọn rclone VFS Cache
rclone không chỉ là công cụ sync — rclone mount với chế độ --vfs-cache-mode full biến một remote storage thành một filesystem có tầng cache cục bộ thông minh:
VFS cache theo nhu cầu. Chỉ file nào thực sự được mở mới được cache xuống đĩa local. Metadata (cấu trúc thư mục, danh sách file) được cache riêng và toàn bộ, nên thao tác duyệt thư mục gần như tức thời sau lần quét đầu. Đây là điểm khác biệt căn bản so với Synology Drive: không sync mù toàn bộ, chỉ giữ cái đang dùng.
Write-back cache. Khi ghi file, dữ liệu được ghi vào cache local trước rồi đẩy lên NAS ở background. Trải nghiệm sửa và lưu file mượt như làm trên ổ đĩa cục bộ, không bị blocking theo độ trễ mạng.
Giới hạn dung lượng cache + LRU eviction. Đặt được trần dung lượng cache (ví dụ 40GB). Vượt ngưỡng, rclone tự động xóa file ít dùng nhất theo cơ chế LRU. Đây chính là thứ Synology Drive không làm được.
Partial read. Mở một file lớn không cần tải toàn bộ — rclone đọc theo chunk.
Khả năng chịu lỗi. VPN gián đoạn tạm thời không làm crash mount; các thao tác ghi đang chờ được đưa vào hàng đợi và retry khi kết nối phục hồi.
So sánh thực tế giữa CIFS và rclone+VFS với cùng một NAS từ xa:
| Thao tác | CIFS | rclone + VFS |
|---|---|---|
ls thư mục ~1000 file (lần đầu) | 3–5s | 3–5s |
ls thư mục ~1000 file (lần 2) | 3–5s | gần như tức thời |
| Mở lại file vừa đóng | 2–4s | gần như tức thời |
git status repo lớn | 30–60s | 2–3s (sau khi cache) |
| IDE index project | gần như không dùng được | hoạt động tốt |
| Lưu file đang sửa | blocking | tức thời (write-back) |
Một lựa chọn thiết kế đáng nói: tôi dùng SFTP backend của rclone thay vì SMB backend. Lý do là SFTP ổn định hơn khi đi qua VPN/internet, chỉ cần dịch vụ SSH (Synology có sẵn), và xác thực bằng SSH key thay vì lưu username/password.
Kiến trúc giải pháp
1
2
3
4
5
6
7
8
┌─────────────────────┐ WireGuard ┌──────────────────────┐
│ Kubuntu Desktop │ site-to-site tunnel │ Homelab (tại nhà) │
│ (văn phòng) │ ─────────────────────────▶ │ │
│ │ │ Synology NAS │
│ rclone mount │ SFTP over SSH (port tùy) │ - SSH/SFTP service │
│ + VFS cache (local) │ ◀───────────────────────── │ - share: home, ... │
│ ~/SYNOLOGY_NAS │ │ │
└─────────────────────┘ └──────────────────────┘
Các thành phần:
- WireGuard: tunnel giữa văn phòng và homelab. Phần này coi như đã có sẵn.
- Synology SSH/SFTP: backend truyền dữ liệu.
- rclone SFTP remote: cấu hình kết nối, xác thực bằng SSH key.
- rclone mount + VFS cache: filesystem ảo có tầng cache, mount vào home directory.
- systemd user service: tự động khởi động, tự restart khi lỗi.
Triển khai
Yêu cầu tiên quyết
- WireGuard tunnel đã hoạt động, máy Desktop resolve và kết nối được tới NAS (qua FQDN nội bộ hoặc IP).
- Trên Synology DSM: đã bật SSH service (Control Panel → Terminal & SNMP) và SFTP service (Control Panel → File Services → FTP → SFTP). Lưu ý hai dịch vụ này tách biệt — SSH login được không có nghĩa SFTP đã bật.
- User trên NAS có quyền truy cập share cần mount.
Bước 1: Cài đặt gói cần thiết
1
2
3
4
5
sudo apt update
sudo apt install fuse3 -y
# Cài rclone bản mới nhất từ upstream
sudo -v ; curl https://rclone.org/install.sh | sudo bash
fuse3 là bắt buộc cho rclone mount. Không nên dùng bản rclone từ apt vì thường cũ.
Bước 2: Tạo SSH key xác thực
1
2
ssh-keygen -t ed25519 -f ~/.ssh/synology_nas -C "kubuntu-office"
ssh-copy-id -i ~/.ssh/synology_nas.pub your_user@nas.your-domain.internal
Synology rất nghiêm ngặt về quyền file SSH. Sau khi copy key, đăng nhập vào NAS và chỉnh quyền:
1
2
3
4
ssh your_user@nas.your-domain.internal
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
exit
Xác minh đăng nhập bằng key không cần mật khẩu:
1
ssh -i ~/.ssh/synology_nas your_user@nas.your-domain.internal
Bước 3: Cấu hình rclone remote
Tạo trực tiếp file cấu hình thay vì dùng rclone config tương tác cho gọn:
1
nano ~/.config/rclone/rclone.conf
1
2
3
4
5
6
7
8
[synology_nas]
type = sftp
host = nas.your-domain.internal
user = your_user
port = 22
key_file = ~/.ssh/synology_nas
known_hosts_file = ~/.config/rclone/known_hosts_synology
shell_type = unix
Lưu ý quan trọng:
port: nếu bạn đổi port SSH của Synology khỏi mặc định 22 (khuyến nghị về bảo mật), phải khai báo đúng port ở đây.known_hosts_file: nên trỏ tới một file riêng cho rclone thay vì dùng chung~/.ssh/known_hosts, để host key validation rõ ràng và không xung đột với SSH thông thường.
Tạo file known_hosts riêng (thay -p 22 bằng port thực tế nếu khác):
1
ssh-keyscan -p 22 nas.your-domain.internal 2>/dev/null > ~/.config/rclone/known_hosts_synology
Kiểm tra kết nối — phải liệt kê được các share folder:
1
rclone lsd synology_nas:
Bước 4: Test mount thủ công
Luôn test foreground trước khi đưa vào systemd, để thấy lỗi ngay nếu có:
1
2
3
4
5
6
7
8
mkdir -p ~/SYNOLOGY_NAS ~/.cache/rclone
rclone mount synology_nas:home ~/SYNOLOGY_NAS \
--vfs-cache-mode full \
--vfs-cache-max-size 40G \
--vfs-cache-max-age 168h \
--dir-cache-time 24h \
--log-level INFO
Mở terminal khác, kiểm tra đọc/ghi:
1
2
ls ~/SYNOLOGY_NAS
echo "test" > ~/SYNOLOGY_NAS/_test.txt && cat ~/SYNOLOGY_NAS/_test.txt
OK thì Ctrl+C để dừng, chuyển sang chạy bằng systemd.
Bước 5: systemd user service
Dùng user service (không phải system service) để mount thuộc đúng user, không cần sudo, quản lý per-user gọn gàng.
1
2
mkdir -p ~/.config/systemd/user
nano ~/.config/systemd/user/rclone-synology.service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[Unit]
Description=Rclone mount Synology NAS
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStartPre=/bin/mkdir -p %h/SYNOLOGY_NAS
ExecStart=/usr/bin/rclone mount synology_nas:home %h/SYNOLOGY_NAS \
--config=%h/.config/rclone/rclone.conf \
--vfs-cache-mode full \
--vfs-cache-max-size 40G \
--vfs-cache-max-age 168h \
--vfs-cache-poll-interval 1m \
--vfs-read-chunk-size 32M \
--vfs-read-chunk-size-limit 256M \
--dir-cache-time 24h \
--poll-interval 15s \
--buffer-size 64M \
--transfers 8 \
--attr-timeout 1s \
--rc \
--rc-addr localhost:5572 \
--rc-no-auth \
--log-level INFO \
--log-file %h/.cache/rclone/mount.log
ExecStop=/bin/fusermount3 -uz %h/SYNOLOGY_NAS
Restart=on-failure
RestartSec=10
Environment="PATH=/usr/bin:/bin"
[Install]
WantedBy=default.target
Kích hoạt:
1
2
3
systemctl --user daemon-reload
systemctl --user enable --now rclone-synology.service
systemctl --user status rclone-synology.service
Cho phép service chạy cả khi đã logout:
1
sudo loginctl enable-linger $USER
Bước 6: Xử lý suspend/resume
Đây là bước không nên bỏ qua với laptop. Khi máy suspend rồi resume, VPN mất kết nối vài giây khiến rclone mount thành stale — ls ~/SYNOLOGY_NAS sẽ bị treo. Cần một hook tự remount sau khi resume.
1
sudo nano /etc/systemd/system/rclone-synology-resume.service
1
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=Restart rclone Synology mount after resume
After=suspend.target hibernate.target
[Service]
Type=oneshot
User=your_user
ExecStartPre=/bin/sleep 5
ExecStart=/usr/bin/systemctl --user --machine=your_user@.host restart rclone-synology.service
[Install]
WantedBy=suspend.target hibernate.target
1
2
sudo systemctl daemon-reload
sudo systemctl enable rclone-synology-resume.service
sleep 5 cho WireGuard kịp reconnect trước khi remount. Mạng VPN reconnect chậm thì tăng giá trị này lên.
Giải thích các flag quan trọng
| Flag | Tác dụng |
|---|---|
--vfs-cache-mode full | Bắt buộc. Bật cache đầy đủ + write-back. Thiếu flag này thì rclone mount gần như vô dụng cho workload làm việc. |
--vfs-cache-max-size 40G | Trần dung lượng cache local. Vượt ngưỡng tự động eviction theo LRU. |
--vfs-cache-max-age 168h | File không truy cập quá 7 ngày bị xóa khỏi cache. |
--dir-cache-time 24h | Cache directory listing 24h → ls tức thời. |
--poll-interval 15s | Chu kỳ kiểm tra thay đổi phía NAS → cache tự invalidate nếu file bị sửa từ máy khác. |
--vfs-read-chunk-size 32M | Đọc file lớn theo chunk, tăng dần tới giới hạn. |
--buffer-size 64M | Memory buffer cho mỗi file đang đọc. |
--rc --rc-addr localhost:5572 | Bật remote control API để refresh cache thủ công khi cần. Chỉ bind localhost. |
Vận hành hằng ngày
Mount hoạt động trong suốt như một thư mục cục bộ:
1
cd ~/SYNOLOGY_NAS
Một số lệnh hữu ích:
1
2
3
4
5
6
7
8
9
# Khi file bị sửa từ máy/thiết bị khác, ép NAS refresh metadata
rclone rc vfs/refresh recursive=true --rc-addr localhost:5572
# Theo dõi tình trạng cache
rclone rc vfs/stats --rc-addr localhost:5572
du -sh ~/.cache/rclone/vfs/
# Xem log khi nghi vấn
tail -f ~/.cache/rclone/mount.log
Một lưu ý quan trọng: file indexer của desktop
KDE Plasma (Baloo) và một số desktop environment khác có dịch vụ index file nền. Khi mount một NAS chứa hàng trăm nghìn file, indexer sẽ cố crawl toàn bộ, kéo dữ liệu qua VPN liên tục, làm phình cache và tốn băng thông vô ích.
Với KDE, loại trừ thư mục mount khỏi index:
1
2
3
balooctl status
balooctl config add excludeFolders ~/SYNOLOGY_NAS
balooctl disable && balooctl enable # reload config
Đây là bước nên làm chủ động bất kể, vì sớm muộn indexer cũng gây vấn đề trên mount network lớn.
Đánh đổi cần biết
Giải pháp này tốt cho workload làm việc tương tác, nhưng có những điểm cần cân nhắc:
- File locking không mạnh. Nếu cần mở cùng một file (DB, Excel) đồng thời từ nhiều máy và phụ thuộc vào file lock, CIFS phù hợp hơn. Với workflow cá nhân thì không vấn đề.
- Pending writes khi VPN drop. File đã lưu nhưng chưa kịp upload sẽ nằm trong cache, rclone tự retry khi kết nối phục hồi. Có thể kiểm tra qua
vfs/stats. - Không emit inotify cho thay đổi phía NAS. Tính năng auto-reload/hot-reload của một số IDE sẽ không bắt được file bị sửa từ phía NAS. Không vấn đề khi chỉ làm việc từ một máy.
- Không phù hợp làm công cụ backup. Nếu mục tiêu là backup, dùng
rsync over SSHhoặcresticthay vì mount filesystem. rclone mount hợp cho truy cập file như ổ đĩa, không phải đồng bộ backup khối lượng lớn.
Kết luận
Với bài toán “dùng NAS từ xa như ổ đĩa làm việc mà không ngốn ổ cứng local”, rclone với --vfs-cache-mode full là giải pháp cân bằng tốt nhất giữa trải nghiệm sử dụng và mức tiêu thụ tài nguyên. Nó giải quyết đúng hai điểm yếu chí mạng của hai phương án còn lại: sync mù toàn bộ của Synology Drive, và độ trễ network không cache của CIFS.
Setup ban đầu tốn công hơn mount CIFS một dòng fstab, nhưng đổi lại là một môi trường làm việc ổn định, tự phục hồi, và kiểm soát được dung lượng — đáng để đầu tư nếu đây là mount bạn dùng hằng ngày.