« PlatformIOとArduino(本家)ツールの差分 | トップページ | PlatformIOをRaspberryPi4で動かしてみる(実験) »

2020年10月20日 (火)

headless RaspberryPiインストール方法(v2)

2020/11/7
オーディオ出力のデフォルト変更法として $HOME/.asoundrcの編集によるものを追加した。

2020/11/3
オーディオ出力のデフォルト変更方法と ubuntuで標準でインストールされている RemminaのようなRealVNC-viewerでない VNC-Viewerでアクセスてきる設定方法を追加した。

2020/10/26
オーディオ出力のデフォルトをHDMIから
フォンジャックに切り替える方法を追加した。

2020/10/19+
第2版
旧記事に対して、ブートSD作成ツールが提供されたので、
それのインストール方法などが変更になった。
また、WiFi環境の改善に効果があった
WiFi中継器の利用についての記載を追加した。
あと、VNCの設定方法について追加した。

headless RaspberryPi(v2)

headless RaspberryPi(v2)

概要

headless RaspberryPiインストール方法(v2)
本記事は「headless RaspberryPiインストール方法」を見直しをかけた第2版にあたる。
表示装置を接続しないでPCを運用することをheadlessというが、ここでは、最初のbootからRaspberryPiをheadlessで使う方法についてまとめた。基本的には本家siteのドキュメントにあるとおりだが、それに必要なものを追加した。
なお、ホストPCとしては、ubuntu20.04を想定している。

前記事からインストール例などの一部は割愛したので、必要があれば第1版の記事を参照のこと。

事前準備(clientPC側)

以下のdeamonをインストールする:

sudo apt-get update sudo apt-get install avahi-daemon

sshのポートを開くための設定:

sudo ufw allow ssh

ブートSD作成ツールのインストール(clientPC側)

cd ~/Downloads sudo apt update sudo apt upgrade wget https://downloads.raspberrypi.org/imager/imager_1.4_amd64.deb sudo dpkg -i imager_1.4_amd64.deb

ブートSD作成ツールの実行

1.rasrberryのOSを書き込むSDをSDソケットに指す。 2.「アプリケーションを表示する」アイコンを押する。 そのなかからraspberryアイコンのImagerを探してクリックして起動する。 3.GUIとしては、3つのボタンが表示され、 左から順に[CHOOSE OS],[CHOOSE SDCARD],[WRITE]となっている。 (1)[CHOOSE OS]を押してOSの種類を選択する (2)[CHOOSE SDCARD]を押して書き込むSDのドライブを選択する (3)上の2つの選択にミスがないことを確認したら[WRITE]を押す。 (4)ダウンロードしながら書き込むので時間がかかるが、辛抱強く、メッセージが表示されるまで待つ。 (5)書き込みが終了したら、SDを抜く。 (6)書き込みツールを終了する。

注意:linux(gparted)でFAT32フォーマットしたSDを利用するとブートできないSDになることがあるようなので、新規SDかwindowsで正式なフォーマット・ツールでフォーマットしたSDを使用することを勧める。

boot/rootfsディレクトリのファイル追加/修正

書き込んだSDをいったん取り外し、再度、挿入する。 すると、bootディレクトリとrootfsディレクトリが出現する。

bootディレクトリに対して以下を行なう:
(1)ssh有効化
bootにsshという名前のファイルを作成する。(ファイル内容は空で良い)

(2)wireless設定
bootにwpa_supplicant.confという名前で 以下の内容のファイルを作成する:

wpa_supplicant.conf
(複数のSSIDを設定する例)

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=JP network={ ssid="<Name of your WiFi>" psk="<Password for your WiFi>" priority=1 id_str="<ID1(任意)>" } network={ ssid="<Name of your WiFi>" psk="<Password for your WiFi>" priority=2 id_str="<ID2(任意)>" }

接続するssidの方式はWAPかWPA2であること
(WEPでは接続できないようだ)
また、WiFi中継器を利用する場合、SSIDは一つしか持てないので 一つのSSIDの設定にする。

rootfsディレクトリに対して以下を行なう:
(3)必要があれば、hostnameを変更するために
以下の2つのファイルに記述されているhostnameを
新しいものにエディタで変更(編集)する。
(書き込み権限が必要なので「sudo」を付ける必要がある)

#「raspberrypi」を任意の名前に変更する # USERは自分の環境に合わせる sudo nano /media/USER/rootfs/etc/hostname sudo nano /media/USER/rootfs/etc/hosts

(4)該当SDを取り出す
boot,rootfsをアンマウントする。

Boot

書き込んだSDをRaspberryPiのボードに刺し、電源をオンする。(起動する)
ボードのLEDが点滅し始めて、常灯するまで待つ。

Ping

ホストPCで接続を確認するために
(名前解決に時間がかかるので)
以下のコマンドを成功するまで繰り返す。
ping raspberrypi.local
(rastberrypiはhostnameなので、hostnameを変更した場合 変更したもので置き換える)

出力ログ例:

$ ping raspberrypi.local PING raspberrypi.local (192.168.0.26) 56(84) bytes of data. 64 bytes from 192.168.0.26: icmp_seq=1 ttl=64 time=39.4 ms 64 bytes from 192.168.0.26: icmp_seq=2 ttl=64 time=78.2 ms 64 bytes from 192.168.0.26: icmp_seq=3 ttl=64 time=10.0 ms 64 bytes from 192.168.0.26: icmp_seq=4 ttl=64 time=9.81 ms 64 bytes from 192.168.0.26: icmp_seq=5 ttl=64 time=18.9 ms ^C --- raspberrypi.local ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4005ms rtt min/avg/max/mdev = 9.816/31.306/78.254/25.833 ms

どうしても接続確認ができないようなら「arp -a」を入力して、接続中のPCのIPアドレスを表示させて、 RaspberryPiのIPアドレスを推定する。

Login

接続確認が終わったら以下のコマンドを入力してloginする:
(デフォルトのパスワードはraspberry)

ssh pi@raspberrypi.local または ssh -Y pi@raspberrypi.local (接続後にグラフィクス・アプリを使用する場合)

ログイン中(ログ出力例):

$ uname -a Linux rpi4RED 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux $ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/root 29629308 5962032 22376368 22% / devtmpfs 1827808 0 1827808 0% /dev tmpfs 1959904 0 1959904 0% /dev/shm tmpfs 1959904 16836 1943068 1% /run tmpfs 5120 4 5116 1% /run/lock tmpfs 1959904 0 1959904 0% /sys/fs/cgroup /dev/mmcblk0p1 258095 55202 202894 22% /boot tmpfs 391980 0 391980 0% /run/user/1000 pi@rpi4RED:~ $ $ ls Bookshelf # 他のディレクトリが欠落しているbug? # 以下のコマンドで修復できる mkdir Desktop mkdir Documents mkdir Downloads mkdir Music mkdir Pictures mkdir Public mkdir Templates mkdir Videos #---------------- # ネットワーク関連 $ ifconfig # 有線LAN(eth0)と無線LAN(wlan0)が接続している例 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.13 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::6947:928f:1597:e39a prefixlen 64 scopeid 0x20<link> ether dc:a6:32:71:b9:36 txqueuelen 1000 (Ethernet) RX packets 68034 bytes 97542048 (93.0 MiB) RX errors 0 dropped 1 overruns 0 frame 0 TX packets 119086 bytes 118526890 (113.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 10144 bytes 110736824 (105.6 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10144 bytes 110736824 (105.6 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.18 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::4916:271b:edd7:5686 prefixlen 64 scopeid 0x20<link> ether dc:a6:32:71:b9:37 txqueuelen 1000 (Ethernet) RX packets 46823 bytes 3242821 (3.0 MiB) RX errors 0 dropped 1 overruns 0 frame 0 TX packets 66 bytes 8978 (8.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 $ iwconfig # wlan0が有効になっている例 eth0 no wireless extensions. wlan0 IEEE 802.11 ESSID:"xxxxxxxxxxxx" Mode:Managed Frequency:2.442 GHz Access Point: 00:1D:73:1D:0A:08 Bit Rate=24 Mb/s Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on Link Quality=56/70 Signal level=-54 dBm Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:1 Invalid misc:0 Missed beacon:0 lo no wireless extensions. $ sudo iwlist scan | grep ESSID # 見えているSSIDを表示した例 eth0 Interface doesn't support scanning. ESSID:"2CxxxxxxxxxxxxxxxxxxxxxxxxxxxF3" ESSID:"001xxxxxx08" ESSID:"2CxxxxxxxxxxxxxxxxxxxxxxxxxxxF3" ESSID:"5Dxxxxxxxxxx5E" lo Interface doesn't support scanning. ESSID:"rsxxxxxxxxxxxx2" ESSID:"rsxxxxxxxxxxxx1" # SSIDは伏せ文字にしている

グラフィクス・アプリ起動例

ssh -Y pi@raspberrypi.local geany & sudo apt install scratch scratch & sudo apt install leafpad leafpad &

chromeのインストール

sudo apt install chromium-browser chromium-browser &

node.jsとrubyのインストール

sudo apt install nodejs sudo apt install ruby

C#のインストール

sudo apt install mono-complete mcs --version Mono C# compiler version 5.18.0.240 csharp Mono C# Shell, type "help;" for help Enter statements below. csharp> Environment.OSVersion Unix 4.19.75.0 csharp> Ctrl-D

bluetoothのインストール例

sudo apt install -y pi-bluetooth sudo reboot bluetoothctl Agent registered [bluetooth]# scan on Discovery started #出力例 [CHG] Controller B8:27:EB:43:FE:83 Discovering: yes [NEW] Device 57:80:9B:6B:4C:EC 57-80-9B-6B-4C-EC [NEW] Device 5F:55:F2:80:A7:2B 5F-55-F2-80-A7-2B [NEW] Device CE:EA:67:62:B6:7B Bryton Cadence [CHG] Device 57:80:9B:6B:4C:EC RSSI: -67 [CHG] Device 57:80:9B:6B:4C:EC RSSI: -81 Ctrl-D [bluetooth]# quit pi@raspberrypi:~ $

VNC-serverの設定

VNC-severを使用する場合、
「sudo raspi-config」を実行して 以下の値に設定する:

設定値: ・3 Boot Options B1 Desktop / CLI B4 Desktop Autologin Desktop GUI, automatically logged in as 'pi' user ・5 Interfacing Options P3 VNC ⇒ Enable  ・7 Advanced Options A5 Resolution DMT Mode 85 1280x720 60Hz 16:9    (使用しているモニターのサイズに合わせて7種類から選択する)

設定後、rebootする。
なお、上の設定でなく「Login Desktop GUI」(Autoでない)でも良い。

VNC-severについては、以下の記事を参考した:
【解決】Raspberry Pi4 VNC接続で画面が出ない!!

なお、ホストPC側のRealVNC-viewerは以下のurlからダウンロードできる: https://www.realvnc.com/en/connect/download/viewer/linux/

ダウンロードしたファイルは実行形式なので実行属性を与えて実行する。

headlessといえども、VNCを使用するとGUIのディスクトップが利用できるのは便利である。

また、ubuntuで標準でインストールされているRemminaのような(RealVNC-Viewerでない)VNC-Viewerの場合は このままでの設定では接続できない。そのため、Remminaなどを使用する場合は、以下を実行して設定を UNIX_passwordからVNC_passwordによるログインに変更する。
以下を実行する:

1. Open the /root/.vnc/config.d/vncserver-x11 config file. (sudo nano /root/.vnc/config.d/vncserver-x11 config) 2. Replace Authentication=SystemAuth with Authentication=VncAuth and save the file. 3. In the command line, run sudo vncpasswd -service. This will prompt you to set a password, and will insert it for you in the right config file for VNC Server running in Service Mode. (sudo vncpasswd -service) 4. Restart VNC Server. (sudo reboot)

参照:
VNC (Virtual Network Computing) - Raspberry Pi Documentation

GUIによる設定変更の場合は以下を参照のこと:

http://penguin.tantin.jp/hard/blog/2018-12-25/Raspberry%20Pi%E3%81%ABVNC%E3%81%A7%E6%8E%A5%E7%B6%9A.html blog/2018-12-25/Raspberry PiにVNCで接続 抜粋: 「 https://raspberrypi.stackexchange.com/questions/68838/i-failed-to-remote-connect-to-raspberry-pi-3-from-ubuntu failed to remote connect to Raspberry Pi 3 from Ubuntu このページに書いてあるとおり, Raspberry Piの右上にVNCのアイコンがあるのでそこをクリックして,「Options」をクリックすると設定画面になる. そこの「Security」というところで「Authentication」というところを「VNC Password」にする VNCパスワードを設定しろと言われるので設定する. PC側からRemminaでアクセスするとこのVNC Passwordを聞かれるので入力すると繋がる 」

オーディオ出力のデフォルトをフォンジャックにする

インストール直後はheadlessなのでHDMIが見えていない状態になっているので オーディオ出力のデフォルトはフォンジャックになっている:

$ aplay -l **** List of PLAYBACK Hardware Devices **** card 0: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones] Subdevices: 8/8 Subdevice #0: subdevice #0 Subdevice #1: subdevice #1 Subdevice #2: subdevice #2 Subdevice #3: subdevice #3 Subdevice #4: subdevice #4 Subdevice #5: subdevice #5 Subdevice #6: subdevice #6 Subdevice #7: subdevice #7

ところがVNCなどでdesktop用アプリなどをインストールすると以下に変わる:
(HDMIが有効になり、それがデフォルトになる)

$ aplay -l **** ハードウェアデバイス PLAYBACK のリスト **** カード 0: b1 [bcm2835 HDMI 1], デバイス 0: bcm2835 HDMI 1 [bcm2835 HDMI 1] サブデバイス: 4/4 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3 カード 1: Headphones [bcm2835 Headphones], デバイス 0: bcm2835 Headphones [bcm2835 Headphones] サブデバイス: 4/4 サブデバイス #0: subdevice #0 サブデバイス #1: subdevice #1 サブデバイス #2: subdevice #2 サブデバイス #3: subdevice #3

これを解決するために:
RaspberryPiでUSBスピーカーをデフォルトの音声出力デバイスにする
上のやり方を参考にして、 RaspberryPiでフォンジャックをデフォルトに戻す。
(具体的には、/usr/share/alsa/alsa.confの内容を修正する)
こうすると今までHDMIに流れていて(フォンジャックでは)無音になっていたアプリが正常に鳴るようになる。
実行例:

$ cvlc http://us3.internet-radio.com:8485/ VLC media player 3.0.11 Vetinari (revision 3.0.11-0-gdc0c5ced72) [01597240] vlcpulse audio output error: PulseAudio server connection failure: Connection refused # 上の行でエラーが出ているが正常に音は鳴るようだ [015b43e8] dummy interface: using the dummy interface module... [b2a01dd0] prefetch stream error: unimplemented query (264) in control

オーディオ出力先のデフォルト変更

上でフォンジャックへの変更方法を述べたが、ここでは、もっと汎用的にデフォルトを変更する方法について紹介する。(以下のリンクを参照のこと)

Headless_RaspberryPiでAudio出力のデフォルトを変更する
RaspberryPiでBluetoothAudio(A2DP)を使用する

上の方法は、GUIのVolumeアイコンでデフォルトを変更しているが、 ALSAデバイス限定であれば$HOME/.asoundrcを以下のように修正することでデフォルト変更できる。(bluetooth-audioは対象外)
以下の内容のcard番号「card 1」をデフォルトにしたいデバイスのものに変更する。
$HOME/.asoundrc

pcm.!default { type asym playback.pcm { type plug slave.pcm "output" } capture.pcm { type plug slave.pcm "input" } } pcm.output { type hw card 1 } ctl.!default { type hw card 1 }

カード番号は「aplay -l」を実行すると カード番号と対応しているデバイス名が表示されるので デフォルトにしたいデバイスのカード番号を知ることができる。
(bluetooth-audioの場合、修正内容が異なるので、ここでは対象外としている)

WiFi中継器の利用

以下のような高速WiFi中継器を利用するとraspberryのネットワーク接続の安定性や速度の向上を実現できる。

11n対応無線LAN中継器

入手したものは、有線LAN経由でWiFi接続する機能があるので、WiFiのないraspberryや、WiFiがあっても環境の問題でWiFi接続性が悪い場合、有線LANを利用すると安定性と速度の向上が期待できる。

Rpi4などは、旧モデルよりも有線LANの側道が向上しているせいか、実際に利用した印象では、ネットワーク速度が向上している。なので、WiFiがあるRpi4でも有線LAN経由でWiFi接続したほうが良いと思われる。

すでに設定してあるSSIDを変更せずに中継するので、新規に設定する必要があるのはWiFi中継器だけなので、使い勝手も良い。

参考:
WiFi中継器を使っている場合、親機と子機(中継器)で同じSSIDを使っているので、以下のように同じSSIDが2つ見える。

$ sudo iwlist scan | grep ESSID eth0 Interface doesn't support scanning. タブっているSSID → ESSID:"2CxxxxxxxxxxxxxxxxxxxxxxxxxxxF3" ESSID:"001xxxxxx08" ダブっているSSID → ESSID:"2CxxxxxxxxxxxxxxxxxxxxxxxxxxxF3" ESSID:"5Dxxxxxxxxxx5E" lo Interface doesn't support scanning. ESSID:"rsxxxxxxxxxxxx2" ESSID:"rsxxxxxxxxxxxx1" # SSIDは伏せ文字にしている

また、以下のようにpingを使用して、その出力にWiFi中継器の型番(本件の場合は、wrc-300febk-r)が含まれていれば、中継機能が動作していることを意味する。
# 型番の出現頻度は不明なので、比較的長めに出力しないと分からないかもしれない。

$ ping google.com PING google.com (172.217.175.14) 56(84) bytes of data. 64 bytes from google.com (172.217.175.14): icmp_seq=1 ttl=116 time=19.3 ms 64 bytes from google.com (172.217.175.14): icmp_seq=2 ttl=116 time=40.2 ms <省略> 64 bytes from google.com (172.217.175.14): icmp_seq=10 ttl=117 time=19.6 ms # 以下の行に型番が出現している From wrc-300febk-r.setup (192.168.0.5): icmp_seq=11 Redirect Host(New nexthop: 192.168.0.1 (192.168.0.1)) 64 bytes from google.com (172.217.175.14): icmp_seq=11 ttl=117 time=16.3 ms <省略> ttl=117 time=18.3 ms ^C

接続実績:
以下のモデルの接続を確認した:

Raspberry Pi 1 Model B (有線LAN接続) Raspberry Pi 2 Model B (追加:WiFi_USBdongle) Raspberry Pi 4 Model B (WiFi接続) Raspberry Pi Zero WH (WiFi接続)

DNS Bug?

まれに、DNSが動かなくなる場合がある。そのときは以下の手順で復活する。
(経験的な話になるが、自然に普及したこともある)

sudo nano /etc/network/interfaces # /etc/network/interfacesの末尾に以下の1行を追加する: dns-nameservers 8.8.8.8 8.8.4.4 # rebootする sudo reboot

本問題については以下を参照のこと:
https://raspberrypi.stackexchange.com/questions/4275/dns-resolution-failure
DNS resolution failure

復活の確認は以下のようにpingする。
例:

ping google.com ping nifty.com

Home Directories Bug?

fullイメージのSDで起動した場合、「Raspberry Pi 4 Model B」では、/home/piには以下の状態になっていた。

$ ls Bookshelf

他のボードでは、以下のようなディレクトリができる:

$ ls Desktop Documents Bookshelf Pictures Templates Downloads Music Public Videos

たぶん、「Raspberry Pi 4 Model B」では、初ブート時にディレクトリを作成するスクリプトがエラーになっていると推測する。 空のディレクトリを作っているだけなので、必要があれば、シェルのコマンドでディレクトリを作れば良いだけだと思う。

参照URL

configuration/wireless/headless
configuration/wireless/wireless-cli
remote-access/ssh/unix
How to open ssh port using ufw on Ubuntu/Debian Linux

以上

|

« PlatformIOとArduino(本家)ツールの差分 | トップページ | PlatformIOをRaspberryPi4で動かしてみる(実験) »

linux」カテゴリの記事

RaspberryPi」カテゴリの記事

コメント

この記事へのコメントは終了しました。