前回と前々回に続いて三部作最終章。(たぶんもう一回続く)
読んで字の如く、前回の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がまともに使えるようになる。
|
1 2 3 4 5 6 7 8 9 |
vi /etc/apk/repositories レポジトリを編集 http://dl-cdn.alpinelinux.org/alpine/vx.xx/main //初期値のまま #http://dl-cdn.alpinelinux.org/alpine/vx.xx/community //初期値のまま#を消す //以下追加 http://dl-cdn.alpinelinux.org/alpine/edge/main http://dl-cdn.alpinelinux.org/alpine/edge/community http://dl-cdn.alpinelinux.org/alpine/edge/testing |
このままDockerをインストール。
|
1 2 3 |
apk add docker docker-compose //インストール service docker start //実行 rc-update add docker boot //自動起動設定 |
これで完成。後はお好きなコンテナを追加していくだけ。
補足
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という優先順位をつけるオプションがあるそうなので、それを採用。なおこれだけではダメだったので、もしかしたらいらないかもしれない。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address <固定したいIPアドレス> netmask 255.255.255.0 metric 100 auto eth1 iface eth1 inet dhcp metric 200 |
eth1=Wi-FiはIRKitにアクセスできれば良いため、IPアドレスはDHCP任せで問題ない。
2:ゲートウェイを変更する
/etc/network/interfaceを変更するだけでは上手くいかなかったので、コマンドで更に変更。
|
1 2 |
ip route del default via 192.168.1.1 ip route add default via 192.168.0.1 dev eth0 |
※使用するルーターのIPアドレス(=ゲートウェイ)が192.168.0.1の場合。消すべきWi-Fiのゲートウェイ=IRKitは192.168.1.1で固定。
3:DNS設定の調整
|
1 |
echo "nameserver 192.168.0.1" > /etc/resolv.conf |
DNSを調整してようやくインターネット接続・有線LANでのLAN内通信・Wi-FiでのIRKitとの通信が全て実現できる。

4:crontabで再起動時に自動反映させる
上記の設定で一度は接続するが、再起動するたびにゲートウェイが何故かIRKitになってしまい接続できない問題が起きた。crontabの@rebootで強引に解決する。
|
1 2 3 4 5 6 |
crontab -e //viが起動する //以下を追記 @reboot ip route add default via 192.168.0.1 dev eth0 @reboot echo "nameserver 192.168.0.1" > /etc/resolv.conf |

これで再起動しても適切に振り分けてくれるようになる。IRKitへの安定した通信を実現しつつ、その他のサーバー機能をフルで扱える。
HomebridgeのDockerコンテナはホストネットワークモード前提であるため、特に改めての設定は必要ない。ブリッジになっているVPNサーバーも問題なく稼働した。

ちなみにゲートウェイ・DNSの情報はMac側で確認可能。メインのネットワークで表示されてる数値を丸コピすればOK。
ファイル共有
UTMのファイル共有機能
手動マウントは以下のコマンド。
|
1 |
mount -t 9p -o trans=virtio share [マウント先パス] -oversion=9p2000.L |
自動マウントはbootcmdもcrontab@rebootもダメだったので詳細不明。
SMBサーバーを立てる(Alpine上に直接)
Alpine上に直接立てるか、Docker内に立てるか選べる。
SMBサーバーを立てればAlpineのファイルシステムをホストや他機種から覗けるので、Dockerコンテナにマウントした場所も含めてアクセス可能。
基本はここ参照。まずはapk add sambaでインストール。その後/etc/samba/smb.confを編集。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/etc/samba/smb.conf [global] #to allow symlinks from everywhere allow insecure wide links = yes workgroup = WORKGROUP dos charset = cp866 unix charset = utf-8 force user = root [storage] # to follow symlinks follow symlinks = yes # to allow symlinks from outside wide links = yes browseable = yes writeable = yes path = [共有したいパス] |
今回は初期設定の影響か既に数百行に渡って書かれていたので、rm /etc/samba/smb.confで削除してから編集を実行した。
編集が終わったらパスワードと自動起動の設定。
|
1 2 3 4 5 6 |
smbpasswd -a root //パスワードを設定。2回打たされる rc-update add samba rc-service samba start //自動起動の設定 |
これでsmb://仮想マシンのIPアドレスで、SMBアクセス可能になる。
わたしはユーザーフォルダ直下にDockerコンテナ用のフォルダを生成しているので、./でSMB共有した。

SMBサーバーを立てる(Docker)
SMBサーバーをDockerで立てることも可能。この場合Portainerの管理下に入るため機能の起動終了が手軽になる。
探せばゴロゴロ出てくるがみんな面倒そうなことやってたので、一番シンプルなこちらを採用。
|
1 2 3 4 5 6 |
apk add git git clone https://github.com/fschuindt/docker-smb.git //乗ってるコマンドと違うので注意(こっちでないと機能しない) cd docker-smb vi docker-compose.yml |
これでviが起動するので以下のように設定。共有したいパスは/にすると全ファイル見れる(/:/Shared/)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
version: '3' services: samba: container_name: samba tty: true network_mode: bridge volumes: - [共有したいパス]:/Shared/ ports: - "139:139" - "445:445" build: context: . dockerfile: Dockerfile |
更にsmb.confも修正。こっちは丸コピでOK。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
vi smb.conf [global] #to allow symlinks from everywhere allow insecure wide links = yes workgroup = WORKGROUP dos charset = cp866 unix charset = utf-8 force user = root [Alpine] # to follow symlinks follow symlinks = yes # to allow symlinks from outside wide links = yes browseable = yes writeable = yes path = /Shared/ |
これで設定完了。起動〜設定までのコマンドは以下の通り。
|
1 2 3 4 5 6 7 8 9 |
docker-compose build docker-compose up -d //ビルドして起動 docker update --restart always samba //自動起動の設定 docker container exec -it samba smbpasswd -a root //rootユーザーのパスワードを設定(2回聞かれる) |
これでrootユーザー/設定したパスワードでのログインが可能になる。

ヘッドレスモードでの仮想マシンの自動起動
仮想マシンを管理するutmctlコマンドとAutomatorを組み合わせれば可能。しかしそのままでは一切の操作が効かないためSSHアクセスが前提。
やり方は単純。事前に仮想マシンからディスプレイを削除しておく。
macOSホストで以下のコマンドを実行しutmctlを有効化し、仮想マシン名も確認。
|
1 2 3 4 5 6 7 8 9 10 11 |
sudo ln -sf /Applications/UTM.app/Contents/MacOS/utmctl /usr/local/bin/utmctl //utmctlを有効化 type utmctl >>utmctl is /usr/local/bin/utmctl //utmctlのパスを確認 utmctl list UUID Status Name [UUID] started AlpineLinux //仮想マシンのリストでNameを確認 |
utmctlのパスと仮想マシンの名前が揃ったらAutomatorを起動。
新規アプリケーションにアクションを作成。

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

色々触ってみて

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に取り込めたら完璧。
温度計は届いたのでこのまま時間を割いてみる予定。




