리눅스/실습

리눅스 실습(3) - 파일시스템 실습(백업 스케쥴링과 이중화)

dbswjdahr 2025. 11. 1. 23:37

이전에는 클론질라를 사용해서 수동으로 백업 후 복구를 진행했다. 하지만 실제로는 계속해서 데이터가 추가/수정/삭제가 되는데 일일히 시스템을 껐다가 백업본을 뜨고 다시 구동하는 건 현실적으로 힘들긴 하다. 그래서 백업 과정을 자동화할 필요성을 느꼈다.
그러므로 이번에는 백업 과정을 스케줄링을 통해 자동화 시켜주는 veeam을 사용해볼 것이다.

[root@Alma ~]# wget -O veeam.rpm https://repository.veeam.com/backup/linux/agent/rpm/el/10/x86_64/veeam-release-el10-1.0.9-1.noarch.rpm
[root@Alma ~]# rpm -ivhp veeam.rpm
[root@Alma ~]# dnf install -y veeam

얘도 기본적으로 패키지 매니저가 못 찾으니 추가해줘야 한다. 어떤 이유인지 모르겠지만 dnf로 바로 안 돼서 저장소를 rpm으로 깔고 그 후에 저장소에 있는 veeam으로 깔도록 했다.

veeam 에이전트 화면

그러면 veeam 명령어로 위와 같은 화면으로 진입할 수 있다. 스페이스바로 X 표시를 해주고 키보드 아래키로 넘어가서 똑같이 동의를 해주고 엔터로 넘어가면 된다. ISO 복구도 마찬가지로 엔터, 라이선스는 없으니까 그냥 엔터로 넘어가면 알아서 무료 기능으로 사용 가능하다.

설정 끝 진짜 시작
백업 대상인데 전체 시스템 대상으로 함
아까 nfs 서버 만들었으니 거기
클라이언트가 있어야 함;;

TUI 화면이라 수월하게 진행하다가 nfs 클라이언트가 따로 필요하다고 해서 나갔다 다시 깔고 함;
dnf install -y nfs-utils로 똑같이 깔아주자. 그리고...

백업 스케줄링 화면

드디어 원하는 게 나왔다! 이게 바로 백업을 떠주는 작업을 알아서 해준다. 클론질라처럼 손수할 필요가 없게 되는 것이다.

드디어 마지막!

마지막으론 요약으로 어떻게 백업 설정을 했는지 나온다. 아래 start job now를 체크하면 작업을 마칠 시 최초 1회 백업을 뜬 다음 스케줄링 대로 백업이 실행된다.

바로 실패해버림

근데 바로 실패해버렸다. 왜 그런가 했더니 스냅샷을 찍으려면 veeamblksnap이라는 커널 모듈이 있어야 하는데, 알마10에서는 veeam이랑 커널이 안 맞는다고 한다. 그래서 알마9.6으로 내리고 다시 했더니 됐다. modprobe veeamblksnap 으로 모듈을 활성화 하고 시도하자 상태가 실행 중이라고 나온다

드디어 된다!

[root@storage ~]# ll /nfs/
total 4
drwxr-xr-x. 2 root root             4096 Nov  1 18:33  2025-11-01-18-img
drwxrwsr-x. 2 root systemd-coredump   72 Nov  1 21:54 'Alma veeam-backup'

다시 nfs 서버로 가서 확인해보니 veeam으로 백업한 스냅샷이 생성이 됐다.

부팅용 ISO 파일도 직접 백업본으로 만들 수 있다.

ISO 파일도 만들어서 nfs 파일에 올린다. 이 백업 대상의 pc도 네트워크를 통해 nfs 서버의 공유 디렉터리를 마운트하여 사용하면 된다. 이제 백업 파일이 네트워크를 통해 공유되기 때문에 이중화, 삼중화 등을 고려할 수 있게 됐다.

[root@Alma ~]# mkdir -p /nfs
[root@Alma ~]# mount 172.23.195.8:/nfs /nfs

다시 스토리지 노드에 와서 이번엔 awscli를 설치해준다. nfs로 올라온 백업 파일을 오브젝트 스토리지에 저장시켜 재해 복구 대책솔루션을 구축할 것이다. 외부 저장소는 무료로 사용할 수 있는 R2를 씀.

[root@storage ~]# dnf install -y awscli
[root@storage ~]# mkdir -p ~/.aws
[root@storage ~]# vi ~/.aws/config
[profile minio]
endpoint_url = http://172.23.195.8:9000
region = auto

[profile r2]
endpoint_url = https://<계정ID입력>.r2.cloudflarestorage.com
region = auto

[root@storage ~]# aws configure --profile minio
AWS Access Key ID [None]: backup
AWS Secret Access Key [None]: backup1234
Default region name [auto]:
Default output format [None]:
[root@storage ~]# aws configure --profile r2
AWS Access Key ID [None]: ##R2 개요에서 API 토큰 관리 누르고 API 토큰 생성해서
AWS Secret Access Key [None]: ## 버킷 또는 계정에 적용하면 키ID랑 비밀키 복붙
Default region name [auto]:
Default output format [None]:

aws s3 sync /nfs/ s3://backup-data/nfs-data/ --profile minio --delete
aws s3 sync /nfs/ s3://disaster-recovery/nfs-data/ --profile r2 --delete
...
...
upload: ../nfs/2025-11-01-18-img/sdb-gpt-1st to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-gpt-1st
upload: ../nfs/2025-11-01-18-img/sda-pt.parted.compact to s3://backup-data/nfs-data/2025-11-01-18-img/sda-pt.parted.compact
upload: ../nfs/2025-11-01-18-img/sda1.vfat-ptcl-img.gz to s3://backup-data/nfs-data/2025-11-01-18-img/sda1.vfat-ptcl-img.gz
upload: ../nfs/2025-11-01-18-img/sda-pt.sf to s3://backup-data/nfs-data/2025-11-01-18-img/sda-pt.sf
upload: ../nfs/2025-11-01-18-img/sdb-gpt.sgdisk to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-gpt.sgdisk
upload: ../nfs/2025-11-01-18-img/sdb-pt.parted.compact to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-pt.parted.compact
upload: ../nfs/2025-11-01-18-img/sdb-mbr to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-mbr
upload: ../nfs/2025-11-01-18-img/sdb-pt.parted to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-pt.parted
upload: ../nfs/2025-11-01-18-img/sdc-gpt-1st to s3://backup-data/nfs-data/2025-11-01-18-img/sdc-gpt-1st
upload: ../nfs/2025-11-01-18-img/sdb-pt.sf to s3://backup-data/nfs-data/2025-11-01-18-img/sdb-pt.sf
upload: ../nfs/2025-11-01-18-img/sdc-chs.sf to s3://backup-data/nfs-data/2025-11-01-18-img/sdc-chs.sf
upload: ../nfs/2025-11-01-18-img/sdc-gpt.sgdisk to s3://backup-data/nfs-data/2025-11-01-18-img/sdc-gpt.sgdisk
upload: ../nfs/2025-11-01-18-img/sdc-gpt-2nd to s3://backup-data/nfs-data/2025-11-01-18-img/sdc-gpt-2nd
upload: ../nfs/2025-11-01-18-img/sdc-gpt.gdisk to s3://backup-data/nfs-data/2025-11-01-18-img/sdc-gpt.gdis
...
...
...

awscli를 사용하여 nfs -> minio로
이것도 awscli로 nfs -> r2로 동기화

이제 동작이 잘 된 걸 확인했으니 crontab에 스케줄링하여 내외부 백업 이중화까지 구현한다! 이러면 백업 파이프라인이 모두 완성이다! 글이 길어 다음 장에서 마무리 해야 겠음ㅎ

[root@storage ~]# crontab -e
* 10 * * * aws s3 sync /nfs/ s3://backup-data/nfs-data/ --profile minio --delete
* 10 * * * aws s3 sync /nfs/ s3://disaster-recovery/nfs-data/ --profile r2 --delete
~