外部公開用の自宅サーバにするために (2015/05/05)

自宅サーバとして 2004 年の秋頃から玄箱を使っています。8年間無印玄箱を使って、ファンを交換した以外特に問題はなかったのですが、その後玄箱HGに交換して3年になります。 また、自宅に置いたサーバを外向きに公開するために NATループバック (ヘアピンNAT) 機能を持った有線ブロードバンドルータとして BBR-4HG も12年ほど使っています。 これまでギガビットのスイッチングハブ付きで NAT ループバック機能を持った Wifi ルータを探していましたが、とうとう BUFFALO の WZR-1750DHP2/N NATループバック機能を持っていることを発見しました。 早速購入して自宅のネットワーク環境を変更しました。 その勢いで自宅サーバの構成を玄箱から Raspberry Pi2 を使ったものに変更する予定です。 まずは Raspberry Pi2 をハードディスクから起動するように変更します。

ネットワーク

NAT ループバックの使えるルータとして、12年前の(今でもよく売れているようですが)BBR-4HG に無線LAN用に WZR-HP-G300NH を加えて使っていました。 やっと WZR-1750DHP2/N だけで NAT ループバック機能付きの高速 Wifi ルータ兼ギガビットな有線スイッチングハブを構成できるようになりました。


自宅サーバでは、Apache のバーチャルホストで複数のサイトを公開していて、 さらに IPアドレスで直接アクセス (というか攻撃) してきた場合は、それ専用のサイトを表示してアクセスログも分離して取得するようにしています。 LAN側から自宅サーバの各サイトにアクセスするにはNAT ループバックができないと非常に不便です。

WZR-1750DHP2/N のセキュリティ/ポート変換 (下図) で設定すると、「エアステーションのInternet側IPアドレス : HTTP(TCPポート:80)」と「LAN側WEBサーバIPアドレス : HTTP(TCPポート:80)」のように対応させると、ローカル(LAN側のクライアントPC)から WAN 側 IP アドレスを指定しても LAN 側の WEB サーバにアクセスできます。


このルータはハードディスクを接続できるため、ポータブルハードディスク(1TB USB 3.0) を接続して、ネットワークドライブとしても使います。

自宅サーバ候補

自宅サーバ用の構成として以下の写真のパーツを用意しました。


まず、Raspberry Pi2 とともに重要な位置にあるのが、セルフパワーのUSBハブです。 この ELECOM 製のUSBハブは、電源として2Aの充電専用ポートがあって、5V 3.1A の ACアダプタが付属しています。充電専用ポートからRaspberry Pi2に電源を供給し、バスパワーのポータブルハードディスク(5V 0.62A、120GB) にも電源を供給するとともにハードディスクとRaspberry Pi2 のデータ交換を中継します。 写真のハードディスクを接続している白い USB2.0ケーブル (A to miniB, 90cm) は、今回使ったハードディスクでは電圧降下のためと思われる問題のため起動できませんでした (2本も買ってしまった T_T)。 このケーブルが使えるハードディスクもありますが、バスパワーで使うには避けたほうが良さそうです。今は手持ちの別の太いケーブルを使っています。

電源用のケーブルは Amazonベーシック 1.8m のUSBケーブルでは電圧が低めだったので、今回は 90cm の USB2.0ケーブル (Aオス- マイクロBオス) を使ってみました。 このケーブルでは PWR LED が点滅しないため、電圧降下は少ないようです。 とにかく Raspberry Pi で調子が悪い時はケーブルを疑って下さい。

パーティションの作成

普通にSDカードから起動して、完全に消去してもいいハードディスクを USB で接続します。 fdisk コマンドを使ってパーティションを作成します。 fdisk コマンドは英語の表示で操作が難しそうに見えますが、下の表の値を埋めているだけです。デフォルトの部分はエンターだけを押します。 1つ目のパーティションのサイズは1024バイトを単位とするサイズのため、ハードディスクのサイズの公称値より小さめの値にする必要があります。今回使用したハードディスクは 120GB のため、2番めのパーティションを約2GBとするために試行錯誤した結果として、サイズが110GBになりました。 完全に消去してもいいハードディスクを使うわけなので気楽に試せばいいと思います。

パーティションtype開始セクタ終了セクタ ID (フォーマット)
1 p デフォルト サイズ指定 83 (ext2)
2 p デフォルト デフォルト 82 (swap)
既存のパーティションの削除と作成

fdisk コマンドでハードディスクのパーティションの作成を行います。 最初に既存のパーティションを d コマンドで削除した後、 次に n コマンドで約 110GB と 2GB の2つのパーテションを作成します。2番めパーティションはスワップとして使うため、t コマンドでパーテションタイプを82に変更し、w コマンドでディスクに書き出し、q コマンドで終了します。

jun@raspberrypi ~ $ sudo fdisk /dev/sda
# まず不要なパーティションがあれば削除
Command (m for help): d
Selected partition 1

# 新規にパーティションを作成
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
# primary を指定
Select (default p): p
Partition number (1-4, default 1):  
Using default value 1
# 開始セクタを指定(デフォルト)
First sector (2048-234441647, default 2048):  
Using default value 2048
# サイズを指定
Last sector, +sectors or +size{K,M,G} (2048-234441647, default 234441647): +110G

# 2番めのパーティションを作成
Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
# primary を指定
Select (default p): p
Partition number (1-4, default 2): 2
# 開始セクタを指定(デフォルト)
First sector (230688768-234441647, default 230688768):   
Using default value 230688768
# 終了セクタを指定(デフォルト)
Last sector, +sectors or +size{K,M,G} (230688768-234441647, default 234441647):   
Using default value 234441647

# 作成したパーテションを表示して確認
Command (m for help): p

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   230688767   115343360   83  Linux
/dev/sda2       230688768   234441647     1876440   83  Linux

# 2番めパーティションのタイプを82に変更
Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap / Solaris)

# パーティションのタイプを表示して確認
Command (m for help): p

Disk /dev/sda: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048   230688767   115343360   83  Linux
/dev/sda2       230688768   234441647     1876440   82  Linux swap / Solaris

# ディスクに書き出して
Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# 終了
Command (m for help): q

フォーマット

作成したハードディスクの1つ目のパーテションを ext4 形式でフォーマットします。

jun@raspberrypi ~ $ sudo mke2fs -t ext4 /dev/sda1
[sudo] password for jun: 
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
7208960 inodes, 28835840 blocks
1441792 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
880 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
  32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
  4096000, 7962624, 11239424, 20480000, 23887872

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

スワップパーテションを作成

2つ目のパーテションはスワップとしてフォーマットします。

jun@raspberrypi ~ $ sudo mkswap /dev/sda2
Setting up swapspace version 1, size = 1876436 KiB
no label, UUID=8f498955-6889-493c-a9b9-f1cc2f1dc28b

マウントするデバイスの変更

ルートファイルシステムとしてハードディスクのパーティションを使うように /etc/fstab を修正します。

旧 /etc/fstab
jun@raspberrypi ~ $ cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               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

/etc/fstab をバックアップして、ルートファイルシステムのデバイスを変更するために修正します。

jun@raspberrypi ~ $ sudo cp /etc/fstab /etc/fstab.org
新 /etc/fstab

ハードディスクの先頭パーテション 「/dev/sda1」 をルート「/」に指定して、ハードディスクの2番めのパーテション 「/dev/sda2」 をスワップに設定するために2行を追加します。また「/dev/mmcblk0p2」の行の先頭に「#」を追加して無効にします。 修正部分は黄色で示しています。

jun@raspberrypi ~ $ cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/sda1       /             ext4    defaults        1   1
/dev/sda2       none          swap    defaults        0   0
/dev/mmcblk0p1  /boot         vfat    defaults        0   2
# /dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

起動ファイルシステムの指定の変更

/boot/cmdline.txt には起動時のルートファイルシステムとして SDカードの領域は指定されています。これをハードディスクのパーティション (/dev/sda1) に変更します。

旧 /boot/cmdline.txt
jun@raspberrypi /etc $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

/boot/cmdline.txt をバックアップして、ルートファイルシステムのデバイスを「/dev/sda1」に変更するために修正します。

jun@raspberrypi /etc $ sudo cp /boot/cmdline.txt /boot/cmdline.txt.org
jun@raspberrypi /etc $ vi /boot/cmdline.txt
新 /boot/cmdline.txt
jun@raspberrypi /etc $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait
jun@raspberrypi /etc $ sudo mount /dev/sda1 /mnt

ファイルシステムのコピー

SDカードのルートファイルシステムをハードディスクにコピーします。dd コマンドを使用しなくても、普通のコピーコマンドで 「-ax」オプションを使えば大丈夫です。数分待って下さい。

jun@raspberrypi / $ sudo mount /dev/sda1 /mnt
jun@raspberrypi / $ cd /mnt
jun@raspberrypi /mnt $ sudo cp -ax / .

カーネルイメージを読み込むまでは SDカードが使われますが、その後はハードディスクだけ使用されます。 SDカードへの頻繁な書き込みによる劣化の心配はなくなります。

再起動

再起動すると、SD カードからブートしてカーネルを読み出した後は、すべてハードディスクが使われます。 SD カードの寿命を気にすることなく Raspberry Pi を酷使できます。

Linux raspberrypi 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun May  3 22:52:32 2015 from 172.18.21.12

ファイルシステムの確認

jun@raspberrypi ~ $ df
Filesystem     1K-blocks    Used Available Use% Mounted on
rootfs         113402528 4579148 103039828   5% /
/dev/root      113402528 4579148 103039828   5% /
devtmpfs          437856       0    437856   0% /dev
tmpfs              88432     364     88068   1% /run
tmpfs               5120       0      5120   0% /run/lock
tmpfs             552140       0    552140   0% /run/shm
/dev/mmcblk0p1     57288   14744     42544  26% /boot

スワップ領域の確認

jun@raspberrypi ~ $ swapon -s
Filename        Type    Size  Used  Priority
/dev/sda2                               partition  1876436 0 -1
/var/swap                               file    102396  0 -2

速度のチェック

ハードディスクで動作させた場合の速度を 前回のSDカード上での Node.js のコンパイル と比較してみました。 Raspberry Pi2 の 4コアを使った node-v0.12.2 の並列コンパイルに 45 分かかりましたが、ハードディスク上では以下のように30分で終了しました。

$ time make -j 4
 :
略
 :
real  29m58.214s
user  109m34.040s
sys 3m36.540s

これで、容量、耐久性、速度ともにサーバとして十分な性能と思います。

SDカード起動に戻す場合

バックアップしてある /boot/cmdline.txt.org を /boot/cmdline.txt にコピーして再起動すると、元の SDカードだけを使用して起動するように戻せます。

$ sudo cp /boot/cmdline.txt.org /boot/cmdline.txt

何らかの障害でハードディスクから起動しなくなった場合は、別のマシンでSDカードの cmdline.txt.org を cmdline.txt にコピーします。/boot はフォーマットが FAT32 なので Windows 機でもコピーできます。

ユーザとパスワードの変更

Raspberry Pi を外部に公開するためには、「pi ユーザのパスワードを変更/pi ユーザの削除」は必須です。



続く...



このページの目次