猫の手なら貸せる

いろいろ共有できたらいいなとおもってます

RaspberryPi初期設定

本当に死ぬほどよく忘れるのでAnsibleにでもすべきなんですけど、面倒臭がってやっていないのでメモ。数多の人がやっているのでお好みで。

以前RAIDの初期設定に書いた内容と結構重複します。随時更新していきます。

起動前の初期設定

Raspbianイメージの書き込み

SDカードにRaspbian Buster Liteを書き込みます。以下からダウンロードします。

www.raspberrypi.org

書き込みにはbalenaEtcherを利用。

www.balena.io

ネットワーク・SSHの有効化

SSHを有効にします。balenaEtcher書き込み後アンマウントされたSDカードを再接続し、焼き終わったSDカードのbootパーティションsshというファイルを配置します。

% cd /Volumes/boot
boot % touch ssh
boot % ls | grep ssh
ssh*

ラズパイにWifi設定を入れます。このためにディスプレイやらマウスやら準備するのも面倒なので初めから無線で接続しましょう。

wpa_supplicant.confをbootに作成します。SSIDとパスワードの設定が書かれているだけの設定ファイルですが、暗号化しないと危なそうなので、以下のサイトで作成しました。
  mascii.github.io

作成したwpa_supplicant.confをSDカードの/bootパーティションにコピーします。

SDカードをラズパイに差し込んで起動。ここからターミナル上で操作します。

起動後の初期設定

SSH接続

ターミナル上で次のコマンドを入力

~ % ssh pi@raspberrypi.local

初期のパスワードはraspberryが設定されています。

IPアドレスの設定

接続が完了したら、IPアドレスの設定をします。有線・無線同時に設定することも可能です。

static routersルーターIPアドレスstatic ip_addressに固定したいIPアドレスを自由に設定します。

~ $ sudo vi /etc/dhcpcd.conf
#有線接続の場合
interface eth0
  static ip_address=192.168.3.11/24
  static routers=192.168.3.1
#無線接続の場合
interface wlan0
  ssid (wpa_supplicant.confで設定したSSID)
    static ip_address=192.168.8.11/24
    static routers=192.168.8.1

ロケールの設定

システムの設定を行います。以下のコマンドを入力するとCUIコンフィグ設定画面が表示されます。

~ $ sudo raspi-config

英語のままでも良いのですが、日本語化できるので日本語化しましょう。4 Localisation OptionsからI1 Change Localeを選択し、ja_JP.UTF-8 UTF-8までスクロールします。

図を見て分かるようにj列なので結構下の方。

f:id:nkhnd:20200505131925p:plain

メインの言語選択でも同様に日本語を選択。

f:id:nkhnd:20200505151714p:plain

同様にタイムゾーンの設定。同様に4 Localisation OptionsからI2 Change Timezoneを選択しAsiaTokyoを選択。

f:id:nkhnd:20200505151807p:plain

Wifiのlocationも一応設定しました。4 Localisation OptionsからI4 Change Wi-fi Countryを選択、JP Japanを選択。

その他の設定

初期状態だとホスト名がraspberrypi.localと長いので編集します。ターミナルでも表示されるのでわかりやすいものをお勧めします。 2 Network OptionsN1 Hostnameを選択し、ホストネームを設定します。

f:id:nkhnd:20200505152010p:plain

Raspi-Configの確定

設定が完了したら、最初の画面で<Finish>を選択すると、再起動が行われ設定が反映されます。

再起動を促されなかった場合は、自分で再起動します。

~ $ sudo shutdown -r now

再起動されるとssh接続が切断されます。再起動完了後の接続はpi@(設定したホスト名).localで接続可能です。

Swapの無効化

SDカードの書き込み回数を消費してしまうので、Swapを無効化します。

sudo swapoff --all
sudo systemctl stop dphys-swapfile.service
sudo systemctl disable dphys-swapfile.service
sudo apt remove --purge dphys-swapfile
sudo rm -f /var/swap

参考:
www.angelcurio.com
curecode.jp

ファームウェアアップデート

ファームウェアをアップデートします。RaspberryPiではaptまたはapt-getでアップデートが可能です。

~ $ sudo su -
~ # apt update -y && apt upgrade -y && apt autoremove -y

デベロッパー向けのアップデートもあり、いろいろなサイトで紹介されていますが、私は安定版を使うことにします。

ユーザの設定

piユーザをそのままにして置くのはセキュリティ的に危険です。sudoグループに所属しているにもかかわらず初期パスワードは公表されているからです。

と言っても、多くの人が記述するように「piユーザを消すこと」には反対です。

RaspberryPiの全てを知っている訳ではないため、消したことによる障害が予測できないためです。

jyn.jp

ですので、piユーザの変わりを用意し、piユーザからsudoを剥奪、piユーザの名称とパスワードを変更してあげます。

Piユーザの代わりを設定

初めにpiの所有グループを確認

~ $ id pi
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),20(dialout),24(cdrom),27(sudo),29(audio),44(video),46(plugdev),60(games),100(users),105(input),109(netdev),999(spi),998(i2c),997(gpio)

sudoグループは言わずもなが、admグループは一部の/var/logの閲覧、videoグループはvcgencmd measure_tempコマンドを出力するために必要です。他に必要なグループがあればここで確認しておきます。

必要なグループに所属するユーザを作成します。ここではadminユーザを例に作成します。

~ $ sudo useradd -m admin
~ $ sudo passwd admin
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正しく更新されました
~ $ sudo gpasswd -a admin sudo
ユーザ admin をグループ sudo に追加
~ $ sudo gpasswd -a admin video
ユーザ admin をグループ video に追加
~ $ sudo gpasswd -a admin adm
ユーザ admin をグループ adm に追加

これでひとまずpiユーザの代わりができました。

Piユーザを編集

一度ログアウトし、再度作成したユーザから接続しなおします。

~ $ exit
~ % ssh admin@rpi.local
~ $ id
uid=1001(admin) gid=1001(admin) groups=1001(admin),27(sudo)
~ $ sudo gpasswd -d pi sudo
ユーザ pi をグループ sudo から削除
~ $ id pi | grep sudo
~ $

これでpiユーザはsudoが使用できなくなりました。次にPiユーザの名称変更・パスワード設定を行います。

~ $ sudo usermod -l (新しいユーザ名) pi
~ $ sudo passwd (新しいユーザ名)
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正しく更新されました

後始末

piユーザにはsudo後一定時間パスワードを聞かれない特殊な設定がされているので、これを削除します。

~ $ sudo rm /etc/sudoers.d/010_pi-nopasswd 
~ $ ls -al /etc/sudoers.d/
合計 20
drwxr-xr-x  2 root root 4096  5月  5 14:54 .
drwxr-xr-x 79 root root 4096  5月  5 14:50 ..
-r--r-----  1 root root   36  4月 29  2019 010_at-export
-r--r-----  1 root root  211  1月 13 20:59 010_proxy
-r--r-----  1 root root  958  2月  2 16:41 README

使いやすくする設定

ここら辺は各個人の問題なので設定は任意です。

新しく作成したユーザをより使いやすくしておきましょう。
.vimrcを作成し、set numberオプションをデフォルトでONにしておきます。

~ $ echo "setnumber" >> .vimrc

これでviコマンドで起動するエディタは行番号が振られるようになります。

sudoした場合に行番号をふりたい場合はsudo su -でrootユーザのホームディレクトリで同じ作業をします。

.bashrcも編集しておきます。PS1の\wを大文字の\Wに(カレントディレクトリの表示を変更)aliasのll(ls -alの短縮)とrmコマンド時に確認を行うようにします。

~ $ vi .bashrc
(中略)...
     60     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\W \$\[\033[00m\] '
(中略)...
     89 
     90 # some more ls aliases
     91 alias ll='ls -l'
     92 #alias la='ls -A'
     93 #alias l='ls -CF'
     94 alias rm='rm -i'
     95 
(中略)...

SSHの公開鍵ログイン設定

パスワードログインより安心な公開鍵認証を設定します。

公開鍵の作成・登録

この操作はクライアントPCから行います。SSHしているMacbookなどからです。

~ % ssh-keygen -t ed25519 -C ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/nkmm/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_ed25519.
Your public key has been saved in id_ed25519.pub.
The key fingerprint is:
SHA256:nDcDTl0/x/4zJao5HLYd5ULkzI95jxNJhB6tP0III/o 
The key's randomart image is:
+--[ED25519 256]--+
|            .o   |
|      . o. .+.o. |
|     . .oo.B +o o|
|    .  + o. O o+ |
|     .  S +o O..o|
|      E  .oo*.O.o|
|         o +.= B.|
|          +o. o +|
|          o.   . |
+----[SHA256]-----+

キーを発行したら.pubを表示し、リモートマシン(ラズパイ)に登録します。

~ % cat nkcluster.pub
ssh-ed25519 ***************************************************************
~ % ssh rpi@rpi.local
rpi@rpi.local's password: 
(リモートマシンへログイン)
~ $ mkdir .ssh
~ $ echo "ssh-ed25519 ***************************************************************" >> .ssh/authorized_keys
~ $ sudo systemctl restart sshd
[sudo] admin のパスワード:
~ $

sshdサービスを再起動し準備完了です。公開鍵でログインできるかをチェックします。

~ $ exit
ログアウト
Connection to rpi.local closed.
~ % ssh -i .ssh/id_ed25519 rpi@rpi.local
(ログイン)
~ $

パスワードを聞かれずログインできれば公開鍵認証は成功です。

パスワードログインを停止

公開鍵認証を設定したため、パスワード認証でのログインを停止します。

sudoグループのユーザでログインしsshd_configを修正します。PermitRootLoginPasswordAuthenticationPermitEmptyPasswordnoに設定します。

~ $ sudo vi /etc/ssh/sshd_config
(中略)
     31 #LoginGraceTime 2m
     32 PermitRootLogin no
     33 #StrictModes yes
(中略)
     55 # To disable tunneled clear text passwords, change to no here!
     56 PasswordAuthentication no
     57 PermitEmptyPasswords no

sshdを再起動すると、パスワード認証が無効になります。

~ $ sudo systemctl restart sshd

ufwの導入

iptablesを直接制御できる高度なエンジニアではないので、セキュリティ対策にファイヤウォールを導入します。

注意*
kubernetesを利用する場合は初期の段階では導入しないでください。ちょっと面倒くさいことになります、なりました(復旧済み)

~ $ sudo su -
~ # apt-get install ufw

~ # systemctl start ufw
~ # systemctl enable ufw
~ # ufw status verbose
Status: inactive

systemctlから起動しただけではactiveにはならない様子。危ない危ない。

ufwは以下のサイトを参考に設定しました。

qiita.com

私も設定内容を載せておきますが、あくまで参考程度にしてください。 先にssh用のポートを開通してからactiveに設定することにします。

~ # ufw allow from 192.168.3.0/24 to any port 22
Rules updated
~ # ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
~ # ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22                         ALLOW IN    192.168.3.0/24    

ここまで表示できたら、他のターミナルからログインできることを確認します。ログインできればひとまず安心です。

本体の設定

LEDランプの設定

電源ランプが常に赤点灯していて、shutdownコマンド入力後に電源が付いているか分かりません。

各種サイト見て/boot/config.txtを操作するも、仕様が変わったためLEDを消すことができなかったので、起動時にLEDを制御する方向で解決しました。

/etc/rc.localのexit 0より上に以下を追記します。

echo 0 > /sys/class/leds/led1/brightness

これで赤LEDは 起動時OFF・shutdown時にON になるようになります。

また、緑LEDは通常SDカードへ書き込みを行なっている際点滅しますが、以下の設定を/boot/config.txtに記述すると、起動中は常にONになります。

### どこに書いても良い
dtparam=act_led_trigger=default-on

赤LEDを操作する/boot/config.txtの設定は無効化されている様子。
(221-222:As for act_led_*, but using the PWR LED. Not available on Model A/B boards. とのこと。以下ファームウェア
github.com

これで幾分わかりやすくなりました。

CPU温度制限

85度で動作停止するとのことで、80度に達するとCPUがクロックを制限するらしいですが、80度に達する時点でいろいろ危ういので上限温度を下げます。

/boot/config.txtの最後に追加。

temp_limit=75

qiita.com

参考にしたサイト

jyn.jp

qiita.com

つまづいたことのある問題

初めのSSHができない

sshファイルおよびwpa_supplicant.confを正しく作成してからラズパイを起動したかを確認します。

いずれかを用意し忘れたことに後から気がついて「ラズパイを強制停止→bootにファイルを追加→ラズパイを起動」は無効です。

詳しく調べた訳ではありませんが、初回起動時以外でboot内のsshファイルとwpa_supplicantを確認しないみたいです。balenaEtcherの書き込みからやり直します。

公開鍵認証でログインできない

初期状態であれば記載の手順で問題なく接続できるはずですが、permission deniedが表示される場合、次の内容を確認すべきです。

初期設定にかかわらず公開鍵認証でログインできない場合は虱潰し一つずつ設定が間違っていないかなどを確認しなければなりません。

ここでは解決法の説明は割愛します。