Debian no Android "from scratch"

Este artigo pretende demonstrar, passo a passo, a instalação do Debian em sistema Android, desde o Debootstrap até a configuração final. Algumas alterações nas linhas de comandos/scripts podem ser necessárias, dependendo do dispositivo.

[ Hits: 35.167 ]

Por: Rodrigo Morette em 11/10/2013 | Blog: http://www.morette.com.br


Configuração do sistema



O Debian está instalado, mas ainda precisa ser configurado.

Vamos começar adicionando um usuário para não logar com o root sempre no ambiente. No Android, os grupos são hard coded, ou seja, estão embutidos no código e não temos o /etc/group, qualquer permissão de usuário para dispositivos, deve respeitar os GIDs do Android.

Como usuário comum, por exemplo, o X não funciona se ele não pertencer a um grupo com GID 3003, chamado inet. Relativo ao UID, o Android atribui um a cada aplicativo (app user) e o UID fica na faixa de 10000 até 19999, sendo que os estes tem o nome u0_a0 até u0_a9999, aparentemente isso é atribuído de forma sequencial a cada novo APP instalado.

Eu notei que existem algumas coisas no /proc relativas a usuários comuns. Para evitar qualquer espécie de conflito com o Android, nosso usuário no Debian terá UID 19000 - é um valor que, provavelmente, não será usado pelo sistema e fica na faixa de usuários comuns do Android.

Vamos editar o passwd, shadow e group para deixar o sistema compatível com o Android. É uma boa ideia renomear os arquivos atuais:

# mv /data/debian/etc/group /data/debian/etc/group.old
# mv /data/debian/etc/passwd /data/debian/etc/passwd.old
# mv /data/debian/etc/shadow /data/debian/etc/shadow.old


O Debian já possui grupos audio e nobody, mas seus GIDs são diferentes. Nos arquivos propostos, isso está corrigido e o grupo users também foi mudado para 19000.

Como na instalação base, nenhum arquivo usa esses grupos, então, não há problema em alterar o GID deles. Também não é interessante apagarmos grupos/usuários originais do Debian, pois estes podem ser usados por algum serviço.

Para quem não usa o Vi, é bem simples de adicionar isso: coloque-o em modo de edição (pressione i), selecione o conteúdo do arquivo e clique com o scroll do mouse no terminal, ele irá colar essas linhas.

Depois pressione Esc e digite :wq

Criando o /etc/group:

# vi /data/debian/etc/group

Conteúdo:

root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:
man:x:12:
proxy:x:13:
kmem:x:15:
dialout:x:20:
fax:x:21:
voice:x:22:
cdrom:x:24:
floppy:x:25:
tape:x:26:
sudo:x:27:
dip:x:30:
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:
sasl:x:45:
plugdev:x:46:
staff:x:50:
games:x:60:
users:x:19000:
libuuid:x:101:
system:x:1000:
radio:x:1001:
bluetooth:x:1002:
graphics:x:1003:
input:x:1004:
audio:x:1005:
camera:x:1006:
log:x:1007:
compass:x:1008:
mount:x:1009:
wifi:x:1010:
adb:x:1011:
install:x:1012:
media:x:1013:
dhcp:x:1014:
sdcard_rw:x:1015:
vpn:x:1016:
keystore:x:1017:
usb:x:1018:
drm:x:1019:
mdnsr:x:1020:
gps:x:1021:
media_rw:x:1023:
mtp:x:1024:
drmrpc:x:1026:
nfc:x:1027:
sdcard_r:x:1028:19000
clat:x:1029:
loop_radio:x:1030:
shell:x:2000:
cache:x:2001:
diag:x:2002:
net_bt_admin:x:3001:
net_bt:x:3002:
inet:x:3003:
net_raw:x:3004:
net_admin:x:3005:
net_bw_stats:x:3006:
net_bw_acct:x:3007:
net_bt_stack:x:3008:
misc:x:9998:
nobody:x:9999:

Acertando os usuários no /etc/passwd:

# vi /data/debian/etc/passwd

Conteúdo:

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
system:x:1000:1000:system:/dev/null:/bin/false
radio:x:1001:1001:radio:/dev/null:/bin/false
bluetooth:x:1002:1002:bluetooth:/dev/null:/bin/false
graphics:x:1003:1003:graphics:/dev/null:/bin/false
input:x:1004:1004:input:/dev/null:/bin/false
audio:x:1005:1005:audio:/dev/null:/bin/false
camera:x:1006:1006:camera:/dev/null:/bin/false
log:x:1007:1007:log:/dev/null:/bin/false
compass:x:1008:1008:compass:/dev/null:/bin/false
mount:x:1009:1009:mount:/dev/null:/bin/false
wifi:x:1010:1010:wifi:/dev/null:/bin/false
adb:x:1011:1011:adb:/dev/null:/bin/false
install:x:1012:1012:install:/dev/null:/bin/false
media:x:1013:1013:media:/dev/null:/bin/false
dhcp:x:1014:1014:dhcp:/dev/null:/bin/false
sdcard_rw:x:1015:1015:sdcard_rw:/dev/null:/bin/false
vpn:x:1016:1016:vpn:/dev/null:/bin/false
keystore:x:1017:1017:keystore:/dev/null:/bin/false
usb:x:1018:1018:usb:/dev/null:/bin/false
drm:x:1019:1019:drm:/dev/null:/bin/false
mdnsr:x:1020:1020:mdnsr:/dev/null:/bin/false
gps:x:1021:1021:gps:/dev/null:/bin/false
media_rw:x:1023:1023:media_rw:/dev/null:/bin/false
mtp:x:1024:1024:mtp:/dev/null:/bin/false
drmrpc:x:1026:1026:drmrpc:/dev/null:/bin/false
nfc:x:1027:1027:nfc:/dev/null:/bin/false
sdcard_r:x:1028:1028:sdcard_r:/dev/null:/bin/false
clat:x:1029:1029:clat:/dev/null:/bin/false
loop_radio:x:1030:1030:loop_radio:/dev/null:/bin/false
shell:x:2000:2000:shell:/dev/null:/bin/false
cache:x:2001:2001:cache:/dev/null:/bin/false
diag:x:2002:2002:diag:/dev/null:/bin/false
net_bt_admin:x:3001:3001:net_bt_admin:/dev/null:/bin/false
net_bt:x:3002:3002:net_bt:/dev/null:/bin/false
inet:x:3003:3003:inet:/dev/null:/bin/false
net_raw:x:3004:3004:net_raw:/dev/null:/bin/false
net_admin:x:3005:3005:net_admin:/dev/null:/bin/false
net_bw_stats:x:3006:3006:net_bw_stats:/dev/null:/bin/false
net_bw_acct:x:3007:3007:net_bw_acct:/dev/null:/bin/false
net_bt_stack:x:3008:3008:net_bt_stack:/dev/null:/bin/false
misc:x:9998:9998:misc:/dev/null:/bin/false
nobody:x:9999:9999:nobody:/dev/null:/bin/false

Por fim, o /etc/shadow:

# vi /data/debian/etc/shadow

Conteúdo:

root:*:15882:0:99999:7:::
daemon:*:15882:0:99999:7:::
bin:*:15882:0:99999:7:::
sys:*:15882:0:99999:7:::
sync:*:15882:0:99999:7:::
games:*:15882:0:99999:7:::
man:*:15882:0:99999:7:::
lp:*:15882:0:99999:7:::
mail:*:15882:0:99999:7:::
news:*:15882:0:99999:7:::
uucp:*:15882:0:99999:7:::
proxy:*:15882:0:99999:7:::
www-data:*:15882:0:99999:7:::
backup:*:15882:0:99999:7:::
list:*:15882:0:99999:7:::
irc:*:15882:0:99999:7:::
gnats:*:15882:0:99999:7:::
libuuid:!:15882:0:99999:7:::
system:*:15882:0:99999:7:::
radio:*:15882:0:99999:7:::
bluetooth:*:15882:0:99999:7:::
graphics:*:15882:0:99999:7:::
input:*:15882:0:99999:7:::
audio:*:15882:0:99999:7:::
camera:*:15882:0:99999:7:::
log:*:15882:0:99999:7:::
compass:*:15882:0:99999:7:::
mount:*:15882:0:99999:7:::
wifi:*:15882:0:99999:7:::
adb:*:15882:0:99999:7:::
install:*:15882:0:99999:7:::
media:*:15882:0:99999:7:::
dhcp:*:15882:0:99999:7:::
sdcard_rw:*:15882:0:99999:7:::
vpn:*:15882:0:99999:7:::
keystore:*:15882:0:99999:7:::
usb:*:15882:0:99999:7:::
drm:*:15882:0:99999:7:::
mdnsr:*:15882:0:99999:7:::
gps:*:15882:0:99999:7:::
media_rw:*:15882:0:99999:7:::
mtp:*:15882:0:99999:7:::
drmrpc:*:15882:0:99999:7:::
nfc:*:15882:0:99999:7:::
sdcard_r:*:15882:0:99999:7:::
clat:*:15882:0:99999:7:::
loop_radio:*:15882:0:99999:7:::
shell:*:15882:0:99999:7:::
cache:*:15882:0:99999:7:::
diag:*:15882:0:99999:7:::
net_bt_admin:*:15882:0:99999:7:::
net_bt:*:15882:0:99999:7:::
inet:*:15882:0:99999:7:::
net_raw:*:15882:0:99999:7:::
net_admin:*:15882:0:99999:7:::
net_bw_stats:*:15882:0:99999:7:::
net_bw_acct:*:15882:0:99999:7:::
net_bt_stack:*:15882:0:99999:7:::
misc:*:15882:0:99999:7:::
nobody:*:15882:0:99999:7:::

Agora, vamos ao ambiente do Debian para definir a senha do root e criar o nosso usuário:

# LANG=C.UTF-8 chroot /data/debian /bin/bash -l

Acertando as permissões do shadow, passwd e group:

# chown root.shadow /etc/shadow
# chmod 640 /etc/shadow
# chmod 644 /etc/passwd /etc/group


Atribuindo uma senha para o root:

# passwd

Criando o usuário, substitua o nome debianuser pelo nome que quiser:

# useradd -u 19000 -d /home/debianuser -s /bin/bash -g users -G sdcard_rw,sdcard_r,inet,graphics,input,audio -m debianuser

Definindo uma senha para o novo usuário:

# passwd debianuser

Vamos sair do ambiente chroot para continuar a configuração, esta imagem é tão reduzida que sequer o Vi está disponível:

# exit

Agora, iremos fazer algumas configurações básicas no sistema. Vamos começar criando um ponto de montagem para o SD card, acertar o mtab e o hosts:

# mkdir /data/debian/mnt/sdcard
# ln -sf /proc/self/mounts /data/debian/etc/mtab
# echo 127.0.0.1 localhost > /data/debian/etc/hosts


Adicionando os repositórios do apt-get. Eu estou usando os repos US, mesmo:

# vi /data/debian/etc/apt/sources.list

Conteúdo:

deb http://ftp.us.debian.org/debian stable main contrib non-free
deb http://ftp.debian.org/debian/ wheezy-updates main contrib non-free
deb http://security.debian.org/ wheezy/updates main contrib non-free

Agora, iremos criar dois pequenos scripts para inicializar e finalizar o X, que serão chamados startx e stopx. Nós não teremos acesso ao X diretamente, mas sim via conexão VNC local disponível no display :1.

Para o startx, observe o parâmetro -geometry 1024x550, o meu Tablet possui uma resolução de 1024x600 mas 50 pixels são utilizados pela barra inferior, então, estou os descontando. Se isso não for feito, será necessário ficar rolando a tela, como em um Desktop virtual.

Adapte essa linha ao seu dispositivo:

# vi /data/debian/bin/startx

#!/bin/sh
export XAUTHORITY=~/.Xauthority
vncserver :1 -geometry 1024x550 -dpi 96 -localhost

Agora o stopx, que apenas finaliza o VNC e exclui os locks do X:

# vi /data/debian/bin/stopx

#!/bin/sh
vncserver -kill :1
rm -f /tmp/.X1-lock
rm -f /tmp/.X11-unix/X1

O próximo passo será criar scripts para o startup e shutdown internos do Debian. Esses scripts são auxiliares aos que criaremos posteriormente no SD card. Com eles, será possível inicializar/finalizar algum serviço como SSH, Apache e etc.

No momento que o X for instalado, será interessante carregar o D-Bus, então ele já está incluso nos scripts iniciais. Não execute o startx/stopx por esses arquivos, pois ele serão executados como root no script de carga:

# vi /data/debian/etc/debian.start

#!/bin/sh
if [ -e /etc/inid.d/dbus ]; then
  /etc/inid.d/dbus start
fi

# vi /data/debian/etc/debian.stop

#!/bin/sh
if [ -e /etc/inid.d/dbus ]; then
  /etc/inid.d/dbus stop
fi

Um exemplo de utilização desses arquivos, seria incluir /etc/init.d/ssh start em debian.start, e /etc/init.d/ssh stop em debian.stop para o servidor SSH, por exemplo.

Permissão de execução para os scripts:

# chmod 755 /data/debian/bin/startx /data/debian/bin/stopx
# chmod 744 /data/debian/etc/debian.start /data/debian/etc/debian.stop


Configurado! Vamos desmontar o sistema de arquivos para remontar via script depois, sair do chroot e do SSH.

# umount /data/debian
# exit
# exit


Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Criando: Imagem/Sistema base
   3. Configuração do sistema
   4. Scripts de carga e shutdown
   5. Finalizar a configuração e instalar pacotes básicos
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Conheça o Viva o Android, site coirmão do VOL

Aprendendo Inglês em casa usando o Android

Chromecast - Upgrade de sua TV LED sem Wi-Fi

Tranferência rápida de arquivos do Android para PC via FTP

Devo atender? Um ótimo aplicativo para bloquear Telemarketing

  
Comentários
[1] Comentário enviado por lcavalheiro em 11/10/2013 - 11:58h

Este artigo está do caralho! Favoritado com certeza. Pergunta: existe experiência dessa brincadeira em smartphones? Se existe, você pode nos relatar como foi?

[2] Comentário enviado por rmorette em 11/10/2013 - 15:52h

Valeu :-). Eu não cheguei a testar no smartphone, mas já vi alguns relatos de pessoas que fizeram chroot para uma distro neles. Desde que não tenha problemas no Android (como a falta suporte a EXT2), é para funcionar normalmente.

[3] Comentário enviado por oliviofarias em 13/10/2013 - 00:00h

Estou pensando em fazer isso, mas será que funciona em um Galaxy S3?

[4] Comentário enviado por Pylm em 13/10/2013 - 18:14h

Se o kernel instalado (no smart claro) tiver suporte a ext, vai.

[5] Comentário enviado por luisrcs em 15/10/2013 - 19:09h

Muito bom o artigo, parabéns. Mas eu fiz isso no meu tablet Coby com menos trabalho. Bastando instalar e configurar o Debian em um microSD pelo computador e depois montando o mesmo no tablet e executando o chroot.

Consigo rodar qualquer programa em console nele. O que me fez abandonar o projeto foi não conseguir rodar nenhum ambiente gráfico, fiquei frustrado.

E sim. Dá pra fazer o debootstrap armel num computador x86, bastando instalar o qemu e configurar corretamente.

[6] Comentário enviado por rmorette em 16/10/2013 - 22:29h

Boa cara! De fato, uma VM ARM simplifica pacas e acelera o processo de criação da imagem :-)
Valeu pela dica!

[7] Comentário enviado por mfrlinux em 05/11/2013 - 13:53h

Show Rodrigo, total hacker.
Estou montando meu cenário pelo seu passo-a-passo.

[8] Comentário enviado por psctec em 02/01/2014 - 15:41h

Se alguem souber como rootear um S3 Mini para poder usar este tutorial agradeço

[9] Comentário enviado por leoribas35 em 22/12/2014 - 12:17h

aonde abre esse de $ su ? eu to horas tentando instalar o kali no cel e da o erro de loop to ficando loco algume me ajuda

[10] Comentário enviado por purcina em 26/02/2015 - 20:51h

Muito bom o artigo. Só uma dúvida. Quando eu vou executar o comando <code> LANG=C.UTF-8 chroot /data/debian debootstrap/debootstrap --second-stage </code> da o seguinte erro <code>No pkgdetails available; either install perl, or build pkgdetails.c from the base-installer source package</>. Eu sei que isso é causado pelo fato do perl não está instalado. Mas eu devo instalar o perl no android ou na imagem de instalação??

[11] Comentário enviado por marconso em 09/02/2016 - 18:06h

Achei interessante poder colocar uma distro no celular, porém fiquei enrolado na parte da criação da base.... Fiquei confuso em qual momento devo iniciar a utilizar o cartão sd.... Uso um moto g 3 e gostaria de saber se poderia fazer todo o procedimento sem o cartão.
Vlw ta favoritado

[12] Comentário enviado por TimeinLosted em 30/10/2017 - 03:24h


[10] Comentário enviado por purcina em 26/02/2015 - 20:51h

Muito bom o artigo. Só uma dúvida. Quando eu vou executar o comando &lt;code&gt; LANG=C.UTF-8 chroot /data/debian debootstrap/debootstrap --second-stage &lt;/code&gt; da o seguinte erro &lt;code&gt;No pkgdetails available; either install perl, or build pkgdetails.c from the base-installer source package&lt;/&gt;. Eu sei que isso é causado pelo fato do perl não está instalado. Mas eu devo instalar o perl no android ou na imagem de instalação??



O perl está instalado,mas ele não acha.Digite:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

[13] Comentário enviado por Alannah358 em 19/07/2021 - 03:17h


[10] Comment sent by purcina on 02/26/2015 - 20:51h

Very good article. Just a question. When I run the command &lt;code&gt; LANG=C.UTF-8 chroot /data/debian debootstrap/debootstrap --second-stage &lt;/code&gt; it gives the following error &lt;code&gt;No pkgdetails available; https://www.targetpayandbenefits.biz/ either install perl, or build pkgdetails.c from the base-installer source package&lt;/&gt;. I know this is caused by the fact that perl is not installed. But should I install perl on android or on the install image??



"Linux from scratch on ARM" It would show a number of pages for clues. Either cross compile or build embedded or build on system.


Contribuir com comentário