Raspbian Stretch をバックアップ&ファイルサーバー化

# はじめに

RaspberryPI を Mac のバックアップサーバー&ファイルサーバーにするべく， avahi-daemon と netatalk をインストールしてみます。

2017年10月10日時点のインストール手順なので，新しい Raspbian をご使用の場合は異なる手順になる場合がありますので予めご了承ください。

# 使用する主要なソフトウェアとバージョン

- RASPBIAN STRETCH LITE (2017-09-07)
- netatalk 3.1.11
- avahi-daemon 0.6.32-2

※ これらは頻繁にバージョンアップするので，必ず一致させる必要はありません。

# 構成

お好きな構成にしていただければと思いますが，参考までに私が作った構成を紹介します。

Raspberry PI に 2 台のポータブル HDD を USB 接続して，バックアップ先は一方のポータブル HDD にします。片方は ext4 でフォーマットしてあり，もう片方は ExFAT でフォーマットしたものになります。

**注意**

> Linux Native ではないファイルシステムでフォーマットされた HDD の使用は推奨されません。
> 詳細は http://www003.upp.so-net.ne.jp/hat/netatalk/andsamba.html の「やらないほうがいいこと」をご覧ください。
> 特に理由がなければファイルシステムは ext4 等にすることをオススメいたします。

安定した電力を供給したいので，ポータブル HDD はセルフパワー供給可能な USB ハブを使用します。

つまり， Raspberry PI の USB ポートには USB ハブがついていて， USB ハブには ポータブル HDD が接続されています。USB ハブには電源アダプターを接続した状態にします。 Raspberry PI 本体への電源供給は USB ハブから USB ケーブル経由で行います。

ただ， Raspberry PI 本体の USB ポートにポータブル HDD を接続しても電力不足で HDD が動かない可能性があります。

# Raspbian をダウンロード

    https://www.raspberrypi.org/downloads/raspbian/

上記サイトから「RASPBIAN STRETCH LITE」をダウンロードします。
2017年10月10日時点で，ダウンロードしたのは以下のファイルです。

    2017-09-07-raspbian-stretch-lite.zip

ダウンロードした上記 zip ファイルを展開します。すると「 *2017-09-07-raspbian-stretch-lite.img* 」というファイルが展開されます。

# Raspbian を SD カードに書き込み

SD カードを mac に挿します。
次のコマンドで SD カードのディスクを確認します。

```bash
df -h
Filesystem      Size   Used  Avail Capacity iused               ifree %iused  Mounted on
/dev/disk1s1   466Gi  146Gi  318Gi    32% 2106888 9223372036852668919    0%   /
　：
/dev/disk1s4   466Gi  1.0Gi  318Gi     1%       1 9223372036854775806    0%   /private/var/vm
/dev/disk2s1   7.4Gi  2.5Mi  7.4Gi     1%       0                   0  100%   /Volumes/NO NAME
```

/dev/disk2s1 が SD カードのディスクということがわかりました。 /dev/disk2s1 という文字は環境によって変わるので，必ず df -h コマンドで調べるようにしてください。

アンマウントしましょう。

**注意**

> ここで間違ったディスクを指定して作業を進めると意図しないディスクを消してしまう可能性があります。良く見て確かめて入力してください。
> 間違った操作でデータを消したとしても当ページの記事を書いた私自身は責任を負いかねますので，自己責任で作業してください。

```bash
diskutil unmount /dev/disk2s1
```

次に書き込みを行いますが，アンマウントした状態のディスクの名前は少し変わります。「/dev/diskNsM」のsMの部分を除き，diskNの頭にrをつけます。「/dev/disk2s1」であれば/dev/rdisk2となります。

「2017-09-07-raspbian-stretch-lite.img」のあるディレクトリーで次のコマンドを実行します。

```bash
sudo dd bs=1m if=2017-09-07-raspbian-stretch-lite.img of=/dev/rdisk2
```

書き込みが終わると，自動的にマウントされるのでアンマウントして Raspberry PI にセットして起動します。

# IP アドレスを固定にする

/etc/dhcpcd.conf を開き，ファイルの最後に次の通り設定を行います。
ここでは IP アドレスを 192.168.1.100 とします。

```
interface eth0
static ip_address=192.168.1.100/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8
```

# SSH を使用可能にする

注意しなくてはならないのは，過去のRaspbian とは違い，SSHが最初から使用可能な状態になりません。ディスプレイとキーボードで作業してください。

root でログインして，次のコマンドを実行します。

```bash
touch /boot/ssh
```

再起動します。以降は SSH で接続して作業ができます。

# セットアップ

次のコマンドを実行します。

```bash
raspi-config
```

## ロケールの変更

Localization Options を選択します。
Change Locale を選択します。

ロケールの一覧が現れるので，スクロールして，「ja_JP.UTF-8 UTF-8」に＊を入れます。
次のページでデフォルトのロケールをどれにするか聞かれるので「ja_JP.UTF-8 UTF-8」にします。

## タイムゾーンの変更

Localization Options を選択します。
Change Timezone を選択します。

Asia を選択します。
Tokyo を選択します。

## 再起動

raspi-config のトップページで，「Finish」を選択すると，再起動するかどうかを聞かれるので，再起動します。

# 必要なソフトウェアのインストール

## 既存のソフトウェアのアップデート

```bash
apt-get update && apt-get upgrade -y
```

## netatalk が必要とするソフトウェアのインストール

```bash
apt-get install -y build-essential libevent-dev libssl-dev libgcrypt-dev libkrb5-dev libpam0g-dev libwrap0-dev libdb-dev libtdb-dev libmariadbclient-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 exfat-fuse
```

# netatalk のインストール

## netatalk のダウンロードと展開

```bash
cd /usr/local/src
wget http://prdownloads.sourceforge.net/netatalk/netatalk-3.1.11.tar.bz2?download -O netatalk-3.1.11.tar.bz2
tar xvf netatalk-3.1.11.tar.bz2
cd netatalk-3.1.11
```

## configure

```bash
./configure \
        --with-init-style=debian-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-daemon=/usr/bin/dbus-daemon \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.0
```

## ビルド

```bash
make
make install
```

# Time Machine 用ユーザーを作成

ユーザーを追加して，パスワードも設定します。

```bash
useradd -m timemachineuser
passwd timemachineuser
```

# USB 接続したポータブル HDD のマウント

USB 接続したポータブル HDD をマウントするには次のようにします。

## パーティション UUID を確認

ext4 でフォーマットした HDD と ExFAT でフォーマットした HDD を接続した場合以下のような表示になります。私の環境では /dev/sdaN が ext4 ， /def/sdbN が EXFAT のディスクになっています。

この後， /dev/fstab にマウントする HDD デバイスを書き込むのですが， /dev/sdaN や， /dev/sdbN を指定すると，起動する度に入れ替わる可能性があるので， PARTUUID を使います。
/dev/sda2 と /dev/sdb2 をマウントしたいので， PARTUUID をメモします。

blkid コマンドを実行します。

```bash
blkid
/dev/mmcblk0p1: LABEL="boot" UUID="B64A-B272" TYPE="vfat" PARTUUID="966259d8-01"
/dev/mmcblk0p2: UUID="9a7607bd-5bef-4afc-ac6d-63a957744962" TYPE="ext4" PARTUUID="966259d8-02"
/dev/mmcblk0: PTUUID="966259d8" PTTYPE="dos"
/dev/sda1: UUID="3f242346-3608-4410-b06a-21b24a0de2ac" TYPE="ext4" PARTUUID="b7c18357-2d46-4336-a0af-420998e9a705"
/dev/sdb1: LABEL="EFI" UUID="67E6-17ED" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="46dfc8fc-3719-4bac-9bb0-f55aa762fc5f"
/dev/sdb2: LABEL="Archives" UUID="574A-FF6F" TYPE="exfat" PARTLABEL="Windows_NTFS_Untitled_2" PARTUUID="ed93a832-45e0-46c0-8ce4-3f461f0e5c2e"
```

ファイル /etc/fstab を次のように編集します。

```
proc            /proc           proc    defaults          0       0
PARTUUID=966259d8-01  /boot           vfat    defaults          0       2
PARTUUID=966259d8-02  /               ext4    defaults,noatime  0       1
PARTUUID=b7c18357-2d46-4336-a0af-420998e9a705 /mnt/TimeMachine   ext4    defaults,user_xattr,acl    0 2
PARTUUID=ed93a832-45e0-46c0-8ce4-3f461f0e5c2e /mnt/ExfatHdd exfat-fuse sync,auto,dev,exec,gid=65534,rw,uid=65534 0 0
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that
```

# HDD のマウント先を作成

## ディレクトリーを作成

```
mkdir /mnt/TimeMachine
mkdir /mnt/ExfatHdd
```

## オーナーを変更

```
chown timemachineuser:timemachineuser /mnt/TimeMachine
chown timemachineuser:timemachineuser /mnt/ExfatHdd
```

## パーミッションを変更

```
chmod 777 /mnt/TimeMachine
chmod 777 /mnt/ExfatHdd
```

# afp の設定ファイルを編集

ファイル「/usr/local/etc/afp.conf」を編集

```
hosts allow = 192.168.1.0/24
mac charset = MAC_JAPANESE
log file = /var/log/netatalk.log
vol preset = my default values

[my default values]
valid users = timemachineuser
file perm = 0660
directory perm = 0770

[Time Machine]
path = /mnt/TimeMachine
time machine = yes

[Exfat Disk]
path = /mnt/ExfatHdd
```

# avahi-daemon と netatalk を有効化

```
systemctl enable avahi-daemon
systemctl enable netatalk
```

# 再起動

Raspberry PI を再起動して，完了です。
あとは macOS でバックアップ先を指定すれば TimeMachine として機能します。
バックアップ先を指定するときに入力を要求されるユーザーとパスワードは， timemachineuser とそのパスワードです。

# 参考

 http://netatalk.sourceforge.net/wiki/index.php/Install_Netatalk_3.1.11_on_Debian_9_Stretch