Month: September 2006

Recuperando o kernel e o initrd de uma imagem syslinux

Estava querendo pegar o kernel e o rootfs (initrd) da imagem do SkatOS para dar uma estudada nela.

Procurei na internet para ver se alguém já tinha feito isso antes, não encontrei nada. Então dei uma olhada nos bytes iniciais de um kernel 2.2.26 que é o usado pelo SkatOS, este kernel começa com os seguintes bytes:

b8 c0 07 8e d8 b8 00 90

Então abri o skatos.img com o hte (editor de binário) e mandei procurar a sequencia em hex, procurei apenas os 3 primeiros bytes, encontrei a sequencia na posição 0x6600 e lá estavam os demais bytes. Então converti a posição pra decimal, 0x6600 = 26112, agora é só usar o dd para fazer o trabalho sujo. Mas antes vamos dividir este valor por 16 para podermos usar blocos de 16 bytes, pois copiar byte a byte demora mais. 26112/16 = 1632:

dd if=skatos.img of=kernel_initrd bs=16 skip=1632

Agora só precisamos pegar o initrd, para isso abri o arquivo criado (kernel_initrd) e procurei a string “initrd”, pronto descobri que o initrd começa na posição 0x59600 = 366080, vamos dividir 366080/16 = 22880 :

dd if=kernel_initrd of=initrd bs=16 skip=22880

Agora vamos descompactar o initrd:

mv initrd initrd.gz
gunzip initrd.gz

$ file initrd
initrd: Minix filesystem, 30 char names

Compilando o X server como Kdrive

Primeiramente baixe os fontes, baixe da Internet o arquivo:
xfree86_4.2.1.orig.tar.gz

Descompacte:
tar zxvf xfree86_4.2.1.orig.tar.gz
Será criado o diretório xfree86-4.2.1 com o arquivo xfree86-4.2.1.tar.gz.

Descompacte-o:

cd xfree86-4.2.1
tar zxvf xfree86-4.2.1.tar.gz

Será criado o diretório xc, então entre em xc/config/cf e crie o arquivo host.def com o conteúdo:

#define KDriveXServer YES
#define TinyXServer YES
#define XfbdevServer YES
#define XvesaServer YES
#define ForceNormalLib          YES

#define BuildFonts NO
#define BuildServersOnly NO
#define BuildXTrueType             NO
#define BuildScreenSaverExt        NO
#define BuildScreenSaverLibrary    NO

#define KdriveServerExtraDefines -DMAXSCREENS=3
#define ProjectRoot /usr/X11R6
#define NothingOutsideProjectRoot YES
#define UseSeparateConfDir NO

#define UseXwctomb YES
#define HasLibCrypt YES

#define CrossCompiling         YES

Também crie o cross.def:

#undef Arm32Architecture
#undef i386Architecture
#undef Arm32Architecture
#undef Arm32Architecture

#if defined(__arm__)
#define Arm32Architecture
#endif
#if defined(__i386__)
#defined i386Architecture
#endif
#if defined(__mc68000__)
#define Mc68020Architecture
#endif
#if defined(__mips__)
#define MipsArchitecture
#endif
#if defined(__powerpc__)
#define PpcArchitecture
#endif

#undef OptimizedCDebugFlags
#define OptimizedCDebugFlags    -Os
#define ServerCDebugFlags       -Os
#undef StandardDefines
#define StandardDefines         -Dlinux -D__i686__ -D_POSIX_SOURCE \
-D_BSD_SOURCE -D_GNU_SOURCE -DX_LOCALE
#define StdIncDir /usr/local/uclibc/include
#define PreIncDir
#undef PostIncDir
#define PostIncDir /usr/local/uclibc/lib/gcc-lib/i686-linux-uclibc/3.3.3/include
#undef CcCmd
#define CcCmd /usr/local/uclibc/bin/i686-linux-uclibc-gcc
#undef HasCplusplus
#define HasCplusplus NO
#undef CplusplusCmd
#define CplusplusCmd NO
#define DoRanlibCmd YES
#define RanlibCmd /usr/local/uclibc/bin/i686-linux-uclibc-ranlib
#undef ExtraLoadFlags
#define ExtraLoadFlags
#define FbNoPixelAddrCode
#undef TermcapLibrary
#define TermcapLibrary -lncurses

#undef LdPostLib
#define LdPostLib       -L/usr/local/uclibc/i686-linux-uclibc/lib
#undef LdCmd
#define LdCmd /usr/local/uclibc/bin/i686-linux-uclibc-ld

#undef ExtensionOSDefines
#define ExtensionOSDefines

#define ServerXdmcpDefines      /**/

#include <cross.rules>

Retorne ao diretório xc e execute:
make World

Serão criados os programas Xvesa e Xfbdev em programs/Xserver

Agorá é só usá-los.

Instalando o Scratchbox

O scratchbox é realmente uma mão na roda (não na minha), com ele é possível compilar programas para uma plataforma alvo como se você estivesse realmente rodando o Linux e todas as ferramentas de compilação na plataforma alvo.

Para instalar baixe os .debs do site do projeto (www.scratchbox.org) e instale usando o dpkg na seguinte sequência:

scratchbox-libs_1.0.5_i386.deb
scratchbox-core_1.0.5_i386.deb
scratchbox-toolchain-i386-gcc3.3.2-uclibc20040229_1.0.3_i386.deb
scratchbox-devkit-cputransp_1.0_i386.deb

Quando solicitar o nome de usuário para usar coloque o nome do seu usuário usado no Linux, ele adicionará seu usuário ao grupo sbox.

Repare que usei a uClibc nos meus testes para reduzir o footprint e o consumo de memória do aplicativo final.

Efetue login no sistema para seu usuário pegar as novas permissões do grupo sbox. Para testar execute o comando “groups” deverá aparecer sbox entre os grupos ao qual seu usuário pertence.

Agora é só entrar no sbox:
/scratchbox/login

Criando disquetes de 1.7MB no Linux

Caso você não tenha o device criado em /dev crie-o:
# mknod /dev/fd0u1722 b 2 60

Formate o disquete com 1.722MB:
# fdformat /dev/fd0u1722

Crie o sistema de arquivo:
mkfs -t ext2 /dev/fd0u1722

P.S.: Sim, ainda existem seres humanos que usam disquetes 🙂
Você também pode formatar a 1.743MB:
# mknod /dev/fd0u1743 b 2 76

Scripts para ativar usbnet para comunicar com iPaq

Salve o script abaixo em /etc/init.d com o nome ipaqnet e dê permissão de execução:

#!/bin/bash
#
# ipaqnet Control script for iPAQ USBNet connection
#
# Author: Michel Stempin
# Creation: 11/08/2002

PC_ADDR=10.1.244.151
IPAQ_ADDR=10.1.244.111/32
IPAQ_NET=10.1.244.0/24
UPLINK_IF=ppp0

start() {
modprobe usbnet
ifconfig usb0 inet $PC_ADDR up
if [ $? -ne 0 ]; then
exit 1
fi
echo “1” >/proc/sys/net/ipv4/conf/usb0/proxy_arp
UPLINK=`ifconfig $UPLINK_IF >/dev/null 2>&1`
if [ $? -ne 0 ]; then
exit 1
fi
echo “1” >/proc/sys/net/ipv4/conf/$UPLINK_IF/proxy_arp
echo “1” >/proc/sys/net/ipv4/ip_forward
ip route del $IPAQ_NET dev usb0
ip route add $IPAQ_ADDR dev usb0
}

stop() {
ifconfig usb0 down
rmmod -r usbnet
}
case “$1” in
start|add)
start
;;
stop|remove)
stop
;;
*)
echo $”Usage: $0 {start|stop|add|remove}”
exit 1
esac

Salve o script abaixo no iPaq com o startnet.sh e dê permissão de execução:

/sbin/ifconfig usbf 10.1.244.111 up
/sbin/route add default gw 10.1.244.151

Adicionando o Netfilter no kernel 2.6.16 ou superior

O kernel do Linux é um alvo em movimento realmente. precisei adicionar o netfilter com “full Nat” no kernel 2.6.16, procurei na internet e não conseguia fazer, pois não apareciam as opções desejadas, depois de muito pesquisar descobri que a partir da versão 2.6.16 as coisas mudaram de lugar.

Então para adicionar suporte para NAT você deverá selecionar:

Networking options —>
Network packet filtering (replaces ipchains) —>
Core Netfilter Configuration —>
<*> Netfilter Xtables support (required for ip_tables)
<*> “mac” address match support
<*> Connection tracking (required for masq/NAT)
<*> IP tables support (required for filtering/masq/NAT)
<*> IP range match support
<*> Full NAT
<*> MASQUERADE target support

Desbloqueando celulares GSM

Quando você compra um celular de uma operadora de telefonia móvel X você não poderá utilizar o mesmo aparelho com outro cartão GSM de uma operadora Y.

Para poder utilizar um chip de outra operadora você deverá desbloquear o seu aparelho. A própria operadora que te vendou o aparelho poderá desbloquear seu aparelho, mas geralmente elas cobram um valor absurdo. Por exemplo, a TIM cobra R$ 90,00 para fazer o desbloqueio, visto que meu celular Nokia 2600 custou R$ 99,00, parece fora da lógica o valor do desbloqueio.

Outra opção é pagar R$ 15,00 a R$ 25,00 a estes ambulantes que possuem o Box ou o Clip DCT para desbloqueio.

Se você não deseja pagar para desbloquear seu aparelho então use o programa Code Unlock do Crux:
http://www.unlock-mobile-phone.net/downloads/Nokia_Calc_Crux_v50.zip

Este programa realmente é muito bom, porém os celulares mais novas vendidos na operadora TIM não são desbloqueados com ele.
Segundo informações do site:
http://www.guiadohardware.net/comunidade/desbloqueio-tutorial/225201/
o software não funciona porque a TIM desativou o bloqueio pelo teclado, mas eu duvido dessa informação, é mais provável que o código tenha sido mudado.

Controlando tráfego da rede

Criei um servidor de músicas, mas precisei limitar a largura de banda para que os usuários não sobrecarregassem a rede com o download.

Inicialmente limitei a quantidade de usuários e a quantidade de download simultâneos no próprio httpd.conf do Apache.

Para a limitação de banda devemos instalar o shaper:

apt-get install shaper

O shaper contém um script que simplifica o uso do QoS do Linux, porém simplificade e flexibilidade são coisas antagônicas, mas como não queremos nada muito complexo e flexível isso não será problema.

Após instalar o shaper devemos criar o arquivo de regras.

Eu criei o arquivo /etc/shaper/cbq-0002.music_in128k com o conteúdo:

DEVICE=eth0,10Mbit,1Mbit
RATE=128Kbit
WEIGHT=12Kbit
PRIO=5
RULE=10.1.0.0/24
BOUNDED=yes
ISOLATED=yes

Veja os detalhes em:

http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=367