저는 하드 링크를 사용하여 외부 드라이브에 부분 백업을 생성하는 Time Machine과 같은 백업 스크립트를 사용하고 있습니다.
#!/bin/bash
date=`date "+%Y-%m-%dT%H-%M-%S"`
backup=/mnt/backup
targets="/ /data/seafile /boot /boot/efi"
mkdir -p $backup/logs
rsync -a \
--stats \
--partial \
-h \
-H \
-A \
-X \
-x \
--log-file=$backup/logs/$date.log \
--exclude='/media/**' --exclude='/mnt/**' --exclude='/proc/**' --exclude='/sys/**' --exclude='/tmp/**' --exclude='/run/**' --exclude='/dev/**' \
$targets \
--link-dest=$backup/latest \
$backup/incomplete_$date \
&& mv $backup/incomplete_$date $backup/$date \
&& rm -f $backup/latest \
&& ln -s $backup/$date $backup/latest
결과:
/mnt/backup/
├── 2016-05-24T16-33-08
...
├── 2016-12-01T22-04-25
├── 2016-12-05T20-29-52
├── latest -> /mnt/backup/2016-12-05T20-29-52
├── logs
└── lost+found
LVM을 사용하고 데이터를 다른 마운트 지점으로 분할하기 전까지는 지금까지 훌륭하게 작동했습니다. 이제 이러한 백업의 내용은 다음과 같습니다.
/mnt/backup/latest
├── bin
├── boot
├── data
...
├── efi
...
├── seafile
...
내가 실제로 의도한 것은 rsync가 목록의 각 항목을 / /data/seafile /boot /boot/efi
계층 구조의 올바른 위치에 복사하는 것입니다. 예를 들어 폴더는 다음과 같이 끝나야 합니다.
/mnt/backup/latest
├── boot
│ ├── efi
...
├── data
│ └── seafile
각 대상을 지정해야 하는 이유는 -x
옵션 때문입니다. 이렇게 하면 재귀 중에 rsync가 파일 시스템 경계를 넘어가는 것을 방지할 수 있습니다. "간단한" 해결책은 다음과 같습니다.
-x
플래그 삭제/
대상 만
그러나 이것은 나에게 몇 가지 추가적인 단점을 야기합니다. 예를 들어 원치 않는 마운트 지점을 제외하려면 추가 태그를 사용해야 했습니다 --exclude='/.../**'
. 현재로서는 그다지 많지는 않지만 옵트아웃 솔루션보다는 옵트인 솔루션을 갖고 싶습니다.
답변1
원하는 효과를 얻으려면 -R
(또는 ) 플래그를 사용할 수 있어야 합니다 . --relative
대상에서 소스의 전체 경로를 재현합니다. 예를 들어 rsync -aR /a/b/c /dest
디렉토리가 생성됩니다 /dest/a/b/c
.
계속 작업 할 --link-dest
수 있지만 첫 번째 새 복사본을 만든 후에만 마지막 백업의 디렉터리를 새 계층 구조와 일치하도록 이동하는 것이 좋습니다. 그렇지 않으면 모든 하드 링크가 생성되지 않습니다.