Raspberry Pi をサーバーとして利用する際に、まず最初にすること。 なお、このページの内容の一部は、このサイト内の Raspberry Pi/各種設定 以下の内容をincludeしているので、内容が重複(というか同一)となっている。一度に全部読めるように同一ページにまとめた、ということになる。 補足:下記のコマンド実行例で、su コマンドを実行すると実際にはパスワード入力要求のプロンプトが表示されるが、ここでは省略している(suを使う前にsudoを使ってrootのパスワードを設定する)。rootのパスワードを設定せず、sudoで通す方はそれはそれでよい。 目次 †前提、方針 †
ではさっそくやってみる。 ファイルの入手 †OS(Raspbian)のディスクイメージ SDカードへの書き込みツール(Windows用) SDカードへのOS書き込み †いくつか方法があるが、今回は Windows のツールを使用した。 先にダウンロードしたディスクイメージを、同じくダウンロードしたツールを使ってSDカードへ書き込む。 ダウンロードしたディスクイメージはzip形式なので、あらかじめ解凍すること。 使い方は簡単なので省略する。 (稼働中のLinux端末があると簡単なのだが。ブートイメージをddコマンドでSDカードのデバイスに書き込むだけなので。) OSの初回起動 †初回起動時だけはHDMI端子付きモニター(またはVideo-in端子の付いたテレビ)、およびUSBキーボードが必須となる。 SDカード、LANケーブル、HDMIケーブル(またはビデオケーブル)、キーボードを Raspberry Pi 本体にセットし、最後に電源ケーブルを差し込むとブートが開始される。 起動シーケンスの最後に、自動的に raspi-config コマンドの実行画面が表示される。ひとまず、下記の最低限を設定し再起動する。
ここまでやったら、続きは ssh 経由で行うので、ひとまず保存・再起動し、ユーザー pi でログインできるか確認する。 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 でログインし作業続行する。 [ 各種設定 ]
ext4ファイルシステムのジャーナルを廃止 †(2016-03-30追加) SDカードの寿命を伸ばしたい関連 Raspbianのシステムが格納されているファイルシステムは 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 32c32 < #PermitRootLogin prohibit-password --- > PermitRootLogin no デフォルトのprohibit-passwordは、パスワードでのログインは禁止だが公開鍵認証によるログインは可能、の意味。 [ 各種設定 ]
固定IPアドレス †IPアドレスがDHCPでは使いにくいので、固定IPアドレスに変更する。 $ su Password: # cd /etc # cp -p dhcpcd.conf dhcpcd.conf.orig vi dhcpcd.conf 変更点(上記ファイルのどこかに追記すればよい)。無線LANと有線LANの両方のインターフェースに対してIPv4固定アドレスを設定する場合の例。IPv6アドレスはほっとくと勝手にアサインしてくれるのでひとまず放置。 $ diff dhcpcd.conf.orig dhcpcd.conf 49a50,59 > interface wlan0 > static ip_address=192.168.10.80/24 > static routers=192.168.10.1 > staticdomain_name_servers=192.168.10.1 > > interface eth0 > static ip_address=192.168.10.81/24 > static routers=192.168.10.1 > staticdomain_name_servers=192.168.10.1 > 最後にOSを再起動して確認する。(下記は一部伏字あり) $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff inet 192.168.10.80/24 brd 192.168.10.255 scope global noprefixroute wlan0 valid_lft forever preferred_lft forever inet6 xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 2591918sec preferred_lft 604718sec inet6 xxxx::xxxx:xxxx:xxxx/64 scope link valid_lft forever preferred_lft forever (Raspbian busterより前、以前は/etc/network/interfacesを変えていたがやめた) [ 各種設定 ]
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 コマンドを使う。 $ su # dphys-swapfile swapoff # chkconfig dphys-swapfile off # rm /var/swap 最後のrmでは、swapの残骸を削除している。swapoffにしてからでないと消せない。 [ 各種設定 ]
log,tmpのオンメモリ(tmpfs)化 †概要 †SDカードへの書き込みをなるべく減らすため、下記ディレクトリ:
をtmpfs*2として構成する。tmpfsとすることで多かれ少なかれメインメモリを消費するため、ログの保存期間を短くしメモリを圧迫しないようにする。 上記ディレクトリが揮発性となることで、その下に所属するファイル・ディレクトリが再起動のたびにクリアされてしまう。特に、一部のサービス・アプリケーションは/var/logにあらかじめファイル・ディレクトリが存在していないとうまく動かないものがあるため、ブートシーケンスの中で必要なものを作成するようにする。 では早速設定を開始する。 作業内容 †設定変更するファイル、内容、手順等は下記の通り。
以下、順に説明する。 /etc/fstab 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の手動マウント $ 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の手動マウント $ 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 作成するファイル /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が終了するので、手動でディレクトリ作成してもよい)。 リブート [ 各種設定 ]
manコマンドのキャッシュ廃止 †Unix, Linuxでおなじみのmanコマンドはで、一度マニュアルが参照されるとそれをキャッシュしておき(/var/cache/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 2021-01-03追記 systemdが稼働している環境の場合、man-db.service, man-db.timerが定期的にごにょごにょしているようなので、 これも停止させてしまいます。 # systemctl stop man-db.timer # systemctl disable man-db.timer [ 各種設定 ]
.bashrcの設定変更(自動保存ファイル無効化など) †ログアウト時に履歴ファイルを作成しないようにする。 †ログアウト時にSDカードへの履歴ファイルの書き込みが発生しないようにする。 対象ファイル /root/.bashrc /home/pi/.bashrc /etc/skel/.bashrc 対象ファイルのどこでもよいので、下記の行を追加する。 unset HISTFILE # bashの履歴ファイルを作成しない export LESSHISTFILE=- # lessの履歴ファイル.lesshstを作成しない 3番目のファイル /etc/skel/.bashrc は、今後ユーザーを新規追加した際にコピーされるデフォルトの設定ファイルである。 おまけの設定変更(お好みで) †下記を行う。
$ 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 [ 各種設定 ]
時刻合わせ †systemdなLinux †/etc/systemd/timesyncd.conf NTP= にNTPサーバー名またはIPアドレスを記入して下記コマンドを実行します。 # systemctl restart systemd-timesyncd うまくいっているかどうかの確認は下記。 # systemctl status systemd-timesyncd systemdじゃないLinux †/etc/ntp.conf
/etc/fake-hwclock.data $ 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 # 残しておいても問題はないが・・・ 補足: 参考: # apt-get purge fake-hwclock /etc/ntp.conf $ 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 $ 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 |