この記事は、NTT docomo Business Advent Calendar 2025 2 日目の記事です。
Android 15 から Android 端末上で Linux 環境を動かすことが可能になりました。せっかくなので、 OpenStack をインストールして VM を動かしてみました。
- はじめに
- スマホの Linux 開発環境に SSH する
- 開発環境を探検する
- OpenStack のインストール方法について
- DevStack を実行して minimal な OpenStack 環境をつくる
- スマホ 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 console か console.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 を起動できました。