平衡点


2025/08/08

_ VirtualBox上の Windows 11 で Host OS 側の Samba でファイル共有したかっただけなんだが.

…なんでこんな手間かかるんだよ, 的なアレ.

Host-Only アダプタは「認識されないネットワーク」と扱われて, 「ネットワーク探索とファイル共有」が有効にならないのだけれど, これなんとかならんかな, というお話.

結論から言えば, なんか頭の悪い(?)スクリプトを起動時に実行してネットワークプロファイルを切り替えることで解決(?)しました, と.

環境: ソフトウェアのバージョンとかネットワーク構成とか.

OS とか仮想環境とか, その辺の情報は以下

  • Host OS: Debian GNU/Linux unstable.
  • VirtualBox: 7.1.12-dfsg-2 (Debian パッケージ版)
  • Guest OS: Windows 11 24H2

あとは何か情報いるかな?

もともと, Windows11 側では主に 相手から送りつけられたりする MS Office の書類を編集するためだけに利用するつもりであるわけで, 特に凝った事はしていない. ゲーム関係抜いたぐらいかな.

Guest OS 側のネットワーク構成は単純で

  • NAT: これは Windows が外に出るのに利用される. 標準的な奴.
    • アドレス: 192.168.122.1/24
  • Host-Only: そのまま Host OS である Linux 側と通信するために利用する.
    • アドレス: 192.168.56.2/24
    • Host 側には 192.168.56.1 が割り振られている.

というわけで, 特に手は入れていない, いたって標準的な構成.

やりたかったこと: ホストOS側の Linux とゲストの Windows 側でのファイル共有

まあ, VirtualBox Extension Pack とか使えばできるんじゃないの, とは思うものの, 丁度セットアップしている時に www.virtualbox.org が 502 返してきて萎えたし, そもそも, Host OS 側 (Debian GNU/Linux)では他の LAN 内の計算機とファイル共有するために KSMBD を上げていたので, これに接続すれば良いんじゃね, と思った次第.

なので Windows 側から \\192.168.56.1 叩いてやれば繋がりはするんだけれど.

…あれ, エクスプローラから見えないな?

事の発端, というか何が問題か.

エクスプローラで「ネットワーク」を選ぶと

「ネットワーク探索とファイル共有が無効になっています。」

とのことで. はいはいプライベートネットワークとパブリックネットワークね, と「設定」から変更しようと思ったら.

Windows11の「設定」ではプライベートネットワーク・パブリックネットワークの切り替えが連動してます

えー…. どういうことかというと片方切り替えたつもりがどちらも切り替わる.

つまりは

  • NAT 側を「パブリックネットワーク」
  • Host-Only側を「プライベートネットワーク」→ 「ネットワーク探索とファイル共有」を有効に

という設定は GUI ではできません, ということで.

…なんでやねん.

ネットワーク設定を PowerShell から変更

PowerShell からは Get-NetConnectionProfile, Set-NetConnectionProfile で個別に設定が変更可能.

PS C:\Users\uwabami> Get-NetConnectionProfile

Name                     : ネットワーク
InterfaceAlias           : VirtualBox NAT
InterfaceIndex           : 6
NetworkCategory          : Public
DomainAuthenticationKind : None
IPv4Connectivity         : Internet
IPv6Connectivity         : LocalNetwork

Name                     : 識別されていないネットワーク
InterfaceAlias           : VirtualBox HostOnly
InterfaceIndex           : 14
NetworkCategory          : Public
DomainAuthenticationKind : None
IPv4Connectivity         : LocalNetwork
IPv6Connectivity         : LocalNetwork

PS C:\Users\uwabami> Set-NetConnectionProfile -InterfaceIndex 14 -NetworkCategory Private
PS C:\Users\uwabami> Set-NetConnectionProfile -InterfaceIndex 6 -NetworkCategory Public
PS C:\Users\uwabami> Get-NetConnectionProfile

Name                     : ネットワーク
InterfaceAlias           : VirtualBox NAT
InterfaceIndex           : 6
NetworkCategory          : Public
DomainAuthenticationKind : None
IPv4Connectivity         : Internet
IPv6Connectivity         : LocalNetwork

Name                     : 識別されていないネットワーク
InterfaceAlias           : VirtualBox HostOnly
InterfaceIndex           : 14
NetworkCategory          : Private
DomainAuthenticationKind : None
IPv4Connectivity         : LocalNetwork
IPv6Connectivity         : LocalNetwork

ということで, めでたくネットワークの変更ができました.

しかしながら, エクスプローラではやはり

「ネットワーク探索とファイル共有が無効になっています。」

とのことで.

Host-Only ネットワークが外部に出れないからなのかねぇ. いや, こっちで探索して欲しんだけれど.

頭の悪い(?) 解決方法

VirtualBox NAT を「プライベートネットワーク」に変更すると, めでたく「探索とファイル共有」の警告も出ず, エクスプローラの「ネットワーク」には Host OS 側のファイル共有が見えました. また, この後から VirtualBox NAT を「パブリックネットワーク」に戻しても, 「探索とファイル共有」は有効な模様.

…なんなのその挙動は.

なら, 安直には

  • (起動時に)一度インターネット接続用の VirtualBox NATを「プライベートネットワーク」に変更
  • しばらく待つ.
  • VirtualBox NAT を「パブリックネットワーク」に戻す

なんて事をすれば良いかな, というわけで.

# 起動直後は不安定なため少し待機してみる. とりあえず 15秒.
Start-Sleep -Seconds 15

# 両方のアダプタを「プライベート」に設定して Windows 側の認識(?)をリセット.
Set-NetConnectionProfile -InterfaceIndex 6 -NetworkCategory Private
Set-NetConnectionProfile -InterfaceIndex 14 -NetworkCategory Private

# これまた少し待機. こんなんでエエのかねぇ.
Start-Sleep -Seconds 10

# NATネットワークだけを「パブリック」に戻す.
Set-NetConnectionProfile -InterfaceIndex 6 -NetworkCategory Public

これを適当な場所に適当なファイル名で置いておく. とりあえず C:\Scripts\FixNetwork.ps1 としておいた.

ついでに↑これをタスクスケジューラで起動時に呼び出すように.

  1. 「タスク スケジューラ」を起動
  2. 「タスクの作成」を選び, 以下のように設定.
    1. 全般
      • 名前: ファイル共有のためのネットワーク修正
      • 「ユーザーがログオンしているかどうかにかかわらず実行する」と「最上位の特権で実行する」にチェック
    2. トリガー:
      • 開始:スタートアップ時
    3. 操作:
      • 操作:プログラムの開始
      • プログラム/スクリプト: powershell.exe
      • 引数の追加: =-ExecutionPolicy Bypass -File "C:\Scripts\FixNetwork.ps1"=
  3. 設定を保存

何度か再起動してみたものの, 少し待てばちゃんと希望通りの状態, つまり

  • VirtualBox NAT は「パブリックネットワーク」扱い
  • Host-Only は「プライベートネットワーク」扱い
    • エクスプローラの「ネットワーク」から Host OS 側のファイル共有が見える

という状況になってくれた.

…なんなのその挙動は(2回目)

まとめ

そもそも Host-Only アダプタで探索してくれればエエんやけど. これ, 正しくはどこで弄るんだろう.

やっぱり Windows 嫌い.


2025/08/09

_ Wanderlustで日本語の添付ファイルを扱う defadvice を nadvice に書き換える(again)

前回, うまく動いてなかったので revert したのだけれど, うまくできたので変更.

やりたいこと

Emacs30 から defadvice が obsolete となったので, nadvice 向けに処理を書き換える.

変更前

(with-eval-after-load 'eword-decode
  (mime-set-field-decoder
   'From nil 'eword-decode-and-unfold-unstructured-field-body)
  (mime-set-field-decoder
   'CC nil 'eword-decode-and-unfold-unstructured-field-body)
  (mime-set-field-decoder
   'To nil 'eword-decode-and-unfold-unstructured-field-body))
;;; ファイル名が日本語の添付ファイルをデコードする [semi-gnus-ja: 4332]
(eval-after-load "mime"
  '(defadvice mime-entity-filename
     (after eword-decode-for-broken-MUA activate)
     "Decode eworded file name for *BROKEN* MUA."
     (when (stringp ad-return-value)
       (setq ad-return-value (eword-decode-string ad-return-value t)))))
(eval-after-load "std11"
  '(defadvice std11-wrap-as-quoted-string (before encode-string activate)
     "Encode a string."
     (require 'eword-encode)
     (ad-set-arg 0 (or (eword-encode-string (ad-get-arg 0)) "" )) ))

変更後

(leaf eword-decode
  ;; 日本語ファイル名の添付ファイルを処理するための advice で使うために
  ;; 以下の二つを autoload 扱いにしておく
  :commands (eword-decode-string
             eword-encode-string)
  :config
  (mime-set-field-decoder
   'From nil 'eword-decode-and-unfold-unstructured-field-body)
  (mime-set-field-decoder
   'CC nil 'eword-decode-and-unfold-unstructured-field-body)
  (mime-set-field-decoder
   'To nil 'eword-decode-and-unfold-unstructured-field-body)
  )
;;; ファイル名が日本語の添付ファイルをデコードする: 元ネタ [semi-gnus-ja: 4332]
;;; ...所で, semi-gnus-ja のアーカイブってどこにあるのかしらん...
(leaf mime
  :preface
;;;###autoload
  (defun my:decode-mime-filename-around (orig-fun &rest args)
    "Decode the filename returned by the original function if it's a string."
    (let ((return-value (apply orig-fun args)))
      (if (stringp return-value)
          (progn
            (eword-decode-string return-value t))
      return-value)))
  :advice
  (:around mime-entity-filename
           my:decode-mime-filename-around)
  )
(leaf std11
  :preface
;;;###autoload
  (defun my:encode-string-filter-args (args)
    "Encode the first argument in a list of ARGS."
    (let* ((original-string (car args))
           (encoded-string (or (eword-encode-string original-string) "")))
      (cons encoded-string (cdr args))))
  :advice
  (:filter-args encode-string
                my:encode-string-filter-args)
  )

というわけで.

手元の設定ファイルからは defadvice は無くなりました.


連絡先など
最近の日記
  • 2025/08/09
    • 1. Wanderlustで日本語の添付ファイルを扱う defadvice を nadvice に書き換える(again)
  • 2025/08/08
    • 1. VirtualBox上の Windows 11 で Host OS 側の Samba でファイル共有したかっただけなんだが.
  • 2025/06/17
    • 1. org-beamer での \section*{} の扱い
  • 2025/05/20
    • 1. glibc の更新
  • 2025/04/30
    • 1. dovecot の更新でハマる.
一覧
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|02|03|04|08|09|10|11|12|
2013|01|02|03|04|05|06|08|09|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|09|10|
2016|02|03|
2017|01|02|03|05|06|07|09|11|12|
2018|03|06|07|10|11|12|
2019|01|02|03|04|05|07|10|12|
2020|01|02|03|04|05|08|09|10|11|12|
2021|01|02|03|05|06|07|08|09|11|12|
2022|01|02|03|04|05|06|08|10|11|12|
2023|02|03|04|06|08|09|11|12|
2024|01|02|03|04|05|06|10|12|
2025|02|03|04|05|06|08|
Back to Top ▲