Hi Julien, 郁进,

Did either of you manage to run AOSP on upstream QEMU?

Thanks

On Saturday, July 25, 2020 at 12:21:35 AM UTC+9 [email protected] wrote:

> This is tremendously helpful. Thanks a lot.
>
> My work is focusing on kernel, base on arm architecture,  I want have 
> whole view of the running kernel. 
>
> With qemu & qemu monitor & gdb & crash tools, I can stop kernel anywhere, 
> read phy/virt address, registers even system register(with last qemu 
> release).
>
> Thanks for sharing your experience, It does greate help.
>
> Hope to hear that you successfully run last AOSP on upstream QEMU.
>
> 在 2020年7月4日星期六 UTC+8上午12:35:32,Julien Robin写道:
>
>> Hi 郁进,
>>
>> Recently I focused on making the untouched Android code base working with 
>> standard/upstream QEMU (which is a little bit different from the AOSP's 
>> emulator, which is a QEMU derivative), focusing on x86_64 builds and 
>> "android-x86" project build configurations; the work is still in progress. 
>> But from what I know :
>>
>> When building aosp_XXXX-eng project, the "emulator" command line is made 
>> available so that just typing "emulator" into your terminal is (normally) 
>> enough to get it starting with the correct parameters set. Most of the time 
>> I use "emulator -verbose -show-kernel -no-snapshot" when running the AOSP's 
>> emulator. So that you have all the default parameters shown into your 
>> terminal, then kernel debug information, then Android's "init" output into 
>> your terminal. The kernel used to run those builds is called 
>> "kernel-ranchu" : it's a customised and prebuilt version of the 4.14 
>> kernel, intended for use with the aosp's emulator virtual hardware and 
>> drivers (called goldfish in its original version, then ranchu).
>>
>> If you build aosp then close the terminal window, and you want the 
>> "emulator" command to be available again, you should just type "source 
>> build/envsetup.sh && lunch" commands again (no need to rebuild everything).
>>
>> But for arm64 builds its horribly slow, like several minutes for booting 
>> (upstream qemu is making the following option "-accel tcg,thread=multi" 
>> available so that the performance using an AMD 3700X is almost similar to 
>> using KVM on a native arm64 Raspberry Pi 4. But unfortunately this accel 
>> option does not seem to be used by the "emulator" command, and seems not to 
>> work on AOSP's emulator, at least last time I tried). Be aware that 
>> emulator is a derivative of QEMU, recognizing some AOSP specific commands, 
>> and not recognizing some orginal QEMU commands. 
>>
>> *About having the kernel finding and starting "init" :*
>>
>> Lot of things can be confusing about having your emulator or qemu finding 
>> and running "init" process. I will give you everything I discovered so that 
>> hopefully you will be able to understand and debug anything that happens to 
>> you
>>
>> On really old versions of Android, "init" executable was only available 
>> into the ramdisk, and "system" partition was just containing the /system 
>> subfolder (this is the opposite of "system as root"). In this case, Linux 
>> kernel absolutely needed to load the ramdisk, because init was into this 
>> ramdisk. I guess fstab file was into the ramdisk too, in order to find and 
>> mount partitions once init started.
>>
>> Some more recent version of android using "system as root" (8 or 9 maybe) 
>> gave some ramdisk file as parameter to the emulator, despite the fact this 
>> ramdisk wasn't actually used anymore by the emulator : the content of the 
>> ramdisk was already into system.img. And the kernel was already able to 
>> access the system.img partition without the need of anything into the 
>> ramdisk - so the ramdisk wasn't used anymore. "init" file was at the root 
>> of the system.img partition image. In this case, you should ensure your 
>> machine and kernel are able to find your ext4 root (when in trouble, look 
>> into the kernel messages to find an ext4 file system at /dev/sda, or 
>> /dev/vda, or even sda1, vda1, etc, so that you can be sure about the kernel 
>> ability to see the partition you need).
>>
>> But Android 10 introduced a new partition/image format that can be 
>> dynamically expanded and physically fragmented (so that devices sold with a 
>> too small system partition for being updated, can be updated anyway). This 
>> is cool feature, but a little bit more complex to handle. When using this 
>> kind of system images, android requires a brand new specific ramdisk with a 
>> specific "init" executable in order to read and mount this new system 
>> partition format created by android. I believe emulator is using it with 
>> Android 10 (to be confirmed). But in order to focus on my work, I'm still 
>> using the previous way : an ext4 system.img with everything into it ;) so 
>> that qemu boots it directly. 
>>
>>
>> For example, on my x86_64 custom builds using "system as root", and 
>> having the vendor files included into system.img, as a standard ext4 image, 
>> I run the following command to start it using QEMU :
>>
>> kvm -m 4096 -smp 4 -kernel bzImage  -append "root=/dev/sda 
>> rootfstype=ext4 ro init=/init selinux=1 checkreqprot=1 
>> androidboot.selinux=permissive console=ttyS0 androidboot.hardware=luoss 
>> loglevel=8" -serial mon:stdio -drive format=raw,file=system.img -vga std
>> -m 4096 ask for 4GB RAM
>> bzImage is a custom 5.4 kernel
>> root=/dev/sda rootfstype=ext4 ro init=/init is telling my kernel to mount 
>> what it sees as "/dev/sda" and to run the "init" executable which is 
>> located into it
>> selinux=1 checkreqprot=1 androidboot.selinux=permissive are selinux 
>> parameters : when you want to disable selinux, you can't (init absolutely 
>> wants your kernel to have selinux running) but you set it to 
>> androidboot.selinux=permissive, so that no operation is actually blocked.
>> console=ttyS0 ask the kernel to print its messages into the serial port
>> androidboot.hardware=HW_NAME is used to tell init process to load 
>> init.HW_NAME.rc configuration file (that should be into  /init.HW_NAME.rc 
>> or /vendor/etc/init/hw/init.HW_NAME.rc). For aosp emulator builds, it is 
>> /vendor/etc/init/hw/init.ranchu.rc
>> loglevel=8 ask for the kernel, then init, to be as verbose as possible
>>
>> -serial mon:stdio is a qemu parameter I use to redirect the virtual 
>> serial port (on which the kernel talks) to the terminal in which qemu is 
>> running. So that I can use this terminal as a read/write terminal with the 
>> virtual machine.
>>
>>
>> The system image i'm using to do so is an ext4 partition image, on which 
>> i placed everything needed, and an init.luoss.rc and fstab.luoss files - 
>> mainly just to mount a /data tmpfs instead of using a real userdata.img 
>> partiton - yes, I'm cheating ;) normally system.img is not enough, and in 
>> most case, /vendor subfolder is into a vendor.img partition.
>>
>> I guess that when I'll be trying to run arm64 builds on qemu, some 
>> parameters will need to be changed.
>>
>> I hope that all this information will help you to successfully dig, 
>> understand and solve your issues! 
>>
>> Best regards
>>
>> Julien
>>
>> Le lundi 29 juin 2020 06:41:01 UTC+2, 郁进 a écrit :
>>>
>>> Hi,
>>>
>>> I found another tickets you submitted to run arm64 android via qemu.
>>>
>>> I tried to lunch aosp_arm64-eng project, run with android emulator, with 
>>> qemu args:
>>>
>>> emulator -kernel 
>>> ../Android_kernel/out/android-mainline/common/arch/arm64/boot/Image -system 
>>> xxx ...... *-qemu **--monitor tcp:127.0.0.1:2222 
>>> <http://127.0.0.1:2222>,server,nowait -gdb tcp::4444 -S*
>>>
>>> But the Android kernel panic occurred since no init found, and I try to 
>>> dump guest memory via qemu monitor, can't parsed by crash tools.
>>>
>>> Have you build and run arm64 android via qemu successfully?  How ?
>>>
>>> Looking forward to your reply, many thanks.
>>>
>>>
>>> 在 2020年3月3日星期二 UTC+8下午11:18:37,Julien ROBIN写道:
>>>>
>>>> Many thanks for your answers
>>>>
>>>> In fact what I'm trying to do is using QEMU files into AOSP source code 
>>>> to get Android (with GUI) built and running on a standard/upstream QEMU 
>>>> version.
>>>>
>>>> This would give the ability of running Android and its future releases 
>>>> without real "porting", on any device running a Linux kernel (be it 
>>>> upstream or not) and having KVM working on it. Which would be extremely 
>>>> interesting.
>>>>
>>>> From what you write, it seems qemu-trusty-arm64 is not really for me. 
>>>> So what I'm trying to do is probably more about using 
>>>> device/generic/qemu/qemu_arm64.mk (and others archs) files included 
>>>> into AOSP. So I'll continue into this other subject : 
>>>> https://groups.google.com/forum/?hl=bn#!topic/android-building/kbiEg5OxBGU
>>>>
>>>>
>>>> While talking with you, I noticed that AVD Emulator is different from 
>>>> upstream QEMU, probably about goldfish and ranchu related things. Things 
>>>> working fine with the emulator (aosp_x86_64-eng for example and 
>>>> android-goldfish-4.14-dev which seems mandatory to get Android 10 working 
>>>> with AVD Emulator) does not seems to be working with upstream QEMU (at 
>>>> least I can't get the GUI). Therefore the documentation about AVD Emulator 
>>>> builds https://source.android.com/setup/create/avd didn't really help 
>>>> me for upstream QEMU. 
>>>>
>>>> Can you confirm it's possible to use modern versions of AOSP on 
>>>> upstream QEMU? Someone did succeed in the past with Android 6 / untouched 
>>>> AOSP and a extended compatibility kernel (I have one based on 
>>>> android-goldfish-4.14-dev), this is why I'm trying with newer versions of 
>>>> AOSP. This was documented here, but it's not up to date anymore : 
>>>> https://www.collabora.com/news-and-blog/blog/2016/09/02/building-android-for-qemu-a-step-by-step-guide/
>>>>
>>>> Thank you in advance
>>>>
>>>> Julien
>>>>
>>>>
>>>> On 3/2/20 10:51 PM, 'Matthew Maurer' via Android Building wrote:
>>>>
>>>> This target is a testing target used for evaluating our reference 
>>>> TrustZone implementation. "storageproxyd" is continuously resetting there 
>>>> because it is not being launched by our test script 
>>>> <https://android.googlesource.com/trusty/device/arm/generic-arm64/+/refs/heads/master/project/qemu/qemu.py>
>>>>  which 
>>>> would attach a virtual RPMB resource. 
>>>>
>>>> A few notes about this target:
>>>> * It does not have a GUI
>>>> * Running Java is not supported and unlikely to work
>>>> * It requires a custom EL3 and Trusty running alongside it to work
>>>>
>>>> The manifest for these components is at 
>>>> https://android.googlesource.com/trusty/manifest, and that manifest 
>>>> contains a checked in prebuilt of the qemu_trusty_arm64-userdebug target 
>>>> that we are currently testing against.
>>>>
>>>> If you tell me more about what you're trying to make the target do, I 
>>>> may be able to give you further help with getting it to do what you want. 
>>>> If you aren't trying to use or inspect the Trusty TZ implementation, this 
>>>> target probably isn't the one you're looking for.
>>>>
>>>> On Mon, Mar 2, 2020 at 1:34 PM Dan Willemsen <[email protected]> 
>>>> wrote:
>>>>
>>>>> +Matthew Maurer Do we have any documentation on this target? I think 
>>>>> the last time we talked about this target it was only minimally 
>>>>> functional.
>>>>>
>>>>> - Dan
>>>>>
>>>>> On Mon, Mar 2, 2020 at 12:51 PM Julien Robin <[email protected]> 
>>>>> wrote:
>>>>>
>>>>>> I succeeded to find a workaround for the issue I signaled here, 
>>>>>> editing device/generic/trusty/BoardConfig.mk and putting 
>>>>>> BUILD_QEMU_IMAGES 
>>>>>> to false, which still gives vendor.img, system.img and userdata.img
>>>>>>
>>>>>> I then found this kernel 
>>>>>> https://android.googlesource.com/kernel/common/+/refs/heads/android-trusty-4.19,
>>>>>>  
>>>>>> and using arch/arm64/configs/trusty_qemu_defconfig, I successfully built 
>>>>>> it.
>>>>>>
>>>>>> Also, I'm able to start most of this Android build on Debian 10 
>>>>>> provided qemu-system-aarch64 the following way :
>>>>>>
>>>>>> qemu-system-aarch64
>>>>>>     -M virt
>>>>>>     -cpu cortex-a57
>>>>>>     -smp 1
>>>>>>     -m 2048
>>>>>>     -monitor none
>>>>>>     -parallel none
>>>>>>     -serial mon:stdio
>>>>>>     -kernel Image -append "root=/dev/vda rootfstype=ext4 ro 
>>>>>> init=/init loglevel=8 selinux=1 checkreqprot=1 
>>>>>> androidboot.selinux=permissive androidboot.hardware=qemu_trusty 
>>>>>> console=ttyAMA0"
>>>>>>     -device virtio-gpu-pci
>>>>>>     -drive format=raw,file=system-custom.img
>>>>>>     -drive format=raw,file=userdata-custom.img
>>>>>>
>>>>>> userdata-custom.img is just a bigger userdata.img (1024MB instead of 
>>>>>> 4) in which I used resize2fs, system-custom.img is just a system.img in 
>>>>>> which the placeholder folder "vendor" now embeds the content of 
>>>>>> vendor.img, 
>>>>>> copied by "cp -a". Finally, still into system-custom.img, 
>>>>>> fstab.qemu_trusty 
>>>>>> only contains 
>>>>>> LABEL=data              /data               ext4      noatime,nosuid,
>>>>>> nodev,errors=panic    wait
>>>>>> So that /data (available at /dev/vdb) is mounted by its label, while 
>>>>>> system-custom.img embeding root system and vendor is already mounted by 
>>>>>> kernel cmdline (by /dev/vda). ramdisk.img is not used as system.img 
>>>>>> already 
>>>>>> contains everything needed to start init.
>>>>>>
>>>>>> However, I guess I should use a slightly modified version of qemu, 
>>>>>> available here 
>>>>>> https://android.googlesource.com/trusty/external/qemu/+/refs/heads/master
>>>>>> Because using Debian 10 qemu version, I get the following output, and 
>>>>>> no display :
>>>>>>
>>>>>> init: init first stage started!
>>>>>> [...]
>>>>>> init: Loading SELinux policy
>>>>>> [...]
>>>>>> selinux: SELinux: Loaded policy from /vendor/etc/selinux/
>>>>>> precompiled_sepolicy
>>>>>>
>>>>>> selinux: SELinux: Loaded file_contexts
>>>>>>
>>>>>> random: init: uninitialized urandom read (40 bytes read)
>>>>>> random: init: uninitialized urandom read (40 bytes read)
>>>>>> init: init second stage started!
>>>>>> [...]
>>>>>> ueventd: Coldboot took 1.344 seconds
>>>>>> [...]
>>>>>> init: starting service 'storageproxyd'...
>>>>>> libprocessgroup: CgroupMap::FindController called for [1] failed, RC 
>>>>>> file was not initialized properly
>>>>>> libprocessgroup: Failed to make and chown /uid_0: Read-only file 
>>>>>> system
>>>>>> libprocessgroup: CgroupMap::FindController called for [829] failed, 
>>>>>> RC file was not initialized properly
>>>>>> init: createProcessGroup(0, 829) failed for service 'storageproxyd': 
>>>>>> Read-only file system
>>>>>> init: cpuset cgroup controller is not mounted!
>>>>>> init: Service 'storageproxyd' (pid 829) exited with status 1
>>>>>> init: Sending signal 9 to service 'storageproxyd' (pid 829) process 
>>>>>> group...
>>>>>> libprocessgroup: CgroupMap::FindController called for [1] failed, RC 
>>>>>> file was not initialized properly
>>>>>> libprocessgroup: CgroupMap::FindController called for [1] failed, RC 
>>>>>> file was not initialized properly
>>>>>>
>>>>>>
>>>>>> init: starting service 'storageproxyd'...
>>>>>> libprocessgroup: CgroupMap::FindController called for [1] failed, RC 
>>>>>> file was not initialized properly
>>>>>> libprocessgroup: Failed to make and chown /uid_0: Read-only file 
>>>>>> system
>>>>>> init: createProcessGroup(0, 830) failed for service 'storageproxyd': 
>>>>>> Read-only file system
>>>>>> libprocessgroup: CgroupMap::FindController called for [830] failed, 
>>>>>> RC file was not initialized properly
>>>>>> init: cpuset cgroup controller is not mounted!
>>>>>> init: Service 'storageproxyd' (pid 830) exited with status 1
>>>>>> init: Sending signal 9 to service 'storageproxyd' (pid 830) process 
>>>>>> group...
>>>>>>
>>>>>> ...and so on in loop
>>>>>>
>>>>>> However I'm still not sure to proceed correctly, as I'm doing 
>>>>>> everything alone with no documentation (I may have missed it?)
>>>>>>
>>>>>> Is here some documentation available? If there isn't, is someone able 
>>>>>> to provide an example of working qemu command line (even old or 
>>>>>> unoptimized), or just few explanations so that I can be placed on the 
>>>>>> right 
>>>>>> track?
>>>>>>
>>>>>> Thank you very much in advance
>>>>>>
>>>>>>
>>>>>> On 3/1/20 2:14 PM, Julien Robin wrote: 
>>>>>>>
>>>>>>> Hi there,
>>>>>>>
>>>>>>> I see that starting from branch android-10.0.0_r1, lunch offers a 
>>>>>>> choice called qemu_trusty_arm64-userdebug, in which I'm interested
>>>>>>>
>>>>>>> However, I got the following error, no matter which OS I'm using for 
>>>>>>> building (be it Ubuntu 18.048 or Debian 10). I have this error on r1, 
>>>>>>> r20 
>>>>>>> and r29.
>>>>>>>
>>>>>>> [ 62% 16150/26047] Create system-qemu.img now
>>>>>>> FAILED: out/target/product/trusty/system-qemu.img
>>>>>>> /bin/bash -c "(export SGDISK=out/host/linux-x86/bin/sgdisk 
>>>>>>> SIMG2IMG=out/host/linux-x86/bin/simg2img;     
>>>>>>>  device/generic/goldfish/tools/mk_combined_img.py -i 
>>>>>>> out/target/product/trusty/system-qemu-config.txt -o 
>>>>>>> out/target/product/trusty/system-qemu.img)"
>>>>>>> 1+0 records in
>>>>>>> 2048+0 records out
>>>>>>> 1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.0063128 s, 166 MB/s
>>>>>>> Traceback (most recent call last):
>>>>>>>   File "device/generic/goldfish/tools/mk_combined_img.py", line 163, 
>>>>>>> in <module>
>>>>>>>     main()
>>>>>>>   File "device/generic/goldfish/tools/mk_combined_img.py", line 135, 
>>>>>>> in main
>>>>>>>     if check_sparse(partition["path"]):
>>>>>>>   File "device/generic/goldfish/tools/mk_combined_img.py", line 12, 
>>>>>>> in check_sparse
>>>>>>>     with open(filename, 'rb') as i:
>>>>>>> IOError: [Errno 2] No such file or directory: 
>>>>>>> 'out/target/product/trusty/vbmeta.img'
>>>>>>> 13:44:11 ninja failed with: exit status 1
>>>>>>>
>>>>>>> #### failed to build some targets (19:41 (mm:ss)) ####
>>>>>>>
>>>>>>> What should I do to get qemu_trusty_arm64-userdebug building 
>>>>>>> successfully?
>>>>>>>
>>>>>>> Thank you in advance!
>>>>>>>
>>>>>>> Best regards,
>>>>>>> Julien ROBIN
>>>>>>>
>>>>>> -- 
>>>>>> -- 
>>>>>> You received this message because you are subscribed to the "Android 
>>>>>> Building" mailing list.
>>>>>> To post to this group, send email to [email protected]
>>>>>> To unsubscribe from this group, send email to
>>>>>> [email protected]
>>>>>> For more options, visit this group at
>>>>>> http://groups.google.com/group/android-building?hl=en
>>>>>>
>>>>>> --- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "Android Building" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it, 
>>>>>> send an email to [email protected].
>>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/android-building/a30c5a05-6134-43a5-8f3b-32313e32bac0%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/android-building/a30c5a05-6134-43a5-8f3b-32313e32bac0%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> -- 
>>>> -- 
>>>> You received this message because you are subscribed to the "Android 
>>>> Building" mailing list.
>>>> To post to this group, send email to [email protected]
>>>> To unsubscribe from this group, send email to
>>>> [email protected]
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/android-building?hl=en
>>>>
>>>> --- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "Android Building" group.
>>>> To unsubscribe from this topic, visit 
>>>> https://groups.google.com/d/topic/android-building/fY-gdZQ-67M/unsubscribe
>>>> .
>>>> To unsubscribe from this group and all its topics, send an email to 
>>>> [email protected].
>>>> To view this discussion on the web visit 
>>>> https://groups.google.com/d/msgid/android-building/CAGSQo01HoD%2B8b1LdOrqaqmnQK5Fa1Ys9REVZ9Rt-85E4WrYRaw%40mail.gmail.com
>>>>  
>>>> <https://groups.google.com/d/msgid/android-building/CAGSQo01HoD%2B8b1LdOrqaqmnQK5Fa1Ys9REVZ9Rt-85E4WrYRaw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>>

-- 
-- 
You received this message because you are subscribed to the "Android Building" 
mailing list.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-building?hl=en

--- 
You received this message because you are subscribed to the Google Groups 
"Android Building" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/android-building/a52e9878-7432-4b28-b011-3e58d706491cn%40googlegroups.com.

Reply via email to