ChromebookのLinux仮想マシンの起動方法を探す

ChromebookLinux仮想マシン(crostini)からMicroSDカードの内容が使いづらいので模索。

Linux仮想マシンからはChromeOSホストの内容にアクセスできるように、ネットワークファイル共有(9p)が設定されている。 ここ経由でMicroSDカードもアクセスできるけど、9pに制約があるし、Linuxパッケージの格納先にはできないので、使いづらい。 できれば、MicroSDカードにディスクイメージファイルをおいて、それをLinux仮想マシンからマウントして自由に使いたい。 ということで調べてみた。

Linux仮想マシン(termina)を起動するのは、crosvmコマンド。 引数として、仮想ディスクイメージファイルを指定する。 また、ユーザが使うLinux環境は、terminaではなく、temrinaの中に更に作られるLinuxコンテナ(Penguin)である。 Penguinが起動すると、もう一つ仮想ディスクイメージファイルが作成される。 ここにもう一つMicroSDカード上のディスクイメージファイルを指定できると嬉しい。

わからない点は2点。

(1) corsvmコマンドに仮想ディスクイメージファイルを渡すところがわからない。 ChromeOS上でpsコマンドを見ると、crosvmコマンドに--rwdiskオプションでコンテナ用ディスクイメージファイルを指定していることはわかるので、ここをいじりたいが、ChromeOSのどこでcrosvmコマンドを起動しているのかがわからない。 vmc start terminaの延長かな、とは思うけど。 vmcのソースをたどればよいのかな?

(2) terminaの中で、コンテナ用のストレージをどのように管理しているかがわからない。 temrinaでのコンテナ管理ツールlxdは使えるが、terminaではrootになれず、ストレージの設定がよくわからない。 lxdを駆使したら調べられるのかな。

まずは(1)を調べてみた。

vmcコマンドはcrostini_clientへのシンボリックリンクになっており、crostini_clientのソースを見ると、自分では実際の処理はせずに、vmconcierge(VMコンシェルジュ?)という別のプログラムにRPC要求を発行するだけのようだった。 vm_tools/conciergeのソースをみてみた。

termina_vm.ccからcrosvmを起動している模様。 (類似ソースファイルにarc_vm..ccというのがある。AndroidVM用らしい。) 指定されたディスクについてはそれぞれcrosvmに--rwdisk(または--disk)オプションで指定している。 このディスク指定をどこからとってくるのかがよくわからない。

ちょっと角度を変えて。 crostini_clientのvmcコマンドを見てみると、

490 const USAGE: &str = r#"
491    [ start [--enable-gpu] <name> |
492      stop <name> |
493      create [-p] <name> [<source media> [<removable storage name>]] [-- additional parameters]
494      destroy <name> |
495      disk-op-status <command UUID> |
496      export <vm name> <file name> [<removable storage name>] |
497      import [-p] <vm name> <file name> [<removable storage name>] |
498      list |
499      share <vm name> <path> |
500      unshare <vm name> <path> |
501      container <vm name> <container name> [ <image server> <image alias> ]  |
502      usb-attach <vm name> <bus>:<device> |
503      usb-detach <vm name> <port> |
504      usb-list <vm name> |
505      help ]
506 "#;

新しいvmcコマンドには「create」サブコマンドがあり、引数にリムーバブルディスクを指定できるようだ。 devチャンネルでも使ってみる。

localhost / # vmc 
USAGE: vmc
   [ start [--enable-gpu] <name> |
     stop <name> |
     destroy <name> |
     export <vm name> <file name> [removable storage name] |
     list |
     share <vm name> <path> |
     container <vm name> <container name> [ <image server> <image alias> ]  |
     usb-attach <vm name> <bus>:<device> |
     usb-detach <vm name> <port> |
     usb-list <vm name> |
     help ]

残念。createコマンドはChromeOS 76でもまだ入っていない。 ただし、usb-attachコマンドが増えたので試した。 仮想マシンから直接USBデバイスをアクセスする手段らしい。

localhost / # lsusb
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 003: ID 0781:5583 SanDisk Corp. 
Bus 003 Device 004: ID 1286:204e Marvell Semiconductor, Inc. 
Bus 003 Device 002: ID 05e3:0610 Genesys Logic, Inc. 4-port hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 13d3:5696 IMC Networks 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

localhost / # vmc usb-attach termina 3:3
Error: routine at frontends/vmc.rs:308 `usb_attach(vm_name,user_id_hash,bus,device)` failed: failed permission_broker OpenPath: Rejected send message, 1 matched rules; type="method_call", sender=":1.121" (uid=0 pid=8282 comm="vmc usb-attach termina 3:3 ") interface="org.chromium.PermissionBroker" member="OpenPath" error name="(unset)" requested_reply="0" destination="org.chromium.PermissionBroker" (uid=230 pid=1919    comm="/usr/bin/permission_broker ")

だめだ。まだ動かないらしい。