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のゲストに**ディスクイメージとして扱わせる**方法です。
#### 手順:
- USBメモリのデバイスを確認(すでに確認済み: `sd1`)。
USBメモリを**アンマウント**(安全のため):
doas umount /dev/sd1i # パーティション名は`disklabel sd1`で確認
- 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 のみ読み書き可です。 下記いずれかを選択してください。
- **VM を sudo で起動**(手軽だがセキュリティ低下)。
- 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
RubyのPathnameライブラリが本体組み込みになったらGC周りのテスト失敗
河豚板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に最も影響を受けやすい職業と、受けにくい職業とは
その点、 機械ビジネス この本で謳われている、ものづくりの力は「国力」そのものって 方が、地に足がついてて好ましいと思うぞ(個人の感想です)。