请选择 进入手机版 | 继续访问电脑版
本帖最后由 peacekeep 于 2017-7-18 13:03 编辑

接上篇http://bbs.emindos.org/forum.php?mod=viewthread&tid=1087

摘要:在统一的内核基础通过chroot在archLinux上启动了技德的remix os,EmindOS和openthos目前也启动成功

正文:
曾经尝试在Linux上,把安卓x86的系统解包到一个文件然后通过chroot或者lxc容器来启动,不过都还没搞出来。
后来想了想直接模拟initrd的启动过程来启动试试。基本思路就是解包initrd,修改其init启动文件,chroot initrd /init,利用其挂载system.sfs、data等,再启动安卓x86。道路非常的曲折呀。好在在技德remix os上成功启动了,验证了安卓x86和Linux桌面系统同时运行是完全可行的。不过由于EmindOS、openthos及原生安卓x86的init系统不同,都没有成功。
下面是曲线救国的过程:
1、首先解压initrd.img
  1. mkdir initrd
  2. cd initrd
  3. zcat ../initrd.img | cpio -id > /dev/null
复制代码
2、修改init文件
      改变原有的挂载system.sfs的模式,system.sfs、ramdisk.img的位置都是已知的,所以没有必要搜索啥了,直接挂就是了。
修改前:
  1. mount -t tmpfs tmpfs /android
  2. cd /android
  3. while :; do
  4.     for device in ${ROOT:-/dev/[hmsv][dmr][0-9a-z]*}; do
  5.         check_root $device && break 2
  6.         mountpoint -q /mnt && umount /mnt
  7.     done
  8.     sleep 1
  9.     echo -n .
  10. done
复制代码
修改后:
  1. zcat ../ramdisk.img | cpio -id > /dev/null
  2. mount -o loop ../system.sfs ../sfs
  3. mount -o loop,rw ../sfs/system.img system
  4. mount --bind ../modules system/lib/modules
  5. cp /init.rc ./
  6. ln -s ../system/lib/firmware  /lib
  7. ln -s ../system/lib/modules  /lib
复制代码
其中initrc是ramdisk.img内的,需要简单修改一下
修改前:
  1. import /init.environ.rc
  2. import /init.usb.rc
  3. import /init.${ro.hardware}.rc
  4. import /init.usb.configfs.rc
  5. import /init.${ro.zygote}.rc
  6. import /init.trace.rc
复制代码
修改后:
  1. import /init.environ.rc
  2. import /init.usb.rc
  3. import /init.remix_x86_64.rc
  4. import /init.usb.configfs.rc
  5. import /init.zygote64_32.rc
  6. import /init.trace.rc
复制代码
ln -s ../system/lib/firmware  /lib和ln -s ../system/lib/modules  /lib 是来向system挂载新内核模块和固件的。

另外init文件的switch_root方式不适应,变更为chroot
修改前:
  1. export ANDROID_ROOT=/system
  2. exec ${SWITCH:-switch_root} /android /init
复制代码
修改后:
  1. export ANDROID_ROOT=/system
  2. chroot /android /init
复制代码
3、引导启动
启动前保证system.sfs、ramdisk.img、编辑过的inir.rc、新内核的modules和firmware在合适的位置。我都放在一个文件夹里了。
建立一个用于启动的文件夹root作为initrd的根目录,然后:
  1. mount -t tmpfs tmpfs root
  2. cp ramdisk.img root
  3. cp system.sfs root
  4. cp -r lib/modules root
  5. cp -r initrd/* root
  6. cp init.rc root
  7. mkdir root/dev
  8. chroot root /init
复制代码
为了方便我都采用复制的方式到root文件里去了,方便挂载。就是速度慢点。反正是验证可行性,也就先这样了。data分区没有挂载,启动以后是内存模式,没法保存数据的。

4、由于安卓的surfaceflinger占用tty7,所以我在archlinux里启动的,用Ubuntu或者emind desktop需要修改gnome和lightdm/gdm到其他tty去。
5、存在的问题:
       a、启动过程曲折,需要简化改进。
       b、仅能在remix os 测试成功。改进安卓x86 或者 Linux  的 init系统才是王道。
       c、archlinux和remix os之间在网络管理上有冲突,造成网络不能访问。不过openthos没有这个问题(chroot archlinux时启动udev测试的结果)
      d、其他问题,比如声卡的冲突,很久以前测试的,现在有些记不得了。
6、期望
     我就是简单的堆砌、测试,对于个中原理一头雾水。还希望有大神指点。听说一铭要搞类似的功能,期待中。
2017.7.17
7、近期进展
        a.启动脚本已经简化,openthos适用
  1. #!/bin/bash
  2. PATH=/sbin:/bin:/system/bin:/system/xbin:$PATH; export PATH
  3. mount -t tmpfs tmpfs android
  4. cd android
  5. zcat ../ramdisk.img | cpio -id > /dev/null
  6. mount -o loop ../system.sfs ../sfs
  7. mount -o loop,rw ../sfs/system.img system
  8. mount --bind ../data data
  9. cp ../init.rc ./
  10. exec chroot ../android /init
复制代码
        b.一铭陈工已经用类似方式复现,效果和稳定性会更好,期待其结果。
         c.用lxc容器启动更加稳定。
         d.目前进行了简单测试,问题还是很多:
                 *      切换后安卓可能键盘丢失,按ctrl再按alt可恢复
                 *      尝试两个系统挂载同一个磁盘,非root用户不能实现
                 *     尝试两个系统同时启动摄像头,摄像头崩溃
                 *     测试分别在Linux和安卓(用VLC)上播放同一视频cpu占用率相当,单核均在40-50%,整体占用率5~6%
                 *     启动百度(酷狗、qq等)音乐后声卡被完全安卓系统占用(个别情况下是好的)
                 *     尝试两个系统同时播放声音,不能实现。
                 *     lxc下运行,如果使用安卓系统执行关机操作,Ubuntu系统根目录会被挂载为只读。(安卓和Ubuntu同一分区测试的结果,不同分区未进行测试)
举报 使用道具
| 回复

共 27 个关于本帖的回复 最后回复于 2018-4-13 23:32

sysop 金牌会员 发表于 2017-7-5 20:13:07 | 显示全部楼层
这个很有意思\(^o^)/







    神奇的小尾巴:Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36  (zh-CN)
    ——2017/7/5 下午8:14:07
             
    http://pan.baidu.com/share/home?uk=3808843197&view=share#category/type=0
    举报 使用道具
    匿名  发表于 2017-7-7 13:26:18
    同上,这个很有意思\(^o^)/+1
    使用道具
    陈刚 注册会员 发表于 2017-7-12 11:13:04 | 显示全部楼层
    It is really very useful !

    For ubuntu 15.10, if we want to change its tty7 to tty8, we need create a file /etc/lightdm/lightdm.conf, and append a line "minimum-vt=8"
    举报 使用道具
    peacekeep 中级会员 发表于 2017-7-12 14:01:31 | 显示全部楼层
    陈刚 发表于 2017-7-12 11:13
    It is really very useful !

    For ubuntu 15.10, if we want to change its tty7 to tty8, we need create  ...

    i creat vt8.conf at /etc/lightdm/lightdm.conf.d/
    vt8.conf:
    1. [LightDM]
    2. minimum-vt=8
    复制代码

    ubuntu 16.04 works too.
    举报 使用道具
    youling257 注册会员 发表于 2017-7-17 13:25:49 | 显示全部楼层
    本帖最后由 youling257 于 2017-7-17 13:38 编辑

    你也知道只能用于技德的6.0,因为7.1启用了selinux,https://osdn.net/projects/androi ... /selinux_diffconfig  ,PARANOID_NETWORK必须启用,蓝牙才能工作,因为selinux security.

    我倒是在安卓内chroot到ubuntu用了半年,用vnc或者xserver xsdl开图形,

    Welcome to Ubuntu Artful Aardvark (development branch) (GNU/Linux 4.9.38-android-x86+ i686)

    * Documentation:  https://help.ubuntu.com
    * Management:     https://landscape.canonical.com
    * Support:        https://ubuntu.com/advantage

    Ubuntu 12.04 LTS end-of-life is April 25, 2017 -- Upgrade your Precise systems!
    $ sudo do-release-upgrade -m server

    0 个可升级软件包。
    0 个安全更新。

    *** 需要重启系统 ***
    Last login: Mon Jul 17 09:44:21 2017 from 127.0.0.1
    youling257@localhost:~$ su
    密码:
    root@localhost:/home/youling257# apt update
    获取:1 http://cn.archive.ubuntu.com/ubuntu artful InRelease [237 kB]
    命中:2 http://cn.archive.ubuntu.com/ubuntu artful-updates InRelease
    命中:3 http://cn.archive.ubuntu.com/ubuntu artful-backports InRelease
    获取:4 http://cn.archive.ubuntu.com/ubuntu artful-proposed InRelease [235 kB]
    命中:5 http://security.ubuntu.com/ubuntu artful-security InRelease
    获取:6 http://cn.archive.ubuntu.com/ubuntu artful/main i386 Packages [1,135 kB]
    获取:7 http://cn.archive.ubuntu.com/ubuntu artful/main i386 DEP-11 Metadata [465 kB]
    获取:8 http://cn.archive.ubuntu.com/ubuntu artful/main DEP-11 64x64 Icons [294 kB]
    获取:9 http://cn.archive.ubuntu.com/ubuntu artful/universe i386 Packages [8,264 kB]
    获取:10 http://cn.archive.ubuntu.com/ubuntu artful/universe Translation-en [4,767 kB]
    获取:11 http://cn.archive.ubuntu.com/ubuntu artful/universe i386 DEP-11 Metadata [2,823 kB]
    获取:12 http://cn.archive.ubuntu.com/ubuntu artful/universe DEP-11 64x64 Icons [7,887 kB]
    获取:13 http://cn.archive.ubuntu.com/ubuntu artful/multiverse i386 DEP-11 Metadata [44.2 kB]
    获取:14 http://cn.archive.ubuntu.com/ubuntu artful/multiverse DEP-11 64x64 Icons [204 kB]
    获取:15 http://cn.archive.ubuntu.com/ubuntu artful-proposed/universe i386 Packages [498 kB]
    获取:16 http://cn.archive.ubuntu.com/ubuntu artful-proposed/universe Translation-en [227 kB]
    获取:17 http://cn.archive.ubuntu.com/ubuntu artful-proposed/universe i386 DEP-11 Metadata [53.7 kB]
    获取:18 http://cn.archive.ubuntu.com/ubuntu artful-proposed/universe DEP-11 64x64 Icons [120 kB]
    获取:19 http://cn.archive.ubuntu.com/ubuntu artful-proposed/multiverse i386 DEP-11 Metadata [2,468 B]
    获取:20 http://cn.archive.ubuntu.com/ubuntu artful-proposed/main i386 Packages [126 kB]
    获取:21 http://cn.archive.ubuntu.com/ubuntu artful-proposed/main Translation-en [53.9 kB]
    获取:22 http://cn.archive.ubuntu.com/ubuntu artful-proposed/main i386 DEP-11 Metadata [17.8 kB]
    获取:23 http://cn.archive.ubuntu.com/ubuntu artful-proposed/main DEP-11 64x64 Icons [31.3 kB]
    已下载 27.5 MB,耗时 26秒 (1,054 kB/s)
    正在读取软件包列表... 完成
    正在分析软件包的依赖关系树
    正在读取状态信息... 完成
    有 7 个软件包可以升级。请执行 ‘apt list --upgradable’ 来查看它们。
    root@localhost:/home/youling257#
    举报 使用道具
    youling257 注册会员 发表于 2017-7-17 13:27:20 | 显示全部楼层
    本帖最后由 youling257 于 2017-7-17 13:57 编辑

    一会儿给你扒出来google group上在desktop linux上chroot开图像运行安卓的讨论贴
    开安卓图形surfaceflinger你居然想到了解决方法

    https://groups.google.com/d/msg/ ... KQQtf4/LrbYHd_2kkMJ
    https://groups.google.com/d/msg/ ... z48kbM/GAUkO0wnBgAJ

    举报 使用道具
    youling257 注册会员 发表于 2017-7-17 13:50:20 | 显示全部楼层
    本帖最后由 youling257 于 2017-7-17 14:02 编辑

    你在chroot安卓内安装aida64,看看显示gpu、OpenGL,支持3d硬件加速才行,如果是Gallium 0.4 on llvmpipe就废了
    举报 使用道具
    peacekeep 中级会员 发表于 2017-7-17 15:56:19 | 显示全部楼层
    youling257 发表于 2017-7-17 13:50
    你在chroot安卓内安装aida64,看看显示gpu、OpenGL,支持3d硬件加速才行,如果是Gallium 0.4 on llvmpipe就 ...

    OK。我试试
    举报 使用道具
    peacekeep 中级会员 发表于 2017-7-17 15:56:53 | 显示全部楼层
    本帖最后由 peacekeep 于 2017-7-17 16:12 编辑
    youling257 发表于 2017-7-17 13:27
    一会儿给你扒出来google group上在desktop linux上chroot开图像运行安卓的讨论贴
    开安卓图形surfaceflinger ...

    目前流程已经完全简化。一铭工程师也在做。等一铭的结果

    附启动脚本
    1. #!/bin/bash
    2. PATH=/sbin:/bin:/system/bin:/system/xbin:$PATH; export PATH
    3. mount -t tmpfs tmpfs android
    4. cd android
    5. zcat ../ramdisk.img | cpio -id > /dev/null
    6. mount -o loop ../system.sfs ../sfs
    7. mount -o loop,rw ../sfs/system.img system
    8. mount --bind ../data data
    9. cp ../init.rc ./
    10. exec chroot ../android /init
    复制代码

    举报 使用道具
    B Color Image Link Quote Code Smilies
    高级模式

    本版积分规则

    快速回复 快速发帖 返回顶部 返回列表