[Synology] 백업시 외장하드 자동 켜기(자동 마운트)

이전 글 에서는 시놀로지 외장하드를 자동으로 끄는 기능에 대해 글을 썼습니다.

NAS는 만능이 아니므로, 항상 백업을 해 줘야 합니다. 백업의 중요함은 항상 강조해도 모자람이 없지만, 바쁜 일상애서 매일 백업을 하는건 여간 귀찮은 작업이 아닙니다. 시놀로지 나스에서 백업 완전 자동화를 위한 스크립트입니다.

하지만 외부 HDD가 전원 공급을 USB로만 받는다면, 이전 방법으로는 전원 제어가 되지 않고, 백업 전 자동 마운트 기능을 제공하지 않는 시놀로지에서는 수동으로 USB를 빼고 꽂아야만 합니다.

사실 백업의 목적을 생각해보면, 번거롭더라도 USB HDD를 미리 꽂고, 빼는것이 이상적입니다만. 번거롭고, 까먹기도 할 겁니다.

시놀로지 카페의 코러스님께서 올려주신 글을 참고로 했습니다.

사전 준비

USB HDD와 나스가 당연히 있어야 하며, SSH사용을 할 수 있으면 좋습니다. SSH사용이 어렵다면 위 링크를 확인하셔서 Windows 환경에서 VID, PID 를 확인하시면 됩니다.

SSH 환경에서 $lsusb 를 입력하여 USB로 연결된 Device를 확인하도록 합니다. 아래처럼 나옵니다.

lsusb 실행 결과

제경우 USB2의 2-1, 2-2에서 사용중인 외장하드가 나왔네요.

모자이크 한 위치의 1234:5678:0123 이런식으로 배열이 되어있는 숫자 혹은 영문 소문자가 보일거에요.앞의 8자리를 잘 메모해둡니다.

시놀로지 DSM의 제어판, 작업 스케줄러-사용자 정의 스크립트에서 새 스케줄을 생성합니다. 실행권한은 root로 지정하고, 시간은 하이퍼백업이나 USB copy가 돌기 전으로 설정합니다. 1분이면 충분하지만, 5분정도 전으로 설정해줍니다.

아래 스크립트를 넣어주는데, USB1VEN, USB1PRD 부분을 본인의 것에 맞게 수정합니다.
만약, 외장 장치가 한개뿐인경우, USB2에 관련된 부분을 주석처리하거나 지우시면 되며, 11번째줄의 2를 1로 수정하시면 됩니다.

#!/bin/bash

# 아래에 Vender ID와 Product ID를 넣어줍니다. 
USB1VEN="****"
USB1PRD="****"
USB2VEN="****"
USB2PRD="****"

MNTCNT=`cat /proc/mounts|grep "/dev/usb"|awk '{print $2}'|sed 's//volume//g'|sed 's//usbshare//g'|wc -l`
MNTPNT=`cat /proc/mounts|grep "/dev/usb"|awk '{print $2}'|sed 's//volume//g'|sed 's//usbshare//g'|sort`
if [ "${MNTCNT}" != "2" ]; then
	if [ "${MNTPNT}" != "USB1" ]; then
		# 마운트 진행
		for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
			if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
				$(cat $DIR/idVendor) == $USB1VEN && $(cat $DIR/idProduct) == $USB1PRD ]]; then
				echo 0 > $DIR/authorized
				sleep 0.5
				echo 1 > $DIR/authorized
				break
			fi
		done
	fi

	if [ "${MNTPNT}" != "USB2" ]; then
		# 마운트 진행
		for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
			if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
				$(cat $DIR/idVendor) == $USB2VEN && $(cat $DIR/idProduct) == $USB2PRD ]]; then
				echo 0 > $DIR/authorized
				sleep 0.5
				echo 1 > $DIR/authorized
				break
			fi
		done
	fi
fi

USB 마운트가 이미 되어있는 경우 건너뛰고, 마운트가 되어있지 않으면 마운트 됩니다.
마운트를 했다면, break하여 반복문을 중지시킵니다.

동작 확인은 아래와 같이 해당 스크립트를 SSH에서 root 권한으로 실행시키면 됩니다.

# root권한 획득
sudo -i
# sh파일 생성
vim automnt.sh
# automnt.sh 내용

#!/bin/bash

# 아래에 Vender ID와 Product ID를 넣어줍니다. 
USB1VEN="****"
USB1PRD="****"
USB2VEN="****"
USB2PRD="****"

MNTCNT=`cat /proc/mounts|grep "/dev/usb"|awk '{print $2}'|sed 's//volume//g'|sed 's//usbshare//g'|wc -l`
MNTPNT=`cat /proc/mounts|grep "/dev/usb"|awk '{print $2}'|sed 's//volume//g'|sed 's//usbshare//g'|sort`
if [ "${MNTCNT}" != "2" ]; then
	if [ "${MNTPNT}" != "USB1" ]; then
		# 마운트 진행
		for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
			if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
				$(cat $DIR/idVendor) == $USB1VEN && $(cat $DIR/idProduct) == $USB1PRD ]]; then
				echo 0 > $DIR/authorized
				sleep 0.5
				echo 1 > $DIR/authorized
				break
			fi
		done
	fi

	if [ "${MNTPNT}" != "USB2" ]; then
		# 마운트 진행
		for DIR in $(find /sys/bus/usb/devices/ -maxdepth 1 -type l); do
			if [[ -f $DIR/idVendor && -f $DIR/idProduct &&
				$(cat $DIR/idVendor) == $USB2VEN && $(cat $DIR/idProduct) == $USB2PRD ]]; then
				echo 0 > $DIR/authorized
				sleep 0.5
				echo 1 > $DIR/authorized
				break
			fi
		done
	fi
fi

# 디버그모드로 실행
bash -x ~/automnt.sh

{{#is "post"}} {{/is}}