sexta-feira, outubro 16, 2009

Usar Bootchart com o Finit-arc

No post anterior mostrei como diminuir MUITO o tempo de boot do Arch Linux, mas como saber exatamente qual é/era o tempo que esta acontecendo agora e o que se fazia antes? Pois é, para isso temos um programa chamado bootchart que se sai muito bem nesse tipo de medição e que gera gráficos de inicialização também.

Então façamos.
Passo 1 Instalar o Bootchart

#pacman -Sy bootchart

Se você ainda não tiver instalado o finit-arc adicione o parametro init=/sbin/bootchatd na linha da inicialização do kernel no arquivo /boot/grub/menu.lst
kernel /boot/vmlinuz26 root=/dev/sda2 ro vga=791 splash resume=/dev/sda1 init=/sbin/bootchartd


No caso de já ter instalado o finit-arc o processo é um pouco diferente.

Modifique o arquivo /sbin/bootchartd na seguinte linha:
init="/sbin/init"

por
init="/sbin/finit-arc"

e modifique a linha do /boot/grub/menu.lst conforme o exemplo acima.
Pronto depois de reiniciar seu computador você pode usar o comando bootchart-render para gerar o grafico
$ bootchart-render /var/log/bootchat.tgz

O gráfico apresenta o kernel que esta sendo usado, serviços que estão sendo iniciados e o tempo que leva. Faça bom uso. Espero ter ajudado mais com esse post.

Interface Gráfica em 8 segundos no Arch Linux

Não você não leu errado o titulo do post, é EXATAMENTE isso que você leu. Carregar a interface gráfica em 8 SEGUNDOS desde a tela do GRUB até a tela do Gnome.
Há um tempo eu procurei muito como acelerar o boot do Arch Linux, comecei como a grande maioria começa, desabilitando serviços. Editando o /etc/rc.conf, mudando ordem de prioridade, colocando serviço pra começar em paralelo, mas tudo isso não mudava muito coisa, mesmo com com o boot em 20 segundos eu ainda achava lento. Foi então que eu encontrei, em forum italiano ou espanhol, o tal do finit-arc, um programa que substitui o INIT tradicional do Arch. Escrito em C e que carrega os serviços de forma assincrona. Mas o que me deixou mais entusiasmado era a promessa de uma interface gráfica em 5 segundos.
Confesso que nunca atingi os 5 segundos, mesmo porque nao me aprofundei tanto, pois o Arch foi deixado de ser usado no meu trabalho para dar lugar ao Debia, mas isso é outra história um dia eu a contarei, mas cheguei a conseguir 7 segundos usando um processador ATOM.
Que conclusão chegamos com isso? Não precisamos de um SUPER COMPUTADOR e nem MILHARES de GB-RAM para que o sistema inicie rápido, só precisamos de um bom inicializados.
Mas vamos deixar de papo e vamos por a mão na massa.
Passo 1: Instalar o finit-arc no Arch Linux.
#yaourt -Sy finit-arc

Passo 2: Ajustar o sistema para o funcionamento do finit-arc
Faça o backup dos rc.sysinit, menu.lst, /etc/fstab
#cp /etc/rc.sysinit /etc/rc.sysinit.bkp
#cp /etc/fstab /etc/fstab.bkp
#cp /boot/grub/menu.lst /boot/grub/menu.lst.bkp


Passo 3: Modificar /etc/rc.sysinit
Para que se consiga bootar mais rápido com o finit-arc é necessário substituir o conteudo do /etc/rc.sysinit pelo código abaixo
#!/bin/bash
#
# /etc/rc.sysinit
#
. /etc/rc.conf
. /etc/rc.d/functions
echo " "
printhl "Arch Linux - Speedup boot"
printsep
#**************************** WARNING ******************************
# If you're using initramfs for your kernel, uncomment steps 5 and 17
# To improve boot speed it's recommendend to make a static kernel
# without modules and without initramfs.
#
# MAKE STEP 2
# Type in a term from root: ls -l /dev | grep sda
# you'll receive the list of /dev/sda devices
# make your /dev/sda devices in step 2 like the example
#*******************************************************************
#
# STEP 1 - mount /proc, /sys and our RAM /dev
/bin/mount -n -t ramfs none /dev
/bin/mount -n -t proc none /proc
/bin/mount -n -t sysfs none /sys
#
# STEP 2 - make static sda nodes for start udevadm --settle in background
/bin/mknod /dev/sda b 8 0
/bin/mknod /dev/sda1 b 8 1
/bin/mknod /dev/sda2 b 8 2
/bin/mknod /dev/sda3 b 8 3
/bin/mknod /dev/sda4 b 8 4
#...5...6..etc..(from your fdisk -l)
#
# STEP 3 - copy static device nodes to /dev
/bin/cp -a /lib/udev/devices/* /dev/
#
# STEP 4 - enable rtc access
/sbin/modprobe rtc-cmos >/dev/null 2>&1
if [ -n "$RTC_MAJOR" ]; then
/bin/mkdir /dev/misc/
/bin/mknod /dev/misc/rtc0 c $RTC_MAJOR 0
/bin/ln -s /dev/misc/rtc0 /dev/rtc
fi
#
# STEP 5 - Load modules from the MODULES array defined in rc.conf
#if ! [ "$load_modules" = "off" ]; then
# if [ -f /proc/modules ]; then
# stat_busy "Loading Modules"
# for mod in "${MODULES[@]}"; do
# if [ "$mod" = "${mod#!}" ]; then
# /sbin/modprobe $mod
# fi
# done
# stat_done
# fi
# if [ -d /proc/acpi ]; then
# stat_busy "Loading standard ACPI modules"
# ACPI_MODULES="ac battery button fan processor thermal"
# k="$(echo $BLACKLIST ${MOD_BLACKLIST[@]} | /bin/sed 's|-|_|g')"
# j="$(echo ${MODULES[@]} | /bin/sed 's|-|_|g')"
# #add disabled MODULES (!) to blacklist - much requested feature
# for m in ${j}; do
# [ "$m" != "${m#!}" ] && k="${k} ${m#!}"
# done
# # add disablemodules= from commandline to blacklist
# k="${k} $(echo ${disablemodules} | /bin/sed 's|-|_|g' | /bin/sed 's|,| |g')"
# for n in ${ACPI_MODULES}; do
# if ! echo ${k} | /bin/grep "\" 2>&1 >/dev/null; then
# /sbin/modprobe $n > /dev/null 2>&1
# fi
# done
# stat_done
# fi
#fi
#
# STEP 6 - set hardware clock for fs check
{
HWCLOCK_PARAMS="--hctosys"
if [ "$HARDWARECLOCK" = "UTC" ]; then
HWCLOCK_PARAMS="$HWCLOCK_PARAMS --utc"
else
HWCLOCK_PARAMS="$HWCLOCK_PARAMS --localtime"
fi
if [ "$USEDIRECTISA" = "yes" -o "$USEDIRECTISA" = "YES" ]; then
HWCLOCK_PARAMS="$HWCLOCK_PARAMS --directisa"
fi
if [ -f /etc/localtime ]; then
/sbin/hwclock $HWCLOCK_PARAMS --noadjfile
fi
} &
#
echo > /proc/sys/kernel/hotplug
#
# STEP 7 - start udevadm trigger and udevd in background
{
if [ -x /sbin/udevadm -a -d /sys/block ]; then
stat_busy "Starting UDev Daemon"
/sbin/udevd --daemon &
/sbin/udevadm trigger &
stat_done
else
status "Using static /dev filesystem" true
fi
} &
#
# STEP 8 - start udevadm settle in background
/sbin/udevadm settle &
#
# STEP 9 - make lo interface
{
if [ -d /sys/class/net/lo ]; then
stat_busy "Bringing up loopback interface"
/sbin/ifconfig lo 127.0.0.1 up
if [ $? -ne 0 ]; then
stat_fail
else
stat_done
fi
fi
} &
#
# STEP 10 - mounting root read-only
status "Mounting Root Read-only" /bin/mount -n -o remount,ro / &
#
# STEP 11 - filesystem check
FORCEFSCK=
[ -f /forcefsck ] && FORCEFSCK="-- -f"
NETFS="nonfs,nonfs4,nosmbfs,nocifs,nocodafs,noncpfs,nosysfs,noshfs,nofuse,nofuseblk"
fsck_reboot() {
echo "Automatic reboot in progress..."
/bin/umount -a
/bin/mount -n -o remount,ro /
/sbin/reboot -f
exit 0
}
if [ -x /sbin/fsck ]; then
stat_busy "Checking Filesystems"
FSCK_OUT=/dev/stdout
FSCK_ERR=/dev/null
/sbin/fsck -A -T -C -a -t $NETFS $FORCEFSCK >$FSCK_OUT 2>$FSCK_ERR
fsckret=$?
if [ ${fsckret} -gt 1 ]; then
stat_fail
fi
if [ $((${fsckret}&2)) -eq 2 ]; then
echo
echo "********************** REBOOT REQUIRED *********************"
echo "* *"
echo "* The system will be rebooted automatically in 15 seconds. *"
echo "* *"
echo "************************************************************"
echo
/bin/sleep 15
fsck_reboot
fi
if [ ${fsckret} -gt 1 -a ${fsckret} -ne 32 ]; then
echo
echo "***************** FILESYSTEM CHECK FAILED ****************"
echo "* *"
echo "* Please repair manually and reboot. Note that the root *"
echo "* file system is currently mounted read-only. To remount *"
echo "* it read-write type: mount -n -o remount,rw / *"
echo "* When you exit the maintenance shell the system will *"
echo "* reboot automatically. *"
echo "* *"
echo "************************************************************"
echo
/sbin/sulogin -p
fsck_reboot
fi
stat_done
fi
#
# STEP 12 - remount root and mount local file system
stat_busy "Mounting Local Filesystems"
/bin/mount -n -o remount,rw /
/bin/rm -f /etc/mtab*
/bin/mount -o remount,rw /
if [ -e /proc/mounts ]; then
/bin/grep -e "/proc " -e "/sys " -e "/dev " /proc/mounts >> /etc/mtab
fi
/bin/mount -a -t $NETFS
stat_done
#
# STEP 13 - activating swap partition
status "Activating Swap" /sbin/swapon -a &
#
# STEP 14 - set urandom
{
RANDOM_SEED=/var/lib/misc/random-seed
if [ -f $RANDOM_SEED ]; then
stat_busy "Initializing Random Seed"
/bin/cat $RANDOM_SEED > /dev/urandom
stat_done
fi
} &
#
# STEP 15 - removing temp files
stat_busy "Removing Leftover Files"
/bin/rm -f /etc/nologin &>/dev/null
/bin/rm -f /etc/shutdownpid &>/dev/null
/bin/rm -f /var/lock/* &>/dev/null
/bin/rm -rf /tmp/* /tmp/.* &>/dev/null
/bin/rm -f /forcefsck &>/dev/null
(cd /var/run && /usr/bin/find . ! -type d -exec /bin/rm -f -- {} \; )
: > /var/run/utmp
/bin/chmod 0664 /var/run/utmp
/bin/mkdir /tmp/.ICE-unix && /bin/chmod 1777 /tmp/.ICE-unix
/bin/mkdir /tmp/.X11-unix && /bin/chmod 1777 /tmp/.X11-unix
stat_done
#
# STEP 16 - set rc.conf hostname
if [ "$HOSTNAME" != "" ]; then
status "Setting Hostname: $HOSTNAME" /bin/hostname $HOSTNAME &
fi
#
# STEP 17 - load modules depends
#status "Updating Module Dependencies" /sbin/depmod -A &
#
# STEP 18 - set lang
{
: >/etc/profile.d/locale.sh
/bin/chmod 755 /etc/profile.d/locale.sh
[ -z "$LOCALE" ] && LOCALE="it_IT@euro"
stat_busy "Setting Locale: $LOCALE"
echo "export LANG=$LOCALE" >>/etc/profile.d/locale.sh
stat_done
} &
#
# STEP 19 - Save our dmesg output from this boot
if [ -f /var/log/dmesg.log ]; then
/bin/rm /var/log/dmesg.log &
fi
/bin/dmesg > /var/log/dmesg.log &


Passo 4: Configurar /boot/grub/menu.lst
OBS. o Finit-arc não suporta aqueles UUID para as partições. VOCÊ deve usar o nome padrão usado no linux como /dev/sda1. Também altere o arquivo /etc/fstab
vim /etc/menu.lst
#(0) Arch Linux
title Arch Linux SpeedBoot
kernel /boot/vmlinuz26 root=/dev/sda2 ro vga=791 splash resume=/dev/sda1 init=/sbin/finit-arc
initrd /boot/kernel26.img


Passo 5: Alteração do /etc/fstab
O original deve estar mais ou menos assim:
UUID=24f28fc6-717e-4bcd-a5f7-32b959024e26 / ext4 defaults,noatime 0 1
UUID=03ec5dd3-45c0-4f95-a363-61ff321a09ff /home ext4 defaults,noatime 0 2
UUID=4209c845-f495-4c43-8a03-5363dd433153 swap swap defaults 0 0


Para algo parecido com o que segue abaixo(Claro que isso vai depender da sua configuração de partições):
#vi /etc/fstab

/dev/sda1 / ext4 defaults,noatime 0 1
/dev/sda2 /home ext4 defaults,noatime 0 2
/dev/sda3 swap swap defaults 0 0



Apartir daqui você terá o configurador do seu novo sistema de inicialização finit-arc em substituição ao antigo init

Passo 6: Edite/crie o arquivo /etc/finit.conf
O conteudo do finit.conf deve ser mais ou menos esse.
##Set user on "login_manager" if you want access
##in a console login manager or GDM,KDM
#user login_manager
#
##mountdevices before udev (DONT REMOVE IT!)
mountdev
#
##modules that you want load
#module intel_agp
#module agpgart
#
##filesystem device that you want check
check /dev/sda2
check /dev/sda3
#
##hostname
host arch_msdark
#
##startx command
startx /bin/bash --login -c /usr/bin/startx


Depois você pode verificar cada opção desse arquivo de como configura-lo

Passo 7: Crie/Edite o arquivo /usr/sbin/services.sh
#!/bin/sh
#
#Starts udev events
/sbin/udevd --daemon &>/dev/null &
/sbin/udevadm trigger &>/dev/null &
/sbin/udevadm settle &>/dev/null &
#
#Make swap (not for ssd)
/sbin/swapon -a &
#
#Starting background daemons
/etc/rc.d/syslog-ng start &>/dev/null &
/etc/rc.d/hal start &>/dev/null &
/etc/rc.d/laptop-mode start &>/dev/null &
/etc/rc.d/alsa start &>/dev/null &
/etc/rc.d/wicd start &>/dev/null &
/etc/rc.d/fam start &>/dev/null &
/etc/rc.d/klogd start &>/dev/null &
/etc/rc.d/crond start &>/dev/null &


Pronto. Agora reset seu PC e veja o ganho de velocidade.
Mais tarde faço um post sobre como configurar o bootchart para você verificar o ganho de velocidade
referência no forum em portugues e no forum original chileno

quarta-feira, outubro 14, 2009

Promoção ajude o ubuntu games a se manter no ar e concorra a 3

Promoção ajude o ubuntu games a se manter no ar e concorra a 3 camisas do blog defendendoolinux no dia 30/10, para participar é simples copie e cole todo esse texto entre aspas, preservando a formatação html no seu blog e deixe um comentario nesse link com o link para a sua postagem. Além disso o defendendoolinux fará uma doação em dinheiro ao projeto.

falha na compilação de kernel no debian lenny

Notei que quando se esta compilando o kernel 2.6.31 no Debian Lenny ocorre um erro estranho quase no final da compilação. No meu caso o erro foi esse daqui:
make[1]: Saindo do diretório `/usr/src/linux-2.6.31.1'
/usr/bin/make EXTRAVERSION=.1-intera ARCH=i386\ -C Documentation/lguest
make[1]: Entrando no diretório `/usr/src/linux-2.6.31.1/Documentation/lguest' cc -m32 -Wall -Wmissing-declarations -Wmissing-prototypes -03 -I../../include -I../../arch/x86/include -U_FORTIFY_SOURCE lguest.c -o lguest
lguest.c:21:25: error: sys/eventfd.h: Arquivo ou diretório não encontrado
lguest.c:37:18: error: zlib.h: Arquivo ou diretório não encontrado
lguest.c: In function create_thread:
lguest.c:1021: warning: implicit declaration of function eventfd
make[1]: **[lguest] Erro 1
make[1]: Saindo do diretorio `/usr/src/linux-2.6.31.1/Documentation/lguest'
make: ** [debian/stamp/build/kernel] Erro 2


Em outro site vi que a pessoa teve esse erro aqui:
cc -m32 -Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include -U_FORTIFY_SOURCE lguest.c -o lguest
lguest.c:21:25: error: sys/eventfd.h: No such file or directory
lguest.c: In function ‘create_thread’:
lguest.c:1021: warning: implicit declaration of function ‘eventfd’
make: *** [lguest] Error 1


A correção é simples. Basta fazer os passos abaixo.
#vim /usr/src/linux/Documentation/lguest/Makefile

E editar a seguinte linha
all: lguest


Para:
all:


Salvar e compilar seu kernel em paz.

Compilar kernel Debian Lenny criando .deb

Nesse post mostrarei como compilar o kernel Debian do modo Debian, criando o pacote .DEB para você distribuir pros seus amigos e não ter que ficar compilando máquina por máquina. Então vamos deixar de blablabla e começar a trabalhar.

Passo 1: Instalação dos pacotes necessário para compilação
#aptitude install kernel-package libncurses5-dev fakeroot wget bzip2 build-essential

Esses devem ser o suficiente mas por via das dúvidas coloque esses daqui também.
#aptitude install zlib-bin zlibc zlib1g-dev


Passo 2: Baixar, descompactar e criar link para kernel
Aqui iremos entrar no diretorio onde iremos baixar, descompactar e criar o link para o kernel para mais tarde compilá-lo.
#cd /usr/src
#wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.4.tar.bz2
#tar -xvvjf linux-2.6.31.4.tar.bz2
#ln -s linux-2.6.31.4 linux
#cd linux


Passo 3: Copiar o arquivo de .config do antigo kernel
Copiando o arquivo .config do antigo kernel podemos economizar algum tempo na configuração dele, mas nada impede de você modifica-lo totalmente.
#cp /boot/config-$(uname -r) .config


Passo 4: Configurar, melhorar, adicionar modulos ao kernel
Esse comando permitirá você modificar as configurações do kernel que você está compilando
#make menuconfig


Passo 5: Limpar o fonte para compilar em paz.
Primeiro devemos ter certeza que não existe lixo de uma possivel compilação que deu erro, para isso usamos o seguinte comando.
#make-kpkg clean


Passo 6: Agora vamos compilar o kernel criando os pacotes .DEB
#time make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers


Passo 7: Arquivos .DEB gerados
Verifique se os arquivos .DEB foram criados no seu diretório corrente.
#ls linux-*.deb

Se todos estiverem ai pronto, pode instar que tah tranquilo.

Passo 8: Instalar o novo kernel.
#dkpg -i linux-*.deb


Agora você pode reinicar seu sistema que estará com o novo kernel funcionando.
reboot


OBS1. Esse arquivo .DEB pode ser instalado em outras maquinas sem ter que fazer todos esses passos, basta que você use o comando #dkpg -i
OBS2. Quando eu compilei meu kernel eu tive um problema na compilação que me retornou um erro muito estranho. A correção para o erro você encontra AQUI

Referência: Guto Carvalho

terça-feira, outubro 13, 2009

mac address em python

Algumas pessoas vez ou outra precisam da informação do mac address da placa de rede para qualquer coisa. No meu caso é para simples criação de logs, onde o mac address e o serial são os identificadores da maquina. Fazer isso através do shellscript não é tão complicado, mas, eu pelo menos, não sou muito fã de como as coisas ficam "organizadas" no shell-script. Então podemos fazer praticamente tudo que o shell faz usando python.
Outro dia estava fuçando como fazer isso, já que minha caminhada em python começou a pouco tempo e eu ainda apanho um bocado, mas para "facilitar" ou disseminar o conhecimento colocarei abaixo as linhas de código que achei em um blog de um colega blogueiro.
Primeiramente em shell, poderiamos simplesmente usar um comando e editar a saida dele usando shell. Da seguinte forma:
$mac=$(ifconfig eth0) && mac=${mac:45:25} && echo $mac >> arquivo.txt

a saida no meu caso foi a seguinte:
00:24:00:b0:e7:00

Mas sinceramente isso não fica tão agradavel de se usar... Pelo menos não para mim...
Então podemos fazer um pequeno script em python um pouco mais trabalhoso organizado.

O script em python da mesma forma que o shell apresentará a mesma saida, porém as possibilidades são muito maiores do que se pode fazer.
00:24:00:b0:e7:00

OBS1. O script funciona bem em qualquer Linux. Para qualquer outro sistema você tem que saber qual modulo substitui o AF_PACKET.
OBS2. Você pode usar uma interpretação do comando ifconfig ou ipconfig no python como acontece no shell script mas isso não seria muito normal de se fazer.

Instalar Debian na pen-drive

Passei muito tempo atras de algo que me ensinasse a realmente instalar um Linux em uma pen-drive e não simplesmente colocar um live-CD na pendrive pra dar boot, não encontrei durante muito tempo, mas os problemas foram resolvidos antes de ontem. Então Disponibilizarei uma versão do tutorial que encontrei aqui. Infelizmente não é tãaaao bom quanto eu gostaria, mas já quebra um bom galho.
Bem, qual é a grande diferença de Instalar para rodar do pendrive. A diferença é que se eu instalar no pendrive eu posso instalar quantos programas mais eu quiser e se eu simplesmente rodar eu vou ter algo estatico no pendrive e isso é uma porcaria, sem que falar que rodar do pendrive usar vfat como sistema de arquivo. e instalado usar EXT* nesse caso...
Enfim, vamos ao que interessa que é como Instalar o Debian na pendrive.
Primeiramente você tem que ter o Debian instalado, por falta de tempo não testei se funciona no Arch e/ou no Ubuntu, e fazer os seguintes passos:

OBS. Você deve ajustar alguns arquivos depois de inicializar seu pendrive, entre eles encontram-se:

  • Edite o arquivo /etc/hostname e altere o nome da máquina.

  • Edite o arquivo /etc/hots e utilize, nos locais adequados, o mesmo nome inserido em /etc/hostname.

Qualquer duvida ou questionamento os post estão ai e meu e-mail também ou meu skype demetrius.albuquerque .