Raspberry Pi をサーバーとして利用する際に、まず最初にすること。
(あくまでも管理人用の基本設定なので、これにこだわる必要はまったくない)

なお、このページの内容の一部は、このサイト内の Raspberry Pi/各種設定 以下の内容をincludeしているので、内容が重複(というか同一)となっている。一度に全部読めるように同一ページにまとめた、ということになる。

補足:下記のコマンド実行例で、su コマンドを実行すると実際にはパスワード入力要求のプロンプトが表示されるが、ここでは省略している(suを使う前にsudoを使ってrootのパスワードを設定する)。rootのパスワードを設定せず、sudoで通す方はそれはそれでよい。

目次

前提、方針

  • Raspberry Pi Model B
  • 電源の確保(5V1A程度のUSB充電器など、USB-A -> micro USBケーブル)
  • OSは Raspbian GNU/Linux 7 (wheezy) *1
  • 固定IPアドレスでネットワーク接続する
  • SDカードへの書き込みをなるべく抑止

ではさっそくやってみる。

ファイルの入手

OS(Raspbian)のディスクイメージ
http://www.raspberrypi.org/downloads/

SDカードへの書き込みツール(Windows用)
http://sourceforge.jp/projects/sfnet_win32diskimager/release/

SDカードへのOS書き込み

いくつか方法があるが、今回は Windows のツールを使用した。 先にダウンロードしたディスクイメージを、同じくダウンロードしたツールを使ってSDカードへ書き込む。 ダウンロードしたディスクイメージはzip形式なので、あらかじめ解凍すること。

使い方は簡単なので省略する。

(稼働中のLinux端末があると簡単なのだが。ブートイメージをddコマンドでSDカードのデバイスに書き込むだけなので。)

OSの初回起動

初回起動時だけはHDMI端子付きモニター(またはVideo-in端子の付いたテレビ)、およびUSBキーボードが必須となる。
管理人はHDMI端子付きモニターを持ち合わせておらず、変換コネクターで
 Raspberry Pi -> HDMIケーブル -> 変換コネクタ -> DVIモニター
として使っている。

SDカード、LANケーブル、HDMIケーブル(またはビデオケーブル)、キーボードを Raspberry Pi 本体にセットし、最後に電源ケーブルを差し込むとブートが開始される。
(Raspberry Piには電源スイッチは存在せず、電源専用のMicroUSBポートへケーブルを差し込むといきなり起動するので注意)

起動シーケンスの最後に、自動的に raspi-config コマンドの実行画面が表示される。ひとまず、下記の最低限を設定し再起動する。

メニュー項目概要
Expand FilesystemSDカードの容量いっぱいまで、ファイルシステムを拡張する。
これをやらないとSDカードの容量いっぱいまで書き込むことができない。
Change User Passwordユーザー pi のパスワードを変更(ユーザー pi は最初から用意されている)
Internationalisation Options
-> Change Timezone
Asia->Tokyoの順に選択。
Advanced Options
-> SSH
SSHを起動する

ここまでやったら、続きは ssh 経由で行うので、ひとまず保存・再起動し、ユーザー pi でログインできるか確認する。
ログインできたらとりあえずIPアドレスを確認し、メモしておく(sshでログインする際に使う)。

pi@raspberrypi ~ $ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.126/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever

ネットワーク設定のデフォルトはDHCPでアドレス取得なので、管理人宅ではとりあえず上記の値になった。これは後で固定IPに変更する。MACアドレスは一部伏字となっている。

以降は ssh でログインし作業続行する。
ネットワーク廻りの設定さえ間違わなければ、raspi-config も含めほぼすべて ssh 経由で作業できる。

ext4ファイルシステムのジャーナルを廃止

(2016-03-30追加) SDカードの寿命を伸ばしたい関連

Raspbianのシステムが格納されているファイルシステムは ext4 である。
が、ふと、ext4のジャーナルって何か書き込みが発生するたびに必ず書き込みされるじゃないですか!ということに気づいた。

デフォルトではメタデータ(ファイル本体を除くファイルの管理情報)のみがジャーナルに書き込まれるようだが、SDカードのジャーナルの領域が真っ先にダメになる悪寒がしたため、ジャーナルを廃止することにした。

早速下記コマンド。

$ su
# tune2fs -O ^has_journal /dev/mmcblk0p2
tune2fs 1.42.5 (29-Jul-2012)
#

てな具合です。
うまくいったかどうか確認するには、下記。

# tune2fs -l /dev/mmcblk0p2 | grep features
Filesystem features:      ext_attr resize_inode dir_index filetype extent flex_bg sparse_super large_file uninit_bg dir_nlink extra_isize

とやって、 has_journalが含まれていなければOK。

念のため、OSを再起動してみたほうがいいかと。

(補足:tune2fsのバージョンによっては上記ではNGの場合があるようです)。

rootのパスワード設定

ルート権限が必要な場合、sudo コマンドでやってもよいのだが、時にはスーパーユーザーになりたい気分の時もあるので、root のパスワードを設定しておく。

pi@raspberrypi ~ $ sudo passwd root
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
pi@raspberrypi ~ $

パスワードの文字列は、まあお好きにどうぞ。

rootでのリモートログイン禁止(ssh の設定変更)

rootにパスワードを設定した結果、rootユーザーでsshにてログインできてしまうので、できないようにする。

$ su
# cd /etc/ssh
# cp -p sshd_config sshd_config.orig           # backup
# vi sshd_config

オリジナルとの変更点は下記。

# diff sshd_config.orig sshd_config
27c27
< PermitRootLogin yes
---
> PermitRootLogin no

固定IPアドレス

IPアドレスがDHCPでは使いにくいので、固定IPアドレスに変更する。
主な変更対象ファイル /etc/network/interfaces

$ su
Password:
# cd /etc/network
# cp -p interfaces interfaces.orig           # backup
# vi interfaces

ファイルの内容(全文)

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.xxx
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

address には既存の値と衝突しないIPアドレスを記述する。
最後のほうの allow-hotplug 以降は元から入っているもので、とりあえず今は触らないことにする。

ここまで来たら、インターフェースの再立ち上げをしてみる。
めんどいので、ssh で接続したまま、下記を実行する。

# sudo ifdown eth0; ifup eth0
(このあと音信不通になるが気にしない)

ifdown, ifup は1行で書くのがコツ。理由は(ry)
IPアドレスが変わるので ssh はいったん切れてしまう。新しいIPアドレスで再度 ssh で接続してみて、うまくつながれば成功。
つながらなかった場合は、残念だがもう一度モニター、キーボードを Raspberry Pi 本体に接続し、設定を再確認願う。

chkconfig : システムサービスの切替ツールのインストール

/etc/rc*.d/のもろもろをオンオフするためのツールとして、chkconfig パッケージをインストールしておく。
これは、単に管理人が使い慣れているから、である。

$ su
# apt-get install chkconfig

swapファイルの廃止

Raspberry Piでは、通常のLinuxとは異なる独自のswapファイルを使用している。

Stretchの場合(2018-06-27追記)

$ su
# systemctl stop dphys-swapfile.service
# systemctl disable dphys-swapfile.service
# rm /var/swap

Jessie以前の場合

Raspberry Piのswapファイルのオフ方法は、/etc/fstabに書いてあるコメントのとおり、dphys-swapfile コマンドを使う。
swapoffにしたら、ブート時にも起動しないようにchkconfigで設定変更する。

$ su
# dphys-swapfile swapoff
# chkconfig dphys-swapfile off
# rm /var/swap

最後のrmでは、swapの残骸を削除している。swapoffにしてからでないと消せない。

log,tmpのオンメモリ(tmpfs)化

概要

SDカードへの書き込みをなるべく減らすため、下記ディレクトリ:

  • /var/log
  • /tmp
  • /var/tmp

をtmpfs*2として構成する。tmpfsとすることで多かれ少なかれメインメモリを消費するため、ログの保存期間を短くしメモリを圧迫しないようにする。

上記ディレクトリが揮発性となることで、その下に所属するファイル・ディレクトリが再起動のたびにクリアされてしまう。特に、一部のサービス・アプリケーションは/var/logにあらかじめファイル・ディレクトリが存在していないとうまく動かないものがあるため、ブートシーケンスの中で必要なものを作成するようにする。

では早速設定を開始する。

作業内容

設定変更するファイル、内容、手順等は下記の通り。

  • /etc/fstab
  • /var/log
  • /var/tmp
  • /tmp
  • /etc/init.d/bootmisc.sh
  • /etc/init.d/bootmisc-sub-varlog.inc (自作)

以下、順に説明する。

/etc/fstab
起動時にマウントするtmpfsの定義を追加する。
下記の行を末尾あたりに追加する。

tmpfs  /tmp           tmpfs defaults,size=32m,noatime,mode=1777 0 0
tmpfs  /var/tmp       tmpfs defaults,size=16m,noatime,mode=1777 0 0
tmpfs  /var/log       tmpfs defaults,size=16m,noatime,mode=0755 0 0

補足:size=XXmの部分は、そのファイルシステムの最大容量。これは最初からメモリを最大量確保するわけではなく、使用した分だけメモリが自動拡張され、size=で指定された容量まで拡大する、ということ。
サイズは各自で適宜調整願う。

リブートはせず、次の手動マウントを試してから。

/var/logの手動マウント
/var/logはマウントポイントとなるため、現在の内容はすべて不要である。
一度バッサリ削除(必要ならバックアップ)して再作成し、tmpfsを手動でマウントしてみる。

$ su
# cd /var
# ls -ld log
drwxr-xr-x 8 root root 4096 12月 26 06:25 log/    # パーミッションを覚えておく
# rm -rf log
# mkdir -m 755 log
# chown root:root log
# ls -ld log
drwxr-xr-x 2 root root 4096 12月 26 13:52 log/
# mount log

マウントできたかどうかは、下記で確認するとよい。

# df -h | grep /var/log
tmpfs             16M     0   16M    0% /var/log

おまけ:rsyslogdを再起動すると、新しい/var/logの下にログファイルが生成されるはず。

$ sudo /etc/init.d/rsyslog restart

/var/tmpの手動マウント
初期状態に近いならば、おそらく空であると思われるので、単に手動マウントし、確認してみる。

$ su
# mount /var/tmp
# df -h | grep /var/tmp
tmpfs             16M     0   16M    0% /var/tmp

/tmpの手動マウント
一応クリーンな状態とするため、/var/logと同様に全部削除~再作成。

$ su
# cd /
# ls -ld tmp
drwxrwxrwt 4 root root 4096 12月 26 13:43 tmp/
# rm -rf tmp
# mkdir -m 1777 tmp
# chown root:root tmp
# mount tmp
# df -h | grep /tmp
tmpfs             16M     0   16M    0% /var/tmp
tmpfs             32M     0   32M    0% /tmp

mkdirの-mオプションのパーミッションの先頭1桁目の'1'を忘れずに(スティッキービット)。 grepの結果に/var/tmpが含まれるのはご愛嬌。

/etc/init.d/bootmisc.sh , /etc/init.d/bootmisc-sub-varlog.inc
/var/log/内にあらかじめ存在していないと問題があるファイル、ディレクトリをここで作成する。
このスクリプトは /etc/rcS.d/ にて、ローカルファイルシステムのマウント完了後(実際はさらにずっとあと)に起動されるので、当然 /var/log もtmpgsとして存在し、都合がよい、。
下記のファイルを作成し、bootmisc.shの do_start() 内でインクルードする。

作成するファイル /etc/init.d/bootmisc-sub-varlog.inc
内容:

# include by bootmisc.sh
LOGFILES="/var/log/lastlog /var/log/wtmp"
touch $LOGFILES
chmod 664 $LOGFILES
chown root:utmp $LOGFILES
mkdir -p /var/log/fsck
exit 0

補足:/var/log/fsck/に対して、起動時のfsckの結果をsavelogコマンドが遅延書き込みしてくるので、適当なタイミングでディレクトリを作っておけばよい。そうしないと、savelogプロセスがず~~~~と居残ってしまう(ディレクトリが作成された時点で、ログ書き出してsavelogが終了するので、手動でディレクトリ作成してもよい)。
かくいう管理人もつい最近まで気づかず、1号機のプロセスに何か月もsavelogが居残っていたという・・・。

リブート
リブートして内容を再確認する。

manコマンドのキャッシュ廃止

Unix, Linuxでおなじみのmanコマンドはで、一度マニュアルが参照されるとそれをキャッシュしておき(/var/cache/man/)、次回以降も使用する、というような設定になっている。
キャッシュといってもファイルシステム(SDカード)上となるため、これを何とかやめさせて、SDカードの寿命を少しでも伸ばす。
ただし、manコマンドを実行した際のレスポンスが若干悪くなるが、そこは目をつぶる。

$ su
# vi /etc/manpath.config

変更点は下記の通り。

# diff manpath.config.orig manpath.config
66,71c66,71
< MANDB_MAP     /usr/man                /var/cache/man/fsstnd
< MANDB_MAP     /usr/share/man          /var/cache/man
< MANDB_MAP     /usr/local/man          /var/cache/man/oldlocal
< MANDB_MAP     /usr/local/share/man    /var/cache/man/local
< MANDB_MAP     /usr/X11R6/man          /var/cache/man/X11R6
< MANDB_MAP     /opt/man                /var/cache/man/opt
---
> MANDB_MAP     /usr/man
> MANDB_MAP     /usr/share/man
> MANDB_MAP     /usr/local/man
> MANDB_MAP     /usr/local/share/man
> MANDB_MAP     /usr/X11R6/man
> MANDB_MAP     /opt/man

それともう一つ、cronにより1日一回、マニュアルのキャッシュをごそごそしているようなので、これを停止します。

# chmod ugo-x /etc/cron.daily/man-db

.bashrcの設定変更(自動保存ファイル無効化など)

ログアウト時に履歴ファイルを作成しないようにする。

ログアウト時にSDカードへの履歴ファイルの書き込みが発生しないようにする。

対象ファイル

/root/.bashrc
/home/pi/.bashrc
/etc/skel/.bashrc

対象ファイルのどこでもよいので、下記の行を追加する。

unset HISTFILE               # bashの履歴ファイルを作成しない
export LESSHISTFILE=-        # lessの履歴ファイル.lesshstを作成しない

3番目のファイル /etc/skel/.bashrc は、今後ユーザーを新規追加した際にコピーされるデフォルトの設定ファイルである。
今後追加するユーザーについて上記設定を行いたくないのであれば、/etc/skel/.bashrcの設定はしなくてよい。

おまけの設定変更(お好みで)

下記を行う。

  • lsなどのコマンドのカラー化抑止(あまり好きじゃないので)
  • bashの補完用関数の読み込み抑止(不要なので)
$ diff .bashrc.orig .bashrc
75c76
<     alias ls='ls --color=auto'
---
>     #alias ls='ls --color=auto'
79,81c80,82
<     alias grep='grep --color=auto'
<     alias fgrep='fgrep --color=auto'
<     alias egrep='egrep --color=auto'
---
>     #alias grep='grep --color=auto'
>     #alias fgrep='fgrep --color=auto'
>     #alias egrep='egrep --color=auto'
101,103c102,104
< if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
<     . /etc/bash_completion
< fi
---
> #if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
> #    . /etc/bash_completion
> #fi

時刻合わせ

/etc/ntp.conf
いくつかの設定をまとめて変更。

  • /var/lib/ntp/ntp.driftの保存場所を変える。
    (コメントアウト、すなわちこのファイルを作成しないようにしても構わない)
  • タイムサーバーのアドレスを、近所のタイムサーバーに変更する。
    $ su
    # cp ntp.conf ntp.conf.orig
    # vi /etc/ntp.conf
    # diff ntp.conf.orig ntp.conf
    3c3
    < driftfile /var/lib/ntp/ntp.drift
    ---
    > driftfile /var/tmp/ntp.drift
    21,24c21
    < 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
    ---
    > server {近所のタイムサーバーアドレス} maxpoll 14
  • IPv6のエラーメッセージがsyslogへ出力されないようにする。(IPv6を有効にしている場合、この変更は不要)
    37c34
    < restrict -6 default kod notrap nomodify nopeer noquery
    ---
    > #restrict -6 default kod notrap nomodify nopeer noquery
    41c38
    < restrict ::1
    ---
    > #restrict ::1

/etc/fake-hwclock.data
このファイルを生成しないようにする。
デフォルトでは1時間に1回、そのときの時刻を上記のファイルへ出力している。

$ su
# chmod -x /etc/cron.hourly/fake-hwclock
# chkconfig --del fake-hwclock      # システム起動時の実行を抑止(rcS.dから抹消)
fake-hwclock              0:off  1:off  2:off  3:off  4:off  5:off  6:off
# rm /etc/fake-hwclock.data         # 残しておいても問題はないが・・・

補足:
Raspberry Piは電源オフ時には時刻を「忘れて」しまう(電池でバックアップされたリアルタイムクロックはない)。
次回コールドスタート時に、前回の電源オフ時と近い時刻を上記ファイルから読み込んで、とりあえず時刻を初期化するようだ。
起動直後はsyslogの時刻が狂っているが、そのうちntpdが時間を合わせてくれるので、あまり気にしないことにする。

参考:
fake-hwclockパッケージを削除してもよいかもしれない。

# apt-get purge fake-hwclock

/etc/ntp.conf
前述のシステム起動時のfake-hwclockを抑止したので、ntpでの時刻合わせがうまくいかない場合がある。
(リアルタイムクロック無し=起動時の時刻は 1900/01/01 00:00:00 から始まる)
よって、強制的に時刻を合わせるようにntpの起動スクリプトを変更する。

$ su
# cd /etc/init.d
# cp -p ntp ntp.orig
# vi ntp
# diff ntp.orig ntp
60a61
>               /usr/sbin/ntpd -g -q

ログローテーション

/var/lib/logrotate/status
ファイル出力先を/var/tmpへ移動する。

$ cd /etc/cron.daily
$ diff logrotate.orig logrotate
4c4
< /usr/sbin/logrotate /etc/logrotate.conf
---
> /usr/sbin/logrotate --state /var/tmp/logrotate-state /etc/logrotate.conf

以上で基本設定はおしまい。
最後にリブートして設定がうまく反映されているか確認するとよいだろう。
リブートは下記でどうぞ。

$ sudo reboot

また、システムのアップデートは適宜実施する。

# apt-get update
# apt-get upgrade

*1 Raspbian 8 jessie が使えるようになっていますが、このサイトでは2016-03-03現在、未対応
*2 いわゆるRAM DISKのこと

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-04-02 (月) 15:44:24 (233d)