如何解决如何在 LXD 容器中可靠地运行 Android 模拟器?
总结
我正在尝试在 LXD 容器中运行 Android Studio 附带的 Android 模拟器(为了可再现性、安全性、分离性)。模拟器运行,但定期冻结,当它冻结时,我无法停止 LXD 容器 (lxc stop $VMNAME
),即使在向该命令添加 --force
之后也是如此。容器中的 systemd-shutdown
进程不能被杀死,即使使用 -9
,并且被迫重新启动主机。当我重新启动主机时,它也永远不会正确关闭,我必须按住电源按钮。只要我不启动 Android 模拟器,Android Studio 就可以在 LXD 容器中正常工作。
主机和来宾操作系统都是 Ubuntu 20.04。主机在 Dell XPS 13 9350 上运行。
官方文档 (Configure hardware acceleration for the Android Emulator) 说要安装软件包 qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils ia32-libs-multiarch
;但是,其中许多在 Ubuntu 20.04 上不存在。
如何解决这些问题?
我尝试了什么
这是我设置 LXD 容器的方式:
- 安装容器:
VMNAME=flutter3
lxc launch ubuntu:20.04 $VMNAME
lxc exec $VMNAME -- apt update && lxc exec $VMNAME -- apt upgrade -y
- 创建一个文件
lxc_x11.profile
,其中包含:
#from https://blog.simos.info/running-x11-software-in-lxd-containers/
config:
environment.DISPLAY: :0
environment.PULSE_SERVER: unix:/home/ubuntu/pulse-native
#nvidia.driver.capabilities: all
#nvidia.runtime: "true"
user.user-data: |
#cloud-config
runcmd:
- 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
packages:
- x11-apps
- mesa-utils
- pulseaudio
description: GUI LXD profile
devices:
PASocket1:
bind: container
connect: unix:/run/user/1000/pulse/native
listen: unix:/home/ubuntu/pulse-native
security.gid: "1000"
security.uid: "1000"
uid: "1000"
gid: "1000"
mode: "0777"
type: proxy
X0:
bind: container
connect: unix:@/tmp/.X11-unix/X0
listen: unix:@/tmp/.X11-unix/X0
security.gid: "1000"
security.uid: "1000"
type: proxy
mygpu:
type: gpu
name: x11
used_by: []
- 向容器添加 X11 支持:
lxc profile create x11
cat lxc_x11.profile |lxc profile edit x11
lxc profile assign $VMNAME default,x11
lxc exec $VMNAME -- apt install -y x11-apps mesa-utils libxi6 pulseaudio pulseaudio-utils
lxc exec $VMNAME -- bash -c 'sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf'
lxc restart $VMNAME
lxc exec $VMNAME -- glxinfo -B
#test OpenGL accelleration: lxc exec $VMNAME -- sudo --user ubuntu glxgears
- 安装 Flutter(来自 Getting started with Flutter on Ubuntu):
lxc exec $VMNAME -- sudo --u ubuntu -i
sudo snap install flutter --classic
sudo snap alias flutter.dart dart
sudo snap install android-studio --classic
android-studio # run through the first-install wizard accepting all the defaults,then exit
flutter config --android-studio-dir /snap/android-studio/current/android-studio
flutter doctor --android-licenses
flutter channel dev
flutter upgrade
flutter doctor
- 在 LXC 容器和虚拟 Android 设备包中启用 KVM (source):
cat /proc/cpuinfo |grep -c vmx # should be more than 0
cat /sys/module/kvm_intel/parameters/nested # should be Y
virt-host-validate # should be PASS except IOMMU
lxc stop $VMNAME
lxc config device add $VMNAME kvm unix-char path=/dev/kvm
lxc start $VMNAME
lxc exec $VMNAME -- usermod -G kvm -a ubuntu
lxc exec $VMNAME -- ls -al /dev/kvm
lxc exec $VMNAME -- apt install -y libnss3 libxcomposite1 # to run Android in VM
- 为 KVM 安装似乎有助于 Android 模拟器崩溃的软件包:
lxc exec $VMNAME -- apt install -y qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager
lxc restart $VMNAME
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。