Raspberry Pi 4 でSamba 4.11を使ってファイルサーバー&TimeMachine

# 環境
* Raspberry Pi 4 ModelB
* Raspbian 4.19
* USB HDD (ext4 format)

例として
FileServerディレクトリ
/media/backup

TimeMachineディレクトリ
/media/backup/TimeMachine
としています。

# まえおき
Raspi4にSambaを入れてファイルサーバー&Timemachine環境を作った際の
構築方法を残します。

aptitudeで取得できるSamba 4.9.5では、後述のバグがあり、Timemachineが
動作しなかったため、4.11.2をソースコードから入手して、パッチを当てています。

# おことわり
USB HDDはext4でformatしたものをUSB3.0ポートに繋いでいます。
hfsplus等を使用したい場合は、別記事を参照してください。

~~また、samba 4.11では、Sambaプロトコルのバージョン1が非対応になっています。~~
~~古い端末やアプリで利用する場合は、互換性がなく接続出来ない可能性があります。~~
上記、4.11.0のバグだったようで、4.11.2で試した所、smb.confのglobalセクションに

```
client min protocol = NT1
```

設定で起動できることを確認しました。

# 構築方法
## 1. 外付けHDDの自動マウント
### 1.1 HDDのデバイス名を取得

```
$ sudo fdisk -l
```

### 1.2 UUIDを確認

```
$ sudo blkid [デバイス名]
```

### 1.3 fstabにマウントポイントを追加しマウント
ここでは、マウントポイントを"/media/backup"とする。

```
$ sudo vi /etc/fstab
--- 下記を追記
UUID=[1.2で確認したUUID]       /media/backup   ext4    defaults        0       0
```
保存後、マウントし直す

```
$ sudo mount -a
```

マウントポジションのオーナーをSambaで利用するアカウントへ変更

```
$ sudo chown [sambaユーザー]:[グループ] -R /media/backup
```

## 2. Sambaコンパイル
### 2.1 ソースコードを入手して展開
記事時点では、4.11.2でしたが、最新が出ている場合は、そちらを入れたほうが良いです。

```
$ wget https://download.samba.org/pub/samba/stable/samba-4.11.2.tar.gz
$ tar zxvf samba-4.11.2.tar.gz
```

### 2.2 手動パッチ
fruitモジュールの一部にバグがあり、ARM CPUだとsambaのコンフィグレーションでtimemachineの最大サイズを利用した時にsize overflowが発生するため、手動でパッチする。
(https://bugzilla.samba.org/show_bug.cgi?id=13622)

以下にdiffを記載

```
$ diff -u ~/samba-4.11.2/source3/modules/vfs_fruit.c ~/local/source3/modules/vfs_fruit.c
--- ~/samba-4.11.2/source3/modules/vfs_fruit.c       2019-09-11 15:44:24.000000000 +0900
+++ ~/local/source3/modules/vfs_fruit.c
2019-10-26 13:49:05.180629648 +0900
@@ -118,6 +118,18 @@
 #define AFPRESOURCE_EA_NETATALK "user." NETATALK_RSRC_XATTR
 #endif
 
+#ifndef OFF_T_MAX
+#if SIZEOF_OFF_T == SIZEOF_INT8_T
+#define OFF_T_MAX INT8_MAX
+#elif SIZEOF_OFF_T == SIZEOF_INT16_T
+#define OFF_T_MAX INT16_MAX
+#elif SIZEOF_OFF_T == SIZEOF_INT32_T
+#define OFF_T_MAX INT32_MAX
+#elif SIZEOF_OFF_T == SIZEOF_INT64_T
+#define OFF_T_MAX INT64_MAX
+#endif
+#endif
+
 enum apple_fork {APPLE_FORK_DATA, APPLE_FORK_RSRC};
 
 enum fruit_rsrc {FRUIT_RSRC_STREAM, FRUIT_RSRC_ADFILE, FRUIT_RSRC_XATTR};
@@ -6964,7 +6976,8 @@
                return true;
        }
 
-       if (bandsize > SIZE_MAX/nbands) {
+       //if (bandsize > SIZE_MAX/nbands) {
+       if (bandsize > OFF_T_MAX/nbands) {
                DBG_ERR("tmsize overflow: bandsize [%zu] nbands [%zu]\n",
                        bandsize, nbands);
                return false;
```

### 2.3 依存パッケージの入手

面倒くさいので、debian9のbootstrup.shを利用。
https://git.samba.org/?p=samba.git;a=blob_plain;f=bootstrap/generated-dists/debian9/bootstrap.sh;hb=v4-11-test

拘る人は、自分でパッケージを落としてきてください。

```
$ chmod +x bootstrup.sh
$ sudo ./bootstrup.sh
```

### 2.4 Sambaのconfigureとコンパイル

configure。smb.confを/usr/local/samba配下に置きたくないため、
sysconfdirをオプション指定。

```
$ ./configure --sysconfdir=/etc/samba/
```

make
せっかちなのでcore3でコンパイル。
15分くらいかかります。

```
$ make -j 3
```

インスール

```
$ sudo make install
```

## 3. ファイルサーバー&Timemachine環境構築
### 3.1. systemctlにサービス登録
サービス登録用のファイルを作成して、保存。
ファイル内容をそのまま貼りますので保存してください。

``` /usr/lib/systemd/system/smb.service
[Unit]
Description=Samba SMB Daemon
After=syslog.target network.target nmb.service winbind.service

[Service]
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba
Type=forking
NotifyAccess=all
PIDFile=/usr/local/samba/var/run/smbd.pid
LimitNOFILE=65535
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/local/samba/sbin/smbd $SMBDOPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
```

``` /usr/lib/systemd/system/nmb.service
[Unit]
Description=Samba NMB Daemon
After=syslog.target network.target

[Service]
Environment=KRB5CCNAME=FILE:/run/samba/krb5cc_samba
Type=forking
NotifyAccess=all
PIDFile=/usr/local/samba/var/run/nmbd.pid
EnvironmentFile=-/etc/sysconfig/samba
ExecStart=/usr/local/samba/sbin/nmbd $NMBDOPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
LimitCORE=infinity

[Install]
WantedBy=multi-user.target
```

systemctlのサービス登録

```
$ sudo systemctl enable smb nmb
```

## 3.2 sambaユーザー作成
システムに登録されているユーザーで、ファイルサーバーログイン時に
使用するユーザーを登録する。

```
$ sudo /usr/local/samba/bin/pdbedit -a [ユーザー名]
```

### 3.3 smb.conf作成
/etc/samba配下にsmb.confを作成
必要項以外省いてますが、起動しない場合は全部公開します。

``` /etc/samba/smb.conf
[global]
ea support = yes
vfs objects = catia fruit streams_xattr
fruit:model = MacSamba
fruit:resource = file
fruit:metadata = netatalk
fruit:locking = netatalk
fruit:encoding = native
streams_xattr:store_stream_type = no
streams_xattr:prefix = user.
load printers = no
printing = bsd
unix charset = UTF-8
unix extensions = no
security = user
workgroup = WORKGROUP
dns proxy = no
interfaces = [raspi4に割り当てているstaticIP/subnet] [インタフェース名]
bind interfaces only = yes
log file = /var/log/samba/log.%m
max log size = 1000
syslog = 0
panic action = /usr/share/samba/panic-action %d
server role = standalone server
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
pam password change = yes
map to guest = bad user

## FileServer config
[backup]
    comment = backup
    path = /media/backup
    writeable = yes
    guest ok = no
    force user = [sambaユーザー]
    force create mode = 0777
    force directory mode = 0777
    browsable = yes

## TimeMachine config
[TimeMachine]
    comment = Backup for Mac
    path = /media/backup/timemachine
    guest ok = no
    force user = [sambaユーザー]
    browsable = yes
    writable = yes
    fruit:time machine = yes
    fruit:time machine max size = [TimeMachineで使用するディスクサイズ。2TBなら2T、500GBなら500G]
```

### 4. Samba起動と確認
起動

```
$ sudo systemctl start nmb.service
$ sudo systemctl start smb.service
```

確認。Active状態が"active (running)"になっていればOK

```
$ sudo systemctl status smb.service
● smb.service - Samba SMB Daemon
   Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: enabled)                                                                     
   Active: active (running) since Sun 2019-10-27 03:22:42 JST; 1 weeks 2 days ago                                                                            
 Main PID: 18627 (smbd)
   Status: "smbd: ready to serve connections..."
    Tasks: 5 (limit: 4915)
   Memory: 8.4M
   CGroup: /system.slice/smb.service
           ├─18627 /usr/local/samba/sbin/smbd
           ├─18633 /usr/local/samba/sbin/smbd
           ├─18634 /usr/local/samba/sbin/smbd
           ├─18635 /usr/local/samba/sbin/smbd
           └─20448 /usr/local/samba/sbin/smbd
```

# 5. 端末からファイルサーバーへアクセス

MacならFinderから
移動>サーバーへ接続で

```
smb://[raspi4のアドレス]
```

# 6. TimeMachine設定
システム環境設定>TimeMachine
ディスクを選択で、自動的に設定したTimeMachineが表示されるはず。


以上です。