読者です 読者をやめる 読者になる 読者になる

みかづきメモ

学習したことのメモとか、日記とか、備忘録。

Raspberry Pi の導入から一通りまとめ

いろいろやり過ぎて、次やるとき困るんじゃないかと思ったので、メモしておこう。

とりあえず、一昨日くらいの記事とかぶるけど、1記事のほうが見良いので。


ということで、いろいろしていきます。
Raspberry Pi Model B+ と Raspberry Pi 2 Model B で試してます。

まずは、raspi-configタイムゾーンだけ変えておきます。
基本はSSH経由でいろいろするので、他の設定は放置。

$ sudo raspi-config

4 Internationalisation Optionsを選んで、Change Timezone から、 Asia/Tokyo を選択。

ついでに、NTPのサーバーも変更しておく。

$ sudo vi /etc/ntp.conf

-----
# You do need to talk toan NTP server or two (or three).
#server ntp.your-provider.example
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
# server 0.debian.pool.ntp.org iburst
# server 1.debian.pool.ntp.org iburst
# server 2.debian.pool.ntp.org iburst
# server 3.debian.pool.ntp.org iburst

設定が終わったら、保存して、再起動。

$ sudo service ntp restart

ちゃんとできてるか、確認しておきます。

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp1.jst.mfeed. 133.243.236.17   2 u    -   64   17   17.001    1.788   0.234
 ntp2.jst.mfeed. 133.243.236.17   2 u   64   64    7   16.737    0.645   0.124
 ntp3.jst.mfeed. 133.243.236.17   2 u   61   64    7   16.948    0.986   0.219

*マークがどれかの先頭についていれば、同期してくれています。


つぎにパッケージ類の更新。

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

更新が終わるまで、暫く待つ。

終わったら、とりあえず使うものを入れておきます。

$ sudo apt-get install git
$ sudo apt-get install vim


次に、適当なユーザーを作っておきます。

$ sudo useradd mikazuki
$ sudo passwd mikazuki
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

このとき、piのパスワードも変更しておくといいと思います。


さっき作成したユーザーで、sudoを使えるように設定しておきます。
ついでに、piをsudoersから抹消しておきます。

$ sudo visudo
-----
# pi ALL=(ALL) NOPASSWD: ALL
mikazuki ALL=(ALL) NOPASSWD: ALL

このままログインしたかったのだけど、「ホームディレクトリがないよ」と言われるので、
自動で作ってくれるようにしておきます。

$ sudo vim /etc/pam.d/sshd
-----
# Create home directory automatically.
session    required     pam_mkhomedir.so skel=/etc/skel/ umask=0022

ここで一旦ログアウトし、先ほど作成したユーザーでログインし直します。


次は、公開鍵認証の設定です。
Windows のコマンド・プロンプトで

> ssh-keygen

を叩いて、生成された公開鍵をRaspiの方に投げつけます。
このとき、authorized_keys(id_rsa.pub)パーミッションがおかしいと、
ログイン出来ないので注意。
ログアウトせずに、別のターミナルからやること。

ログインができるのを確認したら、sshdの設定を変更し、再起動。 ちなみに、SSHのポートは、1984としておきます。

$ sudo vim /etc/ssh/sshd_config
----
PermitRootLogin no

PasswordAuthentication no

Port 1984
----
$ sudo service ssh restart


次は、iptablesの設定をしておく。
とりあえず、pingSSH、HTTP、HTTPSは許可し、それ以外の外部からの接続はブロックします。

$ sudo vim /etc/iptables/rules.v4
----
*filter

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Basic
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# SSH, HTTP, HTTPS
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1984 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT

COMMIT
----
$ sudo /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
$ sudo /etc/init.d/iptables-persistent restart

IPv6も、使う場合は同様に設定しておきます。
何か、記述がおかしい場合は2つめのコマンドで教えてくれます。
一応、下のコマンドで確認しておくといいかも。

$ sudo iptables -L
$ sudo ip6tables -L


次は、Raspberry PiのSDカードの寿命を伸ばします。
サーバーとして使っていると、早い場合は1年持たずに死ぬらしいので。

ここでは、RAMディスクを使って、延命治療しておきます。
頻繁に使われている(らしい)、/tmp, /var/log, /var/tmpを置き換えます。

$ sudo vim /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

# /tmp, /var/tmp をRAMディスクに
tmpfs           /tmp            tmpfs   defaults,size=32m,noatime,mode=1777     0
tmpfs           /var/tmp        tmpfs   defaults,size=16m,noatime,mode=1777     0

# /var/log も
tmpfs           /var/log        tmpfs   defaults,size=32m,noatime,mode=0755     0

ちなみに、なにかファイルアップロード機能を持つアプリを運営する場合は、
/tmpを大きめにとっておかないと、うまくできないようです(上の場合は32MBまで)。

次に、/etc/rsyslog.confをいじって、要らないログを出力しないようにします。

$ sudo vim /etc/rsyslog.conf
-----
~~ 省略 ~~
###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
cron.*                          /var/log/cron.log
#daemon.*                       -/var/log/daemon.log
#kern.*                         -/var/log/kern.log
#lpr.*                          -/var/log/lpr.log
#mail.*                         -/var/log/mail.log
#user.*                         -/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info                      -/var/log/mail.info
#mail.warn                      -/var/log/mail.warn
#mail.err                       /var/log/mail.err

#
# Logging for INN news system.
#
#news.crit                      /var/log/news/news.crit
#news.err                       /var/log/news/news.err
#news.notice                    -/var/log/news/news.notice

#
# Some "catch-all" log files.
#
#*.=debug;\
#       auth,authpriv.none;\
#       news.none;mail.none     -/var/log/debug
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none          -/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg                         :omusrmsg:*

#
# I like to have messages displayed on the console, but only on a virtual
# console I usually leave idle.
#
#daemon,mail.*;\
#       news.=crit;news.=err;news.=notice;\
#       *.=debug;*.=info;\
#       *.=notice;*.=warn       /dev/tty8

# The named pipe /dev/xconsole is for the `xconsole' utility.  To use it,
# you must invoke `xconsole' with the `-file' option:
#
#    $ xconsole -file /dev/xconsole [...]
#
# NOTE: adjust the list below, or you'll go crazy if you have a reasonably
#      busy site..
#
daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole

私の場合は、とりあえず cron のログは出力するようにしておきました。  

次に、起動した時にディレクトリが無いと起動できないものがあるので、 起動時に作るようにする。

$ sudo /etc/init.d/make-varlog
-----
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:             make-varlog
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Required-Start:
# Required-Stop:
# Short-Description:    Create /var/log/... files on tmpfs as startup
# Description:          Create /var/log/...files needed by system daemon
### END INIT INFO

#
# main()
#
case "${1:-''}" in
        'start')

        ##########################################################
        # prepare /var/log subdir for ramdisk init on every boot #
        ##########################################################
        mkdir -p /var/log/apt
        mkdir -p /var/log/ConsoleKit
        mkdir -p /var/log/fsck
        mkdir -p /var/log/mysql
        mkdir -p /var/log/news
        mkdir -p /var/log/nginx
        mkdir -p /var/log/samba
        mkdir -p /var/log/ntpstats

        chown root.ntp /var/log/ntpstats
        chown root.adm /var/log/samba
        chown root.adm /var/log/mrtg
        chown root.adm /var/log/mysql

        # Create Lastlog, wtmp, btmp
        touch /var/log/lastlog
        touch /var/log/wtmp
        touch /var/log/btmp

        chown root.utmp /var/log/lastlog
        chown root.utmp /var/log/wtmp
        chown root.utmp /var/log/btmp
        ;;
        'stop')
        ;;
        'restart')
        ;;
        'reload'|'force-reload')
        ;;
        'status')
        ;;
        *)
        echo "Usage: $0 star"
        exit 1
        ;;
esac

exit 0

保存して、スクリプトをインストール。

$ sudo chmod +x /etc/init.d/make-varlog
$ sudo update-rc.d make-varlog defaults
$ sudo chkconfig --list make-varlog

インストールされたら、再起動して、

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        15G  2.9G   11G  21% /
devtmpfs        483M     0  483M   0% /dev
tmpfs            98M  240K   98M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           195M     0  195M   0% /run/shm
/dev/mmcblk0p1   56M   20M   37M  36% /boot
tmpfs            32M     0   32M   0% /tmp
tmpfs            16M     0   16M   0% /var/tmp
tmpfs            32M  152K   32M   1% /var/log

さっきRAMディスクに移したものが、ちゃんと反映されていることを確認しました。
スクリプトなどに関しては、参考サイト2つめのほぼコピペさせてもらいました。。


参考にしたサイト