Raspberry PiをWiFiルーターにする・外付けハードディスクで運用する方法

[ブログ](https://tsubakicraft.wordpress.com)からの転載です。

### 概要

ESP-WROOM-02にような安価なWiFi搭載マイコンが市場に出回り、個人でもIoTアプリケーションを容易に作れるようになりました。ESP-WROOM-02のようなセキュリティに不安のあるマイコンを直接インターネットに繋げるのは不安かもしれません。そんな場合はRaspberry Piを中継機としてインターネットと家庭内LANを別のネットワークとして分離してセキュリティーを高めるという方法があります。

Raspberry Pi3を使ったIoTハブ構築作業の一部を紹介します。
外付けハードディスクを２つのパーティションに区切り、１２８GBをルートファイルシステムに残りをファイルサーバー用にし、ブートパーティションのみをSDカードに残して、起動後は外付けハードディスクを使用するものです。
紹介する内容は次の通りです。

- Raspberry PiのIPアドレスを固定する
- hostapdとisc-dhcp-serverをインストールしてRaspberry PiをWiFiルーターにする
- TightVNCサーバーをインストールする
- Sambaをインストールする
- Netatalkをインストールする
- MySQLをインストールする
- mosquittoをインストールする


以下、簡単な作業内容の記録です。

 

### 1. 外付けハードディスクの準備とルートファイルシステムの移動

セルフパワーのUSBハブをRaspberry Pi3に接続し、そのハブに外付けハードディスクを接続する。Raspberry Pi3に直接外付けハードディスクを接続した場合は電力不足となり動作が不安定になるので、セルフパワーのUSBハブを使用する必要がある。

#### 外付けハードディスクのデバイス名を把握する

以下のコマンドでUSB接続した外付けハードディスクのデバイス名を記録する。

	$ sudo fdisk -l

当環境では /dev/sda1 でした。

#### ハードディスクをフォーマットする

以下のコマンドで外付けハードディスクをフォーマットする。

	$ sudo mkfs.ext4 /dev/sda

#### パーティションの作成

以下のコマンドで外付けハードディスクにパーティションを作成する。すでにパーティションが作成されている場合は d コマンドで削除する。当工房の環境では１２８GBをルートファイルシステム、残りをファイルサーバー用にするために、この操作を２回行う。

	$ sudo fdisk /dev/sda

パーティションを削除する場合はCommandプロンプトで d を入力し、続いて削除するパーティション番号を入力する。

パーティションを作成するにはCommandプロンプトでnを入力する。１回目の作成操作では Last sectorに +128G を指定する。

	Command (m for help): n
	Partition type
	   p   primary (0 primary, 0 extended, 4 free)
	   e   extended (container for logical partitions)
	Select (default p): p
	Partition number (1-4, default 1): 1
	First sector (2048-1953525166, default 2048):
	Last sector, +sectors or +size{K,M,G,T,P} (2048-1953525166, default 1953525166): +128G
	Created a new partition 1 of type 'Linux' and of size 128 GiB.
	
二回目の操作では Last sectorには何も指定せずにリターンキーを押す。
Commandプロンプトで w を入力して、作成したパーティションを反映させてfdiskを終了する。

ここで一旦リブート

	$ sudo reboot

#### パーティションのフォーマット

以下のコマンドで２つのパーティションをフォーマットする。

	$ sudo mkfs.ext4 /dev/sda1
	$ sudo mkfs.ext4 /dev/sda2

もしすでにハードディスクがマウントされている場合は、事前にアンマウントしておく。

	$ sudo umount /dev/sda1
	$ sudo umount /dev/sda2

#### 外付けハードディスクのマウント

以下のコマンドでハードディスクのルートファイルシステムのパーティションをマウントする。

	$ sudo mkdir /mnt/hdd
	$ sudo mount /dev/sda1 /mnt/hdd

#### SDカードのルートファイルシステムの内容を外付けハードディスクにコピーする

以下のコマンドでルートファイルシステムの内容を外付けハードディスクにコピーする。

	$ sudo rsync -a --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} / /mnt/hdd
	
#### 外付けハードディスクのfstabを書き換える

/dev/sda1をルートに、/dev/sda2をその他領域としてマウントする設定にする。

	$ sudo vi /mnt/hdd/etc/fstab

書き換え前

	proc /proc proc defaults 0 0
	PARTUUID=3c5764a6-01 /boot vfat defaults 0 2
	PARTUUID=3c5764a6-02 / ext4 defaults,noatime 0 1

書き換え後

	proc /proc proc defaults 0 0
	PARTUUID=3c5764a6-01 /boot vfat defaults 0 2
	PARTUUID=b03104d4-01 / ext4 defaults,noatime 0 1
	PARTUUID=b03104d4-02 /home/pi/Storage ext4 defaults,noatime 0 1

PARTUUIDは以下のコマンドで確認できる。

	$ ls -l /dev/disk/by-partuuid
	合計 0
	lrwxrwxrwx 1 root root 15 6月 1 12:13 3c5764a6-01 -> ../../mmcblk0p1
	lrwxrwxrwx 1 root root 15 6月 1 12:13 3c5764a6-02 -> ../../mmcblk0p2
	lrwxrwxrwx 1 root root 10 6月 1 12:13 b03104d4-01 -> ../../sda1
	lrwxrwxrwx 1 root root 10 6月 1 12:13 b03104d4-02 -> ../../sda2

#### SDカードのcmdline.txtを書き換える

SDカードのcmdline.txtを書き換えてルートファイルシステムは外付けハードディスクを使うように設定する。root=xxxxxxxxの部分を/dev/sda1のPARTUUIDに書き換える。

	dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=b03104d4-01 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

#### Raspberry Piを再起動する

	$ sudo reboot

無事に起動すれば設定完了。

 

### 2. Raspberry PiのIPアドレスの固定

当IoTハブではRaspberry PiをWiFiルーターとして動かして、WiFi側はdhcpを利用してセンサーネットワークを構築し、Ethernetインターフェースは固定IPとします。

/etc/dhcpcd.conf の最後に以下の定義を追加します。（使用する環境に応じてアドレスの値は変わります）

	interface eth0
	static ip_address=192.168.0.202
	static routers=192.168.0.1
	static domain_name_servers=192.168.0.1

一旦リブートするか以下のコマンドで設定内容を反映して、Raspberry PiのIPアドレスが固定されていること、インターネット接続などのネットワーク機能が正常に動作していることを確認しておく。

	$ sudo service dhcpcd reload

### 3. hostapdとisc-dhcp-serverのインストール

hostapd（WiFiアクセスポイントとして機能するソフトウェア）とisc-dhcp-server（dhcpサーバー）をインストールする。

	$ sudo apt-get update
	$ sudo apt-get install hostapd ics-dhcp-server
	 

/etc/dhcp/dhcpd.confを編集してdhcp設定を変更する。

以下の部分を変更。（authoritativeのコメントを外す）

	# If this DHCP server is the official DHCP server for the local
	# network, the authoritative directive should be uncommented.
	authoritative;
	 

以下の行をファイルの最後に追加する。当方の場合はメインのLANは192.168.0のネットワークで今回追加するのは192.168.11のネットワーク。（192.168.11.XXXの部分は自分の環境に合わせる）

	subnet 192.168.11.0 netmask 255.255.255.0 {
	  range 192.168.11.100 192.168.11.199;
	  option broadcast-address 192.168.11.255;
	  default-lease-time 600;
	  max-lease-time 7200;
	  option routers 192.168.11.1;
	  option domain-name "local";
	  option domain-name-servers 8.8.8.8, 8.8.4.4;
	}
	 

/etc/default/isc-dhcp-serverを以下の行を編集する。

	INTERFACES="wlan0"
 

/etc/hostapd/hostapd.confを修正してWiFiアクセスポイントの設定をする。

	interface=wlan0
	driver=nl80211
	ssid=pi3-ap    ---> 他の端末から見えるアクセスポイントの名称
	hw_mode=g
	channel=6
	ieee80211n=1
	wmm_enabled=1
	ht_capab=[HT40] [SHORT-GI-20] [DSSS_CCK-40]
	macaddr_acl=0
	auth_algs=1
	ignore_broadcast_ssid=0
	wpa=2
	wpa_key_mgmt=WPA-PSK
	wpa_passphrase=パスワード
	rsn_pairwise=CCMP
 

/etc/default/hostapdの以下の行を編集する。

	DAEMON_CONF="/etc/hostapd/hostapd.conf"
 

ルーター化の設定。/etc/sysctl.confを編集する。（以下の行のコメントを外す）

	net.ipv4.ip_forward=1
 

iptablesコマンドを使ってiptableの設定を追加する。（ネットワーク間のルーティング設定）

	$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
	$ sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
	$ sudo iptables -A FORWARD -i wlan0 -o eth0 -J ACCEPT
	$ sudo sh -c "iptables-save" > /etc/iptables.ipv4.nat"
	 

/etc/network/interfacesを編集する。（元のファイルはコメントアウトした内容）

	allow-hotplug wlan0
	#iface wlan0 inet manual
	# wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
	iface wlan0 inet static
	address 192.168.11.1
	netmask 255.255.255.0
	gateway 192.168.0.1
	pre-up iptables-restore < /etc/iptables.ipv4.nat
	 

これでRaspberry Piを再起動し、他の端末からWiFiアクセスポイントとして見えて・接続でき、接続するとちゃんとIPアドレスが振られることを確認する。

 

 

### 4. TightVNCサーバーのインストール

Raspberry Piでsshを有効にしておけば、サーバー管理の作業には困ることはありませんが、GUIを使いたい場合はVNCサーバーをインストール・設定する。

#### TightVNCをインストール

	$ sudo apt-get update
	$ sudo apt-get install tightvncserver

最初の起動の際にパスワードの入力が要求される。

	$ vncserver
	
	You will require a password to access your desktops.
	
	Password:********
	Verify:********
	Would you like to enter a view-only password (y/n)? n
	New 'X' desktop is raspberrypi:1
	
VNCサーバーを停止するには以下のコマンドを実行する。

	$ vncserver -kill :1
	
#### VNCサーバーの自動起動設定

VNCサーバーを自動起動にする設定を行うために、/etc/init.d/vncbootファイルを作成して以下のように入力して保存する。（rootユーザーとして1440×960 24bit ColorでVNCサーバーを起動する例）

	#! /bin/sh
	 # /etc/init.d/vncboot
	
	### BEGIN INIT INFO
	 # Provides: vncboot
	 # Required-Start: $remote_fs $syslog
	 # Required-Stop: $remote_fs $syslog
	 # Default-Start: 2 3 4 5
	 # Default-Stop: 0 1 6
	 # Short-Description: Start VNC Server at boot time
	 # Description: Start VNC Server at boot time.
	 ### END INIT INFO
	
	USER=root
	 HOME=/root
	
	export USER HOME
	
	case "$1" in
	 start)
	 /usr/bin/vncserver :1 -geometry 1440x960 -depth 24
	 echo "Starting VNC Server."
	 ;;
	
	stop)
	 /usr/bin/vncserver -kill :1
	 echo "VNC Server Has been stoped."
	 ;;
	
	*)
	 echo "Usage: /etc/init.d/vncboot {start|stop}"
	 exit 1
	 ;;
	 esac
	
	exit 0
	
他の端末からVNCクライアント使って画面表示ができるかを確認する。

 

### ５. Sambaのインストール

最低限の設定です。

#### まずはSambaをインストール

	$ sudo apt-get update
	$ sudo apt-get install samba
	 

#### /etc/samba/smb.confを編集する。

	[pi]
	path = /home/pi/Storage/Share  ---> ここに外付けハードディスクのパーティション２をマウントしている
	read only = no
	guest ok = yes
	browsable = yes
	force user = pi
	 

#### Sambaを再起動する

	$ sudo service smbd restart

他の端末からsmbを使ってsmb.confで設定したフォルダーにアクセスできることを確認する。

 

### ６. Netatalkのインストール

#### まずはインストール。

	$ sudo apt-get update
	$ sudo apt-get install netatalk
	 

#### /etc/default/netatalkを編集する

以下の行を修正。

	#### server (unix) and legacy client (<= Mac OS 9) charsets
	ATALK_UNIX_CHARSET='UTF8'
	ATALK_MAC_CHARSET='MAC_JAPANESE'
	
	
	#### UAMs (User Authentication Modules)
	#### available options: uams_dhx.so, uams_dhx2.so, uams_guest.so,
	#### uams_clrtxt.so(legacy), uams_randnum.so(legacy)
	AFPD_UAMLIST="-U uams_dhx2.so,uams_clrtxt.so"
	
	
	#### config for cnid_metad. Default log config:
	CNID_CONFIG="-l log_note"
	 

#### /etc/netatalk/afpd.confを編集する

以下の行をファイル末尾に追加。

	- -maccodepage MAC_JAPANESE -setuplog "default log_info /var/log/afpd.log"
 

#### /etc/netatalk/AppleVolumes.defaultを編集する

以下の部分を変更。

	# The line below sets some DEFAULT, starting with Netatalk 2.1.
	:DEFAULT: options:upriv,usedots dperm:0700 fperm:0600 maccharset:MAC_JAPANESE ea:sys
	
	# By default all users have access to their home directories.
	~/ "Home Directory"
	
	/home/pi/Storage/Share "Data Directory" allow:@users
	 

#### デーモンを再起動

	$ sudo systemctl restart netatalk
 

他の端末からafpでアクセスして /home/pi/Storage/Shareの内容にアクセスできることを確認する。

 

### ７． MySQLのインストール

#### インストール

インストール時にrootのマスワード入力を求められる。

	$ sudo apt-get update
	$ sudo apt-get install mysql-server
 

#### mysqlコマンドでサーバーに接続して動作確認する

	$ mysql -u root -p
	Enter password:　←パスワードを入力
	mysql>
 

#### 文字コードを設定する（utf8を使用）

/etc/mysql/my.cnfを編集する。（以下に修正した箇所を記載）

	[client]
	....
	#add
	default-character-set=utf8
	....
	
	
	[mysqld]
	....
	# add
	collation-server = utf8_unicode_ci
	init-connect = 'SET NAMES utf8'
	character-set-server = utf8
	....
	
	[mysqldump]
	....
	# add
	default-character-set = utf8
	....
	
 

#### mysqldを再起動する

	$ sudo /etc/init.d/mysql restart
	 

mysqlコマンドでサーバーにログインして statusコマンドで設定内容が反映されていることを確認する。

	mysql> status

ネットワーク上の他のコンピューターからこのMySQLサーバーにアクセスしたい場合は、/etc/mysql/my.cnfの以下の行

	bind-address     = 127.0.0.1

をアクセスしたいコンピューターのIPアドレスに変更して特定のコンピューターからのアクセスを許可する

	bind-address     = 192.168.0.6

か、コメントアウトして、すべてのネットワーク上のコンピューターからアクセス可能にする。

	#bind-address     = 127.0.0.1

ただしこの方法はセキュリティ上好ましくない。

 

### 8.  mosquittoのインストール

#### インストール

	$ sudo apt-get update
	$ sudo apt-get install mosquitto
	$ sudo apt-get install mosquitto-clients
	
#### 動作確認をする

端末画面を開いて次のコマンドを実行しサブスクライバーを登録する。

	$ mosquitto_sub -d -t iothub

端末画面をもう１枚開いて次のコマンドを実行しデータをパブリッシュする。

	$ mosquitto_pub -d -t iothub -m "Hello"

上記は一方でiothubというトピックをサブスクライブし、もう一方からiothubというトピックに”Hello”というメッセージを送信するコマンド。

一枚目のサブスクライバー登録した画面にパブリッシュしたメッセージが表示されることを確認する。

ネットワーク上の他のコンピューターから接続確認するには、上記２つのコマンド以下のようにする。

	$ mosquitto_sub -h 192.168.0.202 -d -t iothub
	$ mosquitto_pub -h 192.168.0.202 -d -t iothub -m "Hello"
	 

簡単ではありますが、参考になれば幸いです。