RaspberryPiでTimeMachineに対応したsambaサーバを立てる

RaspberryPi + Samba (+ Avahi)でMacのTimeMachine用のサーバを立てる記事です。
RaspbianのバージョンがBusterになってから簡単にサーバを立てられるようになりました。
自分用のメモとして残しておきます。

# TL;DR
事前に`hoge`というユーザがシステムに追加されているとします。
下記の`<ここでパスワードを入力、表示されません>`でファイルサーバに使うパスワードを入力してください。

``` bash
$ sudo apt install samba avahi-daemon
$ sudo smbpasswd -a hoge
New SMB password: <ここでパスワードを入力、表示されません>
Retype new SMB password: <ここでパスワードを入力、表示されません>
Added user hoge.
```
`/etc/samba/smb.conf`に下記の設定を追記します。

``` /etc/samba/smb.conf
[TimeMachine]
   comment = RaspberryPi TimeMachine Folder
   path = /mnt/TimeMachine
   writable = Yes
   browsable = Yes
   vfs objects = catia fruit streams_xattr
   fruit:metadata = netatalk
   fruit:encording = native
   fruit:time machine = Yes
   fruit:time machine max size = 1T
```
`/etc/avahi/services/samba.service`を下記の内容で作成する

``` /etc/avahi/services/samba.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 <name replace-wildcards="yes">%h</name>
 <service>
   <type>_adisk._tcp</type>
   <txt-record>sys=waMa=0,adVF=0x100</txt-record>
   <txt-record>dk0=adVN=TimeMachine,adVF=0x82</txt-record>
 </service>
  <service>
    <type>_smb._tcp</type>
    <port>445</port>
  </service>
</service-group>
```

最後にRaspberryPiを再起動してください。

# 説明
## 必要なパッケージをインストール
``` bash
$ sudo apt install samba avahi-daemon
```
ファイルサーバの機能を提供する`samba`とネットワーク上にサーバの存在を通知する`avahi-daemon`をインストールします。インストールされるsambaのバージョンはおそらく4.9以上になると思います。

> 最近のmacOSでは対応したファイルサーバであればSMBでもTimeMachineが使えるようになりました。
Sambaではバージョンが4.8以降でTimeMachineに対応したようです。
そしてRaspbianではbusterから安定版がsamba4.9以降になったようです。[^1]
(Debianのパッケージ検索から確認しましたがRaspbianと同じだと考えられます。)

## ファイルサーバにアクセスできるアカウントを追加する
``` bash
$ sudo smbpasswd -a hoge
New SMB password: <ここでパスワードを入力、表示されません>
Retype new SMB password: <ここでパスワードを入力、表示されません>
Added user hoge.
```
`smbpasswd`コマンドを使ってアクセスできるアカウントを追加できます。事前にシステムに登録されていることが条件なのでデフォルトのまま使う場合は`pi`アカウントを追加してください。
登録時にパスワードを聞かれるのでファイルサーバにアクセスするときに使うパスワードを入力してください。(確認のため2回聞かれます。)

> 利便性を上げるために安全性を犠牲にするならば後述のsambaの設定でguestアカウントを許可することもできます。その場合`smbpasswd`を実行する必要はありません(guestアカウントを使用するため)。しかしバックアップを暗号化しないのであればguestを有効にすることは避けてください。

## Sambaの設定を変更する
`/etc/samba/smb.conf`に下記の設定を追記します。

``` /etc/samba/smb.conf
[TimeMachine]
   comment = RaspberryPi TimeMachine Folder
   path = /mnt/TimeMachine #マウントしたドライブのパスを指定
   writable = Yes
   browsable = Yes
#   guest ok = Yes
   vfs objects = catia fruit streams_xattr
   fruit:metadata = netatalk
   fruit:encording = native
   fruit:time machine = Yes
   fruit:time machine max size = 1T #ドライブ全体を使っていい場合はこの行を削除
```
上記では`TimeMachine`という共有フォルダを設定しています。
[]の中に共有フォルダ名を指定できます。
各オプションの意味は下記の通りです。[^2] [^3]

| オプション名 | 意味 |
|------------|-----|
| comment    | 共有フォルダの説明 |
| path       | サーバ上の共有するディレクトリのパス |
| writable   | 書き込みを許可 |
| browsable  | フォルダを表示する(フォルダを隠さない) |
| guest ok   | ゲストでのアクセスを許可 |
| vfs objects| 使用する仮想ファイルシステムモジュールを指定 |
| fruit:metadata | どこでメタデータを保存するか |
| fruit:encording | ファイル名で互換性のない文字をどう処理するか |
| fruit:time machine | TimeMachineをサポートする通知をするか |
| fruit:time machine max size| TimeMachineで使えるディスクの容量 |

TimeMachineの設定をしている重要なポイントは上記設定の下5行分です。他は通常のSambaの設定と変わりません。

## mDNSの設定をする
`/etc/avahi/services/samba.service`を下記の内容で作成する

``` /etc/avahi/services/samba.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 <name replace-wildcards="yes">%h</name>
 <service>
   <type>_adisk._tcp</type>
   <txt-record>sys=waMa=0,adVF=0x100</txt-record>
   <txt-record>dk0=adVN=TimeMachine,adVF=0x82</txt-record>
 </service>
  <service>
    <type>_smb._tcp</type>
    <port>445</port>
  </service>
</service-group>
```
LAN内での名前解決に使用するmDNSを設定します。これを設定することで簡単にファイルサーバにアクセスできます。mDNSはAvahiというパッケージを使用します。

8行目の`TimeMachine`の部分はsambaで設定した共有フォルダ名と一致させてください。

## 最後に再起動する
もしくは

``` bash
sudo systemctl restart smbd
sudo systemctl restart avahi-daemon
```
でも構いません。(avahi-daemonは再起動すら必要ないかもしれないです。)

# うまくいかないときは
## 操作を完了できませんでした。（OSStatusエラー-1073741275）
Sambaで設定したフォルダ名とavahi-daemonで設定した共有フォルダ名が一致していない可能性があります。[^4]
MacにTimeMachineに対応した`TimeMachine`という共有フォルダがありますよと言っておきながら実際にはなくて共有フォルダにアクセスできないことが原因です。

## 選択したネットワーク・バックアップ・ディスクで、必要な機能がサポートされていません。
上記のエラーが発生した場合はSambaの設定がきちんとできていないか残念ながらバージョンが古い可能性があります。
インストールされているsambaのバージョンを確認したり、設定を見直したりしてみてください。

# あとがき
~~この記事の内容はRaspberryPiでは未検証です。あくまでも多分動くかもしれないということで参考までにお願いします。というのも現在手元にRaspberryPiと外付けHDDがないためテストできていません。ただ、上記の内容はRaspbianと構成が近い、Debianでテストしているためおそらく上記でもうまくいくと思います。テストできたら改めて更新します。~~

RaspberryPi4を使って導入できることを確認しました。

わかりにくい表現、間違いなどがあればご指摘いただければ幸いです。

# 余談
今回は強い思いがあるので聞いてください。(つまり聞かなくて大丈夫です笑)

MacBook Proをバックアップする際にいつも週1でUSBの外付けHDDにバックアップしていました。
あちこち持ち歩くことも多くあり、また週1のバックアップでは少し心配だったこともあり、
（もっとこまめにバックアップを取っていれば数時間前のファイルに戻せたのに！ということがちょくちょくあり…）
ファイルサーバを立ててネットワーク経由でこまめにバックアップしたいななんて思っていたところ何と
USB3.0、GigaBit対応のLAN、おまけにメモリ最大４GBという求めていたもの全てが入ったRaspberryPi4が発表されました。
これはもうやるしかないということで待ちきれずにサーバの構築手順を確認したわけですが、肝心のRaspberryPi4はいつ日本で発売になるのでしょうか…


(ちなみにこれをイントロに書こうと思ったのですが、思った以上に長くなってしまったので後ろに持ってきたのはここだけの話です。)

# Reference
https://ideal-reality.com/computer/server/time-machine-samba/
[^1]: https://packages.debian.org/samba
[^2]: https://www.samba.org/samba/docs/current/man-html/smb.conf.5.html
[^3]: https://www.samba.org/samba/docs/current/man-html/vfs_fruit.8.html
[^4]: https://superuser.com/questions/1342391/osstatus-error-when-trying-to-tell-time-machine-to-use-external-server-as-backup