Diferència entre revisions de la pàgina «Ubuntu on Android»
(Notes translated) |
(→Other sources) |
||
(Hi ha 27 revisions intermèdies del mateix usuari que no es mostren) | |||
Línia 2: | Línia 2: | ||
---- | ---- | ||
− | '''Introduction:''' This is a guide to make work an Ubuntu GNU/Linux container inside an Android operating system session, and by this way have the desktop computer functionality without loosing performance. This is a very detailed guide, also useful to people who wants to create a wizard or improve the procedure. | + | '''Introduction:''' This is a guide to make work an Ubuntu GNU/Linux container inside an Android operating system session, and by this way have the desktop computer functionality without loosing performance. This is a very detailed guide, util for Debian and derivatives, and also useful to people who wants to create a wizard or improve the procedure. |
'''Notes:''' | '''Notes:''' | ||
− | * At the moment of writing this guide (november 2011), [http://en.wikipedia.org/wiki/Canonical_Ltd. Canonical] still | + | * At the moment of writing this guide (november 2011), [http://en.wikipedia.org/wiki/Canonical_Ltd. Canonical] still didn't have [http://www.ubuntu.com/devices/android its announced solucion] ready, but since 2014 [https://wiki.ubuntu.com/Touch/Porting they follow Cyanogenmod strategy and with more success]. The best working version for the default desktop (Unity) is the 12.04 (Precise) |
* The total downloads proposed can reach to 1GiB of data; if you do all from the device, take care of the data plan prices that applies the internet access provider. | * The total downloads proposed can reach to 1GiB of data; if you do all from the device, take care of the data plan prices that applies the internet access provider. | ||
* The possibility of using an LXC container has been explored to have a completely normal container, but [http://ubuntuforums.org/showthread.php?t=2077671 didn't worked] because of the use of [https://sourceforge.net/mailarchive/message.php?msg_id=27043843 bionic lic instead of GNU libc] by Android. | * The possibility of using an LXC container has been explored to have a completely normal container, but [http://ubuntuforums.org/showthread.php?t=2077671 didn't worked] because of the use of [https://sourceforge.net/mailarchive/message.php?msg_id=27043843 bionic lic instead of GNU libc] by Android. | ||
− | |||
__TOC__ | __TOC__ | ||
− | == | + | == Superuser permissions (root) == |
− | + | It's a requirement to have "su" access to manage the operating system. You can see the guide [[Open permissions in Android]] | |
− | == | + | == Terminal access == |
− | ==== | + | ==== Local terminal ==== |
− | + | It's advisable always to have a [http://f-droid.org/repository/browse/?fdid=jackpal.androidterm Terminal application] (that you can get freely with [[F-Droid package manager|F-Droid]]) available to can do managements with mobility, but it's more comfortable to do the long and complex preparations from a desktop computer, controlling the device connected through USB. | |
− | ==== | + | ==== Remote control ==== |
− | + | In the Ubuntu GNU/Linux distribution, since version 12.01 in the ''universal'' repository there is available the package '''android-tools-adb''' that allows the remote control to a device with Android in ''USB debug mode''. There is also an [https://launchpad.net/~nilarimogard/+archive/webupd8 independent repository] that provides '''android-tools''' for previous versions. | |
− | + | To use the ''Android Debug Bridge'' (ADB) you must have the device working, plugged through USB, and with the mode "USB debug" enabled in the developer preferences of Android. | |
− | :'''ADB | + | :'''ADB through USB''' |
− | * | + | * To check the connectivity: |
adb devices | adb devices | ||
− | ( | + | (must show a "list" with a rare identifier that says it's a device) |
− | * | + | * To open a terminal session in the device: |
adb shell | adb shell | ||
− | * | + | * To start a superuser (root) session, and have Android administration permissions: |
su | su | ||
− | * | + | * To end as superuser and after also close the terminal session: |
exit | exit | ||
exit | exit | ||
− | :'''ADB | + | :'''ADB through network''' |
− | + | Many connections through USB aren't much stable (break often and you realize that are writing in your computer), and in these cases it's solved with net (Wifi). When this is done, it's important that the device hasn't direct internet connection (for example with the telephony provider) and it's working in a communication through the local Wifi. | |
− | * | + | * From Android, to see the enabled network devices (default... dev -->): |
ip route list | ip route list | ||
− | * | + | * From Android, to see the IP address of a network device (for example '''wlan0'''): |
ifconfig wlan0 | ifconfig wlan0 | ||
− | * | + | * From the computer, to set the communication to be through network (for example to the IP 192.168.1.122): |
adb connect 192.168.1.122 | adb connect 192.168.1.122 | ||
− | * | + | * To open a terminal session in the device: |
adb shell | adb shell | ||
− | * | + | * To start a superuser (root) session, and have Android administration permissions: |
su | su | ||
− | * | + | * To end as superuser and after also close the terminal session: |
exit | exit | ||
exit | exit | ||
− | :''' | + | :'''Additional notes''' |
− | * | + | * In this guide, where written commands are indicated, they are to be run in a local or remote terminal window. |
− | * | + | * If you get messages as "Operation not permitted" , it's often because you didn't begin as superuser (su) |
− | == | + | == Chech the available tools == |
− | + | In a terminal check this command: | |
chroot | chroot | ||
− | + | It can answer two things: the help presentatiom (with "''usage: chroot...''") or the error message "''chroot: not found''". In this last case (''not found'') you have an Android variant very clipped, and you need to replace it for another one more free such as [[Replace Android for CyanogenMod|CyanogenMod]] or [http://replicant.us/ Replicant]. Other alternatives more technical are: [[Superimpose directories over Android]] or [https://wiki.ubuntu.com/ARM/OmapDesktopInstall To format a memory card]. | |
− | == | + | == Take note of the architecture == |
− | + | The processor generation used by Android can be looked with '''one''' of the following commands: | |
uname -m | uname -m | ||
cat /proc/cpuinfo | cat /proc/cpuinfo | ||
− | + | If the device's ARM processor supports floating-point (ARMv7 or superior, for example armv7l matches), then you can use "armhf" instead of "armel". This enhaces some processes speed. | |
− | == | + | == Prepare the space == |
− | + | To allow working of the links and device accesses is needed that the new container resides in a properly partition for GNU/Linux, such as Ext3 or Ext4. With the '''mount''' command you can see the format of each volume, and with the following syntax it's seen very clear: | |
mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | ||
− | + | And it can be filtered to see only what is interesting for us: | |
mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | sed -e '/ext.$/!d' | mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | sed -e '/ext.$/!d' | ||
− | + | Once seen the compatible paths, you must value the free space available with this command: | |
df | df | ||
− | + | If in the free space there isn't mention of the measurement unity (100K, 100M, 100G), this means that it's expressed in K (KiB). Care that the path /cache works as an "internal trash" and its content can be deleted automatically. | |
− | + | You need at least 100MiB for an elemental installation (only ''core''), or near 250MiB for a ''debootstrap'', but can be reached a use of 2 or 3GiB if you install all the big desktop applications of common use, and apart counting some working space. Also installations "for all the pockets" can be done. | |
− | + | For the rest of the guide we will suppose that you choosed the partition '''/data''' , and then you put the new operating system in '''/data/ubuntu''' . Then you must enable permissions for writing, executing, devices and superuser in the partition, and create the subdirectory: | |
mount -o remount,rw,dev,exec,suid,noatime /data | mount -o remount,rw,dev,exec,suid,noatime /data | ||
− | + | RootPoint="/data/ubuntu" | |
− | mkdir "$ | + | mkdir "$RootPoint" |
− | cd "$ | + | cd "$RootPoint" |
− | == | + | == Get an operating system base == |
− | + | This is the way to build from another computer (supposing the armhf architecture) in an Ext2/Ext3 partition: | |
sudo debootstrap --verbose --arch=armhf --foreign precise precise-armhf | sudo debootstrap --verbose --arch=armhf --foreign precise precise-armhf | ||
− | * | + | * To trainsport the directory tree from a device to another, must be copied qith superuser permissions, to not loose the files and directories attributes. To open in this way a folder explorer with Ubuntu, you can execute (Alt+F2) "'''gksudo nautilus'''". |
− | + | But here we also propose the way to do it completely from the Android device: downloading a prepared base (from official website) with '''only one''' of the following commands, depending on version and variant you need (more versions are published in cdimage.ubuntu.com): | |
− | ''' | + | '''<nowiki>wget http://cdimage.ubuntu.com/ubuntu-core/releases/precise/release/ubuntu-core-12.04.2-core-armhf.tar.gz</nowiki>''' |
− | + | <nowiki>wget http://cdimage.ubuntu.com/ubuntu-core/releases/oneiric/release/ubuntu-core-11.10-core-armel.tar.gz</nowiki> | |
− | + | <nowiki>wget http://cdimage.ubuntu.com/ubuntu-core/releases/quantal/release/ubuntu-core-12.10-core-armhf.tar.gz</nowiki> | |
− | + | <nowiki>wget http://cdimage.ubuntu.com/releases/precise/release/ubuntu-12.04-preinstalled-desktop-armhf+ac100.tar.gz</nowiki> | |
− | + | <nowiki>wget http://cdimage.ubuntu.com/releases/oneiric/release/ubuntu-11.10-preinstalled-desktop-armel+ac100.tar.gz</nowiki> | |
− | + | Note: The "preinstalled" ones have all the software for a typical installation, but also elements that bust be cleaned to boot the container. | |
− | + | With the file downloaded, it's the turn of unpack it: | |
− | tar -xzf ubuntu-core-12.04. | + | tar -xzf ubuntu-core-12.04.2-core-armhf.tar.gz |
− | rm ubuntu-core-12.04. | + | rm ubuntu-core-12.04.2-core-armhf.tar.gz |
− | == | + | == Adjust the base == |
− | + | Correct come links in the base's directory, to adequate them to the situation: | |
− | chmod 755 "$ | + | chmod 755 "$RootPoint" |
if [ -d /acct ] ; then mkdir -p acct ; fi | if [ -d /acct ] ; then mkdir -p acct ; fi | ||
cd var | cd var | ||
if [ -L run ] ; then rm run ; ln -s ../run run ; fi | if [ -L run ] ; then rm run ; ln -s ../run run ; fi | ||
if [ -L lock ] ; then rm lock ; ln -s ../run/lock lock ; fi | if [ -L lock ] ; then rm lock ; ln -s ../run/lock lock ; fi | ||
− | cd "$ | + | cd "$RootPoint" |
− | + | Clean directories that sometimes have content for a native installation: | |
if [ -d proc ] ; then rm -R proc/* ; fi | if [ -d proc ] ; then rm -R proc/* ; fi | ||
if [ -d dev ] ; then rm -R dev/* ; fi | if [ -d dev ] ; then rm -R dev/* ; fi | ||
Línia 119: | Línia 118: | ||
if [ -d var/run/dbus ] ; then rm -R var/run/dbus/* ; fi | if [ -d var/run/dbus ] ; then rm -R var/run/dbus/* ; fi | ||
− | == | + | == Mount Android resources == |
− | mount -o bind "/proc" "$ | + | mount -o bind "/proc" "$RootPoint/proc" |
− | mount -o bind "/dev" "$ | + | mount -o bind "/dev" "$RootPoint/dev" |
− | mount -o bind "/dev/pts" "$ | + | mount -o bind "/dev/pts" "$RootPoint/dev/pts" |
− | mount -o bind "/sys" "$ | + | mount -o bind "/sys" "$RootPoint/sys" |
− | if [ -d /acct ] ; then mount -o bind "/acct" "$ | + | if [ -d /acct ] ; then mount -o bind "/acct" "$RootPoint/acct" ; fi |
− | if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$ | + | if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$RootPoint/dev/cpuctl" ; fi |
− | + | If you want to make Android's folders available, you must check which partitions are mounted. It can be done with a simple '''mount''' or with this command that simplifies information: | |
mount | sed -e '/ \/mnt\//!d' | sed -e '/^\//!d' | cut -f 2,3 -d ' ' | cut -f 2- -d '/' | cut -f 1 -d ' ' | sed -e 's/^/\//g' | mount | sed -e '/ \/mnt\//!d' | sed -e '/^\//!d' | cut -f 2,3 -d ' ' | cut -f 2- -d '/' | cut -f 1 -d ' ' | sed -e 's/^/\//g' | ||
− | + | If, for example, you want to mount /mnt/sdcard , do the following: | |
− | mkdir -p "$ | + | mkdir -p "$RootPoint/mnt/sdcard" |
− | mount -o bind "/mnt/sdcard" "$ | + | mount -o bind "/mnt/sdcard" "$RootPoint/mnt/sdcard" |
− | == | + | == Enter to the new system and set the basic services == |
− | + | Since the implementation of the services starting system Upstart [http://gyp.blogs.balabit.com/2011/01/using-upstart-in-a-chroot/ the Chroot containers don't start the services as a normal installation], and it must be done manually. | |
− | chroot "$ | + | |
+ | chroot "$RootPoint" /bin/su | ||
mount -a | mount -a | ||
− | + | Sure that appears something mounted, to don't fail some utilities: | |
if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi | if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi | ||
− | Complete | + | Complete the ''debootstrap'' if it's the case, in the same architecture: |
if [ -x /debootstrap/debootstrap ] ; then /debootstrap/debootstrap --second-stage ; fi | if [ -x /debootstrap/debootstrap ] ; then /debootstrap/debootstrap --second-stage ; fi | ||
− | + | Patch to avoid Upstart services startup error: | |
dpkg-divert --local --rename --add /sbin/initctl | dpkg-divert --local --rename --add /sbin/initctl | ||
ln -s /bin/true /sbin/initctl | ln -s /bin/true /sbin/initctl | ||
− | Configure | + | Configure the network: |
echo "nameserver 4.2.2.2" > /etc/resolv.conf | echo "nameserver 4.2.2.2" > /etc/resolv.conf | ||
echo "nameserver 8.8.8.8" >> /etc/resolv.conf | echo "nameserver 8.8.8.8" >> /etc/resolv.conf | ||
Línia 155: | Línia 155: | ||
echo "127.0.0.1 localhost" > /etc/hosts | echo "127.0.0.1 localhost" > /etc/hosts | ||
− | + | Check if there are repositories set: | |
cat /etc/apt/sources.list | cat /etc/apt/sources.list | ||
− | + | If there wasn't anything, or the "universe" are disabled with #, write them with the following commands (example for Ubuntu 12.04, called "precise"): | |
Version="precise" | Version="precise" | ||
<nowiki>echo "deb http://ports.ubuntu.com/ ${Version} main universe" > /etc/apt/sources.list</nowiki> | <nowiki>echo "deb http://ports.ubuntu.com/ ${Version} main universe" > /etc/apt/sources.list</nowiki> | ||
Línia 169: | Línia 169: | ||
apt-get update | apt-get update | ||
− | + | Install services and tools to avoid bad messages (the packages ''-es'' are for castillian language): | |
− | : | + | :Note: if appears some asking or message square, the option is changed with the TABulator key, and buttons are pressed with spacebar, thing to be easier if you are working with ADB from a computer. |
apt-get install dbus dbus-x11 | apt-get install dbus dbus-x11 | ||
mkdir -p /var/run/dbus | mkdir -p /var/run/dbus | ||
apt-get install language-pack-es | apt-get install language-pack-es | ||
update-locale | update-locale | ||
− | + | DefaultLanguage="es_ES.UTF-8" | |
− | export LANG="$ | + | export LANG="$DefaultLanguage" |
− | export LANGUAGE="$ | + | export LANGUAGE="$DefaultLanguage" |
− | echo "LANG=\"$ | + | echo "LANG=\"$DefaultLanguage\"" >> /etc/default/locale |
− | echo "LANGUAGE=\"$ | + | echo "LANGUAGE=\"$DefaultLanguage\"" >> /etc/default/locale |
− | + | Start DBus service that has a lot of applications depending on (cannot benefit with Android's one): | |
DbusPid="$(dbus-daemon --system --print-pid --fork)" | DbusPid="$(dbus-daemon --system --print-pid --fork)" | ||
− | + | Install the basic part of Ubuntu and apply updates. This process takes time: | |
apt-get install ubuntu-minimal ubuntu-standard | apt-get install ubuntu-minimal ubuntu-standard | ||
apt-get upgrade | apt-get upgrade | ||
− | + | Install desktop and applications you are interested in. This process can take MUCH TIME: | |
apt-get install sudo ubuntu-desktop libreoffice libreoffice-l10n-es language-pack-gnome-es | apt-get install sudo ubuntu-desktop libreoffice libreoffice-l10n-es language-pack-gnome-es | ||
− | ( | + | (if appears some asking or message square, the option is changed with the TABulator key, and buttons are pressed with spacebar). |
− | == | + | == Open a normal user account == |
− | + | Using the desktop and applications as normal user (not root) improves the security and the admission by some elements that requires it. | |
cp -a /etc/adduser.conf /etc/adduser.conf.bak | cp -a /etc/adduser.conf /etc/adduser.conf.bak | ||
cat /etc/adduser.conf.bak | sed -e 's/^#EXTRA_GROUPS=/EXTRA_GROUPS=/g' > /etc/adduser.conf | cat /etc/adduser.conf.bak | sed -e 's/^#EXTRA_GROUPS=/EXTRA_GROUPS=/g' > /etc/adduser.conf | ||
− | + | UserName=user | |
− | adduser --add_extra_groups --gecos "" $ | + | adduser --add_extra_groups --gecos "" $UserName |
− | + | Include the new account ($UserName) in the common user group and administration groups there is: | |
− | usermod --append --groups users $ | + | usermod --append --groups users $UserName |
− | usermod --append --groups sudo $ | + | usermod --append --groups sudo $UserName |
− | usermod --append --groups adm $ | + | usermod --append --groups adm $UserName |
− | usermod --append --groups admin $ | + | usermod --append --groups admin $UserName |
− | + | Create an special group where to include the user, to be able to open input ports | |
addgroup --gid 3003 sockets | addgroup --gid 3003 sockets | ||
− | usermod --append --groups sockets $ | + | usermod --append --groups sockets $UserName |
− | == | + | == Enable graphical interface == |
− | + | Although it appeared some [http://f-droid.org/repository/browse/?fdid=au.com.darkside.XServer X-Server tool] to use applications directly in the screen without remote control, for the moment we expose the traditional method 2011-2012 (supposing in the example the device screen has a resolution of 1280x720): | |
apt-get install xvfb x11vnc xtightvncviewer | apt-get install xvfb x11vnc xtightvncviewer | ||
if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi | if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi | ||
Línia 213: | Línia 213: | ||
chmod a+rx /tmp/xvnc.sh | chmod a+rx /tmp/xvnc.sh | ||
su -l $NombreUsuaria -c /tmp/xvnc.sh | su -l $NombreUsuaria -c /tmp/xvnc.sh | ||
− | + | It will be waiting for connections (you will see PORT=5900). It's necessary to not close this terminal while you want to have Ubuntu available. | |
− | == | + | == Open Ubuntu desktop from Android == |
− | + | Any [http://f-droid.org/repository/browse/?fdid=android.androidVNC remote control program for VNC] can be used, that can be found easily with the [[F-Droid package manager]]. | |
− | + | Connect to the address '''localhost''' and with the normal port '''5900'''. Without user (''nickname'') nor password. You have an enough secure access because it only will allow connections from the same device (-localhost). | |
− | == | + | == Exit == |
− | + | If you want to use Android again it's enough with closing VNC, or simply minimize to do other things. If you shutdown the device with Android don't worry; it's as you also close the Ubuntu desktop as it was a computer. | |
− | + | If you want to stop the Ubuntu system without stopping nor restarting Android, you must exit from the session in the same Ubuntu desktop, same as you do it from a normal computer: with the graphical shutdown button, but with the user logout option. If you see a terminal window, also closing it the session is closed. With the following indications you will do a completely clean exit from the container. | |
− | + | Stopping services: In the Terminal window where you had the x11vnc waiting for connections, if it's still waiting, you can break it with {Control} + {C}. After this the rest: | |
kill $DbusPid | kill $DbusPid | ||
rm -f /var/run/dbus/pid | rm -f /var/run/dbus/pid | ||
Línia 231: | Línia 231: | ||
umount -a | umount -a | ||
exit | exit | ||
− | + | If for example you mounted the Android folder /mnt/sdcard : | |
− | umount "$ | + | umount "$RootPoint/mnt/sdcard" |
− | if [ -d /dev/cpuctl ] ; then umount "$ | + | if [ -d /dev/cpuctl ] ; then umount "$RootPoint/dev/cpuctl" ; fi |
− | if [ -d /acct ] ; then umount "$ | + | if [ -d /acct ] ; then umount "$RootPoint/acct" ; fi |
− | umount "$ | + | umount "$RootPoint/sys" |
− | umount "$ | + | umount "$RootPoint/dev/pts" |
− | umount "$ | + | umount "$RootPoint/dev" |
− | umount "$ | + | umount "$RootPoint/proc" |
exit | exit | ||
exit | exit | ||
− | == | + | == To repeat the experience == |
− | * | + | * If you haven't ended the session from inside Ubuntu, you can simply connect again with the CNV client program. |
− | * | + | * The best, of course, is to have direct icons in the Android desktop, both to mount the container and to connect to the desktop via VNC. This wiki will thank the contributions about this. |
− | + | In other cases, such as you have stopped the device or stopped the Ubuntu container completely, write these instructions in a Terminal window (data from the same example in this page, which must be customized): | |
su | su | ||
mount -o remount,rw,dev,exec,suid,noatime /data | mount -o remount,rw,dev,exec,suid,noatime /data | ||
− | + | RootPoint="/data/ubuntu" | |
− | mount -o bind "/proc" "$ | + | mount -o bind "/proc" "$RootPoint/proc" |
− | mount -o bind "/dev" "$ | + | mount -o bind "/dev" "$RootPoint/dev" |
− | mount -o bind "/dev/pts" "$ | + | mount -o bind "/dev/pts" "$RootPoint/dev/pts" |
− | mount -o bind "/sys" "$ | + | mount -o bind "/sys" "$RootPoint/sys" |
− | if [ -d /acct ] ; then mount -o bind "/acct" "$ | + | if [ -d /acct ] ; then mount -o bind "/acct" "$RootPoint/acct" ; fi |
− | if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$ | + | if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$RootPoint/dev/cpuctl" ; fi |
− | mount -o bind "/mnt/sdcard" "$ | + | mount -o bind "/mnt/sdcard" "$RootPoint/mnt/sdcard" |
− | chroot "$ | + | chroot "$RootPoint" /bin/su |
mount -a | mount -a | ||
if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi | if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi | ||
DbusPid="$(dbus-daemon --system --print-pid --fork)" | DbusPid="$(dbus-daemon --system --print-pid --fork)" | ||
− | + | UserName=usuari | |
if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi | if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi | ||
MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1" | MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1" | ||
echo "x11vnc $MoreOptions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh | echo "x11vnc $MoreOptions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh | ||
chmod a+rx /tmp/xvnc.sh | chmod a+rx /tmp/xvnc.sh | ||
− | su -l $ | + | su -l $UserName -c /tmp/xvnc.sh |
− | + | Connect with the VNC client application to the address '''localhost''' and with the normal port '''5900'''. Without user nor password. | |
− | + | Obviously the best is to have the commands in scripts (executable text files): from the first "mount" until the "chroot" in an Android script (for example /system/bin/m) and the rest in a script in UBuntu (for example /usr/local/bin/x). By this way, the only steps in a terminal could be: | |
su | su | ||
m | m | ||
x | x | ||
− | + | And to do is in a single command, you can change the line '''chroot "$RootPoint" /bin/su''' by '''chroot "$RootPoint" /bin/su -c /usr/local/bin/x''' , and then also write a script in Android (/system/bin/u) that contents a single line with '''su -c m''' . With this, the service starts with a single command in the terminal: | |
u | u | ||
− | ( | + | (remember to give execution permission to the scripts, for example with: chmod 755 /system/bin/u ) |
− | ==== | + | ==== Launchers in Android desktop ==== |
− | + | With [https://github.com/kuri65536/sl4a/releases SL4A] you can prepare a Bash script (''Shell script'') that can also be run without showing the terminal window (in background). With this you can replace "u" that we have written as an example, creating a ''script'' called for example '''Ubuntu.sh''' and with content '''su -c m''' | |
− | + | To crate an icon on the desktop (Home) to launch Ubuntu in background, press the desktop background during some time until it opens an options menu, and select to create a customized link/launcher (''Custom shortcut''). Select the activity "Scripts" that has the shining-eyes icon (LS4A), select your program "Ubuntu.sh" and select that it starts in background (gear button). You can finish customizing a title as "Ubuntu 0" and press Ok. | |
− | + | You can use the same technique to create a launcher that connects directly through VNC: long-pressing on the desktop background, Customized launcher (''Custom shortcut''), select activity (''Pick your activity''), VNC connection, select the "localhost:5900", give it a title as "Ubuntu 1" and Ok. | |
− | + | With these 2 launchers, you already have Ubuntu in 2 taps: first to the SL4A icon that works in background, and after the VNC icon that connects. '''Don't launch again the SL4A icon if you aren't sure that it's stopped'''. You can connect and disconnect as many times as you want, while Ubuntu is launched in background with SL4A. | |
− | + | A known issue: If the menu opens but the option to create a launcher/link/shortcut doesn't appear in the desktop (it only offers to change background), you are probably using the "Trebuchet" desktop that lacks some feature. You can install the desktop manager [http://f-droid.org/repository/browse/?fdid=org.adw.launcher AnDerWeb] to fix it, but it doesn't maintain the previously set icons. | |
− | == | + | == How to see the things bigger == |
− | + | There are pocket devices that have a high point density in a touchscreen, that is, much resolution in a so small screen. Taking all the resolution in these situations makes difficult to hit the desktop elements with a finger. | |
− | + | If in this guide example you want to see the things ''twice'' larger, change the resolution of 1280x720 by 640x360, and the scale of 1/1 by 2/1. This means to divide by 2 the resolution and increasing the small image to double to it fills the screen. The operation can be done in any proportion; here an example to do it at two thirds (that implies a 50% of growth): | |
MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 3/2" | MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 3/2" | ||
echo "x11vnc $MoreOptions -env FD_GEOM=${1:-853x480x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh | echo "x11vnc $MoreOptions -env FD_GEOM=${1:-853x480x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh | ||
1280/3x2 = 853 ; 720/3x2 = 480 ; escala 3/2 | 1280/3x2 = 853 ; 720/3x2 = 480 ; escala 3/2 | ||
+ | |||
+ | == Other sources == | ||
+ | * [https://fsfe.org/campaigns/android/liberate.en.html Liberate your device] (Free Software Foundation) | ||
+ | * [https://wiki.ubuntu.com/Touch/Install#Instructions_for_flashing_a_phone_or_tablet_device_with_Ubuntu Instructions for flashing a phone or tablet device with Ubuntu] | ||
+ | * [https://wiki.ubuntu.com/Touch/Porting Ubuntu porting guide] (touch) | ||
+ | * [https://help.ubuntu.com/community/PortableDevices/Android Android devices with some Ubuntu use] | ||
+ | * [https://wiki.debian.org/ChrootOnAndroid Debian on Android] (chroot) |
Revisió de 09:15, 25 gen 2022
Català - Castellano - English
Introduction: This is a guide to make work an Ubuntu GNU/Linux container inside an Android operating system session, and by this way have the desktop computer functionality without loosing performance. This is a very detailed guide, util for Debian and derivatives, and also useful to people who wants to create a wizard or improve the procedure.
Notes:
- At the moment of writing this guide (november 2011), Canonical still didn't have its announced solucion ready, but since 2014 they follow Cyanogenmod strategy and with more success. The best working version for the default desktop (Unity) is the 12.04 (Precise)
- The total downloads proposed can reach to 1GiB of data; if you do all from the device, take care of the data plan prices that applies the internet access provider.
- The possibility of using an LXC container has been explored to have a completely normal container, but didn't worked because of the use of bionic lic instead of GNU libc by Android.
Contingut
- 1 Superuser permissions (root)
- 2 Terminal access
- 3 Chech the available tools
- 4 Take note of the architecture
- 5 Prepare the space
- 6 Get an operating system base
- 7 Adjust the base
- 8 Mount Android resources
- 9 Enter to the new system and set the basic services
- 10 Open a normal user account
- 11 Enable graphical interface
- 12 Open Ubuntu desktop from Android
- 13 Exit
- 14 To repeat the experience
- 15 How to see the things bigger
- 16 Other sources
Superuser permissions (root)
It's a requirement to have "su" access to manage the operating system. You can see the guide Open permissions in Android
Terminal access
Local terminal
It's advisable always to have a Terminal application (that you can get freely with F-Droid) available to can do managements with mobility, but it's more comfortable to do the long and complex preparations from a desktop computer, controlling the device connected through USB.
Remote control
In the Ubuntu GNU/Linux distribution, since version 12.01 in the universal repository there is available the package android-tools-adb that allows the remote control to a device with Android in USB debug mode. There is also an independent repository that provides android-tools for previous versions.
To use the Android Debug Bridge (ADB) you must have the device working, plugged through USB, and with the mode "USB debug" enabled in the developer preferences of Android.
- ADB through USB
- To check the connectivity:
adb devices
(must show a "list" with a rare identifier that says it's a device)
- To open a terminal session in the device:
adb shell
- To start a superuser (root) session, and have Android administration permissions:
su
- To end as superuser and after also close the terminal session:
exit exit
- ADB through network
Many connections through USB aren't much stable (break often and you realize that are writing in your computer), and in these cases it's solved with net (Wifi). When this is done, it's important that the device hasn't direct internet connection (for example with the telephony provider) and it's working in a communication through the local Wifi.
- From Android, to see the enabled network devices (default... dev -->):
ip route list
- From Android, to see the IP address of a network device (for example wlan0):
ifconfig wlan0
- From the computer, to set the communication to be through network (for example to the IP 192.168.1.122):
adb connect 192.168.1.122
- To open a terminal session in the device:
adb shell
- To start a superuser (root) session, and have Android administration permissions:
su
- To end as superuser and after also close the terminal session:
exit exit
- Additional notes
- In this guide, where written commands are indicated, they are to be run in a local or remote terminal window.
- If you get messages as "Operation not permitted" , it's often because you didn't begin as superuser (su)
Chech the available tools
In a terminal check this command:
chroot
It can answer two things: the help presentatiom (with "usage: chroot...") or the error message "chroot: not found". In this last case (not found) you have an Android variant very clipped, and you need to replace it for another one more free such as CyanogenMod or Replicant. Other alternatives more technical are: Superimpose directories over Android or To format a memory card.
Take note of the architecture
The processor generation used by Android can be looked with one of the following commands:
uname -m cat /proc/cpuinfo
If the device's ARM processor supports floating-point (ARMv7 or superior, for example armv7l matches), then you can use "armhf" instead of "armel". This enhaces some processes speed.
Prepare the space
To allow working of the links and device accesses is needed that the new container resides in a properly partition for GNU/Linux, such as Ext3 or Ext4. With the mount command you can see the format of each volume, and with the following syntax it's seen very clear:
mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' '
And it can be filtered to see only what is interesting for us:
mount | cut -f 1-5 -d ' ' | sed -e 's/ on / /g' | sed -e 's/ type / /g' | cut -f 2-3 -d ' ' | sed -e '/ext.$/!d'
Once seen the compatible paths, you must value the free space available with this command:
df
If in the free space there isn't mention of the measurement unity (100K, 100M, 100G), this means that it's expressed in K (KiB). Care that the path /cache works as an "internal trash" and its content can be deleted automatically.
You need at least 100MiB for an elemental installation (only core), or near 250MiB for a debootstrap, but can be reached a use of 2 or 3GiB if you install all the big desktop applications of common use, and apart counting some working space. Also installations "for all the pockets" can be done.
For the rest of the guide we will suppose that you choosed the partition /data , and then you put the new operating system in /data/ubuntu . Then you must enable permissions for writing, executing, devices and superuser in the partition, and create the subdirectory:
mount -o remount,rw,dev,exec,suid,noatime /data RootPoint="/data/ubuntu" mkdir "$RootPoint" cd "$RootPoint"
Get an operating system base
This is the way to build from another computer (supposing the armhf architecture) in an Ext2/Ext3 partition:
sudo debootstrap --verbose --arch=armhf --foreign precise precise-armhf
- To trainsport the directory tree from a device to another, must be copied qith superuser permissions, to not loose the files and directories attributes. To open in this way a folder explorer with Ubuntu, you can execute (Alt+F2) "gksudo nautilus".
But here we also propose the way to do it completely from the Android device: downloading a prepared base (from official website) with only one of the following commands, depending on version and variant you need (more versions are published in cdimage.ubuntu.com):
wget http://cdimage.ubuntu.com/ubuntu-core/releases/precise/release/ubuntu-core-12.04.2-core-armhf.tar.gz wget http://cdimage.ubuntu.com/ubuntu-core/releases/oneiric/release/ubuntu-core-11.10-core-armel.tar.gz wget http://cdimage.ubuntu.com/ubuntu-core/releases/quantal/release/ubuntu-core-12.10-core-armhf.tar.gz wget http://cdimage.ubuntu.com/releases/precise/release/ubuntu-12.04-preinstalled-desktop-armhf+ac100.tar.gz wget http://cdimage.ubuntu.com/releases/oneiric/release/ubuntu-11.10-preinstalled-desktop-armel+ac100.tar.gz
Note: The "preinstalled" ones have all the software for a typical installation, but also elements that bust be cleaned to boot the container.
With the file downloaded, it's the turn of unpack it:
tar -xzf ubuntu-core-12.04.2-core-armhf.tar.gz rm ubuntu-core-12.04.2-core-armhf.tar.gz
Adjust the base
Correct come links in the base's directory, to adequate them to the situation:
chmod 755 "$RootPoint" if [ -d /acct ] ; then mkdir -p acct ; fi cd var if [ -L run ] ; then rm run ; ln -s ../run run ; fi if [ -L lock ] ; then rm lock ; ln -s ../run/lock lock ; fi cd "$RootPoint"
Clean directories that sometimes have content for a native installation:
if [ -d proc ] ; then rm -R proc/* ; fi if [ -d dev ] ; then rm -R dev/* ; fi if [ -d sys ] ; then rm -R sys/* ; fi if [ -d var/run/dbus ] ; then rm -R var/run/dbus/* ; fi
Mount Android resources
mount -o bind "/proc" "$RootPoint/proc" mount -o bind "/dev" "$RootPoint/dev" mount -o bind "/dev/pts" "$RootPoint/dev/pts" mount -o bind "/sys" "$RootPoint/sys" if [ -d /acct ] ; then mount -o bind "/acct" "$RootPoint/acct" ; fi if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$RootPoint/dev/cpuctl" ; fi
If you want to make Android's folders available, you must check which partitions are mounted. It can be done with a simple mount or with this command that simplifies information:
mount | sed -e '/ \/mnt\//!d' | sed -e '/^\//!d' | cut -f 2,3 -d ' ' | cut -f 2- -d '/' | cut -f 1 -d ' ' | sed -e 's/^/\//g'
If, for example, you want to mount /mnt/sdcard , do the following:
mkdir -p "$RootPoint/mnt/sdcard" mount -o bind "/mnt/sdcard" "$RootPoint/mnt/sdcard"
Enter to the new system and set the basic services
Since the implementation of the services starting system Upstart the Chroot containers don't start the services as a normal installation, and it must be done manually.
chroot "$RootPoint" /bin/su mount -a
Sure that appears something mounted, to don't fail some utilities:
if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi
Complete the debootstrap if it's the case, in the same architecture:
if [ -x /debootstrap/debootstrap ] ; then /debootstrap/debootstrap --second-stage ; fi
Patch to avoid Upstart services startup error:
dpkg-divert --local --rename --add /sbin/initctl ln -s /bin/true /sbin/initctl
Configure the network:
echo "nameserver 4.2.2.2" > /etc/resolv.conf echo "nameserver 8.8.8.8" >> /etc/resolv.conf echo "nameserver 8.8.4.4" >> /etc/resolv.conf echo "127.0.0.1 localhost" > /etc/hosts
Check if there are repositories set:
cat /etc/apt/sources.list
If there wasn't anything, or the "universe" are disabled with #, write them with the following commands (example for Ubuntu 12.04, called "precise"):
Version="precise" echo "deb http://ports.ubuntu.com/ ${Version} main universe" > /etc/apt/sources.list echo "# deb-src http://ports.ubuntu.com/ ${Version} main universe" >> /etc/apt/sources.list echo "" >> /etc/apt/sources.list echo "deb http://ports.ubuntu.com/ ${Version}-updates main universe" >> /etc/apt/sources.list echo "# deb-src http://ports.ubuntu.com/ ${Version}-updates main universe" >> /etc/apt/sources.list echo "" >> /etc/apt/sources.list echo "deb http://ports.ubuntu.com/ ${Version}-security main universe" >> /etc/apt/sources.list echo "# deb-src http://ports.ubuntu.com/ ${Version}-security main universe" >> /etc/apt/sources.list apt-get update
Install services and tools to avoid bad messages (the packages -es are for castillian language):
- Note: if appears some asking or message square, the option is changed with the TABulator key, and buttons are pressed with spacebar, thing to be easier if you are working with ADB from a computer.
apt-get install dbus dbus-x11 mkdir -p /var/run/dbus apt-get install language-pack-es update-locale DefaultLanguage="es_ES.UTF-8" export LANG="$DefaultLanguage" export LANGUAGE="$DefaultLanguage" echo "LANG=\"$DefaultLanguage\"" >> /etc/default/locale echo "LANGUAGE=\"$DefaultLanguage\"" >> /etc/default/locale
Start DBus service that has a lot of applications depending on (cannot benefit with Android's one):
DbusPid="$(dbus-daemon --system --print-pid --fork)"
Install the basic part of Ubuntu and apply updates. This process takes time:
apt-get install ubuntu-minimal ubuntu-standard apt-get upgrade
Install desktop and applications you are interested in. This process can take MUCH TIME:
apt-get install sudo ubuntu-desktop libreoffice libreoffice-l10n-es language-pack-gnome-es
(if appears some asking or message square, the option is changed with the TABulator key, and buttons are pressed with spacebar).
Open a normal user account
Using the desktop and applications as normal user (not root) improves the security and the admission by some elements that requires it.
cp -a /etc/adduser.conf /etc/adduser.conf.bak cat /etc/adduser.conf.bak | sed -e 's/^#EXTRA_GROUPS=/EXTRA_GROUPS=/g' > /etc/adduser.conf UserName=user adduser --add_extra_groups --gecos "" $UserName
Include the new account ($UserName) in the common user group and administration groups there is:
usermod --append --groups users $UserName usermod --append --groups sudo $UserName usermod --append --groups adm $UserName usermod --append --groups admin $UserName
Create an special group where to include the user, to be able to open input ports
addgroup --gid 3003 sockets usermod --append --groups sockets $UserName
Enable graphical interface
Although it appeared some X-Server tool to use applications directly in the screen without remote control, for the moment we expose the traditional method 2011-2012 (supposing in the example the device screen has a resolution of 1280x720):
apt-get install xvfb x11vnc xtightvncviewer if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1" echo "x11vnc $MoreOptions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh chmod a+rx /tmp/xvnc.sh su -l $NombreUsuaria -c /tmp/xvnc.sh
It will be waiting for connections (you will see PORT=5900). It's necessary to not close this terminal while you want to have Ubuntu available.
Open Ubuntu desktop from Android
Any remote control program for VNC can be used, that can be found easily with the F-Droid package manager.
Connect to the address localhost and with the normal port 5900. Without user (nickname) nor password. You have an enough secure access because it only will allow connections from the same device (-localhost).
Exit
If you want to use Android again it's enough with closing VNC, or simply minimize to do other things. If you shutdown the device with Android don't worry; it's as you also close the Ubuntu desktop as it was a computer.
If you want to stop the Ubuntu system without stopping nor restarting Android, you must exit from the session in the same Ubuntu desktop, same as you do it from a normal computer: with the graphical shutdown button, but with the user logout option. If you see a terminal window, also closing it the session is closed. With the following indications you will do a completely clean exit from the container.
Stopping services: In the Terminal window where you had the x11vnc waiting for connections, if it's still waiting, you can break it with {Control} + {C}. After this the rest:
kill $DbusPid rm -f /var/run/dbus/pid if [ "$(mount | grep -e "/selinux")" != "" ] ; then umount /selinux ; fi umount -a exit
If for example you mounted the Android folder /mnt/sdcard :
umount "$RootPoint/mnt/sdcard" if [ -d /dev/cpuctl ] ; then umount "$RootPoint/dev/cpuctl" ; fi if [ -d /acct ] ; then umount "$RootPoint/acct" ; fi umount "$RootPoint/sys" umount "$RootPoint/dev/pts" umount "$RootPoint/dev" umount "$RootPoint/proc" exit exit
To repeat the experience
- If you haven't ended the session from inside Ubuntu, you can simply connect again with the CNV client program.
- The best, of course, is to have direct icons in the Android desktop, both to mount the container and to connect to the desktop via VNC. This wiki will thank the contributions about this.
In other cases, such as you have stopped the device or stopped the Ubuntu container completely, write these instructions in a Terminal window (data from the same example in this page, which must be customized):
su mount -o remount,rw,dev,exec,suid,noatime /data RootPoint="/data/ubuntu" mount -o bind "/proc" "$RootPoint/proc" mount -o bind "/dev" "$RootPoint/dev" mount -o bind "/dev/pts" "$RootPoint/dev/pts" mount -o bind "/sys" "$RootPoint/sys" if [ -d /acct ] ; then mount -o bind "/acct" "$RootPoint/acct" ; fi if [ -d /dev/cpuctl ] ; then mount -o bind "/dev/cpuctl" "$RootPoint/dev/cpuctl" ; fi mount -o bind "/mnt/sdcard" "$RootPoint/mnt/sdcard" chroot "$RootPoint" /bin/su mount -a if [ "$(mount)" = "" ] ; then mount -o bind /selinux /selinux ; fi DbusPid="$(dbus-daemon --system --print-pid --fork)" UserName=usuari if [ "$Copyrect" = "" ] ; then CrOptions="-nowirecopyrect -noscrollcopyrect" ; else CrOptions="-ncache" ; fi MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 1/1" echo "x11vnc $MoreOptions -env FD_GEOM=${1:-1280x720x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh chmod a+rx /tmp/xvnc.sh su -l $UserName -c /tmp/xvnc.sh
Connect with the VNC client application to the address localhost and with the normal port 5900. Without user nor password.
Obviously the best is to have the commands in scripts (executable text files): from the first "mount" until the "chroot" in an Android script (for example /system/bin/m) and the rest in a script in UBuntu (for example /usr/local/bin/x). By this way, the only steps in a terminal could be:
su m x
And to do is in a single command, you can change the line chroot "$RootPoint" /bin/su by chroot "$RootPoint" /bin/su -c /usr/local/bin/x , and then also write a script in Android (/system/bin/u) that contents a single line with su -c m . With this, the service starts with a single command in the terminal:
u
(remember to give execution permission to the scripts, for example with: chmod 755 /system/bin/u )
Launchers in Android desktop
With SL4A you can prepare a Bash script (Shell script) that can also be run without showing the terminal window (in background). With this you can replace "u" that we have written as an example, creating a script called for example Ubuntu.sh and with content su -c m
To crate an icon on the desktop (Home) to launch Ubuntu in background, press the desktop background during some time until it opens an options menu, and select to create a customized link/launcher (Custom shortcut). Select the activity "Scripts" that has the shining-eyes icon (LS4A), select your program "Ubuntu.sh" and select that it starts in background (gear button). You can finish customizing a title as "Ubuntu 0" and press Ok.
You can use the same technique to create a launcher that connects directly through VNC: long-pressing on the desktop background, Customized launcher (Custom shortcut), select activity (Pick your activity), VNC connection, select the "localhost:5900", give it a title as "Ubuntu 1" and Ok.
With these 2 launchers, you already have Ubuntu in 2 taps: first to the SL4A icon that works in background, and after the VNC icon that connects. Don't launch again the SL4A icon if you aren't sure that it's stopped. You can connect and disconnect as many times as you want, while Ubuntu is launched in background with SL4A.
A known issue: If the menu opens but the option to create a launcher/link/shortcut doesn't appear in the desktop (it only offers to change background), you are probably using the "Trebuchet" desktop that lacks some feature. You can install the desktop manager AnDerWeb to fix it, but it doesn't maintain the previously set icons.
How to see the things bigger
There are pocket devices that have a high point density in a touchscreen, that is, much resolution in a so small screen. Taking all the resolution in these situations makes difficult to hit the desktop elements with a finger.
If in this guide example you want to see the things twice larger, change the resolution of 1280x720 by 640x360, and the scale of 1/1 by 2/1. This means to divide by 2 the resolution and increasing the small image to double to it fills the screen. The operation can be done in any proportion; here an example to do it at two thirds (that implies a 50% of growth):
MoreOptions="-create -localhost -xrandr $CrOptions -rfbport 5900 -nopw -forever -permitfiletransfer -nevershared -scale 3/2" echo "x11vnc $MoreOptions -env FD_GEOM=${1:-853x480x16} -afteraccept 'x-session-manager &' -logfile '.x11vnc.log'" > /tmp/xvnc.sh
1280/3x2 = 853 ; 720/3x2 = 480 ; escala 3/2
Other sources
- Liberate your device (Free Software Foundation)
- Instructions for flashing a phone or tablet device with Ubuntu
- Ubuntu porting guide (touch)
- Android devices with some Ubuntu use
- Debian on Android (chroot)