2026年06月16日

devpath を使ったUSB機器のデバイスファイル名固定

同じ機器を複数つないだ場合、デバイスファイル名の数字は入れ替わることが普通にある。
devpath(物理ポートの番号)を使って、別途デバイスファイル名をつけて固定する方法を記載する。
※ここではシリアルデバイスと想定

まず、/dev/ttyACM0〜/dev/ttyACM2がすでに存在するとして。

目的は/etc/udev/rules.d/99-serial.rules(なければ作る)に以下のような内容を記載する。
ーーーーーーーーーーここから
SUBSYSTEM=="tty", ATTRS{devpath}=="4.2",   SYMLINK+="ttyTH0", GROUP="dialout", MODE="0660"
SUBSYSTEM=="tty", ATTRS{devpath}=="4.1",   SYMLINK+="ttyTH1", GROUP="dialout", MODE="0660"
SUBSYSTEM=="tty", ATTRS{devpath}=="4.3",   SYMLINK+="ttyTH2", GROUP="dialout", MODE="0660"
ここまでーーーーーーーーーー

ATTRS{devpath}の値は udevadm info -a -n (デバイスファイル名) | grep devpath を実行
例:
udevadm info -a -n /dev/ttyACM0 | grep devpath

Udevadm info starts with the device specified by the devpath and then
    ATTRS{devpath}=="4.2"
    ATTRS{devpath}=="4"
    ATTRS{devpath}=="0"
この最初のATTRS{devpath}=="4.2"をそのまま99-serial.rulesに記載することになる。
同様、/dev/ttyACM1がATTRS{devpath}=="4.1" /dev/ttyACM2がATTRS{devpath}=="4.3"だった場合が上記例となる。

記載して保存したら以下を実行
sudo udevadm control --reload-rules
sudo udevadm trigger



ーーーーーー
USBのデバイスリセット
一度クローズすると再オープンに失敗することがある。この場合はUSBリセットが必要。
その場合はUSB バスアドレス(bus/device 番号)が必要

/dev/ttyACM0 → /dev/bus/usb/003/013
/dev/ttyACM1 → /dev/bus/usb/003/008
/dev/ttyACM2 → /dev/bus/usb/003/009
のように、/dev/bus/usb/(バス番号)/(デバイス番号) で表現される。

バス番号は以下で取得
udevadm info -a -n (デバイスファイル名) | grep busnum
例:
udevadm info -a -n /dev/ttyACM0 | grep busnum
    ATTRS{busnum}=="3"
    ATTRS{busnum}=="3"
    ATTRS{busnum}=="3"
の先頭行の3が対象。3桁0パディングは単なる慣習みたいだけど従っておくのが無難

デバイス番号は以下で取得
udevadm info -a -n (デバイスファイル名) | grep devnum
例:
udevadm info -a -n /dev/ttyACM0 | grep devnum
    ATTRS{devnum}=="13"
    ATTRS{devnum}=="5"
    ATTRS{devnum}=="1"
の先頭行の13が対象。これも3桁0パディングは単なる慣習みたいだけど従っておくのが無難

USBデバイス初期化は以下のようなコードで行う。
ttyACM0を初期化したい場合octl(fd, USBDEVFS_RESET, 0)を使う。そのためにopenするが、openの為にUSB バスアドレスが必要だった、という話。

char devices[] =  "/dev/bus/usb/003/013";

int fd = open(devices, O_WRONLY);
if (fd < 0) 
    perror("open");
else
{
    if (ioctl(fd, USBDEVFS_RESET, 0) < 0)
        perror("ioctl");
     close(fd);
}

posted by すら at 22:44| Ubuntu

2026年03月11日

Windows アプリからローカルのUbuntuにSSHで接続してシャットダウン


PuTTYのPlink.exeを使う場合

plinkダウンロード
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
のAlternative binary filesから、plink.exeの項を探し、該当する環境のものをダウンロードする。

インストールはファイルを置くだけ。

通常、plinkはホスト鍵の事前登録が必要で、手順は
plink.exe user@192.168.1.10
のようにまずは実行し、以下が出力される。
The server's host key is not cached...
Store key in cache? (y/n)
でyを押すことによりホスト鍵が自動登録される。

だが、諸事情で同じIPだがCPUが変わるとかの場合はホスト鍵チェックをしないのが無難で。
この場合以下のように -hostkey * -batch をつけることになる。

plink -ssh user@192.168.1.10 -hostkey * -batch "sudo shutdown -h now"


※なおlibssh2を使う方法もあり。でもC++Builderではいばらの道かもしれない。


posted by すら at 10:39| 日記

2026年01月22日

Ubuntuを入れたSSDをUbuntuPCにバックアップ&復元

※先のUSBディスク同士のコピーよりこっちのほうが早かったりすることも。

構成例 マスターSSDをUbuntuPCにUSB接続で
sda1   1MB      ← bios_grub(GPT + Legacy BIOS 用)
sda2   513MB    ← EFI
sda3   1.9TB    ← ext4(Ubuntu本体)


§1. sdaをバックアップ

@GPT(パーティションテーブル)
sudo sgdisk --backup=table.gpt /dev/sda

Asda1(bios_grub)
sudo dd if=/dev/sda1 of=~/master_sda1.img bs=1M status=progress

Bsda2(EFI)
sudo dd if=/dev/sda2 of=~/master_efi.img bs=4M status=progress

Csda3(ext4 本体)
sudo partclone.ext4 -c -s /dev/sda3 -o ~/master_sda3.img

§2. バックアップをsdbに復元

@ GPT を復元
sudo sgdisk --load-backup=table.gpt /dev/sdb
sudo partprobe /dev/sdb

A sda1イメージ → sdb1
sudo dd if=~/master_sda1.img of=/dev/sdb1 bs=1M status=progress

B sda2イメージ → sdb2
sudo dd if=~/master_efi.img of=/dev/sdb2 bs=4M status=progress

C sda3 イメージ → sdb3
sudo partclone.ext4 -r -s ~/master_sda3.img -o /dev/sdb3

続きを読む
posted by すら at 12:30| 日記

同一容量のSSDのコピー@Ubuntu

マスター側をsda、コピー先をsdbとする

前提
sda1   1MB      ← BIOS/GRUB 用の「bios_grub」領域(GPT用)
sda2   513MB    ← EFI(FAT32)
sda3   1.9TB    ← ext4(Ubuntu本体)


@ GPT/パーティションテーブルをコピー(数秒)
sudo sgdisk --backup=table.gpt /dev/sda
sudo sgdisk --load-backup=table.gpt /dev/sdb

A sdb を一度読み直す(重要)
sudo partprobe /dev/sdb

B 1MB の bios_grub 領域(sda1 → sdb1)を dd でコピー
sudo dd if=/dev/sda1 of=/dev/sdb1 bs=1M status=progress

C EFI パーティション(sda2 → sdb2)を dd でコピー
sudo dd if=/dev/sda2 of=/dev/sdb2 bs=4M status=progress

D ext4 本体(sda3 → sdb3)を partclone で高速コピー
sudo partclone.ext4 -b -s /dev/sda3 -o /dev/sdb3

E 念のため fsck(任意)
sudo fsck -f /dev/sdb3


※Copilot出力

posted by すら at 10:59| Ubuntu

2025年10月10日

GPS(GNSSモジュール)を使うときの u-blox の u-center

GPS(GNSS)のモジュールを使ってあれこれしたい場合。
u-blox社(スイスに本社)のモジュールを使用したものが何かと都合が良い。
https://www.u-blox.com/en

u-center(ユーセンター)という、u-blox社公式のGPS/GNSSモジュール設定・モニタリングツールがあり、ダウンロードして使用可能。
Windows用アプリケーション
https://www.u-blox.com/en/product/u-center
ユーザーガイド
https://content.u-blox.com/sites/default/files/u-center_Userguide_UBX-13005250.pdf


u-centerはBeritianのBE-180など、u-blox互換のモジュールが乗っているものにも使える。
逆にこれがないと細かい設定ができない、まである。
posted by すら at 17:09| 日記

正確な時刻を扱う(Windows PCをStratum 1 NTPサーバにする)

タイムサーバー等のメーカー、MeinbergでNTPのプログラムがダウンロードできる。
https://www.meinbergglobal.com/english/sw/ntp.htm#ntp_stable

Linuxで1PPSをUSB経由で入力するドライバ
https://www.meinbergglobal.com/english/sw/#linux

などなど、色々ありそうであった。


posted by すら at 12:08| 日記

2025年09月24日

組込用Ubuntuに入れておくべきツール

※以下、/path/to や your_program は環境や実行ファイル等にあわせて書き換えること

1)socat (SOcket CAT:標準出力をTCP接続へ渡す)
<使用例>
/path/to/your_program | tee -a output.log | socat - TCP4:127.0.0.1:12345
・your_program 実行して、
・標準出力を 画面に表示しつつ、 outlput.logに 追記
・標準出力を TCP 接続で 127.0.0.1 port 12345  に送信。

※補足
接続は色々設定できる。
標準出力 → TCP へ転送
your_command | socat - TCP:192.168.0.10:5000
標準出力 → ローカルで待ち受け(他プロセスに渡す)
your_command | socat - TCP-LISTEN:5000,reuseaddr,fork
標準出力 → UDP で転
your_command | socat - UDP:192.168.0.10:5000
シリアルコンソール → TCP/UDP へ転送(双方向対応)
socat -d -d /dev/ttyUSB0,b115200 TCP-LISTEN:5000,reuseaddr,fork
TCP → 標準出力(逆方向)
socat TCP-LISTEN:5000,reuseaddr,fork -

リアルタイム性が重要でバッファリングを避ける場合、コマンドにstdbuf -o0を付ける
stdbuf -o0 your_command | socat - TCP:192.168.0.10:5000

途切れ対策
reuseaddr 同じポートで再起動許可の指定
fork 複数クライアント対応(TCPの場合)
を付ける。両方付けた方が無難
なお、 - は標準入出力(コンソール)へ接続を示す

UDPで送出先のポートが閉じるとICMP Port Unreachable が発生して送出側が止まる
止まらなくするには
SEND-TOを使う
socat - UDP-SENDTO:192.168.0.10:5000
raw UDP をs使う
socat -T0 - UDP-SENDTO:192.168.0.10:5000


<決定版>
stdbuf -oL -eL /path/to/your_program | tee -a "logfilename" | socat - UDP-SENDTO:192.168.166.70:5000

2) valgrind (メモリリーク、未初期化メモリの使用、無効なメモリアクセスなどを検出するツール)
<使用例>
 sudo -S valgrind -s --log-file=/path/to/logfile.log --track-origins=yes --leak-check=full --show-leak-kinds=all /path/to/your_program
・管理者権限でyour_program 実行して、
・エラーレポートを標準エラー出力にも表示
・ログを指定ファイルに保存
・未初期化メモリの「発生源」を追跡
・メモリリークの詳細を完全に表示
・すべての種類のメモリリーク(確実、疑わしい、一時的)を表示

3)usbreset    USBデバイスをソフトウエア的にリセット
usbutils をインストールするとついてくる(Ubuntu22.04以降)

4)procinfo    軽量な診断ツール
・procinfo システム統計情報の表示
・lsdev  ハードウエアデバイス情報の取得
・socklist ソケット情報の表示(つかえない環境あり)

5)smartctl
smartmontools をインストールすると利用できる。
sudo smartctl -a /dev/sdX    sdXはsdaなど
•Reallocated_Sector_Ct  (代替セクタ数)
•Current_Pending_Sector(保留中の不良セクタ)     
•Offline_Uncorrectable(修復不能セクタ)     
それぞれが0でなければ交換検討対象

6)tio
シリアル通信専用計量ターミナル
使用例:
tio -t timestamp -l serial.log /dev/ttyUSB0 -b 115200

7)nmap
ネットワーク上の相手がどのポートで何を待っているかを外側から調べるツール
使用例:
nmap 192.168.0.10
出力例:
PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
8080/tcp closed http-proxy
443/tcp  closed https

8)netstat
「今この機器がどのポートで通信しているか」を一覧表示するネットワーク診断ツール。
特に “どのポートが LISTEN(待ち受け)しているか” を調べるための道具。
インストールは net-tools
sudo apt install net-tools

使用例: 
netstat -tlnp
オプションは
-tTCP だけ表示
-uUDP だけ表示
-lLISTEN 中のポートだけ表示
-n名前解決せず数値で表示(高速)
-pどのプロセスが使っているか表示


(順次追記予定)
posted by すら at 08:49| Ubuntu

2025年07月10日

Windows11home から Ubuntu の samba(ファイル共有)に失敗する

Ubuntuに入れたsambaにWindows11home でアクセスできない場合(Windows11proではアクセスできる)でネットワークリソースを使用するアクセス許可がない可能性があるというメッセージとネットワークエラー1208の表示がある場合の対処。


1)win + R でファイル名を指定して実行 → regedit と入力

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters に移動
右側空白部分クリック、新規→DWORD32BIT値をクリック
キー名:AllowInsecureGuestAuth 
できたAllowInsecureGuestAuthキーをダブルクリック、値を1にする

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
右側空白部分クリック、新規→DWORD32BIT値をクリック
キー名:LmCompatibilityLevel 
できたLmCompatibilityLevelキーをダブルクリック、値を1にする
レジストリエディタを閉じる


2)PowerShell を管理者権限で立ち上げて入力(管理者権限は右クリックで選択する)
Set-SmbClientConfiguration -RequireSecuritySignature $false -Force
Set-SmbClientConfiguration -EnableInsecureGuestLogons $true -Force

確認
Get-SmbClientConfiguration 
を実行し
RequireSecuritySignature がFalse
EnableInsecureGuestLogons がTrue
を確認してリブートする。


posted by すら at 11:49| Windows用ソフトウエア

2025年07月04日

地球上の測位色々

Hubeny
Vincenty
GSI
平面直角座標系
と色々ありますが、現在最強なのはKarney法とこのと。
これはGeographicLibで利用できる。
https://geographiclib.sourceforge.io/
C,C++,Python,Javaなどの開発環境で利用可能。
https://geographiclib.sourceforge.io/doc/library.html

C,C++はWindows用はVC対応で、C++Builderでは一工夫必要(インストーラ―ではなくソースからビルド)みたいだ。
AIに聞くと詳しく教えてくれる。

Ubuntu/Debian の場合は
sudo apt install libgeographic-dev
こちらはかなりお手軽っぽい。

いやちがう、C++Builderが茨の道なだけか・・・。
続きを読む
posted by すら at 10:32| 日記

2025年06月17日

systemd 下での自動起動

systemdの下で自動起動する場合の特徴
・Root権限で実行される。
・起動のタイミングを選択できる。

以下、設定方法
自動起動の設定ファイルをauto.service とする

以下のファイルを作成する
/etc/systemd/system/auto.service 
内容 ------------------------------
[Unit]
Description=Auto Boot Script
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
ExecStart=/home/(ユーザー名)/auto.boot
WorkingDirectory=/home/(ユーザー名)
Restart=no

[Install]
WantedBy=multi-user.target

内容ここまで --------------------------
上記例は
ネットワークが使えるようになったら起動
起動は一度だけ(指定ソフトが終了してもリブートしない)
起動するのは/home/(ユーザー名)/auto.boot
起動時の作業ホルダは/home/(ユーザー名)
という設定内容。


有効化と起動は以下コマンドを発行
sudo systemctl daemon-reload
sudo systemctl enable auto.service
sudo systemctl start auto.service

ログ確認には以下コマンドを発行
journalctl -u auto.service

auto.boot はスクリプトファイルとしておけば
そのスクリプトファイルの中のアプリをコメントアウトすれば自動起動を暫定停止できる。

auto.boot でタイムサーバー(192.168.0.200)に自動同期させる例
ここから------------------------------
#!/bin/bash

DIRS=/home/(ユーザー名)
DDD=$(date "+%Y%m%d_%H%M%S")

STDOUT="${DIRS}/${DDD}_ntp.txt"
echo "Sync Time Server" >> "$STDOUT"
ntpdate -u -b 192.168.0.200 >> "$STDOUT" 2>&1
ここまで ------------------------------

2025.07.03 追記 --------
他サービスが自PCのポート123を保持してエラー(tpdate[20963]: the NTP socket is in use, exiting)となることがある。この対策として、ntpdate のオプションに -u を追加した。

2025.07.15 追記 --------
おっとどっこい、タイムサーバーに同期させるにはAfter=network-online.targetとしただけではだめでした。
(別記事にします)


posted by すら at 20:47| Ubuntu