ラズパイ5のデスクをUSB SSD(SATA)にしてみた

以前の記事でNVMeのSSDにした記事掲載しましたが、どうも安定して動作しないので結局SDカードに戻してましたが、今回USBのSATA SSDのケース買ってそこにイメージ写してシステムデスク(128GB SATA SSD)を変更してみた

<SDカードをUSB SSD化する>

SD Card Copierで丸ごとコピー(New Partition UUIDsにチェック忘れずに)

再起動で、

・boot orderの確認
pi@rasp5:~ $ sudo rpi-eeprom-config
[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf146	#NVMe / USB / SDカードのオーダー
PCIE_PROBE=1

Sdカードよりも優先順位は高くなっているけど最優先にする

$ sudo rpi-eeprom-config --edit

で変更してrebootで、

$ sudo rpi-eeprom-config
[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf164
PCIE_PROBE=1

SDカードは抜いてないから見えてるけど、USB SSDに切り替わった、loopxはsnapで仮想的にインストールされたモジュールが割り当てされるドライブネームなのでmountpointsは/snapから始まっている

ついでに性能測定、

     Category                  Test                      Result     
HDParm                    Disk Read                 361.17 MB/sec            
HDParm                    Cached Disk Read          327.60 MB/sec            
DD                        Disk Write                292 MB/s                 
FIO                       4k random read            29510 IOPS (118040 KB/s) 
FIO                       4k random write           24323 IOPS (97292 KB/s)  
IOZone                    4k read                   44614 KB/s               
IOZone                    4k write                  42302 KB/s               
IOZone                    4k random read            22563 KB/s               
IOZone                    4k random write           44361 KB/s               

                          Score: 12810         

sdカードに比較して書き込みは一桁上、MVNEe SSDのPCIe接続に比較すると1/3~1/4ぐらい、そんなものかな(以下のリンクは過去記事)

ラズパイ5のドライブをSSDにする

実装はこんな感じ、chatbotのエンビパイプの中に収めてる、

ケースは、

https://www.amazon.co.jp/dp/B0C2D1ZZGW?ref=ppx_yo2ov_dt_b_fed_asin_title

 

admin

Luantiサーバーのインストールとsnap

Wi-Fi内でローカルで使うためのLuantiサーバー、色々やってみたけど結局行き着いたのはラズパイ5

① wsl2:一見筋が良さそうだけど、Windowsのセキュリティを乗り越えられない、つまりportが通らない

② USB SSDでLinux:これだとWindows関係なくなるから筋は良さそうなのだけど、HP NoteBookのUEFIのガードが固くてUSB SSDのbootができない、bootableと認識していないということ

③ MacのVMware FusionのUbuntuで立ち上げる:これはMacBookのローカルからだと仲間と認識してもらえるけど、外部からは同様の問題がある、Fusion Proだと同じネットワーク内のアドレス取得されるから良さそうだけど、結局***.localは使えないよね

④ ラズパイ5:これがおそらく一番素直、つまり仮想マシン配下に構築すると必ずネットワークが通らないための工夫が必要だけど、専用機なら何ら問題ないしmDNSも使えるから固定I Pである必要もない

<ラズパイ5でのインスト手順>

ここでsnapが出てくる、aptではLunatiが結構古いバージョンだったりするらしくて、最新版を取得するならばsnapを使う、ソースコンパイルという手段もあるけど結構手間ではある

$ sudo apt update
$ sudo apt install snapd

snapとはLinuxにおける新たなパッケージ管理ツール(アプリ単位の隔離で依存関係を全部まとめることでosから切り離されるからaptでインストールできないアプリもインストールできる)、サイズと起動時間がネックかなFlatpakがデスクトップアプリでsnapはサーバーサイドアプリという棲み分けかな、起動時間とか問題なること少ないし
https://www.choge-blog.com/programming/ubuntu-snap/

$ sudo reboot

snapdの最新版をsnapでインストールする
$ sudo snap install snapd

$ sudo snap install luanti

snapのラズパイ用のLuantiはクライアントとサーバーが兼用らしい

$ luantiで起動して作成ずみのworldをDLしてデフォルトに設定する

$ cat ~/snap/luanti/common/.minetest/minetest.conf 
server_announce = false
maintab_LAST = online
enable_damage = true
creative_mode = false
mainmenu_last_selected_world = 1
default_game = minetest 


$ mkdir -p ~/snap/luanti/common/.minetest/games/
$ cd ~/snap/luanti/common/.minetest/games/
$ git clone https://github.com/luanti-org/minetest_game.git minetest

起動
$ luanti --server --worldname test --gameid minetest --port 30000

2025-12-24 19:33:28: WARNING[Main]: system-wide share not found at "/usr/share/luanti"
2025-12-24 19:33:28: WARNING[Main]: system-wide share found at "/snap/luanti/11/usr/bin/../share/luanti"
2025-12-24 19:33:28: [Main]: Using world specified by --worldname on the command line
2025-12-24 19:33:28: [Main]: Using game specified by --gameid on the command line
 _                   _   _ 
| |_   _  __ _ _ __ | |_(_)
| | | | |/ _` | '_ \| __| |
| | |_| | (_| | | | | |_| |
|_|\__,_|\__,_|_| |_|\__|_|  ___ 5.14.0
2025-12-24 19:33:28: ACTION[Main]: World at [/home/pi/snap/luanti/common/.minetest/worlds/test]
2025-12-24 19:33:28: ACTION[Main]: Server for gameid="minetest" listening on [::]:30000.

クライアントの画面

snapは起動時間が長くなるというけど、サーバーなら起動しちまえば終わりだから問題にはならない、sdカード使ってるけど特にレスポンスが遅いとも感じない

 

admin

ラズパイのsdカードイメージのバックアップと復元

すぐにやり方忘れるので、過去記事に見当たらないので作成

<環境>

MacBook Pro M4/Tahoe

SDカード:ラズパイ5で使っている64GBのSDカード

 

<手順>

・Macに差し込んでdisk番号の確認

% diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:             Apple_APFS_ISC Container disk1         524.3 MB   disk0s1
   2:                 Apple_APFS Container disk3         994.7 GB   disk0s2
   3:        Apple_APFS_Recovery Container disk2         5.4 GB     disk0s3

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +994.7 GB   disk3
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            12.2 GB    disk3s1
   2:              APFS Snapshot com.apple.os.update-... 12.2 GB    disk3s1s1
   3:                APFS Volume Preboot                 8.1 GB     disk3s2
   4:                APFS Volume Recovery                1.2 GB     disk3s3
   5:                APFS Volume Data                    455.7 GB   disk3s5
   6:                APFS Volume VM                      5.4 GB     disk3s6

/dev/disk4 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +17.3 GB    disk4
   1:                 Apple_APFS Container disk5         17.3 GB    disk4s1

/dev/disk5 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +17.3 GB    disk5
                                 Physical Store disk4s1
   1:                APFS Volume iOS 17.4 21E213 Simu... 16.8 GB    disk5s1

/dev/disk6 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk6
   1:                 Apple_APFS Container disk7         1.0 TB     disk6s1

/dev/disk7 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +1.0 TB     disk7
                                 Physical Store disk6s1
   1:                APFS Volume Extreme SSD             370.5 GB   disk7s2

/dev/disk8 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        +17.6 GB    disk8
   1:                 Apple_APFS Container disk9         17.6 GB    disk8s1

/dev/disk9 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +17.6 GB    disk9
                                 Physical Store disk8s1
   1:                APFS Volume iOS 17.5 21F79 Simul... 17.0 GB    disk9s1

/dev/disk11 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *61.9 GB    disk11
   1:             Windows_FAT_32 bootfs                  536.9 MB   disk11s1
   2:                      Linux                         61.4 GB    disk11s2

最後の/dev/disk11が該当

・該当diskをunmountする

mountしたままではMacOSの配下にあって、キャッシュとかでまともにバックアップが取れないと

% diskutil unmountDisk /dev/disk11
でunmountする

・ddコマンドでバックアップイメージの作成

% sudo dd if=/dev/disk11 of=rasp5_chatbot.img bs=1m
でbackupが時間はかかる(おそらく30分近くかな)けど作成される

59024+0 records in
59024+0 records out
61891149824 bytes transferred in 1211.657719 secs (51079731 bytes/sec)

<復元>

復元時も同様にdisk番号取得してsdカードに書き込み(x)には取得したsdカードのdisk番号を入れる

% sudo dd if=rasp5_cahtbot.img of=/dev/disk(x) bs=1m

 

admin

OS再インストールのレベルかい

HPのWindowsマシンで複数アカウント作って、複数アカウントがログイン状態で、強制電源断を何回かやってたら、ネットワーク関連の設定ファイル壊れて手動での復旧ができなくなった

サーバー管理者などは必ずログオフ確認して電源断するようですが、民生のパソコンでそんな簡単に壊れるとはつゆ知らず

しかしクリーンインストールもなかなか一筋ではいかなかった

クリーンインストールの留意点(USBメモリはminmum 8GBにWindows11のマルチエディション版をMedia Creation Toolで書き込み)

・BIOS設定でSecure Bootはdiableにする(そうしないとUFEIはUSB bootは大概はじく)

NTFS形式ではHPのUEFIは受け付けない(Rufusだとそれしか選べないから次のMedia Creation Toolの出番)

・Media Creation ToolでFAT32形式で作ると認識してくれた

・ただしM2 SSDのbootはdiableしないと例えUSB bootを最上位にしてもUSBから起動しないでWindows立ち上がる、対策はM2 SSDのbootをdisableする

・USBからのインストール完了後のリブートでM2 SSDのbootをenableする手操作必要(これやらないとUSBメモリからインストールが繰り返してセットアップが起動しないから永久ループする)

以上でようやく再インストールできた、試行錯誤で所要時間10時間近く、他に正常に使えるWindowsマシンがないと復旧できなかった

<教訓>

『クライアントPCでもマルチユーザ作って運用しても、同時ログオンはせずに必ず一人ログオンで運用しろ』

 

admin

CMOS バックアップ電池交換

久々のwindowsマシン

昨日の記事のパソコン(2021年モデル)、2台ともセットアップ時にCMOSバックアップ電池Lowアラーム出てたから交換した

ELITEBOOKの電池交換は簡単にできるけど、電池の手配間違った、現物見るとCR1620、手配品は信頼のPanasonic CR2032、当然ノートパソコンの狭いスペースには収まりませんから、回避策必要でした

① 事前準備

SSDが暗号化されていると復元できない可能性あるとのことで、シャットオフ前に暗号化無効にしておく、一台はメニューが見えない、結果として暗号化されてない模様

 

②  電池へのアクセス

裏蓋の5箇所のネジ外して、クリップで止まっているのを軽く抉ると外れてくる

電池パックのコネクタ外して、ねじ止め4箇所を外して、持ち上げる(反対側はクリップされてる)と簡単に外れる

この時点で電池小さくない?と思う、確かに小さいからこのスペースには厚みも横幅も収まらない

 

③ 対策を考える

よく見ると、DIMMスロットは一個しか使ってなくて、一個空いてますね、ここにおけばいいんじゃない、元々コネクタとケーブルは流用のつもりだったしね

で電池からケーブル根元で切って、新しい電池に半田付けとシュリンクチューブで絶縁

取り外した電池の電圧は1.56/1.26Vだったから、放電の最終状態だから程なく終わりを迎える状態、新品だと3.3V近くあります

 

④ 元に戻す

電池はテープで絶縁して、両面テープで貼り付ける

 

最初の電源投入ではCMOSバッテリーエラ〜になるけどリブートで問題なく立ち上がり、SSD暗号化を有効にしている間にNTPで時計は正常に戻ってる

容量はCR2032が二倍以上あるから、もう交換する可能性は限りなくないね、しかし4年で終了というのは感覚的に短すぎのように思うよ

 

admin

久々のwindowsマシン

久々にWindowsを触る機会、貸し出し用に某ルート経由で提供を受けたWindowsマシン2台、ほぼ6年半ぶりぐらいで触るので結構Windowsの世界も変わっている

① セットアップはやたら面倒(設定次第だから):最初日本語しか使えない状態で、最初の言語指定を英語にしないとセットアップがうまく継続できなかった、セットアップ後に日本語追加とかの手順必要

② オリジナルはWindows10だったのでWindows11にアップデートも結構なステップの作業が必要

これらはエコシステムが閉じてないWindowsの世界だからそうなんだろう

③ WSL2は初めて触ったけど軽量VM上で動かしているらしく、立ち上げはVMWareなどの比べると高速、ユーザ空間だけで使うならWSL上のOS(Ubuntu入れたけど)で問題ないと思うよ

メモリ16GB/SSD 256GBあって2021年モデルなので、小学生が学習用で使うには全く問題ない仕様です

管理者用のアカウントと別にユーザアカウント作って、メンテはできるようにしてあります、ユーザアカウントでもWindowsアプリインストールできないと不便なので管理者権限は与えてありますが、WSLはユーザごとに独立だからそこは便利

Windows OSと直接関連はないけど、マウスの操作感はイマイチ、勝手に入力されるし

 

admin

STM32のクロック系について

今頃気づいたのかという話ですが、STM32のクロック系にはPLLがあるので、任意の周波数にアップコンバートできます、従ってST-Linkの水晶発振器を使ってそれを基準周波数に使えば(Nucleoを切り離さない限り)、安定したクロックになります

で、ST-Linkの水晶使って最大動作周波数に設定した時のコンフィグは以下の通り

前の記事、

https://isehara-3lv.sakura.ne.jp/blog/wp-admin/post.php?post=5082&action=edit

ではこういうコンフィグ

従ってペリフェラルだけじゃなくて、MCUやDMAのクロックまで落とされていました

ちなみにこの状態でADCのCounter Settingを変更して前回と同じサンプリング周波数(10KHz)にした時の実行時間は、

なぜ時間測定がクロック周波数変えても変わらないのか疑問に思いましたが、以下のコードに見るようにクロック周波数は時間の分解能を決めてはいますが、経過時間には無縁だから

float getTimeUs(uint32_t count)
{
  float us = 1000000 * (float)count / (float)SystemCoreClock;
  return us;
}

前回の実行時間は12,829μsだったので微妙に速くなっています、DMA中の処理時間は見えてこない(8MHzで間に合ってしまう)だろうから、それ以外の前後のMCUの処理時間の84MHzと8MHzのクロック周波数の差分だろうと思います

クロックの種類がたくさんありますが、大きく用途ごとに分類すると、

・HCLK:MCU周りのバスクロック

・FCLK:MCUのコアクロック

・APB1:peripheralは低速の周辺デバイスI2C, USART2/3, SPI2/3, CAN, PWR などで最大42MHz、timer clockはTim2~7用

・APB2:APB1より高速の周辺デバイス用でTIM1, ADC, GPIOなど、timer clockは相対的に高速なTim1用

 

admin

ADCの変換タイミングを外部(Timer)で決めてやる

時間測定が、

STM32での実行時間測定(DWT機能を使う)

でできるようになったので、次は今までfree runだったADCとDMA転送に対してADCの変換タイミングをTimerで決めてやることにします

ただ、この場合に内部のRC発信器使うのでは精度も安定性も確保できないので、幸いNucleoではST-Linkボード上の水晶発信器(8MHz)を取り込むことが可能なので、その信号を基準値として使います

<実行環境>

・M4 MacBook Pro Tahoe

・CubeIDE 1.19.0

・STM32F401re

 

<まずはペリフェラルクロックだけ変えてみた:これ間違い、次の記事でクロック系を記述>

クロックの切り替えは単純でMXのClock Configulationの設定を変えるだけ、System Clock MultiplexerでHSIからHSEを選択するだけ

ちなみにこの状態で同じ条件(128ワードのDMA転送実施)すると、HSI使ってたときにはおよそ94μsが、

504μsに変化、system clockは変化してないのでDMA転送とかは高速のままだろうから10倍遅くはならない

 

<ADCの変換タイミングにtimer 3を使う>

timer2は時間測定用に使っているのでTGO(ADCにトリガーかける機能)があるtimer3を使う

・ADCの設定

変換タイミングExternal Trigger ConversionをTimer3のTGOにするのと、後で述べますがContinuous Conversion ModeをDisabledにするのが大切

 

・Timer3の設定(サンプリング周期を10KHzにするようにしたのとADCの起動用にTrigger Event SelectionをUpdate Eventにする)

・ソースコード(該当部分)

ADCスタートするのと合わせてtimer3もスタートする

 

<実行結果>

なんか変だよね、これが先ほどのContinuous Conversion ModeをDisabledと関連していて、ADCにタイマーで変換タイミング作ってもADCのMXで以下の設定変更しないと機能しない

Continuous Conversion = Disable

実はタイマーでサンプリング周期決めたいのに、これがEnableだと以降のタイマートリガは無視してADCは勝手に変換実行してDMA転送してしまうからこのような値になった訳

でDisableにすると、

128wordsで100μs間隔のサンプリングだと、これで正しい

STM32は多機能で設定次第で如何様にも動作させられるから、それゆえはまりどころも多いということ

 

admin

STM32での実行時間測定(DWT機能を使う)

これもデバッグ時にはほぼ必須の機能である実行時間の測定方法についてです

STM32 タイマーを使って処理時間を計測する

を使ってみました、DWT機能というのはData Watchpoint and Trace Unitの略でArm Mコアで正確な時間測定を行う時に使われる機能のようです

<動作環境>

・M4 MacBook Pro Tahoe

・CubeIDE 1.19.0

・STM32F401re

<セットアップ>

例にあるDWT.hとDWT.cというファイルを作成してそれぞれ、Core / IncとCore / Src以下に配置します

https://isehara-3lv.sakura.ne.jp/blog/2025/12/05/adcをdma転送で実行してみる/

の記事のコードに追加してADCのDMA転送の時間を測定してみました

タイマーの初期化処理は、

__IO表記はC言語におけるvolatileのalias表記です

ソースコードはこんな感じ、最初if文の直後においてましたが、測定結果が複数回実行しても変わらないので、cnt++行の後に移動して結果と比較

<実行結果>

最初のコードでの実行時間

ログポイントをずらした結果

確かに差分で0.1μsぐらい増加してますね

この時間がどう決まるかというと、DMAで128words転送しているので、一回あたりおよそ0.73μs、MXの設定でADC_Resolution設定のサンプリング間隔(TSMP = 15 ADC cycles)、クロック84/4 MHzだと0.71μsだからほぼ一致、という計算でいいのかな

時間測定としてこの方法は多少の細工は必要ですが、測定結果は正確であるように思います

 

admin

CubeIDEでのコンソールへのデバッグ出力(Macでは不完全)

推奨はUART使うらしいですが、簡単に実行するにはデバッグコンソールに出したいよね、ということでやってみたけど限定的にしか使えないから補助的な使い方になりそうだ

<環境>

・M4 MacBook

・CubeIDE 1.19.0

・STM32F401re

 

<手順>

以下にわかりやすく手順が記されていたので実行してみた

STM32CubeIDEでprintf【SWO編】

SWV(Serial Wire Viewer)を有効にする、SWV経由でデバッグコンソール(SWV ITM Data Console)に出力ということのようらしい

/* USER CODE BEGIN 4 */
int _write(int file, char *ptr, int len)
{
  int DataIdx;
  for(DataIdx=0; DataIdx<len; DataIdx++)
  {
    ITM_SendChar(*ptr++);
  }
  return len;
}
/* USER CODE END 4 */

int _write()関数の実装が必要、実は元の実装がweak指定でそのオーバーライド関数になってます

ITM Stimulus ポートにチェック、このポートを使うらしい

デバッグ用のprintf文は二箇所に入れてみた

  /* USER CODE BEGIN 1 */
	printf("---------------0078\r\n");
  /* USER CODE END 1 */

  /* USER CODE BEGIN WHILE */
	while (1) {
		if (adc_conv_complete_flag == 1) {
			adc_conv_complete_flag = 0;
			printf("---------------0111\r\n");
			// delay for 500 Milliseconds
			//HAL_Delay(500);
		}
	}
    /* USER CODE END WHILE */

埋め込みは、このプロジェクトの中のソースに、

https://isehara-3lv.sakura.ne.jp/blog/wp-admin/post.php?post=5058&action=edit

なぜおまじないのような”———“が入っているか、それはApple silicon(Intelでも同じかも)のMacではST-LINKの動作がイマイチ不安定で、

終わりの方の文字しか出力されない現象、ループ中では全部出力されてるけどもね、デバッガで変数の値を見れる環境ならば、最低限ここは通ったよという行数情報だけでも良さそうだからこうやってみた、但しwhile()中では出力されない時とまとめて二行出力される時とかあって不安定な雰囲気

FreeRTOSの場合には、タスク優先度考慮必要でちょっと違うみたいだね

 

admin