segunda-feira, 30 de julho de 2012

Wake on lan e auto shutdown

Wake on lan e auto shutdown

Auto shutdown

O autoshutdown é simples, basta colocar o comando no crontab, mas esqueço-me sempre que os comandos no crontab precisam do caminho completo, porque a PATH é mais limitada.
Basta editar (como root) o crontab com:

crontab -e

E acrescentar uma linha do tipo:

00 03 * * * /sbin/shutdown -h +5

Isto vai fazer com que o computador se desligue às 3:05 da manhã, dando um aviso com 5 minutos de antecedência.

Wake on LAN

O Wake on LAN não é uma opção muito segura. Apesar de haver extensões ao protocolo original que acrescentam autenticação, o WOL original é muito inseguro. Mesmo assim pode dar jeito em casa :)
O computador deve ser configurado na BIOS para suportar o Wake on LAN. Nem todas as BIOS o suportam, nem todas as interfaces de rede o suportam e a forma como aparece na BIOS pode ser muito variada. Pode aparacer mesmo como "Wake on LAN" ou "Wake on PCI event" ou "Wake on PCI-E event" ou qualquer coisa parecida.
Mesmo assim pode ainda não ser suficiente para que o WOL funcione. O sistema operatvo também tem de colaborar. No Windows isso faz-se nas propriedades avançadas da interface de rede. No linux faz-se com o ethtool.
Para verificar se a interface de rede suporta Wak on LAN basta executar (como root):

ethtool eth0|grep Wake

Se não aparecer nada significa que a interface não suporta WOL.
Para assegurar que o linux habilita o WOL criei um script em /etc/network/if-ip.d/wolenable, com o seguinte conteúdo:

#!/bin/sh
ethtool -s eth0 wol g

Não esquecer de tornar o script executável com:

chmod +x /etc/network/if-up.d/wolenable

Para que o script seja executado é preciso adicionar uma linha à configuração da interface de rede em /etc/network/interfaces:

auto eth0
iface eth0 inet dhcp
    post-up /etc/network/if-up.d/wolenable

Isto vai executar o script cada vez que a interface eth0 seja iniciada (a linha nova está a negrito).
Depois é só uma questão de a partir de outra máquina (no mesmo domínio de broadcast) executar:

wakeonlan 01:23:45:67:89:ab

Substituindo o 01:23:45:67:89:ab pelo MAC address da máquina, claro.

sexta-feira, 27 de julho de 2012

Instalar o Debian por PXE

Instalar o Debian por PXE

A documentação do Debian, mas por vezes está um pouco desatualizada, como é o caso, por isso aqui fica um guião para instalar o Debian 6 por PXE.
Para instalar por PXE é preciso:


  1. Que o cliente esteja definido para arrancar por rede
  2. Um servidor de PXE com:
    1. Servidor DHCP corretamente configurado
    2. Servidor TFTP corretamente configurado
    3. Os ficheiro de arranque do Debian colocados no sítio certo.


1. Definir o arranque por rede

É preciso aceder à configuração da BIOS e definir o arranque por rede (ou PXE, ou LAN, ou ...). às vezes é mais complicado que que parece. Em algumas motherboards é preciso ativar a placa de rede e ou o arranque por PXE e depois reiniciar e voltar a entrar nas configurações da BIOS e só então aparece o arranque por LAN como opção de arranque. Caso o equipamento não suporte mesmo  arranque por LAN, ainda assim é possível criar uma disquete com o http://rom-o-matic.net/ (o guião fica para outro dia).


2. Servidor PXE

Para fazer o arranque por PXE é necessário configurar os serviços de DHCP e TFTP (há outras opções, usando BOOTP ou RARP, mas DHCP+TFTP é o mais simples e eficaz). Não é necessário que os dois serviços estejam na mesma máquina, nem que sejam linux, mas é mais fácil se estiverem. Aqui vou usar o próprio Debian 6 para fazer um servidor de PXE.

2.1. Instalar e configurar o DHCP

O pacote recomendado é o isc-dhcp-server:
apt-get install isc-dhcp-server
A configuração é feita no ficheiro /etc/dhcp/dhcpd.conf.
Coloquei o seguinte conteúdo:

ddns-update-style none;


option domain-name "lan";
option domain-name-servers 208.67.222.222, 208.67.220.220;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "pxeserver";
allow booting;
allow bootp;
authoritative;



subnet 192.168.13.0 netmask 255.255.255.0 {
  range 192.168.13.20 192.168.13.100;
  option routers 192.168.13.254;
  option broadcast-address 192.168.13.255;
  option domain-name-servers 208.67.222.222;
}

subnet 192.168.1.0 netmask 255.255.255.0 {
}

group {
  host tftpclient {
    hardware ethernet 08:00:27:FA:3B:A2;
    filename "/pxelinux.0";
  }
}

2.2. Servidor TFTP corretamente configurado

O servidor de TFTP é o tftpd-hpa, embora haja outros.
apt-get install tftpd-hpa
E em princípio não é preciso mais nada. O TFTP deve ficar instalado e a funcionar. A diretoria que vai usar é a /srv/tftp. Portanto os ficheiros deve ser aí colocados.

2.3. Colocar os ficheiro de arranque do Debian

O CD de arranque do Debian contém um ficheiro netboot/netboot.tar.gz. Apenas é preciso descompactar este ficheiro na diretoria do TFTP (/srv/tftp).
Referências
http://www.debian.org/releases/stable/i386/ch04s05.html.pt
http://wiki.debian.org/DHCP_Server
http://http.us.debian.org/debian/dists/squeeze/main/installer-i386/current/images/netboot/

Partilhar ligação de internet

Partilhar a ligação de internet

Colocar uma máquina linux a partilhar a ligação de internet (desde que tenha pelo menos duas placas de rede, claro), é relativamente simples.
Aqui ficam as instruções para referência futura. Assume-se que wlan0 liga à internet e que eth0 liga à intranet.

Ligar o sistema de NAT (masquerade) na interface de ligação ao exterior:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Aceitar pedido de encaminhamento proveniente da interface "interior":
iptables -A FORWARD -i eth0 -j ACCEPT

Habilitar o forwarding para IPv4:
sysctl -w net.ipv4.ip_forward=1

Atribuir um endereço à interface externa. Este passo não é necessário de a interface já tiver um endereço.
ifconfig eth0 10.0.0.254/24

Reiniciar o serviço de rede:
/etc/init.d/networking restart

segunda-feira, 23 de julho de 2012

Desligar (spindown) os discos automaticamente

Desligar (spindown) os discos automaticamente

Esta dica funciona melhor em sistemas com mais de um disco rígido (por exemplo, um homeserver, como é o meu caso) ou num portátil.
A ideia é arranjar maneira de desligar o motor dos discos rígidos quando estes não estão a ser usados. Poupa-se energia, pois o disco consome menos com o motor desligado obviamente e pode prolongar-se o tempo de vida do disco. Para prolongar o tempo de vida do disco é preciso definir um tempo espera generoso antes de fazer o spindown, pois demasiados ciclos de desligar e reiniciar o motor vão ter o efeito contrário, isto é, diminuir o tempo de vida do disco.
Assim, vou usar 30 minutos como tempo recomendado.
Há um projeto aqui http://code.google.com/p/spindown/ de um daemon que faz exatamente o que se pretende, mas eu quero uma solução mais "caseira", que assente mais em bash e que não seja preciso andar a compilar código.
Vou usar Debian para este projeto, pois ando desanimado com o Ubuntu. Está cada vez mais parecido ao Windows.
É preciso executar todos os comandos como root.

1. Instalar o sg3-utils

apt-get install sg3-utils
O pacote sg3-utils tem o comando sg_start que podemos usar para parar o motor do disco.
Aparentemente também se pode fazer com o sdparm e com o hdparm, mas ainda não experimentei.

2. Criar um script

Criei um script em /root/bin/spindown.sh com o seguinte conteúdo:

# !/bin/sh
if [ "$(id -u)" != "0" ]; then
        echo "This script must be run as root" 1>&2
        exit 1
fi
if [ -z $1 ]; then
        echo Usage: $0 sdX
        exit 1
fi
# isto estava a causar alguns problemas, por enquanto fica desligado
#if ! [ -e /dev/$1 ]; then
#        echo /dev/$1 not found
#        exit 1
#fi
NEWFILE=/tmp/NewState.$1
OLDFILE=/tmp/OldState.$1
date +"%F %T"
# Get new state from diskstats
NEWstate=$(cat /proc/diskstats | grep $1)
echo $NEWstate > $NEWFILE

if [ -z $(diff OLDstate.txt NEWstate.txt) ]; then
        echo Stopping $1...
        # sdparm --flexible --command=stop /dev/$1 &>/dev/null
        sg_start --stop /dev/$1
else
        echo $1 active
fi



# Write current state to file
echo $NEWstate > $OLDFILE

Não esquecer de ligar o bit executável no ficheiro:
chmod +x spindown.sh

3. Adicionar ao crontab

Adicionar ao crontab a linha:
*/30 * * * * /root/bin/spindown.sh sdc
Deve ser adicionada uma linha por cada disco que se pretende controlar, mudando o 'sdc' de acordo com o disco, claro.

Como o script faz algumas verificações antes de ser executado, deve ser seguro de executar na linha de comandos para testes (sem garantias...),
Não é uma solução muito elegante, mas é relativamente simples.

Referências