zoukankan      html  css  js  c++  java
  • 在 Android 上配置 GNU/Linux Chroot 环境

     这事以前也干过,也写过一篇文章。不过是三年前了。最近又折腾了一次,发现三年变化还是蛮大的,决定再写一篇。(还是 ArchlinuxARM)

    首先用 CPU-Z 查看一下(已 root 的) Android 设备的硬件架构,然后到官网上下载一个对应架构的 base system 的 tarball. 然后在设备上弄个 ext3/ext4 文件系统,把它解压到里面。

    有外置 SD 卡的话,直接分出一个 ext3/ext4 分区给 Linux 用就行了。没有的话,就只能用 loopback. 下面以使用 loopback 的情况为例进行讲解。

    所谓使用 loopback, 就是把系统装在一个文件里。先创建文件:

    $ dd if=/dev/zero of=./archlinux_arm bs=4M count=1024

    这就创建了一个 4GiB 的文件。再小些也可以,不过 2GiB 或者更小就不大够用(如果装的软件较多的话)。

    接下来,把这个文件格式化为 ext3 文件系统:

    $ mkfs.ext3 ./archlinux_arm

    挂载这个文件到  /mnt :

    $ mount -o loop ./archlinux_arm /mnt

    解包 base system:

    $ cd /mnt
    [/mnt] $ tar -vxapf ~/Downloads/ArchLinuxARM-aarch64-latest.tar.gz

    修改  /mnt/etc/group , 添加以下两行,以便上网(Android 进行了某种限制,即使 root 也得添加到某些 group):

    inet:x:3003:root
    net_raw:x:3004:root

    再写一个脚本,用于自动化 chroot:

    $ cd -
    $ umount /mnt
    $ "$EDITOR" run_chroot.sh

    run_chroot.sh 内容如下:

     1 #!/system/bin/sh
     2 
     3 ROOT="/system/mnt"
     4 
     5 if [ -d "$ROOT/usr" ]; then
     6     echo "Filesystems already mounted."
     7 else
     8     echo "Mounting loopback..."
     9     mount -t ext3 -o loop /sdcard/archlinux_arm "$ROOT"
    10     echo "Mounting API filesystems..."
    11     mount -o bind /dev "$ROOT/dev"
    12     mount -o bind /proc "$ROOT/proc"
    13     mount -o bind /sys "$ROOT/sys"
    14     echo "Binding SD Card..."
    15     mount -o bind /sdcard "$ROOT/sdcard"
    16 fi
    17 
    18 echo "Executing chroot..."
    19 LD_PRELOAD="" LD_LIBRARY_PATH="$ROOT/usr/lib" "$ROOT/usr/lib/"ld-*.so "$ROOT/usr/bin/chroot" "$ROOT" /usr/bin/su -l

    (最后一行为何这么长?——设备上万一没有 chroot 命令,就必须借用 GNU/Linux 里面的程序了)

    其中  mount -o bind /sdcard "$ROOT/sdcard"  是为了方便在 chroot 环境中访问外部文件。

    把文件发到设备上(如果能直接在电脑上挂载设备,就不需要这步):

    $ adb push archlinux_arm /sdcard/
    $ adb push run_chroot.sh /sdcard/
    $ rm archlinux_arm
    $ rm run_chroot.sh

    连接到设备,开始配置:

    $ adb shell
    (device) $ su
    (device) # mount -o remount,rw /system
    (device) # mkdir /system/mnt
    (device) # cp /sdcard/run_chroot.sh /system/bin/arch
    (device) # chmod 755 /system/bin/arch

    进入 chroot 环境:

    (device) # arch
    (chroot) #

    搞定!

    弄完了之后,可以换个快些的软件源(例如 USTC 的),装点乱七八糟的软件(比如 gcc, make, cmake, vim, emacs, octave, maxima... ),滚一下系统……

     

  • 相关阅读:
    elselect下拉数据过多解决办法
    移动端开发遇到的问题汇总
    win7系统可关闭的服务
    安装Qcreator2.5 + Qt4.8.2 + MinGW_gcc_4.4 (win7环境)
    学习Qt的资源
    c++学习 定位new表达式
    eltablecolumn中添加echarts
    js对象数组封装,形成表格,并在表格中添加echarts直折线图
    Unity学习笔记3:随机数和动画脚本
    关于Unity的一些概念和语法
  • 原文地址:https://www.cnblogs.com/li-hua/p/5965569.html
Copyright © 2011-2022 走看看