Chromebook linux(crostini)のディスク
Chromebookにlinuxを入れると、ChromeOS(これもLinuxベースである)の中に「termina」というLinux VMが作られる。
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 VMはlinuxではあるが、「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
ChromeOSのファイルシステム
ChromebookのOSはLinuxベースであるが、Debianなどの他のLinuxディストリビューションと比べると、ファイルシステム構成がかなり違う。
- fuse.drivefsというファイルシステムがある。Google Driveを見せるのに使っているようである。
- imageloaderというファイルシステム(tmpfs?)がある。
- fuseを多数使っている。Android用ぽい
- passthroughというファイルシステムが多数ある。Android向けぽい。
- loopデバイスをいくつか使っている。Android向けらしい
- squashfsをいくつか使っている。Android向けに暗号化のために使ってる?
- MicroSDカードはfuseでマウントしている。
- loopデバイスと合わせてと思うが、device mapperを駆使している
1 Filesystem Size Used Avail Use% Mounted on
2 /dev/root 1.7G 1.5G 160M 91% /
3 devtmpfs 1.9G 0 1.9G 0% /dev
4 tmp 1.9G 156K 1.9G 1% /tmp
5 run 1.9G 536K 1.9G 1% /run
6 shmfs 1.9G 15M 1.9G 1% /dev/shm
7 /dev/mmcblk0p1 11G 768M 9.1G 8% /mnt/stateful_partition
8 /dev/mmcblk0p8 12M 28K 12M 1% /usr/share/oem
9 /dev/mapper/encstateful 3.1G 47M 3.0G 2% /mnt/stateful_partition/encrypted
10 media 1.9G 0 1.9G 0% /media
11 none 1.9G 0 1.9G 0% /sys/fs/cgroup
12 /dev/loop1 447M 447M 0 100% /opt/google/containers/android/rootfs/root
13 /dev/loop2 4.0K 4.0K 0 100% /opt/google/containers/arc-sdcard/mountpoints/container-root
14 /dev/loop3 4.0K 4.0K 0 100% /opt/google/containers/arc-obb-mounter/mountpoints/container-root
15 imageloader 1.9G 0 1.9G 0% /run/imageloader
16 tmpfs 1.9G 12K 1.9G 1% /run/arc/oem
17 tmpfs 1.9G 0 1.9G 0% /run/arc/sdcard
18 tmpfs 1.9G 0 1.9G 0% /run/arc/obb
19 tmpfs 1.9G 0 1.9G 0% /run/arc/media
20 tmpfs 1.9G 0 1.9G 0% /run/arc/adbd
21 /dev/mmcblk1 3.7G 1.0M 3.7G 1% /media/removable/SD4G
22 drivefs 11G 1.3G 9.1G 12% /media/fuse/drivefs-33427exxxxxxxxxxxxxxd3dacd7f
23 passthrough 11G 768M 9.1G 8% /run/arc/media/MyFiles
24 passthrough 11G 768M 9.1G 8% /run/arc/media/MyFiles-write
25 passthrough 1.9G 0 1.9G 0% /run/arc/media/removable-default
26 passthrough 1.9G 0 1.9G 0% /run/arc/media/removable-read
27 passthrough 11G 768M 9.1G 8% /run/arc/media/MyFiles-default
28 passthrough 11G 768M 9.1G 8% /run/arc/media/MyFiles-read
29 passthrough 1.9G 0 1.9G 0% /run/arc/media/removable
30 passthrough 1.9G 0 1.9G 0% /run/arc/media/removable-write
31 /dev/fuse 11G 768M 9.1G 8% /run/arc/sdcard/default/emulated
32 /dev/fuse 11G 768M 9.1G 8% /run/arc/sdcard/read/emulated
33 /dev/fuse 11G 768M 9.1G 8% /run/arc/sdcard/write/emulated
1 /dev/dm-0 on / type ext2 (ro,relatime,seclabel,block_validity,barrier,user_xattr,acl)
2 devtmpfs on /dev type devtmpfs (rw,nosuid,noexec,relatime,seclabel,size=1951208k,nr_inodes=487802,mode=755)
3 none on /proc type proc (rw,nosuid,nodev,noexec,relatime)
4 none on /sys type sysfs (rw,nosuid,nodev,noexec,relatime,seclabel)
5 none on /sys/fs/selinux type selinuxfs (rw,nosuid,noexec,relatime)
6 tmp on /tmp type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel)
7 run on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
8 debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime,seclabel,gid=605,mode=750)
9 shmfs on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel)
10 devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)
11 configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
12 /dev/mmcblk0p1 on /mnt/stateful_partition type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
13 /dev/mmcblk0p8 on /usr/share/oem type ext4 (ro,nosuid,nodev,noexec,relatime,seclabel,data=ordered)
14 /dev/mmcblk0p1 on /home type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
15 /dev/mapper/encstateful on /mnt/stateful_partition/encrypted type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,discard,commit=600,data=ordered)
16 /dev/mapper/encstateful on /var type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,discard,commit=600,data=ordered)
17 /dev/mapper/encstateful on /home/chronos type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,discard,commit=600,data=ordered)
18 run on /var/run type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
19 run on /var/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
20 run on /run/daemon-store/usb_bouncer type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
21 media on /media type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel)
22 tracefs on /sys/kernel/debug/tracing type tracefs (rw,nosuid,nodev,noexec,relatime,seclabel)
23 /dev/mmcblk0p1 on /usr/local type ext4 (rw,nodev,noatime,seclabel,resgid=20119,commit=600,data=ordered)
24 pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime,seclabel)
25 none on /sys/fs/cgroup type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
26 cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu)
27 /opt/google/containers/android/system.raw.img on /opt/google/containers/android/rootfs/root type squashfs (ro,nosuid,nodev,noexec,relatime,seclabel)
28 /opt/google/containers/arc-sdcard/rootfs.squashfs on /opt/google/containers/arc-sdcard/mountpoints/container-root type squashfs (ro,nosuid,noexec,relatime,seclabel)
29 /opt/google/containers/arc-obb-mounter/rootfs.squashfs on /opt/google/containers/arc-obb-mounter/mountpoints/container-root type squashfs (ro,nosuid,noexec,relatime,seclabel)
30 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
31 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
32 cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct)
33 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset,noprefix)
34 cgroup on /sys/fs/cgroup/schedtune type cgroup (rw,nosuid,nodev,noexec,relatime,schedtune)
35 imageloader on /run/imageloader type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
36 debugfs on /run/debugfs_gpu type debugfs (rw,nosuid,nodev,noexec,relatime,seclabel,gid=605,mode=750)
37 tmpfs on /run/arc/oem type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=755)
38 tmpfs on /run/arc/sdcard type tmpfs (ro,nosuid,nodev,noexec,relatime,seclabel,mode=755)
39 tmpfs on /run/arc/obb type tmpfs (ro,nosuid,nodev,noexec,relatime,seclabel,mode=755)
40 debugfs on /run/arc/debugfs/sync type debugfs (rw,nosuid,nodev,noexec,relatime,seclabel,gid=605,mode=750)
41 tracefs on /run/arc/debugfs/tracing type tracefs (rw,nosuid,nodev,noexec,relatime,seclabel)
42 tmpfs on /run/arc/media type tmpfs (ro,nosuid,nodev,noexec,relatime,seclabel,mode=755,uid=655360,gid=656360)
43 tmpfs on /run/arc/adbd type tmpfs (rw,nosuid,nodev,noexec,relatime,seclabel,mode=770,uid=657360,gid=657360)
44 /dev/mmcblk0p1 on /home/chronos/user type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
45 /dev/mmcblk0p1 on /home/chronos/u-e074c927b7a90d0a4f26d76f3af67034dc43e6e6 type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
46 /dev/mmcblk0p1 on /home/user/e074cxxxxxxxxxxxxxxxxxxxxf3af67034dc43e6e6 type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
47 /dev/mmcblk0p1 on /home/root/e074cxxxxxxxxxxxxxxxxxxxxf3af67034dc43e6e6 type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
48 /dev/mmcblk0p1 on /home/chronos/u-e074cxxxxxxxxxxxxxxxxxxxxf3af67034dc43e6e6/MyFiles/Downloads type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
49 /dev/mmcblk0p1 on /home/user/e074c9xxxxxxxxxxxxxxxxxxxx7034dc43e6e6/MyFiles/Downloads type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
50 /dev/mmcblk0p1 on /home/chronos/user/MyFiles/Downloads type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
51 /dev/mmcblk0p1 on /run/daemon-store/usb_bouncer/e074cxxxxxxxxxxxxxxxxxxxx7034dc43e6e6 type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
52 /dev/mmcblk1 on /media/removable/SD4G type fuseblk (rw,nosuid,nodev,noexec,relatime,dirsync,user_id=302,group_id=302,default_permissions,allow_other)
53 drivefs on /media/fuse/drivefs-33427exxxxxxxxxxxxxxxxxxxx3dacd7f type fuse.drivefs (rw,nosuid,nodev,relatime,user_id=304,group_id=304,default_permissions,allow_other)
54 /dev/mmcblk0p1 on /opt/google/containers/android/rootfs/android-data type ext4 (rw,nosuid,nodev,noexec,noatime,seclabel,resgid=20119,commit=600,data=ordered)
55 passthrough on /run/arc/media/MyFiles type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
56 passthrough on /run/arc/media/MyFiles-write type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
57 passthrough on /run/arc/media/removable-default type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
58 passthrough on /run/arc/media/removable-read type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
59 passthrough on /run/arc/media/MyFiles-default type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
60 passthrough on /run/arc/media/MyFiles-read type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
61 passthrough on /run/arc/media/removable type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
62 passthrough on /run/arc/media/removable-write type fuse (rw,nosuid,nodev,relatime,user_id=1000,group_id=1000,default_permissions,allow_other)
63 /dev/fuse on /run/arc/sdcard/default/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=656383,group_id=656383,default_permissions,allow_other)
64 /dev/fuse on /run/arc/sdcard/read/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=656383,group_id=656383,default_permissions,allow_other)
65 /dev/fuse on /run/arc/sdcard/write/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=656383,group_id=656383,default_permissions,allow_other)
Chromebook (Asus C101)の内蔵ディスク
出荷時点にリセットしたときのディスク構成を調べた。
(ASUS Chromebook Flip C101PA-OP1, ChromeOS 74.0)
内蔵ディスク(eMMC)の容量は14.7GiB(14.7*1024^3)。
カタログ表記は16GB(16*1000^3))だが、HDDもSSDも歴史的に「GB」の単位がメモリやらdfコマンドの表記やらとは違い10進数ベース。
面倒なので以下「GB」は「1024^3」の方を指す。
内蔵ディスクは主に、2GBのrootパーティションと、10.5GBのその他パーティションから構成される。
14.7GiBのeMMCは普通のWindowsのように複数パーティションに分かれている。
一番大きなパーティションは10.5GBである(p1)。
ChromeOSのrootファイルシステム用のパーティションは2GB。バージョンアップ用にA面/B面持つので合計4GBを使う。
10.5GBのメインパーティションはマウントされてから様々なテクニックでいろいろな用途向けに切り出されている。初期化直後で2GBが使用済。
まず p1というパーティションは /mnt/stateful_partitionというディレクトリにマウントされる。
/mnt/stateful_partitionの下にはencrypt.blockというファイルがあり、暗号化された仮想ディスクイメージのようである。初期化直後の名目ファイルサイズは3.1GBで、確保済ブロックサイズは0.1GB。このファイルは同じディレクトリの下のencrypted/というディレクトリの下にマウントされているっぽい。この下にはさらにvar/があり、これが/varにマウントされているようだ。home/もある。
mountコマンドを見ると他にもいろいろな手段で切り出されているようだが、詳細がつかめない。
使用量もなかなかつかめないが、初期化直後では1GB~2GB程度使うようである。何もしなくても少しづつ増えており、Chromeブラウザ/ChromeOS/Android App/GoogleDriveのキャッシュやパッチファイルをダウンロードしたりしているのはないかと思われる。Googleドライブに格納した写真や、一度ChromebookでインストールしたことのあるAndroidアプリは自動的にダウンロードされる。初期化後1時間経過時点で9GBが残っている。
初期化時点ではLinuxはインストールされない。
ちなみに、別パーティションであるrootファイルシステムはread-onlyでマウントされており、全容量1.7GB、使用済1.5GB、空き容量160MB、である。
フルブラウザ(Chrome)が起動でき、Googleストア(Play)を入れても2GBにおさめており、すごく小さいシステムである。
内蔵ディスク8GBのマシンも構築可能かもしれない。
ChromeOSのLinux用仮想ディスクはどこ?
うちのChromebookは内蔵ディスクが16GBしかない。Linux機能を使うと、仮想マシンが作られるが、そのディスク領域はどこにあるんだろうか?
ちなみに内訳は、ChromeOSがなんと1.7GBしかなく、Linuxに8.3GBも割り当てている。(Androidはこの外かな?)
ChromeOS / 1.7GB
(swap) 3.7GB
VM(termina) / 0.2GB
/mnt/statefull 8.3GB
Linux Container(penguin) / 8.3GB
Chromebookの本体ChromeOSのデバイスを開発者モードで確認してみる。
Asus chromebook C101PAの場合、/dev/mmcblk0が内蔵ディスク(eMMC)のようだ。「MMCのblock device #0」ということか。
MicroSD Cardを刺すと/dev/mmcblk1になる。
dfやmount、ls /devの結果からの推測では、rootファイルシステムはLVMのようである。(dm-0)。lvmの状態は、、、
/dev/dm-0は/dev/mmcblk0p3に依存している。2GBの第3パーティションがread-onlyのrootファイルシステムの本体のようである。rootファイルシステムは1.7GBである。少し減ってる。はて。
/dev/dm-2は/dev/loop5を経由して/run/imageloader/cros-termina/11895.50.0/というところに関連づけられている。
カーネルとかRAMDISKイメージのようなものがおいてある。ディレクトリ名からいって、これが仮想マシンの/bootだろうか?
なかなか凝ったファイルシステム構成をしていて追うのが難しい。。。
ChromebookでNetHack3.6.2をプレイする方法(ChromebookでArchLinuxを起動する方法)
Chromebookの標準LinuxであるDebian/Stretch(Arm64)では、nethackパッケージはバージョン3.6.0が用意されているが、ArchLinuxでは3.6.2がある。
・「ターミナル」アプリでLinuxが動かせる状況にする。(前記事参照)
・ChromeブラウザでCtrl+Shift+Tを押して黒い画面を出す
・「vsh termina」と打つ。「chronos」と表示されたらよし。
・「lxc launch archlinux/current arch」と打つ。しばし時間がかかる。
・「lxc list」で「penguin」と「arch」の行に「running」と出ればOK.
・「lxc exec arch bash」とうつ。
・「nethack」でnethack3.6.2が起動(2019/6)
ややこしいが、ChromebookのOSはLinuxだが、その中で別のLinuxを仮想マシンとして起動する仕組みになっている。この仮想マシンを「termina」という。ディレクトリを見る感じ、Gentoo Linuxぽいので、Chromebokの本体Linuxのスリム版(自由度を下げている)のようだ。その中で更に、Debian LInuxのコンテナが起動されているのが「Penguin」で「ターミナル」は「Penguin」にログインするようになってる。
ここで「termina」から「lxc」コマンドを使って、別のコンテナを作ったのが上記の操作。Googleのコンテナイメージ集から「ArchLinux/Current」を選択し、「arch」というコンテナ名でコンテナを作成した(lxc launchコマンド)。
中で動いているプロセスを見ると、penguinでは、ChromeOS関係ぽい特殊なプロセスが動いている。vmware toolsみたいなものだろう。コマンドベースのnethackを動かすぐらいなら問題ないが、ファイル共有などはうまく動かないかもしれない。
たぶん、ChromeOSはLinuxでない新しいGoogle製の新しいOSに変更されるのではないか。そして、terminaは現在のミニマルLinuxのままで、その下のLinuxコンテナとして、(1)Chromeブラウザが動くChromeOS、(2)Androidアプリ(のVMサンドボックス)が動くAndroid OS(というかランタイム環境)、(3)Android IDEが動くLinuxOS(たぶんDebian)の3つのコンテナが動くようになるのではないか。などと妄想してみる。
ところで、nethackでゲヘナを整地しているのだが、せっかく最短ルートを整備したのに、穴を掘るモンスター、マジでむかつく。追いかけて滅してやろうと思ったら、また更に降りられる。。。
どこでもnethack3.6
どこでもnethack3.6をできる環境を作る方法:
・小型のchromebookを買う。できればIntelでなくARMチップのを。(軽くてバッテリが保つ)
・設定で「Linux」を有効化する。
・「ターミナル」というアプリを起動する。
・「sudo apt-get install nethack」
・「nethack」
英語版nethack3.6.0が起動します。(2019/6)
ArchLinuxを入れたら英語版nethack3.6.2も遊べます。
私はAsus Chrombebook C101PAをヨドバシで買いました。2019/5 ポイント還元で約3.7万円)。重さ900グラムはMacbook12インチ並の軽さ。10インチと小型の割にはキーボードが打ちやすい。蓋を開けば即起動(復帰)。
ただし、ChromebookのOSが更新されるとLinux環境もなくなる場合があるので、クラウドセーブするとよいです。
・「ファイル」というアプリを開く
・Google DriveをLinuxで共有できるようにする。(右クリックを使う)
・「ターミナル(linux)」にて「cp /var/games/nethack/save/* /mnt/chromeos/GoogleDrive/MyDrive/」と打つ。
持ち歩くには便利な小ささで、キーボードがまともに使える。バッテリーも保つ。
しかし!最下層にたどり着き、Amulet of life savingが6個溜まったけど、Spellbook of polymorphが手に入らない。。。願うか。