コンテンツにスキップ

Tips

Raspberry Pi 3B + Trixie で Wi-Fi が突然認識されなくなった話

環境

  • ボード: Raspberry Pi 3B
  • OS: Raspberry Pi OS Trixie (Debian 13ベース)

症状

新規インストールして apt upgrade 後に Wi-Fi が接続されなくなった。

経緯: sudo apt upgradeしたらハングした

新規セットアップし、Wi-Fiも繋いで sudo apt update && sudo apt upgrade をした。時間がかかったので放置して置いたらセッションが切れてしまい、再ログインしようとするとWi-Fiに割り当てたはずの固定IPでログインできない。

取り急ぎ有線でログインして様子を見ようとしたものの、sudoできなくなっている。プロセスを見ると前日実行した sudo apt updgrade がそのまま残っていたので、まずこれを kill

$ ps aux | grep apt 
root 2067 0.0 0.6 20580 6336 ? S Apr01 0:00 sudo apt upgrade 
root 2069 0.0 0.2 20580 2300 ? Ss Apr01 0:00 sudo apt upgrade 
root 2070 0.1 11.5 126508 107308 ? S Apr01 0:44 apt upgrade 

$ sudo kill -9 2067 2069 2070

終わったらロックファイルを削除:

sudo rm /var/lib/dpkg/lock-frontend
sudo rm /var/lib/dpkg/lock
sudo rm /var/cache/apt/archives/lock

dpkbの状態を修復してから:

$ sudo dpkg --configure -a

Setting up rpi-chromium-mods (20260211) ... Configuration file '/etc/chromium/master_preferences' ==> Modified (by you or by a script) since installation. ==> Package distributor has shipped an updated version. What would you like to do about it ? Your options are: Y or I : install the package maintainer's version N or O : keep your currently-installed version D : show the differences between the versions Z : start a shell to examine the situation The default action is to keep your current version. *** master_preferences (Y/I/N/O/D/Z) [default=N] ? 

# Yで続行

改めてアップグレード:

sudo apt upgrade

Wi-Fiが繋がらなくなった

ここでWi-Fiの様子を見る

$ ip a show wlan0
Device "wlan0" does not exist.

nmcli connection show では接続プロファイル(netplan-wlan0-homewifi)は存在しているのに、デバイス自体が見えていない。なんでや


調査の経緯

1. nmcli で状態確認

nmcli connection show
nmcli device status

接続プロファイルは存在しているが、wlan0 デバイスは --(未接続)。

ip link show

loeth0docker0 のみ表示され、wlan0 が存在しない。

3. dmesg でドライバ確認

ここからはClaudeちゃんに相談。

Linuxカーネルは起動時からずっと、ハードウェアの検出・ドライバのロード・デバイスの初期化などのログを内部バッファに記録し続けています。dmesg はそのバッファの内容を表示します。

とのことで、 dmesg をチェック。

このラズパイのWi-FiドライバはBroadcom製だそうで、 brcm で検索。

dmesg | grep -i brcm
dmesg | grep -i firmware

Bluetoothドライバはロードされているが、Wi-Fiドライバがロードされていない。

dmesg | grep -i brcmfmac
usbcore: registered new interface driver brcmfmac

Wi-Fi ドライバ brcmfmac が USB ドライバとしてのみ登録されており、本来あるべき SDIO ドライバとして認識されていない

4. mmc ログ確認

Claude曰く、

MMC は MultiMediaCard の略で、SDカードなどのストレージ規格のことです。
ただしLinuxカーネルでは意味が少し広く、SDカード・eMMC・SDIOデバイスをまとめてMMCサブシステムとして管理しています。

Pi 3Bの場合:

デバイス 用途
mmc0 SDカードスロット(OSが入っているやつ)
mmc1 Wi-Fi/BluetoothチップへのSDIOバス

SDIO(Secure Digital Input/Output)はSDカードの規格を拡張したもので、ストレージだけでなくWi-FiやBluetoothなどの通信チップを接続するためにも使われています。Pi 3BのWi-Fiチップ(BCM43430)はSDカードと同じバスに繋がっていて、カーネルからは mmc1 として見えています。

というわけでこれを探してみる。

dmesg | grep -i mmc
[ 2.672012] mmc-bcm2835 3f300000.mmcnr: mmc_debug:0 mmc_debug2:0 
[ 2.672035] mmc-bcm2835 3f300000.mmcnr: DMA channel allocated
mmc1: Failed to initialize a non-removable card

Wi-Fi チップが接続されている mmc1(SDIOスロット)の初期化に失敗していたことがわかる。このFailedは起動時の一回だけ出る。

5. デバイスツリーで status 確認

cat /proc/device-tree/model
ls /proc/device-tree/soc/

ここで mmc@7e202000mmcnr@7e300000 の両方が見えており

mmcnr@7e3000007e300000 はBCM2835(Pi 3Bのチップ)のメモリマップで mmcnr(MMC Non-Removable)に割り当てられた番地です。dmesg でも同じアドレスが出ていました:

mmc-bcm2835 3f300000.mmcnr: ...

3f7eは同じ物理アドレスを別の視点から見たもの)
また、 mmcnrnrNon-Removable の略です。取り外せないMMCデバイス=Wi-Fiチップのことだと推測できます。SDカードスロットは取り外し可能なので mmc@7e202000 の方です。

mmcnr@7e300000 がWi-Fi用のSDIOスロットのはず、ということで

ls /proc/device-tree/soc/mmcnr@7e300000/

を見ると中に wifi@1 が見えて、デバイスツリー上はWi-Fiノードが存在しているということがわかる。

cat /proc/device-tree/soc/mmcnr@7e300000/status

を見ると返るのが

disabled

デバイスツリー上で Wi-Fi が disabled になっていた。 なんでや

ここで更にClaudeからDTBを見るよう言われる:

DTB は Device Tree Blob の略で、ハードウェアの構成情報をバイナリ形式で記述したファイルです。
Linuxカーネルは起動時に「このボードにはどんなハードウェアが繋がっているか」を知る必要があります。x86 PC はその情報を BIOS/UEFI から得ますが、Raspberry Pi のような組み込みボードには BIOS がないので、代わりに DTB をカーネルに渡して教えています。
関連する用語を整理するとこうなります:

用語 意味
DTS Device Tree Source。人間が読めるテキスト形式
DTB Device Tree Blob。DTSをコンパイルしたバイナリ形式
dtc DTSとDTBを相互変換するコンパイラ
dtoverlay 起動時にDTBの一部を上書きするパッチ
# dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb 
#     ^^^^^^^ ^^^^^^ 
#     入力DTB 出力DTS(人間が読めるテキストに変換)
dtc -I dtb -O dts /boot/firmware/bcm2710-rpi-3-b.dtb 2>/dev/null \
  | grep -A20 "mmcnr@7e300000 {" | grep status
# → status = "okay";

ベースの DTB ファイルでは okay になっているにもかかわらず、 実際に起動時に適用されたデバイスツリー /proc/device-tree/ では disabled ...起動時に何かが書き換えている?

6. Bluetooth との競合が原因と判明

もうさっぱり分らんのでClaudeちゃんに推測してもらう。

Raspberry Pi 3B は Bluetooth と Wi-Fi が同じ SDIO バスを共有しているapt upgrade によって Bluetooth 関連パッケージが更新され、リソース割り当てが変わったことで Wi-Fi の SDIO 初期化が失敗するようになったと考えられる。

わかるか、そんなもの!


解決方法

結局Bluetoothを無効にするしかないっぽいので、そのようにする。いずれ修正されるであろう。。。

/boot/firmware/config.txt[all] セクションに以下を追加:

dtoverlay=disable-bt
sudo nano /boot/firmware/config.txt
[all]
enable_uart=1
dtoverlay=disable-bt   # ← これを追加

保存して再起動:

sudo reboot

再起動後、wlan0 が正常に認識され、Wi-Fi に接続できた。

$ ip a show wlan0
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
    inet 192.168.1.95/24 ...

原因まとめ

項目 内容
直接原因 mmcnr@7e300000(Wi-Fi の SDIO スロット)が起動時に disabled になる
根本原因 Bluetooth と Wi-Fi の SDIO バス競合
トリガー apt upgrade による Bluetooth 関連パッケージの更新
解決策 dtoverlay=disable-bt で Bluetooth を無効化し競合を解消

補足

disable-bt を追加した場合、enable_uart=1 はそのまま残して問題ない。むしろこの2つはセットで使われることが多い組み合わせ。

ヘッドレスサーバー用途で不要だったので今回はBluetoothを潰して対応したが、どっちも必要な場合の対策は不明。

この記事はかなりClaudeにお世話になりました。直面した課題に適した未知のコマンドや結果の読み方を教えてくれるので、実に助かっています。

Raspberry Pi セットアップ (2026-04版)

ImagerとUSBメモリでインストール

Raspberry Pi Imager がまた進化していてめちゃ便利でした。
SSH設定などはイメージ書き込み前に指定しておくことが可能なうえ、Raspberry Pi Connect を有効にしておけばインターネットからのアクセスも簡単(安全性はラズパイ財団を信じる)

なおRasPi Imagerはラズパイ以外のイメージも指定して書き込みできるので別のLinuxやWindowsを焼きたいときにも便利です。

セキュリティ強化

以前やった Debian Setup とほぼ同じ。

パス無しsudoの禁止

sudoはインストール時に使えるようになっているので、次のファイルを削除して無効化する。

$ sudo grep -r NOPASSWD /etc/sudoers /etc/sudoers.d/
/etc/sudoers.d/010_pi-nopasswd:pi ALL=(ALL) NOPASSWD: ALL
$ sudo rm /etc/sudoers.d/010_pi-nopasswd

rootロック

ここは完全にDebianの時と同じ。
設定

# rootアカウントをロック
sudo passwd -l root

# rootのシェルをnologinに変更
sudo usermod -s /usr/sbin/nologin root

# SSHでのroot直接ログインを無効化(SSHを使用している場合)
sudo nano /etc/ssh/sshd_config
PermitRootLogin no

# sshd再起動
systemctl restart sshd

確認

# パスワードがロックされているか確認
sudo passwd -S root
root L 2024-11-19 0 99999 7 -1 # Lなのでロックされている

# シェルの設定を確認
grep root /etc/passwd #nologinになっている

fail2ban

インターネットにポート公開しているとものの10分でブルートフォース攻撃が来る。見ている限り成功したことはないものの気持ち悪いので対策。

sudo apt install fail2ban

インストールしたら設定ファイルを作成:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

[sshd] のセクションを探して以下のように追記

[sshd]
enabled = true
port    = ssh
maxretry = 5
bantime  = 1h
findtime = 10m

  • maxretry = 5 → 10分以内に5回失敗したらBANする
  • bantime = 1h → 1時間アクセス禁止

保存したら起動:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

状態確認:

sudo fail2ban-client status sshd

Status for the jail: sshd が表示されればOK

IP固定

今時は固定しないのが定石なのかもだけど、好みで。

# 現在の接続を確認
nmcli connection show

# 固定IPを設定(例:192.168.1.100/24)
sudo nmcli connection modify <接続名> ipv4.addresses 192.168.1.100/24

# デフォルトゲートウェイ(例:192.168.1.1)
sudo nmcli connection modify <接続名> ipv4.gateway 192.168.1.1

# DNSサーバー(例:Google DNS)
sudo nmcli connection modify <接続名> ipv4.dns "8.8.8.8 8.8.4.4"

# DHCPから手動に切り替え
sudo nmcli connection modify <接続名> ipv4.method manual

# 設定を反映
sudo nmcli connection down <接続名> && sudo nmcli connection up <接続名>

# 確認
ip a show wlan0

My tmux セットアップ

最近は mosh+tmuxでiPadからいつでもどこでも再開できるのが楽しいです。

コマンド早見表

操作 コマンド
開始する tmux
新しいセッションを開始する tmux new -s name
セッションまたはペインを終了する (終了してターミナルに戻る) exit
特定のセッションを終了する tmux kill-session -t name
セッションを残したまま抜ける (デタッチ) Ctrl+b → d
セッションに戻る (アタッチ) tmux a
現在のセッションを一覧表示 tmux ls
セッション名をリネーム Ctrl+b → $
左右に分割 Ctrl+b → %
上下に分割 Ctrl+b → "
今のペインを閉じる Ctrl+b → x → y
ペイン間を移動 Ctrl+b → 矢印キー
ウィンドウ一覧を表示 Ctrl+b → w
次のウィンドウ Ctrl+b → n
前のウィンドウ Ctrl+b → p
新しいウィンドウ Ctrl+b → c
ウィンドウ番号を表示 Ctrl+b → q
tmux.conf リロード Ctrl+b → : → source-file ~/.tmux.conf
コマンドモードからセッションを終了 Ctrl+b → : → kill-session

tmux.conf

こんな見た目になります。

# =============================================================
# Gruvbox Dark テーマ
# =============================================================

# 256色 + True Color
set -g default-terminal "screen-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# ステータスバーを上に
set -g status-position top

# ステータス更新間隔(秒)
set -g status-interval 5

# =============================================================
# ステータスバー全体
# =============================================================
set -g status-style bg=#282828,fg=#ebdbb2
set -g status-left-length 40
set -g status-right-length 100

# 左:セッション名
set -g status-left "#[bg=#fabd2f,fg=#282828,bold]  #S #[bg=#282828,fg=#fabd2f]\ue0b0#[default] "

# 右:Gitブランチ + メモリ使用量 + 日時
set -g status-right "#[bg=#282828,fg=#83a598]\ue0b2#[bg=#83a598,fg=#282828]  #(git -C #{pane_current_path} branch --show-current 2>/dev/null || echo '—') #[bg=#83a598,fg=#b8bb26]\ue0b2#[bg=#b8bb26,fg=#282828]  #(free -h | awk '/Mem:/{print $3\"/\"$2}') #[bg=#b8bb26,fg=#fabd2f]\ue0b2#[bg=#fabd2f,fg=#282828]  %Y-%m-%d %H:%M "

# =============================================================
# ウィンドウタブ
# =============================================================
set -g window-status-separator ""
set -g window-status-format "#[bg=#3c3836,fg=#a89984] #I  #{?#{==:#{pane_current_command},nano},#W,#{b:pane_current_path}} #[default]"
set -g window-status-current-format "#[bg=#fe8019,fg=#282828,bold] #I  #{?#{==:#{pane_current_command},nano},#W,#{b:pane_current_path}} #[bg=#282828,fg=#fe8019]\ue0b0#[default]"

# =============================================================
# ペイン:アクティブを強調
# =============================================================

# ペインタイトルバーを有効化(アクティブ識別に使用)
set -g pane-border-status top
set -g pane-border-format "#[fg=#edc66d] #{pane_index} #{pane_current_command} #[fg=#a89984]#{b:pane_current_path} "
set -g pane-active-border-style "#[bg=#fabd2f,fg=#282828,bold] #{pane_index} #{pane_current_command} #[default]"

# 境界線の色:通常ペインは暗く、アクティブは黄色
set -g pane-border-style fg=#504945
set -g pane-active-border-style fg=#fabd2f,bold
set -g pane-border-lines heavy

# ペイン番号表示(Ctrl+b q)の色
set -g display-panes-colour gray
set -g display-panes-active-colour yellow
set -g display-panes-time 2000

# ペイン幅変更するキーセット (Alt)
bind-key -n M-Left resize-pane -L 2
bind-key -n M-Right resize-pane -R 2

# =============================================================
# その他
# =============================================================
set -g mouse on
set -g history-limit 500
set -g renumber-windows on
set -g set-clipboard on
set -ag terminal-features ",*:clipboard"
set -g allow-passthrough on

# メッセージの色
set -g message-style bg=#fabd2f,fg=#282828,bold

Cloudflare Tunnelで自宅にSSH (2026-02版)

ポート開放なしで、インターネットから自宅サーバにSSHする方法をやってみた手順の記録。

前提

サーバー:Debian
クライアント:Windows 11

  1. Cloudflareアカウントとカスタムドメインを持っていること
  2. サーバーは既にSSHログインができるようになっている。かつ、パスワード認証を禁止し鍵認証のみにするなどセキュア化が済んでいること(参考:Debian 13 trixie setup (2025-09版) - skoshbyte

サーバーにcloudflaredをインストール

Downloads · Cloudflare One docs

sudo apt-get update && sudo apt-get install cloudflared

トンネルを作成する

Create a tunnel (dashboard) · Cloudflare One docs

  1. ブラウザでCloudflareダッシュボードにサインイン
  2. Network > Connectors > Cloudflare Tunnels 画面から Add a Tunnel をクリック
  3. 任意のトンネル名を入力してSave
  4. Saveするとインストールコマンドが表示されるので、そのままコピペして実行
    sudo cloudflared service install <ここに文字列が表示されている>
    

次のコマンドでトンネル情報が表示される

cloudflared tunnel list

  1. Next をクリックし、Published application タブで任意のサブドメイン名とサービスを指定して Save
    1. Hostname: sshgw.mydomain.com
    2. Service: SSH://localhost:22

クライアントにcloudflaredをインストール

クライアント側にも cloudflaredをインストールする。
Downloads · Cloudflare One docs

winget install --id Cloudflare.cloudflared --scope user

$env:localappdata\Microsoft\Winget\Packages\Cloudflare.... の中に cloudflared.exe ができているので、これを使いやすい場所に移動しておく (c:\toolsなど)

SSH鍵セットアップ

  1. クライアント側でキーを作成

    ssh-keygen -t ed25519 -C "任意のコメント" -f ./ed-tun
    

  2. 公開鍵の方をサーバーの authorized_keys に登録

  3. クライアント側の ~/.ssh/config を設定
Host tun
    Hostname sshgw.mydomain.com
    User myuser
    IdentityFile ~/.ssh/ed-tun
    ProxyCommand  C:\tools\cloudflared.exe access ssh --hostname %h
  1. ssh tun でSSHログインできる。

セキュリティについて

Access Policy機能を使用して追加の認証レイヤーも設定できるそうだが、サーバー側で鍵認証以外禁止にしていて、クライアント側の鍵にもパスフレーズを設定しているので、個人の限定的な利用としてはいったんこれでいいかなと。

あまりにも簡単で拍子抜けした一方で、これは企業側でブロックするの難しそうと思うなどした。

サーバーの接続テストをするコマンド

シンプルな接続テストをするときのメモ

Linux

nc

トランスポート層 (TCP/UDPでの)接続確認。アプリケーションプロトコル (HTTP, UTPなど) は起動しているかは保証しない。
HTTPSを確認するとき、nc は異なるプロトコルとして期待通り応答しないことがある

接続クライアント側

送信側。

nc -zv $host $port
# -z zero I/O 接続の確立・切断のみ行い、データ送受信は行わない
# -v verbose エラーの時に詳細な出力を表示

nc -u $host $port # UDPの場合、接続後に "test" などメッセージ入力すると対向先に表示される。

testlistファイルの中に一行ずつ記載された hostname port を順にチェックする

while read host port; do echo "checking $host:$port"; nc -zv $host $port; done < testlist

結果:

checking myserver:9443  
Ncat: Version 7.92 ( https://nmap.org/ncat )  
Ncat: Connected to 192.10.10.143:9443.  
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.  

→ TCPレベルでの3-wayハンドシェイクは確立したが、データの送受信は行われなかった。(アプリケーションレベルでの通信が0)

checking myserver2:8009  
Ncat: Version 7.92 ( https://nmap.org/ncat )  
Ncat: Connection refused.

→ ホストは存在し、接続要求は成功するが、そのポートでサービスが動作していない、リッスンしていないのでサービスが利用できない。ホストが明示的に拒否応答した。

$ nc myserver3 8446
Ncat: TIMEOUT.

→ 何か別の問題(ホストは存在するが、接続要求に応答がない、通信が確立しない。FWでブロックされているとか、LBから飛んでないとか。

接続される側

受信側。簡易テストなどに。

nc -l 8889   # 8889でTCP LISTENにする
nc -lu 8889  # UDPポートでLISTENにする
nc -luv 8889 # 詳細つき

TCPの場合、Ctrl+Cか、接続されたら自動的に終了する

UDPの場合、
1. 受信側で nc -l 8889
2. 送信側で nc -u hostname port またはWindowsなら UDP check してテキスト送信
3. 受信側で送信されたテキストが見える
4. 受信側で Ctrl+C して抜ける

curl

HTTPレスポンスが返るか調べる

curl -kvI

-k 証明書エラーを無視(自己署名証明書などの場合)
-v 証明書を検証 -vv でさらに詳細を表示
-I htmlボディを除くヘッダのみ表示
-L 302の時にリダイレクト先を見る

curl -kvI https://www.contoso.co.jp

この証明書はCNかSANに www.contoso.co.jp が入っていれば検証が成功する。

curl -kvL https://lanserver302/ | iconv -f SHIFT_JIS

302の時に表示されるコンテンツの文字コードを変更させる

curl -w "Name Loolup:%{time_namelookup}s\nConnect: %{time_connect}s\nApp Connect: %{time_appconnect}s\nPretransfer: %{time_pretransfer}s\nRedirect: %{time_redirect}s\nStart Transfer: %{time_starttransfer}s\nTotal: %{time_total}s\n" -o /dev/null http://google.com/

DNSの応答時間を計測する。 -w は write-out オプション

# その他の変数
%{http_code} - HTTPステータスコード
%{size_download}
%{remote_ip} - 接続先IP

netstat/ss

そのサーバのLISTEN中のポートを調べる。

netstat -tulpn | grep LISTEN

-t TCP
-u UDP
-l LISTEN only
-p Proces ID/Program name
-n port number

ss -tln  # TCP
ss -tuln # UDPも含める
ss -tl   # 名前で表示

openssl

証明書の中身を検証する

openssl s_client -connect 192.20.0.105:443 -servername www.contoso.co.jp | openssl x509 -text -noout

WebサーバーがIISの場合 -servername の値は何であっても既定の動作(SNI無効)として無視される

Verification: OK なら検証は成功している

特定の行前後を取りたいとき

openssl s_client -connect google.com:443 | grep -A 15 "Certificate chain"

ローカルのファイルを見るとき

openssl x509 -text -noout -in filname.pem

.pfx ファイルの場合

openssl pkcs12 -info -in filename.pfx -nokeys -clcerts

LB simulation (Healthcheck GET)

HealthcheckのSend Stringをシミュレートする(443ポート)
- GETのパスはヘルスチェック先URL(ここではIISと仮定して D:\inetpub\wwwroot\lb_control\hltchk.html /https://servername/Inetpub/hltchk.html
- Host: FQDN (証明書のCNまたはSAN)
- IPアドレスは今解決しているIPアドレス (ヘルスチェックを返すサーバ・ここではバックエンド)

echo -ne "GET /Inetpub/hltchk.html HTTP/1.1\r\nHost: www.contoso.co.jp\r\nConnection: Close\r\n\r\n" | openssl s_client -connect 192.20.0.105:443 -quiet -servername www.contoso.co.jp

80ポートの場合

echo -ne "GET /Inetpub/hltchk.html HTTP/1.1\r\nHost: www.contoso.co.jp\r\nConnection: Close\r\n\r\n" | nc 192.20.0.105 80

Result

Can't use SSL_get_servername
depth=2 O = contoso Inc, CN = contoso Root CA
verify return:1
depth=1 O = contoso Inc, CN = contoso Issuing CA 1
verify return:1
depth=0 C = US, ST = New York, L = New York, O = "CONTOSO INTERNATIONAL GROUP, INC.", OU = contoso, CN = www.contoso.co.jp
verify return:1
HTTP/1.1 200 OK
Content-Type: text/html
Last-Modified: Fri, 05 Dec 2023 10:19:32 GMT
Accept-Ranges: bytes
ETag: "abc123:0"
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Date: Tue, 20 Feb 2026 09:00:39 GMT
Connection: close
Content-Length: 15

<html>HC OK</html>read:errno=0

IISの場合、指定したFQDNに関係なく、レスポンスは成功する(IISではデフォルトでSNIが無効らしい)opensslの最後に -servername を指定しても同じ。

Windows

Test-NetConnection

これも nc 同様、TCPでの接続確認

Test-NetConnection -Computername hostname -Port 8080

results:

Succeeded

myserver1 9443                            
ComputerName     : myserver1  
RemoteAddress    : 192.168.200.10
RemotePort       : 9443
InterfaceAlias   : イーサネット 2 
SourceAddress    : 192.168.1.90
TcpTestSucceeded : True

Failed

myserver1 8444
警告: TCP connect to (192.168.200.10 : 8444) failed
ComputerName           : myserver1
RemoteAddress          : 192.168.200.10
RemotePort             : 8444
InterfaceAlias         : イーサネット 2
SourceAddress          : 192.168.1.90
PingSucceeded          : True
PingReplyDetails (RTT) : 27 ms
TcpTestSucceeded       : False

UDP check

$udpClient = New-Object System.Net.Sockets.UdpClient 
$udpClient.Connect("192.168.200.10", 8889) 
$bytes = [System.Text.Encoding]::ASCII.GetBytes("testtest") 
$udpClient.Send($bytes, $bytes.Length) 
$udpClient.Close()

testなら4バイト、testtestなら8バイトで返る
サーバー側ではnc -lu portしているとSendした文字列が表示される

netstat

netstat -n #アドレスとポート番号で表示
netstat -a #すべてのアクティブな接続、LISTENを表示
netstat -anf | ? {$_ -like "*LISTEN*"}

Debian 13 trixie setup (2025-09版)

メジャーバージョンが来たので新規インストールする
メジャーバージョンが来た時しかセットアップしないのでいつも何してたか忘れる
なのでこうして書いておけば忘れても大丈夫

インストール

  • USBインストーラを作成 (Debian DVD, Raspberry Pi Imagerで)
  • USB起動してGUIインストーラ実行 (モニタ・KB接続)
  • ガイドに従って設定
  • パーティションはディスク全体上書き、初心者におすすめなので
  • ネットワークミラーは yes、ないと apt updateできない

sudoをインストール

Debianはsudoがデフォルトで入っていないので、suでrootになってからインストールする

su
apt install sudo
sudo gpasswd -a choco sudo

#commands/gpasswd

gpasswd  ユーザーが所属する情報を管理するコマンド
    -a   ユーザー名 (ADD ユーザ名)   
    sudo ユーザーを入れるグループ

解像度設定

ゲーミングディスプレイだとフォントが小さすぎて見づらいので

sudo dpkg-reconfigure console-setup

Termiusを選択してフォントサイズを16x32に

パスなしsudoの禁止

sudo visudo  

# Allow members of group sudo to execute any command
%sudo  ALL=(ALL:ALL) ALL

%sudo の部分を自分のユーザー名に書き換える

sudo apt update && sudo apt upgrade

rootロック

設定

# rootアカウントをロック
sudo passwd -l root

# rootのシェルをnologinに変更
sudo usermod -s /usr/sbin/nologin root

# SSHでのroot直接ログインを無効化(SSHを使用している場合)
sudo nano /etc/ssh/sshd_config
PermitRootLogin no

# sshd再起動
systemctl restart sshd

確認

# パスワードがロックされているか確認
sudo passwd -S root
root L 2024-11-19 0 99999 7 -1 # Lなのでロックされている

# シェルの設定を確認
grep root /etc/passwd #nologinになっている

固定IP設定

sudo nano /etc/network/interfaces

で自分のIPアドレス、ネットマスク、デフォルトゲートウェイを指定
今回はDNSを 1.1.1.2, 1.0.0.2 にした (CloudflareのマルウェアブロックDNS)

設定したら再起動して確認

sudo systemctl restart networking
ip addr show enp2s0

SSH設定

この時点ではPasswordAuthenticationができるので、SSH接続しておいて鍵をセットアップする

そのセッションの中でパスワードを禁止にする

sudo nano /etc/ssh/sshd_config
PasswordAuthentication no

sudo systemctl restart sshd

これでroot禁止、PWログイン禁止まで完了

Dockerエンジン

あとで使うので入れておく

Debian | Docker Docs チュートリアルに従ってセットアップ

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Post installation stepsまで実施

sudo groupadd docker
sudo usermod -aG docker $USER
docker run hello-world

ここまで完了すると docker compose up -d ができるようになる

treeコマンド

時々使いたくなるので入れておく

.bashrcに追記

alias tree='find . -not -path "*/\.git/*"| sed -e "s/[^-][^\/]*\// |/g" -e "s/|\([^ ]\)/|-\1/"'

こんな感じ

$ tree
.
 |-docker-compose.yml
 |-config
 | |-a-records.conf

Quartzを試してみる (2025-08版)

Obsidianノートをそのまま静的サイトにするならQuartzがいいらしいと見たので試してみた。

これで動いた

NodeJSをインストール

winget install OpenJS.NodeJS

Quartzをクローン

git clone https://github.com/jackyzha0/quartz.git
cd quartz
npm i
npx quartz create

ここでObsidianフォルダをどこから持ってくるか聞かれるので、コピーなりシンボリックリンクなり選ぶ。

フォルダ構成

最低限ここだけ押さえておけばとりあえず動く

.quartz/
├── content/  # ここの中にObsidian vaultの中身をそのまま入れる
│   └── index.md # 必須
├── public/ # ここにbuildしたファイルが作成される
└── quartz.config.ts

quartz.config.tsを編集

const config: QuartzConfig = {
  configuration: {
    pageTitle: "サイト名",
    enableSPA: true,
    enablePopovers: true,
    analytics: {
      provider: "plausible",
    },
    locale: "ja-JP", // 日本語ロケールを指定
    baseUrl: "quartz.jzhao.xyz",
    ignorePatterns: ["private", "templates", ".obsidian"],
    defaultDateType: "created",
    theme: {
      fontOrigin: "googleFonts",
      cdnCaching: true,
      typography: {
        header: "Noto Sans JP", // 日本語フォント
        body: "Noto Sans JP",   // 日本語フォント
        code: "IBM Plex Mono",
      },
    },
  },
  // ...
}

動作確認

npx quartz build --serve

注意点

  • ファイル名は日本語でも大丈夫だが、リンク(ファイル・画像)に含まれるディレクトリパスは英数字しか使えない
  • Quartzはリンク内の相対パスをうまく処理できないため、絶対パス(indexからの相対)で記述が必要

Ubuntuをセットアップする (2025年8月版)

OSインストール時の解像度

22.04.5 というバージョンでUSBメモリからインストール…
と思いきやいきなりトラブル。解像度が合わなくて画面の左上しか表示されない。
以下の手順で解決:

  1. GRUBメニューで「Try Ubuntu」または「Install Ubuntu」を選択する前に、eキー を押してブートパラメータ編集画面に入る
  2. linux で始まる行の quiet splash--- debian-installer/language=ja の間に nomodeset video=1024x768 vga=ask を挿入

    こんな感じになる

    quiet splash nomodeset xrandr=1024x768 --- debian-installer/language=ja
    

  3. 編集後 Ctrl+X で保存して抜けるとインストール画面に進む

インストールパーティションの選択

Windowsの入っているディスクに新しいパーティションを作っておき、そこを選択してインストール
あらかじめフォーマットしておいたほうが見つけやすくてよい

  1. インストーラ画面で「その他」選択(手動パーティション設定などのメニュー)
  2. 目的のディスクを選択 ( /dev/sda4 など)
  3. Ext4 でフォーマット選択、マウントポイントは /
  4. デュアルブートの場合 デバイスのパーティションテーブルが変更されます:SCSI1 (0,0,0) (sda) などと出るがこれはブートパラメータ設定のことでほかのパーティション内のデータは消えない。心配せず続行

日本語入力設定 (Mozc)

インストーラでJapaneseとJapaneseキーボードを選択していれば日本語表示になっているが、Mozcを入れる

sudo apt update
sudo apt upgrade
sudo apt install ibus-mozc

GUIの設定>キーボード>Mozc設定キー設定の選択 の画面から、
直接入力 - Henkan - IME有効化
直接入力 - Muhenkan - IME無効化

とすると日本語モード・半角モード切替が楽。

GRUB設定ファイルの編集

最後に選択したOSをデフォルトブートにする

sudo nano /etc/default/grub

GRUB_DEFAULT=0となっている箇所を探して編集する

GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

編集後に反映

sudo update-grub

将来Windowsに戻したいときは回復してパーティション統合とか bcdboot C:\Windows /s C: とかの操作が必要。

今後の課題

昨今のウザさとポンコツ度合いが増すWindowsに嫌気がさしてメインゲーミングPCをLinuxにできないかとトライしたもののここでいったん挫折。

やっぱり慣れないOSだとちょっとした設定操作がすべて違うのですごく疲れる。

Steamでゲーム起動まではできたものの、

  • ネットワーク設定(なんでDebianとUbuntuとRaspberrypiでみんな違うのか)
  • 今までちまちま作ってきたPowerShellやコマンドプロンプトの便利スクリプト移行
  • Windowsでしか動かない各種アプリの移行

がボリューム大きくて課題。

GitHubのプライベートリポジトリをcloneする

いつも忘れるのでメモ。

ed25519でssh-keygenする

ssh-keygen -t ed25519 -C "your_email@example.com"

↑メールアドレスはnoreplyのものでOK

~/.ssh/config
Host github.com
  HostName github.com
  IdentityFile ~/.ssh/id_ed25519
  User git
  AddKeysToAgent yes

これも必要かも?

ssh-add ~/.ssh/id_ed25519
ssh-add -l #確認

GitHubで自分のアカウントに公開鍵を追加

プロファイル > SSH and GPG keys > New SSH Key

Warning

コピペするときはターミナルで改行されないように表示しておかないとハッシュが壊れるので注意

テストしてgit clone

ssh -T git@github.com

問題なければ git clone できる

git clone git@github.com:<github username>/<repo name>.git

Cloudflare WorkersでMkDocsをデプロイする (2025年7月版)

調べるたびに新しくなるMkDocsデプロイ方法のメモ (2025年7月版)
GitHubのプライベートリポジトリにpushしたらCloudflareでサイトを公開できるようにする

MkDocsをセットアップ

割愛。git push origin main でリポジトリ更新までできている状態
リポジトリはprivateで構わない。

ディレクトリ構成は次のとおり。

./
│  mkdocs.yml
│  requirements.txt
│  wrangler.toml
└─docs/


requirements.txt...今回はmkdocs-materialなので次のように指定

requirements.txt
mkdocs
mkdocs-material


wrangler.toml ...Cloudflareの自動デプロイに必要

wrangler.toml
name = "<Cloudflare Workersのプロジェクト名>"
compatibility_date = "yyyy-MM-DD(動作確認できた日)"

[assets]
directory = "./site"

Cloudflareをセットアップ

  1. CloudflareダッシュボードでWorkersプロジェクトを新規作成 (Import a repository から)
  2. 対象リポジトリを選択
  3. Workers Project 名を指定 (GitHubリポジトリ名と異なっていてもいい)
  4. Build command に pip install -r requirements.txt && mkdocs buildと指定
  5. Deploy command は既定値 npx wrangler deploy
  6. Non-production branch deploy command, Pathも既定値でOK
  7. Create and deploy をクリックするとデプロイされる

ドメイン名も設定する

(Cloudflare Domainsで既に独自ドメインを持っている前提)

  1. WorkersプロジェクトのSettingsタブで、Domains & Routers セクションの workers.devとPreview URLsもEnableしておく
  2. 同じセクションで Add > Route から使いたいドメインをZoneで選択
  3. Routeには今回ルートでいいので www.mydomain.com/* と指定
  4. 保存すれば即時反映される