持ち運べる OpenStack 環境をつくる

この記事は、NTT docomo Business Advent Calendar 2025 2 日目の記事です。

Android 15 から Android 端末上で Linux 環境を動かすことが可能になりました。せっかくなので、 OpenStack をインストールして VM を動かしてみました。

はじめに

こんにちは。 Smart Data Platform (SDPF) クラウド/サーバー 仮想サーバーチームの杉浦 (@Kumassy_) です。

普段はハイパーバイザや OpenStack の開発・検証をしています。

私は Pixel 8 Pro をメインのスマホとして使っています。外出先でスマホを眺めていたところ、開発者向けオプションに Linux 開発環境が追加されているのに気づきました。 どうやら 2025 年 3 月ごろから Android 15 端末向けに追加されたもののようです。 sudo も利用できますし、 Docker コンテナも起動できるようです。そこで、普段 OpenStack の開発をしている身としては、 OpenStack 環境を構築して VM を起動させてみることにしました。

スマホの Linux 開発環境に SSH する

スマホは画面が小さいですし文字を打つのも不便なので、 laptop から SSH して遊びたいです。 外部ネットワークには出られるようですが、 NAT 配下にいて直接 SSH できなさそうなので、 SSH をポートフォワードして外部からアクセス可能にします。

まずはスマホ上のターミナルで ssh をインストールして、ログインパスワードを設定します。

sudo apt install ssh
sudo systemctl start sshd
sudo passwd droid

そして、 22/tcp を laptop に転送します。

ssh -R 10022:localhost:22 kumassy@<laptop ip>

こうすれば laptop から以下のようにしてスマホ上のターミナルにログインできます。

ssh -p 10022 droid@localhost

これで普通の Linux マシンと同じように作業できますね。

この手法は @kamiya334教えてもらいました

開発環境を探検する

初めに Linux 開発環境がどのような環境なのか見てみました。 スマホなので仕方ないのですが、以下のように現代の開発環境としてはかなり頼りないものとなっていました。

CPU

droid@localhost:~$ lscpu
Architecture:             aarch64
  CPU op-mode(s):         64-bit
  Byte Order:             Little Endian
CPU(s):                   9
  On-line CPU(s) list:    0-8
Vendor ID:                ARM
  Model name:             Cortex-A715
    Model:                0
    Thread(s) per core:   1
    Core(s) per socket:   3
    Socket(s):            1
    Stepping:             r1p0
    BogoMIPS:             49.15
    Flags:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt f
                          cma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb pac
                          a pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm sveb
                          f16 i8mm bti
  Model name:             Cortex-A510
    Model:                1
    Thread(s) per core:   1
    Core(s) per socket:   1
    Socket(s):            1
    Stepping:             r1p1
    BogoMIPS:             49.15
    Flags:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt f
                          cma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb pac
                          a pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm sveb
                          f16 i8mm bti
  Model name:             Cortex-A715
    Model:                0
    Thread(s) per core:   1
    Core(s) per socket:   2
    Socket(s):            1
    Stepping:             r1p0
    BogoMIPS:             49.15
    Flags:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt f
                          cma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb pac
                          a pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm sveb
                          f16 i8mm bti
  Model name:             Cortex-A510
    Model:                1
    Thread(s) per core:   1
    Core(s) per socket:   1
    Socket(s):            1
    Stepping:             r1p1
    BogoMIPS:             49.15
    Flags:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt f
                          cma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb pac
                          a pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm sveb
                          f16 i8mm bti
  Model name:             Cortex-A715
    Model:                0
    Thread(s) per core:   1
    Core(s) per socket:   1
    Socket(s):            1
    Stepping:             r1p0
    BogoMIPS:             49.15
    Flags:                fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt f
                          cma lrcpc dcpop sha3 sm3 sm4 asimddp sha512 sve asimdfhm dit uscat ilrcpc flagm sb pac
                          a pacg dcpodp sve2 sveaes svepmull svebitperm svesha3 svesm4 flagm2 frint svei8mm sveb
                          f16 i8mm bti
  Model name:             -
    Model:                1
    Thread(s) per core:   1
    Core(s) per socket:   1
    Socket(s):            1
NUMA:
  NUMA node(s):           1
  NUMA node0 CPU(s):      0-8
Vulnerabilities:
  Gather data sampling:   Not affected
  Itlb multihit:          Not affected
  L1tf:                   Not affected
  Mds:                    Not affected
  Meltdown:               Not affected
  Mmio stale data:        Not affected
  Reg file data sampling: Not affected
  Retbleed:               Not affected
  Spec rstack overflow:   Not affected
  Spec store bypass:      Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:             Mitigation; __user pointer sanitization
  Spectre v2:             Mitigation; CSV2, BHB
  Srbds:                  Not affected
  Tsx async abort:        Not affected

メモリ

droid@localhost:~$ free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       903Mi       2.2Gi       5.6Mi       974Mi       3.0Gi
Swap:          981Mi          0B       981Mi

ストレージ

droid@localhost:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda1       214G  1.5G   13G  10% /
/dev/vda2       191M  191M     0 100% /opt/kernel_extras
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           2.0G     0  2.0G   0% /dev/shm
tmpfs           786M  524K  785M   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
android         229G  215G   15G  94% /mnt/shared
internal        229G  215G   15G  94% /mnt/internal
tmpfs           393M     0  393M   0% /run/user/0
tmpfs           393M  4.0K  393M   1% /run/user/1000

KVM

droid@localhost:~$ ls /dev/kvm
ls: cannot access '/dev/kvm': No such file or directory

これらの結果から、開発環境の概要をまとめると以下のようになります。

CPU: ARM アーキテクチャ aarch64 の 9 コア構成で、 Cortex-A715(高性能コア)と Cortex-A510 (効率コア)の組み合わせです。

メモリ: 4 GB 利用可能でした。OpenStackのような重量級のサービスを動かすには少し心もとない容量ですが、最小構成であれば動作させることができそうです。

ストレージ: ルートファイルシステム(/dev/vda1)には214GBが割り当てられているものの、実際に / で利用できるのは 16 GB 程度であるようです。

仮想化機能: /dev/kvmデバイスが存在しないため、ハードウェア仮想化(KVM)は利用できません。 OpenStack で VM を動かす際は QEMU のソフトウェアエミュレーションを使用することになります。

制約は厳しいですが、以下のように Docker コンテナは正常に動作しました。

OpenStack のインストール方法について

OpenStack のインストール方法はいくつかあります。 SDPF クラウド仮想サーバーチームでは kolla-ansible をベースに開発していますが、メモリとストレージの要件がかなり厳しいので、コンテナベースの kolla-ansible は利用できなさそうです。

ChatGPT にいくつかの OpenStack インストール方法について比較してもらいました。

ツール 概要 最小インストール要件の目安
DevStack Bash スクリプトで OS 上に OpenStack サービスを直接インストールできる OpenStack 開発者向けのツール 2CPU, 4GB RAM, 10 GB disk space
Kolla-Ansible Docker/Podman コンテナ化された OpenStack を Ansible でデプロイするツール 2 NIC, 8GB RAM, 40 GB disk space
OpenStack-Ansible LXC コンテナ化された OpenStack を Ansible でデプロイするツール 8 CPU, 8GB RAM, 50GB disk space
MicroStack お手軽に導入できる snap ベースのシングルノード OpenStack 構築ツール 2 CPU, 8GB RAM, 100 GB disk space

OpenStack は全体的に最小インストール要件が厳しめですが、 DevStack だとギリギリ動きそうなので、 DevStack をチューニングする方針としました。

DevStack を実行して minimal な OpenStack 環境をつくる

DevStack では local.conf という config をもとに OpenStack をインストールします。

メモリとストレージの要件が厳しいので、 Minimal deployment を参考にして Cinder と Horizon はインストールしないことにします。 Block Storage はなくてよいですし、 API さえ使えれば十分ですよね。

いろいろと試行錯誤した結果、以下のような config ができました。

stack@localhost:~/devstack$ cat local.conf
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD


disable_service horizon
disable_service cinder c-sch c-api c-vol
disable_service swift s-proxy s-object s-container s-account
disable_service tempest
disable_service heat h-eng h-api h-api-cfn h-api-cw
disable_service ceilometer-acompute ceilometer-acentral ceilometer-api
disable_service neutron-adv-service
disable_service octavia o-api o-cw o-hm o-hk
disable_service barbican
disable_service trove
disable_service sahara


API_WORKERS=1
RPC_WORKERS=1

NEUTRON_PORT_SECURITY=false

CIRROS_ARCH=aarch64

[[post-config|$NOVA_CONF]]
[libvirt]
virt_type = qemu
cpu_mode = custom
cpu_model = cortex-a53

DevStack のインストールを進める前に、以下のようにして DB に割り当てるメモリをケチっておきます。

stack@localhost:~/devstack$ sudo vim /etc/mysql/conf.d/devstack-lowmem.cnf
stack@localhost:~/devstack$ cat /etc/mysql/conf.d/devstack-lowmem.cnf
[mysqld]
innodb_buffer_pool_size = 256M
innodb_log_file_size    = 64M
max_connections         = 100

tmp_table_size          = 32M
max_heap_table_size     = 32M

あとは ドキュメント に沿って ./stack.sh すれば OpenStack 環境ができます。

stack@localhost:~/devstack$ ./stack.sh


This is your host IP address: 10.123.149.241
This is your host IPv6 address: ::1
Keystone is serving at http://10.123.149.241/identity/
The default users are: admin and demo
The password: secret

Services are running under systemd unit files.
For more information see:
https://docs.openstack.org/devstack/latest/systemd.html

DevStack Version: 2026.1
Change: f61d747518a3b4896032c7e9440ddf31856a060f Merge "Enable response validation in Keystone" 2025-11-14 14:20:56 +0000
OS Version: Debian 12 bookworm

2025-11-24 02:08:30.477 | stack.sh completed in 1923 seconds.

スマホ OpenStack に VM を建ててみる

ここまでできたらあとは通常の OpenStack のように VM を作成できます。

aarch64 な CirrOS の image があるので、この image をもとに VM を作成します。

stack@localhost:~/devstack$ openstack image list
+--------------------------------------+---------------------------+--------+
| ID                                   | Name                      | Status |
+--------------------------------------+---------------------------+--------+
| 2b8bfbf7-42bf-43a3-a91d-50c59633dc94 | cirros-0.6.3-aarch64-disk | active |
+--------------------------------------+---------------------------+--------+

NW まわりはきちんと設定していないので、どの NW にも接続しないことにします。

stack@localhost:~/devstack$ openstack server create --image 2b8bfbf7-42bf-43a3-a91d-50c59633dc94 --flavor m1.tiny test-server --nic none

stack@localhost:~/devstack$ openstack server show f132c8af-cee6-4248-9128-de58e42e6665
+-------------------------------------+------------------------------------------------------------------------------------------------+
| Field                               | Value                                                                                          |
+-------------------------------------+------------------------------------------------------------------------------------------------+
| OS-DCF:diskConfig                   | MANUAL                                                                                         |
| OS-EXT-AZ:availability_zone         | nova                                                                                           |
| OS-EXT-SRV-ATTR:host                | None                                                                                           |
| OS-EXT-SRV-ATTR:hostname            | test-server                                                                                    |
| OS-EXT-SRV-ATTR:hypervisor_hostname | None                                                                                           |
| OS-EXT-SRV-ATTR:instance_name       | None                                                                                           |
| OS-EXT-SRV-ATTR:kernel_id           | None                                                                                           |
| OS-EXT-SRV-ATTR:launch_index        | None                                                                                           |
| OS-EXT-SRV-ATTR:ramdisk_id          | None                                                                                           |
| OS-EXT-SRV-ATTR:reservation_id      | None                                                                                           |
| OS-EXT-SRV-ATTR:root_device_name    | None                                                                                           |
| OS-EXT-SRV-ATTR:user_data           | None                                                                                           |
| OS-EXT-STS:power_state              | Running                                                                                        |
| OS-EXT-STS:task_state               | None                                                                                           |
| OS-EXT-STS:vm_state                 | active                                                                                         |
| OS-SRV-USG:launched_at              | 2025-11-24T02:10:05.000000                                                                     |
| OS-SRV-USG:terminated_at            | None                                                                                           |
| accessIPv4                          |                                                                                                |
| accessIPv6                          |                                                                                                |
| addresses                           |                                                                                                |
| config_drive                        |                                                                                                |
| created                             | 2025-11-24T02:09:46Z                                                                           |
| description                         | None                                                                                           |
| flavor                              | description=, disk='1', ephemeral='0', extra_specs.hw_rng:allowed='True', id='m1.tiny',        |
|                                     | is_disabled=, is_public='True', location=, name='m1.tiny', original_name='m1.tiny', ram='512', |
|                                     | rxtx_factor=, swap='0', vcpus='1'                                                              |
| hostId                              | eadc3234a9f5d6b80737ed483bbdbe2d388821b0fa927cfdc237934a                                       |
| host_status                         | None                                                                                           |
| id                                  | f132c8af-cee6-4248-9128-de58e42e6665                                                           |
| image                               | cirros-0.6.3-aarch64-disk (2b8bfbf7-42bf-43a3-a91d-50c59633dc94)                               |
| key_name                            | None                                                                                           |
| locked                              | False                                                                                          |
| locked_reason                       | None                                                                                           |
| name                                | test-server                                                                                    |
| pinned_availability_zone            | None                                                                                           |
| progress                            | 0                                                                                              |
| project_id                          | a3a363ed73e8469b98ffaae53bfa8df5                                                               |
| properties                          |                                                                                                |
| scheduler_hints                     |                                                                                                |
| server_groups                       | []                                                                                             |
| status                              | ACTIVE                                                                                         |
| tags                                |                                                                                                |
| trusted_image_certificates          | None                                                                                           |
| updated                             | 2025-11-24T02:10:06Z                                                                           |
| user_id                             | 6b8f5452a10542359fd0269553371366                                                               |
| volumes_attached                    |                                                                                                |
+-------------------------------------+------------------------------------------------------------------------------------------------+
stack@localhost:~/devstack$ sudo virsh list
 Id   Name                State
-----------------------------------
 1    instance-00000001   running

virsh consoleconsole.log を眺めると、 CirrOS がブートしてきたのが確認できました。

stack@localhost:~/devstack$ sudo tail -F /opt/stack/data/nova/instances/f132c8af-cee6-4248-9128-de58e42e6665/console.log

[    5.343116] EXT4-fs (vda1): write access will be enabled during recovery
[    5.513086] EXT4-fs (vda1): recovery complete
[    5.553111] EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[    7.266087] EXT4-fs (vda1): re-mounted. Opts: (null). Quota mode: none.
[  243.220848] EXT4-fs (vda1): resizing filesystem from 25600 to 259835 blocks
[  243.239892] EXT4-fs (vda1): resized filesystem to 259835
### tail -n 25 /var/log/messages
Nov 24 02:10:36 cirros syslog.info syslogd started: BusyBox v1.35.0
Nov 24 02:10:39 cirros daemon.info dhcpcd[258]: dhcpcd-9.4.1 starting
Nov 24 02:10:39 cirros daemon.info dhcpcd[261]: DUID 00:04:f1:32:c8:af:ce:e6:42:48:91:28:de:58:e4:2e:66:65
Nov 24 02:10:39 cirros daemon.err dhcpcd[261]: no valid interfaces found
Nov 24 02:16:06 cirros syslog.info syslogd started: BusyBox v1.35.0
Nov 24 02:16:09 cirros daemon.info dhcpcd[249]: dhcpcd-9.4.1 starting
Nov 24 02:16:09 cirros daemon.info dhcpcd[252]: DUID 00:04:f1:32:c8:af:ce:e6:42:48:91:28:de:58:e4:2e:66:65
Nov 24 02:16:09 cirros daemon.err dhcpcd[252]: no valid interfaces found
Nov 24 02:19:09 cirros daemon.err dhcpcd[252]: timed out
Nov 24 02:19:58 cirros authpriv.info dropbear[388]: Running in background
############ debug end   ##############
  ____               ____  ____
 / __/ __ ____ ____ / __ \/ __/
/ /__ / // __// __// /_/ /\ \
\___//_//_/  /_/   \____/___/
   http://cirros-cloud.net


login as 'cirros' user. default password: 'gocubsgo'. use 'sudo' for root.
cirros login: [  246.401660] virtio_gpu virtio4: [drm] drm_plane_enable_fb_damage_clips() not called

スマホさえ持っていればいつでも OpenStack の開発ができますね!

トラブルシューティング

Linux 開発環境が落ちる

メモリが足らず、 ときどき Linux 開発環境が落ちることもありました。 ターミナルを再起動すれば概ね作業を再開できるので、根気強くインストール作業を進めてください。 openstack server create コマンドさえ実行できれば DB や MQ はいらないので、停止してしまってもよいでしょう。

VM が boot しない

デフォルトの local.conf では nova.conf に以下のような設定が入ります。

[libvirt]
live_migration_uri = qemu+ssh://stack@%s/system
cpu_mode = host-passthrough
virt_type = qemu

cpu_mode = host-passthrough となっていますが、 KVM が利用できないため、このままの設定だと VM の起動に失敗します。

: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/nova/nova/virt/libvirt/driver.py", line 8247, in _create_guest
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     guest.launch(pause=pause)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/nova/nova/virt/libvirt/guest.py", line 167, in launch
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     with excutils.save_and_reraise_exception():
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/oslo_utils/excutils.py", line 256, in __exit__
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     self.force_reraise()
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/oslo_utils/excutils.py", line 222, in force_reraise
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     raise self.value
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/nova/nova/virt/libvirt/guest.py", line 165, in launch
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     return self._domain.createWithFlags(flags)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/tpool.py", line 186, in doit
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     result = proxy_call(self._autowrap, f, *args, **kwargs)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/tpool.py", line 144, in proxy_call
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     rv = execute(f, *args, **kwargs)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]          ^^^^^^^^^^^^^^^^^^^^^^^^^^^
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/tpool.py", line 125, in execute
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     raise e.with_traceback(tb)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/opt/stack/data/venv/lib/python3.12/site-packages/eventlet/tpool.py", line 82, in tworker
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     rv = meth(*args, **kwargs)
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]          ^^^^^^^^^^^^^^^^^^^^^
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]   File "/usr/lib/python3/dist-packages/libvirt.py", line 1415, in createWithFlags
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]     raise libvirtError('virDomainCreateWithFlags() failed')
: f4caa26c-ea15-428e-8e70-68dfb0aa7266] libvirt.libvirtError: unsupported configuration: CPU mode 'host-passthrough' for aarch64 qemu domain on aarch64 host is not supported>
: f4caa26c-ea15-428e-8e70-68dfb0aa7266]

それから、 cpu_model の設定も必要でした。 デフォルトの cpu_model の場合は確かに qemu process としては動作しているようにみえました。

stack@lima-default:~/devstack$ sudo virsh dominfo instance-00000003
Id:             3
Name:           instance-00000003
UUID:           03bd6bb9-8e56-48da-ade9-13870c876577
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       109.9s
Max memory:     262144 KiB
Used memory:    262144 KiB
Persistent:     yes
Autostart:      disable
Managed save:   no
Security model: apparmor
Security DOI:   0
Security label: libvirt-03bd6bb9-8e56-48da-ade9-13870c876577 (enforcing)

stack@lima-default:~/devstack$ sudo virsh domstats instance-00000003
Domain: 'instance-00000003'
  state.state=1
  state.reason=1
  cpu.time=126892574000
  cpu.user=126474847000
  cpu.system=417727000
  cpu.cache.monitor.count=0
  cpu.haltpoll.success.time=0
  cpu.haltpoll.fail.time=0
  balloon.current=262144
  balloon.maximum=262144
  balloon.last-update=0
  balloon.rss=179488
  vcpu.current=1
  vcpu.maximum=1
  vcpu.0.state=1
  vcpu.0.time=126430000000
  vcpu.0.wait=0
  vcpu.0.delay=43526812
  net.count=0
  block.count=1
  block.0.name=vda
  block.0.path=/opt/stack/data/nova/instances/03bd6bb9-8e56-48da-ade9-13870c876577/disk
  block.0.backingIndex=1
  block.0.rd.reqs=0
  block.0.rd.bytes=0
  block.0.rd.times=0
  block.0.wr.reqs=0
  block.0.wr.bytes=0
  block.0.wr.times=0
  block.0.fl.reqs=0
  block.0.fl.times=0
  block.0.allocation=0
  block.0.capacity=1073741824
  block.0.physical=204800
  dirtyrate.calc_status=0
  dirtyrate.calc_start_time=0
  dirtyrate.calc_period=0
  dirtyrate.calc_mode=page-sampling
stack@lima-default:~/devstack$ ps aux | grep qemu
libvirt+  962634 99.9  4.4 1431616 179488 ?      Sl   17:22   4:12 /usr/bin/qemu-system-aarch64 -name guest=instance-00000003,debug-threads=on -S -object {"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain-3-instance-00000003/master-key.aes"} -blockdev {"driver":"file","filename":"/usr/share/AAVMF/AAVMF_CODE.no-secboot.fd","node-name":"libvirt-pflash0-storage","auto-read-only":true,"discard":"unmap"} -blockdev {"node-name":"libvirt-pflash0-format","read-only":true,"driver":"raw","file":"libvirt-pflash0-storage"} -blockdev {"driver":"file","filename":"/var/lib/libvirt/qemu/nvram/instance-00000003_VARS.fd","node-name":"libvirt-pflash1-storage","auto-read-only":true,"discard":"unmap"} -blockdev {"node-name":"libvirt-pflash1-format","read-only":false,"driver":"raw","file":"libvirt-pflash1-storage"} -machine virt-8.2,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,pflash0=libvirt-pflash0-format,pflash1=libvirt-pflash1-format,acpi=on -accel tcg -cpu cortex-a15 -m size=262144k -object {"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":268435456} -overcommit mem-lock=off -smp 1,sockets=1,dies=1,cores=1,threads=1 -uuid 03bd6bb9-8e56-48da-ade9-13870c876577 -no-user-config -nodefaults -chardev socket,id=charmonitor,fd=30,server=on,wait=off -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc -no-shutdown -boot strict=on -device {"driver":"pcie-root-port","port":8,"chassis":1,"id":"pci.1","bus":"pcie.0","multifunction":true,"addr":"0x1"} -device {"driver":"pcie-root-port","port":9,"chassis":2,"id":"pci.2","bus":"pcie.0","addr":"0x1.0x1"} -device {"driver":"pcie-root-port","port":10,"chassis":3,"id":"pci.3","bus":"pcie.0","addr":"0x1.0x2"} -device {"driver":"pcie-root-port","port":11,"chassis":4,"id":"pci.4","bus":"pcie.0","addr":"0x1.0x3"} -device {"driver":"pcie-root-port","port":12,"chassis":5,"id":"pci.5","bus":"pcie.0","addr":"0x1.0x4"} -device {"driver":"pcie-root-port","port":13,"chassis":6,"id":"pci.6","bus":"pcie.0","addr":"0x1.0x5"} -device {"driver":"pcie-root-port","port":14,"chassis":7,"id":"pci.7","bus":"pcie.0","addr":"0x1.0x6"} -device {"driver":"qemu-xhci","id":"usb","bus":"pci.2","addr":"0x0"} -device {"driver":"virtio-scsi-pci","id":"scsi0","bus":"pci.1","addr":"0x0"} -blockdev {"driver":"file","filename":"/opt/stack/data/nova/instances/_base/71f6f0f805cceef98c928ec21e85f5e992012140","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false}} -blockdev {"node-name":"libvirt-2-format","read-only":true,"cache":{"direct":true,"no-flush":false},"driver":"raw","file":"libvirt-2-storage"} -blockdev {"driver":"file","filename":"/opt/stack/data/nova/instances/03bd6bb9-8e56-48da-ade9-13870c876577/disk","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap","cache":{"direct":true,"no-flush":false}} -blockdev {"node-name":"libvirt-1-format","read-only":false,"cache":{"direct":true,"no-flush":false},"driver":"qcow2","file":"libvirt-1-storage","backing":"libvirt-2-format"} -device {"driver":"virtio-blk-pci","bus":"pci.3","addr":"0x0","drive":"libvirt-1-format","id":"virtio-disk0","bootindex":1,"write-cache":"on"} -add-fd set=0,fd=31,opaque=serial0-log -chardev pty,id=charserial0,logfile=/dev/fdset/0,logappend=on -serial chardev:charserial0 -device {"driver":"usb-kbd","id":"input0","bus":"usb.0","port":"1"} -audiodev {"id":"audio1","driver":"none"} -vnc 0.0.0.0:0,audiodev=audio1 -device {"driver":"virtio-gpu-pci","id":"video0","max_outputs":1,"bus":"pci.6","addr":"0x0"} -device {"driver":"virtio-balloon-pci","id":"balloon0","deflate-on-oom":true,"free-page-reporting":true,"bus":"pci.4","addr":"0x0"} -object {"qom-type":"rng-random","id":"objrng0","filename":"/dev/urandom"} -device {"driver":"virtio-rng-pci","rng":"objrng0","id":"rng0","bus":"pci.5","addr":"0x0"} -device {"driver":"vmcoreinfo"} -sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny -msg timestamp=on

しかし、以下のようにレジスタの値を見てみると綺麗な値になっていて、実際には VM が生きているようには見えませんでした。

stack@lima-default:~/devstack$ virsh qemu-monitor-command --hmp instance-00000003 "info registers"

CPU#0
R00=00000000 R01=00000000 R02=00000000 R03=00000000
R04=00000000 R05=00000000 R06=00000000 R07=00000000
R08=00000000 R09=00000000 R10=00000000 R11=00000000
R12=00000000 R13=00000000 R14=00000008 R15=00000004
PSR=400001db -Z-- A und32
s00=00000000 s01=00000000 d00=0000000000000000
s02=00000000 s03=00000000 d01=0000000000000000
s04=00000000 s05=00000000 d02=0000000000000000
s06=00000000 s07=00000000 d03=0000000000000000
s08=00000000 s09=00000000 d04=0000000000000000
s10=00000000 s11=00000000 d05=0000000000000000
s12=00000000 s13=00000000 d06=0000000000000000
s14=00000000 s15=00000000 d07=0000000000000000
s16=00000000 s17=00000000 d08=0000000000000000
s18=00000000 s19=00000000 d09=0000000000000000
s20=00000000 s21=00000000 d10=0000000000000000
s22=00000000 s23=00000000 d11=0000000000000000
s24=00000000 s25=00000000 d12=0000000000000000
s26=00000000 s27=00000000 d13=0000000000000000
s28=00000000 s29=00000000 d14=0000000000000000
s30=00000000 s31=00000000 d15=0000000000000000
s32=00000000 s33=00000000 d16=0000000000000000
s34=00000000 s35=00000000 d17=0000000000000000
s36=00000000 s37=00000000 d18=0000000000000000
s38=00000000 s39=00000000 d19=0000000000000000
s40=00000000 s41=00000000 d20=0000000000000000
s42=00000000 s43=00000000 d21=0000000000000000
s44=00000000 s45=00000000 d22=0000000000000000
s46=00000000 s47=00000000 d23=0000000000000000
s48=00000000 s49=00000000 d24=0000000000000000
s50=00000000 s51=00000000 d25=0000000000000000
s52=00000000 s53=00000000 d26=0000000000000000
s54=00000000 s55=00000000 d27=0000000000000000
s56=00000000 s57=00000000 d28=0000000000000000
s58=00000000 s59=00000000 d29=0000000000000000
s60=00000000 s61=00000000 d30=0000000000000000
s62=00000000 s63=00000000 d31=0000000000000000
FPSCR: 00000000

これらの問題に対応するため、 local.conf に以下を追記することとしました。

[[post-config|$NOVA_CONF]]
[libvirt]
virt_type = qemu
cpu_mode = custom
cpu_model = cortex-a53

QEMU のソフトウェアエミュレーションになってしまいますが、 CirrOS 程度であれば問題なく動きます。

まとめ

Android 15 から Android 端末上で Linux 環境を動かすことが可能になりました。 4 GB RAM と 16 GB ストレージの環境下でやれることは限られますが、 DevStack の config をチューニングすることでスマホ上に OpenStack 環境を構築し、 VM を起動できました。