라즈베리 파이로 타임 캡슐

나의 백업 설정

최후의 방어선 온라인 백업은 Backblaze입니다. 만약 집에 불이 나거나 역대급 천재지변으로 많은 것이 사라져도 작업을 부활시킬 수 있다고 생각하면 1년에 50달러는 아깝지 않습니다. 주로 쓰는 맥은 생각날 때마다 사나흘에 한 번, Super Duper!로 클론을 만들어 둡니다.

디스크 클론이나 온라인 백업은 사실 마음의 평화를 위하는 측면이 더 크고, 실제로 가장 꺼내쓰기 좋은 백업 방식은 역시 Time Machine입니다. 한 시간 단위의 자동 백업 덕분에 절망의 구렁텅이에서 건져 올려진 경험이 다들 한 번 쯤 있을 것입니다.

하지만 무선 주변장치의 시대에 USB 하드디스크를 직접 연결해야 하는 Time Machine은 우아하지 못합니다. 무선으로 우아한 Time Capsule은 출시가 너무나 오래 전이라서 붙어있는 공유기의 성능이 의심스러운 가운데, 급기야 단종되었습니다 (잠시 묵념). 와이파이에 연결된 하드디스크를 하나 만들어서 타임 캡슐 대용으로 써먹을 수 있지 않을까, 연구를 좀 해보았습니다.

Pime Capsule

연구 결과는 라즈베리 파이에 3TB 하드디스크를 연결하여 타임 캡슐로 쓰는 것입니다. 불현듯 Pime Capsule이라는 이름이 떠올라서 흡족했는데 검색을 해보니 역시 누군가가 먼저 생각해낸 이름입니다. 그러니 이 이름은 쓰지 않습니다.

이런, 저런, 고대의 기록들을 보면서 진행하다보니 어마어마한 시행착오가 있었습니다. 가장 친절하고 최신인 포스팅은 How-To Geek의 Justin Pot이 썼습니다.

나의 재료

하나만 빼고 How-To Geek에서 시키는 대로 하면 됩니다. netatalk 디펜던시 설치 부분에서 libmysqlclient-dev는 찾을 수 없다고 나오니 이것만 슬쩍 빼고

sudo aptitude install build-essential libevent-dev libssl-dev libgcrypt11-dev libkrb5-dev libpam0g-dev libwrap0-dev libdb-dev libtdb-dev avahi-daemon libavahi-client-dev libacl1-dev libldap2-dev libcrack2-dev systemtap-sdt-dev libdbus-1-dev libdbus-glib-1-dev libglib2.0-dev libio-socket-inet6-perl tracker libtracker-sparql-1.0-dev libtracker-miner-1.0-dev

이렇게 설치하면 놀랍게도 별 문제 없이 진행됩니다. 뭔가 수상한 것이 가득 섞인 3대째 내려오는 육수 같은 느낌이 들지만 netatalk 설치에 대해서 공부하고 싶진 않으니 그냥 넘어갑니다.

라즈베리 파이가 재부팅 된 경우 간혹 외장하드가 읽기전용(ro)으로 마운트 되어 타임머신 백업이 작동하지 않는 경우가 있는데 이럴 때는

fsck.hfsplus -f /dev/sda2

검사를 한 번 해주고 umount 하고, 다시 마운트 해주면 읽기쓰기(rw)로 제대로 마운트됩니다. (jaysonlorenzen.wordpress.com)

백업 속도

DIY 타임 캡슐 만들기는 라즈베리 파이 3B 모델로 먼저 시작했습니다. 그러나 2.4GHz 와이파이로는 백업 속도가 너무 느려서 맥이 거의 항상 백업 중인 상태가 됩니다. 3B+에 랜선을 꽂아서 쓰면 2-3배 속도 향상이 있습니다. 만, 어라? 무선이 아니네? 음…

외장하드 불면증 해소

용건이 끝나면 바로 잠드는 맥에 직접 연결된 외장하드와 달리, 라즈베리 파이에 연결된 외장하드는 24시간 돌아갑니다. Caleb Wood가 제안한 hdparm은 도시바 하드에서 어쩐지 동작하지 않습니다. hd-idle이라는 프로그램도 시도해보았으나 소용 없습니다. 어지간히 잠자기 싫어하는 도시바 하드를 재우기 위해서 결국 스크립트를 하나 만듭니다.

sudo apt install hdparm sysstat python3

이것을 설치하면 iostat으로 외장하드의 읽기/쓰기 상태를 확인할 수 있습니다. 60초 주기로 iostat을 돌리고 읽기/쓰기 활동이 없으면 외장하드에 잠자기를 먹이는 파이썬 스크립트입니다.

import subprocess

def issue_standby():
    subprocess.call("sudo hdparm -y /dev/sda", shell=True)

process = subprocess.Popen("iostat -y 60 sda", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while process.poll() is None:
    outstring = process.stdout.readline()
    if "sda" in str(outstring):
        components = outstring.decode("utf-8").split()
        byteread = int(components[4])
        bytewritten = int(components[5])
        if byteread + bytewritten == 0:
            issue_standby()

/home/pi/hdsleep/hdsleep.py에 담고, crontab -e로 crontab에 아래 라인을 추가하여, 부팅하면 위 스크립트가 돌도록 해줍니다.

@reboot python3 /home/pi/hdsleep/hdsleep.py > /dev/null

교훈

장대한 삽질을 거치면서 어째서 똑똑한 사람들은 간편한 문제 해결을 위해서 돈을 아끼지 않는지, 혹은 애플은 어째서 타임 캡슐을 접었는지에 대하여 희미한 힌트를 얻을 수 있었습니다.



수정

2018-06-14 netatalk 버전:
힘들게 직접 컴파일해서 최신 버전의 netatalk를 돌리니 알 수 없는 이유로 몇 번의 백업 이후에 자꾸만 파일 시스템 오류가 나면서 Disk Utility 조차 디스크를 포기해 버립니다. apt install netatalk로 설치하는 오래된 버전을 사용하니 오히려 문제가 안 발생하는데 운 때문인지는 잘 모르겠습니다.