Raspberry Pi

提供: ArchWiki
2019年10月12日 (土) 17:41時点におけるKeita (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

Wikipedia より:

"Raspberry Pi はクレジットカードサイズのシングルボードコンピュータのシリーズである。イギリスのラズベリーパイ財団によって開発されており、学校で基本的なコンピュータ科学の教育を促進することを意図している。"

オリジナルモデルは Broadcom SoC BCM2835 (ARM11 マイクロアーキテクチャ) を使用していましたが、ラズベリーパイ財団は最近になってニューモデルの "Raspberry Pi 2" をリリースしました。RasPi 2 には BCM2836 SoC (クアッドコアの ARM Cortex A7 アーキテクチャ) が搭載されています。2016年2月には、BCM2837 SoC (クアッドコアの ARM Cortex-A53 アーキテクチャ) を搭載して WiFi と Bluetooth が組み込まれた Pi 3 が発売されました。2019年6月には、BCM2711 SoC(クアッドコアの ARM Cortex-A72 アーキテクチャ)を搭載し、USB3.0、Bluetooth5.0、ギガビット・イーサネット、4k出力(4k60Hz×1または4k30Hz×2)に対応したmicro-HDMIポート2つが組み込まれた Pi 4 が発売されました。

前書き

この記事は完全なセットアップガイドではなく、読者が既に Arch システムを構築していることを前提としています。ユーザーの作成やシステムの管理など、基本的な作業の方法がよくわからない場合、Arch 初心者は一般的な推奨事項を読むことが推奨されています。

ノート: ARM アーキテクチャのサポートは公式 Arch Linux フォーラムではなく https://archlinuxarm.org で提供されています。ARM 固有の問題に関する投稿は Arch Linux ディストリビューションのサポートオンリーポリシーに従って直ちにクローズされます。

システム構成

Raspberry Pi は ARM ベースのデバイスであり、ARM アーキテクチャ用にコンパイルされたバイナリが必要になります。ARM 用のバイナリは Arch Linux を ARM ベースのデバイスに移植している Arch Linux ARM プロジェクト によって提供されています。ALARM プロジェクトのウェブサイトには独自のコミュニティとフォーラムがあります。オリジナルの Arch のフォーラムでは ARM に関連する問題はサポートされていません。Raspberry Pi 2 が登場したことで、デバイスのアーキテクチャによって必要なパッケージは2つに分かれています:

  • ARMv6 (BCM2835): Raspberry Pi Model A, A+, B, B+, Zero, Zero W
  • ARMv7 (BCM2836): Raspberry Pi 2 (Model B+ ベース)
  • ARMv8 (BCM2837): Raspberry Pi 3
  • ARMv8 (BCM2711): Raspberry Pi 4

Arch Linux ARM のインストール

Raspberry Pi

Arch Linux ARM Pi のドキュメント を見てください。

Raspberry Pi 2

Arch Linux ARM Pi2 のドキュメント を見てください。

Raspberry Pi 3

ノート:
  • Raspberry Pi 3 は Raspberry Pi 2 よりも使用電力が多くなっています。公式では 2.5A の電源供給が推奨されています。電源供給が不十分だと予期不可能なエラーやファイルシステムの破損が発生する可能性があります。
  • RPi3 は ARMv7 (32ビット) または AArch64 (64ビット) アーキテクチャのどちらでも動作しますが、AArch64 にはメーカーによるライブラリや拡張、関連ソフトウェアなどのサポートが整っていません。また、一部のハードウェアが上手く動かなかったりする可能性があります。現時点では ARMv7 を使用することを推奨します。

Arch Linux ARM Pi3 のドキュメント を見てください。

Raspberry Pi 4

ノート:
  • Raspberry Pi 4 は Raspberry Pi 3 よりもさらに使用電力が多くなっています。公式では 5V, 3A の電源供給が推奨されています。電源供給が不十分だと予期不可能なエラーやファイルシステムの破損が発生する可能性があります。
  • RPi4 は ARMv8 (64ビット) で動作します。

Arch Linux ARM Pi4 のドキュメント を見てください。

ARM インストール

Raspberry Pi 2 以前でビルドされたソフトウェア、特にベンダーライブラリを必要とするソフトウェアと互換性を持っています。

以下のコマンドで使われる sdX は実際にコンピュータで認識された SD カードのデバイス名に置き換えてください。

fdisk を起動して SD カードのパーティショニングを開始:

# fdisk /dev/sdX

fdisk プロンプトが表示されたら、古いパーティションを削除して新しいパーティションを作成します:

  • o を押してください。ドライブ上の全てのパーティションが消去されます。
  • p を押してパーティションを確認してください。パーティションがひとつも存在しないはずです。
  • n を押してから、p でプライマリパーティションを選択、1 でドライブの一番最初のパーティションを選択し、最初のセクタは ENTER でデフォルトに、最後のセクタは +100M と入力します。
  • t を押してから c を押して最初のパーティションのタイプを W95 FAT32 (LBA) に設定してください。
  • n を押してから、p でプライマリパーティションを選択、2 でドライブの二番目のパーティションを選択し、最初・最後のセクタは ENTER を2回押してデフォルトに設定します。
  • w を押してパーティションテーブルに書き込んで終了してください。

FAT ファイルシステムを作成・マウント:

# mkfs.vfat /dev/sdX1
# mkdir boot
# mount /dev/sdX1 boot

ext4 ファイルシステムを作成・マウント:

# mkfs.ext4 /dev/sdX2
# mkdir root
# mount /dev/sdX2 root

root ファイルシステムをダウンロードして展開 (sudo ではなく root ユーザーで実行してください):

# wget http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-4-latest.tar.gz
# bsdtar -xpf ArchLinuxARM-rpi-4-latest.tar.gz -C root
# sync

ブートファイルを一番目のパーティションに移動:

# mv root/boot/* boot

パーティションをアンマウント:

# umount boot root

Rasberry Pi に SD カードを挿入して、有線を接続し、5V 電力を供給してください。

シリアルコンソールあるいは SSH を使ってルーターからボードに割り当てられた IP アドレスに接続します。デフォルトのユーザー名は alarm でパスワードは同じく alarm です。デフォルトの root パスワードは root です。

AArch64 インストール

メインラインカーネルと U-Boot を使ってインストールすることができます。ベンダーが提供しているライブラリや拡張、ソフトウェアのサポートはありません。ボードに搭載されているハードウェアの一部が機能しなかったり、正しく動かなかったりすることがあります。

インストール手順は上記と同じですが、次の tarball を使ってください: http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-3-latest.tar.gz

ネットワーク

ネットワークはあらかじめ設定されており、systemd-networkd によって dhcp モードでオンボードの NIC が使われます。ケーブルが接続されていれば、ほとんどのルーターで自動的に IP が取得されます。

最初から Secure Shell を使って SD カードにアクセスする場合は、Raspberry Pi をイーサネットケーブルで接続してルーターの設定を通して IP アドレスを割り当てるのが一番簡単です。デフォルトのホストネームは alarmpi です。root で直接アクセスすることができます (パスワード: root)。まず初めにパスワードを変更することを強く推奨します。任意で SSH 鍵も設定してください。

Ethernet を使わずに WLAN を設定

無線インターネット接続を確立する必要がある場合、いくつかパッケージを追加でダウンロードして SD カードに保存する必要があります。netctl を使用する場合、最低でも WPA supplicant と依存パッケージの libnl が必要になります。また、dialog と依存パッケージの ncurses もインストールしておいたほうが便利でしょう。

まとめると以下を実行する必要があります:

  • 他のコンピュータから SD カードにパッケージをダウンロード
  • Raspberry Pi にパッケージをインストール・設定

必要なパッケージは全て Arch Linux ARM の公式ウェブサイト で見つけることができ、Arch Linux ARM のリポジトリ からダウンロードできます。

その後、Raspberry Pi を接続して立ち上げて、モニター/キーボードを使うかシリアルコンソールでログインします。そして、パッケージをオフラインインストールしてください。パッケージの依存パッケージが欠けている場合は、依存パッケージもダウンロードしてインストールしてください。

ワイヤレス設定も読んでください。

オーディオ

ノート: 必須モジュール snd-bcm2835 はデフォルトで自動ロードされます。

alsa-utils, alsa-firmware, alsa-lib, alsa-plugins パッケージをインストールしてください:

# pacman -S alsa-utils alsa-firmware alsa-lib alsa-plugins

ARM の Linux カーネルバージョン 4.4.x では ALSA とサウンドモジュールに大きな変更があります。最新のカーネルで alsamixer などのツールを使用するには /boot/config.txt を編集して以下の行を記述してください:

dtparam=audio=on

任意で、alsamixer を使ってデフォルトのボリュームを調整してください。唯一の音源 "PCM" がミュートされていないことを確認してください (ミュートされている場合は MM と表示されます、ミュートを解除するには M を押して下さい)。

音源の出力を選択するには:

$ amixer cset numid=3 x

x は以下のどれかになります:

  • 0 は自動
  • 1 はアナログ出力
  • 2 は HDMI

HDMI オーディオの注意

アプリケーションによっては音声を HDMI で出力するために /boot/config.txt に設定が必要です:

hdmi_drive=2

アナログ出力の注意

3.5mm のアナログ出力からの音声がかすれることがあります。以下を /boot/config.txt に追加することで問題は解決します:

audio_pwm_mode=2

ビデオ

CPU/GPU のメモリ分割

SoC に搭載されている CPU と GPU のメモリの振り分けは boot/config.txt 内の gpu_mem パラメータで設定できます。GPU から利用できるメモリの量を MB 単位で指定してください (最低 16 MB、デフォルトは 64 MB)。残りは全て ARM CPU から使用されます。

HDMI / アナログ TV 出力

デフォルト設定では、Raspberry Pi は HDMI モニターが接続されているときは HDMI を使うようになっています。接続されていない場合はアナログ TV 出力 (コンポジット出力あるいは RCA) が使われます。

HDMI やアナログ TV 出力のオン・オフを切り替えるには、次を見て下さい:

/opt/vc/bin/tvservice

-s パラメータでディスプレイの状態を確認し、-o パラメータでディスプレイをオフに、-p パラメータで優先設定を使って HDMI をオンにします。

オーバースキャン・アンダースキャンを適切に修正するには調整が必要で、多くの設定がある boot/config.txt で簡単に行うことができます。修正するには、コメントの指示に従って適切な行の設定をアンコメントしてください:

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
overscan_right=8
overscan_top=-16
overscan_bottom=-16

もしくは、TV やモニターに「画面に合わせる」オプションが存在して、オーバースキャンを無効化したい場合:

disable_overscan=1

アナログビデオ出力を使いたいユーザーは NTSC 以外の出力のオプションを含んでいるこの設定ファイルを見て下さい。

新しい設定を適用するには再起動が必要です。

アナログ TV 出力の注意事項

Raspberry Pi 1 モデル B+ と Raspberry Pi 2 モデル B から、コンポジットビデオ端子はなくなって、代わりに 3.5mm の動画/音声ジャックからコンポジット信号を出力するようになっています。RCA ケーブルによっては赤や白の音声端子で動画を接続する Raspberry Pi の規格に対応していない場合があります [1]

X.org ドライバー

Raspberry Pi の X.org ドライバーは xf86-video-fbdev あるいは xf86-video-fbturbo-git パッケージでインストールできます:

# pacman -S xf86-video-fbdev

オンボードのハードウェアセンサー

温度

温度センサーは raspberrypi-firmware パッケージにあるユーティリティで使うことができます。RPi は BCM2835 SoC (CPU/GPU) 上にセンサーを搭載しています:

$ /opt/vc/bin/vcgencmd measure_temp
temp=49.8'C

また、ファイルシステムから読み取ることもできます:

$ cat /sys/class/thermal/thermal_zone0/temp
49768

人間が読めるように出力するには:

$ awk '{printf "%3.1f°C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp
54.1°C

電圧

同じように /opt/vc/bin/vcgencmd で4つの異なる電圧をチェックすることができます:

$ /opt/vc/bin/vcgencmd measure_volts <id>

<id> は以下のどれかに置き換えてください:

  • core はコアの電圧
  • sdram_c は sdram Core の電圧
  • sdram_i は sdram I/O の電圧
  • sdram_p は sdram PHY の電圧

ウォッチドッグ

BCM2708 にはハードウェアウォッチドッグが搭載されており bcm2708_wdog カーネルモジュールを有効にすることで利用できます。

適切に扱うには watchdog デーモンをインストールして設定する必要があります (/etc/watchdog.conf 内の "watchdog-device" 行をアンコメントしてください)。それからデーモンを有効化してください。

Raspberry Pi 2 の場合は bcm2709_wdog モジュールを、Raspberry Pi 3 の場合は bcm2835_wdt モジュールを使用してください。

軽量なモニタリングスイート

monitorixAUR は v3.2.0 から RPi をサポートしています (/etc/monitorix/monitorix.confraspberrypi = y を設定してください)。温度・電圧・周波数などが記録されます。スクリーンショットはここ にあります。

オーバークロック / アンダークロック

/boot/config.txt を編集することで RPi をオーバークロックさせることができます、RPi 1 の設定例:

arm_freq=800
arm_freq_min=100
core_freq=300
core_freq_min=75
sdram_freq=400
over_voltage=0

RPi 3 の設定例:

arm_freq=1350
core_freq=500
sdram_freq=500 # test required 
over_voltage=4

*_min の行は任意で、それぞれの設定の最低値を定義します。システムの負担が低い時は、指定した値まで下がります。オプションの詳しい説明や例は elinux の Overclocking 記事を見て下さい。

新しい設定を適用するには再起動が必要です。

CPU のオーバークロック設定は、負担が高い時にガバナーが CPU の周波数を上げる場合にだけ適用されます。次のコマンドで現在の CPU の周波数を確認できます:

$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

スケーリングガバナーの詳細は CPU 周波数スケーリングを見てください。

ヒント: 以下のスクリプトを実行すると RPi に設定された全ての周波数が表示されます:
#/bin/bash
for src in arm core h264 isp v3d uart pwm emmc pixel vec hdmi dpi ; do
    echo -e "$src:\t$(/opt/vc/bin/vcgencmd  measure_clock $src)"
done

SD カードのパフォーマンスを最大化するヒント

システムのレスポンスは SD メディアの速度に大きな影響を受けます。特にシステムのアップデートなどディスク I/O に関する処理を行っている際はそれが際立つでしょう。pacman がファイルシステムにファイルを書き出すときに 頻繁に停止する ような場合、RPi や RPi2 の接続バスが足を引っ張っているというよりは、SD (あるいはマイクロ SD) カードがボトルネックとなっている可能性があります。詳しくはベンチマーク#フラッシュメディアを参照。UHS-I U3 以上の "Pro" クラスのカードを使うことを推奨します。

一般的なパフォーマンスを上げる方法についてはパフォーマンスの最大化ソリッドステートドライブ#SSD の読み書きを最小化するヒントを見て下さい。

起動時に fsck を有効にする

fsck#ブート時のチェックを見てください。カーネルパラメータは /boot/config.txt で指定するようにしてください。

シリアルコンソール

ブートメッセージを見るには、デフォルトの /boot/cmdline.txt を編集して、loglevel5 に変更してください:

loglevel=5
ノート: カーネルのバージョンによっては Pi3 でブートメッセージを表示するには enable_uart=1/boot/cmdline.txt に追加する必要があります。他のバージョン (4.9.35 など) では設定によって正しく起動できなくなる場合があります。

速度を 115200 から 38400 に変える:

console=ttyAMA0,38400 kgdboc=ttyAMA0,38400

getty サービスを起動する:

# systemctl start getty@ttyAMA0

ブート時に有効にする:

# systemctl enable getty@ttyAMA0.service

適当な service リンクを作成する:

# ln -s /usr/lib/systemd/system/serial-getty@.service /etc/systemd/system/getty.target.wants/serial-getty@ttyAMA0.service

そして PC から接続:

# screen /dev/ttyUSB0 38400

Raspberry Pi カメラモジュール

カメラモジュールのコマンドは raspberrypi-firmware パッケージに含まれています - このパッケージはデフォルトでインストールされています。以下のコマンドで使うことができます:

$ /opt/vc/bin/raspistill
$ /opt/vc/bin/raspivid

/boot/config.txt に以下を追加する必要があります:

gpu_mem=128
start_file=start_x.elf
fixup_file=fixup_x.dat

LED をオフにする設定 (任意):

disable_camera_led=1

以下のエラーが表示される場合:

mmal: mmal_vc_component_enable: failed to enable component: ENOSPC
mmal: camera component couldn't be enabled
mmal: main: Failed to create camera component
mmal: Failed to run camera app. Please check for firmware updates

/boot/config.txt に以下の値を設定してみてください:

cma_lwm=
cma_hwm=
cma_offline_start=

以下のエラーが表示される場合:

mmal: mmal_vc_component_create: failed to create component 'vc.ril.camera' (1:ENOMEM)
mmal: mmal_component_create_core: could not create component 'vc.ril.camera' (1)
mmal: Failed to create camera component
mmal: main: Failed to create camera component
mmal: Only 64M of gpu_mem is configured. Try running "sudo raspi-config" and ensure that "memory_split" has a value of 128 or greater

/etc/modprobe.d/blacklist.conf に以下の行を追加してください:

blacklist i2c_bcm2708

(/dev/video0 を使用する) 標準的なアプリケーションを使うには V4L2 ドライバーをロードする必要があります。以下のように自動ロードファイルを作成することで起動時に自動的にロードさせることが可能です:

/etc/modules-load.d/rpi-camera.conf
bcm2835-v4l2

デフォルトでは V4L2 ドライバーを使って録画できる動画の解像度は 1280x720 が最大です。それ以上にしようとすると動画が 4 fps 以下にまで落ち込みます。制限を取り払いたい場合、以下のオプションを追加してください:

/etc/modprobe.d/rpi-camera.conf
options bcm2835-v4l2 max_video_width=3240 max_video_height=2464

ハードウェア乱数生成器

Raspberry Pi 用の Arch Linux ARM には rng-tools パッケージがインストールされており、bcm2835-rng (カーネル 4.4.7 から Raspberry Pi 2 と Raspberry Pi 3 では bcm2835_rng モジュールに置き換えられています) が起動時にロードされるように設定されています (こちら を参照) が、Hardware RNG Entropy Gatherer Daemon (rngd) にハードウェア乱数生成器の場所を教えてやる必要があります。

/etc/conf.d/rngd を編集することで設定します:

RNGD_OPTS="-o /dev/random -r /dev/hwrng"

設定したら rngd デーモンを再起動してください:

# systemctl restart rngd

この設定で、ハードウェア乱数生成器からのデータがカーネルのエントロピープール (/dev/random) に取り入れられるようになります。エントロピーを確認するには:

# cat /proc/sys/kernel/random/entropy_avail
ノート: 古いイメージからカーネルを更新すると旧式の bcm2708-rng を見つけられず systemd-modules-load.service の起動に失敗していることがあります。その場合には /etc/modules-load.d/raspberrypi.conf を設定し直し、 systemd-modules-load.service を再起動すると解決します (こちら を参照)。

I/O ピン

GPIO

Python から GPIO ピンを使えるようにするには RPi.GPIO ライブラリを使用します。python-raspberry-gpioAUR パッケージをインストールしてください。

SPI

/dev/spidev* デバイスを有効にするには、以下の行をアンコメントしてください:

/boot/config.txt
device_tree_param=spi=on

I2C

i2c-tools パッケージをインストールしてください。

/boot/config.txt に以下を追加することで i2c ハードウェアを有効にするようにブートローダーを設定します:

dtparam=i2c_arm=on

i2c-devi2c-bcm2708 モジュールを起動時にロードするように設定:

/etc/modules-load.d/raspberrypi.conf
i2c-dev
i2c-bcm2708

Raspberry Pi を再起動してから次のコマンドを実行してハードウェアアドレスを取得:

# i2cdetect -y 0
ノート: I2C0 ではなく I2C1 ポートを使用する場合、i2cdetect -y 1 を実行して、以下のコマンドで使われている i2c-0i2c-1 に置き換える必要があります。

そしてデバイスを初期化するように Linux を設定します。以下のコマンドのハードウェアアドレスは先のコマンドで取得したアドレスに置き換えてください ('0x' を前に付けます、例: 0x48)。デバイス名は自由に決めて下さい:

# echo <devicename> <hardware address> >/sys/class/i2c-adapter/i2c-0/new_device

dmesg コマンドを使ってカーネルメッセージを確認すると、以下のような新しいエントリが追加されているはずです:

i2c-0: new_device: Instantiated device ds1621 at 0x48

lm_sensors などのプログラムを使ってセンサーの出力を読み出すことができます。

1-Wire

1-Wire インターフェイスを有効にするには /boot/config.txt に以下の行を追加して再起動してください:

dtoverlay=w1-gpio

RPi でのコンパイル

RPi 上でのコンパイルは非常に低速です。ネットワーク上に他のノードが存在する場合 Distcc を使うことでコンパイル時間を大幅に短縮できます。x86_64 や i686 のマシンを使っている場合、Distcc#Arch Linux ARM に既存のマシンを活用して distcc をセットアップする方法が書かれています。

QEMU chroot

場合によっては Raspberry Pi を動かすよりもディスクイメージを直接操作したほうが楽だということもあるでしょう。RPi の root パーティションが含まれている SD カードをマウントして、そこに chroot することで直接操作することができます。chroot からは、pacman を実行してパッケージをインストールしたり、巨大なライブラリをコンパイルすることが可能です。実行可能ファイルは ARM アーキテクチャ用のものなので、QEMU を使って x86 への変換を行う必要があります。

64ビットの Raspberry Pi では aarch64 を使うことができます。他のモデルでは arm を使ってください。

AUR から binfmt-supportAURqemu-user-staticAUR をインストールしてください。

そして binfmt-support サービスを起動・有効化してください:

# systemctl enable binfmt-support
# systemctl start binfmt-support

qemu-user-staticAUR はコンパイルしたプログラムを他のアーキテクチャから実行するのに必要となります。qemu-arch-extra と似たような機能ですが、chroot で使うには "static" なバージョンが必要です。例:

qemu-arm-static path_to_sdcard/usr/bin/ls
qemu-aarch64-static path_to_sdcard/usr/bin/ls

上記のコマンドで32ビットの ARM と64ビットの ARM 用にコンパイルされた ls を実行できます。ホスト環境に存在しないライブラリを使うため、chroot を使わないと機能しません。

qemu-user-staticAUR は ARM の実行ファイルに自動的に qemu-arm-static または qemu-aarch64-static を前に付けます。/var/lib/binfmts/qemu-armqemu-user-staticPKGBUILD などを見てください。

ARM から x86 への変換が有効かどうか確認:

# update-binfmts --display qemu-arm
# update-binfmts --display qemu-aarch64

ARM から x86 への変換が有効でない場合、update-binfmts を使って有効にしてください:

# update-binfmts --enable qemu-arm
# update-binfmts --enable qemu-aarch64

SD カードを mnt/ にマウントします (デバイス名は適宜置き換えてください)。

# mkdir mnt
# mount /dev/mmcblk0p2 mnt

必要であればブートパーティションをマウントしてください (デバイス名は適当な名前に置き換えてください):

# mount /dev/mmcblk0p1 mnt/boot

(ARM からの変換を処理する) QEMU の実行可能ファイルを SD カードにコピーしてください:

# cp /usr/bin/qemu-arm-static /usr/bin/qemu-aarch64-static mnt/usr/bin

最後に Change Root#chroot を使うに書かれているように SD カードの root に chroot してください:

# chroot mnt/ /bin/bash

arch-install-scripts に含まれている arch-chroot を使うこともできます (ネットワークのサポートが含まれています):

# arch-chroot mnt/ /bin/bash

参照

  • Raspberry Pi - 公式ウェブサイト
  • RPi Config - ボンネットの下の設定に関連する情報がまとまっています
  • RPi vcgencmd usage - ファームウェアコマンドの vcgencmd の概要