前回の記事では、私が プライベートクラウド「Marmot」 を開発することになった経緯をご紹介しました。
今回は、Marmot をインストールして、仮想サーバーを作成し、SSHでログインするまで を紹介します。
Marmotが目指しているのは、
「YAMLファイル1本で、自分専用のクラウド環境で、数分でVMや仮想ネットワークを構築できること」
です。
クラウド環境の構築というと、複雑なGUI操作や多数の設定項目を思い浮かべる方も多いでしょう。
Marmotでは、それらをできるだけシンプルにして、
- 学習
- テスト
- 検証
- Kubernetesの実験
- OSSの開発
などをすぐ始められる環境を提供することを目標にしています。事実、Marmot自身も、Marmot上でビルドして、Marmot上の GitHub「Self Hosted Runner」でテストを実施しています。
Marmotとは?
Marmotは、Linuxの標準的な仮想化技術を利用した プライベート・クラウド です。
第1回目で挙げた特徴に加えて、以下の便利な点を兼ね備えています。
- Ubuntu 24.04のPCを、「プライベート・クラウド」として利用できます
- 2台、3台と増設して、「Marmotクラスタ」として利用できます
- marmotのPCを専用機化する必要はありません。デスクトップと併用も可能
- CPUとメモリの搭載量を超えて割当も可能。(もちろん、CPU実装数以上の性能はでません)
インストール
インストールが完了したUbuntu 24.04で、以下のコマンドを実行するだけです。 詳細な条件は、READMEをご覧ください。
cd /tmp
apt-get update
VERSION=0.28.0
curl -OL https://github.com/takara9/marmot/releases/download/v${VERSION}/marmot_v${VERSION}_amd64.deb
sudo apt install -y ./marmot_v${VERSION}_amd64.deb
その他推奨事項
- Ubuntu 24.04 server または、 desktop のどちらでも可
- Ubuntuの最小インストールで稼働(ちょっと不便ですが)
- ネットワークの設定は、DHCPではなくマニュアル設定(外部からMarmotへアクセスできる様にIPアドレスが固定を推奨)
インストール完了後の確認
mactl version コマンドで、Server のバージョンが表示されれば、「mactlコマンド」と 「marmotデーモン」と通信できている証拠になります。
$ mactl version
Server version = 0.28.0
Client version = 0.28.0
次に管理者権限の「admin」でログインして、VMのマシンイメージのダウンロードが完了していることを確認します。
初期パスワードは、「passw0rd」なので、ご自身のパスワードに変更する事をお勧めします。
# mactl login admin
Password:
Successfully logged in as admin
marmotのインストールが完了すると、自動的に Ubuntu バージョン 24.04 のクラウドイメージをダウンロードして、Marmot用のマシンイメージを作り登録します。ネットワークの状態により時間の変動があると思います。(参考にまでに、筆者の住んでいる千葉県印西市では、マシンイメージが使用可能になるまで2分くらいでした)
マシンイメージのリストは、mactl get images で表示する事ができます。STATUSが、AVAILABLEになっていれば、Ubuntu 24.04 のマシンイメージが利用できます。
# mactl get image
NAME STATUS SYNCED LV QCOW2 AGE
---- ------ ------ ------ ----- ---
ubuntu24.04 AVAILABLE N/A no yes 1m
次にネットワークを確認しておきます。mactl get network を実行して得られるネットワークのリストは、仮想マシンが接続できるネットワークです。以下に表示される2つのネットワークが自動作成されているはずです。
$ mactl get network
NAME NODE BRIDGE STATUS AGE IP-NET
---- --------- ----------- ---------- --- --------------
host-bridge hv1 br0 ACTIVE 2m -
default hv1 virbr0 ACTIVE 2m -
「default」ネットワークは、Marmotサーバー(Marmotが動作するPC)上に閉じた「仮想ネットワーク」で、IPアドレスなどは自動的に付与されます。このネットワークに接続したVMは、外のPCなどに疎通できますが、逆はできません。
「host-bridge」は、MarmotをインストールしたPCが接続されたネットワークに接続します。そのため、IPアドレスが、既存の他IPアドレスと、重複するなどのリスクがありますので、VMを作成する管理者は、IPアドレスを管理する必要があります。
専用の仮想ネットワークを作成することもできますが、それは、別の投稿で取り上げたいと思います。
mactlのインストール
mactlコマンドは、marmotの仮想サーバーや仮想ネットワークを操作するためのコマンドです。前述の.debパッケージで mactlコマンドもインストールされます。
手元のMacやWindows PC からリモート操作したい場合は、GitHub の marmot releasesから、ビルド済みmactlの実行形式をダウンロードできます。
仮想マシンの起動 ① default ネットに接続
"default" ネットワークに接続する仮想サーバーを起動してみます。
この仮想サーバーは、図の様に外部のLANから「default network」へは制限されているので、ssh でログインすることができません。
代わりに、mactl console SERVER-NAMEで接続する仮想シリアルコンソールからログインすることができます。
apiVersion: v1
kind: Server
metadata:
name: server-1
comment: default networkに繋がるVM
spec:
cpu: 1
memory: 1024
mmImage: ubuntu24.04
networkInterface:
- networkname: default
このYAMLファイルを指定して mactl create -f MANIFEST を実行します。この辺りは、Kubernetes の kubectl コマンドと類似の仕様になっています。
$ mactl create -f server-1.yaml
要求が受け入れられると、10秒くらいで仮想サーバーが起動します。
仮想サーバーの状態は、mactl get servers または、 mactl get -f server-1.yaml で確認ができます。
$ mactl get -f server-1.yaml
NAME NODE STATUS CPU RAM(MB) IP-ADDRESS NETWORK AGE
---- ---- ------ --- ------- ---------- ------- ---
server-1 ubuntu RUNNING 1 1024 N/A default 8s
コマンドの実行から 数秒〜十数秒くらいで、仮想サーバーが起動します。
ただし、この時点で仮想サーバーのOSが起動している訳ではないので、ログインはできません。
OSが起動する過程を覗いてみるには、mactl console SERVER-NAME を実行します。
$ mactl console server-1
[ OK ] Finished systemd-networkd-wait-onl… Wait for Network to be Configured.
Starting cloud-init.service - Cloud-init: Network Stage...
[ 10.385224] cloud-init[634]: Cloud-init v. 26.1-0ubuntu1~24.04.1 running 'init' at Tue, 28 Jul 2026 09:42:21 +0000. Up 10.37 seconds.
[ 10.409619] cloud-init[634]: ci-info: +++++++++++++++++++++++++++++++++++++++Net device info+++++++++++++++++++++++++++++++++++++++
[ 10.416228] cloud-init[634]: ci-info: +--------+------+------------------------------+---------------+--------+-------------------+
[ 10.422151] cloud-init[634]: ci-info: | Device | Up | Address | Mask | Scope | Hw-Address |
<中略>
[ OK ] Finished cloud-final.service - Cloud-init: Final Stage.
[ OK ] Reached target cloud-init.target - Cloud-init target.
Ubuntu 24.04.4 LTS server-1 ttyS0
server-1 login:
ログインするには、ユーザー「root」、パスワード「ubuntu」でログインできます。
これは直ちに侵入される危険は少ないですが、セキュリティ上好ましく無いので、GitHub の Issue#358 に挙げて改善を計画しています。
ここまで10分という気持ちですが、如何でしたでしょうか?
「ネットから繋がなければクラウドの仮想サーバーでは無い」と言われると思うので、ssh で接続できる仮想サーバーの起動方法について、続けていきます。
仮想マシンの起動 ② host-bridge ネットに接続
PCが接続されているネットワークに繋がる仮想サーバーを起動します。
ここで起動する仮想サーバーは、家庭内やオフィスのLANに繋がるので、少しセキュリティが強化される形で、起動されます。
Marmotデーモンの設定(初回のみ)
仮想サーバーのIPアドレスは、marmotのデーモン marmotd が管理しています。
これはDHCPのような管理と異なり、仮想マシンのイメージを作る際に、IPアドレス範囲からIPアドレスを引き当てます。そのため、marmotdが使えるネットワークアドレスとその範囲、ゲートウェイアドレス、DNS名などを marmotd に与える必要があります。
それらの情報を登録するのが、/etc/marmot/marmotd.json です。
ホームネットワークであれば、インターネットルーターが管理するIPアドレス範囲の一部をセットすると良いでしょう。DHCPで払い出されるIPアドレス範囲の外側を利用できることが望ましいですね。
host-bridgeから始まる部分を追加します。
<前略>
"osName": "ubuntu",
"osVersion": "24.04"
}
],
"loki_push_url": "http://192.168.1.9:3100/loki/api/v1/push",
"host-bridge-ip-net-addr": "192.168.1.0/24",
"host-bridge-ip-addr-start": "192.168.1.190",
"host-bridge-ip-addr-end": "192.168.1.194",
"host-bridge-default" : {
"netmasklen": 24,
"nameservers": {
"addresses": [
"8.8.8.8"
],
"search": [
"labo.local"
]
},
"routes": [
{
"to": "default",
"via": "192.168.1.1"
}
]
}
}
SSH鍵ペアの作成
sshでログインするためSSH鍵ペアを生成して、公開鍵を仮想サーバー起動過程でセットするようにします。
同時に作成される秘密鍵は、ホームディレクトリの下 ".ssh" に保存されます。
$ ssh-keygen -t ed25519 -C "For marmot VMs" -N ""
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ubuntu/.ssh/id_ed25519):
Your identification has been saved in /home/ubuntu/.ssh/id_ed25519
Your public key has been saved in /home/ubuntu/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:5vPPjisXmqwJLTHdDm4wM3Yu4+/sweZSEDWW3gEo+/U For marmot VMs
The key's randomart image is:
+--[ED25519 256]--+
| o=o |
| . o.... |
| o o . . |
| . ..o.. |
| .Oo+.S |
| ..&.=E . |
| =.O.+o . |
| ..X o=o.o |
| .=O. o+++ |
+----[SHA256]-----+
公開鍵は、~/.ssh/id_ed25519.pub に作成されるので、仮想マシン起動用のYAMLファイルに添付して、秘密鍵を使ってログインできるようにします。
公開鍵の確認
$ cat .ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINauzBQmr0b3e30zNpXhcBmOSg+PvDJkyM5NxILntVJV For marmot VMs
仮想マシンのマニフェスト
次は host-bridge に繋がって起動する仮想サーバーのマニフェストです。
家庭内やオフィスのLANに繋がることになるので、こちらは SSH鍵が無いとログインできないように、前述で作成した公開鍵を仮想マシンにセットして、ターミナル側に保存した秘密鍵でログインできるようにします。
apiVersion: v1
kind: Server
metadata:
name: server-2
comment: PC-LANに繋がるVM
spec:
cpu: 1
memory: 1024
mmImage: ubuntu24.04
auth:
publicKey: "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINauzBQmr0b3e30zNpXhcBmOSg+PvDJkyM5NxILntVJV For marmot VMs"
users:
- ubuntu
networkInterface:
- networkname: host-bridge
上記のマニフェストを適用して、結果を確認します。
$ mactl create -f server-2.yaml
$ mactl get -f server-2.yaml
NAME NODE STATUS CPU RAM(MB) IP-ADDRESS NETWORK AGE
---- ---- ------ --- ------- ---------- ------- ---
server-2 ubuntu RUNNING 1 1024 10.10.0.100 host-bridge 7s
前述同様に、数秒〜数十秒くらいで、RUNNING状態になるのでが、OS起動には少し時間を要します。
OSが起動したところで、ログインします。ログインは、ssh IP-ADDR | DNS-NAME で実施できます。
DNS名が判らない時、IPアドレスを覚えるのが面倒な時は、mactl ssh SERVER-NAME でサーバー名でログインできます。以下がその例です。
$ mactl ssh server-2
The authenticity of host \'10.10.0.100 (10.10.0.100)\' can\'t be established.
ED25519 key fingerprint is SHA256:Fp85jcVMhkTZXrVnMCRp9m9yPjNXO6EmppD/yn6BUCM.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added \'10.10.0.100\' (ED25519) to the list of known hosts.
Welcome to Ubuntu 24.04.4 LTS (GNU/Linux 6.8.0-136-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
<中略>
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
ubuntu@server-2:~$
VMを削除する
不要になった環境は、すぐ削除できます。
mactl delete server SERVER-NAME
検証環境を気軽に作って、使い終わったらすぐ消せる。
これもMarmotが大切にしている考え方です。
コントリビューター募集中!
Marmotは現在も開発を続けているOSSです。
Go、KVM、Libvirt、OpenAPI、Linux仮想化技術に興味のある方は、ぜひ一緒に開発していただけるとうれしいです。
コードだけでなく、
- 使用体験ブログ
- バグ報告
- ドキュメント改善
- サンプル追加
- 動作確認
といった貢献も大歓迎です。
GitHubのIssueやPull Requestをお待ちしています。
GitHub Repository https://github.com/takara9/marmot
次回予告
次回は、
「なぜMarmotはYAMLを採用したのか」
というテーマで、GUI中心の運用との違いや、Gitによる構成管理との親和性について紹介したいと思います。


