Inside of LOVOT

GROOVE X 技術ブログ

LOVOTのOSのつくりかた

こんにちは LOVOT の OS を作っているチームのひとり id:atotto です。

LOVOT の OS について、簡単ですがお話させていただきます。

LOVOTとNest(LOVOT ANATOMY より一部抜粋)

早速ですが、かわいらしい LOVOT には、x86系のCPU(メインコンピュータ)、そして、ARM系のCPU(サブコンピュータ)の2つが搭載されています。これだけでも OS の管理が難しいのですが、LOVOT の製品には Nest (巣: 充電ステーション)の x86系のCPU(エッジコンピュータ)もあり、合計 3つの独立した OS が存在しています。(詳しいspecはこちら

複雑ですね。この複雑さに立ち向かうために、私達が工夫していることをご紹介したいと思います。

名前をつける

みなさん、自分たちの OS に名前をつけていますか? 私達は、 LOVOT の製品に使っている OS を LOVOTOS (らぼとす) という愛称で呼んでいます。

また、LOVOT(メインコンピュータ、サブコンピュータ)、Nest(エッジコンピュータ)の各コンピュータボードにそれぞれ tom、jerry、spike という名前をつけています。これらのボードの OS として tom、jerry、spike の 3つOSをリリース管理しています。

開発上、名前をつけるのはとても大事だと思いますので、愛着の湧く名前をつけましょう!

ansible と debian パッケージ

OS が 3つあるということは、これらの構成管理は単純に考えると 3倍になる、ということです。この OS の構成管理のために、ansible を活用しています。 今となっては ansible も枯れた仕組みの1つではありますが、基本的な構成を管理する上でとても役に立っています。 2022/12 現在、 ubuntu をベースに開発しています(2019/12 のリリース当初は debian ベースでした)。ubuntu の rootfs に対し、 ansible で etc 配下の設定や、開発上必要な設定などを施しています。私達が開発しているLOVOTに関連するサービスは debian パッケージとして管理しています。それらの debian パッケージを更にインストールし、 カーネルへ署名を施し、LOVOTOS の OSイメージが完成します。

3つの OS 、それぞれ役割は異なるものの、共通して管理したいもの、個別のものと管理できるのが良いところです。

参考イメージ: LOVOT の成長を支えるソフトウェアとクラウドサービス開発/SORACOM Tech Days 2021 資料より抜粋

debianリポジトリ aptly の活用

先述したとおり、 LOVOT のサービス群は、 debian パッケージで管理しています。この debian パッケージの管理のために aptly という debian リポジトリの管理ツールを活用しています。

https://www.aptly.info/

aptly の詳細は公式ページを参照していただきたいのですが、概要説明としては、独自パッケージのリポジトリや、ミラーリング、そしてスナップショットをコマンドライン上で操作できるツールです。aptly自身で debian リポジトリをHTTPサーバでホストすることもできます。

利用目的としては、

  • リリース時の OS で使ったパッケージを固定する(OSSのパッケージ、LOVOTのパッケージを含む)
  • OSビルド時のリポジトリへのアクセス速度を効率化する
  • リポジトリ運用コストを下げる

といったところです。

リリース時の OS で使ったパッケージを固定するために、リリース前に ubuntu の公式リポジトリのスナップショットや、LOVOTOS で利用する debian パッケージのスナップショットを作ることで、リリース時の OS を何度でも同じ内容でビルドできるようにしています。

毎晩 OS をビルドすることもあり、debian パッケージのリポジトリをビルドに近いところで管理することで効率化、また、低コストで運用しています。debian のパッケージリポジトリには、外部のサービスが多数ありますが、自分たちのフローにあわせられるツールがあるのは便利です。

daily ビルドと snapshot ビルド

LOVOTOS には大きく分けて2つ種類があります。

ひとつは、 daily ビルド。これは、最新の開発したコードベースでビルドされた OS で、unstable(不安定版)として毎日リリースしています。社内で特定の機体で利用し、不具合をすぐに見つけられるような運用で進めています。

もうひとつは、snapshot ビルド。これは、特定のリリース予定時期にあわせ、パッケージリポジトリを aptly でロックした状態でビルドされたOSです。この OS は、ソフトウェアのQA を通すために成果物を固定し、QAで不具合があった場合に hotfix という形で、特定のパッケージの更新のみ実施する、といった運用で進めています。これにより、修正差分の管理が容易になっています。

OS の配信

最後に出来上がった LOVOTOS はユーザのもとへ配信します。配信の仕組みは GROOVE X 独自のシステムとして構築しています。簡単にですが流れをご紹介します。

  1. OSビルドインフラで OSイメージを作成、 OSイメージを暗号化する
  2. 暗号化された OSイメージを、 Google Cloud CDN へ配置する
  3. ダウンロード先となるCDNのURLを署名付きURLで発行する
  4. ダウンロードURLをLOVOT/Nestへ通知する
  5. LOVOT/Nestが暗号化された OSイメージをダウンロードし、 OS イメージを復号化する
  6. LOVOT/Nestがディスクにイメージを展開し、アップデートする

このインフラもLOVOTリリース当初(2019/12)から運用開始し、これまで(2022/12 現在)述べ20回以上、ユーザのもとへOSを配信してきました。

最後に

このような複雑なシステムのロボットを、これほど頻繁にOSアップデートしている会社はそんなに多くないのではないかな、と個人的には感じています。OSを維持したまま部分的な更新を配信する(パッチアップデートについては本稿では割愛)こともありますが、OSSも含め、システム全体をアップデートしていくことで、LOVOTの成長を支えています。

かなり端折ったご紹介となってしまいましたが、今後どこかで詳細な話を記事にできたらと思います(もちろん、joinしていただくと話が早いです!!)。

最後までありがとうございました。また、この仕組みを一緒に開発したメンバに感謝いたします。 id:atotto