Rsync를 통한 리눅스 백업 시스템 구축
개인 PC 백업이 필요하다
최근, 윈도우11 버전 업데이트(Windows 11 KB5063878 Update) 이후 SSD를 손상시키는 문제가 여러 사용자들로부터 보고되고 있다. 이게 사실인지 아직 의견이 분분한 것 같은데, 사용자 입장에서는 좀 더 보수적인 입장에서 대비해야하지 않을까 싶다.
리눅스니까 이런 문제에 직접 영향을 받는 건 아니지만, 언젠가 SSD가 수명을 다해 죽을 수 있으니 그 상황을 대비한 백업 시스템이 있어야될 것 같다. 그래서 이번 포스트의 주제는 rsync를 사용한 백업 시스템 구축이다.
rsync 기본 사용법
우리가 백업에 사용할 패키지는 rsync이다.
먼저 rsync의 특징과 기본 사용법을 알아보자.
rsync의 특징
rsync 공식 사이트는 rsync에 대해 이렇게 설명하고 있다.
rsync is an open source utility that provides fast incremental file transfer. rsync is freely available under the GNU General Public License and is currently being maintained by Andrew Tridgell. - rsnyc official site
여기서 주목할 부분은 incremental file transfer다. rsync는 mv나 cp처럼 파일을 옮기는 기능을 수행하지만, incremental 방식을 채택했다. 별 것 아닌 것 같지만, mv나 cp와는 확연한 차이를 보인다.
mv나 cp는 동일한 파일이 있다면 항상 덮어쓰기 한다.
즉, 존재하는 파일도 다시 복사한다.
물론 그 파일에 변화가 발생했다면 덮어쓰는 게 맞다.
그러나 변화가 없는데도 덮어쓴다면 많은 파일들을 옮길 때 시간이 많이 걸리게 된다.
반면, rsync는 파일 최종 변경 시각을 비교하고 변경이 있을 때만 해당 파일을 덮어쓰기한다. 그래서 불필요한 복사나 이동 시간을 줄일 수 있는 것이다.
rsync의 기본 사용법
rsync는 다음과 같은 형태로 사용한다.
Important
<source_directory>와 <destination_directory>는 괄호를 포함한 전체를 원하는 경로로 바꿔야 한다. 예를들면 “rsync /home/source_dir /home/destination_dir"처럼.
Tip
source와 destination이 내 pc가 아니라 다른 pc인 경우 원격지로의 복사 혹은 이동이 일어난다. (내pc -> 다른pc 혹은 다른pc -> 내pc)
rsync <source_directory> <destination_directory>이런 기본 형태에 옵션을 통해 여러 기능을 부여할 수 있다. 여기서는 백업에 필요한 옵션들 위주로 설명한다.
rsync -avh --delete -e 'ssh -p <ssh_port>' <source_directory> <destination_directory>나는 개인적으로 위와 같은 옵션 정도만 사용하면 충분해보인다. 옵션들을 하나씩 살펴보자.
- -a(archive): 아카이빙을 위한 옵션이다. 권한, 소유자, 시간 등의 속성을 유지한 채로 복사하며, 폴더 내부까지 recursive하게 모두 복사한다.
- -h(human-readable): 용량을 사람이 읽기 쉬운 MB, GB 형태로 출력해준다.
- -v(verbose): 파일 복사의 진행 상황을 표시해준다.
- --delete: source에서 삭제된 항목은 destination에서도 삭제한다. (삭제한 기록을 반영하는 것)
- -e: destination이 다른 pc일 때, 사용할 통신 방식을 지정하는 부분이다. 이 옵션을 사용하지 않더라도 기본적으로 ssh을 쓰긴 하지만, ssh에 기본 포트인 22가 아니라 다른 port를 사용해야할 경우 위의 예시와 같이 지정해줘야 한다.
rsync를 통한 백업 시스템 구축하기
백업에는 다음과 같은 준비물이 필요하다.
- 백업을 위한 장치 혹은 원격 저장소: 외장 HDD/SSD도 좋고, 내장 HDD/SSD도 좋고, 대용량의 USB도 좋고, NAS도 좋다. (사실 NAS는 좋지않을 수 있다.) 다만 안전성과 안정성이 보장되는 장치여야 한다.
- rsync: 설치되어 있지않다면 설치해주자.
sudo pacman -S rsync준비물을 다 챙겼다면, 복사에 사용할 명령어를 작성하자.
여기서는 일단 ~/.config 경로를 통째로 원격 저장소로 백업해볼 것이다.
즉, <source_dir>는 /home/will/.config이다.
(필요에 따라 /home 경로를 통째로 백업해도 좋다.)
나는 저장 장소로 개인 NAS의 NFS 경로를 선택했다.
그래서 이 경로를 미리 ~/nas_lab에 연결해두었다.
즉, <destination_dir>는 /home/will/nas_lab이다.
다음처럼 명령어를 작성하고 실행하면 백업이 시작된다.
# rsync -avh --delete <source_dir> <destination_dir>
rsync -avh --delete /home/will/.config /home/will/nas_lab실행하면 진행 상황이 슉슉 지나가는 게 보일 것이고, 일정 시간이 지나면 전송이 끝났단 메시지가 뜬다. 그럼 끝이다.
참 쉽죠? 리눅스가 아니라 윈도우였다면, 백업을 위한 프로그램을 찾고, 깔고, 사용법을 익히고… 생각만해도 머리가 지끈거린다. 리눅스는 우리 삶을 참 편하게 만들어준다.
NAS NFS를 destination으로 사용했을 때 생길 수 있는 문제
아까 NAS의 NFS를 백업 장치로 사용하는 게 좋지 않을 수 있다고 살짝 말을 했었다. 그 이유를 한번 살펴보자.
위 예시에서 NFS로 수행한 백업 결과 log를 확인해보니, 다수의 파일들이 전송오류로 백업되지 않았다.
에러는 Operation not permitted였다.
조사를 좀 해보니, NAS NFS를 rsync의 destination으로 썼을 때 이런 문제가 발생하는 것 같다.
rsync의 archive 옵션은 파일의 소유권을 그대로 유지하도록 내부적으로 chown과 chgrp을 실행하는데, 이걸 NAS NFS에서 허용하지 않기 때문에 오류가 발생한다.
다행히 Permission은 유지된다고 한다. (ex. 쉘 스크립트의 +x 등의 권한 부여한 것)
그러나 파일을 보존하는 것이 우리의 주요 목적이기 때문에, NAS NFS를 저장소로 사용한다면 그냥 UID와 GID 정보가 날아가는 걸 감수하면 된다.
여러 사용자 계정을 가진 PC를 백업할 것이 아니라면, 사용하는 나 한명 뿐일 것이기 때문이다.
언젠가 백업한 걸 복구하는 일이 있으면, 복구한 뒤 chown을 통해 내 계정의 소유로 바꿔주기만 하면 된다.
이렇게 소유권 정보를 무시하고 백업을 진행하기 위해선 다음의 명령어를 사용하자.
# archive 옵션에 포함된 소유권 관련 내용을 제거한 옵션을 사용한다.
rsync -vh --delete -rlptD --no-o --no-g /home/will/.config /home/will/nas_lab