백업 계획 개선의 일환으로 이제 회전하는 외장 하드 드라이브를 추가하여 하나는 항상 안전하게 오프사이트에 있고 다른 하나는 백업 데이터를 수신할 수 있도록 했습니다. 물론 백업이 실제로 완료되었는지 확인하기 위해 백업은 일정에 따라 스크립트로 작성되고 실행됩니다.
내 계획은 하드 드라이브를 수동으로 삽입하고 마운트한 다음 마운트를 해제해야 할 때까지(다시 수동으로) 그대로 두었다가 빼내고 다음 드라이브를 가져온 다음 해당 드라이브를 수동으로 마운트하는 것입니다. 두 드라이브 모두 예를 들어 /mnt/backup에 마운트됩니다.
문제는 다음과 같습니다. 하드 드라이브를 연결하거나 마운트하는 것을 잊어버린 경우 백업 스크립트가 실행되는 것을 원하지 않습니다. 따라서 스크립트 실행을 허용하기 전에 /mnt/backup에 마운트된 장치가 있는지 감지할 수 있어야 합니다. 내 첫 번째 생각은 "NO_DRIVE_MOUNTED"라는 파일을 (마운트 해제된) /mnt/backup 디렉토리에 넣은 다음 제대로 작동하는지 확인하는 것이었습니다.아니요백업 루틴을 실행하기 전에 존재하지만 해킹된 느낌이 듭니다. (다시 한번 "BACKUP_DEVICE_READY"라는 파일을 각각의 외장하드에 넣고 반대의 파일이 있는지 확인해보세요.하다존재 자체가 해킹처럼 느껴진다. )
장치가 특정 디렉터리에 마운트되어 있는지 감지하는 더 좋은 방법이 있습니까? 내 경험에 따르면 Linux에서 드라이브를 연결하면 다음 사용 가능한 /dev/sdX에 할당되기 때문에 장치 자체를 확인하는 것을 피하고 싶습니다. 따라서 다음 번에 백업 드라이브는 /dev/sdf가 될 수 있습니다. 백업 드라이브를 연결하고 다른 드라이브를 삽입하면 /dev/sdg가 되며 이는 /dev/sdf 테스트가 실패함을 의미합니다! 또한 드라이브를 보다 쉽고 투명하게 교체/업그레이드할 수 있도록 장치별 식별(예: UUID를 통한)을 피하고 싶습니다.
이것은 Ubuntu 10.10(또는 전체 서버를 재구축하는 동안 충분히 미루면 11.04일 수도 있음)에 있을 것이며 이상적으로는 백업 앞에 The command is direct in my를 붙일 수 있는 간단한 한 줄 테스트를 원합니다. crontab(하지만 필요한 경우 Bash 스크립트를 두려워하지 않습니다).
답변1
cron과 같이 백업 스크립트를 실행할 수 있습니다
fgrep -q /mnt/backup /proc/mounts && backup.sh
그러나 실패한 시도를 기록하려면 스크립트에 테스트를 추가하는 것이 좋습니다.
답변2
/mnt/backup
마운트 지점인지 확인하는 방법에는 두 가지가 있습니다 . /proc/mounts
Linux를 대상으로 하는 이 방법은 df
그 외에는 모든 유닉스 시스템에 이식 가능하므로 둘 중 하나를 선택할 큰 이유가 없습니다. 마운트 지점에 공백이 포함되어 있는 특수한 경우에는 둘 다 실패할 수 있습니다(그냥... 하지 마세요!).
case $(df -P /var) in *" /var") echo mounted;; esac
if fgrep -q " /tmp " </proc/mounts; then echo mounted; fi
장치 일련 번호, 파일 시스템 UUID 또는 파일 시스템 레이블(후자가 신뢰할 수 있는 지표일 수 있음)과 같은 기준에 따라 특정 이동식 드라이브에 특정 장치 이름을 할당할 수 있습니다. 필요한 것은 udev 구성에서 한 줄뿐입니다. 그러나 이는 적절한 마운트 지점에 편리하게 설치할 수 있다는 점에서 좋은 생각이지만 장치의 존재 여부에 의존하는 것은 좋지 않습니다. 장치가 존재하지만 마운트되지 않을 수 있으므로 스크립트가 설치된 장치에 따라 달라지는 경우 확인해야 합니다. 설치 모습.
답변3
원하는 것을 달성하는 또 다른 (더 나은? 더 안전한?) 방법이 있습니다. 백업 드라이브가 마운트되어 있는지 확인하기보다는 전원을 연결해 두었다가 실제로 사용하지 않을 때는 마운트를 해제하세요.
이는 디스크(일부 디스크는 나머지)에 더 좋으며 실수로 액세스하는 것을 방지할 수 있습니다. cron 작업은 mount
시작 시 실행되고 umount
완료 시 실행될 수 있습니다. 에 대한 항목에서 원하는 내용을 설명하는 경우 mount /mnt/backup
일반 사용자로서 및 명령을 사용하여 이 작업을 수행할 수 있습니다 . 일반 사용자로 설치가 완료되면 이 항목에 이 옵션이 포함되어야 합니다. 이제 디스크가 실제로 삽입되었는지 여부만 감지하면 됩니다. 이 명령은 연결되지 않은 디스크를 마운트하려는 시도가 오류 32로 인해 실패함을 알려줍니다(이 오류의 다른 원인이 있음).umount /mnt/backup
/etc/fstab
users
mount
마지막 부분은 /etc/fstab에 작업 수행 방법을 알려주는 것입니다. 아시다시피 장치 이름은 항상 바뀌기 때문에 신뢰할 수 없습니다. 그러나 실제 장치는 자체적으로 인식될 수 있습니다. 하드 디스크의 경우 파티션에는 blkid
또는 와 같은 적절한 도구를 사용하여 결정할 수 있는 이름이 있습니다 vol_id
. 이 명령은 blkid
일반 사용자 호출을 위한 것입니다 /sbin/blkid
(BTW, 이는 DVD에도 적용됩니다).
예를 들어, 현재 장치에 두 개의 파티션이 있는 디스크가 있습니다 /dev/sdc
. 슈퍼유저로 호출하여 첫 번째 파티션의 "UUID"를 가져옵니다.
$ /sbin/blkid /dev/sdc1
/dev/sdc1: UUID="7aeb2d15-9a1b-410a-b5ed-5437e68cb528" SEC_TYPE="ext2" TYPE="ext3"
/etc/fstab
그런 다음 줄 에 추가했습니다.
UUID="7aeb2d15-9a1b-410a-b5ed-5437e68cb528" /mnt/backup ext3 users,noauto,rw,relatime,data=ordered
(사용 가능한 경우) 올바른 파티션을 설치하기 /etc/fstab
위한 올바른 정보를 제공 합니다 . 마찬가지이다 .mount /mnt/backup
/mnt/backup
umount
불행하게도 이 방법은 백업 DVD가 있는 경우에만 작동합니다. 그 이유는 명령이 mount /mnt/backup
첫 번째 항목을 마운트 지점으로 사용하기 때문입니다. 연결한 디스크와 일치하지 않으면 동일한 마운트 지점에 대해 작업을 수행하기 위해 다른 디스크를 사용할 수 있는 추가 항목을 찾지 않고 실패합니다(이유를 알고 싶습니다)./etc/fstab
/mnt/backup
해결 방법은 /mnt/backup
모든 백업 디스크를 의 마운트 지점과 연결하는 것 입니다 /etc/fstab
. 스크립트(일반 사용자 모드에서도)는 디스크(파티션)의 UID를 mount -U 'xxxxxxx'
사용하여 각 백업 디스크 파티션을 식별하여 마운트하려고 시도할 수 있습니다 . 백업 디스크 중 하나를 삽입하면 스크립트가 결국 성공하게 됩니다.xxxxxxx
/etc/fstab
이는 또한 백업 디스크로 착각하여 디스크가 실수로 손상되는 것을 방지합니다. 스크립트가 인식하지 못하는 디스크를 삽입하면 해당 디스크가 /etc/fstab
.
한 번도 사용해 본 적이 없는 또 다른 (더 간단한) 확인 방법은 mount -a -O my_option
항목에 옵션이 포함된 모든 디스크를 마운트하는 명령을 사용하는 것입니다. 물론 의 백업 디스크에 대한 모든 항목에 해당 옵션을 추가해야 합니다. 이에 대한 위험은 두 개의 백업 디스크가 연결되어 있는 경우 해당 디스크가 포함될 수 있다는 것입니다. 맨 위에서 두 번째 디스크만 표시되므로 이는 문제가 되지 않습니다. 그러나 결국 둘 다 분리되도록 얼마나 조심해야 하는지 잘 모르겠습니다. 일부 실험이 필요할 수 있습니다./etc/fstab
'my_option'
/etc/fstab
/mnt/backup
하지만 mount -a -O my_option
. /etc/fstab
다시 한 번 그 이유가 궁금했습니다.
답변4
실제로 해당 설치 디렉터리에 쓰기를 방지하는 방법을 찾았습니다. /mnt/백업
- 설치되지 않은 경우 "chmod ugo -w /mnt/backup"을 사용하십시오.
디렉토리 마운트
- "chmod ugo+w /mnt/백업"
마운트 해제된 디렉토리에 쓰려고 하면 권한 거부 메시지가 표시됩니다.
touch-equality-touch: 'equality'를 터치할 수 없습니다: 권한이 거부되었습니다.