# Raspberry Pi 4 (8GB) でZFSなSAMBAサーバ ###### Raspberry Pi 4, Ubuntu 20.04, ZFS, LXD, Samba この文章は8GB版のRaspberry Pi 4を使ってファイルサーバを作ったときのメモです。まだチェックが終了していませんので、ご注意ください。何かあればコメントをご記入いただけると助かります。 ## 準備 ### 用意した環境と物 - ネットワーク - インターネットに繋がったプライベートネットワークを利用しました。もちろんLANケーブルも必要です。 - ドライブレコーダ向け高耐久microSD - 今回は32GBのmicorSDを利用しました。 - microSDにイメージを書き込むためのPC(母艦) - いつも利用しているUbuntuのデスクトップ機を管理者で利用しました。 - microSDに書き込むためのリーダライタ - 母艦が持っている場合はもちろん不要です。 - Raspberry Pi 4 (8GB版) - Linuxは余ったメモリをファイルのキャッシュに利用するようなのと、ZFSがメモリ喰いだとのことで、一番メモリを搭載しているものを選択しました。 - Raspberry Pi 4用のケース - 放熱がよくファンがうるさくないものを選びましょう。今回はファンレスのケースを選びましたが、今ひとつ放熱が悪かったので、静音ファンを搭載しているものが良いと思います。 - ACアダプタ(RasPi4用) - USBのHDD(RasPi4用、ファイルサーバが共有するディスク) - 音を気にする場合はSSDを利用するのも手です。ネットワークがGbEなので、今回はHDDを使いました。 - USBキーボード(RasPi4用) - 設定用。USキーボードがデフォルトですので、あればUSキーボード。 - HDMIモニタ(RasPi4用) - 設定用。もちろん、接続コードも必要です。 ### 方針 - OSは使い慣れているUbuntu 20.04 Server (ARM64) - 導入したUbuntuはなるべく変更しない - sshサーバのパスワード認証は停止してポートを変更する - USBのHDDのファイルシステムはZFSを利用する - snap版のLXDを導入して、sambaはLXDコンテナに導入する - LXDコンテナのubuntuユーザはロックする - LXDコンテナのsshサーバは削除する - ホスト及びコンテナ側のセキュリティアップデートは自動のまま ## microSDへのOSの導入 母艦での作業になります。 ### イメージのダウンロード [Install Ubuntu on a Raspberry Pi](https://ubuntu.com/download/raspberry-pi)から、Ubuntu 20.04.x Serverの64ビット版をダウンロードします。 ダウンロードしたイメージを元に戻しておきます。(元に戻しながら書き込むこともできますが、今回は一つ一つ実施しました。)ターミナルを開いてイメージをダウンロードしたディレクトリに移動して、 ``` unxz ubuntu-20.04.x-preinstalled-server-arm64+raspi.img.xz ``` を実行するとubuntu-20.04.x-preinstalled-server-arm64+raspi.imgファルが得られます。 ### microSDへの書き込み microSDを挿入します。ファイルマネージャのウィンドウが開きますが、気にしないでください。ファイマネージャで==ubuntu-20.04.x-preinstalled-server-arm64+raspi.img==を右クリックして、==ディスクイメージライタで開く==を実行します。 挿入したmicroSDを書き込み先に指定して、イメージを書き込みます。**書き込み先のデバイスは消されてしまいますので、書き込み先を間違えないようにしてください。** ## Raspberry Pi 4の初期設定 microSDを母艦から抜いて、Raspberry Pi 4に挿入します。キーボードやモニタやACアダプタを接続して、Raspberry Pi 4を起動します。しばらく放置しておくとディスクアクセスがなくなりますので、その後にコンソールからログインします。ユーザ名はubuntuパスワードはubuntuです。すぐにパスワードの変更を求められますので、新しいパスワードを設定しましょう。**USキーボード以外を利用している場合には、英数字以外を使わないように**しましょう。パスワードは忘れないように。 ### やっておいた方が良い設定 タイムゾーンは ``` dpkg-reconfiure tzdata ``` で変更します。 USキーボード以外を利用している場合は ``` dpkg-reconfigure keyboard-configuration ``` でキーボードの変更を行ってください。 ### IPアドレスの固定 IPアドレスが固定されていないといろいろと不便です。UbuntuのIPアドレスはnetplanで管理されています。/etc/netplan/60-eth0.yamlを次のような感じで作成します。 ``` network: ethernets: eth0: dhcp4: false dhcp6: false link-local: [ ] addresses: - 192.168.0.2/24 gateway4: 192.168.0.1 nameservers: addresses: - 192.168.0.1 search: - localdomain version: 2 ``` IPv6を使っている場合は、dhcp6とlink-localのラインは不要です。もちろん、アドレスやネームサーバやゲートウェイは自分の環境に合わせる必要があります。ターミナルから ``` sudo netplan apply ``` を実行すれば、固定は完了です。 ### sshサーバの設定変更 利用者次第ですが、 1. パスワード認証を停止して、公開キー認証やその他より強固な認証を利用することをおすすめします 2. ポートをデフォルトの22/tcp以外に変更しておくことをご検討ください。 私は両方行っています。 ### パケットのコントロール 必要に応じて導入をご検討ください。なお、コンテナのネットワークをeth0に接続しない場合は、DNATを設定する必要があります。 ## USB HDDの設定 zfs-dkmsパッケージを導入します。 ``` sudo apt install zfs-dkms ``` ちょっと時間がかかります。 ### ZFS poolの作成 ディスク名は、ls -al /dev/disk/by-id/ で確認してください。ここではmypoolというストレージプールを作成します。もちろん、必要に応じてmirrorやraidz等を使うこともできます。詳細は''arch ZFS''でGoogleなどを検索すると情報を得ることができます。 ``` sudo zpool create \ -o ashift=12 \ -O acltype=posixacl -O canmount=off -O compression=lz4 \ -O dnodesize=auto -O normalization=formD -O relatime=on \ -O xattr=sa -O mountpoint=/ -R /mnt \ mypool "/dev/disk/by-id/xxxxxxx" ``` ### lxdの停止 ``` sudo snap stop lxd sudo systemctl stop snap.lxd.daemon.socket sudo mv /var/snap /var/snap.save ``` を実行します。 ### snapおよびlxd用データセットの作成 コンテナのバックアップなどを作成するときに作業領域としてmicroSDが利用されてしまうので、USBディスクに追い出してみました。 ``` zfs create mypool/snap -o mountpoint=/var/snap zfs create -o canmount=off mypool/lxd ``` ### lxdの再起動 元のデータを書き戻してから起動します。 ``` sudo rsync -av /var/snap.save/ /var/snap sudo snap start lxd ``` これで、snap関連のデータをUSB HDDに置くことができました。/var/snap.save/ はうまくいったら削除していただいて大丈夫です。 ### lxdの初期化 ``` sudo lxd init ``` ZFSの場合、途中で ``` Create a new ZFS pool? (yes/no) [default=yes]: no Name of existing ZFS pool or dataset: mypool/lxd ``` にします。あとはデフォルトのままで設定しました。 ## Samba用LXDコンテナ ### コンテナの作成と起動 ``` sudo lxc launch ubutnu:20.04 samba ``` 時間がかかりますので、終わるまで待ちましょう。デフォルトではコンテナはlxdbr0に接続されており、lxdのDHCPサーバでネットワークを設定しています。 ``` sudo lxc list ``` でlxdコンテナのリストと起動している場合はIPアドレスをリストすることができます。タイムゾーンを変更します。 ``` sudo lxc exec samba -- dpkg-reconfigure tzdata ``` openssh-serverとopenssh-sftp-serverを削除します。 ``` sudo lxc exec samba -- apt remove openssh-server openssh-sftp-server ``` snapもlxdも不要だと思いますので、停止してしまいました。 ``` sudo lxc exec samba -- snap stop lxd sudo lxc exec samba -- snap remove lxd sudo lxc exec samba -- systemctl disables snapd sudo lxc restart samba sudo lxc exec samba -- apt remove snapd ``` たぶんコンテナ内のubuntuユーザは要りません。 ``` sudo lxc exec samba -- usermod -L ubuntu ``` ### ネットワークをeth0につなげます ``` sudo lxc network attach eth0 samba eth0 ``` IPアドレスを固定する必要がある場合には、ホスト側と同じように/etc/netplan/60-eth0.yamlを作成して、適用します。 ``` sudo lxc exce samba -- vi /etc/netpnal/60-eth0.yaml sudo lxc exec samba -- netplan apply ``` ### sambaの導入 ``` sudo lxc exec samba -- apt install samba ``` nmbdが不要な場合は必要に応じて停止してください。 ``` sudo lxc exec samba -- systemctl stop nmbd sudo lxc exec samba -- systemctl disable nmbd ``` ### samba用のZFSデータセットの作成 ``` sudo zfs create mypool/samba -o mountpoint=/samba ``` この下にユーザ用のデータセットを作成します。 ### sambaユーザの追加 ``` sudo lxc exec samba -- useradd hoge sudo lxc exec samba -- smbpasswd -a hoge ``` ユーザの借パスワードは控えておきましょう。ユーザのuidを調べます。 ``` sudo lxc exec samba -- grep hoge /etc/passwd ``` おそらく初めて作るユーザのuidは==1001==です。ユーザ用のデータセットを作成し、sambaコンテナにbind mountします。以下で設定するuidやgidは元のuidに1000000を足したものです。 ``` sudo zfs create mypool/samba/hoge sudo chown 1001001:1001001 /samba/hoge sudo lxc config device add samba hoge disk source=/samba/hoge path=/home/hoge ``` sambaを再起動します。 ``` sudo lxc exec samba -- systemctl restart smbd ``` ### sambaコンテナの自動起動 ``` sudo lxc config set samba boot.autostart true ``` #### 起動時の問題 USB HDDの認識タイミングにより、/var/snapがマウントされないままRaspberry Pi 4が起動してしまい、コンテナが見つからないので起動しないことがあります。 ``` sudo snap stop lxd sudo systemctl stop snap.lxd.daemon.socket sudo rm -rf /var/snap/lxd sudo zpool import mypool sudo snap start lxd ```` 等で、lxdが正しく起動すると思います。頻繁に起きる場合には、/var/snapのマウント状況を調べて、マウントされていない場合にはコマンドが実行されるようにroot権限で起動するスクリプトにして、crontabに@rebootで起動するようにしておくと解決されるかもしれません。 ## 自動アップデート ホスト側もコンテナ側も、デフォルトでセキュリティアップデートが自動で適用されるようになっています。自動リブートが必要であれば/etc/apt/apt.conf.d/50unattended-upgradesを変更します。ですが、一日に一回再起動することをご検討ください。 ## その他 ### snapshot mypool/samba以下のデータのsnapshotはもちろんホスト側でしか管理できません。適当な間隔ですナプショットを撮るようにしましょう。なお、snapshotが多くなりすぎると性能が低下するようです。個人的には以下のルールで運用しています。 1. 毎分snapshotを作成する。 2. 午前0時のsnapshotは1ヶ月保持する。 3. 毎正時のsnapshotは1週間保持する。 4. その他のsnapshotは1時間保持する。 ユーザは、sambaコンテナのHOME共有の.zfsディレクトリからsnapshotにアクセスすることができます。sambaコンテナは非特権モードですので、コンテナ側からsnapshotが直接影響をうける可能性を小さくできます。 ### バックアップ もう一つZFSのシステムがあれば、zfs sendでsnapshotを利用した増分バックアップが行なえます。詳しいことは”arch zfs”で検索サイトを検索してください。個人的にはmbufferと組み合わせてバックアップしています。 * 午前0時のsnapshotを利用して別のシステムにzfs sendで増分バックアップする 別のファイルシステムへのバックアップは、zfs diffでsnapshot間の差分情報を取得して、それを元に、バックアップすることが可能だと思います。 ### raidz2 試しにAmazonさんから1万円ちょっとで手に入れることができるUSB 3.0接続の5ベイのHDDケースに、同じモデルのCMR方式のHDDを5台入れてreidz2で構成してみました。ほぼ使っていない状態であれば、70MB/secぐらいで書き込めるようです。一月ほど経ちましたが、今の所壊れていません。 ### microSDのバックアップ 母艦にmicorSDを挿して、イメージを保存しましょう。