Raspberry Piセットアップメモ(ディスプレイレス)

Updated: / Reading time: 10 minutes

NOTE: この記事は内容が古いです。最新の情報はRaspberry Pi 3 Model B+を購入してからヘッドレスでsshできるようにするまでの5ステップと、ハマりポイントをご覧ください。

安価で遊べるサーバーが欲しかったので、Raspberry Pi Model B+を購入しました。取りあえず使えるようにするまでの初期構築手順を記述します。あくまで自分用メモなので、しっかりした手順を知りたい場合は、既にたくさん公開されている同様の記事を見たほうが良いかもしれません。

作業前提

  • MacBookProで作業しました。Windowsでも適宜読み替えてもらえば、作業可能なはずです。
  • Raspberry Pi側のセットアップは、ssh接続でセットアップしました。ディスプレイ、キーボード、マウスは使用していません。
    • 正直、何かあってssh接続できない時に状況を確認できないので、ディスプレイ、キーボードくらいは用意したほうが良いと思います。

使った機材

  • Rasberry Pi Model B+
    • RSコンポーネンツでケースと一緒に購入しました。
    • Raspberry PI B+
    • [Raspberry Pi B+ Case, Black](http://jp.rs-online.com/web/p/development-board-enclosures/8193655/?origin=PSF_502004 acc)
  • LANケーブル、USB無線LANアダプター
    • 最終的には無線だけにしたいですが、最初は有線でのセットアップが必要です。有線のまま運用するなら、USB無線LANアダプターは不要です。
  • USBケーブル+アダプター
    • 電源供給のために必要です。USBミニBが必要になります。スマホの電源と同じアレです。
  • microSD、外付けHDD
    • OSを外付けHDDに格納するなら、microSDは8GB程度で十分です。microSDだけで運用するなら外付けHDDは不要ですが、それなりの容量のものを用意したほうが良いと思います。
    • 現時点で、完全にmicroSDレスにはできないもようです。
  • MacBookPro
    • セットアップ作業のために必要です。ここではMacBookProを使いましたが、Windowsでも可能なはずです。

セットアップ後の状態

  • ネットワーク接続…Wi-Fi
    • iptables(というかufw)で制限。
  • ssh接続
    • LAN、WANからssh接続できる。
    • ポート番号を変更。
    • 公開鍵認証を有効、パスワード認証を無効。
  • ストレージ…ブート関連はmicroSD、OSは外付けHDD。
    • microSDのみで運用する場合は、外付けHDDに関する手順を読み飛ばす。
  • タイムゾーン…Asia/Tokyo
  • CPU…1000MHzにオーバークロック。
  • メモリ…GPU割り当てを最小(16MB)。

作業手順

microSDにRaspbianをインストール

MacBookProで作業します。

[Downloads Raspberry Pi](http://www.raspberrypi.org/downloads/)からRaspbianをダウンロードします。NOOBSだと楽という話も聞きますが、ここではRaspbianを使います。NOOBSでの手順は別記事をご覧ください。

microSDをMacBookProに挿入して、ディスクユーティリティでFATフォーマットします。

フォーマットしたmicroSDにRaspbianイメージを書き込みます。

$ df -h
$ sudo diskutil unmountDisk /dev/disk2s1
$ sudo dd if=2014-09-09-wheezy-raspbian.img of=/dev/disk2 bs=4m
$ sudo e2fsck -f /dev/disk2s1

dfでデバイス名を確認、diskutilでmicroSDをアンマウント、ddでmicroSDにイメージを書き込み、e2fsckでファイル破損チェックを行っています。

Raspberry Piを起動

microSDをRaspberry Piに挿入し、LANケーブルを接続し、電源を接続して起動します。Raspberry Piには電源スイッチが無く、通電すると自動的に起動するので注意してください。この時点では、外付けHDD、USB無線LANアダプターは接続しません。

Raspberry Piが起動して数分経過したら、Raspberry Piに割り当てられたIPアドレスを確認します。ルーターの管理画面でDHCPで割り当てたIPアドレスを確認する、などの方法で確認します。

Raspberry PiのIPアドレスが確認できたら、MacBookProからsshでRaspberry Piに接続します。初期ユーザーは”pi”、パスワードは”raspberry”です。

$ ssh pi@192.168.1.10

ssh接続できたことを確認したら、シャットダウンします。

$ sudo halt

外付けHDDにファイルを移行

※microSDのみで運用する場合、この手順は不要です。 ※筆者はこの手順をRaspberry Piで作業を行いましたが、Linux PCを用意して作業したほうが良いです。

外付けHDDをRaspberry Piに接続し、電源を接続してRaspberry Piを起動します。

Raspberry Piを起動してssh接続したら、外付けHDDをext4でフォーマットします。 まず、fdiskで外付けHDDのデバイス名を確認します。

$ sudo fdisk -l

デバイス名を確認したら、fdiskでパーティションを編集します。

$ sudo fdisk /dev/sda

fdiskでは、以下の操作でパーティションを編集します。

  • pで現在のパーティション設定を確認できる。
  • dでパーティションを削除する。
  • nでパーティションを作成する。
  • wで保存する。

パーティションを編集してfdiskを終了したら、mkfs.ext4でext4フォーマットします。外付けHDDの容量によっては数分かかります。

$ sudo mkfs.ext4 /dev/sda1

ext4フォーマットが終了したら、OSのパーティションをmicroSDから外付けHDDにコピーします。この作業は非常に時間がかかります(1~2時間程度)。

$ sudo dd if=/dev/mmcblk0p2 of=/dev/sda1
$ sudo e2fsck -f /dev/sda1
$ sudo resize2fs /dev/sda1

ddでコピー、e2fsckでファイル破損チェック、resize2fsでパーティション容量を拡張しています。ddでコピーしただけだと容量が小さいままなので、resize2fsで拡張する必要があります。

NOTE: Raspberry Piのddは、bsオプションを指定するとエラーになるようです。

OSパーティションをコピーしたら、OSパーティションから起動するように設定を変更します。 まず、外付けHDDを適当なフォルダにマウントします。

$ sudo mount /dev/sda1 /mnt

microSD内の自動マウント設定を修正します。自動マウント設定はmicroSD内の”/boot/cmdline.txt”にありますので、これを編集します。

前:root=/dev/mmcblk0p2
後:root=/dev/sda1

次に、外付けHDD内の自動マウント設定を修正します。HDD内の自動マウント設定は”/etc/fstab”にありますので、これを編集します。

前:/dev/mmcblk0p2
後:/dev/sda1

rebootでRaspberry Piを再起動します。

$ sudo reboot

再起動が完了したら、マウント位置が”/dev/sda1”に変更されていることを確認します。

$ df -h

初期設定作業

raspi-configで初期設定を行います。

$ sudo raspi-config

以下のように設定します。

  • Expand Filesystem →Select
  • Change User Password
  • Internationalisation Options / Change Timezone →Asia / Tokyo
  • Advanced Options / Memory Split →16
  • Overclock →Turbo

rootのパスワードを変更します。

$ sudo passwd

ソフトウェアをアップデートします。

$ sudo apt-get update
$ sudo apt-get upgrade

ファームウェアをアップデートします。

$ sudo rpi-update
$ sudo reboot

作業ユーザーを作成します。

$ id
$ sudo useradd -m u6k -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio
$ sudo passwd u6k
$ sudo visudo

作業ユーザーはpiユーザーと同じグループに所属させます。なので、まずidでpiユーザーの所属グループを確認し、同じグループをuseraddで指定します。ユーザーを作成したらpasswdでパスワードを設定します。sudoするときにパスワードを省略したいので、visudoで設定を編集します。内容は、以下を追加します。

u6k ALL=(ALL) NOPASSWD: ALL

作成したら、作業ユーザーでログインできること、sudoでパスワードを省略できることを確認します。

NOTE: piユーザーを削除・リネームするなどして使えなくしたほうがセキュリティ的に良いかもしれません。

無線LANを設定

※有線で運用する場合、この手順は不要です。

USB無線LANアダプターをRaspberry Piに挿入し、認識されたことを確認します。

$ lsusb

USB無線LANアダプターが認識されたら、Wi-Fiアクセスポイントが検知できることを確認します。

$ sudo iwlist wlan0 scan | grep ESSID

Wi-Fiアクセスポイントが検知できたら、SSIDとパスフレーズを設定します。

$ wpa_passphrase HG8045-2428-bg $1 | sudo tee -a /etc/wpa_supplicant/wpa_supplicant.conf
  • $1…Wi-Fiアクセスポイントのパスフレーズ
  • Wi-Fiアクセスポイントの設定によっては、”wpa_supplicant.conf”を編集する必要があります。

ネットワーク設定を修正します。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

修正したら、ネットワークを再起動します。

$ sudo service networking restart

Wi-Fiに割り当てられたIPアドレスを確認し、そのIPアドレスでssh接続できることを確認します。

$ ssh u6k@192.168.10.123

以降、LANケーブルを外してWi-Fiで作業します。

スピードテストを実施

※この作業は必要ではありません。気になる場合に実施します。

インターネット接続の速度計測を行います。speedtest-cliを使用します。

$ sudo aptitude install python-pip
$ sudo pip install speedtest-cli
$ speedtest-cli

sshを鍵認証方式に設定

パスワード認証方式を無効にして、鍵認証方式のみを有効にします。

まず、MacBookPro側で秘密鍵・公開鍵を作成します。

$ ssh-keygen -t rsa

カレントフォルダに”id_rsa”、”id_rsa.pub”が作成されます。秘密鍵(“id_rsa”)は漏洩することがないよう、厳重に管理すること。

NOTE: ssh-copy-idで簡単に配置できるようです。いつか試す。

作成した鍵のうち公開鍵をRaspberry Piに配置します。

$ cd
$ mkdir .ssh
$ chmod 700 .ssh
$ cd .ssh
$ vi authorized_keys

“id_rsa.pub”の内容をコピー&ペーストします。 “authorized_keys”のパーミッションを変更します。

$ chmod 600 authorized_keys

sshの公開鍵認証を有効にして、パスワード認証を無効にします。”/etc/ssh/sshd_config”を以下のように設定します。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin no
RhostsRSAAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
ChallengeResponseAuthentication no

セキュリティのため、sshdのポート番号を変更します。実際は、適当なポート番号に変更してください。外部からこの作業を行っている場合、ルーターのポートフォワーディング設定と合わせないと接続できなくなるので注意(外部からなんて作業しないと思うけど…)。

Port 12345

Raspberry Piを再起動します。

$ sudo reboot

ssh接続を、以下のように確認します。

  • 変更後のポート番号で接続できること。変更前のポート番号で接続できないこと。
  • rootユーザーのログインが失敗すること。
  • piユーザーのログインが、パスワード認証、公開鍵認証の両方ともに失敗すること。
  • 作業ユーザーのログインが、パスワード認証に失敗し、公開鍵認証に成功すること。

iptablesを設定

ufwを使用して、iptablesの設定を行います。

まず、ufwをインストールします。

$ sudo aptitude install ufw

ufwの状況を確認します。この時点では無効になっています。

$ sudo ufw status

ufwでiptablesを設定します。以下では、80(http)、443(https)、22(ssh)を設定しています。sshポート番号を変更している場合、読み替えてください。

$ sudo ufw default DENY
$ sudo ufw allow 80
$ sudo ufw allow 443
$ sudo ufw allow 22

ufwを有効化にします。「ssh接続が切断されるかもしれないが良いか?」と聞かれますが、”y”を入力します。有効化後、別sshクライアントで接続できることを確認します。

$ sudo ufw enable

ufwの状況を表示し、設定が反映されていることを確認します。

$ sudo ufw status

NOTE: 間違えてルールを追加した場合、以下のコマンドで削除できます。 $ sudo ufw delete $1 $2 例: $ sudo ufw delete allow 22

外部から接続

※LAN内でのみ運用する場合、この手順は不要です。

ルーターにポートフォワーディングの設定を行います。

“ieserver.net”で、会員登録を行い、DDNSの設定を行います。

“ieserver.net”からDDNS更新スクリプトをダウンロードして、定期実行するように設定します。

“ddns-update.txt”を”/usr/local/bin”にダウンロードします。”ddns-update.pl”にリネームし、実行権限を与えます。

$ cd /usr/local/bin
$ sudo wget http://ieserver.net/ddns-update.txt
$ sudo mv ddns-update.txt ddns-update.pl
$ sudo chmod +x ddns-update.pl

“ddns-update.pl”を修正します。アカウント、ドメイン名、パスワードを記述します。

“ddns-update.pl”を実行します。実行後、”ieserver.net”でIPアドレスが正しく更新されたことを確認します。

$ ./ddns-update.pl

cronで定期的に実行されるように設定します。設定後、しばらく後に”ieserver.net”を表示し、IPアドレスが正しく更新されたことを確認します。

$ sudo crontab -e
*/10 * * * * /usr/local/bin/ddns-update.pl

LAN、WANから、ドメイン名指定でssh接続できることを確認します。

USBポートに1.2Aの電力供給を設定

初期状態では0.6Aまでに制限されており、1.2Aまで電力供給するように設定します。電力供給が少ないと、USBポートから電力を確保しているUSB HDDやWi-Fiアダプターなどの動作が不安定になるようです。

/boot/config.txtに以下を記述します。

safe_mode_gpio=4
max_usb_current=1

記述後、再起動します。

$ sudo reboot

参考リンク