V-antena and Tanimoto's page

谷本の備忘録・雑記帳・work

>

カテゴリー: Raspberry pi

CATEGORY ARCHIVE

raspberry piをbusterからbullseye経由でbookwormに更新したがしばらくしてapt upgradeでエラーが出る様になった。elecomのwifiドングル用のコンパイルでエラーとなったので仮対処した。※エラーが出ないようにしただけなので問題が出ないかどうかは確信ないので注意。

マシン状況

機体  :Raspberry pi 4B
OS   : Linux raspberrypi 6.1.10-v8+  Debian GNU/Linux 12 (bookworm)
ドングル:Elecom Co., Ltd WDC-150SU2M
種類  :rtl8188eu 系統

1.prandom_u32()無いと怒られた事への仮対処

sudo nano /var/lib/dkms/8188eu/5.3.9/source/os_dep/osdep_service.c

下記のボールドの部分を追加し、prandom_u32()を使わないようにした。

2574 inline u32 rtw_random32(void)
2575 {
2576 #ifdef PLATFORM_LINUX
2577 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))
2578          return get_random_u32();
2579 #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 8, 0))
2580         return prandom_u32();
2581 #elif (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 18))
2582         u32 random_int;
2583         get_random_bytes(&random_int , 4);
2584         return random_int;
2585 #else
2586         return random32();
2587 #endif
2588 #elif defined(PLATFORM_WINDOWS)

2. current_bssが無いと怒られた事への仮対処

sudo nano /var/lib/dkms/8188eu/5.3.9/source/os_dep/linux/ioctl_cfg80211.c

9634         rtw_cfg80211_indicate_scan_done(adapter, _TRUE);
9635
9636         #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE)
9637         if (wdev->current_bss) {
9638                 RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter));
9639                 rtw_cfg80211_indicate_disconnect(adapter, 0, 1);
9640         }
9641         #endif

上記のコードを下記の様に書き換えた。特にボールド体の部分。

9634         rtw_cfg80211_indicate_scan_done(adapter, _TRUE);
9635
9636         #if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
9637           if (wdev->connected) {
9638                 u8 locally_generated = 1;
9639                 RTW_INFO(FUNC_ADPT_FMT" clear connected by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter));
9640                 cfg80211_disconnected(adapter->pnetdev, 0, NULL, 0, locally_generated, GFP_ATOMIC);
9641           }
9642         #elif (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)) || defined(COMPAT_KERNEL_RELEASE)
9643         if (wdev->current_bss) {
9644                 RTW_INFO(FUNC_ADPT_FMT" clear current_bss by cfg80211_disconnected\n", FUNC_ADPT_ARG(adapter));
9645                 rtw_cfg80211_indicate_disconnect(adapter, 0, 1);
9646         }
9647         #endif

3. cfg80211_rtw_stop_ap 他で引数の数がおかしいと怒られた事への仮対応

sudo nano /var/lib/dkms/8188eu/5.3.9/source/os_dep/linux/ioctl_cfg80211.c

下記のボールド体のところを追加

4879 static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4880 {

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 19, 0))
4880 static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev, unsigned int link_id)
4881 #else
4882 static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
4883 #endif

その他も定義のところで、第3引数のところに、int link_id を追加

また、cfg80211_ch_switch_notifyの引数に下記の様に 0 を追加してみた

420         cfg80211_ch_switch_notify(adapter->pnetdev, &chdef, 0);

4. bssidに、network.MacAddress は無いと怒られた事への仮対処

sudo nano /var/lib/dkms/8188eu/5.3.9/source/os_dep/linux/ioct l_cfg80211.c

下記の様に、links[0]. を、追加した

1097                 freq = rtw_ch2freq(channel);
1098                 notify_channel = ieee80211_get_channel(wiphy, freq);
1099                 #endif
1100
1101                 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 12, 0) || defined(RHEL79))
1102                 roam_info.links[0].bssid = cur_network->network.MacAddress;
1103                 roam_info.req_ie = pmlmepriv->assoc_req + sizeof(struct rtw_ieee80211_hdr_3addr) + 2;
1104                 roam_info.req_ie_len = pmlmepriv->assoc_req_len - sizeof(struct rtw_ieee80211_hdr_3addr)>

5. REGULATORY_IGNORE_STALE_KICKOFF が無いと怒られた事への仮対処

sudo nano /var/lib/dkms/8188eu/5.3.9/source/os_dep/linux/wifi_regd.c

下記の部分を (6, 4, 4)から、(6, 1, 39) へ書き換えてみた

387 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 39))
388         wiphy->regulatory_flags |= REGULATORY_IGNORE_STALE_KICKOFF;
389 #endif

結果

ここまでで、ワーニングは残っているが、エラーにならずにapt upgrade できる様になった。
但し、仮対処が正しいかどうかはわからないし、他の版になったらどうなるかもわからない

仮に、マネをする人は、他の情報を当たってからにした方が良いです。 エラーになってどうしようもない場合だけ。 自己責任でお願いします。

wordpressのサイトヘルスでPHPが旧いと怒られたのでPHPを更新した。その際の実施メモ。

まだ、エラーが残っていたので追記(3.3)と一部追記(3.2) 2025/11/20

背景

本サイトでwordpressを運用しているが、サイトヘルスでPHPの版数が旧いので更新してください、と怒られていた。そこでPHPの更新に取り組んだが、それなりに大変だったの記録として残す事にした。
なお、OSがbusterのままだとPHPを更新出来なかったのでOSもバージョンアップした。

更新前の状況
OS: Raspbian buster PHP: ver. 7.4

更新後の状況
OS: Raspberry Pi OS bullseye PHP: ver. 8.4

第一段階 raspberry Pi OSのバージョンをbusterからbullseyeに更新

1.1 ソースリストの変更
1.1.1 sources.list中のbusterをbullseyeに変更する
   (security部分に一部フォーマットの変更もあり)

sudo nano /etc/apt/sources.list
下記の様になる様に変更する

deb http://deb.debian.org/debian bullseye main contrib non-free
deb http://deb.debian.org/debian-security/ bullseye-security main contrib non-free
deb http://deb.debian.org/debian bullseye-updates main contrib non-free

1.1.2 sources.list.d/raspi.list中のbusterをbullseyeに変更する

 sudo nano /etc/apt/sources.list.d/raspi.list
 下記の様になる様に変更する

 deb http://archive.raspberrypi.org/debian/ bullseye main

1.2 OSを更新

sudo apt update
sudo apt upgrade --without-new-pkgs
sudo apt full-upgrade
sudo apt autoremove

sudo apt install zstd
(bookwormに更新時必要になるのでついでにインストールしておく)
 
sudo reboot

1.3 xrdpがブルーの画面のままとなる場合の対応

こちらのサイトを参照
https://raspberrypi.stackexchange.com/questions/133425/connection-problem-giving-up-on-xrdp-with-raspberry-pi-os-11-bullseye

第2段階 PHPをバージョンアップ

2.1 おまじない

sudo apt update
sudo apt upgrade

2.2 サービス一時停止

sudo systemctl stop mariadb.service
sudo systemctl stop php7.4-fpm.service
sudo systemctl stop apache2.service

2.3 PHP類インストール

sudo apt install php php-mbstring php-gd php-mysql php-pspell
sudo apt install php-xml php-xmlrpc php-fpm php-curl php-imagick php-zip php-intl

バージョン確認
php -v

2.4 インストール中のメッセージ内で言われたとおりの事を行う

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.4-fpm

sudo systemctl reload apache2
sudo systemctl restart apache2

第3段階 PHP8系とwordpressの相性の悪さに対応

wordpressを表示しようとしたところ、fatalエラーや表示されない問題が発生したので対処

3.1 Fatalエラー対策 functions.php

create_functionがPHP8で削除され無くなったらしく、無名関数で対応

 sudo nano  wp-content/themes/使用しているtheme/functions.php
 
 add_action('widgets_init', function(){register_widget("My_Widget_Meta");});

下記を上記の様に書き換える
# add_action('widgets_init', create_function('', 'return register_widget("My_Widget_Meta");'));

3.2 内容が表示されない問題対応 single.php, index.php, archive.php

クォーテーションで囲まれてないと「Use of undefined constant」というエラーになる様になった。自作のPHPファイルなのでその様なところが残っていた。 自作でなければ必要ないかも

 sudo nano wp-content/themes/使用しているtheme/single.php

下記の場合、DATA_W3Cをシングルクォートで囲む様に書き換えた。

          esc_attr( get_the_date( 'DATA_W3C' ) ); ?>">

同様にindex.php  と archive.php 内の DATA_W3C をシングルクォートで囲む。

         esc_attr( get_the_date( 'DATA_W3C' ) ); ?>">

3.3 他にhtml5とコメントで名前とメールが入力必須になっているかの判断のところうまく動かなくなっていたので、そこを暫定的に決め打ちした  cooments.php

comments.php の先頭に下記を追加

 <?php
  $aria_req = " aria-required='true'" ; 
 ?>

comments.php で$html5 を使っているところを使っていることに決め打ちする。
下記
 '<input id="email" name="email" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . 
下記の様にする
  '<input id="email" name="email" ' . 'type="email"'  . ' value="' .

おしまい

これで、復活し、wordpressのサイトヘルスでも怒られなくなった

apt updateで「クリアサインされたファイルが有効ではなく、'NOSPLIT' を得ました」出力し失敗

トラブル

apt updateコマンドで、エラーとなり「クリアサインされたファイルが有効ではなく、'NOSPLIT' を得ました (認証にネットワークが必要?)」との情報が出力された。

原因調査

ネットで調べたところ、deb用のソースが消えていたり期限切れの可能性がある事が分かった。
そこで、sudo apt-key list を実行したところ期限切れと表示されるものがあった。

仮処置

/etc/apt/sources.list 又は /etc/apt/source.list.d 内の期限切れのsourceの部分をコメント化した。 一応っこれで、apt updateは実行できる様になった。

正式な対処は、OSを含めアップデイトする事である(が、各アプリケーションの中身の更新が大変)

wake on lanの実現方法の一つ

背景

wake on lan(以降wol)を、機種変前のスマホを使って実現しようとしていたが外出中にスマホがスリープ?してしまい、外出先からwolが出来ない。そこでスマホを使わずraspberry pi(以降raspi)を使う別の方法を考えた。

前提条件 

  • raspiにsylpheedがインストール済み
  • sylpheedから周期的にポーリング受信可能なメールアドレスあり(私の場合自宅サーバー上)
  • raspiにwakeonlanがインストール済み

sylpheedでの設定

sylpheedでメッセージ受信したらコマンド実行 に一般設定で設定する
例:

/home/pi/tools/wolmail.sh

他に、2分ごとにメールをチェックする様にした。自宅サーバーでなければ、5分ごととかもう少し間隔を長めにした方が良いかもしれない。 起動までに時間がかかるが。

メール受信時に実行するシェル

wolmail.shを以下の様にした。試行錯誤で書いたものなので効率の良くないコードではあるが。

#!/bin/bash

ls -trl /home/pi/Mail/inbox | tail -1  >/home/pi/logs/wolsh.log

cat /home/pi/logs/wolsh.log | awk  '{printf("/home/pi/Mail/inbox/%s\n",$9)}' >/home/pi/logs/woltemp
prefile=/home/pi/logs/woltemp

while read filename
do
 cat $filename |awk -f /home/pi/tools/wolmail.awk

done < ${prefile}

wolsh.log、woltempは作業用のファイル

Pathは、念のためフルパスで記述。 sylpheedの受信メールはMail/inboxにあった。最新のものを使用。9番目のフィールドが該当メールのファイル名(数字)であった。

wakeonmailするためのawkスクリプト

awkスクリプトを、wolmail.awkとして下記の様に作成した。

BEGIN{
}
{
if (NF >=2 ) {
  if ($1 == "wolkeyword")  {
   for (i=2;i&lt;=NF;i++) {
      if ($i=="aaaaa") system("/home/pi/tools/wol-aaaaa.sh")
      if ($i=="bbbbb") system("/home/pi/tools/wol-bbbbb.sh")
      if ($i=="ccccc") system("/home/pi/tools/wol-ccccc.sh")
  }

  }
 }
}
END{
  print "wol sent end" > "/home/pi/logs/wol_mail_status"
}

wol-xxxxx.shは、wakeonlanコマンドのためのシェル

また、上記は3台に対応

wol用のメール

subjectもしくは本文内に、wolkeyword xxxxx の様に記述してメールする事で良い

lan内でのmailは可能にしていたが、lan外からは出来ていなかった。それへ対応

問題点

lan外にmailしようとしたところ、relay access deniedとなって送信拒否された。
smtp認証が必要との事。 そこでsmtp認証を追加した。

smtp認証追加

main.cfに認証用設定追加

sudo nano /etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_service = smtp
smtpd_sasl_type = dovecot
smtpd_recipient_restrictions = 
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unautcheck_client_access hash:/etc/postfix/reject_client,
  reject_unauth_destination

reject_clentが無いとエラーになったので作成

sudo nano /etc/postfix/reject_client

設定を反映
sudo /usr/sbin/postmap /etc/postfix/reject_client
出来たことを確認
ls -la /etc/postfix/reject_client.db

SMTP認証用のソフトが足りなかったので、追加インストール

sudo apt-get install sasl2-bin

 sudo sasldblistusers2
 sudo chgrp postfix /etc/sasldb2
 sudo chmod 640 /etc/sasldb2
 #sudo mv sasldb2 sasldb2_org
 ls /etc/sasldb2

master.cfのsmtp認証設定の確認

 sudo nano  /etc/dovecot/conf.d/10-master.conf
 
 service auth {
   # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group=postfix

補足:忘れていたのでパスワード再設定

 sudo passwd -d username
 sudo passwd  username

別のアクセスポイントへも接続するためにwifi usbドングル購入しwlan1を追加した

背景

raspiをwifiルーターとvpnサーバーにwifi接続して、外部からwifiルーター配下の機器に接続しようとした。そのため、raspiにwifi接続用ドングルを購入しwlan1として追加した。 なおwlan0は内蔵のwifi。

手順

  • ドライバーの導入  別記事を参照
  • MACアドレスの調査: 内蔵wifiチップ及びUSBドングルそれぞれのMACアドレスを確認する
  • wlan0,wlan1の固定: 内蔵のものをwlan0、USBのものをwlan1として固定する
  • wlan0用及びwlan1用のwpa_supplicantを用意
  • リブート

wlan0,wlan1の固定とwpa_supplicant

sudo nano /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="内蔵wifiのMACアドレス",ATTR{dev_id}=="0x0",ATTR{type}=="1",KERNEL=="wlan*",NAME="wlan0"
SUBSYSTEM=="net",ACTION=="add",DRIVERS=="?*",ATTR{address}=="wifi用USBのMACアドレス",ATTR{dev_id}=="0x0",ATTR{type}=="1",KERNEL=="wlan*",NAME="wlan1"

※ NAMEの設定のところは"="が一個であある事に注意。気づかず2つにしてしまって動かず苦戦した

sudo nano /etc/network/interfaces.d/wlan0

auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan0.conf
wireless-power off

sudo nano /etc/wpa_supplicant/wpa_supplicant_wlan0.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
   ssid="接続するSSIDを記述"
   psk="パスワードを記述"
   key_mgmt=WPA-PSK
}

sudo nano /etc/network/interfaces.d/wlan1

auto wlan1
allow-hotplug wlan1
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant_wlan1.conf
wireless-power off

sudo nano /etc/wpa_supplicant/wpa_supplicant_wlan1.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
   ssid="接続するSSIDを記述"
   psk="パスワードを記述"
   key_mgmt=WPA-PSK
}

sudo nano /etc/dhcpcd.conf

~
interface wlan0
static ip_address=設定
static routers=設定
static domain_name_servers=設定

参考にさせていただいたwebページ

AP作成用だが参考になった https://eetimes.itmedia.co.jp/ee/articles/2003/25/news029_4.html

こちらの方のも参考にっせていただいた

V-antena and Tanimoto's page

あなたはIPv4でアクセスしています