はじめに
みなさんのお家にも一台はNASがあるでしょう。
かく言う私の家にもNASが一台あるのですが、最近になってNASに割いている計算リソースが勿体ないと感じてきていました。
現状のNAS構成
- OS: TrueNAS Scale
- CPU: AMD Ryzen 5 4500
- RAM: 32GB
- ブートSSD: M.2 SSD 512GB [ZFS]
- HDD: 6TB *2 (RAID1) [ZFS]
パッと見ですぐに分かると思いますが、NASにしては結構な計算リソースを持っています。
もちろん数十人で使うだとか、様々なアプリを動かしてるだとかなら話は別なんですが……。
私はこのNASを一人で使用しており、しかもサービスはSMBしかまともに動かしていません。
大変もったいない!!!
ので、もっと柔軟性を持たせていろんなことさせたいというわけです。
(もちろん安定性は多少落ちますが、ZFSの恩恵はそのまま受けられるので問題ないとしています)
移行について
移行先OSについてはUbuntu Serverを選定しました。
これは私はUbuntuの扱いに慣れているというのもありますが、UbuntuはOpenZFSを公式にサポートしているためでもあります。
NASである以上、耐障害性に優れたZFSは使わない手はないですからね!
現状のTrueNASでもすべてのディスクがZFSですから、そのままOSを差し替えるだけでZFSは継続して使うことになります。
事前に確認しておくこと
ZFSは耐障害性に優れ利便性の高いファイルシステムであるため、異なるOS間でも複雑な操作は必要とせず、データディスクはそのままに移行することができます。
が、設定されているZFS関連の設定もまるっとそのまま移行されるので、事前に確認しておきたいところです。
またTrueNAS特有の設定もあるので、ここで一緒に確認します。
ZFS側の設定
- RAID設定
- スナップショット
- ZFS重複排除
- ZFS圧縮
- 暗号化
- マウントポイント
- ACL
この設定はプール毎に保存されているので、インポートすると自動で復旧されます。
暗号化はインポート時にパスワードorキーファイルを求められるので、プールをエクスポートする前に確認しましょう。
またACLですが、インポート後でも変更可能なので今は把握するだけでよいでしょう。Ubuntuではposixかoffが望ましいですね。
# プール名の確認
$ zfs status
# プールのバージョン確認
$ zpool get version {プール名}
$ zfs get version {プール名}
# スナップショットの確認
$ zfs list -t snapshot
# ZFS重複排除の確認
$ zfs get dedup
# ZFS圧縮の確認
$ zfs get compression
# 暗号化の確認
$ zfs get encryption
# マウントポイントの確認
$ zfs list
# ACLの確認
$ zfs get acltype
さて、私のNASはZFS圧縮・暗号化・重複排除はOFFにしていますので気にする問題はなさそうです。
ACLはところどころNFSv4が使われているため、Ubuntuにてインポート後にposixかOFFに切り替えを行います。
TrueNAS側の設定
- データスクラブ
- HDDハイバネーション
- S.M.A.R.T.チェック
この辺りの機能はTrueNASの機能のため、Ubuntuに移行した際は新しく設定し直す必要があります。
データスクラブは以下のコマンドで実行できるため、cronで月1回程度の頻度で実行するといいですね。
$ zpool scrub {プール名}
HDDハイバネーションはhdparm等でスピンダウン設定をするのがスマートだと思います。
私は24時間ぶん回す派なので今回は設定しません。
S.M.A.R.T.に関してはsmartmontools等を使用するといいでしょう。
(ここでは各サービスの使用方法は解説しません)
TrueNASの設定をバックアップしておく
もしUbuntuServerをインストールした後にTrueNASに戻したくなった場合、コンフィグのバックアップを取っておくことですぐに戻せるようになるので、念のために取っておきましょう。
GUIにて
System -> Advanced Settings -> Manage Configration -> Download File
からバックアップデータが入ったtarファイルが落とせます。
プールをエクスポートする
いよいよ移行段階です。
OSを入れ替えるため、ZFSのプールをエクスポートします。
GUIでは
Storage -> Export/Disconnect
からエクスポートできます。
いくつかオプションがありますが、チェックを入れるのはConfirm Export/Disconnectのみで十分です。
ちなみに、Destroy data on this pool?というプールを消去する恐ろしいオプションがあるので、怖い方はCUIからエクスポートしたほうが無難かもしれません。
# プールのエクスポート
$ zpool export {プール名}
UbuntuServerをインストール
- TrueNASにて、すべてのデータプールのエクスポートを行う
- NASをシャットダウンし、念のためデータプールの入ったHDDのケーブルを抜いておく
- UbuntuServerのインストールメディアを用意し、SSDにインストールする
- UbuntuServerインストール後、シャットダウンさせHDDを接続して起動し直す
ざっくりですがこの手順で十分でしょう。
OSインストール時に間違えてデータプールの入ったメディアをフォーマットしてしまう恐れがあるので、ポカしないようにケーブルは事前に抜いておきましょうね。
データプールのインポート
# パッケージの更新
$ sudo apt update
$ sudo apt upgrade
# OpenZFSのインストール
$ sudo apt install zfsutils-linux
# インポート可能なプールの一覧表示
$ sudo zpool import
HDDが正常に認識されていれば、ここでインポート可能なデータプールの一覧が表示されます。
# データプールのインポート
$ sudo zpool import {プール名}
これでデータプールに記録されていたマウントポイントにプールがマウントされます。
マウント先のディレクトリなどは以下のコマンドで確認可能です。
# ZFSのマウントポイント一覧を表示する
$ zfs list
# ZFSプールのステータスを確認する
$ zfs status
ここで、TrueNAS固有のデータセットが出てきます。
ix-から始まるもので、これはTrueNASでアプリケーションなどのデータ保存先に使われていたデータセットになるので、不要なら消してしまっていいでしょう。
このコマンドはデータセットを削除するコマンドなので、間違えて重要なデータを保存しているセットを消さないようにしましょう。
復旧不能なので心配な場合はスナップショットを取ることをおすすめします。
# データセットを削除する
$ sudo zfs destroy -r {プール名}/{データセット名}
権限の割り当て
TrueNASにてACLを書き直してない場合はまだ残っていますので、ここで解除しておきます。
# ACLを解除する
$ sudo zfs set acltype=off {プール名}/{データセット名}
これでLinux標準のパーミッションが適用されるようになるので、場合に応じてデータを閲覧・編集するユーザー等に権限を変更しておきます。
# 所有者の変更
$ sudo chown -R {ユーザー名}:{グループ名} /{プール名}/{データセット名}
パーミッションは恐らく0700になっているはずですので、ユーザーのみが触るようなら変える必要はありませんが、場合に応じて変更しておきましょう。
以上でOSの移行は完了です。
移行後の確認
はじめに触れていますが、TrueNAS固有の機能は当然動いていないので、必要に応じて設定する必要があります。
- データスクラブ
- HDDハイバネーション
- S.M.A.R.T.チェック
SMBの構築
ここからはおまけです。
# Sambaのインストール
$ sudo apt install samba
# 設定ファイルを編集する
$ sudo nano /etc/samba/smb.conf
以下のようにコンフィグを設定します。
[global]
workgroup = WORKGROUP
server string = {ネットワーク上の表示名}
map to guest = never
log file = /var/log/samba/log.%m
max log size = 1000
[{任意のパス名}]
path = /{プール名}/{データセット名}
browseable = yes
writable = yes
valid users = {ファイルを読み書きするユーザー名}
force user = {ファイルを読み書きするユーザー名}
create mask = 0700
directory mask = 0700
force create mode = 0700
force directory mode = 0700
read only = no
create maskとdirectory maskはファイルを書き込んだ際のパーミッションマスク、
force create modeとforce directory modeはファイルを書き込んだ際のパーミッション設定です。
上記ではTrueNASのデフォルト設定である700に合わせていますが、用途に応じて644/755等に変更してください。
{任意のパス名}はWindows等で参照する際に使用する、
\\{サーバーIPアドレス}\{パス名}
このSamba上での仮想パスになります。
testparmでコンフィグファイルのエラーチェックが可能です。
# smb.conf のエラーチェックをする
$ testparm
Sambaのユーザー作成は以下のコマンドで可能です。
ここで設定したユーザーは、実際にSambaで使用するユーザー名・パスワードになります。
# Sambaのユーザーを作成する
$ sudo smbpasswd -a {ユーザー名}
設定が完了したらデーモンを立ち上げます。
$ sudo systemctl enable smbd
$ sudo systemctl start smbd
別途ファイヤウォール等を使用している場合はポートを開けておくと良いでしょう。
$ sudo ufw allow samba
あとはWindowsなどのSambaクライアントで、先程設定したパス・ユーザー名・パスワードでアクセス可能となります。