XubuntuとSambaでのNAS構築メモ

これまで某メーカーの市販NASを使用していましたが管理の自由度もあまり高くなく不満な点もあり、空きPCにXubuntuとSambaをインストールしてNAS構築したのでメモとして残しておきます。
今回私がNAS用に使ったPCは5年以上前に購入したIntelのDN2820FYKHというNUCです。
CPUはCeleron N2820で、興味本位で買ってはみたもののWindowsを入れてPCとして使うには心許ないスペックなのでずっとしまい込んでいたものを今回NASとして使うために引っ張り出しました。
比較的ロースペックなPCでも、こういった用途でなら十分利用価値があるのはありがたいです。
むしろNASという性格上ほとんど稼働させっぱなしになるので、ロースペックであるが故に消費電力も少なめなことがかえって好都合です。

冒頭でXubuntuとは書いていますが、それ以外のLinuxディストリビューションの場合でもだいたい同様に応用が利くかと思います。
試した範囲では Raspberry Pi ZERO + Raspbian LITE でも構築できました。

運用のしかたにもよりますが、私の場合は以下に重点をおいて構築しました。

・ 基本システムはXubuntuとSambaを使用。
・ 単にNASとして使えるようにするだけでなくバックアップ用ドライブも用意、1日1回定時バックアップする。バックアップにはrsyncを使用。
・ トラブルの際もできる限り少ない手間で復旧できるよう、システム、NASデータ、NASデータバックアップをそれぞれ別のドライブに分ける。

ハードウェア構成

PC本体
 Intel NUC DN2820FYKH CPU: Celeron N2820 / メモリ: 8GB
今時なら有線LANとUSB3も装備しているRaspberry Pi4辺りを使うのも良さそうです。

ディスクドライブ
 起動・システム用 SSD 64GB
10年ほど前に購入、小容量で使い道が無くなりずっと眠らせていたもの。

 NASデータ用 HDD 2TB 2.5インチ
以前から手元にあったもの。USB接続できるケースへ入れて使用。HDDのアクセス音が気になるとか、少しでも消費電力を抑えたい、快適にアクセスしたいというのであれば、同容量のHDDより割高になりますがSSDにするのも良いかも。割高とはいってもどんどん値下がりも進んで以前よりも格段に安く入手できるようになっています。

 NASデータバックアップ用 HDD 1.5TB 2.5インチ
これも手元にあったもの。同じくUSB接続できるケースへ入れて使用。NASデータ用より容量が少ないですが、私の場合はバックアップ対象を取捨選択しているのでこれでも足りています。まるごとバックアップしたい場合はNASデータ用と同程度か、多少上回るくらいの容量が良いかと思います。

システム構築

NAS用PC側での作業

Xubuntuをインストール
バージョンは近年のものであればどれでも大差は無いかと思いますが、私は18.04LTS 64bit版を使用しました。
http://ubuntutym2.u-toyama.ac.jp/xubuntu/18.04/release/ より xubuntu-18.04-desktop-amd64.iso をダウンロード。
isoファイルを実際にDVD-Rに焼いてDVDドライブを使ってインストールしても構いませんが、UNetbootin やbalenaEtcherといったツールを使うとインストール用のUSBメモリを作成できるので便利です。

インストーラが立ち上がったら、必要項目を入力してインストールします。

画像1

「日本語」を選択して「続ける」

画像2

「日本語」を選択して「続ける」

画像3

「Xubuntuのインストール中にアップデートをダウンロードする」にチェックを入れて「続ける」

画像4

「ディスクを削除してXubuntuをインストールする」を選択して「インストール」
システムのインストール先のほかにもディスクが繋がっていると、そのディスクもインストール先の候補として出てきて紛らわしいので、この段階ではまだNASデータ用やバックアップ用のディスクは繋がないほうが無難です。

画像5

確認して「続ける」

画像6

「Tokyo」を選択して「続ける」

画像7

名前やユーザー情報を適宜入力します。
「コンピューターの名前」は、他のPCからアクセスする際の名前になります。
NASとして運用中はディスプレイやキーボード、マウス等を外したり、リモートで再起動やシャットダウンを行うことも多くなるので「自動的にログインする」を選択、ひと通り確認したら「続ける」

画像8

インストールが始まりますのでそのまま待ちます。
インストールに時間がかかる場合しばらくすると画面が真っ暗になることがありますが、インストールは進んでいます。
マウスやキーボードに触れると再び表示されます。

画像9

インストールが完了したら「今すぐ再起動する」

画像10

再起動が終わったら、同一ネットワーク上のPCからログインして各種設定が行えるよう、まずSSHをインストールします。
左上アイコンをクリック、「ターミナルエミュレーター」を選択

SSHインストール

$ sudo apt install ssh

(XubuntuではこれでSSHがインストールされ有効になりますが、Raspberry PiのRaspbianの場合、最近のバージョンではSSHは初期状態ではOFFになっているようです。ターミナルから「sudo raspi-config」で設定ツールを実行し、Interfacing Options → SSH を選択してEnabledにすることでSSHが有効になります。)

SSHのインストール完了後は、同一ネットワーク上の他のPCからリモート操作できます。

別PCからのリモート操作

Xubuntu側のターミナルから続けても問題ありませんが、NASという性格上運用中はリモートからのアクセスも多くなると思いますし、普段使い慣れたPCからのほうが操作しやすいので、確認も兼ねてリモートでアクセスします。
WindowsPCからリモートで操作する場合はコマンドプロンプトやPowerShellから

> ssh Xubuntuユーザー名@コンピュータ名

あるいは

> ssh Xubuntuユーザー名@コンピュータ名.local

とすればパスワード入力後リモートでアクセスできます。
初回はパスワード入力前に "Are you sure you want to continue connecting (yes/no)?" (接続を続行してもよろしいですか?というような内容)の確認がありますので、yesを入力します。

> ssh akebi@akebi-nas.local

(ユーザー名やコンピュータ名は私の環境で設定したものをそのまま入力していますので適宜読み替えてください)

Windows10の最近のバージョンであれば標準でSSHコマンドが使えるかと思いますが、もし使えないようでしたらGitBashやCygwinを使ってSSHコマンドを使えるようにする、もしくはTeraTerm等リモートクライアントソフトを使う方法もあります。

ホスト名でのアクセスができなかったら、Xubuntu側のターミナルで

$ ip a

$ ifconfig

でIPアドレスを確認して

> ssh Xubuntuユーザー名@IPアドレス

でアクセスできるかと思います。

マウントポイント作成
NASデータ用及びバックアップ用

$ sudo mkdir /home/nas
$ sudo mkdir /home/backup

作成したディレクトリのパーミッションを変更

$ sudo chmod 0777 /home/nas
$ sudo chmod 0777 /home/backup

Sambaインストール

$ sudo apt install samba

Samba用ユーザーを作成 (ゲストアクセス専用にする場合は不要です)

$ sudo pdbedit -a akebi

パスワードを聞いてくるので入力します。(2回目は確認)
ネットワーク上の他のPCからネットワークドライブとしてアクセスする際に必要となるパスワードです。

smb.confを編集

$ sudo nano /etc/samba/smb.conf

nanoエディタでsmb.confが開きますので、一番下までスクロールさせて以下を追加します。
 初回アクセス時に認証ありの場合

[nas]
    comment = nas
    path = /home/nas
    writeable = yes
    valid users = akebi

[nas-backup]
    comment = nas-backup
    path = /home/backup
    writeable = yes
    valid users = akebi

ここではwriteable = yesとしましたが、これをnoにするとファイルを読み込むことはできても書き込みや削除はできない設定になります。例えばバックアップ側のみwriteable = noにしておくことで、バックアップを誤って書き換えたり削除してしまったり、というミスを防ぐといった使い方ができます。この設定で読み込み専用となるのはあくまでネットワークドライブとしてアクセスした場合ですので、SSH経由やNAS側システムに直接ログインすれば普通に読み書きできます。

ゲストアクセスで認証不要の場合

[nas]
    comment = nas
    path = /home/nas
    writeable = yes
    guest only = yes
    force user = akebi

[nas-backup]
    comment = nas-backup
    path = /home/backup
    writeable = yes
    guest only = yes
    force user = akebi

force userは、そのユーザーを所有者としてファイルを作成する設定です。無くても大丈夫ですが、その場合作成されるファイルの所有者はnobody:nogroupとなります。

追加したらCtrl+Oで保存、Ctrl+Xでnanoエディタ終了です。

Samba再起動

$ sudo systemctl restart smbd nmbd

Windows側設定

デスクトップ上またはエクスプローラ上のPC(マイコンピュータ)アイコンを右クリック、「ネットワークドライブの割り当て」を選択

画像11

画像12


ドライブ: 空いている好きなドライブ名を選択
フォルダー: \\AKEBI-NAS\nas (参照ボタンから辿っても可)
「サインイン時に再接続する」にチェックして[完了]ボタン

接続先にNASのコンピュータ名が表示されない場合は、ネットワーク画面で更新ボタンをクリックすると表示されるかと思います。

画像13


ネットワークドライブ割り当て完了時に「ネットワーク資格情報の入力」ダイアログが出たら、
ユーザー名: Samba用に作成したユーザー名
パスワード: Samba用ユーザー作成時に決定したパスワード
を入力、"資格情報を記憶する" にチェックを入れてOKをクリックします。

画像14

(Windowsのユーザー名及びパスワードと同一の場合、またはゲストアクセス用とした場合はこのダイアログは出ません)

エクスプローラが表示されても、まだディスクをマウントしていないのでファイルは何も表示されないと思います。
とりあえずこの状態でその場所にファイルやフォルダの読み書きができるか確認してみます。
コピー、作成、編集、削除などひと通りファイル操作してみて大丈夫そうならNASとしての基本設定は完了です。
その場所へ、ファイル名「デバイスがマウントされていません.txt」とでも付けた空ファイルでも置いておけば、ディスクがマウントされている時とされていない時とでの区別がつきやすくなって良いかと思います。

バックアップ用マウントポイントについても、必要であれば同様にドライブ名を割り当ててください。

NASデータ用外付けドライブの設定

Xubuntu(Ubuntu)の場合はNTFSも読み書きできるようですが、ここではXubuntuでもデフォルトで使われているExt4にしてみます。
接続するドライブ全体をフォーマットしますので、重要なファイルがあればあらかじめバックアップしておいてください。

まずNASデータ用USBドライブを接続します。
接続すると、既に何らかのフォーマット済みのディスクであれば大抵の場合自動的に /media/ユーザー名/ 以下にマウントされますので、それを頼りにdfコマンドでデバイス名を調べます。

$ df

該当する位置にマウントされているデバイス名を控えておきます。
例: /dev/sdb1
環境によって変動しますので実際に確認してください。

マウントされていないようであれば、blkidコマンドで調べます。

$ sudo blkid

一旦アンマウントします

$ sudo umount /dev/sdb1

mkfsコマンドでラベル「NAS」を付けてext4にフォーマット

$ sudo mkfs -t ext4 -L NAS /dev/sdb1

使用するディスクのパーティションの状態など、場合によってはフォーマットの前にパーティションの操作が必要になることがあるかもしれません。その場合は fdisk や cfdisk コマンドなどの使い方を調べてみてください。
NASのデータ用であれば基本的にGPTで1パーティションで大丈夫だと思います。

フォーマット完了したUSBドライブのUUIDを調べます

$ sudo blkid

フォーマット時に付けたラベルが LABEL=”NAS” のように表示されていますので、そのデバイスのUUIDを控えておきます。

例: 89999481-ced4-480b-9e5f-20278bf543db

同様の手順でバックアップ用HDDもデバイス名を調べ、「BACKUP」をラベルとしてフォーマット、UUIDを調べて控えておきます。

/etc/fstabに追記

$ sudo nano /etc/fstab

最終行にNASデータ用とバックアップ用それぞれの分、以下を追記します。

UUID=控えておいたUUID マウントポイント ファイルシステム nofail,noatime 0 0

# usb-hdd(nas)
UUID=89999481-ced4-480b-9e5f-20278bf543db /home/nas ext4 nofail,noatime 0 0
# usb-hdd(backup)
UUID=6df0aa81-243e-a727-8c9e-265814affd43 /home/backup ext4 nofail,noatime 0 0

/etc/fstab に書き込んでおくと、再起動時やmount -aコマンド実行時に指定されたマウントポイントにマウントされます。
取り外されることもあるデバイスですのでnofailを指定しています。
nofailでは起動時に対象デバイスがあればマウントし、無ければ無視され、対象デバイスが接続されたタイミングでマウントされます。
noatimeはファイルを読み込むたびにアクセス日時のタイムスタンプが更新されるのを無効にします。

再マウント

$ sudo mount -a

マウントされたか確認

$ df

Mounted onの欄に /home/nas や /home/backup があればマウントされています。

マウントされていないようであればもう一度UUIDやfstabの設定を見直してみて、間違いが無いようであれば一度再起動してみてください。

$ sudo reboot

マウントされたのが確認できたら、再度パーミッション変更
(今度はマウントポイントではなく外付けHDDそのもののパーミッション変更になります)

$ sudo chmod 0777 /home/nas
$ sudo chmod 0777 /home/backup

先ほどWindows側で設定したネットワークドライブからはマウントされた外付けディスクの中身が表示されていると思います。
ディスク接続前に作成した「デバイスがマウントされていません.txt」ファイルが見えていなく、エラーも出ず新たにファイルを作成、削除等できれば接続された外付けドライブへのアクセスになっているはずです。

このマウントポイントにマウントされているのは各外付けドライブのルートディレクトリになりますが、個人的にルートディレクトリに色々ファイルを書き込むのは好きではないので、NASドライブには  nas_data、バックアップドライブには backup_data というディレクトリを作成、先ほどWindows側で設定したネットワークドライブも一旦切断して、

\\AKEBI-NAS\nas\nas_data

\\AKEBI-NAS\backup\backup_data

をあらためて各ネットワークドライブに割り当てて使用しています。

画像15

画像16

一旦切断して

画像17

nas_data を含めて再度割り当て

バックアップの設定

rsyncコマンドを使うと、簡単にバックアップを行なえます。

例えば /home/nas/nas_data の内容を丸ごと /home/backup/backup_data へコピーする基本的なコマンドは以下のようになります。(NASデータ用ディスクのルートには nas_data、バックアップ用には backup_data ディレクトリを作成してある前提です)

$ rsync -av /home/nas/nas_data/ /home/backup/backup_data/

一度コピーが完了すると、もう一度同じディレクトリに対してrsyncコマンドを実行してもコピー元で変更されていないファイルはコピー動作がスキップされるので高速に処理が完了します。

NASデータドライブ側で削除したファイルも同期してバックアップ側から削除しつつコピーするには

$ rsync -av --delete /home/nas/nas_data/ /home/backup/backup_data/

とします。

これを一定の時刻に自動的に実行するにはcronを利用します。
cronの設定には、crontabコマンドを使います。

cronの設定状況確認

$ crontab -l

何も設定されていない場合は

no crontab for ユーザー名

と表示されます。

スケジュール登録

$ crontab -e

おそらく初回は設定に使うエディタの選択が出るかと思いますが、個人的にはこれまでの設定でも使ってきたnanoエディタが分かりやすくておすすめです。
初回は色々英文が表示されるかもしれませんが、行頭が「#」のものはコメントです。
最終行に例えば以下のように追記すると、毎日午前4時に先ほどのrsyncコマンドを実行、という設定になります。

0 4 * * * rsync -a --delete /home/nas/nas_data/ /home/backup/backup_data/ &> /dev/null

単純なバックアップドライブへの同期ならこれでも十分ですが、rsyncはとても多機能で、ハードリンクを使った差分履歴バックアップなども行うことができます。
ただ、凝った設定をしようとするとオプション指定も複雑になるので、シェルスクリプト等に一連の手順を記述して実行させる場合が多いです。
私は自前でこちらのスクリプトを書いて使っています。
個人的な好みからphpを使っていますので、実行するにはphpがインストールされている必要があります。

$ which php

としてパスが表示されればインストールされていますが、無い場合は

$ sudo apt install php

でインストールできます。

phpを本格的に使うならバージョン指定や用途に見合ったライブラリ等のインストールも必要になってきますが、簡単なスクリプトを実行する程度であればこれで十分です。

スクリプトは backup.php という名前で

/home/akebi/schedules/backup.php

に保存、
スクリプト内のパス設定は

$sourcePath = '/home/nas/nas_data/';
$backupDir = '/home/backup/backup_data/';

crontabでの設定は

0 4 * * * php /home/akebi/schedules/backup.php &> /dev/null

としています。

Xubuntuサーバ側のシステムディスク内でのディレクトリ作成やファイルアップロードは、WinSCPを好んで使っています。

トラブル発生時の対処

NAS用PCの故障時
PCを交換。大抵の場合ディスクをそのまま繋ぎ変えれば動作すると思われますが、動作しなかったらシステムドライブの再構築等も必要になるかもしれません。

システムドライブ故障時
XubuntuやSambaの再インストールや設定等を行う。必要な手順はメモを取っておくか、可能であればシステムまるごとバックアップしておくといいと思います。

NASデータドライブ故障時
データが入る容量のあるディスクを用意、フォーマットしてマウント設定。フォーマットすることでデバイスに振られたUUIDが変化するので、/etc/fstab 内に設定してある対応ドライブのUUID設定の変更を忘れずに。

その後、バックアップドライブからNASデータドライブへrsyncでリカバリ。

$ rsync -av /home/backup/backup_data/ /home/nas/nas_data/

スクリプトを使った履歴バックアップデータからの場合は、

$ rsync -av /home/backup/backup_data/20200226_040000.bak/ /home/nas/nas_data/

(バックアップフォルダ名は一例)

バックアップドライブ故障時
データが入る容量のあるディスクを用意、フォーマットしてマウント設定。フォーマットすることでデバイスに振られたUUIDが変化するので、/etc/fstab 内に設定してある対応ドライブのUUID設定の変更を忘れずに。

その後、必要に応じてNASデータドライブから初回バックアップデータを作成。

$ rsync -av /home/nas/nas_data/ /home/backup/backup_data/

スクリプトを使っている場合は、

$ php /home/akebi/schedules/backup.php

リモートからの再起動など

再起動

$ sudo reboot

シャットダウン

$ sudo shutdown -h now

(nowを付けない場合は数秒待ち時間があります)

シャットダウン後はNAS側PCで直に電源を入れる必要があります。
NASとしての運用中、普段はNAS側PCにはディスプレイやキーボード、マウス等を接続しておく必要はありませんが、何か問題があった時のために直接確認できる手段は確保しておくことをおすすめします。

再起動させてNAS側PCの電源も入っているのにネットワークから再接続ができない場合、システムの入っていない外付けディスクから起動しようとして失敗している場合があります。その場合はNAS側PCのBIOS設定等で、起動ドライブの優先順位を確認してみてください。


いいなと思ったら応援しよう!