RaspberryPiをセットアップしてopenmediavaultでNASにする

RaspberryPiのSDカードを作成するところからopenmediavaultとminidlnaのインストールまでをヘッドレスで行う。
ついでに、ぼくのかんがえたさいきょうのラズパイバックアップ手順も書く。

#準備

必要なものリスト。

* Mac
* Raspiberry Pi2 Model B
* USB Wi-Fi アダプタ
* 2Aぐらい対応のUSBアダプタ
* MicroSDカードリーダライタ
* 4GB以上のMicroSDカード
* 2GBのMicroSDカード(システムバックアップに使う)

これからハードを買い集める人はRaspberryPi3にするといいと思う。その場合はWi-Fiアダプタは不要。
基本的にはeth0に接続するが、ネットワークの設定変更時のバックアップにwlan0も使うため、Wi-Fiも使えたほうが良い。

SDカードは、システムに挿しておくものと、バックアップ用にそれぞれ1枚確保。トラブル時や、テストする際にはSDカード入れ替えるだけでまるっとシステム切り替えられて便利なので、その辺に落ちているSDカードをかき集めておく。

常時起動するので、ファン付きのケースも確保しておくと良い。ファンは3.3Vに接続してヒートシンクも付けたらCPU温度30度前後で落ち着いている。

ヘッドレスで構築するので、キーボード/モニタなどは基本不要。ただし、bootstrapでのトラブルシュートには必要になるので、以下も持っておいたほうが良い。全てその辺に落ちているはずなので探しておく。

* HDMIが接続できるモニタ(TVでOK)
* USBキーボード
* HDMIケーブル

# 構築手順
参考:
Raspberry Pi 2の初期設定(外付けモニタ・USBキーボードなし、OS:Raspbian)
http://qiita.com/kozykana/items/df6aa52cbb8917abc268

Raspberry Pi開封から無線LAN経由でSSH接続して初期設定するまでのマイ・ウェイ（モニタ・キーボード無し）
http://qiita.com/morizotter/items/48ad0b17207b0dd66cac

Raspberry Pi 2でファイルサーバを作るまでのまとめ
http://qiita.com/Cinosura/items/6ab435331ea2b3671a1d

## 1.raspbian-liteをダウンロード
Download Raspbian for Raspberry Pi
https://www.raspberrypi.org/downloads/raspbian/

ヘッドレスなのでliteを使う。
torrentのほうが当然早いのでオススメ。ダウンロードしたらsha1ハッシュを確認して解凍する。

```console:Mac
$ openssl sha1 2016-05-27-raspbian-jessie-lite.zip
$ unzip 2016-05-27-raspbian-jessie-lite.zip
```

## 2.イメージ書き込み

diskutilでパスを確認してアンマウントと書き込みを行う。書き込み中は`Ctrl+T`で進捗確認できる。

```console:Mac
$ diskutil list
$ sudo diskutil unmountDisk /dev/disk2
$ sudo dd bs=1m if=*.img of=/dev/rdisk2
$ sudo diskutil unmountDisk /dev/disk2
```

## 3.RaspberryPiにSSH接続
RaspberryPiにSDカードを挿し、EtherケーブルとWi-Fiアダプタを挿して起動する。
raspberry.localに接続しても良いが、広告されるまで時間がかかる。待ちきれないのでping sweepする。以下は、192.168.1.100が割り振られていた場合。

```console:Mac
$ nmap -sP 192.168.1.0/24
$ ssh pi@192.168.1.100
```

パスワードはraspberry

## 4.raspi-config

Console起動/タイムゾーンを東京に/Wi-Fiを日本設定に/ホスト名変更/ビデオメモリを最小設定に/

```console:RaspberryPi
$ sudo raspi-config
3 Boot Options > B1 Console
5 Internationalization Options > Change Timezone > Asia > Tokyo
5 Internationalization Options > Change Wi-fi Country > JP Japan
9 Advanced Options -> A2 Hostname -> raspiomv
9 Advanced Options -> A3 Memory Split -> 16
reboot
```


## 5.wifiに接続
基本的にはWi-Fiは使わないが、eth0の設定変更を行う際のバックアップとして使う。

```console:RaspberryPi
$ ip addr
$ sudo sh -c 'wpa_passphrase ESSID PRESHAREDKEY \
>> /etc/wpa_supplicant/wpa_supplicant.conf'
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
```

```/etc/wpa_supplicant/wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
	ssid=ESSID
	# 下の行を削除する
	#psk=PRESHAREDKEY
	psk=なんかすごい長い16進文字列
	# 以下を追記する
	# WPA2-PSK/TKIP/ステルスAPの場合の設定
	key_mgmt=WPA-PSK
	proto=WPA2
	pairwise=CCMP
	group=CCMP
	priority=2
	scan_ssid=1
}
```

Wi-FiのIPを固定する。jessieは`/etc/network/interfaces`を見ない。

```console:RaspberryPi
$ sudo vi /etc/dhcpcd.conf
```

以下を追記。Wi-Fiは192.168.1.3にする。バックアップ用なのでgatewayは設定しない。

```/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.1.3/24
```

設定が終わったらwlan0を起動し、結果を確認。

```console:RaspberryPi
$ sudo ifdown wlan0
$ sudo ifup wlan0
$ ifconfig wlan0
$ iwconfig wlan0
```

nicにトラブルがあると再起動時に文鎮と化す。せめて、コンソールログインできるように、起動プロセスが止まらないようにするおまじない。
参考 : dhcpcd.service takes longer time on Lite
https://www.raspberrypi.org/forums/viewtopic.php?t=152757

```console:RaspberryPi
$ sudo vi /etc/default/networking
```

```file:/etc/default/networking
# 以下の行を追加する
CONFIGURE_INTERFACES=no
```

## 6.有線LANの設定を変更
Wi-Fiのnicからssh接続してeth0の設定を変更する。eth0のアドレスは192.168.1.2にする。

```console:Mac
$ ssh pi@192.168.1.3
```

```console:RaspberryPi
$ sudo ifconfig eth0 down
$ sudo vi /etc/dhcpcd.conf
```

```/etc/dhcpcd.conf
#以下を追記
interface eth0
static ip_address=192.168.1.2/24
static routers=192.168.1.1
static domain_name_servers=8.8.8.8
```

eth0を再起動して結果を確認。

```console:RaspberryPi
$ sudo ifconfig eth0 down
$ sudo ifconfig eth0 up
$ ifconfig
$ ip addr
$ route
```

同じネットワークにeth0とwlan0が繋がっていて、デフォルトルートはeth0になっていることを確認。

```console:RaspberryPi
$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         192.168.1.1     0.0.0.0         UG    202    0        0 eth0
192.168.1.0     *               255.255.255.0   U     202    0        0 eth0
192.168.1.0     *               255.255.255.0   U     303    0        0 wlan0
```

## 7.アップデート
raspbianのリポジトリをjaistのミラーに変更する。

```console:RaspberryPi
$ sudo vi /etc/apt/sources.list
```

```/etc/apt/sources.list
deb http://ftp.jaist.ac.jp/raspbian jessie main contrib non-free rpi
```

アップデートする。

```console:RaspberryPi
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo apt-get autoremove
$ sudo apr-get autoclean
$ sudo rbi-update
```

不要なパッケージを削除する。たぶん無いけど。

```
$ dpkg -l | awk '/^rc/ { print $2 }'
$ sudo apt-get purge $(dpkg -l | awk '/^rc/ { print $2 }')
```

後々必要になるパッケージをインストールする。

```console:RaspberryPi
$ sudo apt-get install dnsutils chkconfig git resolvconf
```

## 8.swapoff
参考 : Raspberry PiのSDカード/マイクロSDカードの寿命を延ばす
http://denshikousaku.net/extend-life-expectancy-of-raspberry-pi-sd-card

sdカードにswap領域があると精神衛生上よろしくないのでoffにする。

```console:RaspberryPi
$ free
$ sudo swapoff --all
$ sudo chkconfig dphys-swapfile off
$ sudo shutdown -r now
```

結果を確認。

```console:RaspberryPi
$ free
             total       used       free     shared    buffers     cached
Mem:        996476     862672     133804      15024      54548     716968
-/+ buffers/cache:      91156     905320
Swap:            0          0          0
```

Swapのところが全部0になってればOK。

## 9.moperonユーザを追加してpiユーザをロック

moperonユーザを追加する。groupsはpiユーザと同じものをセットする。

```console:RaspberryPi
$ sudo adduser moperon
$ groups pi
$ sudo usermod -aG adm,dialout,cdrom,sudo,audio,video,plugdev,\
games,users,input,netdev,spi,i2c,gpio moperon
$ groups moperon
$ exit
```

新しく作ったユーザでssh接続。

```console:Mac
$ ssh moperon@192.168.1.2
```

piユーザをロックする。

```console:RaspberryPi
$ sudo passwd -l pi
```



## 10.ntpサーバを変更

```console:RaspberryPi
$ sudo vi /etc/ntp.conf
```

```/etc/ntp.conf
#server 0.debian.pool.ntp.org iburst
#server 1.debian.pool.ntp.org iburst
#server 2.debian.pool.ntp.org iburst
#server 3.debian.pool.ntp.org iburst
pool ntp.nict.jp iburst
```

```console:RaspberryPi
$ sudo service ntp restart
```


## 11.システムバックアップ
別添の[バックアップ手順](#バックアップ手順)に従う


## 12.OpenMediaVaultをインストール
参考 : Install OpenMediaVault Raspberry Pi NAS Server Minibian
http://www.htpcguides.com/install-openmediavault-raspberry-pi-nas-server-minibian/


```console:RaspberryPi
$ sudo sh -c 'echo "deb http://packages.openmediavault.org/public erasmus main" > /etc/apt/sources.list.d/openmediavault.list'
$ wget -O - http://packages.openmediavault.org/public/archive.key | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install openmediavault-keyring
$ sudo apt-get --yes --force-yes --fix-missing --auto-remove \
  --allow-unauthenticated --show-upgraded \
  --option Dpkg::Options::="--force-confdef" \
  --option DPkg::Options::="--force-confold" \
  --no-install-recommends \
  install openmediavault
```

postfixとかmdadmとかになんか聞かれる。

```console
General type of mail configuration: localonly
System mail name: raspiomv
MD arrays needed for the root file system: none
Run proftpd: standalone
```

手元では3.0.35が入った(2016/9/19時点)。
インストールが無事完了したら、openmediavautを初期化する。

```console:RaspberryPi
$ sudo omv-initsystem
```

うまくいったら、ブラウザ80/tcpに接続してログインする(admin/openmediavault)。
![openmediavault_ログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/83315/3d21c70f-3117-0b2d-6b8b-6965458e1ee3.png "openmediavault_ログイン画面.png")


sshの設定の追加オプションに以下を追加して保存->適用。openmediavaultの設定画面でSSHを有効にした場合、この設定を行わないとSSHログインできなくなる。

```
AllowGroups adm
```

![SSH設定.png](https://qiita-image-store.s3.amazonaws.com/0/83315/906f892c-fafc-a76b-a9d5-ab3fbd367c1b.png "SSH設定.png")

あと、WebUIの管理者アカウント(admin)のパスワードを変更しておく。
adminのアカウント名を変更する方法はないかと色々調べたが、無いらしい。

参考 : Can i change username of admin ?
http://forum.openmediavault.org/index.php/Thread/3105-Can-i-change-username-of-admin/?postID=23064#post23064


## 13.不要なサービスを停止

Webコンソール上のサービス起動状態と実態が異なるので、とりあえず不要なサービスはコマンドラインで停止する。

```console:RaspberryPi
$ sudo chkconfig nfs-kernel-server off
$ sudo service nfs-kernel-server stop
$ sudo chkconfig nfs-common off
$ sudo sudo service nfs-common stop
$ sudo chkconfig proftpd off
$ sudo service proftpd stop
$ sudo chkconfig snmpd off
$ sudo service snmpd stop
$ sudo chkconfig tftpd-hpa off
$ sudo service tftpd-hpa stop
```

なんやかやしてopenmediavaultの診断>サービスの画面がこんな感じになってればOK。
![service.png](https://qiita-image-store.s3.amazonaws.com/0/83315/b6bddf6d-47b1-8165-730c-2c02a26d71d0.png "service.png")



## 14.minidlnaのインストール
omv-extras.org のプラグインがうまく動かないので、apt-getする。

```console:RaspberryPi
$ sudo apt-get install minidlna
```

ToDo:openmediavault/3.0(erasmus)が正式リリースしたら、ここの手順は見直す。

## 15.tmpフォルダをRAMディスクに移す
参考 : Raspberry PiのログをRAMDISKに置く方法
https://curecode.jp/tech/raspberrypi-ramdisk/

ログファイルをRAMディスクに移すと、SDカードの寿命的な意味で精神衛生上良い。

```console:RaspberryPi
$ sudo vi /etc/fstab
```

```file:/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p5  /boot           vfat    defaults          0       2
/dev/mmcblk0p6  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
#### ramdisk
#以下を追加
tmpfs           /var/tmp        tmpfs   defaults,size=16m 0       0
tmpfs           /var/log        tmpfs   defaults,size=32m 0       0
```

`/var/log`以下に作られるファイルやフォルダをあらかじめ作成するスクリプトを作る。
実際のパスや所有者などは、RAMディスクに移す前の状態を確認してスクリプトを適宜修正する。

```console:RaspberryPi
$ sudo vi /etc/init.d/make-varlog-files
```

```Bash:/etc/init.d/make-varlog-files
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          make-varlog-files
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create /var/log/... files on tmpfs at startup
# Description:       Create /var/log/... files needed by system daemon
### END INIT INFO

#
# main()
#
case "${1:-''}" in
  'start')

    ############################
    # prepare /var/log subdir for ramdisk init on every boot

    mkdir -p /var/log/apt
    mkdir -p /var/log/cron-apt
    mkdir -p /var/log/fsck
    mkdir -p /var/log/nginx
    mkdir -p /var/log/ntpstats
    mkdir -p /var/log/openmediavault
    mkdir -p /var/log/proftpd
    mkdir -p /var/log/samba
    mkdir -p /var/log/watchdog

    chown www-data.adm /var/log/nginx
    chown ntp.ntp /var/log/ntpstats
    chown root.adm /var/log/samba

    ############################
    # prepare /var/log file for ramdisk init on every boot

    touch /var/log/lastlog
    touch /var/log/wtmp
    touch /var/log/btmp


    chown root.utmp /var/log/lastlog
    chown root.utmp /var/log/wtmp
    chown root.utmp /var/log/btmp
   ;;
  'stop')
   ;;
  'restart')
   ;;
  'reload'|'force-reload')
   ;;
  'status')
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac
```

```console:RaspberryPi
$ sudo chmod +x /etc/init.d/make-varlog-files
$ sudo update-rc.d make-varlog-files defaults 01 10
$ sudo shutdown -r now
```

再起動後、確認する

```console:RaspberryPi
$ df -h
```


# バックアップ手順
参考 : Raspberry PiでIoTなシステム開発：SDカードのバックアップはrpi-cloneでやろう
http://www.homu.net/raspberry-piでiotなシステム開発：sdカードのバックアップはrpi/

2GBのMicroSDカードにシステムクローンし、そのカードからddでimgファイルを吸い出すことで、バックアップを作る。imgファイルをまたddで戻せばリストアできる。システム起動中にスナップショットを取れるし、imgファイルは2GBに制限できるので圧縮の必要もなかろう、という手順。

## 1.rbi-cloneをインストール

```console:RaspberryPi
$ wget https://raw.githubusercontent.com/billw2/rpi-clone/master/rpi-clone
$ sudo mv rpi-clone /usr/local/bin/
$ sudo chmod +x /usr/local/bin/rpi-clone
```

## 2.システムクローン
インストールできたらMicroSDカードリーダライタに2GBのSDカードを挿して、RaspberryPiのUSBポートに接続し、クローンする。

```console:RaspberryPi
$ sudo fdisk -l # コピー先を確認
$ sudo rpi-clone sda -f
```

いくつか聞かれるけど、適当に答える。

```console:RaspberryPi
Do you want to initialize the destination disk /dev/sda? (yes/no): yes
You may enter a label for the destination rootfs /dev/sda2:
Final check, is it Ok to proceed with the clone (yes/no)?: yes
Hit Enter when ready to unmount the /dev/sda partitions... [Enter]
```


## 3.バックアップ
コピーしたSDカードをmacに接続してimgファイルを作成

```console:Mac
$ sudo dd bs=1m if=/dev/rdisk2 of=filename.img
```

## 4.リストア
参考URLでは、ddでリストアすると起動しないとあるが、当方の手元ではうまくいっている。

```console:Mac
$ sudo diskutil unmountDisk /dev/disk2
$ sudo dd bs=1m if=filename.img of=/dev/rdisk2
```

RaspberryPiに接続し、起動後にExpand Filesystemする。

```console:RaspberryPi
$ sudo raspi-config
1 Expand Filesystem
```

# 残りのお仕事
HDDを接続してRAIDを組んでsmbで共有したり、minidlnaを設定してDLNA配信したり、Wi-Fiカメラと接続して写真を自動バックアップしたりと、夢を広げる。