外部公開用の自宅サーバにするために (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 ユーザの削除」は必須です。