USB

Table of Contents

WiFiのテスト

築20年越えの長屋に住んでいる。入居者減少。困った大家さんは、若者を呼び込む 作戦に出た。WiFi完備って奴ね。オイラーの所にも、そのおこぼれがやってきた。 ネットが無料ですって。これはもう試してみるしかない。問題無ければ、今契約 してるプロバイダーを解約しよう。

ちょいとテストするならOpenBSDがうってつけ。hostname.iwm0を一行編集。そして doas sh /etc/netstert するだけ。どんなIPが付与されたかは、 route -n show -inet ぐらいでいいか。

気になるスピードテストは、 160/145(google), 178/194(speedtest.net) こんぐらい。 でも使ってるとスピードダウン(42/35、 47/21ぐらいに) する事が有る。なんで? ifconfig iwm0すると、

media: IEEE802.11 autoselect (VHT-MCS0 mode 11ac)
ieee80211: nwid myssid chan 48 bssid ab:cd:ef:01:02:03 56% ...
media: IEEE802.11 autoselect (HT-MCS0 mode 11n)
ieee80211: nwid myssid chan 2 bssid ab:cd:ef:01:02:03 82% ...

この2種類が有る事が判明。2.4Gか5Gか、それが問題だ。昔のスペアナってか、モニター を取り出して確認。

#! /bin/sh
ifconfig iwm0 scan  |
sed '/ieee80211:/d' |
awk '/%/{print($7, sprintf("%3d",$4), substr($2,1,13))}' |
sort -nr

今回設置された長屋グループのSSIDは接頭語が同一なので直ぐに判明。で、2.4G帯は、 完全にコンフリクトしてたぞ。輻輳が発生ですかね。 いや、そんな些細な事じゃなくて、WiFi4(11n)か、WiFi5(11ac)の違いが決定的 だろう。

向う3軒両隣で、電波的には、 話の内容がつつ抜けなんですかね。ホテルみたいな巨大施設やライブ会場 では、どうやってこの 問題を解決してるですかね?

まだ設置されたばかりで、使ってるお隣さんは多分居ないはず。それなのに途中から 性能が変化しちゃうってどういう事? ひとつ思い当るのは、 DHCPのリース更新の際に接続チャンネルが変化しないかだ。 得意の10行以内スクリプトで、監視してみる。

#! /bin/sh
org=`ls -l /etc/resolv.conf`
echo $org

while sleep 30 ; do
    now=`ls -l /etc/resolv.conf`
    [ "$org" != "$now" ] && echo $now && org=$now
done

こんなコードで確認してみた。

-rw-r--r-- 1 root wheel 94 Aug 6 05:42 /etc/resolv.conf
-rw-r--r-- 1 root wheel 94 Aug 6 08:04 /etc/resolv.conf

ずっと変化が無かったので、しびれを切らして、netstartしてみたのが、08:04の事だ。 うっかり、このスクリプト監視をしてない時、現象が発現。2.4Gで接続されてたが、 丁度1時間後に5Gで接続されなおした。リースの更新間隔は1時間なんだな。

なお、 初回リースの開始は、こんな風にすると取れるぞ。

fu$ ls -l /var/db/dhcpleased/
total 2
-rw-r--r--  1 root  wheel  86 Aug  6 05:42 iwm0

しつこくlogしてたら、こんなのが採取できた。規則性が無いなあ。

-rw-r--r-- 1 root wheel 94 Aug 7 14:22 /etc/resolv.conf
-rw-r--r-- 1 root wheel 94 Aug 7 15:00 /etc/resolv.conf
-rw-r--r-- 1 root wheel 94 Aug 7 15:13 /etc/resolv.conf
-rw-r--r-- 1 root wheel 94 Aug 7 16:05 /etc/resolv.conf

usb拡張

例の安物USB起動時にユーザーを混乱させてしまうUIになってた。 それを早速修正したテスト版が公開された。確認したらOK。

折角だからこのUSBを抜き差しして使う事にした。そこまではいいんだけど、 デフォでは2GのUSBでも使えるようになってる。16Gまで使えるようにしたい。 そして、そこにqemuを入れたいんだ。

今回は起動した後、fdisk -e sd1 する。それから、edit 3 して、最終容量を 拡張してから保存。

usbfadm して、expand -> glowfs と言う流れ。40分ぐらいかかったぞ。

qemuを入れてUSBのパススルーを試してみたいのさ。

usb debug on OpenBSD

OpenBSD上でqemuにUSBをパススルーする方法を問いてみた。

A: OpenBSDホスト上でQEMUゲストにUSBデバイス(この場合はUSBメモリ "General UDisk")を**パススルー**するには、QEMUがOpenBSDでUSBパススルーをサポートしている必要があります。ただし、OpenBSDはLinuxのような`/dev/bus/usb`や`libusb`によるQEMUのUSBパススルーに**直接は対応していません**。

しかし、以下の2つのアプローチが考えられます:

### ✅ 現実的な解決策(ホストがOpenBSDの場合)

#### アプローチ1: 仮想ディスクとしてマウントする

ホスト(OpenBSD)でUSBストレージ(`sd1`)をQEMUのゲストに**ディスクイメージとして扱わせる**方法です。

#### 手順:

  1. USBメモリのデバイスを確認(すでに確認済み: `sd1`)。
  2. USBメモリを**アンマウント**(安全のため):

    doas umount /dev/sd1i # パーティション名は`disklabel sd1`で確認

  3. QEMU起動時に `-drive` でディスクとして指定:
qemu-system-amd64 -m 512 -nographic -no-fd-bootchk \
  -audiodev sndio,id=snd0 -device AC97,audiodev=snd0 \
  -net nic -net user,hostfwd=tcp::2022-:22 \
  -hda disk \
  -drive file=/dev/sd1c,format=raw,if=none,id=usbstick \
  -device virtio-blk-pci,drive=usbstick
  • `sd1c`は**ディスク全体**のOpenBSD的な表現(`disklabel sd1`で確認)。
  • `virtio-blk-pci` は高速なディスクアクセス。必要に応じて `ide-hd` や `usb-storage` にも変更可。

> ⚠️ 注意: QEMU は OpenBSD では `/dev/sd1` を普通のファイルと同様に開くので、必ず他で使われていない状態にしてください(マウントしていないなど)。

### ❌ 難しい方法(USBパススルーデバイスそのものとして)

QEMUの `-usb -device usb-host,…` を使う方法は**OpenBSDでは基本的に非対応**です。理由は:

  • QEMUのUSBパススルー機能は通常 Linux の `/dev/bus/usb` と `libusb` に依存します。
  • OpenBSDは `libusb` が動作しても `/dev/bus/usb` のような**USBのrawアクセスAPIが存在しません**。

### 🔄 代替案(別の手段でデータ共有したい場合)

#### 方法1: ホストとゲスト間の**ネットワーク越しのファイル共有(SSH/SCP)**

USBメモリをホストにマウントし、ゲストにSCPで送る:

scp /mnt/sd1/somefile user@localhost -P 2022:/path/in/guest

#### 方法2: USBメモリの内容を**イメージ化してQEMUに渡す**

dd if=/dev/sd1c of=usbstick.img bs=1M

そして

qemu-system-amd64 … -drive file=usbstick.img,format=raw,…

### 📝まとめ

方法 OpenBSDで可能か メリット 備考
---------------------------------- ----------- ----------- ----------------
QEMU USBパススルー (`-device usb-host`) ❌ 不可 生USBデバイスの扱い Linux専用機能
デバイスファイルの直接渡し (`/dev/sd1`) ✅ 可 シンプル・安定 ゲストからはディスクとして見える
イメージ化して渡す ✅ 可 柔軟・安全 読み取り専用にもできる
SSH/SCPで共有 ✅ 可 簡単・汎用 OSの設定次第

usb debug with kvm

全てをOpenBSDでやるってのは絶望的。ならば日和ってみる。

A: 以下では Lubuntu 24.04(ホスト)+ QEMU/KVM(ゲスト OpenBSD) で USBメモリ 0930:6544 Toshiba TransMemory をパススルーし、 物理的に抜き差ししたときの OpenBSD 側の挙動を gdb で観察できるようにする手順をまとめました。 最後に「ホスト側の自動マウント抑制」も紹介します。

## 1 . 事前確認 – バス番号とアドレス

$ lsusb
Bus 001 Device 002: ID 0930:6544 Toshiba Corp. TransMemory-Mini
  • Bus = 1 / Addr = 2 と読み取れます。 ──後述する `hostbus=1,hostaddr=2` 指定に使います。
  • またはベンダー/プロダクト ID(0930:6544)だけで指定しても可。

## 2 . USB コントローラを用意する

OpenBSD 6.9 以降なら XHCI が使えるので、ゲストに 1 本だけ追加するとシンプルです。

-device qemu-xhci,id=xhci # USB1/2/3 すべて扱える

## 3 . VM 起動時に「静的に」パススルーする

sudo qemu-system-x86_64 \
  -enable-kvm -m 1536 -nographic \
  -s                           \   # gdb から tcp:1234 で接続可
  -device qemu-xhci,id=xhci    \
  -device usb-host,bus=xhci.0,hostbus=1,hostaddr=2 \
  -net nic -net user,hostfwd=tcp::2022-:22 \
  -hda disk

`usb-host` は `vendorid/productid` でも書けます(ホットプラグの自動再検出が楽)([GitLab][1])。

> 抜き差しイベント > `hostbus/hostaddr` で固定した場合は、抜き差しすると `hostaddr` が変わるため > 再接続後に QEMU Monitor で再 add する必要があります。 > 逆に `vendorid/productid` だけを指定すると、同じデバイスが挿さった瞬間に > QEMU が自動的にゲストへ再アタッチします。

## 4 . Monitor で「動的」にホットプラグする

### 4-1 Monitor へ接続

(qemu) info usbhost # ホスト側 USB 一覧を確認

### 4-2 デバイスを追加 (プラグ)

(qemu) deviceadd usb-host,vendorid=0x0930,productid=0x6544,id=stick

### 4-3 デバイスを削除 (アンプラグ)

(qemu) devicedel stick

Monitor での `deviceadd / devicedel` は QEMU 4.x 以降で共通です([Stack Overflow][2])。

## 5 . パーミッション問題を避ける

ホストデバイス `/dev/bus/usb/001/002` は root のみ読み書き可です。 下記いずれかを選択してください。

  1. **VM を sudo で起動**(手軽だがセキュリティ低下)。
  2. udev ルールで権限を付与 `/etc/udev/rules.d/99-qemu-stick.rules`
SUBSYSTEM=="usb", ATTR{idVendor}=="0930", ATTR{idProduct}=="6544", \
  MODE="0666", TAG+="uaccess"

ルール適用後 `sudo udevadm control –reload && sudo udevadm trigger`.

## 6 . Lubuntu 側で USB の自動マウントを一時停止

### 6-1 LXQt(PCManFM-Qt)の GUI で無効化

`設定 → PCManFM-Qt → 環境設定 → ボリューム管理` 「リムーバブルメディアを自動的にマウント」のチェックを外します([Ask Ubuntu][3])。

### 6-2 バックエンドごと止める(より確実・CLI)

# 一時停止
sudo systemctl stop udisks2

# 再起動後も停止させたい場合
sudo systemctl disable --now udisks2
# 完全に他サービスから起動されないようにするなら
sudo systemctl mask udisks2

udisks2 は多くの DE で自動マウントを司るデーモンです([Baeldung][4])。 停止中でも `mount` コマンドで手動マウントは可能です。

> 元に戻す > `sudo systemctl unmask udisks2 && sudo systemctl enable –now udisks2`

## 7 . OpenBSD 側でのデバッグ

  • QEMU に `-s`(= `-gdb tcp::1234`)を渡しているので、 ホストから:
gdb vmlinux
(gdb) target remote localhost:1234
  • USB 抜き差し時は OpenBSD コンソールに `umass*`, `sd* detached`, `sd* at scsibus…` などが出ます。 カーネルブレークポイント例:
(gdb) b umass_attach
(gdb) b umass_detach

### ✔ これで USB デバイスの実挿抜 → ゲスト OpenBSD のドライバ呼び出し → gdb で追跡

という流れが再現できます。疑問点や追加のトレース方法があれば遠慮なくどうぞ!

[1]: https://qemu-project.gitlab.io/qemu/system/devices/usb.html "USB emulation — QEMU documentation"

[2]: https://stackoverflow.com/questions/60762211/how-to-hotplug-an-usb-device-on-qemu-4-2-0?utm_source=chatgpt.com "How to hotplug an USB device on Qemu 4.2.0?"

[3]: https://askubuntu.com/questions/1468135/how-to-disable-on-lubuntu-22-04-the-opening-of-the-browse-window-when-a-usb-devi "How to disable on lubuntu 22.04 the opening of the browse window when a USB device is automounted? - Ask Ubuntu"

[4]: https://www.baeldung.com/linux/ubuntu-disable-automated-mounting "How to Disable Auto-Mounting of Devices in Ubuntu | Baeldung on Linux"

ChatGPTも質問に対して知らない事は、その場でWeb検索する様になったのね。 昔は有料でサポートしてたな。上の回答を作成するのに55秒も費やしていた。 これば無料ってありがたい。麻薬だ。そのうちに金払えモードに豹変しないか 心配である。 リンクを辿っていったら、原文が出てきた。ここのボリューム項で、自動マウントの 制御ができるのね。

sakae@lu:~$ pcmanfm-qt --show-pref general

ArchWiki QEMU に素晴しい解説があった。

try usb

まずは試験だ。USBのパススルーね。情報入手。

sakae@lu:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0930:6544 Toshiba Corp. TransMemory-Mini / Kingston DataTraveler 2.0 Stick

それを起動スクリプトに反映。ゲストはi386機なんで、ehciを選んだ。

qemu-system-i386 -m 1536 -nographic -no-fd-bootchk -s  \
  -net nic -net user,hostfwd=tcp::2022-:22  \
  -hda disk \
  -device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0930,productid=0x6544

リナの余計な挙動、USBを差したら自動マウントするのをOFFに設定しとく。

sudo boot.sh で起動。だって、USB差したらqemu側でマウント相当をやらせるには、 root権限が必要だからね。

dmesgの一部

pchb0 at pci0 dev 0 function 0 "Intel 82441FX" rev 0x02
pcib0 at pci0 dev 1 function 0 "Intel 82371SB ISA" rev 0x00
pciide0 at pci0 dev 1 function 1 "Intel 82371SB IDE" rev 0x00: DMA, channel 0 wired to compatibility, channel 1 wired to compatibility
wd0 at pciide0 channel 0 drive 0: <QEMU HARDDISK>
wd0: 16-sector PIO, LBA48, 16384MB, 33554432 sectors
wd0(pciide0:0:0): using PIO mode 4, DMA mode 2
atapiscsi0 at pciide0 channel 1 drive 0
scsibus1 at atapiscsi0: 2 targets
cd0 at scsibus1 targ 0 lun 0: <QEMU, QEMU DVD-ROM, 2.5+> removable
cd0(pciide0:1:0): using PIO mode 4, DMA mode 2
piixpm0 at pci0 dev 1 function 3 "Intel 82371AB Power" rev 0x03: apic 0 int 9
iic0 at piixpm0
vga1 at pci0 dev 2 function 0 "Bochs VGA" rev 0x02
wsdisplay0 at vga1 mux 1: console (80x25, vt100 emulation)
wsdisplay0: screen 1-5 added (80x25, vt100 emulation)
em0 at pci0 dev 3 function 0 "Intel 82540EM" rev 0x03: apic 0 int 11, address 52:54:00:12:34:56
ehci0 at pci0 dev 4 function 0 "Intel 82801DB USB" rev 0x10: apic 0 int 11
usb0 at ehci0: USB revision 2.0
uhub0 at usb0 configuration 1 interface 0 "Intel EHCI root hub" rev 2.00/1.00 addr 1
qe$ df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/wd0a     14.5G    3.8G   10.0G    28%    /
mfs:76106      495M    4.0K    470M     1%    /tmp
qe$ usbdevs
Controller /dev/usb0:
addr 01: 8086:0000 Intel, EHCI root hub

いよいよgdbを起動。USBがアッタチされる時にブレークさせる。

(gdb) bt
#0  umass_attach (parent=<optimized out>, self=0xd4a1c200, aux=0xf574c3e8)
      at /usr/src/sys/dev/usb/umass.c:302
#1  0xd09627cb in config_attach (parent=0xd4671300, match=0xd0ef3b24 <cfdata+12800>, aux=0xf574c3e8, print=0xd039ded0 <usbd_print>)
      at /usr/src/sys/kern/subr_autoconf.c:417
#2  0xd0962436 in config_found_sm (parent=0xd4671300, aux=0xf574c3e8, print=0xd039ded0 <usbd_print>, submatch=0x0)
      at /usr/src/sys/kern/subr_autoconf.c:327
#3  0xd039dd3c in usbd_probe_and_attach (parent=0xd4671300, dev=0xd4a13e00, port=1, addr=2)
      at /usr/src/sys/dev/usb/usb_subr.c:932
#4  0xd039e622 in usbd_new_device (parent=0xd4671300, bus=0xd466d800, depth=1, speed=3, port=1, up=0xd466f100)
      at /usr/src/sys/dev/usb/usb_subr.c:1221
#5  0xd05ef55c in uhub_port_connect (sc=0xd4671300, port=1, status=<optimized out>)
      at /usr/src/sys/dev/usb/uhub.c:596
#6  0xd05ef119 in uhub_explore (dev=0xd4671100)
      at /usr/src/sys/dev/usb/uhub.c:425
#7  0xd03f0017 in usb_explore (v=0xd4671080)
      at /usr/src/sys/dev/usb/usb.c:838
#8  0xd03f03b1 in usb_task_thread (arg=<optimized out>)
      at /usr/src/sys/dev/usb/usb.c:418
#9  0xd0c5cfa8 in proc_trampoline ()

consoleには、こんなkernelからの報告が有った。

qe$ umass0 at uhub0 port 1 configuration 1 interface 0 "TOSHIBA TransMemory" re0
umass0: using SCSI over Bulk-Only
scsibus4 at umass0: 2 targets, initiator 0
sd0 at scsibus4 targ 1 lun 0: <TOSHIBA, TransMemory, 1.00> removable serial.093A
sd0: 7400MB, 512 bytes/sector, 15155200 sectors

qe$ usbdevs
Controller /dev/usb0:
addr 01: 8086:0000 Intel, EHCI root hub
addr 02: 0930:6544 TOSHIBA, TransMemory

etc

オープンソース開発と、あるフレームバッファコンソールの話

NetBSDにおけるデバイスドライバの読み方・書き方

RubyのPathnameライブラリが本体組み込みになったらGC周りのテスト失敗

NetBSDでUSBメモリをフォーマットしてみる

河豚板USB版でemacsは何も処理してないのに、C + \ したら漢字変換が動作した。 .emacsにこんな設定が残っていたぞ。こいつの仕業だな。

(setq quail-japanese-use-double-n t)

どんな変換が出来るの? C + h v して変数の所在地を探してみた。

quail-japanese-use-double-n is a variable defined in ‘quail/japanese.el’.

ソースに変換キーの説明が出ていたぞ。ちょいと使うには便利。

;; ローマ字入力及び仮名漢字変換による日本語入力メソッド
;;
;; この入力メソッドでの日本語の入力は二つのステージ「ローマ字仮名変換」
;; と「仮名漢字変換」からなる。最初はローマ字仮名変換のステージで、ス
;; ペースキーを押すことにより、次のステージ「仮名漢字変換」へ進む。
;;
;; 「ローマ字仮名変換」
;;
;; 平仮名は小文字キー(列)を打つことにより入力。句読点、括弧類は対応
;; する英字キーを打つことにより入力。その他のシンボルは `z' に続けて何
;; れかのキーを打つことにより入力。下に全ての可能なキーシーケンスリス
;; トアップされている。入力された文字は下線で示される。
;;
;; さらに以下のキーで特別な処理を行う。
;;
;; K    平仮名を片仮名に、あるいは片仮名を平仮名に変換
;; qq   この入力メソッドと `japanese-ascii' 入力メソッドをトグル切替
;; qz   `japanese-zenkaku' 入力メソッドにシフト
;;      qh と打てば元に戻る
;; RET  現在の入力文字列を確定
;; SPC  仮名漢字変換に進む

README

Copilot基本が学べる教科書 なんて本が図書館の新刊コーナーに置いてあったので 読んでみた。こういうAIがらみの書籍は鮮度が命で、すぐに陳腐化するからね。

Copilotってマイクロソフトのアプリなんだね。それをエッジに結合したやつも あるとな。もう十分に一般化されてて、挨拶文だとか規格書なんてAIに丸投げ していいよとな。キラリと光るアイデアとかは出てこないのかね。だって、AI なんてのは、学習してきたものを並び直してるだけだから。

「コパイロット」の20万件のチャットからわかったAIに最も影響を受けやすい職業と、受けにくい職業とは

その点、 機械ビジネス この本で謳われている、ものづくりの力は「国力」そのものって 方が、地に足がついてて好ましいと思うぞ(個人の感想です)。


This year's Index

Home