2024.10.01
自社の社内情報を未来の“ゴミ”にしないための備え 「情報量が多すぎる」時代がもたらす課題とは?
リンクをコピー
記事をブックマーク
鈴ヶ嶺聡哲氏(以下、鈴ヶ嶺):ここまでは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などをいじらなきゃいけなくなるので、ちょっと厳しい。なんとかなってほしいですね(笑)。
司会者:それでは鈴ヶ嶺さん、発表ありがとうございました。
鈴ヶ嶺:ありがとうございました。
関連タグ:
2024.10.29
5〜10万円の低単価案件の受注をやめたら労働生産性が劇的に向上 相見積もり案件には提案書を出さないことで見えた“意外な効果”
2024.10.24
パワポ資料の「手戻り」が多すぎる問題の解消法 資料作成のプロが語る、修正の無限ループから抜け出す4つのコツ
2024.10.28
スキル重視の採用を続けた結果、早期離職が増え社員が1人に… 下半期の退職者ゼロを達成した「関係の質」向上の取り組み
2024.10.22
気づかぬうちに評価を下げる「ダメな口癖」3選 デキる人はやっている、上司の指摘に対する上手な返し方
2024.10.24
リスクを取らない人が多い日本は、むしろ稼ぐチャンス? 日本のGDP4位転落の今、個人に必要なマインドとは
2024.10.23
「初任給40万円時代」が、比較的早いうちにやってくる? これから淘汰される会社・生き残る会社の分かれ目
2024.10.23
「どうしてもあなたから買いたい」と言われる営業になるには 『無敗営業』著者が教える、納得感を高める商談の進め方
2024.10.28
“力を抜くこと”がリーダーにとって重要な理由 「人間の達人」タモリさんから学んだ自然体の大切さ
2024.10.29
「テスラの何がすごいのか」がわからない学生たち 起業率2年連続日本一の大学で「Appleのフレームワーク」を教えるわけ
2024.10.30
職場にいる「困った部下」への対処法 上司・部下間で生まれる“常識のズレ”を解消するには