Tag: RaspberryPi

Gentoo × Raspberry Pi(brcmfmac)で Wi-Fi 接続に失敗したときの原因切り分けと解決メモ

本記事は、Gentoo + Raspberry Pi 5(brcmfmac) 環境で 5GHz Wi-Fi(OpenWrt AP)への接続に失敗した事象を、ログの読み解き → 原因候補の整理 → 最短の切り分け → 恒久対策の順でまとめたトラブルシュート記録です。 同様の環境・構成でハマった方の参考になれば幸いです。

TL;DR(最初に結論)

  • 症状は ASSOC-REJECT status_code=16 の連発。dmesg には brcmf_set_channel … reason -52 が多発。
  • 規制ドメイン(regdom)が global=JP でも phy=99(UNSET)のまま、かつ WPA3/SAE のビルド/設定相性が絡んで アソシエーション前段で失敗していた。
  • 改善に効いたもの:
    • AP の国コードを JP 固定、チャンネル 36–48(非DFS)(今回は 48)で固定。
    • クライアントは一時的に WPA2-PSK(AES)に限定(key_mgmt から SAE を外す、pairwise/group/proto を CCMP/RSN 固定)。
    • sae_pwe 未対応による設定パースエラーを除去。
    • 起動後に udev or systemd で iw reg set JP を強制(phy が 99 から動かない個体の保険)。
  • つながっている別サーバは、接続後に AP の Country IE(802.11d)で JP に寄っていた(=接続できれば後追いで JP になる)。今回の問題個体は 接続前に落ちるため、phy が 99 のままという見え方だった。

構成概要

  • クライアント:Gentoo Linux on Raspberry Pi 5
    • カーネル:brcmfmac(Broadcom FullMAC ドライバ)
    • ネットワーク:systemd-networkd + wpa_supplicant
    • MTU:1450(k3s/flannel 想定)
  • アクセスポイント:OpenWrt
    • SSID:OpenWrt5Ghz
    • 暗号:WPA2/WPA3 ミックス(PSK + SAE, CCMP)
    • チャンネル:48(5.240GHz, 非DFS)
    • Country:JP(固定) ← 対応後
    • Wifiアクセスポイント側の暗号化: mixed WPA2/WPA3 PSK, SAE (CCMP)
  • 目的:5GHz 接続の安定化(WPA3 も将来的に使いたい)

症状とログ

DHCPv6の設定ができていなかった

networkctl status wlan0 をした際に次のエラーがでた

Read more...

Pi5関連

参考

Read more...

ラズパイ5、Gentoo周りのメモ

Gentooで使いたい。GenPi64のプロジェクトだと2024/03だと対応はまだの模様

2023/12 あたりに作成したGenPi64プロジェクトのイメージだとRaspberryPI5では起動しなかった。 この辺の機種ごとの際はラズベリーパイではよくあることではある。

ありがたいことに先人がおり起動したので、私が追加で設定したメモを残す。

手順はext4で起動するようになっている。 私が手順を一通り見て「既存のディスクイメージをベースにカーネルと必要なファイルを更新したら起動するのでは?」と思い試してみた。 が、カーネルが認識するファイルシステムがext4だった(カーネル再構築でbtrfsを認識させればよいような気もする) 私がGenPi64で作成したイメージはルートファイルシステムをbtrfsで構成したため起動しなかった。 素直にext4でルートファイルシステムを構成する。

基本的にこの手順で動作する

How to install Gentoo on Raspberry Pi 5 - Gentoo Wiki

私は作業用ディレクトリとして下記にした

WORK=/mnt/gentoo_work
DISK=/dev/sdc
DEST=/mnt/gentoo
mount ${DISK}3 $DEST && mount ${DISK}1 ${DEST}/boot

Gentooオフィシャルの説明

私が追加、変更して作業したこと

/lib/modules の git clone は時間がかかる

先にgitをインストールして/lib/modules用のレポジトリをダウンロードしておいた方が良い

–depth=1 で履歴を取らないようにしておくと早い

cd ${WORK}
git clone --depth=1 https://github.com/raspberrypi/firmware.git

openrcではなくsystemdを使いたかった

stage3のファイルをopenrcではなくsystgemdを利用した。 ダウンロードは下記のarm64の「systemd」を使った。

Downloads – Gentoo Linux

cd ${WORK}
tar xpf /mnt/gentoo_work/stage3-arm64-systemd-20250824T234925Z.tar.xz  --xattrs-include='*.*' --numeric-owner -C ${DEST}/

portage snapshot は jaistからダウンロードした http://ftp.jaist.ac.jp/pub/Linux/Gentoo/snapshots/ 昔からありがとう… 北陸先端科学技術大学院大学さん

Read more...

SDカードイメージを作成するテスト

背景

新しいバージョンを試したい。 調べてみると、 Build.Dist このツールを使うと自分でSDカードのイメージを作成できるらしい。 更に設定で自分好みのイメージが作れるらしい、凄い。

下記はエラーに対する試行錯誤、そのメモです。

ネットワークのトラブル、pingで疎通ができない。名前解決はできないのだがdigだと名前解決ができる

名前解決にdnssecを利用するようになった。

/etc/resolv.conf の内容

nameserver 127.0.0.53
options edns0 trust-ad
search .

edns0: EDNS(Extension mechanisms for DNS)のバージョン0を使用することを示す。 EDNSは、DNSプロトコルを拡張し、より大きなペイロード、改善されたセキュリティ(DNSSEC)、その他の機能をサポート。

trust-ad: DNSSECのAuthenticated Data(AD)フラグを信頼することを示す。 これは、DNSSECにより検証された応答を信頼し、使用することを意味。

DNSSECはサーバ側の時刻を利用する。 ラズパイを長いこと起動していなかったためか、あるいはchronyd, ntpdをインストールして設定が変わったからか、DNSSECが動作しなくなった。

ラズパイの時刻がずれていたので強制的に時刻を合わせる。

dig time.google.com で、googleのNTPサーバのIPアドレスを確認し、nptpdateで合わせる。

sudo systemctl stop ntpd
sudo ntpdate 216.239.35.4

今では systemd-timesyncd, chronydで時刻合わせを設定するようなので、知識をアップデートしたい。

scripts/binfmt.sh でエラーが出る

下記の箇所でエラーが出る。 qemuが必要。

if [ "${cpu}" != "arm" ] ; then
    if [[ ! -e /proc/sys/fs/binfmt_misc/arm ]]; then
        echo ":arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xf
f\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm:F" >> /proc/sys/fs/binfmt_misc/register
    fi
fi

下記のコマンドでqemuをインストールした。

Read more...

Build.distでビルドできなかったのでプルリクを作成した

背景

2023/06時点、ラズパイ上でのGentooが起動するGenPi64をゼロからイメージ作成するBuild.Distはイメージ作成に失敗する。

私が成功するまで3つ程、ハードルがあったのでプルリクを作成したい。 その時のメモ。

原因

parsers/rawcommand/rawcommand、シェルのヒアドキュメントの箇所で、本来、タブであるべき所が空白になってしまっている。

画面上は分かりにくいがgit pullすると確認できる。 また全てのシェルスクリプトがNGという訳ではなく、他のシェルスクリプトはタブになっていた。

この問題に起因すると思われるイシュー

issueで挙がってないか確認

過去の経緯を軽く確認

https://raw.githubusercontent.com/GenPi64/Build.Dist/master/parsers/rawcommand/rawcommand 空白かもしれない。タブの方が良い。

Read more...

Build.distのメモ

概要

RasberyPi用のGentooであるGenPi64というプロジェクトがある。

ただアップされているイメージが古い、様子。 新しいGentooを試したい。

GenPi64のイメージを作製するには GenPi64/Build.Dist: Build scripts for building GenPi64 images.を使う。

仕組みは非常に合理的というか良くできている、が、うまく動かなかったので仕組みを調べている。 これはそのメモ。

サイト内関連ページ

手順

事前準備

必要なパッケージ追加

sudo emerge --ask dev-python/lockfile dev-python/iniparse sys-fs/btrfs-progs sys-fs/dosfstools sys-block/parted
sudo QEMU_USER_TARGETS="aarch64 arm" QEMU_SOFTMMU_TARGETS="aarch64 arm" USE="static-libs" emerge --changed-use --ask  --newuse  --quiet app-emulation/qemu

以前は dev-python/pychroot も必要としていた。 が、pychrootが2023/12/22にアーカイブされてしまい、Gentooとしてもパッケージが存在しないようになってる。 GitHub - pkgcore/pychroot: a python library and cli tool that simplify chroot handling

この人も困ってそうではあるが User:Maffblaster/Todo - Gentoo Wiki

quick start

https://github.com/GenPi64/Build.Dist/ を git pull し、ディレクトリに移動

sudo -s
bash
export PROJECT="GenPi64Systemd"
. env.sh
sh build.sh

仕組み

sh build.sh を行った際の進み方

Read more...

wifi関連のトラブルシューティング

ラズパイでwifiの国設定が異なる場合

wifiアクセスポイントを検索してもなぜかチャンネル1の他人の家のアクセスポイントしか見つからない。 スマホなどからの接続には問題がない。 またアクセスポイントの検索自体は(他人の家のアクセスポイントが見えているので)問題がない。

私の場合はwifiアダプタの国設定ができていないためだった。 iw reg get で国の設定が確認できる。 下記はイギリスになっていた。

$ iw reg get
global
country GB: DFS-ETSI
        (2400 - 2483 @ 40), (N/A, 20), (N/A)
        (5150 - 5250 @ 80), (N/A, 23), (N/A), NO-OUTDOOR, AUTO-BW
        (5250 - 5350 @ 80), (N/A, 20), (0 ms), NO-OUTDOOR, DFS, AUTO-BW
        (5470 - 5730 @ 160), (N/A, 26), (0 ms), DFS
        (5725 - 5850 @ 80), (N/A, 23), (N/A), NO-OUTDOOR
        (5925 - 6425 @ 160), (N/A, 23), (N/A), NO-OUTDOOR
        (57000 - 71000 @ 2160), (N/A, 40), (N/A)

phy#0
country 99: DFS-UNSET
        (2402 - 2482 @ 40), (6, 20), (N/A)
        (2474 - 2494 @ 20), (6, 20), (N/A)
        (5140 - 5360 @ 160), (6, 20), (N/A)
        (5460 - 5860 @ 160), (6, 20), (N/A)

wifiの国設定は sudo iw reg set JP などとすると設定できるようだが、ラズパイの場合、うまく行かない。

Read more...

RaspberryPiでUSBブートを試みる

背景

SD カードが壊れた。最近のラズパイは HDD ブートに対応しているので HDD ブートで Gentoo を起動した。 作業としては通常の RaspberrypiOS で起動、(新しいラズパイなら不要だと思うが私は必要だった)ファームウェアのアップデートを行い、 Genpi64 のイメージをダウンロード、HDD に書き出し、起動した。ハマるポイントは無く、意外とスムーズに起動した。 2021/09/28 RaspberryPi 4B で確認した。 Raspberry Pi 2B、3A+、3B、3B+の場合、手順は異なるかもしれない。

手順

ファームウェアが古い場合はアップデート

HDD ブートはファームウェアが「2020-09-03」以降である必要がある。

参考 [SDカード不要? 「Raspberry Pi 4」をUSBブートさせる方法について https://gadgetrip.jp/2021/05/raspberry_pi4_usb_boot/ ラズパイ4を完全 USB Boot 化

コマンド効果
vcgencmd bootloader_version現在のブートローダーのバージョンを確認
rpi-eeprom-updateアップデートがあるか確認
sudo rpi-eeprom-update -aアップデート

ファームウェアのバージョンを確認するため rpi-imager をRaspberrypiOS のページからダウンロードして、SD カードに書き込み起動する。 ラズパイ4を完全 USB Boot 化を参考にさせていただきファームウェアのアップデートを行った。

私の /etc/default/rpi-eeprom-update は default だった。

pi@raspberrypi:~ $ cat /etc/default/rpi-eeprom-update
FIRMWARE_RELEASE_STATUS="default"
最近のラズパイ OS だと、初回起動時のアップデートを行うとファームが最新にアップデートされる模様

購入直後の状態で USB ストレージを刺してとりあえず起動するか確認したが、ファームが古くだめだった。 ラズパイ OS の SD から起動し、初回起動時に現れるアップデートでアップデートするとファームウェアが最新のものに変更された。

Read more...

ラズパイ(GenPi64)とADRSZIRSゼロワンで簡単に赤外線を使う

ラズパイから赤外線リモコンで操作( はんだ付けなし

たぶん電子工作した方が安いのですが手軽に赤外線で操作したい用途です。

ADRSZIRS ゼロワン 赤外線送信拡張基板 Amazonで3278円でした。

Githubにソースコードがあるので、そのまま使います。

これだけで動く。

赤外線コード読み取り ./3_2adrszIRS-sample.py r
      書き込み ./3_2adrszIRS-sample.py w 5B0018002E001800

GenPi64だとpythonのライブラリ名が異なっていて修正が必要だった。

3rd/ADRSZIRS_IR_Sender/3_2adrszIRS-sample.py で smbus2 を smbus として使うような修正が必要。 更にpipをインストールして、smbusを追加する。

smbus2を入れる。

emerge dev-python/pip
pip install --user smbus2

3rd/ADRSZIRS_IR_Sender/3_2adrszIRS-sample.py を修正。

--- a/3rd/ADRSZIRS_IR_Sender/3_2adrszIRS-sample.py
+++ b/3rd/ADRSZIRS_IR_Sender/3_2adrszIRS-sample.py
@@ -32,7 +32,8 @@
 #

 from __future__ import print_function
-import smbus
+import smbus2 as smbus
 import time
 from time import sleep

実際に使う

このパイソンのスクリプトをゴリゴリ修正する、という手もあると思う。 が、手早く色々な機器の操作したいので、bashで下記のようなものを書いた。

#!/bin/bash

dir=$(cd $(dirname $0);pwd)

# power
POWER='5801A90019003F001800400018001400190014001800150018001500180014001800400017003F0019001400190040001700140019003F001800150018004000180014001900140018001500180015001800140019004000170015001800150018003F00190040001700400018003F00180040001800140018003F0019003F001800150018004F03'

${dir}/../RasPi-Zero-One-Series/3rd/ADRSZIRS_IR_Sender/3_2adrszIRS-sample.py w ${POWER}

# 後は必要な機器の赤外線を読み込んで、追加していく
Read more...

Gentoo ラズパイ関連

gentoo-on-rpi-64bit 初期セットアップ

ココに書いてあるものをなぞった このページにラズパイで Gentoo を便利に稼働させる細かいノウハウがあるので一読した方が良い。これを作った sakaki- 氏すごい。 Gentoo 一般についてはGentoo Linux amd64 ハンドブック:Gentoo での作業にまとまっている。

条件

  • Linux マシン( Ubuntu 21.04 ) で行った。
  • 解凍に zstd が必要
  • Xfce, LibreOffice, VLC, Kodi, GIMP などを含むデスクトップ環境を選択した(ライトイメージもある)
  • ライトイメージの場合、解凍されたファイル名も異なるので読み替えが必要

手順

SD カードが刺さっているパスを確認する

SD カードを Linux マシンに刺した上で /var/log/syslog を確認するか lsblk で確認する。

sudo lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 223.6G  0 disk
├─sda1   8:1    0   300M  0 part /boot/efi
└─sda2   8:2    0 223.3G  0 part /
sdb      8:16   1  28.9G  0 disk
├─sdb1   8:17   1   255M  0 part
└─sdb2   8:18   1  28.6G  0 part

私の場合は /dev/sdb で認識されていた。

Read more...

raspi64でソースからのコンパイルでエラーが出た場合

ソースからのインストールで「unrecognized command line option」というエラーが出る

現在のSoftetherのconfigureではARM 64bit向けの対応がされているので問題ないが、 以前はエラーが出ることがあった。その時のメモ。

ソースコードのconfigure側のアップデートが必要なので、 何か他のソフトウェアでも発生するかもしれないのでメモとして残す。

ラズパイでソースからコンパイルを行った際、下記のエラーが出た。

cc: error: unrecognized command line option ‘-m64’

-m64はインテル系64bitのオプションなので、ARMでは使えない。 対応としては、-m64の箇所を全て削除することで対応した。

emerge vim git
git clone https://github.com/SoftEtherVPN/SoftEtherVPN_Stable.git
cd SoftEtherVPN_Stable
./configure
vi Makefile

参考

ARM系で -m64 というオプションは無い模様なので、./configure でできた Makefile から -m64 を削除する 64bit Linux で32bit ソースのビルドを行う方法を教えて下さい. 問題自体への理解が進みました。

[softeher] ARM系のCPUのSoC搭載SBCで、ソースからsofteherをビルド -m64を全て削除、という発想が助かりました。

Read more...

ラズパイでSoftEtherを用いてL2レイヤーをVPN接続する

背景

自宅に wifi 接続できない HDD レコーダーがあった。が、家庭内で LAN ケーブルは伸ばしたくない。 別にPXE ブートさせたい。かつ wifi で行いたいマシンがあった。

つまりWifi-イーサネットコンバーターが欲しい。 商品もありますが作ってみたかった。

ラズパイをイーサネットコンバーターにする場合、内部的に DHCP を建てる設定例があったが、 できれば同一ネットワークでコンバーターが透過的に動作するようなものが欲しかった。 手軽に使える SoftEther でレイヤー 2 カスケードする設定で接続した。

ネットワーク構成

SoftEther のクライアント、サーバー共にラズベリーパイをGenPi64でセットアップして利用。 ただ nmcli( NetworkManager の CLI ツール )が使えれば他構成でもセットアップできそう。

HDDレコーダー or PXEブートしたいマシン => SoftEtherクライアント => SoftEtherサーバー => Internet

という形で外部に出れるようにする。

SoftEther サーバーではイーサネットインターフェースのみの運用とし、tap デバイスをブリッジする構成にした。 (Softetherクライアント、wifiコンバータ側はtapデバイスは作らない)

方針としては、基本的に使わない機能は off、必要に応じて有効にする。

  • 仮想ハブ名: VpnHub1
  • ダイナミック DNS 機能、DDDS: Off
  • VPN Azure クラウド: off
  • IPsec/L2TP/L2TPv3 サーバー機能の設定: off
  • OpenVPN/MS-SSTP サーバー機能設定: off
  • SecurNAT 機能、DHCP サーバー機能は使わない。
  • カスケード接続は使う*(レイヤ 2 カスケード接続になる)
  • SoftEther のサーバー/クライアント共に [ローカルブリッジ設定]=>[eth0] と物理インターフェースでブリッジを行う

環境

サーバー/クライアントともに共通

Read more...

emergeする際のテンポラリファイルの置き場所の変更

背景

GenPi64で/var/tmpがzramでマウントされていた。 これ自体は高速化されるので嬉しい。

ただメモリを使うzramの場合、メモリが小さいマシンでは/var/tmpが小さくなり、gccのビルドに失敗する。 このためローカルディスクを使うように変更した。

sudo mkdir /var/portage && sudo chmod 775 /var/portage && sudo chown portage:portage /var/portage
sudo vi /etc/portage/make.conf

下記を追記

PORTAGE_TMPDIR="/var/portage"
Read more...