Mac mini (Late 2014) を Cockpit KVM サーバーにする備忘録です.
はじめに
いままで無償で利用できていた VMWare ESXi が ESXi8 以降は利用できなくなるので,その代わりとして使えるか検証用として少し古い Mac mini (Late 2014) に Cockpit + KVM 環境を構築してみました.
個人的な環境の場合のVMWare ESXi の代わりは,Proxmox VE が多そうな感じですが,GUI があまり好みに合いません.GUI がキレイな Nutanix Community Edition は要求仕様が厳しい.ということで,GUI がスッキリしていて要求仕様もそれほど厳しくない Cockpit + KVM を試してみることにした訳ですね。
Mac mini Late 2014 の仕様
一応 Mac mini Late 2014 の仕様を以下の通りです.所謂 Fusion ドライブのモデルです.
- CPU: Core i5-4308 2.8GHz
- Memory: 8GB
- Strage: SSD 128GB + HDD 1TB
OS の導入
導入OS は Ubuntu 24.04.1 LTS です.理由は Wi-Fi の認識です.
最初は Almalinux 9.4 で試したのですが,Mac mini の Wi-Fi モジュール Broadcom BCM4360 を動作させることがかなり困難でした.Cockpit は Red Hat が開発元のようなので,できれば Red Hat 系の OS を使いたかったので,これは残念なところです.
Ubuntu 24.04.1 LTS の導入
Ubuntu の導入手順は以下の通りです.
- Ubuntu の公式ページから Ubuntu Server 24.04.1 LTS の ISO をダウンロード
- CTRL + R で Mac mini の macOS 復旧復旧システムを起動し,ディスユーティリティで SSD + HDD を全て削除して電源断
- 手順1でダウンロードした ISO ファイルから Mac mini を起動
- Server World さんの記事に従って初期セットアップを実施(インストールの種類は Ubuntu Server (minimized) を選択,また,追加オプションとして Search for third-party driver を選択)
注意点は以下の通りです
- 手順3は,USB 接続の仮想ODDドライブ(DVDドライブのエミュレーター)を用いて実施しました.ISO ファイルを USB メモリに書き込んだものだとなぜか起動してくれませんでした.
- USB 接続のキーボードが必要です.ワイヤレスの Mac mini の純正キーボードは Bluetooth 接続のため,セットアップ時に使えません.
- Fusion ドライブは解除され,HDD が /dev/sda,SSD が /dev/sdb で認識されました.Ubuntu は SSD に導入しています.
Wi-Fi の認識
Mac mini の Wi-Fi モジュール Broadcom BCM4360 を動作させるため,記事
を参考に,以下の作業を実施しました.
$ sudo apt-get install --reinstall bcmwl-kernel-source
再起動後,ip a show に,
3: wlp2s0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state DORMANT group default qlen 1000 link/ether ff:ff:ff:ff:ff:ff brd ff:ff:ff:ff:ff:ff
のような表示があればきちんと認識できています.
Cockpit の導入
Cockpit の導入は以下の手順で行いました.
- Cockpit パッケージの導入
- ソフトウェアの更新問題への対応
- ストレージログのエラーへの対応
- SSL 対応
Cockpit パッケージの導入
Cockpit の導入は apt で関係パッケージを入れて,socket を起動するだけです.
$ sudo apt -y install cockpit $ systemctl enable cockpit.socket
なお,Cockpit は「アプリケーション」を追加することでさまざまな機能拡張ができますが,Ubuntu の場合,はじめから導入されるアプリケーションは,
- ストレージ(ストレージの管理)
- ネットワーキング(Cockpit の NetworkManager と Firewalld の設定)
だけで,KVM 管理等のアプリケーションはあとで追加導入する必要があることに注意が必要です.また,初期導入されるこれら2つのパッケージについても問題がありますので,これらに対応する必要もあります.
ソフトウェア更新問題への対応
Cockpit の「ソフトウェア更新」が正常に行えるようにするために必要な作業は以下の通りです.
- 以下の内容の /etc/NetworkManager/conf.d/10-globally-managed-devices.conf ファイルを作成する.
[keyfile] unmanaged-devices=none
- dummy network interface を作成する.
$ sudo nmcli con add type dummy con-name fake0 ifname fake0 ip4 1.2.3.4/24 gw4 1.2.3.1
- 再起動する.
本問題は Cockpit の FAQ のようです.実際,公式ページに,
の通り対応方法が案内されています.なお,この対応方法だと,Cockpit の「ネットワーキング」からネットワークインターフェースの設定が変更できなくて不便なので,KVM の導入時に再度ネットワークの設定し直していることを注意しておきます.
ストレージログのエラーへの対応
ストレージログに出るエラーに対応するために,以下のパッケージを apt で導入する必要があります.
$ sudo apt install udisks2 udisks2-lvm2 udisks2-btrfs
ただし,これらのパッケージ導入後も残念ながら以下のエラーが表示されます.
Error initializing module ‘iscsi’: /usr/lib/x86_64-linux-gnu/udisks2/modules/libudisks2_iscsi.so: cannot open shared object file: No such file or directory
エラーの内容から,libudisks2_iscsi.so を含むパッケージを導入しなければならないことが分かりますが,残念ながら対応のパッケージがいまのところ見つかりません(Red Hat 系のパッケージはあるが,Debian 系のものがない).ただし,ファイル名からわかる通り,iscsi を使わなければ問題がなさそうなので,とりあえず今のところは本エラーへの対応は保留しています.
SSL 対応
このままだとブラウザで Cockpit にアクセスすると「危険なサイト」と表示されるため, Cockpit の証明書を入れ替えます.
まず,本件についての公式の情報は,
です.これに従い,実際に以下のように証明書を入れ替えています.ただし,macmini.crt が自分で用意した証明書,macmini.key が対応する秘密鍵ファイルです.
# Cockpit が利用中の証明書のチェック $ sudo /usr/lib/cockpit/cockpit-certificate-ensure --check Would use certificate /etc/cockpit/ws-certs.d/0-self-signed.cert # 証明書ファイルの移動 $ sudo mv macmini.crt /etc/cockpit/ws-certs.d $ sudo mv macmini.key /etc/cockpit/ws-certs.d $ sudo chown root:root /etc/cockpit/ws-certs.d/macmini.crt $ sudo chown root:root /etc/cockpit/ws-certs.d/macmini.key $ sudo chmod 644 /etc/cockpit/ws-certs.d/macmini.crt $ sudo chmod 600 /etc/cockpit/ws-certs.d/macmini.key # 再起動後 $ sudo /usr/lib/cockpit/cockpit-certificate-ensure --check Would use certificate /etc/cockpit/ws-certs.d/macmini.crt
なお,Let’s encrypt の無償の証明書発行サービスを用いた SSL 化については例えば,
などの記事を参照して頂ければと思います.
KVM の導入
KVM の導入は以下の手順で行いました.
- KVM パッケージの導入
- Cockpit-machines パッケージの導入
- ブリッジネットワークの追加
KVM パッケージの導入
KVM の導入自体は apt で必要なパッケージを導入し,サービスを起動し,ユーザーを登録するだけです.
$ apt -y install qemu-kvm libvirt-daemon-system libvirt-daemon virtinst bridge-utils libosinfo-bin $ systemctl enable --now libvirtd $ systemctl status libvirtd # usermod -aG kvm hyt # usermod -aG libvirt hyt
Cockpit-machines パッケージの導入
これも apt で Cockpit-machine パッケージを導入するだけです.
$ sudo apt install cockpit-machines
なお,導入直後はなぜか Cockpit メニュー項目が英語表記 (Machines) でしたが,これは再起動することで日本語表記(仮想マシン)となりました.
ブリッジネットワークの追加
KVM を追加すると,デフォルトで virbr0 という名称の仮想インターフェースが追加され,アドレスとして 192.168.122.1/24 が割り当てられます.また,この virbr0 には NAT が設定されていて,標準で KVM の仮想マシンはこの virbr0 経由でインターネットへの疎通が確保されるようです.
しかし,この方式だと,ホストマシン等から直接仮想マシンに接続できず,不便です.このため,多くの方が この virbr0 とは別のブリッジインターフェースを作り,仮想マシンで利用しているようなので,私の場合もこれに従い,以下の手順でブリッジインターフェースを作成しました.なお,enp3s0f0 は ethernet インターフェース名であることにご注意ください.
- enp3s0f0 の固定IP化と NetManager の管理下への移行
$ sudo nmcli con add type ethernet con-name enp3s0f0 ifname enp3s0f0 ip4 192.168.0.100/24 gw4 192.168.0.1
- dummy インターフェースの削除
$ sudo nmcli c delete fake0 # Cockpit の「ネットワーキング」から削除でも可
- /etc/systemd/resolv.conf の書き換え
$ sudo vi /etc/systemd/resolv.conf DNS=192.168.0.1 #FallbackDNS= Domains=example.net #DNSSEC=no #DNSOverTLS=no #MulticastDNS=no #LLMNR=no #Cache=no-negative #CacheFromLocalhost=no #DNSStubListener=yes #DNSStubListenerExtra= #ReadEtcHosts=yes #ResolveUnicastSingleLabel=no #StaleRetentionSec=0
- /etc/netplan/50-cloud-init.yaml の書き換え
$ sudo vi /etc/netplan/50-cloud-init.yaml network: version: 2 ethernets: enp3s0f0: dhcp4: false addresses: - 192.168.0.100/24 routes: - to: default via: 192.168.0.1 nameservers: addresses: - 192.168.0.1 search: [example.net] ------- # この部分は以下のようにする方が良いかもしれません(2024/11/15追記) network: version: 2 ethernets: enp3s0f0: optional: true
- 再起動
- Cockpit の「ネットワーキング」の「ブリッジの追加」を選択し,
名前: bridge0
ポート: enp3s0f0
として「追加」
なお,手順1と4が被っているように見えますが,手順4を省略すると,systemd-networkd-wait-online.service が起動せず,結果,ssh や Cockpit での接続にしばらくの間不具合が生じます.ここで「しばらくの間」と書いたのは,2分経過すると,systemd-networkd-wait-online.service の起動がキャンセルされることで ssh や Cockpit への接続が行えるようになるからです.つまり,設定しなくても(失敗しても)2分待てば使えるようになりますが,この場合も Cockpit に systemd-networkd-wait-online.service のエラーが表示されたままになってしまいます.
おわりに
ということで,最低限,Cockpit で KVM で仮想マシンを動かせるようになりましたが,そもそも KVM 自体に慣れていないため,まだわからないところだらけです.
ということで,KVM についてはいろいろ勉強しなければならないので,この辺りについてはまた別記事でまとめたいと考えています.
以上!