Feature #827
Updated by Daniel Curtis about 8 years ago
Once in a while I will need to do a two-way synchronization of the contents of an owncloud sync folder to a specific USB drive, and having this task done automagically by systemd. *NOTE*: The USB drive used in this guide is FAT32. If using NTFS, you must install the ntfs-3g-fuse package from the AUR. * Make sure rsync is installed: <pre> sudo pacman -S rsync </pre> h2. Device Identification * Get the list of drives: <pre> sudo fdisk -l </pre> * Start by getting the device label: Install ntfs-3g: <pre> sudo blkid /dev/sdb1 pacman -S ntfs-3g </pre> * Make a temporary mount directory: <pre> sudo mkdir /media/SYNCSHARE </pre> * Edit Start by getting the fstab file: device label: <pre> sudo nano /etc/fstab blkid /dev/sdb1 </pre> #* Add an fstab entry *NOTE*: If a label does not exist, generate one for the SYNCSHARE device: partition to be automounted: <pre> UUID=ACE7-1996 /media/SYNCSHARE vfat users,noauto 0 0 sudo ntfslabel /dev/sdb1 SYNCSHARE </pre> h2. Sync Script * Create a simple two-way rsync script: <pre> sudo nano /usr/local/bin/syncshare.sh </pre> #* And add the following <pre> #!/bin/sh # Script to do a two-way sync with a USB drive if [ $(mount | grep -c /media/SYNCSHARE) != 1 ] then /sbin/mount /dev/disk/by-uuid/ACE7-1996 || exit 1 echo "/media/SYNCSHARE is now mounted" rsync -rtuv --exclude ".csync*" --exclude ".owncloud*" --delete /home/bob/owncloudshare/ /usr/share/owncloudshare/ /media/SYNCSHARE/owncloudshare/ rsync -rtuv --exclude ".csync*" --exclude ".owncloud*" /media/SYNCSHARE/owncloudshare/ /home/bob/owncloudshare/ sync notify-send "SYNCSHARE Finished Synchronizing!" sleep 5 umount /media/SYNCSHARE else rsync -rtuv --exclude ".csync*" --exclude ".owncloud*" --delete /home/bob/owncloudshare/ /media/SYNCSHARE/owncloudshare/ rsync -rtuv --exclude ".csync*" --exclude ".owncloud*" /media/SYNCSHARE/owncloudshare/ /home/bob/owncloudshare/ /usr/share/owncloudshare/ sync notify-send "SYNCSHARE Finished Synchronizing!" sleep 5 umount /media/SYNCSHARE fi </pre> * Then make it executable: <pre> sudo chmod +x /usr/local/bin/syncshare.sh </pre> h2. Systemd Service * Create a systemd unit file: <pre> sudo nano /etc/systemd/system/syncshare.service </pre> #* And add the following: <pre> [Unit] Description=SyncShare trigger Requires=media-SYNCSHARE.mount After=media-SYNCSHARE.mount [Service] ExecStart=/usr/local/bin/syncshare.sh [Install] WantedBy=media-SYNCSHARE.mount </pre> h2. Udev Rule * Add a udev rule to start the syncshare systemd service on device hotplug: <pre> sudo nano /etc/udev/rules.d/99-local.rules </pre> #* And add the following: <pre> SUBSYSTEMS=="usb", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="1905", ACTION=="add", ENV{SYSTEMD_WANTS}=="syncshare.service" </pre> h2. Resources * http://serverfault.com/questions/766506/automount-usb-drives-with-systemd * https://bbs.archlinux.org/viewtopic.php?id=207050 * https://bbs.archlinux.org/viewtopic.php?id=192461 * https://wiki.archlinux.org/index.php/Persistent_block_device_naming#by-label * https://askubuntu.com/questions/25071/how-to-run-a-script-when-a-specific-flash-drive-is-mounted/190366 * http://jasonwryan.com/blog/2014/01/20/udev/ * https://wiki.archlinux.org/index.php/NTFS-3G#Manual_mounting