純規の暇人趣味ブログ

首を突っ込んで足を洗う

Raspbianのインストールと最強の初期設定

      2018/07/17    HimaJyun

Raspberry Piをサーバにして使っています@HimaJyunです。(ヨカッタラツイッタフォロシテネ)

Raspberry Piで使うDebian系Linuxの「Raspbian」、セットアップの時にやってる「インストールしたらこれをやるリスト」が肥大化してきたので、ここでまとめてご紹介します。

スポンサーリンク

OSのインストール

私は基本的にヘッドレス(液晶などを使用しない方法)で設定しているので、この記事ではRaspbianのLite版を大前提として説明します。

ここではRaspbian Liteをddでインストールする方法を紹介しておきます。

NOOBSを勧める人が多いですが、インストールに液晶が必要になるし個人的に実験/勉強用途以外ではお勧めしない……はい。

(インストールのやり方を知っている人、すなわち設定の所を読みたい方は下まですっ飛ばして、どうぞ。)

ダウンロード

まずはRaspbianをダウンロードしないと始まりません。

Raspbian自体は公式の「Download Raspbian for Raspberry Pi」からダウンロード出来ます。

ただ、海外サーバーでダウンロードが遅いので日本ミラーからダウンロードするのがオススメ。

ダウンロードしたzipを展開すると.imgファイルが出て来ます、これがOSのファイルです。

SDカードに書き込む(Windows)

Linuxだとddで書き込むのですが、Windowsだとddは使えないのでDD for Windowsを使う方法を書いておきます

これとは別にWin32DiskImagerなんてのも有名ですが出来る事は同じなので省略(DD for Windowsの方が操作が平易なので使いやすいとは思う)

DD for Windows - Tech Info」からダウンロードして、入手したzipを解凍しましょう。

出て来たDDWin.exeを管理者として実行します。(そうしないとSDカードを検出できない)

実行したら対象のSDカードと、書き込むimgファイルを選択。

imgファイル選択時に「All files」にしないと表示されないのは要注意

後は「<<書込<<」をクリックするとファイルをSDカードに書き込みます。
(稀に「アクセスが拒否されました」とかって出て失敗する事がありますが、気にせず何度かやり直せば問題なく書き込めます)

この時、当然ながらにSDカード上にあるデータは全て消えるので、間違えてもかわいい彼女(そんなものは居ない)の写真が沢山入ったSDカードとかで試したりしてはいけませんよ、後悔しますよ。

SDカードに書き込む(*nix)

*nixだとddコマンドが使えるのでこれで書き込むことが出来ます。(Ubuntuで確認、Bash on Ubuntu on Windowsで出来るかは不明、Macも不明)

まずはdfでSDカードを特定します、今回は「/dev/sdb」でした(もちろんsdbの部分は時と場合によって変わるのでそれに合わせて)

ddの妨げになるのでSDカードをアンマウントします。(SDカードは刺したまま、パーティションだけをアンマウントする)

「umount /dev/sdb1」みたいな感じ、sdb1、sdb2みたいにパーティションが複数ある場合は全てアンマウント。

書き込みはddを使う、ここで指定を間違うと大切なデータが沢山保存されているHDDが吹き飛んでしまうかも知れない。

sudo dd if=2017-01-11-raspbian-jessie-lite.img of=/dev/sdb bs=4M

しばらく時間が掛かるので紅茶とケーキで待つ。

書き込みが出来たら「sync」コマンドを使って同期してからSDカードを取り出す。

SSHを有効にする

デフォルトではSSHが無効です、ヘッドレス起動したい場合はSSHを有効にする必要があります。

やり方は簡単、bootパーティションに「ssh」という名前のファイルを作成すればOK。(中身は空で良い)

この時のドツボポイントですが、拡張子に気を付けて下さい。

Windows環境だと何気に「新規作成->テキストドキュメント」としてしまいますが、こうするとファイル名に.txtが付きます。(この事に気付かずに数時間悩みました)

正しくは、拡張子などのない「ssh」です。

ヘッドレス運用するつもりの方はお忘れなく。

Wi-Fiの設定をする

必要であればWi-Fiの設定も事前に行うことが出来ます。

具体的には、bootパーティションに「wpa_supplicant.conf」を作成して設定を書き込みます。(改行コードはLFにする必要があるかと思われ)

設定例はこんな感じ

ctrl_interface=/var/run/wpa_supplicant
country=JP
network={
    ssid="SSID"
    psk="パスワード"
    key_mgmt=WPA-PSK
    proto=WPA WPA2
    pairwise=CCMP TKIP
    group=CCMP TKIP WEP104 WEP40
}

(パスワードは暗号化する事も可能、ここで書くと長くなるので省略)

ちょっと面倒なので、個人的には強い理由でもない限りは有線にした方が良いと思う(有線の場合、当然ながらこの手順での設定は不要)

起動とログイン

Pi3で説明しますが、他Piでもだいたい同じかと思われます。

電源を入れる所の説明なんて要らないと思いますが、書き込みが終わったSDカードをラズパイにセットします。

電源と(必要なら)LANケーブルを差し込みます、少なくともPi3にスイッチはありません、電源を刺せば起動します。

普通の、すなわちDHCPに対応している環境であればIPも自動で割り当てられます。

割り当てられたIPをどうにかして確認します。

割り当てられた(であろう)IPアドレスを取得するには以下の様な方法があります。

  • ルータの管理画面からDHCPの払い出し状況を確認する
  • ターミナル(コマンドプロンプト)から「arp -a」を実行する
  • ブロードキャスト(192.168.1.255など)にPingを放ってみる……など

Raspberry PiのベンダID(Macアドレスの上6個の英数字)は「B8:27:EB」です。

もう一つの方法として、BonjourがインストールされたPCであれば「raspberrypi.local」でもアクセス出来ます。(こっちの方が簡単なので推奨)

手に入れたIPを元にSSHクライアントを使って接続します。

Raspbianの場合はユーザ:pi、パスワード:raspberryがデフォルト設定です。

最低限やっておきたい設定

サーバ目的での利用を前提とした「これはやっておいた方が良いでしょ」リストです。

「サーバ目的での」なので他の目的で使うのであれば、その目的に合わせて設定して下さい

追記:Raspbian stretchがリリースされたためstretch用に記事を修正しました、何らかの理由でjessieに同じ設定を行う必要がある人はjessie用の差分をご覧ください。

ローカルIPを固定しておく

毎回毎回「よっしゃー!!接続するぞー!!arp -a!!(ッターン」なんて事やってたらダサいのでローカルIPを固定しておきましょう。

慣れたユーザであれば「/etc/network/interfaces」とかを開こうとしますが、残念ながら違います。

RaspbianでローカルIPを固定するには「/etc/dhcpcd.conf」に設定します。

具体的な設定は以下の通り

interface eth0
# IPアドレス
static ip_address=192.168.x.x
# デフォルトゲートウェイ
static routers=192.168.x.1
# DNS
static domain_name_servers=192.168.x.1 8.8.8.8

余談ですが、インデントを入れると見やすいです

これで保存して再起動すればローカルIPアドレスが固定出来ます。

現在のIPアドレスは「ifconfig」で確認できますよ。

ソフトウェアアップデート

最初にaptでソフトウェアのアップデートを行っておきましょう。

コピペ用:sudo apt-get update && sudo apt-get -y dist-upgrade && sudo apt-get -y autoremove && sudo apt-get autoclean

rpi-updateによるファームウェア更新は(不安定になる可能性もあるので)必要がなければ行わない方が良いみたいです(PCで言うBIOS更新に近い感じかな)

自動更新

手で更新するのは面倒(+自分が更新するまで脆弱性を放置する事になる)のでセキュリティアップデートは自動で更新させる

まずは「unattended-upgrades」をインストールする(ナマエナガイヨ

sudo apt-get install -y unattended-upgrades

「/etc/apt/apt.conf.d/50unattended-upgrades」を見た感じでは、設定内容がDebian用(Raspbian用ではない)ので、そのままでは動かないかと思われます。

設定ファイル内で「o=Debian」と指定されているが、aptのReleaseなどを見てみた感じではRaspbianと指定する必要がある気がする……ので、設定を変更。

といっても簡単で、「"o=${distro_id},n=${distro_codename}";」をOrigins-Patternの中に追加するのでOKだと思われ。

(${distro_id}はRaspbian、${distro_codename}はstretchになるマクロ)

正しく動作しているか気になる方は「/var/log/unattended-upgrades」にあるログを見ましょう

raspi-config

「sudo raspi-config」コマンドでラズパイの設定が行えます、必要に応じて設定を行って下さい。

必要そうな設定は以下の通り。

  • Localisation Options->Change Locale: ここは日本なので「ja_JP.UTF-8」にしている。
    その次の画面で選べと言われるのはデフォルトのロケール、これも「ja_JP.UTF-8」でOK
    (CUIなら英語のままでもいいかも知れない)
  • Localisation Options->Change Timezone: ここは日本、なので「Asia」を選んでから「Tokyo」
  • Localisation Options->Change Wi-fi Country: Wi-Fiを使う場合はJPにしておく方が良いかと思う
  • Advanced Options->Memory Split: GPUメモリの割り当て、ヘッドレスで運用しているのでアプリケーションが使える分を最大にすべく16にしている。(もちろん用途に合わせて設定してね)

必要ならやれば的な設定は以下の通り

  • Advanced Options->Hostname: 適当にホスト名を付ける、ReimuとかRemiliaとかそんなホスト名を付けているのはヒミツダヨ☆
  • Change User Password: パスワードを変える、サーバにするなら変えること。
  • Localisation Options->Change Keyboard Layout: キーボードの種類、JISキーボードとか繋いでいるなら設定しないとパイプ(|)で困る(SSH接続なら不要)
  • Advanced Options->Expand Filesystem: SDカードを一杯まで使う、いつからか初回起動時に自動で実行されるようになったので普通は不要

ちなみに、raspi-configは非対話モードがあり、以下のような感じで利用可能

# GPUメモリ割り当て
sudo raspi-config nonint do_memory_split 16
# ホスト名
sudo raspi-config nonint do_hostname remilia
# Wi-Fiの国選択
sudo raspi-config nonint do_wifi_country JP
# SDカードの拡張
sudo raspi-config nonint do_expand_rootfs

具体的な使い方はrc_guiのコードを参考にすると良いです。

非対話モードで設定できない奴も自分で設定すればなんとかなりそう。

# TimeZone
sudo timedatectl set-timezone Asia/Tokyo
# おそらく必要ないだろうけど一応reconfigureしておく
sudo dpkg-reconfigure -f noninteractive tzdata 

# Locale
# /etc/locale.genのja_JP.UTF-8 UTF-8をアンコメント
sudo perl -pe 's/^# (ja_JP.UTF-8 UTF-8)/$1/g' -i /etc/locale.gen
# 言語設定
sudo locale-gen
sudo update-locale LANG=ja_JP.UTF-8
# 念のため
sudo dpkg-reconfigure -f noninteractive locales

Raspbianを自動でセットアップするスクリプトなどを作成する際には積極的に利用していきたい

SSHホスト鍵の更新

SSHのホスト鍵も更新しておく

sudo rm -v /etc/ssh/ssh_host*
sudo dpkg-reconfigure openssh-server

必要に応じて鍵交換方式に変更したりする。

パスワードの変更、パス無しsudoの禁止

記事の都合でここに書きますが、この操作は最後にやった方がセットアップが楽です。

パスワードの変更は「sudo passwd」で出来ます(raspi-configからでも可、やっている事は同じ)

rootのログインはデフォルトで無効にされているのでパスワードを設定しない方が良い(つまり、「sudo passwd root」をしてはいけない)

また、パスワードなしでのsudoの利用を禁止しておきましょう。

設定は「/etc/sudoers.d/010_pi-nopasswd」にあるので、この中の「pi ALL=(ALL) NOPASSWD: ALL」をコメントアウトする。

もしくは「sudo rm /etc/sudoers.d/010_pi-nopasswd」でファイルそのものを消してしまいましょう。(どうせ要らないのですから消してしまった方が良いかも)

ユーザ名の変更

ちょっと手法が複雑になるので別記事にあります、サーバ目的だとパスワードと同じくらい必須だと思います。

こちらをご覧ください:[Raspbian]ユーザ名変更の個人的に「正しい」と思うやり方

必要であればやる設定

やらなくても問題はありませんが、場合によっては使い易さ向上が見込めると思います。

aptのミラーを変える

デフォルトだと「mirrordirector.raspbian.org」からaptのパッケージを取得するようになっています。

適切なミラーサーバにリダイレクトしてくれるみたいなのですが、ここが日本なのは分かっていますし最初から日本ミラーよりダウンロードするように設定したい人も居るでしょう。(しなくても日本のサーバにリダイレクトされるはず)

まずは「/etc/apt/sources.list」を適当なエディタで開きます。

きっとデフォルト設定があるでしょうから、それをお好みのRaspbianのミラーサーバへと書き換えます。

deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
# 例:
#deb http://ftp.jaist.ac.jp/raspbian/ stretch main contrib non-free rpi

現時点(2017/08/24)での日本のミラーサーバは以下の3ヵ所ですね。

  • http://ftp.jaist.ac.jp/raspbian/
  • http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian/
  • http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/

自分のお住まいの地域(と言うより利用しているネットワーク)から一番距離の近い(応答速度の早い)サーバを選べば良いでしょう。

応答速度の測定はpingとかcurlで出来るはず、curlなら以下の通り。

curl -sL ${url} -o /dev/null -w "%{time_total}ms"

ミラーサーバを設定し終わったら以下のコマンドで設定の反映

sudo apt-get update

NTPの設定

NTPは「systemd-timesyncd」を利用します、従来までの「/etc/ntp.conf」は使いません。

有効になっているかどうかは「timedatectl status」で確認します。

Local time: 水 2017-08-23 13:30:33 JST
Universal time: 水 2017-08-23 04:30:33 UTC
RTC time: n/a
Time zone: Asia/Tokyo (JST, +0900)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no

「Network time on」が「yes」になっていれば有効です、そうでない場合は「sudo timedatectl set-ntp true」で有効にします。

同期元サーバの設定は「/etc/systemd/timesyncd.conf」です。以下のように設定します。

[Time]
NTP=ntp.jst.mfeed.ad.jp ntp.nict.jp
FallbackNTP=time.google.com

同期元のNTPサーバは恐らくPing最短であろうと思われるプロバイダのサーバを利用するのが良いと思います。

プロバイダがNTPサーバを提供していない場合はMFEEDやNICTを利用しましょう。

後は「sudo systemctl restart systemd-timesyncd」で再起動すればOK

ハードウェア乱数を使用する

Raspberry Piにはハードウェア乱数生成器が載っている。(これを利用=信用するか否かは個人の判断に委ねます)

前まではこれを利用するためにはカーネルモジュールのロードが必要だったが、今は不要になった

つまりaptでrng-toolsをインストールするだけで使える。

sudo apt-get install rng-tools

これを使うと/dev/randomのエントロピープールが大幅に増え、それらを使う乱数の生産が早くなる

swapを調整する

SDカードだと寿命や容量が気になってswapを無効にしたい事もあるでしょう。

逆に、HDD稼働になっている場合にはswapを利用して足りないメモリを誤魔化したい事もあるでしょう。

RasPiのswapはdphys-swapfileが司っているみたいなのでこれを弄れば調整が可能です。

swapを無効にするにはdphys-swapfileを停止する

sudo systemctl disable dphys-swapfile

逆に停止したdphys-swapfileを元に戻したい時は以下の通り

sudo systemctl enable dphys-swapfile

swapのサイズを変更したい時は、まず最初にdphys-swapfileを停止させる

sudo systemctl stop dphys-swapfile

次に「/etc/dphys-swapfile」を開き、CONF_SWAPSIZEを変更する。(単位はMB、デフォルトは100)

変更出来たらdphys-swapfileを再起動させる

sudo systemctl start dphys-swapfile

なお、指定したサイズのswapファイルを予め生産するため、swapがデカいと少々時間が掛かる。

Wi-Fiを無効にする

Pi3のWi-Fiを無効化するには、「/boot/config.txt」に「dtoverlay=pi3-disable-wifi」を追記する。

別にやらなくても問題はない、ZabbixやMuninで監視する時に邪魔になるので私は無効化している。

avahiを無効にする

Unboundなどの内向きDNSが設定出来ている環境ではavahi-daemonは不要なので止めちゃう。

sudo systemctl stop avahi-daemon.socket
sudo systemctl disable avahi-daemon

これでOKなはず

dhcpcdを無効にする

/etc/dhcpcd.confを編集するのではなく、dhcpcdを無効にして普通に/etc/network/interfacesを使うという手もある。(基本的には不要な手順、普通はdhcpcdを利用したのでよし)

dhcpcdはsystemctlで無効にする

sudo systemctl disable dhcpcd

その後、「[Ubuntu]ローカルIPアドレスを固定にする」で紹介しているのと同じように、「/etc/network/interfaces」に以下のような設定を追加。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.2
        netmask 255.255.255.0
        gateway 192.168.1.1
        dns-nameservers 192.168.1.1 8.8.8.8

# 必要なら
#iface eth0 inet6 auto
#iface eth0 inet6 static
#        address 2001:db8:1::abcd
#        netmask 64
#iface eth0 inet6 static
#        address fd00:192:168:1::1
#        netmask 64

特にIPv6アドレスを複数割り当てようと思うとdhcpcdでは出来ない(?)みたいなのでこの方法を使う事になるかと思われ。

USB HDDで起動したい

こちらは別記事でお取り扱い中

こちらをご覧ください:Raspberry PiをUSB(HDD)で起動させる

終わりに

以上が私のやっているPi設定、「最強の初期設定」なので色々と多いが別に全てを行わなければならないという訳ではない。

元々サーバーとして使う事を目的とした設定なので、それに合わせて調整しまくったらこうなった、と言うだけ。

用途に合わせて参考にして欲しい。

 - コンピューター