覚え書き。
Hyper-Vで外部スイッチ(実体はブリッジ)を使うとメトリックが0返答になるのが以前から困っていたのだけど、原因がわかったので、Windows版mackerel-agentをいじって試していた。公式提出の前にセルフPR。
GoコードだからLinux上でもビルドできるだろう、とはいかず、実装の都合でWindowsネイティブ環境でビルドしないといけないことになっている。さらに言えばWindowsネイティブといってもさらにそこからMSYS2 MINGW64環境の中でビルドする必要がある。
最初にGo環境をネイティブにインストールする。msiをダウンロード、インストールするだけ。C:\Program Files\Goに入るが特段問題ない。
Gitのインストール、作業用のVisual Studio Codeのインストールも普通にやる。
MSYS2からインストーラ(msys2-x86_64-〜)をダウンロードし、インストールする。
開いたシェルターミナルでpacman -S mingw-w64-x86_64-toolchainを実行し、コンパイラ類をインストール。32ビット版を作りたければここで32ビット版ツールチェインもインストールできる。
シェルのパス設定を反映し直すために一度シェルターミナルからexitで抜け、再度MSYS2 MINGW64を実行。
goコマンドは/c/Program\ Files/Go/bin/goで呼び出せる。Windowsネイティブ側で/Users/kmuto/mackerel-agentに展開していたとするとこんな感じ。
$ cd /c/Users/kmuto/mackerel-agent/ $ /c/Program\ Files/Go/bin/go build go: downloading github.com/Songmu/retry v0.1.0 go: downloading github.com/Songmu/prompter v0.5.1 go: downloading github.com/motemen/go-cli v0.0.0-20180105012931-9961a876eb5f go: downloading github.com/mackerelio/golib v1.2.1 go: downloading github.com/fatih/color v1.18.0 go: downloading github.com/BurntSushi/toml v1.3.2 go: downloading github.com/agext/levenshtein v1.2.3 go: downloading github.com/pkg/errors v0.9.1 go: downloading github.com/mackerelio/mackerel-client-go v0.36.0 go: downloading github.com/Songmu/timeout v0.4.0 go: downloading golang.org/x/text v0.23.0 go: downloading github.com/yusufpapurcu/wmi v1.2.4 go: downloading github.com/go-ole/go-ole v1.2.6 go: downloading github.com/mattn/go-isatty v0.0.20 go: downloading github.com/mattn/go-colorable v0.1.13 go: downloading golang.org/x/sys v0.25.0 go: downloading golang.org/x/term v0.0.0-20220526004731-065cf7ba2467 go: downloading github.com/Songmu/wrapcommander v0.1.0 $ ls -l mackerel-agent.exe -rwxr-xr-x 1 kmuto kmuto 18802118 Apr 20 11:34 mackerel-agent.exe
ダウンロードしたモジュールはMSYS2内の/homeではなくWindows側ユーザーフォルダにgoフォルダができてそこに置かれていた。
なお、もしMSYS2経由でなく直接Windowsネイティブでビルドするとどうなるかというと…
PS C:\Users\kmuto\mackerel-agent> go build # github.com/mackerelio/mackerel-agent/util/windows util\windows\filesystem.go:35:15: undefined: GetLogicalDriveStrings util\windows\filesystem.go:50:14: undefined: GetDriveType util\windows\filesystem.go:51:12: undefined: DRIVE_FIXED util\windows\filesystem.go:64:16: undefined: QueryDosDevice util\windows\filesystem.go:79:15: undefined: GetVolumeInformationW util\windows\filesystem.go:98:15: undefined: GetDiskFreeSpaceEx
なるほどね。実体としてはkernel32.dllのGetLogicalDriveStringsWを自前で呼び出す、みたいなことになっていた。
やっていることは変わらなそうだけどx/sys/windowsに同じものがあるっぽいので、こちらに切り替えられるとagent側のコードはもう少し読みやすくなるのかな。クロスビルドできるようになるかなど何もわからないが。