
2025.03.27
「過去1年でインシデントが増加」と回答した人は約8割 大規模化かつ高速化するDDoS攻撃から企業を守る、最新セキュリティ
リンクをコピー
記事をブックマーク
鈴ヶ嶺聡哲氏(以下、鈴ヶ嶺):ここまではmacOSの仮想化技術の変遷でしたが、ここから新しくVirtualization.frameworkが登場します。これは先ほども言いましたが、macOS 11 Big Surから追加された、VM作成の高レベルのAPIです。
Linux専用のAPIになっていて、kernelやinitrdを指定することで起動できます。これはHypervisor.frameworkとは違い、Intel MacとApple Siliconベースの両方のMac対応の抽象化されたAPIになっているので、簡単にLinux VMを作成可能です。
このようにConfigで保存できるものが、CPUやメモリ、あとはネットワークのドライバやソケットなどが対応しています。ネットワークに関しては、NATやV2 Networkが現状は対応可能です。
2020年12月16日に発表されたプレビュー版のDocker、Docker Desktop for M1についてです。Apple Siliconでは、従来Intel Macで使われたhyperkitから、Virtualization.frameworkに移行しています。
Intel Macでも移行を検討しているような発言が、Dockerのロードマップのイシューのところにあがっています。今後hyperkitのサポートがどうなるのか、個人的にすごく気になります。
Rustのbindingで私が作成したvirtualization-rsの説明をします。Virtualization.frameworkのRust bindingを今回作成しました。Rustの特徴としては、モダンな型システムや、型推論、メモリ安全性、高速実行などいろいろあります。
Linux VMを作成する今回のようなシステムソフトウェアを書く言語として、非常に適しているのではないか、ということで作成しました。
中身の実装がどうなっているのか説明します。objcと呼ばれる、Objective-Cのオブジェクトが操作可能なRustのパッケージがあります。
Objective-Cはカッコでメッセージを飛ばすと思いますが、Rustでもマクロを使い、msgSendでメッセージを送る、Objective-CライクなAPIになっています。有名どころだと、Mac版ではservoもこのパッケージを使用して対応しています。
内部的な実装は、Objective-CのRuntimeという、dynamic libraryのC APIが存在しているので、このようにクラスがstructで定義されていたり、メッセージを飛ばすものが関数として用意されています。これをRustからCのAPIを叩いて、Objective-Cのobjectを操作するような内部実装になっています。
ここからデモに移ります。どのようにLinux VMを作成するか説明します。
cloud-initと呼ばれる、もともとAWSのEC2上で開発されていたインスタンスを、初期化するための標準仕様があります。このようにmeta-dataにhostnameやinstance-idを設定したり、user-dataにuserやpassword、sshするためのkeyなどを設定すると、それが初期化されたインスタンスが立ち上がる仕様があります。
その仕様の中に、ネットワークサービスを実行することなく初期化設定を可能とする、NoCloudがあって。meta-dataやuser-dataをisoに固めて、filesystemを介して渡すことでその設定が可能になります。今回はそれを使用していきたいと思います。
Linuxのイメージは、UbuntuのCloud imageと呼ばれる、常に最新のアップデートが適用されているLinuxのイメージを使ってやります。クラウドのインスタンスやDockerなどは、UbuntuのCloud imageが使われています。
NoCloudのisoの作成例です。chpasswdとすると、ここではrootのパスワードを変更したり、Ubuntuのパスワードをubuntuにする変更になっています。
meta-dataに関しては、このようにインスタンスのidをfoober0に設定したり、hostnameをfooberに設定して、isoに固めるようなコマンドを実行することで、NoCloudのisoが作成可能になります。
次にデモ動画に移りたいと思います。
(動画再生開始)
このようにGitHub上にあげたvirtualization-rsをダウンロードして、そこからwgetでCloud imageを落としていきます。
Cloud imageは、UbuntuのCloud imageなどと検索するとトップに出てきます。これをクリックすると、バージョンごとのUbuntuのCloud imageが出てくるので、20.04のものを選択します。currentを選択すると、それぞれのアーキテクチャごとのイメージがあります。
ここのファイルシステムイメージを落として、次にカーネルとinitrdを落とします。これらのパッケージはデイリーで常にビルドされているので、最新のものがすぐ手に入るようになっています。
このように、wgetで3つとも落とします。そして、tarでイメージを解凍します。もともとのサイズがちょっと小さいので、qemuのresizeを使ってイメージを11Gくらいに増やします。
次にuser-dataを作成して、ここではUbuntuのパスワードをubuntuに変更するような初期化をしたいと思います。meta-dataで、hostnameをfoobarに設定する設定をします。isoを作成します。
そしてパッケージをビルドします。重要なこととして、macOSはVirtualization.frameworkなどを使うときにentaitlementをバイナリに付与しないといけません。そのため、このようにxmlでentaitlementを作成して、コードサインでentaitlementを先ほど作ったバイナリに付与して、カーネルやディスクを指定して起動させます。そうするとLinux VMが立ち上がります。
しばらく経つと、cloud-initが起動して、ユーザーのパスワードが変更されます。この例だと標準出力をそのままシリアルでつないでいるので、パスワードが丸見えですが、ubuntuでログインできるようなデモになっています。
(動画再生終わり)
各種仮想化技術のベンチマークを最後にちょっと計測して終わりたいと思います。sysbenchを用いて素数を計算するCPUのベンチマークを、それぞれUbuntuの環境で、今回作成したvirtualization-rsと内部的にはhyperkitのものであるDockerと、内部的にはbinary translationのvirtualboxを比較しました。左側からvirtualization-rs、Docker、virtualboxになります。
同じような仮想化技術を使っているvirtualization-rsとDockerについては同等の結果が得られて、binary translationはそれより少し下がる結果が得られました。
以上をまとめると、macOS Big SurからLinux VMが作成可能な、高レベルAPIのVirtualization.frameworkが登場して、そのRust bindingsを今回作成しました。sysbenchなどによる検証結果から、従来のhyperkitなどと同程度の性能であることがわかりました。以上です。ありがとうございました。
司会者:鈴ヶ嶺さん、発表ありがとうございました。今回はRustでVirtualization.frameworkの呼べるものを作りましたが、苦労したところとかあります?
鈴ヶ嶺:最初、Objective-Cをどうやって呼ぶのかはちょっと苦労しました。すぐ叩けたりするのかなとかは、調べないといけなかった。それはちょっと苦労しましたね。
司会者:objcの使い方とか?
鈴ヶ嶺:そうですね。objcは内部的にどうなっているのか、まったくわからなかったので。調べていくうちに「あ、こういうふうに呼んでいるんだ」ってわかって、おもしろかったですね。
司会者:質問が来ています。「M1 Macでも動きますか?」と。
鈴ヶ嶺:僕はIntel Macしか持っていませんが、API的には共通なので、おそらく動くと思います。誰か確かめてみてください(笑)。
司会者:私、M1 Macなので、あとでちょっと試してみます。
鈴ヶ嶺:ありがとうございます(笑)。
司会者:Readmeにちゃんと書いてあるよね?
鈴ヶ嶺:すみません、書いていないです(笑)。
司会者:まじか(笑)。資料はこのあとアップロードすると聞いているので、もしほかにM1Macで試したい方は、資料を見て試せばいいと思っています。もし動かない場合は、プルリクのチャンスです。みなさんのプルリクをたぶん待っています。
鈴ヶ嶺:お願いします。ありがとうございます。
司会者:hyperkitはどうなるんだろうね?
鈴ヶ嶺:個人的にはどうなるのか、非常に気になるところですね。サポートしてくれなかったら、そのままHypervisor.frameworkなどをいじらなきゃいけなくなるので、ちょっと厳しい。なんとかなってほしいですね(笑)。
司会者:それでは鈴ヶ嶺さん、発表ありがとうございました。
鈴ヶ嶺:ありがとうございました。
関連タグ:
2025.03.21
マネージャーの「自分でやったほうが早い」という行動で失うもの 効率・スピード重視の職場に足りていない考え方
2025.03.25
減点を恐れてモチベ低下、果ては離職も… あらゆる“会社の害虫”を大繁殖させる「ラスボス」の正体
2025.03.17
不確実な時代だからこそ「知らないこと」を武器にする ハーバード首席卒業生の逆説的なメッセージ
2025.03.19
組織をダメにする“害虫”の正体は間違った思い込み AIやDXなど手段のみにこだわるダメ上司の見極め方
2025.03.24
最悪の場合、組織を死に至らせる“会社の害虫”とは 誤った意思決定や品質不祥事を招く要因
2025.03.19
フェデラー氏が語る「ただの1ポイント」の哲学 ウィンブルドン敗北から学んだ失敗からの立ち直り方
2025.03.24
気づけばモラル崩壊……人材育成に無頓着な企業の末路 業績アップや採用にもつながる“人への投資”の重要性
2025.03.19
OpenAIのAIエージェント「Deep research」はビジネスをどう変革するのか? サム・アルトマン氏ら4人がデモンストレーション
2025.03.19
大企業だけじゃない、「モーレツ×内向き」な組織の2つのリスク “悪気なく染み付いた文化”は個人のキャリアにも悪影響
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
2025.03.21
マネージャーの「自分でやったほうが早い」という行動で失うもの 効率・スピード重視の職場に足りていない考え方
2025.03.25
減点を恐れてモチベ低下、果ては離職も… あらゆる“会社の害虫”を大繁殖させる「ラスボス」の正体
2025.03.17
不確実な時代だからこそ「知らないこと」を武器にする ハーバード首席卒業生の逆説的なメッセージ
2025.03.19
組織をダメにする“害虫”の正体は間違った思い込み AIやDXなど手段のみにこだわるダメ上司の見極め方
2025.03.24
最悪の場合、組織を死に至らせる“会社の害虫”とは 誤った意思決定や品質不祥事を招く要因
2025.03.19
フェデラー氏が語る「ただの1ポイント」の哲学 ウィンブルドン敗北から学んだ失敗からの立ち直り方
2025.03.24
気づけばモラル崩壊……人材育成に無頓着な企業の末路 業績アップや採用にもつながる“人への投資”の重要性
2025.03.19
OpenAIのAIエージェント「Deep research」はビジネスをどう変革するのか? サム・アルトマン氏ら4人がデモンストレーション
2025.03.19
大企業だけじゃない、「モーレツ×内向き」な組織の2つのリスク “悪気なく染み付いた文化”は個人のキャリアにも悪影響
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
【仕事に直結】頭がいいとは?|知見の幅と高さで決まる。【東大卒 ベンチャー企業社長が語る】
2025.01.18 - 2025.01.18
退職をチャンスに捉える企業文化のつくり方
2025.03.10 - 2025.03.10
青木耕平さんとザッソウ(#156〜158)
2025.02.05 - 2025.03.19
片付けパパ対談【特別編】豊かな人生を過ごすための「投資」&「交渉術」 ~チャンスを逃さず信頼関係も育むコツ~
2025.02.10 - 2025.02.10
グローバルの経営理論に学ぶ、企業アルムナイ成功への示唆〜中央大学ビジネススクール 犬飼知徳教授
2025.02.18 - 2025.02.18