rsync dùng kết nối ssh nên trên NAS phải bật dịch vụ ssh và rsync
Để bảo mật, cần đổi port 22 thành số khác, thí dụ 2222
Chuẩn bị
# user cần có thư mục home
Control Panel -> User & Group -> Advanced: Enable user home service
SSH vào NAS
Khi kết nối với NAS bằng ssh cần có username/password của user.
# Nhập mật khẩu thủ công
ssh -p port_number username@NAS_IP
# Dùng sshpass (cần cài đặt sshpass)
sshpass -p 'p@sSw0rD' ssh -p 2222 user@nas.example.com
# Câu lệnh rsync dùng sshpass
sshpass -p "p@sSw0rD" rsync -ave 'ssh -p 2222' SRC user@NAS-IP:DEST
Có thể ghi mật khẩu vào file ~/.sshpass, khi đó câu lệnh tương ứng là
# Tạo file .sshpass
echo "p@sSw0rD" > ~/.sshpass
chmod 600 ~/.sshpass
# Câu lệnh ssh hay rsync trở thành
sshpass -f ~/.sshpass ssh -p 2222 user@NAS-IP
sshpass -f ~/.sshpass rsync -ave 'ssh -p 2222' SRC user@NAS-IP:DEST
SSH bằng public key
Nếu máy Linux có public/private key thì có thể copy public key sang NAS. Khi đó 2 máy sẽ chứng thực bằng key và không hỏi mật khẩu. Cần dùng user có quyền admin để làm thêm vài việc.
# copy public key sang NAS
ssh-copy-id admin@NAS-IP
# Đăng nhập vào NAS với user có quyền admin
sshpass -f ~/.sshpass ssh -p 2222 admin@NAS-IP
# Đổi thuộc tính thư mục và file để bảo mật
sudo chmod 700 -R ~/.ssh
# Thư mục home của user nếu có thuộc tính 777 sẽ không thể
# ssh được, cần đổi thành 755 hay 711
sudo chmod 755 /volume1/homes/admin
# Câu lệnh ssh, rsync không hỏi mật khẩu
ssh -p 2222 user@NAS_IP:DEST
rsync -axH --delete -e 'ssh -p 2222' SRC admin@NAS_IP:DEST
# Thí dụ: đồng bộ thư mục photo
rsync -axH -e 'ssh -p 2222' /mnt/photo/ admin@IP:/volume1/photo
SSH với user root
# Tạo thư mục .ssh
sudo mkdir -p /root/.ssh
# Chép public key vào .ssh
sudo cp /volume1/admin/id_rsa.pub /root/.ssh/authorized_keys
sudo chmod 700 -R /root/.ssh
sudo chown root:root /root/.ssh/authorized_keys
# Không đổi thuộc tính của thư mục root
Backup RPi OS
#!/bin/bash
# backup2nas.sh
# Backup toàn bộ OS của RPi vào NAS #
# LNT <lnt@lyle.info>
# -------------------
## Tài khoản trên NAS
rUsr='user@NAS_IP'
## SSH port
port=22
## Thư mục chứa file backup
bkDir="$rUsr:backup/$(hostname)"
SECONDS=0
## Tìm swapfile để không backup
W=$(grep -Po '(?<=CONF_SWAPFILE=)(.+)' /etc/dphys-swapfile)
[ "$(df -P $W | awk 'NR==2{print $NF}')" = "$r" ] || W=''
x=$(mktemp)
cat <<EOF>$x
$W
var/log/*
var/tmp/*
tmp/*
EOF
## Tạo thư mục backup
ssh -p 2122 $rUsr mkdir -p $bkDir/{boot,rootfs}
echo "+ Sao lưu boot"
rsync -e "ssh -p $port" -azxH --delete --info=progress2 --exclude-from="$x" /boot $bkDir 2>/dev/null
echo "+ Sao lưu rootfs"
rsync -e "ssh -p $port" -azxH --delete --info=progress2 --exclude-from="$x" / $bkDir/rootfs 2>/dev/null
rm $x
## Tính thời gian sao lưu
duration=$SECONDS
printf "\nSao lưu OS trong $(( $duration / 60 )) phút và $(( $duration % 60 )) giây!\n"
Chú thích
- rsync không tạo được shared folder trên /volume1 nên phải rsync vào thư mục đã có
- Không dùng –-delete khi rsync vì có thể bị mất các file index hay các file/thư mục ẩn trên NAS
- Nếu Syno Drive client được thiết lập sync với Team Folder và trên Team Folder có những file khác tên trên Linux nhưng lại trùng tên trên Windows như eXaMpLe và example, khi đó rsync không thể sync các file/thư mục này nhưng không báo lỗi.
- Thuộc tính các thư mục nên như sau:
ash-4.4# ls -al ./homes
total 0
drwx-----x 1 root root 78 Aug 19 19:52 . # 701 homes
drwxr-xr-x 1 root root 740 Aug 19 17:31 .. # 755 volume1
drwxrwxrwx+ 1 admin users 28 Aug 19 17:04 admin # 755 user's home
drwxrwxrwx+ 1 backup users 48 Aug 19 20:17 backup
drwxrwxrwx+ 1 root root 134 Aug 19 20:22 @eaDir
drwxrwxrwx+ 1 root root 22 Aug 19 17:09 '#recycle'