I have a rooted a GT-I9195 (SGS4-mini) done with CF-Auto-Root and the latest Busybox. I then decided to use the "Ssh server" from The Olive Tree, since it is simple, small, free, but unfortunately have ads. For on-device/local shell, I use the Android Terminal Emulator and everything works great, including su and shell environment.
However, I have a really strange bahaviour when connecting using ssh via WiFi, and trying to su.
First when connecting via ssh, I get the following message.
Code:
[SIZE=2]$ ssh -2 -4 -t [email protected] -p 50555
Authenticated with partial success.
[email protected]'s password:
/system/bin/sh: No controlling tty: open /dev/tty: No such device or address
/system/bin/sh: can't find tty fd
/system/bin/sh: warning: won't have full job control
[email protected]:/ $[/SIZE]
I have Googled this and there's little useful info. On one site they even say:
Code:
[SIZE=2]Getting a controlling tty
[B]How does one get a controlling terminal? [COLOR=Red]Nobody knows[/COLOR], this is a great mystery.[/B]
The System V approach is that the first tty opened by the process
becomes its controlling tty. The BSD approach is that one has to
explicitly call
ioctl(fd, TIOCSCTTY, ...);
to get a controlling tty.
Linux tries to be compatible with both, as always, and this results in
a very obscure complex of conditions. Roughly:
The [B]TIOCSCTTY [/B]ioctl will give us a controlling tty, provided that (i)
the current process is a session leader, and (ii) it does not yet have
a controlling tty, and (iii) maybe the tty should not already control
some other session; if it does it is an error if we aren't root, or we
steal the tty if we are all-powerful.
Opening some terminal will give us a controlling tty, provided that
(i) the current process is a session leader, and (ii) it does not yet
have a controlling tty, and (iii) the tty does not already control
some other session, and (iv) the open did not have the [B]O_NOCTTY[/B] flag,
and (v) the tty is not the foreground VT, and (vi) the tty is not the
console, and (vii) maybe the tty should not be master or slave pty.
[/SIZE]
Now this is not the end of the world, if it was not that it doesn't understand normal terminal control characters and in addition, when I do su, I loose the command prompt. However, using the "-i" (interactive) switch gets me the "#" prompt, but environment is still completely messed up:
Code:
[SIZE=2][email protected]:/ $ [B]su -c /system/bin/sh -i[/B]
/system/bin/sh: No controlling tty: open /dev/tty: No such device or address
/system/bin/sh: can't find tty fd
/system/bin/sh: warning: won't have full job control
[email protected]:/ #[/SIZE]
I've never had or seen this issue before. Any ideas?
(Also, where would I put a source to my .bashrc and make sure it runs when su'ing or ssh?)
PS. The phone is using a stock 4.2.2 SELinux kernel.
Code:
[SIZE=2]Device: Samsung Galaxy S4 Mini LTE (GT-I9195)
Board/Platform: MSM8930AB (Snapdragon 400)
Baseband: I9195XXUBML4
Kernel: 3.4.0-2340422
[email protected] #1
Build: JDQ39.I9195XXUBML4
SE: SEPF_GT-I9195_4.2.2_0022
ro.build.date: Sat Dec 21 01:46:00 KST 2013
ro.build.description: serranoltexx-user 4.2.2 JDQ39 I9195XXUBML4
[/SIZE]
I still have no idea of what's causing those error messages above, also because logcat is not telling us anything interesting either. Only as Warning from "System.err", but without any useful information. However, I have got some improvement in the terminal behavior when doing the initial ssh connection.
One problem seem to be that the TERM environment variable was copied from local machine (PC side) to remote server (Android phone), thus giving TERM=cygwin to the Android shell. This can be disabled or changed as follows.
Some relevant SSH options:
Code:
[SIZE=2]
-e escape_char
Sets the escape character for sessions with a pty (default: `~'). The escape
character is only recognized at the beginning of a line. The escape charac-
ter followed by a dot (`.') closes the connection; followed by control-Z sus-
pends the connection; and followed by itself sends the escape character once.
Setting the character to "none" disables any escapes and makes the session
fully transparent.
-T Disable pseudo-tty allocation.
-t Force pseudo-tty allocation. This can be used to execute arbitrary screen-
based programs on a remote machine, which can be very useful, e.g. when
implementing menu services. Multiple -t options force tty allocation, even
if ssh has no local tty.
[/SIZE]
Some relevant SSH -o options:
Code:
[SIZE=2][B]RequestTTY[/B]
Specifies whether to request a pseudo-tty for the session. The argument may
be one of: "no" (never request a TTY), "yes" (always request a TTY when stan-
dard input is a TTY), "force" (always request a TTY) or "auto" (request a TTY
when opening a login session). This option mirrors the -t and -T flags for
ssh(1).
[B]
SendEnv[/B]
Specifies what variables from the local environ(7) should be sent to the
server. Note that environment passing is only supported for protocol 2. The
server must also support it, and the server must be configured to accept
these environment variables. Refer to AcceptEnv in sshd_config(5) for how to
configure the server. Variables are specified by name, which may contain
wildcard characters. Multiple environment variables may be separated by
whitespace or spread across multiple SendEnv directives. The default is not
to send any environment variables.
[/SIZE]
So by using the ssh -T option (which is equivalent to using '-o RequestTTY="no"'), we are disabling "pseudo-tty allocation" which doesn't work anyway, but with the effect of not forwarding local TERM to server, and thus setting it to default "vt100" which accepts backspace (but not insert). But a better way is to actually set the TERM variable on our own. This is done by simply adding it as a prefix to the ssh command like this:
Code:
[SIZE=2]TERM=[B]vt220[/B] ssh -t [email protected] -p 50555[/SIZE]
(This effectively, but temporarily overrides the local TERM value and forwards it to remote server shell.)
RanTime!
Since Google intruduced the SELinux/SEAndroid features, they have essentially fukced up the entire AOS ecosystem as based on good-old normal Linux environments and all the years of standards therein. Basically nothing works as before and as logically intended or preferred and I bet from now on, developers will have to spend a significant and expensive time, on just trying to setup their various developer environments and jump through the hoops of dikchead Google engineers, rather than on actual developing. A very sad story all thanks to the populist "security" eye-candy marketing.
The SU time!
Apparently after having read about the various quirks and issues in using an SELinux Enforced based AOS {4}, it seem that the issue from OP is probably due to one of 3 things or a combination thereof.
My su binary (SuperSU 1.94) is not yet handling SElinux properly
The SSHd server is not handling SELinux properly
Lack of properly set SSH and SHELL environment files on the server side
As for (1) I just have to wait and see. For (2) we can only test with other SSHd servers/solutions which I don't know what to use. (They're all, either not free or full of ads. WTF!) And finally, for (3) we can only test, since I don't have the source code...
Unfortunately listing the SuperSU (1.94) command line options is not very helpful, since they're rather poorly explained. While some of the option themselves just doesn't work (for me). It would have been great if @Chainfire could write a more detailed how-to {2} for all these options, but then again we should be extremely grateful he's written anything at all.
Code:
[SIZE=2]Usage: su [options] [--] [-] [LOGIN] [--] [args...]
------------------------------------------------------------------------------------
Options:
-c, --command COMMAND pass COMMAND to the invoked shell
-cn, --context CONTEXT switch to SELinux CONTEXT before invoking
-h, --help display this help message and exit
-, -l, --login pretend the shell to be a login shell
-m, -p,
-mm, --mount-master connect to a shell that can manipulate the
master mount namespace - requires su to be
running as daemon, must be first parameter
--preserve-environment do not change environment variables
-s, --shell SHELL use SHELL instead of the default detected shell
-v, --version display public version and exit
-V display internal version and exit
Usage#2: su LOGIN COMMAND...
Usage#3: su {-d|--daemon|-ad|--auto-daemon|-r|--reload}
auto version starts daemon only on SDK >= 18 or
if SELinux is set to enforcing
Usage#4: su {-i|--install|-u|--uninstall}
perform post-install / pre-uninstall maintenance
[/SIZE]
References:
[1] [Chainfire G+] Next Android version: even more breakage
[2] [Chainfire] How-To SU (Guidelines for problem-free su usage)
[3] SuperSU Download
[4] [Google] Validating Security-Enhanced Linux in Android
From THIS very old post by @mirabilos , it is possible that command-line TAB-completion and up-arrow is not working on all mksh binaries. So perhaps we just need a new static mksh binary installed?
Tab expansion is pretty broken on BSD with xterm and GNU screen, but the same seems to work better on ssh’ing out to Linux, I wonder why, since all software involved is the same… except tput though. But it works like that and is usable. With post-R40 mksh, you can get about with even less hacks (more similarity to AT&T ksh).
Click to expand...
Click to collapse
However, this still doesn't explain why I have no controlling tty for ssh sessions.
Also I tested a new and different SSH server called SSHelper, which has more features and is better maintained, without ads, but is also 6 times larger at ~ 6MB, because of included OpenSSH, FTP and webserver log functionality. When logging in via ssh I get:
Code:
...
Server refused to allocate pty
Followed by an empty non-responsive connection.
Is this the same as […]this problem elsewhere? Man, I'm searching for ideas and keep coming back to your questions all over the 'net
To clarify, I talked to someone at Google; they renamed mksh into just sh lately, but this should have no adverse effect. They currently ship R48 and “would have updated it if I knew there was a new version”. That being said, the code of the shell itself is not at fault here.
The “no controlling tty” message here is a red herring: you do not have access to a tty at all, let alone a ctty
As I said elsewhere, use “ssh -t” and either change the SELinux policies to allow pty/tty pair allocation, or disable it (possibly set it into permissive mode).
@mirabilos: Yes, thanks for that info. I haven't updated this thread since I started it, in anticipation of a writeup about SELinux. However, that proves to be a little over my head, so it will take some time. What is clear though, is that the above problem is connected with the SEAndroid protection mechanisms, which in turn have been mangled and incorporated into Samsungs KNOX.
Also I have been busy making the SSHelper support thread:
[APP][INFO|SUPPORT] SSHelper (The free Android SSH Server Application)
There I have also added a small section about mksh.
@ E:V:A - I recently put together a little package containing all necessary bins/scripts to create a SSH server (via dropbear and dropbearkey) (properly secured, not public) and connect with a SSH client (ssh). The package also contains bins/scripts to create a Telnet server (via utelnetd) and connect with Telnet client (via "static busybox" telnet). Everything works with superuser that I've tested. Linked in my signature and attached to post as well.
Instructions (for anyone who sees this and would like a guide)::
Basically just extract it anywhere with:
Code:
tar -xf easy.ssh.and.telnetz.clients+servers.tar.gz
(if it's in /sdcard/Download which is probable, do "cd /sdcard/Download" then run the above)
Change directory inside the folder:
Code:
cd ./ssh.telnetz
There are 6 scripts: ssh.start(connect to ssh server via ssh), sshd.start(create ssh server), ssh.kill(kill ssh processes and remove ssh server keys), and... 3x telnet scripts for the telnet equivalents.
Running scripts and optional parameters:
Code:
./telnetd.start [ shell ]
e.g. TELNET_PORT=8080 ./telnetd.start /system/bin/mksh
./telnet.start [ ip port ]
e.g. ./telnet.start 192.168.0.3 8080
./sshd.start [ <dropbear_flags_and_options ]
e.g. ./sshd.start (default port is 8090)
./ssh.start [ ip port shell ]
e.g. ./ssh.start 192.168.0.3 8090 /system/bin/mksh
Default ip is the loopback 127.0.0.1 so you can test running a server and connecting to it on your phone at the same time. Just change params as described above to connect from/to your phone (phone is client/server).
***As far as I have tested on Android 4.4.4, this works perfectly as root or restricted user. You can get a su'd ssh shell by starting the sshd.start with /system/xbin/su or just entering su after you've connected as a restricted user.***
I've finally found a work-around for the crippled /dev/pts job-control and su combination. There are two small problems that combines to this issue.
1. The SELinux policy is screwed up by Samsung. And others?
2. The /dev/pts is mounted wrong by default.
The work-around:
Make sure you're device is already in Enforcing mode, so that you get the proper su prompt (#).
1. Open terminal session 1.
Code:
[SIZE=2]
## On Terminal 1
ssh -2 [email protected] -p 2222
$ su -c /system/bin/sh -i
# su 0 setenforce 0
# umount /dev/pts
# su -cn u:r:init:s0 -c "busybox mount -t devpts -o rw,seclabel,relatime,mode=620,gid=5 devpts /dev/pts"[/SIZE]
2. Now go to Terminal 2 and login:
Code:
[SIZE=2]## On terminal 2
ssh -2 [email protected] -p 2222
$
[/SIZE]
(You now have job-control but no su possibility.)
3. Now go back to Terminal 1 and enable Enforcing mode:
Code:
[SIZE=2]## On Terminal 1
# su 0 setenforce 1
[/SIZE]
4. Now go back to Terminal 2 and escalate to su:
Code:
[SIZE=2]## On terminal 2
$ su -c /system/bin/sh -i
# [/SIZE]
Unfortunately if you exit the su (#) shell, you'll have to repeat steps 2-4 of the procedure.
Related
Booting Debian with X11 on the Google NexusOne
This howto can also be found on my blog.
http://www.irregular-expression.com/?p=30
Screenshots here
http://picasaweb.google.com/JairunCaloth/Debian?feat=directlink
This is a method to boot into Debian via fastboot on the nexus one from
your SD-card. This is NOT a chroot Debian image, it is honest to goodness
Debian running directly on the hardware. This is completely non destructive to
the android OS. Connectivity to the device can be provided by adbd, ssh, or
serial console. Wifi works perfectly. I have not tested bluetooth. Touchscreen
works, but needs tweaking. X11 works in framebuffer using the Debian
testing branch (squeeze). In order to get a full fledged X driver with
3D acceleration we'll need the driver from
https://www.codeaurora.org/index.php?xwinp which I haven't been able to get
to build. This doesn't mean it's broken. It just means I suck
at cross compiling .
Todo:
-Tweak settings to make X more usable.
-Find out how to use the soft keys.
-Get the CodeAurora MSM/QSD X driver working.
-Find decent method to input text.
-Test bluetooth
-Look into using the GSM radio.
-Audio
-Figure out how to configure adbd.
-Get someone who knows C and wants to hack on the recovery image to enable booting debian from there.
This how-to pulls heavily from the debian-arm install guide.
http://www.debian.org/releases/stable/arm/index.html.en
Requirements:
adb (android-sdk)
fastboot
chroot (on your phone)
sdcard with room for Debian - 2gigs seems to be sufficient for Debian + xfce.
I Had about a gig leftover. For this guide, I'm starting fresh with a 4GB sdcard
that I'm devoting completely to Debian. According to the Debian install guide,
you need at least 32MB of memory and 500MB of hard disk space. The guide
recommends at least 5GB of storage for a comfortable install. But since I'm
using the lighter XFCE4 desktop I haven't had any space issues.
http://www.debian.org/releases/stable/arm/ch03s04.html.en
1. Re size the SD card
(don't forget to backup your data before you go messing with partition tables!!)
(optional) Instead of using a partition on your main SD card, you could
simply use another sdcard and dedicate the entire thing to Debian.
Note: android didn't like me very much when I did this. I put in a
tiny (30MB) vfat partition right at the beginning of the blank sdcard
I mounted the sdcard on my Ubuntu system and used gparted to break
off 2 gigs to use for Debian. Make sure you keep the normal android
sdcard partition as the first partition otherwise android
will not be able to find it.
If you're using apps to SD or anything else like that. Debian should
probably have the last partition. I'm not 100% sure on this since I
don't use my sdcard for anything else.
2. Format the new partition.
ext2 is probably best. (least abusive on the sdcard. ext3 & 4 have
journaling which may be bad for the life of your sdcard)
I used Gparted for this part as well.
3. If you are installing from an Ubuntu or Debian desktop, install debootstrap
Code:
$ sudo apt-get install debootstrap
Users of other distros may be able to get debootstrap but I'm not sure.
4. Mount the sdcard on your desktop.
anywhere will do just remember where you put it
ex.
Code:
$ mount /dev/sde2 /mnt/android
5. debootstrap
run debootstrap
you can change to a mirror closer to you if you don't want to use the
US mirror - http://www.debian.org/misc/README.mirrors
I'm using the Debian testing release (squeeze). I had issues getting
X11 running in lenny, and have not tested sid.
(lenny is stable, squeeze is testing, and sid is unstable)
http://www.debian.org/releases/
debootstrap --arch armel --foreign <release> </path/to/debian> <mirror>
ex:
Code:
# debootstrap --arch armel --foreign squeeze /mnt/android http://ftp.us.debian.org/debian
6. debootstrap(part2)
Unmount the sdcard from your desktop.
Reboot the phone here since you've been mucking with the sdcard
file system. Android didn't like my sdcard until I did.
Code:
$ adb shell
mount the sdcard somewhere on the android file system.
look in /dev/block for the sdcard.
Typically mmcblk0p# where # is the partition number.
*note* the directory I use to mount mine does not exist under normal android.
If this is your first time you will need to create the directory.
Code:
mkdir -p /data/local/mnt
ex.
Code:
# mount -t ext2 /dev/block/mmcblk0p2 /data/local/mnt
chroot/debootstrap
Code:
# export PATH=/usr/bin:/usr/sbin:/bin:$PATH
# chroot /data/local/mnt/ /debootstrap/debootstrap --second-stage
this will take a while especially if you have a slower sdcard.
6. While that's working, now is a good time to get to work on your kernel
I used the open source android kernel 2.6.29
http://android.git.kernel.org/
Started with mahimahi_defconfig and starting customizing from there.
Things to note.
- file systems - don't forget to add support for whatever file systems
you need. Your root file system support cannot be built as a module.
- wireless driver config - You may want to change the location the
kernel looks for your wifi firmware (this is different from the
kernel module).
I stuck mine in /etc/firmware, default is /system/etc/firmware.
If you don't change this, you will have to put the firmware
in /system/etc/firmware
- wireless - Add in support for standard wifi extensions.
- networking - standard tcp/ip stuff... iptables if you want ect...
- I wasn't able to get the kernel to boot into Debian until I turned
off initramfs support.
(note. this was before I discovered the 'noinitrd' kernel
kernel cmdline option. So disabling initrd may not be required)
- If for some reason you are using ext4, it will fail to mount unless
you add in large devices and files support
- Default kernel command string - has no effect.
This gets overwritten when you boot with fastboot or make a boot.img
- Drivers - I left all the normal android drivers in.
-Changed the firmware path for wifi.
-Added in support for virtual terminal under character devices
-Enabled MSM serial support (if you don't have a serial cable
this is useless to you)
-You can build the wifi driver into the kernel if you want.
Link to the kernel config I used. Use at your own risk.
It works for me but I can't promise it's perfect or even good.
http://irregular-expression.com/tmp/config
I would love input on building a better kernel config.
If you don't want to build your own kernel, feel free to use mine http://irregular-expression.com/tmp/zImage
7. Chroot and configure Debian.
There are still some things that need configuring before we reboot into
Debian. Since fbconsole does not appear to be working, if you don't
have a serial cable you will be flying blind until Debian is fully
booted and you can connect with ssh. Since there are still things to do
before we reboot, we're going to chroot into Debian just like if we are
using a Debian chroot image.
For more information and examples of config files.
http://www.debian.org/releases/stable/arm/apds03.html.en
It's probably best to use wifi for your data on the phone for this.
If you're on Linux and connected to the same router as the phone, copy
over your resolv.conf
Code:
$ adb push /etc/resolv.conf /data/local/mnt/etc/resolv.conf
If you are not in Linux or are not connected to wifi you will need to
set up resolv.conf with something sane.
ex. from jay freeman's original Debian chroot.
Code:
$ echo 'nameserver 4.2.2.2' > /data/local/mnt/etc/resolv.conf
push wifi driver to the device
First we need to create a couple directories. Log into the phone with adb shell
Code:
$ adb shell
# mkdir -p /data/local/mnt/etc/firmware
# mkdir -p /data/local/mnt/lib/modules/2.6.29-droid-debian/kernel/drivers/bcm4329
# exit
Upload wifi kernel module and firmware. If you're using my prebuilt kernel, grab this one. http://irregular-expression.com/tmp/bcm4329.ko
Code:
$ adb push <kernelroot>/drivers/net/wireless/bcm4329/bcm4329.ko /data/local/mnt/lib/modules/2.6.29-droid-debian/kernel/drivers/bcm4329/
copy /system/etc/firmware/fw_bcm4329.bin to wherever you
specified in the kernel config.
Code:
# cp /system/etc/firmware/fw_bcm4329.bin /data/local/mnt/etc/firmware/
Setup environment variables, copy over adbd, and other stuff needed to
make things work. This should all be run from within an adb shell
Code:
# cp /sbin/adbd /data/local/mnt/sbin/adbd
# sysctl -w net.ipv4.ip_forward=1
# export PATH=/usr/bin:/usr/sbin:/bin:$PATH
# export TERM=linux
# export HOME=/root
Next chroot and setup mount points
Code:
# chroot /data/local/mnt /bin/bash
# mount -t devpts devpts /dev/pts
# mount -t proc proc /proc
# mount -t sysfs sysfs /sys
Welcome to Debian chroot that we all know and love.
Lets finish configuring this thing.
Configure adbd to run on boot and create a symlink so adbd can find bash.
Edit /etc/rc.local. Add adbd before exit 0
#add this to /etc/rc.local
Code:
/sbin/adbd &
Code:
# mkdir -p /system/bin/
# ln -s /bin/bash /system/bin/sh
Now we need to be able to install packages
don't forget if you are not using squeeze to change it here
Code:
# echo 'deb [url]http://ftp.us.debian.org/debian[/url] squeeze main' >> /etc/apt/sources.list
# apt-get update
You should see aptitude updating it's package list.
Install some needed packages
Code:
# apt-get install wpasupplicant wireless-tools udev ssh
Other packages
All up to your choice. Things like text editors, X, ect...
some suggested packages
Code:
# apt-get install locales vi
Wifi driver
When you try to load the wifi module, Linux will complain about not
being able to parse modprobe.d. To fix this run depmod. If it complains
a directory doesn't exist then create it.
Code:
# depmod -a
Edit /etc/modules and add the bcm4329 module
Code:
# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
# Parameters can be specified after the module name.
bcm4329
Setup fstab - critical: don't forget to configure the root file system
or your system won't boot. If you like, mount your vfat sdcard partition
here too. Don't forget to mkdir for the mount point.
*note* after boot the memory card is located at /dev/mmcblk0p#.
Here is my /etc/fstab
Code:
# /etc/fstab: static file system information.
#
# file system mount point type options dump pass
/dev/mmcblk0p2 / ext2 defaults 1 1
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /media/sdcard vfat defaults 0 0
configure network
These two files will be tuned to what you need.
Here are a couple examples.
/etc/network/interfaces
Code:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
wpa-driver wext
wpa-conf /etc/wpa_supplicant.conf
/etc/wpa_supplicant.conf
Code:
ctrl_interface=/var/run/wpa_supplicant
network={
ssid="myOpenNetwork"
scan_ssid=1
key_mgmt=NONE
}
network={
ssid="MyHomeNetwork"
scan_ssid=1
key_mgmt=WPA-PSK
psk="MyWifiPassword"
}
network={
ssid="MyFriendsWifi"
scan_ssid=1
key_mgmt=WPA-PSK
psk="MyFriendsWifiPassword"
}
SSH
If you want ssh to start on boot run this command.
*note* You will probably want to set a static IP address if you plan on accessing debian through ssh.
Code:
# update-rc.d ssh defaults
inittab
no need for getty so comment it out in /etc/inittab
if you have a serial cable, configure it here. something like this.
Code:
T0:23:respawn:/sbin/getty -L ttyMSM0 115200 linux
hostname
configure your system's hostname - you can set this to whatever you like
Code:
# echo DebianHostName > /etc/hostname
Set root password
Code:
# passwd
# useradd -m -G audio,dialout,floppy,video,staff username
Add user account
Code:
# useradd -m -G audio,dialout,floppy,video,staff yourusername -s /bin/bash
# passwd yourusername
8. Almost there!
Double check your configs and have your kernel handy.
The next step is to boot into Debian.
9. Boot Debian
put the device into fastboot mode
Code:
$ adb reboot bootloader
the '-c' flag specifies arguments to pass to the kernel for boot.
This is probably the bare minimum.
Format is "fastboot -c 'kernelcmdline' boot zImage"
Code:
$ fastboot -c 'root=/dev/mmcblk0p2 rw rootfs=ext2 init=/sbin/init rootwait noinitrd' boot zImage
Wait just a few minutes. DHCP is probably the longest part of this.
10. Connect via ADB.
If everything went well you should be able to log into the
phone via adb. adb push and pull work as well.
Code:
$ adb shell
11. Install X11
For a basic X11 install. This is probably not what you want.
Code:
# apt-get install xserver-xorg
You can install whatever window manager/desktop environment you like,
I used XFCE. Most window managers likely depend on xserver-xorg so it
will get pulled in when you install.
Code:
# apt-get install xfce4
After I installed xfce4 I was able to get X on the main display by
simply running startxfce4
Code:
# startxfce4
By default Debian is configured to only allow root to startx.
If you want to be able to run X as a user edit /etc/X11/Xwrapper.config
*note* even with this I haven't been able to run X as a normal user.
Only root.
Change
Code:
allowed_users=console
to
Code:
allowed_users=anybody
Currently touchscreen is a little weird. It feels almost like using a
laptop touchpad. The mouse moves much faster then your finger and tapping for
click isn't enabled by default but two finger tap will right click. You can
also move the mouse with the trackball. Clicking the trackball registers a
click. But you have to wiggle the trackball just a tiny bit after you click to
make it register. I am going to work on tweaking the fdi policy files to
make things a little more usable.
Text entry is a bit of a pain point currently. There are several on screen
keyboards out there. One interesting one I found is called cellwriter.
The touchscreen will need to be tweaked before it will work well with
onscreen keyboards.
For other ideas on window managers and other software check out this link
http://wiki.openmoko.org/wiki/Debian
@jairuncaloth
I was just reading about how you got debian + x11 working on your nexus. I think thats awsome how you got a fully oprerational linux OS on your phone. I just had a few questions on how everything worked.
You were saying it doesn't mess with the default android OS, is there like a duel boot option to chose what OS i want to boot into. I was reading on how you have to start an ssh session to get into debian, and was just currious on some more info. I would be intrested in trying this out some time after i did a little more reading to get a better understanding of how everything was working.
If this wasn't working out after i installed, is it a pain to remove.
Thanks,
Justin
Nice post, appreciate the thoroughness.
I'm going to pour through this when I get some free time. Whenever that is
Thanks!
~enom~
jjkwasnik said:
@jairuncaloth
I was just reading about how you got debian + x11 working on your nexus. I think thats awsome how you got a fully oprerational linux OS on your phone. I just had a few questions on how everything worked.
You were saying it doesn't mess with the default android OS, is there like a duel boot option to chose what OS i want to boot into. I was reading on how you have to start an ssh session to get into debian, and was just currious on some more info. I would be intrested in trying this out some time after i did a little more reading to get a better understanding of how everything was working.
If this wasn't working out after i installed, is it a pain to remove.
Thanks,
Justin
Click to expand...
Click to collapse
Hey Justin. The reason it doesn't mess with the default android OS is when you boot, you're booting with a kernel image living on your desktop/laptop's hard disk. fastboot allows you to boot images without acctually flashing them to your phone. Debian lives on the SDcard so no flashing required.
You can also use adb to connect to debian now. It's as simple as copying over the binary from android.
Removing is as simple as rebooting. When you reboot it will be like debian was never there.
enomther said:
Nice post, appreciate the thoroughness.
I'm going to pour through this when I get some free time. Whenever that is
Thanks!
~enom~
Click to expand...
Click to collapse
I would love to hear ideas for improvements you may have
This is still pretty raw.
now my question is can those devs good with the linux kernel use this to hack into the android OS and unlock the security on the device without bricking the phone?
-Charlie
@jairuncaloth
I understand what you mean, i have used fast boot a few times. I know how to use it, just haven't used it a lot. So with using fast boot, once Debian is booted can you disconnect the usb cable. Is the kernel copied in RAM, or does it still need to talk to the kernel that resides on the PC?
I like where you are going with this, i am experienced with Linux. Not super advanced, but i know more then i think i do sometimes. I would like to try this out sometime to, but i'm very busy with work and the little free time i have gets spent before i know it. So knowing a little about it before i get my feet wet, always helps.
Thanks!!
Great news guys! Glad to see progress is being made. Can't wait to see where this goes from here!
Cheers
this is so cool, i was trying to get the chroot version to run on my nexus one the other day like i had it on my g1 but it was giving me trouble so i gave up. if proper support for the radio and the touchscreen/keyboard is created this would truly be monumental.
kudos for you man awesome job!
jjkwasnik said:
@jairuncaloth
I understand what you mean, i have used fast boot a few times. I know how to use it, just haven't used it a lot. So with using fast boot, once Debian is booted can you disconnect the usb cable. Is the kernel copied in RAM, or does it still need to talk to the kernel that resides on the PC?
I like where you are going with this, i am experienced with Linux. Not super advanced, but i know more then i think i do sometimes. I would like to try this out sometime to, but i'm very busy with work and the little free time i have gets spent before i know it. So knowing a little about it before i get my feet wet, always helps.
Thanks!!
Click to expand...
Click to collapse
Should look something like this after you run the fastboot boot command
creating boot image...
creating boot image - 2240512 bytes
downloading 'boot.img'... OKAY
booting... OKAY
At this point it's safe to pull the usb cable. If you are using adb to connect, you'll still want it though
I got the code aurora X driver to build last night. I ended up building it in debian on the phone. I couldn't get it to build against AOSP kernel headers, but it does build with the code aurora kernel headers. X won't start when you tell it to use the driver. I suspect this is because I built the driver against a different kernel then the one the system is booting on. I have not been able to get the code aurora kernel to boot yet, but I'm working on it to see if X will start with this driver and the CA kernel.
Also, I've uploaded the kernel I've been using to my blog. In case someone wants to play with this, but doesn't want to build a kernel.
http://irregular-expression.com/tmp/zImage
Can anyone post any vids for this?
Would love to have a look at this and then maybe i'll have a try at it afterwards
No videos yet.. I've got some snapshots of X running though.
http://picasaweb.google.com/JairunCaloth/Debian?feat=directlink
jairuncaloth said:
No videos yet.. I've got some snapshots of X running though.
http://picasaweb.google.com/JairunCaloth/Debian?feat=directlink
Click to expand...
Click to collapse
Thank you for the pictures, it really feels good to see this kind of progress being made. I can not wait to try this out!
looks interesting, but scary to a new guy like me..im sure i will try it though..continue the work on streamlining the process !
so how is this running? by that i mean is everything running smooth/snappy?
looks good by the way, i may try this out
JHaste said:
so how is this running? by that i mean is everything running smooth/snappy?
looks good by the way, i may try this out
Click to expand...
Click to collapse
It's fast enough for you old man!
Really though, it runs pretty smoothly. Once we work out the kinks it could even be pretty nice.
One thing you could do, if you don't mind nuking the recovery partition, is flash your debian boot image to recovery -- then you can reboot into debian with "reboot recovery" from an android root shell, or by entering the bootloader and selecting recovery.
it will be great if it is more simple.
@jairuncaloth
I love the pics man!!!
I just came up with another question with running Debian, is there any software to still make phone calls through your cell provider? Or do you just have to reboot back into android?
I've been tinkering with dnsmasq and ad blocking (using the terminal to input commands). It works so far, except breaks the words-with-friends app.
I was thinking that it would be easier to maintain than a HOSTS file (cause you can block subdomains), and that it would be quicker (less resources than the linear lookup of a giant hosts file). I could be completely wrong, but let me know what you think.
To get it running, I do this, more or less:
su
mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/adblock.conf /system/etc/adblock.conf
dnsmasq -C /system/etc/adblock.conf
Then cycle the airplane mode, that sometimes gets it working. If not:
getprop
setprop net.dns1 127.0.0.1
Sometimes it doesn't stick. I had some questions for people that know more than I do:
1. Is it possible to get a pixelserv script running? One of my goals is to block words with friends ads, without breaking words with friends, and I think that might do the trick. (http://proxytunnel.sourceforge.net/pixelserv.php)
2. Would this affect the use of dnsmasq elsewhere, like tethering? Can two dnsmasq instances run at the same time in that case, or would this one have to be ended?
3. Is this a worthwhile endeavor?
PS: The script uses OpenDNS for actual DNS requests. Also, 50-60 ad servers are blocked, they're routed to 0.0.0.0 for speed (as they immediately return invalid, rather than trying to connect), if we were to use the pixelserv in the future, they'd have to go back to 127.0.0.1 for that to work.
PPS: Pixelserv is a perl script, I guess wouldn't run natively, but these may be worth looking at: http://code.google.com/p/android-scripting/ , http://code.google.com/p/perldroid/
Thanks for looking! If this is in the wrong area, please move it.
Another thought, could iptables be used instead? I'm not very familiar with linux
Rooted PDAs only! Shell required!
Before doing the following steps, verify that you don't have an "/etc/resolv.conf"! I reckon none of the stock ROMs have one, but this tweak doesn't work with such a file in place.
Code:
ls -l /etc/resolv.conf || echo "ok"
If this prints some file details and you can use eg. "ping -c 3 www.google.com", you don't have the problem in the first place.
If it says "no such file..." and "ok", go ahead.
Make a file named "/mnt/sdcard/resolv.conf" containing, for example:
Code:
nameserver 8.8.8.8
nameserver 8.8.4.4
These are the IP numbers of the Google public DNS resolvers, BTW, but you can use any others.
Code:
mount -o remount,rw /system &&
ln -s /mnt/sdcard/resolv.conf /etc/
mount -o remount,ro /system
The problem: busybox and other C-programs use a library component called the "stub-resolver" to make IP-adresses from hostnames. This isn't capable of resolving by itself, so it parses "/etc/resolv.conf". The "nameserver" lines in there tell it where to send the UDP packets with questions like "what's the IP of Gmail.com?".
Java programs do this differently: they use "getprop" for the IPs of the nameservers, and vendor customized "dhcpcd" scripts populate the needed properties.
C-programs need the etc/resolv.conf for proper operation.
Q: what does this do for me?
A: first, it'll make symbolic hostnames work for C-programs like "wget", "ping", "nslookup" etc. As added benefit, you can see the names requested by Android programs if you give the IPs of some DNS-resolver you might have in a home LAN. Look at its logs!
Q: what are these '&&' combinations for?
A: well, we don't get to see them often, not even in developer scripts, but they are very useful! They logically "AND" commands. If the command or program before an '&&' fails, none of the following ones will get executed. So if the first "mount" doesn't work (a typo or whatever), the symbolic link by the "ln -s ..." won't be attempted at all, meaning less errors. POSIX requires compliant shells to do this type of short-circuit evaluation, so we can rely on it.
Q: why use a symlink ("ln -s ...") instead of a file?
A: This way you can change nameservers without remounting /system, in fact, you don't even need to be root for this. Change /sdcard/resolv.conf and you're set.
Q: which nameservers should I use?
A: with a patch to "/system/etc/dhcpcd/dhcpcd-hooks/20-dns.conf" it's possible to use the ones from your ISP provided DHCP lease. I thought a onetime manual configuration would do for the moment. You could search the web for the OpenDNS resolvers as an alternative, or use your providers resolvers (eg. from the APN config).
Although I already had resolv.conf added, your explanation for why it is needed was very informative!!! Thanks.
ino-xda said:
Make a file named "/mnt/sdcard/resolv.conf" containing, for example: ...
Click to expand...
Click to collapse
Q: will this work in etc/init.d/ scripts?
A: that depends on when they run. The symbolic link points to a file on the sdcard, thus it will work no sooner than the sdcard has been mounted, but before scanning for media files, icons etc. has finished. Once the device is fully up and running, it should work reliably.
My only machine at present is a netbook (Acer Aspire) which is running Fedora 17 (I normally use and recommend Debian).
Building CM7.2 presented quite a few challenges; having finally succeeded, I want to publish some notes to help others with similar constraints. There are doubtless better ways of doing some things set out here (comments welcome), but these worked.
First, Android can only successfully be built and then actually work if built with fairly aged software. Any recent distribution is likely to be troublesome, and FC17 is right out. The best solution appears to be to build in a VM. I built with Debian Wheezy (currently testing) because I had it lying around, but Debian Squeeze is probably the safest bet. One can do a very minimal install, no need for a gui or anything, just the usual tools and libraries.
I first started with VirtualBox on Fedora, using their "Shared Folders". I already had the repo checked out, and wanted to be able to keep the source outside of the VM instead of trapped inside it. VBox in Oracle's infinite wisdom decided not to support symlinks with "Shared Folders", making them useless. This problem appeared only at the end of the build, wasting lots of time.
At this point, I copied the source over to Windows and tried building it with VirtualBox there, which didn't work, so I decided to try Xen on Fedora.
Xen worked, but not very well. There were some crashes and hangs, and the machine could not be suspended.
Worst of all, memory used for guest VMs is permanently subtracted from the host VM, so one has to reboot after one or
two launches of a VM. One plus (on Fedora 17) is that firewall rules are automagically created to allow vibr0, the bridging
network between guest and host, to work so the guest can reach net. I Still needed to
manually add an iptables rule so the guest could access the host, and thus the nfs-exported source code.
Code:
iptables -A INPUT -i vibr0 -j ACCEPT
I probably could have gotten the build to work with Xen at this point, but decided that since I had nfs figured out and
VirtualBox (unfortunately) worked for me a lot better than Xen, I would give VBox another try, using nfs instead of "Shared Folders".
With VirtualBox, the default NAT network makes the host unreachable, so one needs to use two adapters
on the guest, one "Host-Only Adapter" to access NFS on host, one NAT adapter to be
able to reach the net (not strictly needed). I then needed to do a manual dhclient on NAT adapter to get the NAT access working:
Code:
dhclient eth1
On the host ,I needed to adjust iptables to open the firewall for the vbox NAT adapter
(192.168.56.0/24 at present) and enable masquerading. Note that no thought is given to security:
Code:
iptables -A INPUT -i vboxnet0 -j ACCEPT
-A FORWARD -i vboxnet0 -j ACCEPT
-A FORWARD -o vboxnet0 -j ACCEPT
-A POSTROUTING -s 192.168.56.0/24 ! -d 192.168.56.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.56.0/24 ! -d 192.168.56.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.56.0/24 ! -d 192.168.56.0/24 -j MASQUERADE
On the Debian guest, other than doing
Code:
dhclient eth[01] (whichever one is the NAT interface, see output of
inconfig -a)
nothing special was required beyond typical nfs mount.
On Fedora, nfs doesn't seem to start by itself; I had to do:
Code:
service rpcbind start
and then
Code:
service nfs start
to get it going.
Netbooks are not made to build software. Letting a build run without taking some measures eventually results in overheating and crashing.
I did all of the below manually, but using tools such as cpupower in package kernel-tools in Fedora 17 (used to be pacakge [
cpufrequtils is easier. There doesn't seem to be a command or sysctl setting to set ignore_nice_load.
Setting ignore_nice_load for the ondemand cpufreq governer should have done the job, but for some reason didn't work, even with both the build and the whole VM process niced:
Code:
[[email protected] ondemand]# pwd
/sys/devices/system/cpu/cpufreq/ondemand
[[email protected] ondemand]#
[[email protected] ondemand]# echo 1 >ignore_nice_load
I had to change the governor from ondemand to powersave, and had to do it for both cores. The easy way (with Fedora 17) is
Code:
cpupower frequency-set -g powersave
The manual way, in case the above is not available, is:
Code:
[[email protected] cpufreq]# pwd
/sys/devices/system/cpu/cpu0/cpufreq
cat scaling_available_governors
conservative userspace powersave ondemand performance
[[email protected] cpufreq]#
echo powersave >scaling_governor
[email protected] cpufreq]# pwd
/sys/devices/system/cpu/cpu1/cpufreq
and so forth.
This locked both cores at 800000 instead of 1000000 (those are the two speeds in the AMD C60). I also have the netbook elevated so heat can't collect underneath it. Having taken these measures, it can build CM (overnight or longer) without problems.
I hope these notes are useful to someone.
how can I solve that problem?
I write the code in init.rc:
Code:
mv /com.anddoes.launcher_preferences.xml /data/data/com.anddoes.launcher/shared_prefs/
it returns such error:
<3>[ 0.640121] init: /init.rc: 351: invalid command 'mv'
I tried both to write a script and to move toolbox with mv to the system root, but it returns the same error.
All the necessary folders exist
MaxiManBW said:
how can I solve that problem?
I write the code in init.rc:
Code:
mv /com.anddoes.launcher_preferences.xml /data/data/com.anddoes.launcher/shared_prefs/
it returns such error:
<3>[ 0.640121] init: /init.rc: 351: invalid command 'mv'
I tried both to write a script and to move toolbox with mv to the system root, but it returns the same error.
All the necessary folders exist
Click to expand...
Click to collapse
init.rc is not a shell script, but a command language for the init process. Use can use the "exec" command to execute the mv command, see the docs below. Remember to use full paths.
Code:
Android Init Language
---------------------
The Android Init Language consists of four broad classes of statements,
which are Actions, Commands, Services, and Options.
All of these are line-oriented, consisting of tokens separated by
whitespace. The c-style backslash escapes may be used to insert
whitespace into a token. Double quotes may also be used to prevent
whitespace from breaking text into multiple tokens. The backslash,
when it is the last character on a line, may be used for line-folding.
Lines which start with a # (leading whitespace allowed) are comments.
Actions and Services implicitly declare a new section. All commands
or options belong to the section most recently declared. Commands
or options before the first section are ignored.
Actions and Services have unique names. If a second Action or Service
is declared with the same name as an existing one, it is ignored as
an error. (??? should we override instead)
Actions
-------
Actions are named sequences of commands. Actions have a trigger which
is used to determine when the action should occur. When an event
occurs which matches an action's trigger, that action is added to
the tail of a to-be-executed queue (unless it is already on the
queue).
Each action in the queue is dequeued in sequence and each command in
that action is executed in sequence. Init handles other activities
(device creation/destruction, property setting, process restarting)
"between" the execution of the commands in activities.
Actions take the form of:
on <trigger>
<command>
<command>
<command>
Services
--------
Services are programs which init launches and (optionally) restarts
when they exit. Services take the form of:
service <name> <pathname> [ <argument> ]*
<option>
<option>
...
Options
-------
Options are modifiers to services. They affect how and when init
runs the service.
critical
This is a device-critical service. If it exits more than four times in
four minutes, the device will reboot into recovery mode.
disabled
This service will not automatically start with its class.
It must be explicitly started by name.
setenv <name> <value>
Set the environment variable <name> to <value> in the launched process.
socket <name> <type> <perm> [ <user> [ <group> ] ]
Create a unix domain socket named /dev/socket/<name> and pass
its fd to the launched process. <type> must be "dgram", "stream" or "seqpacket".
User and group default to 0.
user <username>
Change to username before exec'ing this service.
Currently defaults to root. (??? probably should default to nobody)
Currently, if your process requires linux capabilities then you cannot use
this command. You must instead request the capabilities in-process while
still root, and then drop to your desired uid.
group <groupname> [ <groupname> ]*
Change to groupname before exec'ing this service. Additional
groupnames beyond the (required) first one are used to set the
supplemental groups of the process (via setgroups()).
Currently defaults to root. (??? probably should default to nobody)
oneshot
Do not restart the service when it exits.
class <name>
Specify a class name for the service. All services in a
named class may be started or stopped together. A service
is in the class "default" if one is not specified via the
class option.
onrestart
Execute a Command (see below) when service restarts.
Triggers
--------
Triggers are strings which can be used to match certain kinds
of events and used to cause an action to occur.
boot
This is the first trigger that will occur when init starts
(after /init.conf is loaded)
<name>=<value>
Triggers of this form occur when the property <name> is set
to the specific value <value>.
device-added-<path>
device-removed-<path>
Triggers of these forms occur when a device node is added
or removed.
service-exited-<name>
Triggers of this form occur when the specified service exits.
Commands
--------
exec <path> [ <argument> ]*
Fork and execute a program (<path>). This will block until
the program completes execution. It is best to avoid exec
as unlike the builtin commands, it runs the risk of getting
init "stuck". (??? maybe there should be a timeout?)
export <name> <value>
Set the environment variable <name> equal to <value> in the
global environment (which will be inherited by all processes
started after this command is executed)
ifup <interface>
Bring the network interface <interface> online.
import <filename>
Parse an init config file, extending the current configuration.
hostname <name>
Set the host name.
chdir <directory>
Change working directory.
chmod <octal-mode> <path>
Change file access permissions.
chown <owner> <group> <path>
Change file owner and group.
chroot <directory>
Change process root directory.
class_start <serviceclass>
Start all services of the specified class if they are
not already running.
class_stop <serviceclass>
Stop all services of the specified class if they are
currently running.
domainname <name>
Set the domain name.
insmod <path>
Install the module at <path>
mkdir <path> [mode] [owner] [group]
Create a directory at <path>, optionally with the given mode, owner, and
group. If not provided, the directory is created with permissions 755 and
owned by the root user and root group.
mount <type> <device> <dir> [ <mountoption> ]*
Attempt to mount the named device at the directory <dir>
<device> may be of the form [email protected] to specify a mtd block
device by name.
<mountoption>s include "ro", "rw", "remount", "noatime", ...
setkey
TBD
setprop <name> <value>
Set system property <name> to <value>.
setrlimit <resource> <cur> <max>
Set the rlimit for a resource.
start <service>
Start a service running if it is not already running.
stop <service>
Stop a service from running if it is currently running.
symlink <target> <path>
Create a symbolic link at <path> with the value <target>
sysclktz <mins_west_of_gmt>
Set the system clock base (0 if system clock ticks in GMT)
trigger <event>
Trigger an event. Used to queue an action from another
action.
write <path> <string> [ <string> ]*
Open the file at <path> and write one or more strings
to it with write(2)
Properties
----------
Init updates some system properties to provide some insight into
what it's doing:
init.action
Equal to the name of the action currently being executed or "" if none
init.command
Equal to the command being executed or "" if none.
init.svc.<name>
State of a named service ("stopped", "running", "restarting")
Example init.conf
-----------------
# not complete -- just providing some examples of usage
#
on boot
export PATH /sbin:/system/sbin:/system/bin
export LD_LIBRARY_PATH /system/lib
mkdir /dev
mkdir /proc
mkdir /sys
mount tmpfs tmpfs /dev
mkdir /dev/pts
mkdir /dev/socket
mount devpts devpts /dev/pts
mount proc proc /proc
mount sysfs sysfs /sys
write /proc/cpu/alignment 4
ifup lo
hostname localhost
domainname localhost
mount yaffs2 [email protected] /system
mount yaffs2 [email protected] /data
import /system/etc/init.conf
class_start default
service adbd /sbin/adbd
user adb
group adb
service usbd /system/bin/usbd -r
user usbd
group usbd
socket usbd 666
service zygote /system/bin/app_process -Xzygote /system/bin --zygote
socket zygote 666
service runtime /system/bin/runtime
user system
group system
on device-added-/dev/compass
start akmd
on device-removed-/dev/compass
stop akmd
service akmd /sbin/akmd
disabled
user akmd
group akmd
Debugging notes
---------------
By default, programs executed by init will drop stdout and stderr into
/dev/null. To help with debugging, you can execute your program via the
Andoird program logwrapper. This will redirect stdout/stderr into the
Android logging system (accessed via logcat).
For example
service akmd /system/bin/logwrapper /sbin/akmd
kuisma said:
init.rc is not a shell script, but a command language for the init process. Use can use the "exec" command to execute the mv command, see the docs below. Remember to use full paths.
Code:
Android Init Language
---------------------
The Android Init Language consists of four broad classes of statements,
which are Actions, Commands, Services, and Options.
All of these are line-oriented, consisting of tokens separated by
whitespace. The c-style backslash escapes may be used to insert
...........................................
Click to expand...
Click to collapse
I created script and put it to /system folder
Then call it with:
Code:
service my_script /system/my_script.sh
class main
oneshot
and again received an error: <3>[ 61.921627] init: cannot find '/system/my_script.sh', disabling 'my_script'
MaxiManBW said:
I created script and put it to /system folder
Then call it with:
Code:
service my_script /system/my_script.sh
class main
oneshot
and again received an error: <3>[ 61.921627] init: cannot find '/system/my_script.sh', disabling 'my_script'
Click to expand...
Click to collapse
Is you script executable and begins with the line "#!/system/bin/sh"?
kuisma said:
Is you script executable and begins with the line "#!/system/bin/sh"?
Click to expand...
Click to collapse
Yes!
just in case, I used chmod 777 and first line begins with the line "#!/system/bin/sh".
Error no longer appears, but script doesn't work:
Code:
#!/system/bin/sh
if [-a /com.anddoes.launcher_preferences.xml]
cp /com.anddoes.launcher_preferences.xml /data/data/com.anddoes.launcher/shared_prefs/
rm /com.anddoes.launcher_preferences.xml
fi
I may be wrong calling service?
Code:
service my_script /system/my_script.sh
class main
oneshot
MaxiManBW said:
Yes!
just in case, I used chmod 777 and first line begins with the line "#!/system/bin/sh".
Error no longer appears, but script doesn't work:
Code:
#!/system/bin/sh
if [-a /com.anddoes.launcher_preferences.xml]
cp /com.anddoes.launcher_preferences.xml /data/data/com.anddoes.launcher/shared_prefs/
rm /com.anddoes.launcher_preferences.xml
fi
I may be wrong calling service?
Code:
service my_script /system/my_script.sh
class main
oneshot
Click to expand...
Click to collapse
I guess cp works, but not rm? Root is remounted read-only quite early in init.rc
Edit: Also, I've told you to use full paths. And that if-syntax...? It's sure not standard shell test syntax.
MaxiManBW said:
how can I solve that problem?
I write the code in init.rc:
Code:
mv /com.anddoes.launcher_preferences.xml /data/data/com.anddoes.launcher/shared_prefs/
it returns such error:
<3>[ 0.640121] init: /init.rc: 351: invalid command 'mv'
I tried both to write a script and to move toolbox with mv to the system root, but it returns the same error.
All the necessary folders exist
Click to expand...
Click to collapse
Did it work?
I think init.rc only understands absolute paths... I mean, replacing mv with the below might work.
/system/bin/mv XXX YYY
-pradeep.
---------- Post added at 03:41 PM ---------- Previous post was at 03:16 PM ----------
kuisma said:
I guess cp works, but not rm? Root is remounted read-only quite early in init.rc
Edit: Also, I've told you to use full paths. And that if-syntax...? It's sure not standard shell test syntax.
Click to expand...
Click to collapse
I have a similar question regarding init.rc.
I am trying to run a native application (which downloads the wifi firmware to dongle). I need this to be done before the wifi driver module is insmod'ed. Accordingly, I have an entry in init.rc with 'exec' command to run it -- at the end of "on init" section.
exec /system/bin/downloader -n /system/etc/wifi/xyz.nvm /system/etc/wifi/fake.trx
This command doesn't seem to run although I don't see any errors in the boot log.
I also tried a combination of 'service' commands like:
service downloader /system/bin/downloader -n /system/etc/wifi/xyz.nvm /system/etc/wifi/fake.trx
disabled
oneshot
Same result: no error in the bootlog but firmware not downloaded.
Any idea what might be wrong with the commands here? I am on JB-MR1.
-pradeep.
Gurumath said:
Did it work?
I think init.rc only understands absolute paths... I mean, replacing mv with the below might work.
/system/bin/mv XXX YYY
-pradeep.
---------- Post added at 03:41 PM ---------- Previous post was at 03:16 PM ----------
I have a similar question regarding init.rc.
I am trying to run a native application (which downloads the wifi firmware to dongle). I need this to be done before the wifi driver module is insmod'ed. Accordingly, I have an entry in init.rc with 'exec' command to run it -- at the end of "on init" section.
exec /system/bin/downloader -n /system/etc/wifi/xyz.nvm /system/etc/wifi/fake.trx
This command doesn't seem to run although I don't see any errors in the boot log.
I also tried a combination of 'service' commands like:
service downloader /system/bin/downloader -n /system/etc/wifi/xyz.nvm /system/etc/wifi/fake.trx
disabled
oneshot
Same result: no error in the bootlog but firmware not downloaded.
Any idea what might be wrong with the commands here? I am on JB-MR1.
-pradeep.
Click to expand...
Click to collapse
So here is the thing I read somewhere that exec are just added for show and they don't actually work
I am not entirely sure of the above statement, but what I am sure of is that you can write a script and add it to the init.rc to get your work done
---------- Post added at 10:26 AM ---------- Previous post was at 10:16 AM ----------
kuisma said:
I guess cp works, but not rm? Root is remounted read-only quite early in init.rc
Edit: Also, I've told you to use full paths. And that if-syntax...? It's sure not standard shell test syntax.
Click to expand...
Click to collapse
It is not about the wrong service being called.
It is the fact that the service has been defined but you need to call the service at some instant by adding the command
'start yourServiceName'
That is if you want to start your service at boot time, you will need to add the following lines
on property:sys.boot_completed=1
start my_script
Here is a full version of a script that I wrote, this was to toggle wifi at regular interval of time
My Shell Script - init.custom.sh
#!/system/bin/sh
while true; do
svc wifi disable
sleep 10
svc wifi enable
sleep 60
done
My Code inside init.rc
service custom /system/bin/init.custom.sh
user root
oneshot
on property:sys.boot_completed=1
write /sys/block/mmcblk0/queue/scheduler cfq ## This was already present
start custom
I know this is a very late reply, but I started exploring these things recently.
Hope this helps someone.