YOGYUI

라즈베리파이 NAS에 백업하기 (네트워크 백업) 본문

Hardware/Raspberry Pi

라즈베리파이 NAS에 백업하기 (네트워크 백업)

요겨 2025. 2. 13. 22:13
반응형

Backup Raspberry Pi over the network (NAS)

최근 클러스터로 사용중이던 라즈베리파이 4 중 하나의 SD카드가 뻑이 나면서 I/O Error가 발생해 더 이상 사용하지 못하게 되는 바람에 꽤 오랜 시간을 원상복구하는데 허비했다 (SD카드 뽑기 운이 좋지 못했던 것 같다 ㅠ)

삽질을 하는 와중에 "평소에 주기적으로 SD카드 내용물 전체를 백업해뒀으면 이 고생을 하지 않아도 됐을텐데..."라는 생각이 들어 이참에 백업 시스템을 구축하기로 마음먹고 작업하면서 그 과정을 기록삼아 포스팅해봤다

마침 NAS 중 하나에 달린 하드디스크 하나가 텅텅 빈 채로 돌고 있기도 하고 ㅋㅋ

본 글에서 다룬 환경은 다음과 같다
- 라즈베리파이: Raspberry Pi 4 Model B (4GB RAM)
- 운영체제: Raspbian GNU/Linux 10 buster
- NAS: ipTime NAS-IIe (FW ver: 1.4.84)

1. NAS SMB(Server Message Block) 설정

라즈베리파이에서 NAS에 손쉽게 접근하기 위해 백업 이미지 저장용 폴더를 생성한 뒤 NAS의 SMB 서비스를 활성화해 후 해당 폴더를 공유폴더로 지정해준다

※ 본 글은 ipTime NAS-IIe를 기반으로 작성되었으며, 다른 벤더의 NAS는 해당 벤더의 매뉴얼을 참고

1.1. 라즈베리파이 백업 이미지 저장 폴더 생성

'폴더/사용자 관리' - '폴더 관리'

  • 하드디스크에 라즈베리파이 백업 이미지용 폴더를 하나 생성하고 폴더명을 지정 (나는 RPiBackup 이라고 해줬다)
  • 서비스에서 '윈도우 공유'는 반드시 체크
  • 등록된 사용자 계정 중 해당 폴더에 접근권한을 부여할 계정을 등록
  • '저장하기' 버튼을 클릭해 설정 완료

1.2. SMB 설정

'서비스 관리' - '윈도우 파일 공유'

  • 서비스를 '실행'으로 설정하고 SMB 프로토콜은 'SMB1 & SMB2'로 설정
    • 보안상 SMB2만 지정하는 것이 좋다고 한다
  • 위에서 생성한 폴더를 공유 폴더로 '지정'
  • '저장하기' 버튼을 클릭해 설정 완료

2. Raspberry Pi에서 NAS 공유폴더 마운트

Step.1 라즈베리파이에 두 개의 디렉터리를 만들어준다 (각각 백업 이미지를 저장할 폴더와 NAS SMB 접속 계정 정보를 담을 폴더)

$ sudo mkdir /media/pibk
$ sudo mkdir /media/Credentials

※ 실제 백업 이미지는 라즈베리파이 디스크가 아니라 마운트된 NAS SMB상에 네트워크를 통해 저장된다

 

Step.2 다음으로 백업 이미지를 저장할 경로의 접근권한을 설정해준다

$ sudo chown -R $(whoami):$(whoami) /media/pibk

 

Step.3 다음으로 Credentials 경로 내에 NAS SMB에 접속하기 위한 계정 정보를 텍스트 형식으로 파일로 저장해준다

nano나 vim 등 텍스트 에디터를 연 뒤,

$ sudo nano /media/Credentials/.pibk

그림과 같이 'username'과 password'에 적절하게 공유폴더 접근을 위한 계정 정보를 작성해준다

  • username={계정명}
  • password={계정비밀번호}

 

Step.4 다음으로 현재 라즈베리파이의 계정(보통은 pi)의 사용자 ID(UID) 값을 확인한다

$ cat /etc/passwd | grep $(whoami)

콜론(:)으로 구분된 출력결과 문자열의 3번째 값을 확인하면 된다

위 예시에서 UID는 1000이 된다 (보통 1000 혹은 1001의 값을 가진다)

 

Step.5 라즈베리파이가 재부팅된 후에도 자동으로 NAS SMB를 파일시스템으로 마운트할 수 있도록 /etc/fstab 파일 아래에 아래 한 줄을 추가해주도록 한다

※ SMB의 일종인 CIFS(Common Internet File System) 프로토콜을 사용해 윈도우 공유폴더를 리눅스 시스템에 마운트

$ sudo nano /etc/fstab
//{NAS주소}/RPiBackup /media/pibk cifs rw,credentials=/media/Credentials/.pibk,uid=1000,gid=1000,file_mode=0660,dir_mode=0770,vers=2.0,iocharset=utf8,x-systemd.automount 0 0

위에서 볼드체로 된 문자열은 앞서 작업한 NAS 공유폴더명, 마운트 경로, 계정정보 접속 경로, 계정 UID 등의 정보로 치환하도록 한다

 

SMB 공유폴더가 제대로 마운트되는지 확인해보자

$ sudo mount /media/pibk

오류 메시지가 안뜬다면 정상적으로 마운트된 것이다

3. Image-Backup 설치

현재 라즈베리파이가 구동중인 디스크 내용물 전체 (/boot, /rootfs 파티션 모두)를 하나의 이미지 파일로 만들 수 있는 툴인 'image-backup' 유틸리티를 사용하기 위해 설치해준다

https://forums.raspberrypi.com/viewtopic.php?t=332000&ref=blog.networkprofile.org

 

Image File Utilities - Raspberry Pi Forums

Thu Aug 01, 2019 9:12 pm image-backup: Usage: image-backup [options] [pathto/imagefile for incremental backup] -h,--help This usage description -i,--initial pathto/filename of image file [,inital size MB [,added space for incremental MB]] -n,--noexpand Do

forums.raspberrypi.com

dd, resize2fs, e2fsck 등 리눅스의 디스크 파티션 관리 툴들을 자동으로 시퀀스에 맞게 호출해주는 유틸리티라고 보면 된다

 

Step.1 wget을 이용해 zip 파일 다운로드

$ cd ~/
$ wget -O image-files.zip "https://files.networkprofile.org/s/ZebFWQKqra7LgJr/download/image-files.zip"

 

Step.2 디렉터리 생성, 압축파일 해제, 압축파일 제거

$ mkdir -p ~/image-files
$ mv ~/image-files.zip ~/image-files
$ cd ~/image-files
$ sudo apt install unzip
$ unzip ~/image-files/image-files.zip
$ rm ~/image-files/image-files.zip

 

Step.3 루트계정 접근권한 설정 및 파일 실행(execute) 권한 부여

$ sudo chown root:root ~/image-files/image*
$ sudo chmod +x ~/image-files/image*

 

Step.4 (터미널에서 실행 가능하도록) 경로 이동 (symbolic link를 생성해도 무방)

$ sudo mkdir -p /usr/local/bin/
$ sudo mv ~/image-files/* /usr/local/bin/
$ sudo mv /usr/local/bin/README.txt /usr/local/bin/image-readme.txt

 

Step.5 초기화

$ sudo image-backup

만약 gdisk 패키지가 설치되어 있지 않다면 설치되며, 설치가 완료된 후에는 "Image file to creage?" 안내문이 터미널에 표시된다

로컬에 저장하지 않고 SMB 공유폴더에 저장해야 하므로 Ctrl+C를 눌러 Abort해준다

4. 백업 이미지 생성

마운트해둔 네트워크 공유폴더(/media/pibk)에 백업이미지를 생성해보자 (처음에는 --initial 인자를 붙여서 추후 늘어날 이미지 용량을 대비해 넉넉하게 이미지 크기를 잡아줘야 한다)

 

라즈베리파이를 여러 개 사용하고 있을 경우 백업이미지별로 파일 이름을 다르게 해줘야 하는데, 라즈베리파이의 고유 ID값으로 사용할 수 있는 것이 시리얼넘버(혹은 MAC어드레스)이다

 

시리얼넘버는 /sys/firmware/devicetree/base/serial-number 파일로 존재하므로 이를 백업이미지 파일명에 넣어도 되고, 공유폴더 내 하위폴더를 만들어 그 안에 해당 라즈베리파이의 백업 이미지만 저장해도 된다 (여기서는 후자를 선택)

$ cd /media/pibk
$ mkdir $(cat /sys/firmware/devicetree/base/serial-number)

 

이제 넉넉하게 5GB 정도 마진을 주고 백업 이미지를 생성해주자

(최초 이미지 생성시 시간이 꽤 걸리니 여유롭게 커피 브레이크 때려주자)

  • 본인의 라즈베리파이 사용 현황에 따라 적절하게 마진을 주는게 좋다 (/rootfs 파티션을 대용량 데이터베이스로 활용하고 있다면 이 방법은 별로 추천하지 않는다)
  • exclude 옵션을 사용해 원치않는 폴더나 파일을 백업에서 제외할 수 있으니 자세한 것은 매뉴얼을 참고
  • /tmp 디렉터리에 이미지로 만들고자 하는 파일들이 잠시 복사되므로 이미지 크기만큼의 여유 공간을 남겨둬야 한다
$ sudo image-backup \
  --initial \
  /media/pibk/$(cat /sys/firmware/devicetree/base/serial-number)/backup.img,,5000

 

※ 이미지 생성이 완료되면 image-check 툴이 자동으로 실행되어 integrity 검증까지 진행된다

5. 백업 스케쥴 설정 (주기적 백업 자동화)

어떤 시스템이던지 백업은 주기적으로 해주는게 바람직하며, 인간의 개입 없이 자동으로 수행되는 것이 여러모로 편리하다

여기서는 Job Scheduler 유틸리티 crontab을 이용해 주기적으로 image-backup 스크립트를 호출해 백업 이미지를 생성하도록 엔트리를 추가해봤다 (최초 생성 후에는 incremental 방식으로 백업이 이뤄지므로 크게 시간이 많이 소요되지는 않는다) 

$ sudo crontab -e

에디터는 입맛에 맞게 선정 (nano의 경우 1 선택)

 

crontab 스케쥴 스크립트는 아래 웹페이지에서 쉽게 커스터마이징할 수 있다

https://crontab.guru/?ref=blog.networkprofile.org

 

Crontab.guru - The cron schedule expression generator

When a Cron job fails, get to the root cause in minutes Stop guessing if your system is down because of a failing cron job. Cronitor gives you the reporting Cron should have shipped with. Setup takes 5 minutes and you'll get instant alerts when things go w

crontab.guru

매주 일요일 새벽 3시라면 위와 같이 "0 3 * * SUN" 문자열을 스크립트로 넣으면 된다

내부 데이터가 빠르게 갱신되는 환경이라면 '일'단위로 백업하는 것도 고려할 수 있다

# Incremental Backup Raspberry Pi Image for every Sunday at 3.am
0 3 * * SUN /usr/local/bin/image-backup /media/pibk/$(cat /sys/firmware/devicetree/base/serial-number)/backup.img

저장해주면 해당 스크립트가 주기적으로 실행된다

※ 라즈베리파이 OS의 날짜/시간을 제대로 설정했는지 확인해주자 (보통은 네트워크 연결 시 자동으로 동기화된다)

6. 백업 이미지 사용 방법

백업 이미지는 balenaEtcher를 사용하면 손쉽게 SD카드나 USB 플래시 메모리에 그대로 옮겨담을 수 있다

다른 PC에서 NAS 공유폴더의 백업 이미지 파일을 다운로드받은 뒤 USB 플래시 메모리에 심어보자

Mac OS에서 SMB 공유폴더 연결
balenaEtcher 실행 후 이미지 파일 선택, 타겟 디바이스 (SD카드 혹은 USB 플래시 메모리) 선택 후 'Flash!' 버튼 클릭
복사 진행 중
복사 완료 후 이미지 검증
플래시 완료

 

완료 복사된 SD카드 혹은 USB 플래시 메모리로 라즈베리파이를 부팅해서 제대로 동작하는지 확인!


이번 포스팅에서는 라즈베리파이의 디스크 이미지를 주기적으로 네트워크 상의 다른 서버(NAS 등)에 백업하는 방법에 대해 알아보았다

주기적으로 백업된 이미지 파일만 존재한다면, 이제 라즈베리파이의 SD카드 등에 문제가 발생해 복구해야할 상황이 닥쳤을 때 크게 힘들이지 않고 다른 SD카드를 준비해 빠른 시간 내에 재동작할 수 있게 할 수 있으니 적극적으로 도입을 고려해볼만 하다

※ 마이크로 SD카드는 개복치같은 녀석이라 예기치 못하게 뻑나는 경우가 왕왕 발생한다 ㅠ

 

[참고]

https://blog.networkprofile.org/backup-a-running-raspberry-pi-to-truenas-or-any-smb-share/

 

Backup a running Raspberry Pi over the network

For the longest time I've been looking for a way to backup my Raspberry Pi's over to the network, to an easy to restore format. But every solution I've looked at has come up short. This post details a solution that works very well. Best of all, it makes in

blog.networkprofile.org

 

반응형