自宅で個人用ファイルサーバを作る

**勉強中の学生が，頭の中を整理しながら書いたメモです．
セキュリティ面で誤り・不適切な操作が含まれるかも知れません．
参考にされる場合は自己責任でお願いします．**


# 概要
自宅でファイルサーバを構築して，各OSのPC(windows,mac,linux)から参照できるようにすることが目的．

# 目標
- ubuntu上で， sambaを用いてファイル共有する． 
 
- 保存領域として3TB弱の大きさを用意し，RAIDではなく，cron[6]とrsyncコマンド[5]による定期バックアップを行う．  

- 他の家族に中身を覗かれない程度に認証・セキュリティに気をつける．

ハードを交換した時に再構築しやすいようにする．
RAID1を大容量でやると，リカバリーに時間がかかりすぎるのでしない．

# 用意したもの
### サーバを構成するもの
- 適当なマシン  
    - ストレージ要件
        - 3TBのHDDを，OS・データ領域用に1本，バックアップ用に1本
    - ネットワーク要件
        - 自宅のネットワークに属すること．GbE対応なら快適に使えるだろう．

# 扱うソフトウェア
- ubuntu server 18.04.2 LTS (Bionic Beaver)
- samba Version 4.7.6-Ubuntu

### 構築中に用いるもの
- USBメモリ(用意したのは16GB)  
- 同じネットワークに属する適当なPC  

# 構築手順
### OSインストール
1. ubuntuをダウンロードして，USBメモリに焼いて，インストール開始．
3. システム用のHDDのパーティションは次の通りに設定する：  
 - 1MB: /boot  
 - 80GB: /  
 - rest: /mnt/Storage    
（LVMは設定しない）  
（swapは不要と判断）
4. ここで以下にチェックを入れインストール
 - OpenSSH
 - canonical livepatch

### OS及びドライブの設定
まず更新．

```shell-session
$ sudo apt update && sudo apt upgrade -y
```

接続されているドライブの確認

```shell-session
$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop1    7:1    0   91M  1 loop /snap/core/6350
loop2    7:2    0  8.4M  1 loop /snap/canonical-livepatch/77
sda      8:0    0  2.7T  0 disk
└─sda1   8:1    0  2.7T  0 part
sdb      8:16   0  2.7T  0 disk
├─sdb1   8:17   0    1M  0 part
├─sdb2   8:18   0   80G  0 part /
└─sdb3   8:19   0  2.7T  0 part /mnt/Storage
```

この例では，`/dev/sdb`がシステムとストレージを含むHDDで，`/dev/sda`がバックアップ用HDDになっている．  


バックアップ用HDDをまだフォーマットしていないなら，`ext4`とかでフォーマットしておく．  

```shell-session
$ sudo mkfs -t ext4 /dev/sda1
```


バックアップ用HDDは`/mnt/Backup`にマウント．
マウントポイントを作成．UUIDを確認[1]してからfstabを修正．

```shell-session
$ sudo mkdir /mnt/Backup
$ blkid
/dev/sda1: UUID="5086b0d0-4e74-4e16-842b-c1f209f40ff3" TYPE="ext4" PARTLABEL="backup" PARTUUID="49f38838-948e-40fb-bf87-428b55e35e63"
/dev/sdb2: UUID="b847f20f-4576-4f27-b973-cbd907eec174" TYPE="ext4" PARTUUID="7017a20a-0818-4118-a025-88e50713440b"
/dev/sdb3: UUID="706ceb00-77ac-4698-9186-d14fe1112ebc" TYPE="ext4" PARTUUID="e2c3472f-f1f7-4281-af36-2967eb956988"
```

バックアップパーティションのUUIDは`5086b0d0-4e74-4e16-842b-c1f209f40ff3`である．これをfstab[2]に登録．   

```shell:/etc/fstab
UUID=b847f20f-4576-4f27-b973-cbd907eec174 / ext4 defaults 0 1
UUID=706ceb00-77ac-4698-9186-d14fe1112ebc /mnt/Storage ext4 defaults 0 2
UUID=5086b0d0-4e74-4e16-842b-c1f209f40ff3 /mnt/Backup ext4 defaults 0 2  # この行を追加
/swap.img       none    swap    sw      0       0
```

登録が終わったら，再起動を行ない，正しくマウントされることを確認．  

### samba サーバを建てる
共有するディレクトリ（今回は`/mnt/Storage`）の所有権とアクセス権を変更．  

```shell-session
$ sudo chown `whoami` /mnt/Storage
$ chmod 777 /mnt/Storage
```

sambaをインストールする．

```shell-session
$ sudo apt install samba -y
```

`/etc/samba/smb.conf`を編集する[3][4]．
（行番号は目安程度）

```shell:/etc/samba/smb.conf
（略）

#======================= Global Settings =======================

[global]

unix charset = UTF-8  # 26行目 行を追加
dos charset = CP932  # 27行目 行を追加

## Browsing/Identification ###

（略）

# It is recommended that you enable this feature if your Samba machine is
# not protected by a firewall or is a firewall itself.  However, this
# option cannot handle dynamic or non-broadcast interfaces correctly.
;   bind interfaces only = yes
map to guest = Never  # 61行目 Neverに変更


#### Debugging/Accounting ####

（略）
```

さらに，ファイル末尾にある`printers`と`print$`の項目は不必要なので全てコメントアウトする．

```shell:/etc/samba/smb.conf
（略）

#[printers]
#   comment = All Printers
#   browseable = no
#   path = /var/spool/samba
#   printable = yes
#   guest ok = no
#   read only = yes
#   create mask = 0700

# Windows clients look for this share name as a source of downloadable
# printer drivers
#[print$]
#   comment = Printer Drivers
#   path = /var/lib/samba/printers
#   browseable = yes
#   read only = yes
#   guest ok = no
# Uncomment to allow remote administration of Windows print drivers.
# You may need to replace 'lpadmin' with the name of the group your
# admin users are members of.

（略）
```


代わりに，その下に使用したい設定を追記する．

```shell:/etc/samba/smb.conf
（略）

[NASbi]  # 外から見える名前．お好きにどうぞ．
   path = /mnt/Storage
   writable = yes
   guest ok = no
   create mode = 0777
   directory mode = 0777

（EOF）
```

sambaユーザのパスワード登録をする．

```shell-session
$ smbpasswd -a `whoami`
```

最後に，sambaデーモンを再起動する．

```shell-session
$ sudo systemctl restart smbd
```

他のデバイスから読み書きできればok．

## 運用・保守

### samba設定ファイルの控え
編集した`/etc/samba/smb.conf`をgithubとかに保管しといて，構築しなおすときに使えるようにしておく．

### 定期バックアップ
適当な場所にバックアップ用のシェルスクリプトを書く．

```shell-session
$ sudo vim /usr/local/bin/sync.sh
```
```shell:/usr/local/bin/sync.sh
rsync -auv /mnt/Storage /mnt/Backup/
```

※Dry-runで動作を確かめておく．誤動作すると最悪死ぬ（データが）．

このスクリプトを毎日午前4時に実行するように登録する．

```shell-session
$ sudo crontab -u root -e
```

開かれたファイルの末尾に以下を追記する．

```shell:crontab
0 4 * * * sh /usr/local/bin/sync.sh
```

## まとめ
サーバ構築にあたって，必要なもの，構築手順，バックアップの自動化までを記載した．
時間があれば，メインドライブが故障した際の，バックアップからのリストア手順についても記載したい．

# 参考文献
[Ubuntuでファイルサーバーをたてる（Samba）](https://qiita.com/msrks/items/1385cf13258dd1a0da08)

[1] [blkidコマンド(UUIDに対応するディスクパーティション確認)](https://qiita.com/shyamahira/items/dfb85a1165b59091a2a5)


[2] [fstabについて](https://qiita.com/kihoair/items/03635447591358210772)

[3] [Sambaのユーザー認証とファイルアクセス権の設定 (1/4)](https://www.atmarkit.co.jp/ait/articles/0901/28/news153.html)

[4] [/etc/samba/smb.conf 日本語訳](https://qiita.com/JhonnyBravo/items/6a68972cf5962a3c5afd)

[5] [【 rsync 】コマンド（その1）――ファイルやディレクトリを同期する](https://www.atmarkit.co.jp/ait/articles/1702/02/news031.html)

[6] [cronの設定方法](https://qiita.com/hikouki/items/e744b3a4d356d2af12cf)

# 更新履歴
### 2019年6月10日

lsblk の結果に不要なものが含まれていたため修正．