M1 MacのUTMのAlpine LinuxでDocker環境を構築する

前回と前々回に続いて三部作最終章。(たぶんもう一回続く)
読んで字の如く、前回のAlpine Linux版。

前回使ったBurmillaOSと比べると利点が多く、

  • ARM64イメージがそのまま使えるためパフォーマンス低下が少ない(Burmillaはx86_64)
  • OS本体だけなら更に軽い(Virtualならなんと79MB!しかしBurmillaはDocker込で147.8MBの化け物仕様)
  • よって起動が爆速(20秒くらいでSSH接続可能になる)

など、全体的に扱いやすくなっている。

仮想マシンの設定

OS本体を公式サイトより確保。エディションが色々あるが今回は軽量かつ万能なVirtualのaarch64(=ARM64)で進める。

※追記:Virtualはカーネルモジュールが結構削られているらしく、恐らくUVCのサポートが抜けているためv4l2を入れてもUSBのWebカメラが使えない。Homebridgeとかに監視カメラを積みたい場合はStandardを選ぶべき。

UTMで新規仮想マシンを作成→仮想化→Linuxと選択。
Apple仮想化はせず、ディスクイメージとしてAlpine VirtualのISOを指定して次へ。
ストレージは初期設定でいいが、必要に応じて調整。

※追記:Apple仮想化にした方がパフォーマンスは多分出るけど、USBパススルーに非対応らしい。USBが必要なければApple仮想化でも良い。

あとで覗ける共有ディレクトリが必要であれば設定、完了したら仮想マシン設定を開く。
ネットワークモードをブリッジに変更、ブリッジインターフェイスは普段使っているアダプタを設定。名称は左上リンゴマーク→Option押しつつ一番上のシステム情報で確認可能。

起動〜セットアップ

インストール作業

OSを起動するとターミナルでユーザー名を要求されるので「root」と入れる。この時点ではパスワード不要。
そのままsetup-alpine でセットアップ起動。

キーボード選択が出てくるのでjp→jp。ホストネームは入力せずEnterで初期値。

ネットワークアダプタの設定。既に仮想マシンに追加したブリッジアダプタを選んでくれているのでそのままEnter。固定するIPアドレスかdhcpを選んで入力。IP固定の場合はサブネットとゲートウェイも入力。

rootのパスワードを設定できるので入力→再入力。
タイムゾーンは日本人なのでJapan。
プロキシは使ってないので入力せずEnter。
NTP(時刻の自動設定?)は余計な処理増やしたくなかったのでnoneでEnter。

※追記:Chrony入れとかないとちょくちょくバグるので入れておいた方がいいです。具体的にはマイクラのサーバーでラグがえぐいことになりました

APKMirrorは初期値でEnter。
ユーザーは追加しないので初期値。SSHは初期値でOpenSSHを採用。
rootでのSSHログインは必須なのでyes。
SSHKey or URLとかは面倒なのでそのままnone。

ディスク選択は表示されたものをそのまま、今回はvda。
方式かなんか打たされるのでsys。
そのディスク消していい?らしいのでy。

これでインストールが完了するので、終了して仮想マシンからISOを削除する。
次起動すれば、仮想マシンのIP宛でSSHを叩けるようになっている。

Docker環境の構築

viでレポジトリ編集。色々追加と修正。これでapkがまともに使えるようになる。

このままDockerをインストール。

これで完成。後はお好きなコンテナを追加していくだけ。

補足

IRKitのLANに参加する(ネットワーク/NIC2枚刺し)

HomebridgeでIRKitを使うにあたり、わたしはこれまでIRKitが設定用に構築するLAN内で接続するという方法を採っていた。これはIRKitの貧弱なWi-Fi能力でルーターから頻繁に切断されるのを避けつつ、IP固定の必要性をなくすための措置(IRKitに繋いでいればルーターとなるIRKitは192.168.1.1で固定)。
つまりはインターネットに通らないIRKitのWi-Fiと、インターネットに通るEthernet/有線LANを同時に接続する必要があるんだけど、macOSと違ってめちゃめちゃめんどくさかった。

最終的にChatGPTちゃんに丸投げして解決した方法はこちら。
仮想マシンの設定でEthernetとWi-Fiをそれぞれブリッジで追加した構成。仮想マシンから見てEthernetがeth0、Wi-Fiがeth1。

1:metricで優先順位をつける

/etc/network/interfaceをviで変更。metricという優先順位をつけるオプションがあるそうなので、それを採用。なおこれだけではダメだったので、もしかしたらいらないかもしれない。

eth1=Wi-FiはIRKitにアクセスできれば良いため、IPアドレスはDHCP任せで問題ない。

2:ゲートウェイを変更する

/etc/network/interfaceを変更するだけでは上手くいかなかったので、コマンドで更に変更。

※使用するルーターのIPアドレス(=ゲートウェイ)が192.168.0.1の場合。消すべきWi-Fiのゲートウェイ=IRKitは192.168.1.1で固定。

3:DNS設定の調整

DNSを調整してようやくインターネット接続・有線LANでのLAN内通信・Wi-FiでのIRKitとの通信が全て実現できる。

4:crontabで再起動時に自動反映させる

上記の設定で一度は接続するが、再起動するたびにゲートウェイが何故かIRKitになってしまい接続できない問題が起きた。crontabの@rebootで強引に解決する。


これで再起動しても適切に振り分けてくれるようになる。IRKitへの安定した通信を実現しつつ、その他のサーバー機能をフルで扱える。

HomebridgeのDockerコンテナはホストネットワークモード前提であるため、特に改めての設定は必要ない。ブリッジになっているVPNサーバーも問題なく稼働した。

ちなみにゲートウェイ・DNSの情報はMac側で確認可能。メインのネットワークで表示されてる数値を丸コピすればOK。

ファイル共有

UTMのファイル共有機能

手動マウントは以下のコマンド。

自動マウントはbootcmdもcrontab@rebootもダメだったので詳細不明。

SMBサーバーを立てる(Alpine上に直接)

Alpine上に直接立てるか、Docker内に立てるか選べる。

SMBサーバーを立てればAlpineのファイルシステムをホストや他機種から覗けるので、Dockerコンテナにマウントした場所も含めてアクセス可能。
基本はここ参照。まずはapk add sambaでインストール。その後/etc/samba/smb.confを編集。

今回は初期設定の影響か既に数百行に渡って書かれていたので、rm /etc/samba/smb.confで削除してから編集を実行した。
編集が終わったらパスワードと自動起動の設定。

これでsmb://仮想マシンのIPアドレスで、SMBアクセス可能になる。
わたしはユーザーフォルダ直下にDockerコンテナ用のフォルダを生成しているので、./でSMB共有した。

SMBサーバーを立てる(Docker)

SMBサーバーをDockerで立てることも可能。この場合Portainerの管理下に入るため機能の起動終了が手軽になる。
探せばゴロゴロ出てくるがみんな面倒そうなことやってたので、一番シンプルなこちらを採用。

これでviが起動するので以下のように設定。共有したいパスは/にすると全ファイル見れる(/:/Shared/)。

更にsmb.confも修正。こっちは丸コピでOK。

これで設定完了。起動〜設定までのコマンドは以下の通り。

これでrootユーザー/設定したパスワードでのログインが可能になる。

ヘッドレスモードでの仮想マシンの自動起動

仮想マシンを管理するutmctlコマンドとAutomatorを組み合わせれば可能。しかしそのままでは一切の操作が効かないためSSHアクセスが前提。

やり方は単純。事前に仮想マシンからディスプレイを削除しておく。
macOSホストで以下のコマンドを実行しutmctlを有効化し、仮想マシン名も確認。

utmctlのパスと仮想マシンの名前が揃ったらAutomatorを起動。
新規アプリケーションにアクションを作成。

あとはこれをログイン項目に追加するだけ。
ちなみにOllamaのAPI起動と混ぜても良い。

色々触ってみて

Portainerのコンテナリスト。
Homebridgeに加え、VPNとOpenWebUIが並んだ

1週間試行錯誤した結果、ARM64に対応したAlpineLinuxのVirtualが最適という結論が出た。Homebridgeの互換性問題も解決したし、ようやく設定AppとPortainer/SSHだけで全てのサーバー機能を管理できる土台が整った。

OllamaをホストOSで稼働させても仮想マシンとDockerを挟んだOpenWebUIからアクセス出来ているし、リソースの有効活用出来ている感じ。
ただ吊るしのM1はPhi-4やLlama3.2のVisionモデルには性能不足なので、M4/M2Pro辺りのMacminiへの買い替えを本気で考えようと画策中だったりする。いっそM1MaxのMacStudioを買ってしまって、VMだけでは有り余るリソースをゲームとAIで使い分けるのもいいかもしれない。32GBメモリで30Bクラスのモデルが動けばかなり使い勝手が良くなるはず。

次に目指すはこの前組んだシステムの進化。USB温度計のデータを吸ってscpかcronでHomebridge-IRKit-Modのテキストファイルに定期的に書き込み温度表示を更新、余ったSwitchBot温湿度計にAPIアクセスしてGASに取り込めたら完璧。
温度計は届いたのでこのまま時間を割いてみる予定。

カテゴリー: Apple, Homekit/Homebridge, Mac, オートメーション, ガジェット, 効率化, 周辺機器, 自動化/効率化 タグ: パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です