2020年に書いたRaspberry pi 4構築手順の続編.今回はラズパイ4で8GB版が発売され、ubuntuがraspberry piに正式対応したので、ラズパイを本格的なサーバーとして運用すべくラズパイ4(8GB)にubuntuを設定します.構築しながら書いているので、読みにくかったり、順番が前後する箇所があります.
注意:ここに書かれている情報は2021年03月執筆時点での情報です.
この記事はDockerをラズパイで動かそうシリーズ(?)の一つです
前提条件
- Raspberry pi 4 Model B 8GB RAM
- Ubuntu Server 20.04.2 LTS
- リモート接続元
- macOS Big Sur(V11.2.2)
ラズパイにOSをインストールする
イメージ書き込みツール「Raspberry Pi Imager」を使用します.まず、SDカードを差し込んでイメージを書き込みます.
-
ダウンロードページに行きインストーラーをダウンロードします
- ダウンロードしたインストーラーを開いてアプリケーションフォルダにインストール
- 好きなOSを選択します。今回は64bitのUbuntuサーバーを書き込みます
- 書き込むSDカードを選び
- 最後に「WRITE」ボタンを押すとSDカードへの書き込みが開始されます。書き込みが終わるとOSイメージのSDカード作成は完了です
あとはSDカードをラズパイにさして電源を入れれば起動します.
ubuntuに初期設定されているユーザーは以下の通りです。
user: ubuntu
Password: ubuntu
パスワード変更を要求されるので変更しましょう.
参考リンク
- Raspberry Piに公式のイメージ書き込みツール「Raspberry Pi Imager」がリリースされてセットアップが超便利に #RaspberryPi | DevelopersIO
- Raspberry Pi 4でUbuntuデスクトップを動かして遊ぶ - Qiita
キーボード設定
以降は、raspberry pi
を直接ディスプレイに表示して操作。US配列を使用している場合以下の設定は不要.
sudo dpkg-reconfigure keyboard-configuration
- 以上のコマンドを実行
- 「Generic 105-key PC (intl.)」を選択
- 「Japanese」を選択
- 「Japanese」を選択
- 「The default for the keyboard layout」を選択
- 「No compose key」を選択で終了
参考リンク
LAN設定/固定IP化
ip a
とコマンドを入力してアダプターを確認する。私のラズパイでは無線LANアダプターはwlan0
で有線はeth0
だった.
Ubuntuではネット接続の設定にはNetplan
を利用する.デフォルトでは/etc/netplan/50-cloud-init.yaml
に設定ファイルがある.
/etc/netplan/99_config.yaml
を作成し例えば以下のように設定する.wlan0
の部分は無線LANアダプターの設定により変わる.例では有線も固定IPを振っている.gateway4
にはルーターのIP(大抵192.168.0.1
)を設定し、nameservers
にはDNSサーバーを設定する.
access-points項目でSSID名とpasswordを設定(※SSID-HOGEHOGEとパスワードのXXXXXXXXXは環境に合わせて適時設定).
sudo touch /etc/netplan/99_config.yaml
sudo vi /etc/netplan/99_config.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: false
dhcp6: false
addresses:
- 192.168.0.YYY/24
gateway4: 192.168.0.XXX
nameservers:
addresses: [192.168.0.XXX, 8.8.8.8, 8.8.4.4]
wifis:
wlan0:
dhcp4: false
dhcp6: false
addresses:
- 192.168.0.YYY/24
gateway4: 192.168.0.XXX
nameservers:
addresses: [192.168.0.XXX, 8.8.8.8, 8.8.4.4]
access-points:
"SSID-HOGEHOGE":
password: "XXXXXXXXX"
上記を保存後変更を適用
sudo netplan apply
ip a
コマンドを実行して固定IPが割り振られているか確認する
$ ip a
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.0.XX/24 brd 192.168.0.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
renderer
の箇所をNetworkManager
にしたい場合は事前にnetwork-manager
をインストールしておく。
apt install network-manager
参考リンク
- Ubuntu 20.04 LTSで固定IPアドレスの設定 - Qiita
- Network - Configuration | Ubuntu
- Raspberry Pi3 + Ubuntu Server 19.10のWi-Fi設定 | Field Note
うまくいかなかった場合
sudo netplan --debug try
でデバッグ。
Job for netplan-wpa-wlan0.service canceled.
Traceback (most recent call last):
File "/usr/share/netplan/netplan/cli/commands/try_command.py", line 84, in command_try
NetplanApply().command_apply(run_generate=True, sync=True, exit_on_error=False)
File "/usr/share/netplan/netplan/cli/commands/apply.py", line 160, in command_apply
utils.systemctl_networkd('stop', sync=sync, extra_services=wpa_services)
File "/usr/share/netplan/netplan/cli/utils.py", line 125, in systemctl_networkd
subprocess.check_call(command)
File "/usr/lib/python3.8/subprocess.py", line 364, in check_call
raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['systemctl', 'stop', 'systemd-networkd.service', 'netplan-wpa-*.service']' returned non-zero exit status 1.
それでも接続に失敗する場合はGUI上で設定する(GUIインストール手順は後述).私の場合はWi-Fi設定がどうしてもうまくいかなった.
ssh有効化
ラズパイをインターネットに接続した状態で以下のコマンドを実行してsshを有効化するが、なぜか失敗する.
$ sudo apt -y install openssh-server #openssh-serverを入れていない場合は実行
$ sudo apt update #インストール可能なパッケージの一覧を更新
$ sudo apt upgrade #インストール済みのパッケージ更新をおこなう
$ sudo systemctl start ssh #ssh起動
sshプロセスが起動しないので、debugのため/etc/default/ssh
を以下のように編集. 参照サイト.
SSHD_OPTS=-ddd
再度sudo systemctl start ssh
を実行してjournalctl -xe
でログを確認すると以下のログが.
Mar 04 18:37:55 ubuntu sudo[1979]: pam_unix(sudo:auth): Couldn't open /etc/securetty: No such file or directory
とりあえず、/usr/share/doc/util-linux/examples/securetty
からコピーしてくる。
sudo cp /usr/share/doc/util-linux/examples/securetty /etc/securetty
なお下記のサイトを参考にした
- Couldn't open /etc/securetty - Qiita
- security - Ubuntu 20.04 and 20.10, /etc/securetty: No such file or directory - Ask Ubuntu
それでも同じエラーが出るのでopenssh-server
を再インストールする.解決(おそらくファイルが壊れていた?)参照
sudo apt-get purge openssh-server
sudo apt-get install openssh-server
service ssh start #ssh起動
systemctl status ssh #ssh起動確認
リモート接続元からssh ubuntu@192.168.0.XXX
で接続できるか確認。これ以降はリモートでラズパイを操作可能。
参考リンク
Ubuntu 20.04 LTS : OpenSSH : パスワード認証 : Server World
デスクトップ環境の導入
ごく稀にデスクトップ環境が欲しくなるので、導入しておく.今回は無線LANの設定がうまくいかなかったので、GUI上でWiFi設定を行うために行った.
まずはインストール可能なパッケージの一覧を更新
sudo apt-get update
デスクトップ環境のインストール.気長に待ちましょう.
sudo apt-get -y install ubuntu-desktop
インストールが終わったら再起動してGUIが起動しているか確認します。
sudo shutdown -r now
参考
リモートデスクトップ接続
二つの方法を示します.TigerVNCを使ったリモートデスクトップ
の場合はラズパイをsshやコマンドラインのみで操作したい場合に有効です.UbuntuのGUI画面上から画面共有を有効にする
の場合はラズパイ起動時になんらかのディスプレイに出力していた場合に使用できます.接続が安定しているのは後者ですが、そもそもラズパイをサーバー用途で使用する場合は前者のケースが多いでしょう.
TigerVNCを使ったリモートデスクトップ
VNCサーバーをインストールします.tigervnc
を使用します.
sudo apt -y install tigervnc-standalone-server tigervnc-xorg-extension tigervnc-viewer
vncを許可するユーザでログインします.
su <<ユーザー名>>
VNC パスワード設定を行います,
$ vncpasswd
Password:
Verify:
Would you like to enter a view-only password (y/n)? n
VNCサーバーが起動するか確認.確認ができたら停止します.UbuntuをGUIモードで起動した場合はvncserver :1
が既に使用されている場合があるので、ラズパイからHDMIなどの映像出力端子を抜いて再起動してください.
$ vncserver :1
New 'linux:1 (ubuntu)' desktop at :1 on machine linux
Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/ubuntu/.vnc/linux:1.log
Use xtigervncviewer -SecurityTypes VncAuth -passwd /home/ubuntu/.vnc/passwd :1 to connect to the VNC server.
$ vncserver -kill :1
Killing Xtigervnc process ID 2658... success!
設定ファイルを作成します.使用できるデスクトップ環境(gnome-session
)の部分は/usr/share/xsessions/
で確認できる.
#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
dbus-launch --exit-with-session gnome-session &
再びVNCサーバーを起動.ラズパイで起動したい場合はLD_PRELOAD=/lib/aarch64-linux-gnu/libgcc_s.so.1
を付加する必要がある.関連イシュー.
# ディスプレイ番号 [1], 解像度 [800x600] で起動
$ LD_PRELOAD=/lib/aarch64-linux-gnu/libgcc_s.so.1 vncserver :1 -geometry 800x600 -localhost no
Macの場合プリインストールされているアプリで画面共有が可能.tigervnc
の場合デフォルトでは590[ディスプレイ番号]
のポートが空いているので、そのポートに接続する.
#5901ポートが空いているか確認
$ ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 5 0.0.0.0:5901 0.0.0.0:*
vncserverをまとめて消したい場合は以下のコマンドを実行
vncserver -kill :*
参考サイト
- Ubuntu 20.04 LTS : VNC サーバーの設定 : Server World
- Ubuntu18.04 LTS GNOME環境でVNCサーバーを立てる - Qiita
- Install VNC Server with Gnome display on Ubuntu 18.04 - Teknotut
UbuntuのGUI画面上から画面共有を有効にする.
右上のメニューから[Settings]を選んだのち[Sharing]を選び.[Screen Sharing]を有効化します.一応パスワードも設定しておきます.
リモート接続元からVNCクライアントを使用して接続すると接続エラーが発生する。これはUbuntuのVNCサーバーが暗号化通信を要求しているにもかかわらず、WinやMacのVNCクライアントが暗号化通信を使っていないのが原因らしい.なので、ターミナルから以下のコマンドを実行して暗号化通信を無効化する
sudo gsettings set org.gnome.Vino require-encryption false
(process:2734): dconf-WARNING **: 08:20:32.021: failed to commit changes to dconf: Cannot autolaunch D-Bus without X11 $DISPLAY
設定を確認.設定が無効化になっていないか、上のようにWarnningが出ていれば設定反映に失敗しているので、DISPLAY=:0
を付加して再設定.VNCクライアントから接続できるか確認.
$ gsettings list-recursively org.gnome.Vino
$ DISPLAY=:0 gsettings set org.gnome.Vino require-encryption false
$ sudo gsettings set org.gnome.Vino require-encryption false
普段デスクトップ環境は使わないので無効化したい場合は以下のコマンドを実行。参考
sudo systemctl set-default multi-user.target #デスクトップ環境を無効化したい場合
sudo systemctl set-default graphical.target #デスクトップ環境を有効化したい
以後、リモートデスクトップ接続したい場合はssh接続したのちVNCを起動する
参考サイト
- 【Ubuntu 20.04/18.04 Desktop】WinやMacパソコンからVNCでリモート接続し画面共有する | The modern stone age.
- MacからUbuntu18.04へのリモート接続設定備忘録(UFW設定方法付き) - Qiita
パッケージ最新化
定期的に以下のコマンドを実行してパッケージを最新化
$ sudo apt update #インストール可能なパッケージの一覧を更新
$ sudo apt upgrade #インストール済みのパッケージ更新をおこなう
$ sudo apt install update-manager #初回のみ実行
以下のように新しいバージョンが出ていなければ以下の結果が表示される.
ubuntu@ubuntu:~$ sudo do-release-upgrade
[sudo] password for ubuntu:
Checking for a new Ubuntu release
There is no development version of an LTS available.
To upgrade to the latest non-LTS development release
set Prompt=normal in /etc/update-manager/release-upgrades.
参考サイト
ラズパイにSSH接続(鍵認証)
sshのログイン方法を公開鍵認証にする。
- ssh接続元で鍵生成をする
ssh-keygen -t rsa
- 一旦、ラズパイ(ssh接続先)に
ssh
接続した後。ホームディレクトリ(~/
)で隠しディレクトリ.ssh
等々の作成を行う。
# ログイン
$ ssh hoge_user@hogehoge.hoge.com
$ ls #.sshフォルダとauthorized_keysが存在するか確認
# フォルダとファイルを作る(既に存在している場合は実行しなくても可)
$ mkdir .ssh
$ touch .ssh/authorized_keys
- ssh接続元の公開鍵(デフォルトだと
id_rsa.pub
)を転送。
$ scp ~/.ssh/id_rsa.pub pi@192.168.nnn.nnn:~/.ssh
- ssh接続先の権限設定。公開鍵を
authorized_keys
に登録。
# 権限の設定。個々を間違えると、公開鍵認証でログイン出来ないので注意
$ sudo chmod 700 .ssh
$ cat ~/.ssh/id_rsa.pub >> .ssh/authorized_keys # 公開鍵の内容を追加。
$ sudo chmod 600 .ssh/authorized_keys
$ rm ~/.ssh/id_rsa.pub # SCPした公開鍵を削除削除
-
/etc/ssh/sshd_config
を変更してsshの各種設定を行う。以下の各種設定は万が一攻撃者がきても簡単に侵入させないようにするため。
# port番号設定
Port nnnnn
# rootログインの禁止
PermitRootLogin no
# 鍵認証を有効化
PubkeyAuthentication yes
# パスワード認証を無効化
PasswordAuthentication no
- sshサーバーを再起動
$ sudo systemctl restart ssh
- 接続の確認
$ ssh -i .ssh/[非公開鍵] -p [port番号] pi@nnn.nnn.nnn.nnn
参考サイト
ファイアウォール設定
ubuntuにはufw
がプリインストールされていますが、有効になっていないので有効化しておきます.リモートデスクトップやsshのポートを閉じないように気をつけてください.
$ sudo apt upgrade ufw # ufwのアップデート
$ sudo ufw allow 99 # ポートの開放
$ sudo ufw default deny # 許可されたポート以外を閉じる
$ sudo ufw enable # ufwの有効化
もう少し細かく設定したい場合はufwコマンドの使い方を参照。
スワップを無効にする
スワップ領域を確認。Ubuntuではスワップ領域の設定がされていない
$ free -h
total used free shared buff/cache available
Mem: 7.6Gi 744Mi 6.0Gi 13Mi 909Mi 6.8Gi
Swap: 0B 0B 0B
不要パッケージの削除
不要なパッケージを消します.Ubuntuデスクトップを入れた場合、Libre Office、ThunderbirdとMahjonggなどが入っているので必要なら消します.
$ sudo apt remove --purge libreoffice* #Libre Officeを消す
$ sudo apt clean
$ sudo apt autoremove
ロケール設定
この記事の内容を参考にして設定変更
timezoneの変更
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl | grep Time #確認
Time zone: Asia/Tokyo (JST, +0900)
keymap変更
$ sudo localectl set-keymap jp106
$ localectl #確認
System Locale: LANG=C.UTF-8
VC Keymap: jp106
X11 Layout: jp
X11 Model: jp106
X11 Options: terminate:ctrl_alt_bksp
PiJuice
公式レポジトリにインストール方法が書かれていたので、それを元にインストール
#!/bin/bash
cd $HOME
sudo apt update
sudo apt install -y python3-smbus python3-pip python3-stdeb dh-systemd debhelper fakeroot python3-all dh-python
sudo pip3 install stem stdeb3
sudo git clone https://github.com/PiSupply/PiJuice.git
cd $HOME/PiJuice/Software/Source/Setuid-Wrapper
sudo ./build-setuid-progs.sh
sudo cp p* $HOME/PiJuice/Software/Source/bin
cd $HOME/PiJuice/Software/Source/
sudo ./pckg-pijuice.sh
sudo cp $HOME/PiJuice/Software/Source/deb_dist_base/pi*.deb $HOME
sudo cp $HOME/PiJuice/Software/Source/deb_dist_gui/pi*.deb $HOME
cd $HOME
sudo rm -rf PiJuice
- 上記スクリプトを実行
- ローカルにコンパイルした
pijuice-base
をインストール:cd $HOME
sudo apt install /home/ubuntu/pijuice-base_1.6_all.deb
-
注意:この手順を実行すると私の環境ではUbuntuがGUI起動に失敗します。 ローカルにコンパイルした
pijuice-gui
をインストール:cd $HOME
sudo apt install /home/ubuntu/pijuice-gui_1.6_all.deb
- 壊れたパッケージを修正する:
sudo apt --fix-broken install
- 再起動し、デスクトップ上で
PiJuice CLI
かPiJUICE_CLI
を実行。pijuice_cli
実行時はPiJuiceとラズパイが繋がっていること:sudo reboot
再起動後右記実行:sudo pijuice_cli
かsudo pijuice_gui
アンインストールする場合はsudo apt remove --purge pijuice-gui
とsudo apt remove --purge pijuice-base
今のところpi
ユーザーかroot
ユーザーでないとpijuice_cli
は実行できない.関連イシュー
最後に
お疲れ様です.これでラズパイで遊ぶための必要な初期設定は完了です.
もしまだ気力があればUbuntuでdocker動かす手順をまとめてみます.
気力が残っていたので書きました.