ラズパイでTimemachine対応NASを作る

今回の概要


今回は、ラズパイ3 Model B と HDDを使います。前提の条件としてラズパイにOSのインストール等、sshのセットアップは終わっているものとします。

7/8日追記。
フォーマットの拡張子の変更とavahi関係についてコメントより教えていただきました。それに伴い記事の内容も一部変更しています。

終わってない方は以前の記事であるのでこちらを参照してみてください。
===>ラズベリーパイで最初にしたこと

タイトルにもあるのですが、Raspberry piを使ってMacのバックアップTime machineに対応したNASを作って無線でバックアップを行います。

ハードディスクの設定


Macの標準アプリに『ディスクユーティリティ』というものがあるのでこちらでHDDをフォーマットします。(この時はMacにHDDを接続しておきます。)
接続しているHDDを選択し"消去"を選び、
名前: (任意で自由に)
拡張: Mac OS拡張でのフォーマットを行います。

ここでHDDを右クリックで選択し情報を表示します。下の方に行くと全てのユーザーのところが"読み込み"のみの権限になっていると思います。それを"読み込み"と"書き込み"の権限にします。これをしないとどうもTime machineのディスクとして認識されないようです。


===上記の方法で行うまえに!===
LinuxのカーネルがHFS+(Mac OS拡張)では完全にサポートされていないため2TB以上のボリュームの際にバグが報告されているみたいです。そのためHDDのフォーマットはext4 で行った方がよいと思います。
=>higuchi.com blogで詳しく解説されています。

HDDをラズパイにmountさせる


ラズパイにmountさせる前に必要なインストールがあるのでそちらを済ませておきます。


$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install hfsprogs hfsplus
$ sudo make -p /media/backup

ここでは作るディレクトリを仮にbackupとしていますが、/media/ の後であれば好きな名前でも大丈夫です。

$ mount をすると現在mountが行われている情報がたくさん出てくると思います。
環境にもよりますが既にHDDのmountがされていて大抵は/dev/sda2になっていると思います。

次にmountされているHDDの自動設定を行います。以下のコマンドでファイルを開きます。

$ sudo vim /etc/fstab

/dev/sda2 /media/backup hfsplus force,rw,user,auto,nofail 0 0
を加えて保存をします。
sudo mount -aをすると以下のようなエラーが出てくると思いますが無視します。


mount: /dev/sda2 is already mounted or /media/backup busy
/dev/sda2 is already mounted on /media/pi/harddisk

ここで $ sudo rebootで再起動をかけてあげます。
再び $ mount で確認すると/etc/fstabで設定した場所にマウントされています。

Netatalkのインストール


netatalkはUnix系OS上でClassic Mac OSやmacOSに対してAFPによるファイルサーバの機能を提供するオープンソースのソフトウェア
wikipediaより引用

なのでこちらをインストールしますが、その前にNetatalkを使えるように必要なものをインストールしておきます。


$ sudo aptitude install build-essential libevent-dev libssl-dev libgcrypt11-dev libkrb5-dev libpam0g-dev libwrap0-dev libdb-dev libtdb-dev libmysqlclient-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


Netatalkのインストールはソースコードからします。
この時netatalkのバージョンは最新のものでします。
netatalkのバージョンはこちらで確認できます



$ wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.11.tar.gz
$ tar -xf netatalk-3.1.11.tar.gz
$ cd netatalk-3.1.11
$ ./configure --with-cnid-dbd-backend --with-init-style=debian-sysv --with-acls --with-zeroconf --with-cracklib --with-pam-confdir=/etc/pam.d --with-dbus-sysconf-dir=/etc/dbus-1/system.d
$ make
$ sudo make install


この時$ makeは結構時間がかかるので気長に待ちます。
最後まで実行したら
$ netatalk -Vでバージョンなどの情報が表示されれば無事インストールの完了です。




Netatalkの設定



$ sudo vim /etc/nsswitch.confで以下を追加します。

hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4 mdns


7/8日追記。
HATさんのコメントより教えていただきました。
この操作を行っていたために"Failed to add service: Local name collision"のエラーがでていました。
netatalkが自動でavahiに登録を行うので、以下での手動での登録はいりません。
$ sudo vim /etc/avahi/services/afpd.service
でファイルを作成し、以下のコードを追加します。


<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">%h</name>
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
<service>
<type>_device-info._tcp</type>
<port>0</port>
<txt-record>model=TimeCapsule</txt-record>
</service>
</service-group>


最後に$ sudo vim /usr/local/etc/afp.confを行い以下を追加します。

[Global]
mimic model = TimeCapsule6,106

[Time Machine]
path = /media/backup
time machine = yes

これで設定は完了です!

以下のコマンドで起動します。

$sudo service avahi-daemon start
$sudo service netatalk start
$sudo systemctl enable avahi-daemon
$sudo systemctl enable netatalk


$ sudo systemctl status netatalkで現在の状態を確認できるので"active"になったら起動成功です!!
するとFinderの⌘+kでサーバーに接続が出るので
afp://ラズパイのIPアドレス
で接続ができると思います。
そしたらあとはMacのTime Machineを立ち上げ環境設定を見てディスクの選択をすると"利用可能ディスク"のところに『Time Machine』というディスクが出てくると思います。あとはこれで選択すると無線でバックアップを取ってくれます。

おわりに


7/8日追記。このエラーは手動でavahiに登録していたために起きたエラーでした。Netatalkのインストールを間違えたのかどうなのかは分かりませんがFailed to add service: Local name collisionが出ていました。エラーから見る感じ名前の衝突がおきている...なんのことやら...しかし、実行できたので無視していました。今度調べてみて分かることがあれば記事に載せたいとおもいます。

参考


MyEnigma
ながいものには、まかれたくない
higuchi.com blog

この記事へのコメント

  • HAT

    netatalkが自動でavahiに登録しているのに、
    /etc/avahi/services/afpd.service
    を使って手動登録しているので、
    Failed to add service: Local name collision
    が出ています。
    /etc/avahi/services/afpd.service
    を消してください。

    あと、LinuxにHFS+をマウントするのはおすすめしません。Linuxにnativeなファイルシステムを使ってください。
    2017年07月07日 22:14
  • るにぶ

    HATさん教えていただきありがとうございます。
    "Failed to add service: Local name collision"
    そういうことだったんですね...これを消すと上記のエラーは消えました。ありがとうございます!
    Time Machine バックアップディスクで一般に使われるフォーマットは、Mac OS 拡張 (ジャーナリング) フォーマットという安易な考えで使っていました。使わない方がいいのは調べた感じだとLinuxでHFS+での完全なサポートが行われていないからなんですね。どうやらext4を使った方が良いことがわかりました。ご指摘ありがとうございますm(_ _)m
    2017年07月08日 16:34