Show HN: Holos –QEMU/KVM を、Compose スタイルの YAML ファイル、GPU の利用、そしてヘルスチェック機能を備えた形で提供するプロジェクトです。

2026/04/21 6:13

Show HN: Holos –QEMU/KVM を、Compose スタイルの YAML ファイル、GPU の利用、そしてヘルスチェック機能を備えた形で提供するプロジェクトです。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

KVM 用の Docker Compose は、複雑な libvirt XML や Kubernetes コントロールプレーンの代わりに軽量な YAML ファイルを使用して、単一のホスト上で複数の VM を管理するための簡素化された方法を提供します。

holos.yaml
ファイル内の単純なプリミティブ(レプリカ、バインドマウント、命名ボリュームなど)で完全に VM スタックを定義し、そこでサービス(イメージ、vCPU、メモリ)、cloud-init 構成、および依存関係を指定します。主要な CLI コマンドには
holos up
holos down
holos ps
holos install/uninstall
、SSH キーが自動的に生成される
holos exec
holos images
、および既存の libvirt ドメインを転換するための
holos import
が含まれます。サービスは QMP system_powerdown を使用したグレースフルシャットダウンをサポートし、SIGTERM/SIGKILL にフォールバックすることで対応します。また、VFIO を介した GPU パススルーをサポートしており、ホストの IOMMU および適切な BIOS/UEFI 設定と PCI バインディングが必要になります。ネットワーク機能は、ルートまたは手動ブリッジ構成を必要とせず、ソケットマルチキャストを使用して内部の 10.10.0.0/24 セグメント上で名前での VM 間通信を可能にします。人気のあるディストリビューション向けのビルトインイメージが自動的に引き出され、キャッシュされます。Dockerfile を使用して VM のプロビジョニングを行え、RUN/COPY/ENV 指示は cloud-init を介して実行されるシェルスクリプトへと変換されます。任意の QEMU 引数は
extra_args
フィールドを通じてサポートされます。ランタイムは Linux(
/dev/kvm
を必要とする)をターゲットとしており、macOS は validate および import のようなオフラインサブコマンドをサポートします。リリースは GoReleaser を使用して Git タグに基づいてビルドされ、Linux/macOS amd64/arm64 へのクロスコンパイルおよび SHA-256 チェックサムが実装されています。

本文

Docker Compose 形式による KVM: はじめに

複数の仮想マシン(VM)のスタックを、libvirt や XML、分散制御プレーンを使用せず、単一の YAML ファイルで定義します。基本単位はコンテナではなく、すべてのワークロードインスタンスに対して独自のカーネル境界、独自の qcow2 オーバーレイ、そして独自の cloud-init シードを提供する「仮想マシン」が採用されています。

クイックスタート

holos.yaml
を作成します:

name: my-stack

services:
  db:
    image: ubuntu:noble
    vm:
      vcpu: 2
      memory_mb: 1024
    cloud_init:
      packages:
        - postgresql
      runcmd:
        - systemctl enable postgresql
        - systemctl start postgresql

  web:
    image: ubuntu:noble
    replicas: 2
    depends_on:
      - db
    ports:
      - "8080:80"
    volumes:
      - ./www:/srv/www:ro
    cloud_init:
      packages:
        - nginx
      write_files:
        - path: /etc/nginx/sites-enabled/default
          content: |
            server {
                listen 80;
                location / { proxy_pass http://db:5432; }
            }
      runcmd:
        - systemctl restart nginx

起動するだけで済みます。これにより、ホスト上の同じ場所で、お互いの名前を使って通信し合う 2 つの Nginx VM と 1 つの PostgreSQL VM が立ち上がります。

コマンドラインインターフェース(CLI)

コマンド説明
holos up [-f holos.yaml]
すべてのサービスを開始する
holos down [-f holos.yaml]
すべてのサービスを停止および削除する
holos ps
実行中のプロジェクトをリストする
holos start [-f holos.yaml] [svc]
停止中のサービスまたはすべてのサービスを開始する
holos stop [-f holos.yaml] [svc]
サービスまたはすべてのサービスを停止する
holos console [-f holos.yaml] <inst>
インスタンスのシリアルコンソールに接続する
holos exec [-f holos.yaml] <inst> [cmd...]
プロジェクトが生成したキーを使用して、インスタンス内へ SSH する
holos logs [-f holos.yaml] <svc>
サービスのログを表示する
holos validate [-f holos.yaml]
Compose ファイルを検証する
holos pull <image>
クラウドイメージをプルする(例:alpine, ubuntu:noble)
holos images
利用可能なイメージをリストする
holos devices [--gpu]
PCI デバイスおよび IOMMU グループをリストする
holos install [-f holos.yaml] [--system] [--enable]
プロジェクトが再起動後も存続するように、systemd ユニットを生成する
holos uninstall [-f holos.yaml] [--system]
holos install
で作成された systemd ユニットを削除する
holos import [vm...] [--all] [--xml file] [--connect uri] [-o file]
virsh 定義済み VM を holos.yaml に変換する

Compose ファイル構成

holos.yaml
の形式は意図的に docker-compose と類似しています:

  • services: 各サービスは、独自のイメージ、リソース、および cloud-init 設定を持つ VM です。
  • depends_on: サービスは依存関係の順序に従って起動します。
  • ports:
    "ホスト:ゲスト"
    シNTAX を使用し、レプリカ間では自動増番されます。
  • volumes: バインドマウントには
    ./source:/target:ro
    、トップレベルの名前付きボリュームには
    name:/target
    を使用します。
  • replicas: サービスを N インスタンス実行します。
  • cloud_init: パッケージ、write_files、runcmd — 標準的な cloud-init の機能です。
  • stop_grace_period: ACPI シャットダウン後に SIGTERM/SIGKILL を発行するまでの待ち時間(例:
    "30s"
    "2m"
    );デフォルトは 30s です。
  • healthcheck: 依存項を制御するためのテスト、interval、retries、start_period、timeout です。
  • トップレベルの volumes ブロック:
    holos down
    を実行しても持続する名前付きデータボリュームを宣言します。

例:

name: demo
services:
  db:
    image: ubuntu:noble
    stop_grace_period: 60s # ハード停止前に DB バッファをフラッシュする
    volumes:
      - pgdata:/var/lib/postgresql

volumes:
  pgdata:
    size: 20G

データボリューム

トップレベルのボリュームは、

state_dir/volumes/<プロジェクト>/<名前>.qcow2
に存在する命名データストアを宣言し、各インスタンスの作業ディレクトリへのシンボリックリンクとして接続されます。これらは
holos down
でも生存します — プロジェクトのティアダウンではシンボリックリンクのみが削除され、ベースとなるファイルは決して削除されません。

name: demo
services:
  db:
    image: ubuntu:noble
    volumes:
      - pgdata:/var/lib/postgresql

volumes:
  pgdata:
    size: 20G

ボリュームは安定したシリアル番号

vol-<名前>
を持つ virtio-blk デバイスとして接続され、ゲスト内では
/dev/disk/by-id/virtio-vol-pgdata
として表示されます。cloud-init は最初の起動時に冪等な
mkfs.ext4
/etc/fstab
のフラグメントを実行するため、手動での設定は不要です。

ヘルスチェックと depends_on

ヘルスチェックを備えたサービスは、チェックが通るまで依存項の起動をブロックします。プローブは SSH(

holos exec
で使用する同じキー)を使用して実行されます:

services:
  db:
    image: postgres-cloud.qcow2
    healthcheck:
      test: ["pg_isready", "-U", "postgres"]
      interval: 2s
      retries: 30
      start_period: 10s
      timeout: 3s
  api:
    image: api.qcow2
    depends_on: [db] # db が健全になるまで待機する

test
はリスト(exec フォーマット)または文字列(
sh -c
でラップされるもの)を受け取ります。実際のプローブをスキップするには
HOLOS_HEALTH_BYPASS=1
を設定します — これ是客户環境でゲスト内の SSHD がない場合に便利です。

holos exec

holos up
は、
state_dir/ssh/<プロジェクト>/
下でプロジェクト固有の SSH キーペアを自動生成し、公開鍵を cloud-init を介して注入します。各インスタンスに対してホストポートが割り当てられ、ゲストのポート 22 へフォワードされるため、以下の操作が可能です:

  • holos exec web-0
    : インタラクティブなシェル
  • holos exec db-0 -- pg_isready
    : ワンショットコマンド

-u <ユーザー>
を指定することでログインユーザーをオーバーライドできます(デフォルトはサービスのカスタム設定の
cloud_init.user
、または ubuntu)。

再起動時の耐性

ホストが再起動した後にもプロジェクトが復元されるよう、systemd ユニットを生成します:

  • holos install --enable
    : ユーザー固有であり、sudo を必要としない
  • holos install --system --enable
    : ログイン前のシステム全体レベル
  • holos install --dry-run
    : ユニットを出力し終了する

ユーザーユニットは

~/.config/systemd/user/holos-<プロジェクト>.service
下に配置され、システムユニットは
/etc/systemd/system/
下になります。
holos uninstall
はこれを逆転します(冪等であり、2 回呼び出しても安全です)。

ネットワーキング

各サービスは名前で他のすべてのサービスに到達できます。その裏側では:

  • 各 VM は 2 つの NIC を持っています:ユーザモード(ホストポートの転送用)とソケットマルチキャスト(VM 間での L2 通信用)。
  • 静的 IP アドレスは、内部
    10.10.0.0/24
    セグメントで自動的に割り当てられます。
  • /etc/hosts
    は cloud-init を介して填充され、
    db
    web-0
    web-1
    などすべてが解決されます。
  • libvirt の使用はありません。ブリッジの設定も不要です。VM 間のネットワーキングに root アクセスは必要ありません。

GPU パススルー

VFIO を介して物理的な GPU(または任意の PCI デバイス)を直接 VM に渡します:

services:
  ml:
    image: ubuntu:noble
    vm:
      vcpu: 8
      memory_mb: 16384
    devices:
      - pci: "01:00.0" # GPU
      - pci: "01:00.1" # GPU オーディオ
    ports:
      - "8888:8888"

holos が担当する処理

  • デバイスが存在する場合、UEFI 起動が自動的に有効になります(OVMF ファームウェア)。
  • NVIDIA 互換性のためにマシンの
    kernel-irqchip=on
    が設定されます。
  • 各 VM に独自の EFI 変数ストアを持つよう、インスタンスタイプごとの OVMF_VARS コピーを行います。
  • カスタム VBIOS ROM 用のオプションの rom_file

ユーザーが担当する処理(ホストセットアップ)

  • BIOS およびカーネルで IOMMU を有効にする(
    intel_iommu=on
    または
    amd_iommu=on
    )。
  • GPU を vfio-pci ドライバーにバインドする。
  • PCI アドレスと IOMMU グループを探すために
    holos devices --gpu
    を実行する。

イメージ

独自の構築ではなく、事前に用意されたクラウドイメージを使用します:

services:
  web:
    image: alpine # 自動プルおよびキャッシュされる
  api:
    image: ubuntu:noble # 特定のタグ
  db:
    image: debian # デフォルトは debian:12

利用可能なもの:

alpine
arch
debian
ubuntu
fedora
。すべてのタグを見るには
holos images
を実行します。

Dockerfile

VM のプロビジョニングに Dockerfile を使用します。RUN、COPY、ENV、WORKDIR 指令は、cloud-init が実行するシェルスクリプトに変換されます:

FROM ubuntu:noble

ENV DEBIAN_FRONTEND=noninteractive

RUN apt-get update && apt-get install -y nodejs npm
COPY server.js /opt/app/
WORKDIR /opt/app
RUN npm init -y && npm install express

イメージが省略された場合、ベースイメージは Dockerfile の

FROM
行から取得されます。Dockerfile の指令は、すべての
cloud_init.runcmd
エントリより前に実行されます。

  • サポートされているもの:FROM, RUN, COPY, ENV, WORKDIR
  • サポートされていない指令(CMD, ENTRYPOINT, EXPOSE など)は静かにスキップされます。
  • COPY のソースは Dockerfile のディレクトリ相対で解決され、ディレクトリではなくファイルである必要があります — ディレクトリマウントにはボリュームを使用してください。

追加の QEMU アーギュメント

extra_args
を使用して、任意のフラグを直接 qemu-system-x86_64 に渡します:

services:
  gpu:
    image: ubuntu:noble
    vm:
      vcpu: 4
      memory_mb: 8192
      extra_args:
        - "-device"
        - "virtio-gpu-pci"
        - "-display"
        - "egl-headless"

アーギュメントは、holos が管理するすべてのフラグの後に付加されます。検証はありません — あなたの責任です。

リソースデフォルト

フィールドデフォルト
replicas1
vm.vcpu1
vm.memory_mb512
vm.machineq35
vm.cpu_modelhost
cloud_init.userubuntu
image_format拡張子から推測される

libvirt からインポート

libvirt 下ですでに実行中の VM はありますか?

holos import
は libvirt ドメイン XML を読み取り、既存のワークロードを holos へ移動させるためにすべてのフィールドを手入力することなく、同等の holos.yaml を出力します。

holos import web-prod db-prod                # `virsh dumpxml` を介して
holos import --all -o holos.yaml             # 定義されたすべてのドメイン
holos import --xml ./web.xml                 # オフラインで、virsh が不要
holos import --connect qemu:///system api    # デフォルトではない libvirt URI

マッピングは、holos に直接相当するフィールドをカバーしています:

libvirtholos
<vcpu>
vm.vcpu
<memory>
/
<currentMemory>
vm.memory_mb
<os><type machine="pc-q35-…">
vm.machine
(縮小済み)
<cpu mode="host-passthrough">
vm.cpu_model: host
<os><loader>
vm.uefi: true
最初の
<disk type="file">
image:
+
image_format:
<hostdev type="pci">
devices: [{pci: …}]

holos がきれいに変換できないもの — 追加のディスク、ブリッジ NIC、USB パススルー、カスタムエミュレーターなど — は stderr で警告として報告され、

holos up
の前に何を見直す必要があるかを知るのに役立ちます。出力は
-o
を渡すまで標準出力に送出されるため、シェルリダイレクトと相性が良いです(
holos import vm > holos.yaml
)。

インストール

プリビルトの実行バイナリ(Linux および macOS、amd64 および arm64)は、すべての GitHub リリースに添付されています:

TAG=v0.1.0
curl -L https://github.com/zeroecco/holos/releases/download/$TAG/holos_${TAG#v}_Linux_x86_64.tar.gz \
  | sudo tar -xz -C /usr/local/bin holos
holos version

または、ソースから構築することもできます(下記参照)。

  • Linux だけが実行目標です —
    holos up
    /dev/kvm
    および
    qemu-system-x86_64
    を必要とします。
  • macOS のビルドは存在しており、オフラインサブコマンド(
    validate
    import
    images
    )がラップトップ上の Compose ファイル作成のために機能します。

ビルド

go build -o bin/holos ./cmd/holos

リリースの作成

GoReleaser がすべての

v*
git タグでリリースを生成します(
.github/workflows/release.yml
を参照):

git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0

このワークフローでは 4 つのターゲットをクロスコンパイルし、LICENSE/NOTICE/README.md と一緒にパッケージ化し、SHA-256 チェックサムを計算し、コミットログからリリースノートドラフトを作成し、GitHub リリースを公開します。

ローカルで公開せずに練習するには:

goreleaser release --snapshot --clean --skip=publish
ls dist/

ゲストイメージの構築(mkosi が必要)

ホスト要件

  • /dev/kvm
  • qemu-system-x86_64
  • qemu-img
  • cloud-localds、genisoimage、mkisofs のうちの一つ、または xorriso
  • mkosi (ベースイメージの構築用のみ)

目的外(Non-Goals)

これは Kubernetes ではありません。解決しようとするものではありません:

  • マルチホストクラスタリング
  • ライブマイグレーション
  • サービスメッシュ
  • オーバーレイネットワーク
  • スケジューラ、CRD、または制御プレーンのクォーラム

目標は、Kubernetes の運用形状を輸入することなく、シングルホストスタックに対して KVM を機能させることです。

ライセンス

Apache License Version 2.0 に基づいています。帰属については NOTICE を参照してください。

同じ日のほかのニュース

一覧に戻る →

2026/04/21 5:39

ジョン・テルナス氏、次期アップル CEO に就任

## Japanese Translation: 欠落している要素は、キーポイントリストからの具体的なデータポイントおよび製品の詳細を組み込んだ改良されたバージョンを採用する価値があり、ソース資料の包括的な反映を確保するためには十分な重大さがあります。 **改善されたサマリー:** Apple は、John Ternus が 2026 年 9 月 1 日に CEO に就任し、Tim Cook を後継することを含む大規模なリーダーシップ移行を公式に確認しました。取締役会はこの計画を全会一致で承認し、Cook が 2011 年に CEO に就任してから歴史的な業績を認識しています。彼は社員の市場価値を約 3500 億ドルから 4 兆ドルへと成長させ、収益を 2011 会計年度の 1080 億ドルから 2025 会計年度の 4160 億ドル以上までほぼ四倍に拡大しました。Cook は日常業務から退き、執行議長として務める一方で、夏の間は CEO を辞任せず、円滑な引き継ぎを確保します。彼の指導の下、Apple は Apple Watch、AirPods、Vision Pro という象徴的な新カテゴリーを導入し、自社設計のシリコンに移行し、200 カ国以上および地域に店舗を持つ 500 店以上の小売網を拡大しました。また、チームメンバーが 100,000 名以上増加し、現在稼働している 25 億台超のデバイスベースを支援しています。 John Ternus は、2001 年に製品設計チームの一員として Apple に加入し、2021 年にハードウェアエンジニアリング担当副社長となり、2026 年 9 月 1 日に CEO の役職を引き継ぎ、取締役会に就任します。彼の指導の下、MacBook Neo、iPhone Air、フルモデルの iPhone 17 シリーズ、アクティブノイズキャンセレーション搭載のアバンスド AirPods、Apple Watch Ultra 3 に用いられた再生アルミニウムや 3D プリンティング钛など、重要なハードウェア革新を監督しました。さらに、Arthur Levinson は 2026 年 9 月 1 日に非執行会長からリードインディペンデントダイレクターへ移行します。この戦略的なシフトは、Apple の長期的なビジョンを固めるものであり、ハードウェア革新と持続可能性への深いコミットメントを持つ内部人材へのリーダーシップの引継ぎによって実現され、新鮮でありながら親しみのあるリーダーシップの下での継続性を確保します。

2026/04/21 6:32

「楽しさと利益のためのジュージ・メガマージ」

## 日本語訳: 記事は、JUJUTSU で導入される簡素化されたバージョン管理ワークフロー「megamerge」について紹介しています。これは、オクトパス合併(3 つ以上の親を持つ合併)を用いて、複数の開発ブランチを単一のローカルのベースコミットに統合します。不安定なブランチの先頭に直接作業を行う代わりに、開発者は関連する上流ブランチ(機能追加、バグ修正、設定など)を親とする空の megamerge コミットを作成し、作業コピーが常にすべての変更を統合してコンパイル可能になるように確保するとともに、タスクを変更する際に予期せぬリモート合併競合を排除します。 megamerge を開始するには、`jj new x y z` を実行した後に `jj commit --message "megamerge"` を実行し、指定されたブランチを親とする空のコミットを作成します。すべての書き込みは、このベース(WIP ス tack)の上で実施され、megamerge がローカルに留まることで安定性を保ちます。個々の機能ブランチは遠隔リポジトリへ通常通り公開し続けますが、megamerge 自体はプッシュされません。 `jj absorb` を用いて上流の変更を自動的に統合するワークフローでは、約 90% の更新を後続的可変コミットに圧縮して同定します。新しい作業で独自のコミットが必要になる場合は、bookmark を更新しながら WIP を megamerge の下に移動するために `jj rebase --revision y --after x --before megamerge` を使用します。並列ス tack の管理には revset アリヤス(例: `"closest_merge(to)" = "heads(::to & merges())"`)および `stack` コマンドを用い、`stage = ["stack", "closest_merge(@).. ~ empty()"]` というようにのアリヤスで一度にステージリングし、その後 `jj stage` を実行します。 メインブランチ(`trunk()`)との同期を維持するには `jj rebase --onto trunk()` を使用でき、これは自分が所有するコミットに対して動作し、他者によるブランチは保護されます。Mutable コミットのみを安全に trunk へ rebase するための場合は、`restack = ["rebase", "--onto", "trunk()", "--source", "roots(trunk()..) & mutable()"]` というようなアリヤスを使用します。全体として、このアプローチは合併による面倒を大幅に削減し、新しい作業が堅牢な統合された基盤の上に自然と構築されるような円滑で協力的なサイクルをサポートします。

2026/04/21 4:51

『Soul Player C64 ―1MHz のコモドール64で動作する本物のトランスフォーマー』

## Japanese Translation: Soul Player C64 は、未修正の Commodore 64 でネイティブ速度(約 1MHz)で完全動作する縮小版变压器モデルを実行し、画期的な成果を達成しました。このシステムは、2 レイヤーのdecoder-only アーキテクチャを実装するため、手書きの 6502/6510 アセンブリ言語を使用しており、リアルなマルチヘッド因果的自己注意機構、RMSNorm、および ソフトマックス(128 エントリのルックアップテーブル経由で)を備えており、すべてが 1 つのフロッピーディスクに収まります。主要な技術的突破口としては、6502 プロセッサの精度限界を克服しつつ有意義な重みを保つために、標準の 17 ビットではなく 14 ビットのみで注意スコアをシフトすることなどが挙げられます。 ChatGPT のような現代の巨人と並んでモデルは動作しますが、約 25,000 int8 パラメータという厳格な制約下にあります:単語書式は 128 トークン(大文字を未知として扱う)、埋め込み次元は 32、最大トレーニングコンテキストウィンドウは 20 トークンです。推論にはトークンあたり約 60 秒かかりつつも、レガシーハードウェアでのローカル機械学習の探求へのアクセシブルなパスを提供します。 このプロジェクトには、ユーザーがカスタムモデルをトレーニングするための包括的なツールが含まれています:`train.py` は Quantization-Aware Training (QAT)、FakeQuantI8、およびラベルスムージングをサポートし、重みをコンパクトなバイナリ形式にエクスポートします;`build.py` は C64 バイナリをコンパイルします;`test.py` はほぼ 90 の厳密な検証テストにより安定性を確保します。リリースパッケージにはソースファイルと即座に実行可能なビルドの両方が含まれており、高度な AI コンセプトがハードウェア変更なしでビンテージシステム上で機能することを示しています。