Chromebook linux(crostini)のディスク

Chromebooklinuxを入れると、ChromeOS(これもLinuxベースである)の中に「termina」というLinux VMが作られる。

バイスマッパのデバイス「dm-2」がつくられる。

Filesystem                                 Size  Used Avail Use% Mounted on
/dev/dm-2                                  170M  163M     0 100% /run/imageloader/cros-termina/11895.50.0

この中にtermina VM用のrootファイルシステムカーネルイメージが置かれている。200MBもないくらい小さい。

# ls -hl /run/imageloader/cros-termina/11895.50.0/
total 163M
-rw-r--r--. 1 root root 1.1M Apr  5 06:43 about_os_credits.html
drwx------. 2 root root  16K Apr  5 06:43 lost+found
-rw-r--r--. 1 root root  759 Apr  5 06:43 lsb-release
-rw-r--r--. 1 root root  13M Apr  5 06:43 vm_kernel
-rw-r--r--. 1 root root 155M Apr  5 06:43 vm_rootfs.img

この「dm-2」の実体は、パーティションp1である/mnt/stateful_partitionのencrypted.blockのディスクイメージの中にある「chronos」ユーザのhomeにあるimage.ext4(178MB)である。かなりややこしい。

# dmsetup deps /dev/dm-2
1 dependencies  : (7, 5)

# ls -l /dev/ |grep ' 7, *5 '
brw-rw----. 1 root       disk         7,   5 Jul  7 18:01 loop5

# losetup /dev/loop5
/dev/loop5: [65025]:154415 (/cros-components/cros-termina/11895.50.0/image.ext4)

 # find / -name image.ext4 -exec ls -hli {} \;
154415 -rw-r--r--. 1 chronos chronos 178M Jul  7 18:01 /home/chronos/cros-components/cros-termina/11895.50.0/image.ext4
154415 -rw-r--r--. 1 chronos chronos 178M Jul  7 18:01 /mnt/stateful_partition/encrypted/chronos/cros-components/cros-termina/11895.50.0/image.ext4

termina VMlinuxではあるが、「ChromeOSのLinuxオプション機能」の本体ではない。temrina VMの中に更にlinuxコンテナ(lxc)が起動され、それが「Linuxオプション機能」の本体である。このliuxコンテナの名称は「penguin」であり、ディストリビューションdebianである。penguinのディスクはterminaのrootファイルシステムにはない。

めちゃめちゃ暗号化機能と仮想機能を駆使しているのはセキュリティのためらしい。Arm A7xの2コアプロセッサ(RockChip OP1)でもキビキビ動くのは素晴らしいが、OSS部分のバグにあたると切り分けが大変そうだ。そのうち、OSS本家から派生したり、独自機能の開発に走るんではないか。

linuxコンテナpenguinのディスクはどこかというと多分以下。linuxをインストールして増えたディスク領域を探索したりの推定。

# ps -ef|grep crosvm |head -3
crosvm   15123     1  0 18:01 ?        00:00:02 /usr/bin/vm_concierge
crosvm   15156 15123  6 18:01 ?        00:04:41 /usr/bin/crosvm run --cpus 6 --mem 2859 --root /run/imageloader/cros-termina/11895.50.0/vm_rootfs.img --tap-fd 16 --cid 3 --socket /run/vm/vm.WVRIqj/crosvm.sock --wayland-sock /run/chrome/wayland-0 --cras-audio --params snd_intel8x0.inside_vm=1 snd_intel8x0.ac97_clock=48000 --wayland-dmabuf --rwdisk /home/root/e074c927b7a9xxxxxxxxxxxxxxxx34dc43e6e6/crosvm/dGVybWluYQ==.img /run/imageloader/cros-termina/11895.50.0/vm_kernel
crosvm   15157 15123  0 18:01 ?        00:00:00 /usr/bin/logger -p auth info --skip-empty --tag VM(3)

# pwd
/mnt/stateful_partition/home/.shadow/e074c927b7a9xxxxxxxxxxxxxxxxxxxxxxx34dc43e6e6/mount/root/crosvm

# ls -lh
total 1.5G
-rw-------. 1 crosvm crosvm 8.0G Jul  7 18:42 'dGVybWluYQ==.img'
drwx------. 2 crosvm crosvm 4.0K Jul  7 18:03 sshkeys

# du -sh *
1.5G    dGVybWluYQ==.img
40K     sshkeys

temirna VMに入って、ディスク構成をみてみる。 開発者モードでもterminaでrootになる方法がわからないのでうまく調べられない。 /dev/vdbがpenguinコンテナ用で/mnt/statefulにあるようだが見れない。 sshの鍵をどうにかすればみれるんかな

(termina) chronos@localhost ~ $ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       153M  150M  280K 100% /
devtmpfs        1.4G     0  1.4G   0% /dev
tmp             1.4G     0  1.4G   0% /tmp
run             1.4G   24K  1.4G   1% /run
shmfs           1.4G     0  1.4G   0% /dev/shm
var             1.4G     0  1.4G   0% /var
none            1.4G     0  1.4G   0% /sys/fs/cgroup
9p              1.9G  568K  1.9G   1% /mnt/shared
/dev/vdb        8.0G  1.5G  5.9G  20% /mnt/stateful
tmpfs           100K     0  100K   0% /mnt/stateful/lxd/shmounts
tmpfs           100K     0  100K   0% /mnt/stateful/lxd/devlxd

(termina) chronos@localhost ~ $ ls -l /mnt/stateful/
total 0
drwx--x--x 1 root    root    256 Jul  7 09:02 lxd
drwxr-xr-x 1 chronos chronos   0 Jul  7 09:02 lxd_conf

(termina) chronos@localhost ~ $ ls -la /mnt/stateful/*
ls: cannot open directory '/mnt/stateful/lxd': Permission denied
/mnt/stateful/lxd_conf:
total 16
drwxr-xr-x 1 chronos chronos  0 Jul  7 09:02 .
drwxr-xr-x 1 root    root    22 Jul  7 09:02 ..

(termina) chronos@localhost ~ $ mount|grep lxd
tmpfs on /mnt/stateful/lxd/shmounts type tmpfs (rw,relatime,size=100k,mode=711)
tmpfs on /mnt/stateful/lxd/devlxd type tmpfs (rw,relatime,size=100k,mode=755)
run on /mnt/stateful/lxd/devices/penguin/disk.container_token.dev-.container_token type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
run on /mnt/stateful/lxd/devices/penguin/disk.cros_milestone.dev-.cros_milestone type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
run on /mnt/stateful/lxd/devices/penguin/disk.host-ip.dev-.host_ip type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
run on /mnt/stateful/lxd/devices/penguin/disk.ssh_authorized_keys.dev-.ssh-ssh_authorized_keys type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
run on /mnt/stateful/lxd/devices/penguin/disk.ssh_host_key.dev-.ssh-ssh_host_key type tmpfs (rw,nosuid,nodev,noexec,relatime,mode=755)
/dev/vda on /mnt/stateful/lxd/devices/penguin/disk.sshd_config.dev-.ssh-sshd_config type ext4 (ro,relatime,block_validity,delalloc,nojournal_checksum,barrier,user_xattr,acl)
9p on /mnt/stateful/lxd/devices/penguin/disk.shared.mnt-chromeos type 9p (rw,nosuid,nodev,noexec,relatime,sync,dirsync,access=any,trans=fd,rfd=25,wfd=25)
/dev/vda on /mnt/stateful/lxd/devices/penguin/disk.cros_containers.opt-google-cros-containers type ext4 (ro,relatime,block_validity,delalloc,nojournal_checksum,barrier,user_xattr,acl)

(termina) chronos@localhost ~ $ lxc storage list
+---------+-------------+--------+-----------------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |                 SOURCE                  | USED BY |
+---------+-------------+--------+-----------------------------------------+---------+
| default |             | btrfs  | /mnt/stateful/lxd/storage-pools/default | 3       |
+---------+-------------+--------+-----------------------------------------+---------+

(termina) chronos@localhost ~ $ lxc storage info default
info:
  description: ""
  driver: btrfs
  name: default
  space used: 1.54GB
  total space: 8.55GB
used by:
  containers:
  - penguin
  images:
  - 6b6816a3efxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx553267b983dcb
  profiles:
  - default