2026年4月30日木曜日

pxeboot完全に理解した

 pxeboot完全に理解した(チュートリアル的設定が出来た)ので設定メモっておこうと思っていたがついつい時間が経って大半を忘れてしまった。

再確認する気力は起きないので、覚えている範囲で書いて終わりにしておく。覚えている範囲では書いたつもりだが、ちょっと自信がない。

いざというときのためにSystemRescueCDをpxebootで実行できるようにしておきたかったのがきっかけで設定した。  

サーバの設定 

たぶんこの辺を参考にして設定したような気がする。 他にも色々見て回ったが忘れてしまった。 

dhcpの設定

dnsmasqを使う。/etc/dnsmasq.d/pxeboot.conf を編集。いろいろやって最終的には以下のようになった(詳細は後述)。サーバのIPは仮に192.168.11.50とする。

interface=lo,eth0
# dhcpはルータがやる。dhcp-proxyでpxeのところだけraspberry-piのdnsmasqがやる設定?
dhcp-range=192.168.11.0,proxy
# iPXE check: iPXEだと175が設定されるので、175が設定されてたらiPXEタグをセット
dhcp-match=set:iPXE,175
# キーで選択できるようにする(タイムアウト5秒)、F8は変えられないっぽい?
pxe-prompt="press F8 to select menu",5
# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50
# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50

tftpサーバー

openmediavaultを入れているので、tftpを設定するだけだった。/mnt/disk/tftpを作成してそこを指定した。

httpサーバー

cdイメージを全部tftpから持ってくるとかなり遅いらしく、イメージはhttpから取ってくるものがある模様。よってhttpサーバーを立てる必要があるものがある。

いちいちhttpサーバー立てるのが面倒なので、openmediavaultのWebDAVを設定した。httpで取ってこれるので大丈夫そう。 tftpと同じところを指すようにした。openmediavaultの設定ではhttp://192.168..11.50/webdav/*でアクセスできる。

イメージの準備

SystemRescueCD 

イメージはCDから持ってきて、ブートのところはsyslinux/pxelinuxをつかったはず。

ブートのところ 

apt install syslinux-efi pxelinux 

インストールした以下のファイルをtftpのところに持ってくる。lpxelinuxとpxelinuxはどっちかでいいはず。なんかlpxelinuxのほうが良さそうなので、lpxelinuxを選んだ。

/usr/lib/PXELINUX/lpxelinux.0
/usr/lib/PXELINUX/pxelinux.0
/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi
/usr/lib/syslinux/modules/bios/ldlinux.c32
/usr/lib/syslinux/modules/efi32/ldlinux.e32
/usr/lib/syslinux/modules/efi64/ldlinux.e64

syslinux/modulesの中には他にも色々ファイルがある。syslinuxの全機能を使いたいなら全部持ってきて置いておいたほうがいいのかもしれない。

dnsmasqの設定としては以下の部分となる。とりあえずこれでsyslinuxブートする。

# 旧BIOS起動用
pxe-service=x86PC,"BIOS System Rescue CD",lpxelinux.0,192.168.11.50
# UEFI用
pxe-service=x86-64_EFI,"EFI System Rescue CD",syslinux.efi,192.168.11.50 

ディスクイメージ

ディスクイメージの中のsysresccdをtftpとhttpサーバーに置く。 

mount -o loop image.iso /tmp/disk
cp -a /tmp/disk/sysresccd /mnt/disk/tftp 

syslinuxがブートしたらtftpのpxelinux.cfg/defaultが読まれるので、そこにブート設定を書く。どうやって読まれるファイルを調べたかというとvirtualboxでpxeブートしているところをwiresharkで調べた。マニュアルは読んでないので他にいいやり方があるかもしれないが知らない。

設定の内容はhttps://www.system-rescue.org/manual/PXE_network_booting/に書いてあるのを参考にjp106だけ追加設定した。 

DEFAULT sysresccd
LABEL sysresccd
  LINUX sysresccd/boot/x86_64/vmlinuz
  INITRD sysresccd/boot/intel_ucode.img,sysresccd/boot/amd_ucode.img,sysresccd/boot/x86_64/sysresccd.img
  APPEND archisobasedir=sysresccd ip=dhcp archiso_http_srv=http://192.168.11.50/webdav/ checksum setkmap=jp106
  SYSAPPEND 3

LINUX,INITRDまではtftpで取ってきて、それ以降はinitrd上で動いたlinuxでhttpで取ってくると思われる。 

SystemRescueCDは確かこれでうまく行ったような気がする。

netboot.xyz 

pxebootについて調べているうちにnetboot.xyzとやらを見つけた。pxebootで色々なdistributionのCDブートイメージでブートできるようになるらしい。これも動かせるようになっておくと、なんか便利そうだったので入れてみた。

netboot.xyzはただのPXEではなく、iPXEが必要らしい。おそらくhttpアクセスとかが必要だからだろう。当然うちの激古パソコンにはそんなものはないので、一旦PXEブートでiPXEになってからnetboot.xyzをブートしなくてはいけないようだった。

 iPXEブート

まずはiPXEにならなければならない。netboot.xyz(https://netboot.xyz/downloads)とか、iPXE本家(https://ipxe.org/download) からiPXEブートするバイナリを取ってきてtftpに置く。

それをブートする設定が以下のあたり。 やってみたところ、UEFIはどうしてもその後のnetboot.xyzからの起動ができなかった。パソコンが古いせいかもしれない。色々コメントしてあるのはその試行錯誤の残骸である。

BIOSはうまく行った(はず)。iPXEになりさえすれば、iPXEのバイナリでもnetboot.xyzのバイナリでもどっちでもいいはず。 

# 旧BIOS起動用
pxe-service=x86PC,"BIOS iPXE",ipxe/bios/undionly.kpxe,192.168.11.50
pxe-service=x86PC,"BIOS netboot.xyz",netboot.xyz/pxelinux.0,192.168.11.50
# UEFI用
#pxe-service=x86-64_EFI,"EFI iPXE",ipxe/efi/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-legacy",ipxe/efi/ipxe-legacy.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-snponly",ipxe/efi/snponly.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb",ipxe/efi-sb/ipxe.efi,192.168.11.50
#pxe-service=x86-64_EFI,"EFI iPXE-sb-snponly",ipxe/efi-sb/snponly.efi,192.168.11.50
pxe-service=x86-64_EFI,"EFI netboot",ipxe/netboot.xyz-snp.efi,192.168.11.50

iPXEブート後

iPXEブート後は、tftpからiPXE用のスクリプトを取ってきて動く。dnsmasqの設定だと以下の部分。iPXEブート後、iPXEタグが設定されてないとメニューに出てこない設定。

# after iPXE
# tag:iPXEで、iPXEが設定されている場合のメニュー
pxe-service=tag:iPXE,x86PC,"BIOS autoexec.ipxe",ipxe/bios/autoexec.ipxe,192.168.11.50
pxe-service=tag:iPXE,x86-64_EFI,"EFI autoexec.ipxe",ipxe/efi/autoexec.ipxe,192.168.11.50

 tftpのipxe/*/autoexec.ipxeにスクリプトを置いておく。中身は以下のような感じ。biosとUEFIで違うので、ディレクトリ分けて置いておく。netboot.xyzのQuickStartに書いてあるやつ。

#!ipxe

dhcp
chain --autofree http://boot.netboot.xyz/ipxe/netboot.xyz.lkrn

これでなんとかBIOSでは起動したが、結構な確率でブートが失敗する。メニューが読み込めなかったり、ブートイメージを選択できてもブートイメージを取ってくる途中で止まったり。

iPXEのバイナリと古いPCのLANドライバ?的なものの相性が悪いのかもしれないし、全世界からアクセスされていてサーバが重いのかもしれない。よくわからないが結構不安定だ。

SytemRescueCDもnetboot.xyzに入ってるので、個別に入れる必要はなかったかと思ったが、netboot.xyzはかなり起動が不安定だったので、個別に入れて正解だった。 

そして気づいたのは、これを使おうとする場合、いちいちLANケーブルをささないと使えないということだ。新しいパソコンならwifiからpxeブートできたりするのかなあ。 

2026年4月19日日曜日

DNSサーバーを立てて外出先と家の中で同じホスト名を使いたい

自宅サーバーを立てているが、家の中だと192.168.*、外出先だとtailscaleを使ってtailscaleのIPになる。immichのアプリだとssidで判定して切り替えてくれるが、ssidは一つしか登録できないので、2.5GHzと5GHzでssid変わると機能しない。他にもsshとかブラウザのブックマークは全部2通り登録して切り替えないといけないのでめんどくさい。なんとかならないかと思って試行錯誤。

とりあえず家の中のwifiに繋がっている間は自宅サーバーのDNSを見に行って、その他はtailscale dnsを見に行ってくれればいい(tailscaleが繋がってない間はアクセスできなくていい)ので、ルーターが配信するDNSを自宅サーバーで動かすDNSに切り替えてみることにした。

やったこと 

自宅サーバーであるraspberrypiにdnsmasqを入れる

apt install dnsmasq 
systemctl start dnsmasq 

systemd/resolvdとやらがdnsを使っているのでエラーになる。いらないのでdns機能を停止。 

vi /etc/systemd/resolvd.conf.d/98-disabledns.conf
[Resolve]
DNSStubListener=no

dnsmasqにホスト名とIPを設定

vi /etc/dnsmasq.d/dns.conf
no-resolv
# サーバのホスト名とローカルIPを設定
address=/tailscaleと同じホスト名/192.168.11.50
# ルータのIP (親DNSになる)
server=192.168.11.1
# 念の為のgoogledns
server=8.8.8.8

動かしてみる

systemctl start dnsmasq
systemctl enable dnsmasq

digとかnslookupで確認し、ルータのDHCP設定のDNSをこのサーバのIPにする

結果 

PCではこれでうまく行った。自宅内ならtailscaleに繋いでても繋いでなくても192.168.11.50に行く。
スマホで5Gにしてtailscaleに繋げばtailscale dnsでつながる。
ただし、PCではうまく行くのにスマホ(android)の場合だけ自宅内のdnsがうまく行かなかった。どうやらプライベートDNSとやらのせいのようだ。

androidの場合、wifiに繋いでdnsを使う際にプライベートDNSを有効にしてあるとルータから指定されたDNSではなく勝手に独自のDNSを見に行くようになっているようだ。このせいでせっかく立てたDNSサーバーが意味をなさなくなる。

プライベートDNSとして DNS over TLSが使えなかったら普通のDNSになるという話を見てtcp853をブロックしたりしてみたが、どうも思った動きをしていない。アプリによってはやっぱり自宅内DNSを見に行かないようだ。プライベートDNSを無効にすると思った通りの動作となる。

ブロックされたらOS?としてのプライベートDNSは無効になるけど、webviewとかはプライベートDNS有効の設定が生きていて DNS over SSLとかで引いてきてしまうとかかもしれないが、SSLは流石にブロックできない。

androidが悪そう? 

結局どうにもこうにもうまく行かないので諦めた。PCだけはOKになったのでまあ良しとする。プライベートDNSを無効にすれば思った通り動作するが、偽サイトに誘導されそうでやっぱりちょっと怖い。全部2通りのアドレスをブックマークするかしかないのか。

というか特定のwifiではプライベートDNS無効にするとかできてもいいと思うんだけど、ネットを漁った感じでは5年以上進歩してないようなので期待薄な感じ。

PCでもfirefoxはブラウザ独自にプライベートDNSっぽいことはやってそうだけど、これは思った通り動いている。なんかいい感じのアルゴリズムで適切に処理してくれてるんだろう。firefoxさまさまである。

よって、androidがなんか変なことやってる気がする。試しにDNS調べるサイト見てみたらgoogleのDNSっぽいのがずらずら(20個くらい)出てきた。googleだしなんか信用できないな。やっぱりプライベートDNS無効にしようかな?

2026年2月26日木曜日

Godot Engineを使ってみようとしたらフリーズした

ちょっとした3Dを表示したりするのにゲームエンジンがよさそうかなと思って調べていた。有名どころではUnityとかUnrealEngineとかがある。

UnrealEngineはなんか多機能すぎてわけがわからない。Unityは会社で使おうとすると有料になりそう。会社でも使えそうなGodotを使ってみようとした。

フリーズする

何度起動してもフリーズする。なんかwindowsごと固まっている感じだけど、すでに動いているほかのアプリ(firefoxとか)は無事っぽい。タスクマネージャーも固まってプロセスを殺すこともできない。シャットダウンもできなくなるので電源ぶち切りするしかなくなる。

githubのissue見てみたけどv4.6からダメだとか(v.4.4.1まで戻してもNG)、エディタをsingle windowモードにしないとダメだとか(やっても変わらず)、何ともならない。

解決

使ってるPCではIntel  HD GraphicsとNVIDIA GeForceが認識されている。ふと思い立ってIntel HD Graphicsのドライバを無効にしてみたところ、フリーズしなくなった。どうやら2つのGPUがあったときにどっちを使うかみたいな感じで止まってしまっているのだと思う。おそらくwindows 11のせいだろう。linuxでやってたら問題なかったんじゃないだろうか。

その後いろいろやってみたところ、ドライバを無効にしなくてもGPUを固定しておけばよさそうだということが分かった。windowsの設定→システム→ディスプレイ→グラフィックでgodotのexeを指定してGPUを固定する。

どういう仕組みでどうGPUが使われているのかさっぱり分からないが、これで普通に使えるようになった。

試しに作ってみる 

とりあえずhttps://www.godot-tutorial.net/というサイトの3Dチュートリアルをやってみる。

書いてる通りそのままだと結構引っかかるところがあった。置いてある完成版と見比べながら修正していく。

引っかかったところ1:Meshの登録の仕方

Meshはいったん左下のファイルシステムのところにドラッグアンドドロップで入れて、そこからMeshInstance3Dにドラッグアンドドロップすると適用された。以前blenderで作ったモデルをfbxに変換して入れてみたりできそう。

引っかかったところ2:シグナル

player.gdの最初に以下が必要(emitするsignalを宣言する)

signal collected

Mainからsignalへのつなげ方も変わっているようだ。(ついでにサイトのコピペのままだと何も生成されなかったのでcreate_objectを呼ぶようにする。)

func _ready():
    $Player.collected.connect(_on_item_collected)
    create_object() 

引っかかったところ3:シグナルのつなげ方 

PlayerのArea3Dでほかの物体に当たった時のシグナルbody_enteredをCharacterBody3Dの関数に接続する。ただコードを書くだけじゃなくて以下のような操作が必要。

 

引っかかったところ4:すり抜ける 

見た目(MeshInstance3D)と当たり判定(CollisionShape3D)は別物になっていて、scaleで小さくしたときに当たり判定が小さくなりすぎると、地面をすり抜けて落ちて行ってしまう。適度な大きさを設定しておく必要がある。

 

とりあえず闇雲にチュートリアルをこなしてみた。blenderで作ったモデルも読み込めるようだったので、適当にミャクミャクと未来のたまごとサーキュラーを読んでみた。(以前作ったやつ

ただ、当たったら消えるだけなのでつまらない。どうやら物理演算されているっぽいので、なんかやってみたいんだけど、やり方がわからない。

とりあえず動いたので、今日はここまででヨシとする。 

 

2026年2月11日水曜日

gitea入れた

ちょっとしたリポジトリを管理したいがgithubに入れるほどでもない。というかgithubはなんか遅くて普段使いには向かない気がする。

単に置いとくだけだと何を作ったのかすらわからなくなる。せっかくraspiを買ったのでgitサーバを入れようと思った。 

ローカルで動かすgithubみたいなものとしてgitlabがあるけど、自分しか使わないのにローカルで動かすには重すぎる。できるだけ軽そうなやつを探してgiteaとやらを入れてみた。

インストール 

raspi debianにパッケージはなさそうだったので手動で入れる。
参考URL: https://docs.gitea.com/installation/install-from-binary

書いてある通りにユーザを作る 

# On Ubuntu/Debian:
adduser \
   --system \
   --shell /bin/bash \
   --gecos 'Git Version Control' \
   --group \
   --disabled-password \
   --home /home/git \
   git

次にインストール先を作る
見たところインストール先は任意に決められそうだったので、設定やらなにやら全部一か所にまとめて入れることにした。 

cd /mnt/disk/gitea
mkdir -p etc var/lib/{custom,data,log} bin

インストール先のディレクトリ構成は以下のような感じにした。etcに設定ファイル、binに実行ファイルを入れる。varにリポジトリ等が入るはず。

gitea/
gitea/etc
gitea/var
gitea/var/lib
gitea/var/lib/log
gitea/var/lib/custom
gitea/var/lib/data
gitea/bin 

binにバイナリを置く

wget https://dl.gitea.com/gitea/1.25.4/gitea-1.25.4-linux-arm64
chmod a+x gitea-1.25.4-linux-arm64
mv gitea-1.25.4-linux-arm64 gitea/bin

systemdのサービスを置く。サンプルがあるので取ってきて編集。
参考URL: https://docs.gitea.com/installation/linux-service 

wget https://raw.githubusercontent.com/go-gitea/gitea/refs/heads/release/v1.25/contrib/systemd/gitea.service
mv gitea.service gitea/etc

gitea.serviceを編集。以下の行を変えたくらい

WorkingDirectory=/mnt/disk/gitea/var/lib/
ExecStart=/mnt/disk/gitea/bin/gitea web --config /mnt/disk/gitea/etc/app.ini
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/mnt/disk/gitea/var/lib

とりあえず全部gitユーザにする

chown -R git:git gitea/ 

systemdに置く

cp /mnt/disk/gitea/gitea.service /etc/systemd/system 

サービス有効&サービス起動

systemctl enable gitea
systemctl start gitea

動いた。(以下はいくつかリポジトリを登録した後)

 

まだ大して使ってないが、なかなか軽くてよさげな気がする。gitlabよりgithubに近い感じ。

これで適当に書き散らかしていたプログラムを集約できる。(すでに行方不明になっているものも多いが) 

sshアクセス

httpで毎回パスワード聞かれるのがうっとおしいのでsshでアクセスしたい。が、sshでcloneしようとするとgitユーザになってパスワードを聞かれる。ssh-keygenで作ったpubkeyは登録してあるが。。。

git clone git@192.168.11.50:ttfugapiyo/photofix.git
git@192.168.11.50's password:

検索したところgitユーザをssd_configで許可すればいいようだ。
参考URL: https://forum.gitea.com/t/gitea-requests-password-with-a-correct-ssh-key/7870

/etc/ssh/ssd_configを見ると、うちのraspiではAllowGroupsで_sshグループが許可されている。(いつ入ったのか不明。raspi osのデフォルトなのか、openmediavaultの設定なのか)
なのでgitユーザを_sshグループに入れればよさそう。

usermod -aG _ssh git

これでclone / push / pullできた。

2025年12月21日日曜日

immichのupgrade

immichのバージョンが上がったようなので、upgradeしてみる。

サーバupgrade

https://docs.immich.app/install/upgrading

を参考に

docker compose pull && docker compose up -d

とりあえずこれで何事もなくupgradeされる。

一応docker-compose.ymlも更新してもう一度やってみる(参考: https://docs.immich.app/overview/quick-start

newにダウンロードしなおして差を見てみる 

mkdir new && cd new
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env
diff -uNr ../immich-app ./

何かわからないがdocker-compose.ymlの方でredisとやらも変わっていたのでdocker-compose.ymlを置き換えてもう一度upgradeした。問題なかった。

アプリのupgrade

サーバを上げたら更新ボタンになり、google playから更新できた 

2025年12月19日金曜日

raspberry-pi 4b miuzeiのケースのねじ

raspberry-piで写真サーバを立てた際、あまりにも簡単で最も苦労したのはケースの組み立てだった。

その苦労した点の写真が以下。

 

ねじがはみ出している。ゴム足も妙にでかいが、それでも微妙に足りていない。このままでは床がやられてしまう。

ほかの人のブログを見たけど、ねじの長さは丁度よさそうに見える。はずれを引いたようだ。 

力技で何とかしようとして無理やりペンチでねじ切り、ねじ山をつぶしてナットが回らなくなった。

しかたないのでホームセンターに行き、うろ覚えでねじを購入するも全く同じサイズのねじを買ってしまう。(測っとけよ)

こんなこともあろうかと、ねじとナットがセットのやつを買っておいたので、上にもナットをつけて何とか以下のように解決していた。

 

そして今日正解が見つかった。上下逆にすればよかったのだ。

これしきの事が思いつかないとは。。

説明書を鵜吞みにして考えることを放棄していたようだ。老化とは恐ろしい。

2025年12月7日日曜日

windowsとlinuxのデュアルブートでbluetoothを共用したい

windowsでbluetoothマウスをペアリングして、デュアルブートのlinuxに切り替えるとペアリングしなおさないと使えない。なんとなく、ハードウェア的にはペアリング状態が記録されてそうだが、OS側の情報がlinuxとwindowsで別々になっていて使えないっぽい感じがある。

デュアルブートでOSを切り替えるたびにペアリングしなおす必要があり、地味にめんどくさい。OSの情報だけの問題なら何とかなりそうなので検索した。 

見つかったサイトは以下。 

https://blanktar.jp/blog/2020/10/dual-boot-bluetooth 

windowsのレジストリにある情報で、linuxの/var/lib/bluetoothにおいてある情報を更新するというやり方のようだ。

後半にはchntpwというwindowsのレジストリをいじるコマンドで情報をとってくるやり方が書いてある。

なんかここまでくると、スクリプト書いて自動化できそうな感じがする。書いてみようか?と思ったが、こんな需要がありそうなものは既に誰かが作っているんじゃないか? 

と思って調べてみたらあった。

https://github.com/x2es/bt-dualboot

上記chntpwとやらを使ってwindows側のレジストリをいじるという中々に危険なプログラムっぽい。 githubページの後半には似たようなソフトの一覧もあって、このプログラムが優れている点を挙げている。自信があるんだろう。

まあ、バックアップもとるみたいだし、ありがたく使わせていただくことにした。

インストール

pipで入れるらしいが、aptで入れたpipだとsystem-wideにプログラムを入れられないっぽい。(なぜか?sudoで入れる必要があるからか?)

一応apt search bt-dualbootとやってみたがさすがに公式には入ってなさそうだ。

仕方ないので、エラーメッセージで表示された通りvenvを入れてみる。python3-fullが必要らしい。chntpwも要るだろう。

sudo apt install chntpw
sudo apt install python3-full

ユーザでvenvを作る。なんとなく.venvに入れてみる。

python3 -m venv .venv

sudo su -でrootになってbt-dualbootを入れる。
(root権限が要るのは/var/lib/bluetoothが一般ユーザで読めないからだろう)

. .venv/bin/activate
pip install bt-dualboot 

使ってみる

とりあえず.venvのbinを直接sudoで実行すればいいようだ。

windows側のレジストリをいじるだけあって、前準備としてwindowsファイルシステムをマウントしている必要がある。ubuntuなら、クリックするだけでマウントはされる。 

windowsのファイルシステムを認識しているか?コマンドを打ってみる。 

sudo .venv/bin/bt-dualboot --list-win-mounts

Windows locations:
==================
 /media/user/Windows 

大丈夫そうだ。

次に、プログラムが認識しているbluetoothの一覧を表示してみる。
1つ目のELECOM TK-FBP102は一度コマンドを実行して同期したもの。2つ目のELECOM IR Optical Mouseはlinuxでペアリングしなおしたもの。2個目のマウスはNeeds syncとなっている。

sudo .venv/bin/bt-dualboot -l

Works both in Linux and Windows
===============================
 [DC:2C:26:19:86:45] ELECOM TK-FBP102

Needs sync
==========

Following devices available for sync with `--sync-all` or `--sync MAC` options.

 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse

コマンドを実行してみる。-b(backup)か-n(no-backup)をつけないと実行できないらしい。一応-bにしておく。

sudo .venv/bin/bt-dualboot --sync-all -b
> BACKUP /media/user/Windows/Windows/System32/config/SYSTEM to /var/backup/bt-dualboot/SYSTEM-2025-12-07--12-44-28

Syncing...
==========
 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse
...done

できたようだ。もう一度見てみる。 

sudo .venv/bin/bt-dualboot -l

Works both in Linux and Windows
===============================
 [DC:2C:26:19:86:45] ELECOM TK-FBP102
 [DC:2C:26:A7:D9:F0] ELECOM IR Optical Mouse

Needs sync
==========

No device found ready to sync.
Try pair devices first.

sync必要なしとなっている。
再起動してwindowsにしてもマウスとキーボードが使えた。
Tested with Windows 10と書いてあったので心配だったが、Windows 11でも大丈夫だったようだ。

これで一つ快適になった。 

おまけ(時刻同期) 

以下ついでに、windowsとlinuxで時間が数時間ずれるやつ。linuxはUTC、windowsはローカルタイムでrtcを使うのでずれる。linuxをローカルタイムにすればいい。 

https://qiita.com/Juice/items/63279e93f818ba74312d

sudo timedatectl set-local-rtc 1

しかし、PCを海外に持っていくとき、windowsはいちいちrtcいじるのか。サマータイムでも余計なことをして1時間ずらしたりするんだよな。マイクロソフト馬鹿なんじゃねーの?