Sacix 2.0 (Jaguatirica)

Transcrição

Sacix 2.0 (Jaguatirica)
Sacix 2.0
(Jaguatirica)
Guia de Implementação
Autores:
Eduardo Costa Lisboa
[email protected]
Kung te Yang
[email protected]
Setembro / 2005
Introdução
Esta documentação tem por fim explicar, passo a passo, como transformar um Debian
Sarge em um Sacix 2.0. O Sacix é uma personalização do Debian GNU/Linux 3.0r0a (Sarge), feita
pela Equipe de Desenvolvimento de Soluções Livres da Prefeitura de São Paulo, hoje composta por
Eduardo Costa Lisboa – [email protected] e Kung te Yang –
[email protected].
Para acompanhar este guia é necessário ter conhecimentos básicos de Linux, em especial,
da distribuição Debian. Recomenda­se também noções de estruturas redes, compilação do kernel e
hardware. Este guia é direcionado para pessoas que queiram aprender a desenvolver um ambiente de
servidor de aplicações com thin clients. Apesar de ser baseado em Debian, pode ser facilmente
aplicado a qualquer distribuição Linux, desde que se tenha o conhecimento adequado na
configuração dos softwares envolvidos. Os tópicos abordados são:
1. Criação de uma raiz para o thin client
11. Criando os usuários
2. Configuração da raiz do thin client
12. Utilizando autenticação automática através de
chaves RSA
3. Compilação do kernel do thin client
4. Preparação do ambiente de boot PXE
13. Configuração do X Window System do thin
client
5. Instalação e configuração dos serviços
14. Configurando a sessão gráfica do usuário
básicas de rede:
15. Instalando programas gráficos
5.1 Configuração do servidor DHCP
16. Configurações globais via Gconf
5.2 Configuração do servidor TFTP
17. Acesso a dispositivos remotos
5.3 Configuração do servidor NFS
18. Suporte a som nos thin clients
5.4 Editando o arquivo hosts
19. Bootsplash
6. Primeiro boot
20. Scripts desenvolvidos e personalizações
7. Compilação do kernel do servidor
21. Agradecimentos
8. Serviços do thin client
22. Apêndice
9. Reconfigurando os compartilhamentos
10. Login automático com o programa agetty
1. Criação de uma raiz para o thin client
A raiz do thin client nada mais é que um sistema básico, com o mínimo necessário para o
thin client iniciar o boot e montar os diretórios via NFS no servidor. No caso do Sacix, o thin client
monta os diretórios /bin, /sbin, /lib e /usr logo após montar a raiz, especificados no arquivo
fstab. Os diretórios /tmp e /var são criados antes usando o sistema de arquivos ramfs.
Diretórios pertencentes à raiz do diretório /var também são criados durante a inicialização, bem
como alguns arquivos no diretório /tmp. Para criar o sistema inicial, será utilizado o comando
debootstrap, disponível no pacote também chamado debootstrap. Para instalar o pacote
debootstrap, basta o comando :
# aptitude install debootstrap
Após a instalação, deve­se digitar o comando:
# debootstrap sarge /opt/sacix/root http://ftp.us.debian.org/debian
A instalação do debootstrap demora um pouco para terminar, pois instala todos os pacotes
necessários para se criar uma raiz básica do Debian, baixando­os do repositório especificado. Para
uma instalação mais rápida, é recomendado ter um mirror local que contenha pelo menos os pacotes
que serão usados para a a instalação do sistema básico. Também pode­se excluir alguns pacotes da
lista de instalação com o parâmetro ­­exclude=pacote1,pacote2.
2. Configuração da raiz do thin client
Com o sistema básico já instalado, o sistema deve ser configurado para que se torne
inicializável. Para isso, deve­se usar o comando chroot para entrar na raiz deste:
# cp /etc/apt/sources.list /opt/sacix/root/etc/apt/sources.list
# mount ­t proc chroot­proc /opt/sacix/root/proc
# chroot /opt/sacix/root
Dentro do ambiente de chroot pode­se fazer (quase) tudo, como se fosse um sistema
comum. Pode­se instalar e remover programas através do comando aptitude, instalar e iniciar
serviços e até mudar algumas configurações, como o endereço IP da rede.
Será criado agora o arquivo fstab, que será usado para montar o sistema de arquivos raiz
via NFS e o sistema de arquivos virtual procfs; este pertimirá às aplicações locais do thin client se
comunicarem com seu kernel. É importante notar que, já na configuração do ambiente PXE, existe
um parâmetro passado para o kernel informando­o para montar a raiz via NFS. Mas, especificando­
a no arquivo fstab, é possível adicionar diversas opções de montagem, a fim de otimizar o
desempenho ou aumentar a segurança da mesma. O arquivo que deverá ser criado é bem simples.
Basta inserir as seguintes linhas:
­­ /opt/sacix/root/etc/fstab
192.168.0.1:/opt/sacix/root
/
proc
/proc
­­ EOF
nfs
proc
rw,sync,rsize=8192,wsize=8192 0 0
defaults
0 0
Deve­se definir uma senha para o usuário root com o comando
# passwd root
3. Compilação do kernel do thin client
Para compilar o kernel do thin client, é necessário fazer o download do arquivo
http://http://ck.kolivas.org/patches/2.6/2.6.11/2.6.11­ck10/patches.tar.bz2 e extrair o patch
supermount­ng208­2611.diff. Este patch é utilizado no thin client para que não seja
necessário montar os volumes dos dispositivos como é feito normalmente no Linux. O acesso torna­
se direto e instantâneo e o volume é desmontado logo após seu uso. A seguir, instruções de como
aplicar o patch no kernel:
# tar xjvfp patches.tar.bz2 patches/supermount­ng208­2611.diff –­strip­path=1
# tar xjvfp linux­2.6.11.12.tar.bz2
# cd linux­2.6.11.12
# patch ­p1 < ../supermount­ng208­2611.diff # make menuconfig
Na configuração do kernel, as seguintes opções devem ser habilitadas:
Code maturity level option ­­­>
[*] Prompt for development and/or incomplete code/drivers
Device Drivers ­­­>
[*] Networking support ­­­>
Networking options ­­­>
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
File systems ­­­>
Pseudo filesystems ­­­>
<*> Supermount removable media support
Network File Systems ­­­>
<*> file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
Se o os thin clients forem compostos de equipamentos de hardware distintos entre si,
recomenda­se compilar um kernel mais modular, como drivers de som, USB, etc. Entretanto, se o
hardware for homogêneo, um kernel compilado com suporte built­in ao hardware funcionará sem
problemas. Após a configuração, a seguinte seqüência de comandos deve ser executada:
# make all
# make modules_install
Posteriormente, será explicado como deverá ser instalada a imagem do kernel na raiz do
thin client.
4. Preparação do ambiente de boot PXE
O Sacix usa o sistema de boot PXE, um padrão definido pela Intel e Microsoft na
especificação PC99. PXE signfica “Pre boot eXecution Environment”, e na prática determina como
deve funcionar um boot via rede: o servidor DHCP oferece para o thin client um endereço de rede
IP e mais dois parâmetros: o endereço do servidor TFTP e o nome do arquivo contendo a imagem
inicial de boot, o bootloader. Este bootloader, por sua vez, pode carregar o kernel ou fazer uma
nova consulta ao servidor DHCP. No caso do bootloader etherboot, uma nova consulta pelo
parâmetro filename é feita, mas o bootloader oferece uma seqüência de caracteres chamada
“Etherboot”. Esta seqüência de caracteres usada pelo thin client para identificação junto ao servidor
DHCP é chamada “vendor­class­identifier”. Quando a primeira consulta é feita e o bootloader é
oferecido, seu conteúdo é “PXEClient”. Exemplos de bootloader que funcionam com o padrão de
boot PXE: GRUB, etherboot, pxelinux, NILO.
No Sacix, o pxelinux é o bootloader padrão. Este é baseado no syslinux, utilizado para
carregar sistemas Linux a partir de disquetes formatados como FAT12 e que contenham um
cabeçalho de boot compatível com o sistema operacional MS­DOS. Mais informações sobre o
pxelinux podem ser encontradas em http://syslinux.zytor.com/pxe.php. A seguinte árvore deve ser criada para o ambiente de boot do pxelinux:
# mkdir ­p /opt/sacix/boot/pxelinux.cfg
O ambiente PXE é composto pelos seguintes ítens:
●
arquivo de configuração padrão: default
●
kernel compilado do thin client
●
arquivo pxelinux.0
Após a criação da árvore, deve­se criar o arquivo default dentro do diretório
pxelinux.cfg com o seguinte conteúdo:
­­ /opt/sacix/boot/pxelinux.cfg/default
prompt=0
label linux
kernel vmlinuz­2.6.8­client
append ip=dhcp root=/dev/nfs nfsroot=192.168.0.1:/opt/sacix/root rw
­­ EOF
Após ter sido criado o arquivo, é preciso copiar o kernel para o ambiente de boot PXE:
# cp /usr/src/linux­2.6.11.12/arch/i386/boot/bzImage /opt/sacix/boot/vmlinuz­
2.6.11.12­client
O último item necessário é o arquivo pxelinux.0, disponível no pacote syslinux do
Debian. Pode­se extrai­lo da seguinte maneira:
# aptitude ­d install syslinux
# cd /var/cache/apt/archives/
# ar x syslinux_2.11­0.1_i386.deb data.tar.gz
# tar xzf data.tar.gz –strip­path=4 ./usr/lib/syslinux/pxelinux.0
# mv pxelinux.0 /opt/sacix/boot/
Este arquivo é o responsável pelo bootstrap do cliente PXE, que irá ler o arquivo
default e carregar o kernel especificado.
Caso o dispositivo de rede do thin client não seja compatível com o padrão de boot PXE
2.0, é possível usar o etherboot como bootloader. Para isso, é necessário seguir os passos abaixo:
●
instalar no kernel do thin client o bootloader etherboot
●
editar o arquivo dhcpd.conf para referenciar o novo kernel
Para instalar o etherboot no kernel, é necessário instalar o pacote mknbi, que contém o
programa necessário para tal tarefa:
# aptitude install mknbi
Após instalar o pacote, o seguinte comando deverá ser executado:
# mkelf­linux ­­root=/opt/sacix/root ­­ip=rom /usr/src/linux­
2.6.11.12/arch/i386/boot/bzImage > /opt/sacix/boot/2.6.11.12­cliente.etb
O último passo é alterar a linha “filename” do arquivo dhcpd.conf para usar o novo
kernel:
­­ /etc/dhcp3/dhcpd.conf
...
filename "/2.6.11.12­cliente.etb";
...
­­ EOF
5. Instalação e configuração dos serviços básicos de rede
5.1 Configurando o servidor DHCP
O servidor DHCP é o primeiro serviço necessário para oferecer o ambiente PXE (ou o
etherboot) para o thin client. Além de oferecer um endereço IP, também é responsável por apontar o
endereço do servidor TFTP e também o arquivo a ser baixado de lá; além de também especificar o
caminho da raiz a ser montada pelo thin client. Instale o pacote para o servidor com o comando
abaixo:
# aptitude install dhcp3­server
Além da configuração padrão do servidor DHCP, algumas linhas precisam ser inseridas
para que ele possa oferecer ao thin client as informações necessárias. Segue abaixo um exemplo do
arquivo dhcpd.conf:
­­ /etc/dhcp3/dhcpd.conf
...
option root­path
filename
...
­­ EOF
“192.168.0.1:/opt/sacix/root”;
“/pxelinux.0”
A seguir, uma breve explicação sobre as linhas necessárias ao boot do thin client:
●
a linha root­path indicará o caminho da raiz e deve ser o mesmo que será exportado via NFS
mais tarde;
●
A linha filename deve apontar para o arquivo pxelinux.0 exatamente abaixo da raiz do
servidor TFTP, que será configurado a seguir;
●
o range deve conter um intervalo de vinte máquinas de maneira que o script shell que irá
verificar o IP possa calculá­lo para definir qual usuário será utilizado para o login via SSH.
O Sacix, entretanto, está configurado para atribuir um endereço de IP fixo para cada um
dos vinte thin clients. Segue abaixo um exemplo da configuração necessária:
­­ /etc/dhcp3/dhcpd.conf ...
ignore unknown clients; ...
group { host ecidadania1 { hardware ethernet 00:01:02:03:04:05; fixed­address 192.168.0.11; option host­name "ecidadania1"; } }
...
­­ EOF
Nota: caso o ambiente contenha tanto máquinas compatíveis com a versão 2.0 do PXE
quanto máquinas mais antigas, incompatíveis com esta versão e que precisem do kernel etherboot,
é possível permitir que ambos os tipos inicializem, inserindo a linha filename adequada em cada
seção "host ecidadaniaX", mencionando o kernel adequado a ser transferido.
5.2 Configurando o servidor TFTP
O servidor TFTP (Trivial File Transfer Protocol) é o que irá transferir ao thin clients os
arquivos pxelinux.0 e o kernel. Existem diversos servidores TFTP disponíveis no repositório
Debian e optamos por utilizar o contido no pacote atftpd:
# aptitude install atftpd
O arquivo de configuração do ATFTPD pode ser encontrado no apêndice da
documentação. A seguir, uma descrição mais detalhada das configurações do servidor:
●
Optamos por não utilizar o inetd;
●
definimos 5 segundos (valor padrão) para o tempo máximo de espera da conexão;
●
definimos também o modo “verbose” como “0”;
●
por último, utilizamos a opção “logfile” para que o atftpd salve seus logs em um arquivo
separado para não poluir o arquivo syslog.
5.3 Servidor NFS
O servidor NFS exportará a raiz e posteriormente alguns diretórios do servidor com
programas e bibliotecas que serão utilizados pelos thin clients.
# aptitude install nfs­kernel­server
Após a instalação, deve ser criado o arquivo exports com o seguinte conteúdo inicial:
­­ /etc/exports
/opt/sacix/root 192.168.0.0/24(rw,no_root_squash,sync)
­­ EOF
Este conteúdo é suficiente para fazer o primeiro teste de boot do thin client. Entretanto, um
exemplo mais complexo estará disponível mais à frente.
Depois de configurados todos os serviços, já é possível ligar o thin client pela primeira vez.
Os serviços dhcpd, atftpd, portmap e nfs­kernel­server devem estar ativos para que o
thin client possa iniciar com sucesso.
# for service in dhcp3­server atftpd portmap nfs­kernel­server
> do
> /etc/init.d/$service start
> done
5.4 Editando o arquivo hosts
No telecentro, utilizamos um padrão para nomear os thin clients, que é o de utilizar como
hostname o nome do usuário que efetuará o login automático. Portanto, o thin client que tiver o IP
192.168.0.11 será chamado de ecidadania1 e assim por diante. É possível definir todos os vinte
nomes através do seguinte comando no servidor:
# for i in $(seq 1 20)
> do
> echo 192.168.0.$(($i+10)) ecidadania$i >> /etc/hosts
> done
6. Primeiro boot
O primeiro boot serve apenas para testar os serviços já configurados e a conectividade
inicial entre o servidor e os thin clients. Entretanto, pode servir também para executar tarefas em
modo texto que não são possíveis no modo chroot, como verificar a memória, qual o endereço IP da
máquina e o tempo de resposta do servidor através de comandos como ping e ssh.
Também é possível fazer um diagnóstico do comportamento do sistema através do estudo
das mensagens geradas pelo sistema, disponíveis no diretório log:
# cd /var/log/
# more dmesg
# more messages
# more syslog
7. Compilação do kernel do servidor
O kernel do servidor é o 2.4.31. Escolhemos um kernel da já antiga série 2.4 por conter um
patch chamado fairsched. Este patch muda o agendamento dos processos do kernel, de maneira que
a distribuição do processamento seja mais justa entre os usuários; assim, um único usuário com
muitos processos em execução não monopoliza o tempo de processamento do servidor, evitando
assim prejudicar todos os outros. O patch mais recente disponível na Internet para download é para
a versão 2.4.27 do kernel. Mais informações sobre este patch podem ser encontradas em:
http://fairsched.sourceforge.net/.
O patch para a versão 2.4.31 do kernel pode ser encontrado no apêndice da documentação.
Para aplicá­lo, deve­se proceder da seguinte maneira:
# tar xjfp linux­2.4.31.tar.bz2
# cd linux­2.4.31
# gzip ­d < ../2.4.31.fairsched.diff.gz | patch ­p1
Ao compilar o kernel algumas opções mínimas devem ser selecionadas para que o servidor
funcione corretamente em rede:
Code maturity level options
[*] Prompt for development and/or incomplete code/drivers
General setup
[*] Fair scheduler
Networking options
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
File systems
Network File Systems
<*> NFS server support
[*] Provide NFSv3 server support
Poderemos agora utilizar o pacote kernel­package para compilar e criar um pacote do
kernel que iremos utilizar:
# aptitude install kernel­package
# make­kpkg ­­revision <numero_da_revisao> modules_image kernel_image
# cd ..
# dpkg ­i kernel­image­2.4.31­fairsched_<numero_da_revisao>_i386.deb
Instalado o pacote, recomenda­se por precaução revisar as linhas relacionadas ao novo
kernel no arquivo de configuração do bootloader utilizado, seja GRUB ou LILO. Em seguida, um
boot com o novo kernel para testá­lo servindo o sistema a um thin client.
8. Serviços do thin client
No Sacix, o processo de boot do thin client executa as seguintes tarefas:
•
monta os sistemas de arquivos remotos e virtuais;
•
ativa a detecção de hardware (hotplug);
•
inicia o servidor SSH;
•
inicia o servidor de som ESD;
•
gera um pequeno relatório do hardware;
•
inicia o processo de login automático
Durante o login automático, algumas tarefas são executadas, que serão descritas mais tarde.
A montagem dos sistemas de arquivos e a detecção de hardware são executados antes do processo
init iniciar o runlevel padrão. O servidor SSH, o ESD e o relatório de hardware são executados
no runlevel padrão, e por fim temos o processo de login automático.
A montagem dos sistemas de arquivos remotos e virtuais já deverá estar funcionando,
como testado antes. A raiz criada via debootstrap já nos fornece, por padrão, este recurso.
Há um script que criamos para poder utilizar os diretórios /tmp e /var montados em um
sistema de arquivos ramfs. Isto porque todos os compartilhamentos remotos são montados como
somente­leitura. Este script chama­se mkvar e é iniciado durante o boot, antes de o sistema iniciar
o runlevel padrão. O script pode ser encontrado no apêndice da documentação.
O diretório /var da raiz do thin client é um link para o diretório /tmp. Como não será
necessário mais utilizar o ambiente de chroot para fazer manutenção na raiz do thin client, pode­se
apagá­lo:
# rm ­rf /opt/sacix/root/var
# ln ­s /tmp /opt/sacix/root/var
O serviço hotplug deverá ser habilitado. No Sacix, utilizamos a configuração padrão,
portanto basta copiar a configuração do servidor para a raiz do thin client, bem como seu próprio
script:
# cp /etc/init.d/hotplug /opt/sacix/root/etc/init.d
# cp ­a /etc/hotplug* /opt/sacix/root/etc
O mesmo feito anteriormente com o script do hotplug pode ser feito com o do SSH:
# cp /etc/init.d/ssh /opt/sacix/root/etc/init.d
# cp ­a /etc/ssh /opt/sacix/root/etc
O próximo passo é criar os links nos diretórios rcS.d e rc2.d da raiz do thin client:
# cd /opt/sacix/root/etc/rcS.d
# rm *
# ln ­s ../init.d/mountvirtfs S02mountvirtfs
# ln ­s ../init.d/mountall.sh S03mountall.sh
# ln ­s ../init.d/mkvar S04mkvar
# ln ­s ../init.d/ifupdown­clean S07ifupdown­clean
# ln ­s ../init.d/ifupdown S08ifupdown
# ln ­s ../init.d/networking S09networking
# ln ­s ../init.d/mountnfs.sh S10mountnfs.sh
# ln ­s ../init.d/hotplug S11hotplug
# cd /opt/sacix/root/etc/rc2.d
# rm *
# ln ­s ../init.d/ssh S01ssh
# rm /opt/sacix/root/etc/{mtab,host{s,name}}
# ln ­s /tmp/hosts /opt/sacix/root/etc/hosts
# ln ­s /tmp/mtab /opt/sacix/root/etc/mtab
# ln ­s /tmp/hostname /opt/sacix/root/etc/hostname
9. Reconfigurando os compartilhamentos
Com o boot do thin client funcional, já é possível testar o compartilhamento dos programas
e das bibliotecas da raiz do servidor. No arquivo fstab do thin client, as seguintes linhas devem
ser adicionadas:
­­ /opt/sacix/root/etc/fstab
...
192.168.0.1:/bin /bin nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/sbin /sbin nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/usr /usr nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/lib /lib nfs nolock,exec,rsize=8192,ro 0 0
...
­­ EOF
Por segurança, todos os compartilhamentos remotos devem ser montados como somente­
leitura. Os únicos lugares onde o thin client poderá gravar serão os diretórios /tmp e /var, sendo
que /var é um link para /tmp.
No arquivo exports, as seguintes linhas devem ser adicionadas:
­­ /etc/exports
...
/opt/sacix/root 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
/bin 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
/sbin 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
/lib 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
/usr 192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
...
­­ EOF
Ao reiniciar o thin client, os novos compartilhamentos devem estar funcionando. Isto pode
ser verificado com o comando mount e também ao tentar utilizar algum comando não existente na
raiz do thin client, como o ssh.
10. Login automático com o programa agetty
A raiz do thin client precisará ser configurada para efetuar o login automático do usuário
root. Para isso, é necessário fazer três coisas:
●
compilar e instalar o programa agetty
●
compilar e instalar o programa autologin
●
alterar o arquivo fstab do thin client
Compilação e instalação do programa agetty
Para compilar o agetty, é preciso copiar os arquivos agetty.c e Makefile do site
http://cvs.uclinux.org/cgi­bin/cvsweb/uClinux­dist/user/agetty/. Uma vez copiados, basta compilar o
programa com o comando make e copiar o binário gerado para o diretório /usr/local/sbin
do servidor, como no exemplo abaixo:
# make
# cp agetty /usr/local/sbin
Compilação e instalação do programa autologin
É necessário também compilar um programa binário que será executado pelo comando
agetty. No Sacix, utilizamos o nome genérico de autologin. Este programa pode ser
encontrado em vários lugares na Internet e, talvez por ser muito pequeno, não tem nenhum dono
conhecido. Seu código fonte está disponível no apêndice da documentação.
Para compilar, utiliza­se o comando gcc:
# gcc ­o /usr/local/sbin/autologin autoclogin.c
Feito isto, é necessário editar o arquivo inittab do thin client para que utilize o
agetty em vez do getty:
­­ /opt/sacix/root/etc/inittab
...
1:23:respawn:/usr/local/sbin/agetty ­n ­l /usr/local/sbin/autologin 38400 tty1
...
­­ EOF
Nota: o arquivo inittab completo poderá ser encontrado no apêndice da documentação.
11. Criando os usuários
Os usuários criados não têm senha definida e seu grupo padrão é o users. Os seguintes
comandos devem ser executados para criar todos os vinte usuários com este padrão:
# rm ­rf /etc/skel/* /etc/skel/.[^.]*
# for i in $(seq 1 20)
> do
> adduser ­­quiet ­­gecos "" ­­ingroup users ­­disabled­password ecidadania$i
> done
12. Utilizando autenticação automática através de chaves RSA
A autenticação de chaves via SSH permite que um usuário se conecte ou execute
comandos em outras máquinas sem a necessidade de digitar a senha. São utilizadas duas chaves: a
pública, que será distribuida às máquinas que se deseja conectar e a privada, que ficará no diretório
pessoal do usuário.
As chaves são relacionadas da seguinte maneira: a chave pública contém o algoritmo de
encriptação da sessão SSH. Já a chave privada contém o algoritmo de desencriptação desta sessão.
Somente o detentor da chave privada poderá desencriptar a sessão e se comunicar com o servidor.
Para gerar o par de chaves RSA pública e privada, usa­se o seguinte comando:
$ ssh­keygen ­t rsa ­N "" ­f ~/.ssh/id_rsa
Com este comando, são gerados no diretório .ssh, dentro do diretório pessoal do usuário,
os arquivos id_rsa e id_rsa.pub que são, respectivamente, as chaves privada e pública.
Uma vez geradas as chaves, é necessário copiá­las para os usuários que deverão aceitar a
autenticação automática. No Sacix, utilizamos dois tipos de autenticação automática: do usuário
root do thin client para os usuários ecidadania1 até ecidadania20 e dos usuários ecidadania para o
usuário root de cada thin client.
Na autenticação automática do usuário root para os usuários ecidadania, nós
automatizamos o processo de executar a sessão gráfica do GNOME, dispensando assim o uso de um
autenticador gráfico, como o GDM, utilizado nas versões anteriores do Sacix.
Quanto à autenticação automática dos usuários ecidadania para os usuários root de cada
thin client, o fizemos para ter acesso ssh/sftp aos mesmos. Utilizamos este acesso para duas
funções: copiar, durante o início da sessão, os arquivos de relatório de hardware do thin client e
para acessar, via SFTP, a unidade de disquete. Estes detalhes serão abordados mais adiante.
Para automatizar a criação e a cópia das chaves desenvolvemos uma ferramenta chamada
ssh­keys, que está disponível no apêndice da nossa documentação. Também estão lá os arquivos
de configuração dos servidores SSH do thin client e do servidor, bem como as configurações dos
clientes SSH também.
Para testar o funcionamento das chaves, a seguinte seqüência de comandos pode ser
executada no console do thin client:
# for i in $(seq 1 20)
> do
> ssh ­o StrictHostKeyChecking=no [email protected] ls &&\
> echo ecidadania$i ok
> done 2> /dev/null
Os seguintes arquivos devem ser alterados para o acesso do usuário root do thin client aos
usuários ecidadania do servidor:
●
/opt/sacix/root/etc/ssh/ssh_config ­ contém configurações do cliente SSH do
thin client
●
/etc/ssh/sshd_config ­ contém as configurações do serviço SSH do servidor
Para as alterações necessárias ao acesso dos usuários ecidadania aos usuários root dos thin
clients, os seguintes arquivos devem ser personalizados:
●
/etc/ssh/ssh_config ­ contém configurações do cliente SSH do servidor
●
/opt/sacix/root/etc/ssh/sshd_config ­ contém configurações do servidor SSH do thin client
Como de praxe, estes arquivos também estão incluídos no apêndice da documentação.
13. Configuração do X Window System do thin client
Para que seja possível iniciar o X Window System, é necessário instalar os pacotes
xserver­xfree86, xfonts­base, xlibse xbase­clients no servidor:
# aptitude install xserver­xfree86 xfonts­base xbase­clients xlibs
Instalados os pacotes, é necessário seguir alguns passos:
criar um link para o programa XFree86 em X11;
criar o arquivo Xwrapper.config;
criar o arquivo base XFree86Config­4;
O comando abaixo cria o link para o programa XFree86:
# ln ­s /usr/bin/X11/XFree86 /opt/sacix/root/etc/X11/X
Nota: Ambos os arquivos Xwrapper.config e XFree86Config­4 estão disponíveis
no apêndice desta documentação.
É necessário também editar o arquivo profile, localizado em /
opt/sacix/root/etc/, que está disponível no apêndice. Este arquivo é responsável por
executar o programa xdebconfigurator, que irá detectar qual o driver da placa de vídeo do
thin client e também iniciar o servidor X do mesmo. O pacote xdebconfigurator precisa ser instalado
para que o script funcione corretamnete:
# aptitude install xdebconfigurator
O arquivo profile executa, no final, o comando xinit é executado. Este é um script
que lê alguns comandos do arquivo
xinitrc, localizado em
/
opt/sacix/root/etc/X11/xinit. Este arquivo detecta qual o IP do thin client, calcula o
nome do usuário a partir deste e, por fim, inicia o servidor X, chamando o script session já
autenticado com o usuário correto.
Entretanto, para que este script funcione, é preciso criar um link no diretório pessoal do
usuário root do thin client:
# ln ­s /etc/X11/xinit/xinitrc /opt/sacix/root/root/.xinitrc
O arquivo xinitrc contendo todos os comandos utilizados por nós está disponível no
apêndice da documentação.
Os arquivos de configuração do XKB (X Keyboard Extension), contidas no pacote xlibs,
também são necessários ao thin client. Como este pacote já está instalado no servidor, basta copiar
seu diretório contendo os arquivos de configuração para a raiz do thin client:
# cp ­a /etc/X11/xkb /opt/sacix/root/etc/X11
Nota: o diretório compiled é um link para o diretório /var/lib/xkb, que deve ser criado
pelo script mkvar mencionado na seção “Serviços do thin client”.
14. Configurando a sessão gráfica do usuário
Durante a execução do script session (que pode ser encontrado no final da
documentação), algumas tarefas de limpeza do ambiente do usuário são feitas, como remoção de
possíveis arquivos antigos deixados no diretório /tmp. As configurações pessoais também são
redefinidas, e a área de trabalho é limpa. Neste script também são detectados leitores de CD­ROM
no thin client e dispositivos SCSI, como máquinas digitais ou chaveiros USB. Caso estes
dispositivos sejam encontrados, atalhos são criados para o usuário.
Quando o ambiente já está pronto para ser iniciado, dois programas são chamados: o
xloadimage e o gnome­session. O xloadimage apenas exibe como papel de parede uma
imagem informando que a sessão do GNOME está sendo carrega e que o usuário deverá esperar
alguns instantes. Enquanto isso, o gerenciador de janelas GNOME é iniciado através do comando
gnome­session. Ao final, sua configuração padrão carrega um papel de parede semelhante ao
carregado pelo comando xloadimage, mas sem as mensagens de aviso do mesmo.
15. Instalando programas gráficos
Em todas as versões do Sacix, tentamos disponibilizar os mais variados programas
existentes aos usuários de maneira que tenham à mão sempre alguma ferramenta útil que os ajude
ou algo que os entretenha. Porém, devido à escassez de recursos dos nossos servidores, diminuímos
parte desta variedade, removendo muitos programas não tão utilizados e também instalando apenas
um tipo de programa por funcionalidade. Desta forma, temos apenas um programa de mensagens
instantâneas (GAIM), apenas um navegador* (Epiphany), e assim por diante.
Em contrapartida, instalamos diversos jogos para que as crianças possam se divertir sem
acessar sites de jogos em flash, que consomem muitos recursos do servidor. Todos eles estão
disponibilizados em uma pasta criada na área de trabalho de nome “JOGOS”, tornando o acesso
simples e intuitivo.
Além dos programas mais comuns, o Sacix contém programas de editoração gráfica, de
criação de desenhos simples e até de desenvolvimento web. É possível também o usuário criar
aplicações web, escritas na linguagem PHP, em seu diretório pessoal, armazenando­os na pasta
public_html. O servidor de banco de dados MySQL também está disponível para aulas de
programação web com acesso a bancos de dados. Nota: Optamos, por padrão, não deixar ativos os serviços apache e mysql, pois nem
todos os telecentros se utilizam destes serviços. No diretório /etc/rc2.d do servidor, é possível
encontrar os scripts destes serviços. Para ativá­los automaticamente durante o boot do servidor,
basta mudar a primeira letra “K” para “S”. E, para desativá­los, deve­se fazer o contrário: mudar
a letra “S” do início do nome para “K”.
A lista completa dos pacotes instalados no Sacix está no apêndice da documentação.
16. Configurações globais via Gconf
O GConf é o sistema de configurações globais utilizado no ambiente GNOME atual. Ele é
capaz de centralizar todas as configurações e ajustes dos programas. Suas configurações são salvas
em repositórios de configurações utilizando o formato XML. Estes repositórios são disponibilizados
pelo serviço gconfd­2. Para tratar as configurações (salvar, alterar, ler, copiar para um outro
arquivo XML ou mesmo gerenciar o servidor gconfd­2), o programa gconftool­2 é utilizado.
Além do programa gconftool­2 existe também o gconf­editor, uma ferramenta
gráfica que permite editar as configurações e preferências dos programas do GNOME de maneira
mais amigável.
Com o GConf é possível especificar diversas configurações e propriedades dos programas;
estas configurações também podem ser inalteráveis, caso haja tal necessidade. É possível, por
exemplo, não permitir que o papel de parede seja trocado.
Também é possível especificar valores padrões para as preferências dos programas. Assim,
caso nenhuma preferência seja encontrada no diretório pessoal do usuário, uma preferência padrão
definida é aplicada, podendo ser alterada pelo usuário posteriormente. O GConf tem duas principais
árvores de diretórios de configuração principais, além da árvore de configurações presente no
diretório pessoal de cada usuário. São eles:
gconf.xml.mandatory
gconf.xml.defaults
A árvore gconf.xml.mandatory determina como valores obrigatórios e inalteráveis
todas as configurações ali contidas.
O diretório gconf.xml.defaults contém valores padrões que são alteráveis pelos
usuários. Entretanto, se no diretório pessoal do usuário já houver uma configuração salva, a presente
neste diretório não fará efeito. No Sacix, a cada login as opções pessoais são removidas para que as
contidas neste diretório sejam automaticamente aplicadas.
No apêndice desta documentação é possível encontrar, em formato XML, as definições que
fizemos no Sacix, tanto as obrigatórias quanto as padrões. Para importá­las, devem ser executados
os seguintes comandos:
# gconftool­2 ­­load=gconf.mandatory ­­direct ­­config­source\
> xml:readwrite:/etc/gconf/gconf.xml.mandatory
# gconftool­2 ­­load=gconf.defaults ­­direct ­­config­source\
> xml:readwrite:/etc/gconf/gconf.xml.defaults
Nota 1: Se o arquivo tiver sido gerado usando uma codificação diferente de UTF­8, será
necessário convertê­lo para este formato. O exemplo abaixo demonstra como converter um arquivo
XML criado em formato ISO8859­1 utilizando o programa iconv:
# iconv ­f iso8859­1 ­t utf­8 gconf.defaults > gconf.defaults.utf8
Nota 2: para fazer a operação inversa (exportar as configurações), é preciso executar o
comando gconftool­2 usando o parâmetro ­­dump, como no exemplo abaixo:
# gconftool­2 ­­dump ­­config­source\
> xml:readonly:/etc/gconf/gconf.xml / > gconf.mandatory
17. Acesso a dispositivos remotos
No Sacix, utilizamos o protocolo SFTP para acessar os dispositivos de armazenamento do
thin client, como o leitor de disquetes. Para que este acesso seja possível, é necessário que o
servidor SSH do thin client esteja configurado para autenticar sessões SSH automaticamente através
de chaves RSA públicas autorizadas. Os arquivos de configuração necessários estão disponíveis no
apêndice da documentação.
Também é necessário que o thin client tenha o suporte a supermount habilitado no kernel.
Com este recurso, não é necessário montar os disquetes antes de acessá­los, nem desmontar após
seu uso. O arquivo fstab do thin client também precisa estar configurado para utilizar o
supermount, como pode ser conferido no apêndice da documentação.
Nesta versão, habilitamos suporte a leitores de CD­ROM e dispositivos USB, como
câmeras digitas que utilizem o padrão USB Storage e chaveiros USB. Estes dispositivos são
detectados durante o carregamento da sessão gráfica através de comandos inseridos no script
session.
Um detalhe que deve ser ressaltado é que não é possível alterar diretamente os arquivos
contidos no dispositivo remoto. É necessário copiá­los para a área de trabalho antes. Após todas as
alterações terem sido feitas, basta arrastá­los para uma janela aberta na pasta do dispositivo.
18. Suporte a som nos thin clients
O suporte a som nos thin clients está disponível no Sacix. Para isto, é preciso que o kernel
do thin client seja compilado com suporte à placa de som a ser utilizada no mesmo e que o hotplug
esteja habilitado para carregar o módulo durante o boot. Além disto, um serviço de som é necessário
no thin client. No Sacix, utilizamos o ESD, Enlightenment Sound Daemon. Criamos um script
chamado esd no diretório init.d, da raiz do thin client, com as funções de iniciar e de parar o
servidor de som, como pode ser visto no arquivo anexo, disponível no apêndice da documentação.
Além deste script, também é necessário que se crie um link para o mesmo no diretório rc2.d,
como no exemplo abaixo:
# ln ­s /etc/init.d/esd /opt/sacix/root/etc/rc2.d/S02esd
Os pacotes esd e aumix precisam ser instalados no servidor para que o script funcione:
# aptitude install esd aumix
No servidor, algumas alterações também devem ser feitas para que o usuário utilize o
servidor de som presente no thin client. Uma delas é a inserção da linha export
ESPEAKER=$USER:16001 no arquivo de script session. Outra é a presença de um arquivo no
diretório /tmp, necessária para o funcionamento adequado do som em sites que utilizem o plugin
flash no navegador:
# mkdir /tmp/.esd
# touch /tmp/.esd/socket
# chmod a+r /tmp/.esd/socket
No apêndice da documentação, incluímos um script chamado mkesd que pode ser
adicionado ao diretório init.d do servidor para garantir a criação deste arquivo e diretório
durante o boot do servidor.
Para definir o ESOUND como plugin de saída padrão do Beep Media Player, movemos as
bibliotecas libALSA.so e libOSS.so para um diretório chamado tmp dentro do diretório
padrão das mesmas:
# cd /usr/lib/bmp/Output
# mkdir tmp
# mv libALSA.so tmp
# mv libOSS.so tmp
Com o som configurado no thin client, é possível: navegar na Internet com som em sites
que utilizem o plugin flash, ouvir músicas no programa Beep Media Player e assistir a vídeos no
programa MPlayer.
19. Bootsplash
O bootsplash habilita a inicialização em modo gráfico no thin client. É exibida uma
imagem de fundo com boas vindas em vez das mensagens de inicialização do kernel.
O patch do bootsplash para o kernel 2.6.11.12 pode ser encontrado em
http://www.bootsplash.de/files/bootsplash­3.1.6­2.6.11.diff
Para aplicar o patch, é necessário executar o seguinte comando, dentro do diretório do
kernel:
# cd /usr/src/linux­2.6.11.12
# patch ­p1 < bootsplash­3.1.6­2.6.11.diff
Após a aplicação do patch, selecione as opções abaixo para habilitar o bootsplash:
Code maturity level options ­­­>
[*] Prompt for development and/or incomplete code/drivers
Processor type and features ­­­>
[*] MTRR (Memory Type Range Register) support
Device Drivers ­­­>
Block devices ­­­>
<*> Loopback device support
<*> RAM disk support
(4096) Default RAM disk size
[*]Initial RAM disk (initrd) support
Graphics support ­­­>
[*] Support for frame buffer devices
[*] VESA VGA graphics support
Console display driver support ­­­>
[*] Video mode selection support
<*> Framebuffer Console support
Bootsplash configuration ­­­>
[*] Bootup splash screen
Após compilado, deve­se copiar o kernel para o diretório /opt/sacix/boot e alterar o
arquivo default para que utilize as opções do bootsplash durante o boot. Este arquivo pode ser
encontrado no apêndice desta documentação.
Para que a imagem seja utilizada no bootsplash, é necessário obter o binário splash,
contido no pacote bootsplash, que pode ser obtido do repositório
http://www.bootsplash.de/files/debian unstable main
Após a atualização da lista de repositórios, basta executar os seguintes comandos:
# aptitude ­d install bootsplash
# cd /var/cache/apt/archives/
# ar x bootsplash_3.1­11_i386.deb data.tar.gz
# tar xzf data.tar.gz ­–strip­path=3 ./usr/sbin/splash ­C \
> /usr/local/sbin
O bootsplash utiliza duas imagens: uma para o modo “silencioso” e outra para o modo
“verbose”, como é possível constatar nos exemplos abaixo:
Modo silent (silencioso):
Modo verbose:
O modo “verbose” pode ser acessado pressionando a tecla F2. Por padrão, defnimos no
arquivo default que o modo utilizado no início será o silent. Após as imagens terem sido criadas,
é preciso criar um arquivo com as configurações necessárias ao bootsplash. No apêndice,
disponibilizamos um exemplo sob o nome de bootsplash.cfg, configurado para funcionar de
acordo com as imagens aqui apresentadas, que são as mesmas utilizadas nos telecentros nesta
versão.
O comando splash deve ser executado da seguinte maneira:
# splash ­s ­f bootsplash.cfg > bootsplash.img
Deve­se então copiar a imagem gerada para o diretório boot do thin client:
# cp bootsplash.img /opt/sacix/boot
Nota: o bootsplash só funciona em dispositivos de vídeo compatível com o padrão VESA
2.0. Geralmente, pode se encontrar placas compatíveis com este padrão fabricadas a partir de
1996.
20. Scripts desenvolvidos e personalizações
Durante o desenvolvimento do Sacix, desenvolvemos alguns scripts para facilitar algumas
tarefas, tanto do administrador quanto do usuário. São elas:
•
ip.sh
•
hw­server­clients.sh / hw.sh
•
ssh­keys
•
nat
•
runonce
•
formatar­disquete.sh
•
Variável TMOUT
ip.sh
O ip.sh é um script feito para mudar o IP do servidor e da rede que ele vai usar. Por
padrão, temos configurado o IP 192.168.0.1 na rede 192.168.0.0/255.255.255.0. Com este script,
podemos mudar todos os arquivos de configuração do servidor e do thin client que mencionem
endereços IP ou de rede e que dependam dos mesmos para funcionar. Para utilizar o script, usa­se o
o endereço de rede anterior como primeiro parâmetro e o novo como segundo parâmetro:
# ip.sh 192.168.0. 192.168.1.
hw-server-clients.sh / hw.sh
Desenvolvemos um conjunto de scripts, disponíveis no apêndice da documentação, para
que seja gerado um relatório de hardware do servidor e dos thin clients. Os scripts desenvolvidos
são os seguintes:
●
hw.sh
●
session
●
hw­server­clients.sh
O script hw.sh é um serviço do thin client. Ele é executado durante o boot, no runlevel
padrão e salva os dados extraídos dos comandos cat /proc/cpuinfo, cat /
proc/meminfo e lspci ­v em arquivos de texto dentro do diretório /tmp do thin client.
Durante o início da sessão gráfica, alguns comandos são executados no script session para copiar
estas informações para um diretório oculto chamado .hw dentro da pasta pessoal do usuário.
Após a criação do script, é preciso criar um link para o diretório do runlevel padrão do thin
client, o 2:
# ln ­s /etc/init.d/hw.sh /opt/sacix/root/etc/rc2.d/S03hw.sh
Para que as informações do hardware do thin client se tornem disponíveis no servidor,
algumas linhas são necessárias no arquivo de script session, que prepara a sessão gráfica:
­­ /usr/local/bin/session
...
mkdir $HOME/.hw 2>&1 > /dev/null &&\
for file in cpuinfo.txt meminfo.txt pci.txt
do
scp root@$USER:/tmp/$file $HOME/.hw
done
...
­­ EOF
O arquivo session, disponível no apêndice, já contém estas linhas inseridas.
Em /usr/local/sbin, no servidor, temos o script hw­server­clients.sh, que
executa as seguintes tarefas:
•
obtém informações sobre o hardware do servidor
•
armazena informações sobre o hardware dos thin clients salvas nos diretórios pessoais dos
usuários
•
une todas as informações de hardware, tanto do servidor quanto dos thin clients, em um único
arquivo
Este script é o único que não é executado automaticamente. Deve ser executado por algum
técnico quando o mesmo precisar ter disponíveis estas informações rápida e facilmente.
ssh-keys
Para automatizar as operações de criação e cópia das chaves RSA dos usuários, criamos o
script ssh­keys. Com este script, torna­se mais prático resolver problemas de autenticação de
sessões SSH, tanto do servidor para os thin clients quanto destes para o servidor.
Por executar alterações na raiz do thin client e nos diretórios pessoais de todos os usuários,
este script deve ser executado como o usuário root. As tarefas executadas por este script são as
seguintes:
•
cria as chaves RSA públicas e privadas dos usuários ecidadania do servidor
•
cria as chaves RSA pública e privada do usuário root do thin client
•
copia a chave pública do usuário root do thin client para o arquivo authorized_keys de cada
usuário ecidadania
•
apaga todas as chaves RSA dos usuários do servidor e do usuário root do thin client
As chaves RSA geradas se encontram disponíveis dentro do diretório especificado pela
variável $KEYS_DIR, que por padrão definimos como /usr/share/ssh­key.
O script tem os seguintes parâmetros de funcionamento: create; copy e remove.
Exemplo:
# ssh­keys create
O parâmetro create primeiro remove as chaves RSA dos usuários para depois gerá­las
novamente. Por último, as copia para o diretório especificado em $KEYS_DIR.
Ao utilizar o parâmetro copy, as chaves, se já tiverem sido copiadas para /
usr/share/ssh­key, são copiadas para os diretórios pessoais dos usuários. Assim, não é
necessário gerar sempre uma nova chave se esta tiver sido apagada do diretório pessoal do usuário
ou do arquivo authorized_keys do usuário a ser autenticado.
O último parâmetro, remove, apenas remove as chaves, tanto dos diretórios pessoais
quanto do diretório /usr/share/ssh­key.
nat
Este pequeno script serve para habilitar o encaminhamento de conexões vindas de
computadores dentro da mesma rede do telecentro que necessitem de uma conexão com a Internet.
Geralmente as entidades que hospedam os telecentros precisam deste acesso; por isso, este script
torna o servidor um gateway de acesso da rede local à Internet. Este script vem habilitado por
padrão no servidor. Para instalá­lo, deve­se copiar o arquivo existente no apêndice da documentação
e criar um link para ele no diretório /etc/rc2.d do servidor, para que seja ativado automaticamente a
cada boot:
# ln ­s /etc/init.d/nat /etc/rcS.d/S42nat
Os parâmetros que o script aceita são start e stop.
runonce
Para controlar o número de instâncias de um programa sendo executadas pelo mesmo
usuário, instalamos o runonce. É um programa feito em C ­ disponível no apêndice da
documentação ­ que é chamado usando o programa a ser controlado como parâmetro, como no
exemplo:
# runonce epiphany epiphany
O primeiro parâmetro é o nome da janela registrada no servidor X pelo programa; já o
segundo é o próprio nome do programa. Este programa controla o número de instâncias de
programas cujo nome da janela é o mesmo. No caso, utilizamos o runonce para permitir que
apenas uma instância de certos programas seja permitida. Assim, quando um usuário clica para abrir
mais vezes um programa que já se encontra aberto, não terá duas janelas deste abertas.
Decidimos utilizar o runonce porque, como temos recursos escassos, muitas vezes os
programas demoram para abrir, até mesmo para exibir a tela de inicialização do mesmo (splash
screen); o usuário, portanto, acaba clicando novamente no ícone várias vezes por achar que o
programa não abriu, quando na verdade está sendo carregado.
Entretanto, é importante notar que programas modulares cujas instâncias utilizam um
mesmo nome de janela podem não funcionar muito bem, como o Mozilla Browser e o Open Office.
O que acontece é que, se uma instância do Open Writer for aberta, por exemplo, será impossível
abrir qualquer instância da suíte, como o Calc, ou o Impress. O mesmo acontece com o Mozilla. Se
o Mozilla Browser estiver aberto, não será possível abrir o Composer. Existe um timeout padrão de
cinco minutos para o runonce, mas o modificamos para dez minutos.
O código­fonte deste programa encontra­se disponível no apêndice da nossa
documentação.
formatar-disquete.sh
Para formatar os disquetes usando o leitor presente nos thin clients, foi criada uma
ferramenta chamada formatar­disquete.sh. Este programa utiliza o zenity ­ disponível
no pacote homônimo ­ para exibir mensagens gráficas ao usuário, mas que executa por baixo um
script shell para processar as opções do usuário. Este programa permite ao usuário formatar
disquetes em dois sistemas de arquivos diferentes: vfat ou ext2. Após o usuário escolher seu sistema
de arquivos, o disquete será formatado em alguns segundos.
O script chama o comando ssh, que executa, no thin client, os comandos fdformat e
mkfs.ext ou mkfs.vfat para, respectivamente, formatar o disquete criar o sistema de arquivos
desejado. O script está disponível no apêndice da documentação.
O script fica armazenado no diretório /usr/local/bin. Um ícone criado no diretório
Desktop de cada usuário foi criado e foi criado para ser o mais simples possível para os usuários.
A seguir, algumas fotos do programa em funcionamento:
21. Agradecimentos
Agradecemos todas as pessoas que acreditam no projeto dos Telecentros, em especial
todos os desenvolvedores que já trabalharam neste projeto:
Caio Begotti
Francisco Edilton
Frederico Souza Camara
Lucas de Souza Santos
Luiz Fernando Nogueira Capitulino
Marcos Taschelmayer
Yuri Robinson de Souza
e um agradecimento especial a Ronaldo Ferreira Marques, por ter criado os exercícios em
português para o programa Ktouch.
22. Apêndice
­­ /opt/sacix/root/etc/inittab
id:2:initdefault:
si::sysinit:/etc/init.d/rcS
~~:S:wait:/sbin/sulogin
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
z6:6:respawn:/sbin/sulogin
ca:12345:ctrlaltdel:/sbin/shutdown ­t1 ­a ­h now
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
1:23:respawn:/usr/local/sbin/agetty ­n ­l /usr/local/sbin/autologin 38400 tty1
­­ /opt/sacix/root/etc/fstab
none /proc proc defaults 0 0
none /proc/bus/usb usbfs defaults 0 0
none /tmp ramfs defaults,rw 0 0
192.168.0.1:/bin /bin nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/sbin /sbin nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/usr /usr nfs nolock,exec,rsize=8192,ro 0 0
192.168.0.1:/lib /lib nfs nolock,exec,rsize=8192,ro 0 0
none /floppy supermount dev=/dev/fd0,fs=auto,­­,sync,iocharset=iso8859­
1,codepage=850,umask=0 0 0
none /cdrom supermount dev=/tmp/cdrom,fs=auto,­­,sync,iocharset=iso8859­
1,codepage=850,umask=0 0 0
none /usb supermount dev=/tmp/camera,fs=auto,­­,sync,iocharset=iso8859­
1,codepage=850,umask=0 0 0
­­ /opt/sacix/root/etc/ssh/ssh_config
StrictHostKeyChecking no
­­ /opt/sacix/root/etc/ssh/sshd_config
Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
UsePrivilegeSeparation no
KeyRegenerationInterval 3600
ServerKeyBits 768
SyslogFacility AUTH
LogLevel INFO
LoginGraceTime 600
PermitRootLogin yes
StrictModes no
RSAAuthentication yes
PubkeyAuthentication yes
IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no
PermitEmptyPasswords yes
PasswordAuthentication yes
X11Forwarding no
X11DisplayOffset 10
PrintMotd no
KeepAlive yes
Subsystem sftp /usr/lib/sftp­server
­­ /opt/sacix/root/etc/init.d/hw.sh
#! /bin/sh
#
# hw.sh Relatório básico de hardware
#
Este arquivo salva informações básicas sobre o hardware do thin
# client e os armazena no /tmp. Um script do servidor deverá pegar
# estes logs posteriormente.
#
(baseado no scritp skeleton, do Debian GNU/Linux)
#
# Autor:
Eduardo Costa Lisboa <[email protected]> .
#
# Version: @(#)20050725 25­Jul­2005
#
set ­e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC="Relatório de Hardware"
NAME=hw.sh
SCRIPTNAME=/etc/init.d/$NAME
# Gracefully exit if the package has been removed.
test ­x $SCRIPTNAME || exit 0
#
#
Function that starts the daemon/service.
#
d_start()
{
for file in cpuinfo meminfo
do
cat /proc/$file > /tmp/$file.txt
done
lspci ­v > /tmp/pci.txt
}
#
#
Function that stops the daemon/service.
#
d_stop()
{
for file in cpuinfo meminfo
do
rm ­f /tmp/$file.txt
done
rm ­f /tmp/pci.txt
}
case "$1" in
start)
echo ­n "Starting $DESC: $NAME"
d_start
echo "."
;;
stop)
echo ­n "Stopping $DESC: $NAME"
d_stop
echo "."
;;
restart)
echo ­n "Restarting $DESC: $NAME"
d_stop
echo "."
sleep 1
d_start
echo "."
;;
*)
echo "Usage: $0 {start|stop|restart}" >&2
exit 1
;;
esac
exit 0
­­ /opt/sacix/root/etc/init.d/esd
#!/bin/bash
case "$1" in
'start')
echo "Starting esound: esd."
aumix ­v90 ­w90 ­p90 ­m90 ­c90 ­l90 ­i90 ­190 > /dev/null 2> /
dev/null
esd ­tcp ­public ­nobeeps > /dev/null 2> /dev/null &
;;
'stop')
echo "Stoping esound: esd."
killall ­9 esd > /dev/null 2> /dev/null
;;
'restart')
#echo "Restarting esound: esd."
killall ­HUP esd > /dev/null 2> /dev/null
;;
*)
echo "Usage: esd {start|stop|restart}"
esac
­­ /opt/sacix/root/etc/init.d/mkvar
#!/bin/bash
LIST="/tmp/var /var/log/ksymoops /var/lib /var/log /var/opt /var/run /var/tmp /
var/local /var/lock /var/lib/xkb /var/run/sshd /var/lib/usbutils"
case "$1" in
'start')
echo "Creating var's tree ..."
for DIR in $LIST do
mkdir ­p "$DIR"
done
touch /tmp/{mtab,nologin.conf,hostname}
touch /var/lib/usbutils/usb.ids
;;
'stop')
echo "Removing var's tree ..."
rm ­rf /tmp/var
;;
*)
echo "Usage: $0 {start|stop}"
esac
­­ /opt/sacix/root/etc/profile
if [ "`id ­u`" ­eq 0 ]; then
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X1
1"
else
PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games"
fi
if [ "$PS1" ]; then
if [ "$BASH" ]; then
PS1='\u@\h:\w\$ '
else
if [ "`id ­u`" ­eq 0 ]; then
PS1='# '
else
PS1='$ '
fi
fi
fi
export PATH
umask 022
echo ­e "Aguarde... detectando a placa de vídeo."
cp /etc/X11/XF86Config­4 /tmp
DEVS=$(xdebconfigurator 2>&1 | egrep 'VIDEO DRIVER:|MONITOR DEFAULT DEPTH:')
VIDEO=$(echo $DEVS | sed 's/[^a­z]//g')
DEPTH=$(echo $DEVS | sed 's/[^0­9]//g')
if [ ! ­z $VIDEO ]; then
sed ­i "s/vga/$VIDEO/" /tmp/XF86Config­4
fi
if [ ! ­z $DEPTH ]; then
sed ­i "s/DefaultDepth \+8/DefaultDepth $DEPTH/" /tmp/XF86Config­4
fi
while [ true ]
do
/etc/init.d/esd restart
xinit ­­ /usr/bin/X11/X ­xf86config /tmp/XF86Config­4 > /dev/null 2> /
dev/null
done
­­ /opt/sacix/root/etc/X11/xinit/xinitrc
for ETH in eth{0,1}
do
TMP=$(LC_ALL=C /sbin/ifconfig $ETH | grep inet | sed 's/^\
\+//g;s/Bcast.*//;s/[a­z :]//g')
if [ ! ­z "$TMP" ] then
IP=$TMP
fi
done
NID=$(($(echo $IP | cut ­d. ­f4)­10))
HOSTNAME="ecidadania$NID"
echo "127.0.0.1 localhost.local localhost" > /etc/hosts
echo "$IP ecidadania$NID.local ecidadania$NID" >> /etc/hosts
hostname ecidadania$NID
# Kill all user's process
ssh [email protected] 'kill ­9 $(ps x ­o pid)'
xhost +192.168.0.1
ssh [email protected] /usr/local/bin/session
­­ /opt/sacix/root/etc/X11/XF86Config­4
Section "Files"
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
FontPath
EndSection
"/usr/lib/X11/fonts/misc"
"/usr/lib/X11/fonts/cyrillic"
"/usr/lib/X11/fonts/100dpi/:unscaled"
"/usr/lib/X11/fonts/75dpi/:unscaled"
"/usr/lib/X11/fonts/Type1"
"/usr/lib/X11/fonts/CID"
"/usr/lib/X11/fonts/Speedo"
"/usr/lib/X11/fonts/100dpi"
"/usr/lib/X11/fonts/75dpi"
Section "Module"
Load "GLcore"
Load "bitmap"
Load "dbe"
Load "ddc"
Load "dri"
Load
Load
Load
Load
Load
Load
Load
Load
EndSection
"extmod"
"freetype"
"glx"
"int10"
"record"
"speedo"
"type1"
"vbe"
Section "InputDevice"
Identifier "Generic Keyboard"
Driver
"keyboard"
Option
"CoreKeyboard"
Option
"XkbRules" "xfree86"
Option
"XkbModel" "abnt2"
Option
"XkbLayout" "br"
EndSection
Section "InputDevice"
Identifier "Configured Mouse"
Driver
"mouse"
Option
"CorePointer"
Option
"Device"
Option
"Protocol"
Option
"Emulate3Buttons"
Option
"ZAxisMapping"
EndSection
Section "InputDevice"
Identifier "Generic Mouse"
Driver
"mouse"
Option
"SendCoreEvents"
Option
"Device"
Option
"Protocol"
Option
"Emulate3Buttons"
Option
"ZAxisMapping"
EndSection
Section "Device"
Identifier
Driver
EndSection
"/dev/psaux"
"ImPS/2"
"true"
"4 5"
"true"
"/dev/input/mice"
"ImPS/2"
"true"
"4 5"
"Placa de Vídeo Genérica"
"vga"
Section "Monitor"
Identifier "Monitor Genérico"
HorizSync
31.5­48.5
VertRefresh 50­70
Option
"DPMS"
EndSection
Section "Screen"
Identifier "Default Screen"
Device
"Placa de Vídeo Genérica"
Monitor
"Monitor Genérico"
DefaultDepth
16
SubSection "Display"
Depth
1
Modes
"1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth
4
Modes
"1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth
8
Modes
"1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth
15
Modes
"1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth
16
Modes
"1024x768" "800x600" "640x480"
EndSubSection
SubSection "Display"
Depth
24
Modes
"1024x768" "800x600" "640x480"
EndSubSection
EndSection
Section "ServerLayout"
Identifier "Default Layout"
Screen
"Default Screen"
InputDevice "Generic Keyboard"
InputDevice "Configured Mouse"
InputDevice "Generic Mouse"
EndSection
­­ /etc/exports
/opt/sacix/root
192.168.0.0/255.255.255.0
(ro,no_root_squash,sync,no_all_squash)
/bin
/sbin
/lib
/usr
192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
192.168.0.0/255.255.255.0(ro,no_root_squash,sync,no_all_squash)
­­ /etc/default/atftpd
USE_INETD=false
OPTIONS="­­daemon ­­port 69 ­­retry­timeout 5 ­­mcast­port 1758­1788 ­­mcast­
addr 255.255.255.0­255 ­­mcast­ttl 1 ­­maxthread 30 ­­verbose=0 /
opt/sacix/boot"
­­ /etc/dhcp3/dhcpd.config
Server­identifier 192.168.0.1;
ignore unknown­clients;
ddns­update­style ad­hoc;
default­lease­time 600;
max­lease­time 1600;
option subnet­mask 255.255.255.0;
option broadcast­address 192.168.0.255;
option routers 192.168.0.1;
option domain­name "telecentro­sp.local";
option domain­name­servers 192.168.0.1;
option root­path "192.168.0.1:/opt/sacix/root";
filename "/pxelinux.0";
#filename "/2.6.11.12­cliente.etb"; # para PXE < 2.0
option option­128 code 128 = string;
option option­129 code 129 = text;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.11 192.168.0.30;
}
group {
host ecidadania2 {
hardware ethernet 00:0A:5E:44:93:D7;
fixed­address 192.168.0.12;
option host­name "ecidadania2";
}
}
#
#
host ecidadania2 { hardware ethernet 00:0A:5E:44:93:D7; }
#}
­­ /etc/ssh/sshd_config
# Package generated configuration file
# See the sshd(8) manpage for details
# What ports, IPs and protocols we listen for
Port 22
# Use these options to restrict which interfaces/protocols sshd will bind to
#ListenAddress ::
#ListenAddress 0.0.0.0
Protocol 2
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
#Privilege Separation is turned on for security
UsePrivilegeSeparation yes
# Lifetime and size of ephemeral version 1 server key
KeyRegenerationInterval 3600
ServerKeyBits 768
# Logging
SyslogFacility AUTH
LogLevel INFO
# Authentication:
LoginGraceTime 600
PermitRootLogin yes
StrictModes no
RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile
%h/.ssh/authorized_keys
# Don't read the user's ~/.rhosts and ~/.shosts files
IgnoreRhosts yes
# For this to work you will also need host keys in /etc/ssh_known_hosts
RhostsRSAAuthentication no
# similar for protocol version 2
HostbasedAuthentication no
# Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication
#IgnoreUserKnownHosts yes
# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no
# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes
# Change to yes to enable tunnelled clear text passwords
PasswordAuthentication no
# To change Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#AFSTokenPassing no
#KerberosTicketCleanup no
# Kerberos TGT Passing does only work with the AFS kaserver
#KerberosTgtPassing yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
KeepAlive yes
#UseLogin no
#MaxStartups 10:30:60
#Banner /etc/issue.net
Subsystem
sftp
/usr/lib/sftp­server
UsePAM yes
­­ /etc/ssh/ssh_config
#
$OpenBSD: ssh_config,v 1.15 2002/06/20 20:03:34 stevesk Exp $
# This is the ssh client system­wide configuration file. See
# ssh_config(5) for more information. This file provides defaults for
# users, and the values can be changed in per­user configuration files
# or on the command line.
# Configuration data is parsed as follows:
# 1. command line options
# 2. user­specific file
# 3. system­wide file
# Any configuration value is only changed the first time it is set.
# Thus, host­specific definitions should be at the beginning of the
# configuration file, and defaults at the end.
# Site­wide defaults for various options
# Host *
# ForwardAgent no
# ForwardX11 no
# RhostsAuthentication no
# RhostsRSAAuthentication no
# RSAAuthentication yes
# PasswordAuthentication yes
# BatchMode no
# CheckHostIP yes
StrictHostKeyChecking no
# IdentityFile ~/.ssh/identity
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# Port 22
# Protocol 2,1
# Cipher 3des
# Ciphers aes128­cbc,3des­cbc,blowfish­cbc,cast128­cbc,arcfour,aes192­
cbc,aes256­cbc
# EscapeChar ~
­­ /etc/squid/squid.conf
http_port 3128
#cache_peer 192.168.14.11 parent 80 3130 no­query
hierarchy_stoplist cgi­bin ?
acl QUERY urlpath_regex cgi­bin \?
no_cache deny QUERY
cache_mem 16 MB
maximum_object_size 1000 KB
cache_dir ufs /var/cache/squid 64 16 256
cache_access_log /dev/null
cache_log /dev/null
cache_store_log /dev/null
client_netmask 255.255.255.0
ftp_passive on
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl proxy src 192.168.0.0/255.255.255.0
acl porn dstdomain "/etc/squid/porn" acl SSL_ports port 443 563
acl Safe_ports port 80
# http
acl Safe_ports port 21
# ftp
acl Safe_ports port 443 563
# https, snews
acl Safe_ports port 70
# gopher
acl Safe_ports port 210
# wais
acl Safe_ports port 1025­65535
# unregistered ports
acl Safe_ports port 280
# http­mgmt
acl Safe_ports port 488
# gss­http
acl Safe_ports port 591
# filemaker
acl Safe_ports port 777
# multiling http
acl Safe_ports port 901
# SWAT
acl Safe_ports port 1863
# MSN
acl Safe_ports port 5190
# ICQ
acl Safe_ports port 22
# SSH
acl purge method PURGE
acl CONNECT method CONNECT
http_access allow manager localhost
http_access allow manager proxy
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny porn all
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow proxy
http_access deny all
icp_access allow all
#never_direct allow all
icon_directory /usr/lib/squid/errors/Portuguese
error_directory /usr/lib/squid/errors/Portuguese
­­ /etc/cups/cupsd.conf
ServerAdmin [email protected]
DefaultCharset notused
LogLevel info
Printcap /var/run/cups/printcap
Port 631
<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
<Location /jobs>
AuthType Basic
AuthClass Group
AuthGroupName adm
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
Order Deny, Allow
Deny From All
<Location /admin>
AuthType Basic
AuthClass Group
AuthGroupName adm
Order Deny,Allow
Deny From All
Allow From 127.0.0.1
</Location>
­­ /etc/init.d/nat
#!/bin/bash
case "$1" in
'start')
iptables ­t nat ­A POSTROUTING ­s 192.168.0.0/24 ­o eth0 ­j
MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
;;
'stop')
echo 0 > /proc/sys/net/ipv4/ip_forward
iptables ­t nat ­F
;;
esac
­­ /etc/init.d/mkesdfile
#!/bin/bash
case "$1" in
'start')
echo "Creating esound file for client ..."
mkdir /tmp/.esd 2> /dev/null
touch /tmp/.esd/socket 2> /dev/null
;;
'stop')
echo "Removing esound file for client ..."
rm ­rf /tmp/.esd
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
­­ /etc/init.d/monitor
#!/bin/bash
#
# Script de monitoramento de desempenho dos servidores dos Telecentros
#
# Autor: Kung te Yang ([email protected])
# Data: 14/07/2004
# Versão: 1.0
#
MONITORDIR="/var/log/monitor"
function data
{
DATE=$(date +%e" "%b" "%Y)
TIME=$(date +%R)
}
function mem_file
{
if [ ! ­e "$MONITORDIR/mem.log" ]
then
echo ­e "\t\t\t Memory\t Swap\t Cache" >>
$MONITORDIR/mem.log
echo ­e " Data\t\tHorario\t used\t free\tused\tfree\tused\tfree"
>> $MONITORDIR/mem.log
echo ­e "" >> $MONITORDIR/mem.log
fi
echo ­e $DATE"\t"$TIME"\t "$MEMUSED"M\t"
$MEMFREE"M\t"$SWAPUSED"M\t"$SWAPFREE"M\t"$CACHEUSED"M\t"$CACHEFREE"M" >>
$MONITORDIR/mem.log
}
function memory
{
MEM=$(free ­m | sed 1d | cut ­c 25­40 | sed 's/ \+/ /g')
MEMUSED=$(echo $MEM | cut ­d" " ­f1)
MEMFREE=$(echo $MEM | cut ­d" " ­f2) CACHEUSED=$(echo $MEM | cut ­d" " ­f3)
CACHEFREE=$(echo $MEM | cut ­d" " ­f4)
SWAPUSED=$(echo $MEM | cut ­d" " ­f5)
SWAPFREE=$(echo $MEM | cut ­d" " ­f6)
mem_file
}
function hard_disk
{
SIZES=$(df ­m | egrep '(/|/boot|/usr|/var|/var/cache|/tmp|/home|/opt)$' |
cut ­c 25­50 | sed 's/ \+/ /g')
ROOTTOTAL=$(echo $SIZES | cut ­d" " ­f1)
ROOTUSED=$(echo $SIZES | cut ­d" " ­f2)
ROOTFREE=$(echo $SIZES | cut ­d" " ­f3)
BOOTTOTAL=$(echo $SIZES | cut ­d" " ­f4)
BOOTUSED=$(echo $SIZES | cut ­d" " ­f5)
BOOTFREE=$(echo $SIZES | cut ­d" " ­f16)
USRTOTAL=$(echo $SIZES | cut ­d" " ­f7)
USRUSED=$(echo $SIZES | cut ­d" " ­f8)
USRFREE=$(echo $SIZES | cut ­d" " ­f9)
VARTOTAL=$(echo $SIZES | cut ­d" " ­f10)
VARUSED=$(echo $SIZES | cut ­d" " ­f11)
VARFREE=$(echo $SIZES | cut ­d" " ­f12)
CACHETOTAL=$(echo $SIZES | cut ­d" " ­f13)
CACHEUSED=$(echo $SIZES | cut ­d" " ­f14)
CACHEFREE=$(echo $SIZES | cut ­d" " ­f15)
TMPTOTAL=$(echo $SIZES | cut ­d" " ­f16)
TMPUSED=$(echo $SIZES | cut ­d" " ­f17)
TMPFREE=$(echo $SIZES | cut ­d" " ­f18)
HOMETOTAL=$(echo $SIZES | cut ­d" " ­f19)
HOMEUSED=$(echo $SIZES | cut ­d" " ­f20)
HOMEFREE=$(echo $SIZES | cut ­d" " ­f21)
OPTTOTAL=$(echo $SIZES | cut ­d" " ­f22)
OPTUSED=$(echo $SIZES | cut ­d" " ­f23)
OPTFREE=$(echo $SIZES | cut ­d" " ­f24)
TOTALTAM=0
for TOTAL in $ROOTTOTAL $BOOTTOTAL $USRTOTAL $VARTOTAL $CACHETOTAL
$TMPTOTAL $OPTTOTAL $HOMETOTAL
do
TOTALTAM=$(expr $TOTALTAM + $TOTAL)
done
TOTALUSED=0
for USED in $ROOTUSED $BOOTUSED $USRUSED $VARUSED $CACHEUSED $TMPUSED
$OPTUSED $HOMEUSED
do
TOTALUSED=$(expr $TOTALUSED + $USED)
done
TOTALFREE=0
for FREE in $ROOTFREE $BOOTFREE $USRFREE $VARFREE $CACHEFREE $TMPFREE
$OPTFREE $HOMEFREE
do
TOTALFREE=$(expr $TOTALFREE + $FREE)
done
hd_file
}
function hd_file {
echo ­e "Data: "$DATE"\tHorario: "$TIME >> $MONITORDIR/disk.log
echo ­e "" >> $MONITORDIR/disk.log
echo ­e "Particao\tTam\tUsado\tDisp" >> $MONITORDIR/disk.log
echo ­e root"\t\t"$ROOTTOTAL"M\t"$ROOTUSED"M\t"$ROOTFREE"M" >>
$MONITORDIR/disk.log
echo ­e boot"\t\t"$BOOTTOTAL"M\t"$BOOTUSED"M\t"$BOOTFREE"M" >>
$MONITORDIR/disk.log
echo ­e usr"\t\t"$USRTOTAL"M\t"$USRUSED"M\t"$USRFREE"M" >>
$MONITORDIR/disk.log
echo ­e var"\t\t"$VARTOTAL"M\t"$VARUSED"M\t"$VARFREE"M" >>
$MONITORDIR/disk.log
echo ­e cache"\t\t"$CACHETOTAL"M\t"$CACHEUSED"M\t"$CACHEFREE"M" >>
$MONITORDIR/disk.log
echo ­e tmp"\t\t"$TMPTOTAL"M\t"$TMPUSED"M\t"$TMPFREE"M" >>
$MONITORDIR/disk.log
echo ­e home"\t\t"$HOMETOTAL"M\t"$HOMEUSED"M\t"$HOMEFREE"M" >>
$MONITORDIR/disk.log
echo ­e opt"\t\t"$OPTTOTAL"M\t"$OPTUSED"M\t"$OPTFREE"M" >>
$MONITORDIR/disk.log
echo ­e "Total\t\t"$TOTALTAM"M\t"$TOTALUSED"M\t"$TOTALFREE"M\n" >>
$MONITORDIR/disk.log
}
function desempenho
{
NPROC=$(ps ­A | wc ­l)
NUSER=$(users | wc ­w)
LOADAVERAGE=$(cat /proc/loadavg | cut ­d" " ­f1,2,3)
CPU=$(ps ax ­o %cpu,comm | grep ­v %CPU | sort ­nr | uniq | head ­n 10)
MEM=$(ps ax ­o %mem,comm | grep ­v %MEM | sort ­nr | uniq | head ­n 10)
perf_file
}
function perf_file
{
echo ­e "Data: $DATE\tHorario: $TIME\n" >> $MONITORDIR/perf.log
echo ­e "N. Processos: $NPROC" >> $MONITORDIR/perf.log
echo ­e "N. Usuarios : $NUSER" >> $MONITORDIR/perf.log
echo ­e "Load Average: $LOADAVERAGE" >> $MONITORDIR/perf.log
echo ­e "" >> $MONITORDIR/perf.log
echo ­e "%CPU Command" >> $MONITORDIR/perf.log
echo ­e "$CPU" >> $MONITORDIR/perf.log
echo ­e "" >> $MONITORDIR/perf.log
echo ­e "%Mem Command" >> $MONITORDIR/perf.log
echo ­e "$MEM\n\n" >> $MONITORDIR/perf.log
}
case "$1" in
'start')
if [ ! ­e "/tmp/monitor.lock" ]
then
echo ­e "Starting monitor script: monitor"
touch /tmp/monitor.lock
if [ ! ­d $MONITORDIR ]
then
mkdir $MONITORDIR 2> /dev/null
fi
while [ true ]
do
data
memory
#hard_disk
desempenho
sleep 300
done &
else
echo ­e "Monitor script is already running ..."
exit 1
fi
;;
'stop')
if [ ­e "/tmp/monitor.lock" ]
then
echo "Stoping monitor script: monitor"
rm ­rf /tmp/monitor.lock
kill $(ps ax ­o pid,comm | grep monitor | sed 's/ /\n/g' |
grep '^[0­9]')
else
echo ­e "Monitor script is not running ..."
exit 1
fi
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
;;
esac
­­ /usr/local/sbin/ip.sh
#!/bin/bash
#
# ip.sh Altera o endereço IP
#
# O processo de alteração do endereço IP da rede dos thin­client é
# necessário alter diversos arquivos de configuração da rede. E muitas
# vezes perdemos muito tempo tentando lembrar quais arquivos deverão
# ser modificados. Portanto, esse script tratará desse problema.
#
# Autor: Kung te Yang <[email protected]>
#
# Version: @(#) 20050812 12­Ago­2005
# IP filter test
IP1=$(echo $1 | egrep '\b(25[0­5]|2[0­4][0­9]|[01]?[0­9][0­9]?)\.(25[0­5]|2[0­4]
[0­9]|[01]?[0­9][0­9]?)\.(25[0­5]|2[0­4][0­9]|[01]?[0­9][0­9]?)\.$')
IP2=$(echo $2 | egrep '\b(25[0­5]|2[0­4][0­9]|[01]?[0­9][0­9]?)\.(25[0­5]|2[0­4]
[0­9]|[01]?[0­9][0­9]?)\.(25[0­5]|2[0­4][0­9]|[01]?[0­9][0­9]?)\.$')
if [ ­z $IP1 ] || [ ­z $IP2 ]
then
echo "Usage: ip.sh [OLD_IP] [NEW_IP]"
echo "Example: ip.sh 192.168.0. 192.168.1."
exit 1
fi
OLD_IP=$IP1
NEW_IP=$IP2
# List of file configuration
LIST="/etc/network/interfaces /etc/exports /etc/hosts /etc/dhcp3/dhcpd.conf /
opt/sacix/root/etc/fstab /opt/sacix/boot/pxelinux.cfg/default /
opt/sacix/root/etc/X11/xinit/xinitrc /
etc/gconf/gconf.xml.defaults/system/http_proxy/%gconf.xml /
etc/gconf/gconf.xml.defaults/system/proxy/%gconf.xml /etc/hosts.deny /
etc/init.d/nat /etc/init.d/nat /etc/squid/squid.conf"
for FILE in $LIST
do
sed ­i 's/'$OLD_IP'/'$NEW_IP'/g' $FILE
done
echo "IP ${OLD_IP}1 to ${NEW_IP}1 changed."
echo ""
read ­p "Do you want restart all network service? [y|N]" ASK
if [ "$ASK" = "y" ]
then
for SRV in networking dhcp3­server atftpd nfs­kernel­server nat squid
do
/etc/init.d/$SRV restart
done
fi
­­ /usr/local/sbin/ssh­keys
#!/bin/bash
#
# ssh­keys Gera chaves RSA
#
# Este script gera chaves RSA de cada usuário,
# permitindo o autologin via SSH
#
# Autor: Kung te Yang <[email protected]>
#
# Version: @(#) 20050701 01­July­2005
#
KEYS_DIR="/usr/share/ssh­key"
CLIENT_ROOTDIR="/opt/sacix/root/root"
create_key ()
{
remove_key
echo ­e "Creating users keys ..."
for i in $(seq 1 20)
do
mkdir ­p $KEYS_DIR/ecidadania$i 2> /dev/null
su ­ ecidadania$i ­c ' \
mkdir ­p .ssh 2> /dev/null
ssh­keygen ­t rsa ­f ~/.ssh/id_rsa ­N ""' > /dev/null
mkdir $KEYS_DIR/ecidadania$i 2> /dev/null
cp /home/ecidadania$i/.ssh/* $KEYS_DIR/ecidadania$i/
done
echo ­e "Creating client's root key ..."
mkdir $CLIENT_ROOTDIR/.ssh 2> /dev/null
ssh­keygen ­t rsa ­f $CLIENT_ROOTDIR/.ssh/id_rsa ­N "" > /dev/null
mkdir ­p $KEYS_DIR/client 2> /dev/null
cp $CLIENT_ROOTDIR/.ssh/* $KEYS_DIR/client/
copy_key
}
copy_key ()
{
rm ­rf $KEYS_DIR/client/authorized_keys
echo ­e "Coping users keys ..."
for i in $(seq 1 20)
do
rm ­rf /home/ecidadania$i/.ssh/authorized_keys
mkdir /home/ecidadania$i/.ssh 2> /dev/null
chmod 500 /home/ecidadania$i/.ssh
cp $KEYS_DIR/client/id_rsa.pub /
home/ecidadania$i/.ssh/authorized_keys
chown ­R ecidadania$i.users /home/ecidadania$i/.ssh
cat $KEYS_DIR/ecidadania$i/id_rsa.pub >>
$KEYS_DIR/client/authorized_keys
done
find /home ­name authorized_keys ­exec chmod 400 {} \;
echo ­e "Coping client's root key"
mkdir $CLIENT_ROOTDIR/.ssh 2> /dev/null
cp $KEYS_DIR/client/authorized_keys $CLIENT_ROOTDIR/.ssh/
chmod 400 $CLIENT_ROOTDIR/.ssh/authorized_keys
}
remove_key ()
{
echo ­e "Removing users key ..."
for i in $(seq 1 20)
do
rm ­rf /home/ecidadania$i/.ssh
rm ­rf $KEYS_DIR/ecidadania$i/*
done
echo ­e "Removing client's root key ..."
rm ­rf $KEYS_DIR/client/*
rm ­rf $CLIENT_ROOTDIR/.ssh
}
if [ $UID ­ne 0 ]
then
echo "*** WARNING!!! Run as root only to execute ssh­keys command at
server ***"
exit 1
fi
case "$1" in
'create')
create_key
;;
'copy')
copy_key
;;
'remove')
remove_key
;;
*)
echo ­e "Usage: ssh­keys {create|copy|remove}"
;;
esac
­­ /usr/local/sbin/hw­server­clients.sh
#! /bin/sh
#
# /etc/init.d/hw­server­clients.sh # Relatório básico de hardware
#
#
Este arquivo salva informações básicas sobre o hardware do servidor
#
e os armazena em "/root/hw­server.tar.bz2".
#
#
Este script também gera um arquivo chamado # "/root/hw­clients.tar.bz2"
#
contendo o conteúdo dos diretórios .hw de cada usuário.
# Estes diretórios contém arquivos com informações sobre o hardware
# dos thin clients.
#
#
Por último, as informações dos thin clients são armazenadas
# junto com as informações do hardware do servidor em um único arquivo
#
(baseado no scritp skeleton, do Debian GNU/Linux)
#
# Autor:
Eduardo Costa Lisboa <[email protected]> .
#
# Version: @(#)20050726 26­Jul­2005
#
set ­e
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Gracefully exit if the package has been removed.
test ­x $SCRIPTNAME || exit 0
go_server()
{
SERVDIR="/root/hw­server"
if [ ! ­d "$SERVDIR" ]
then
rm ­f "$SERVDIR" 2>&1 > /dev/null
mkdir "$SERVDIR"
fi
for file in cpuinfo meminfo
do
cat /proc/"$file" > "$SERVDIR"/"$file"­server.txt
done
lspci ­v > "$SERVDIR"/pcidev­server.txt
fdisk ­l > "$SERVDIR"/partts­server.txt 2> /dev/null
df ­h
> "$SERVDIR"/mounts­server.txt
uname ­a > "$SERVDIR"/kernel­server.txt
arp ­n > "$SERVDIR"/arptbl­server.txt
date +%Y%m%d%H%M%S > "$SERVDIR"/datalg­server.txt
if [ ­z "$ALL" ]
then
echo "Compactando o diretório $SERVDIR, aguarde..."
tar cvf "$SERVDIR".tar "$SERVDIR" 2> /dev/null
bzip2 ­f ­v ­9 "$SERVDIR".tar 2> /dev/null
fi
}
go_client()
{
CLIDIR="/root/hw­clients"
if [ ! ­d "$CLIDIR" ]
then
rm ­f "$CLIDIR" 2>&1 > /dev/null
mkdir "$CLIDIR"
else
rm ­rf $CLIDIR/*
fi
echo "Copiando arquivos de relatório dos thin clients, aguarde..."
for n in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
host=$(($n+10))
if [ ­d /home/ecidadania$n/.hw ]
then
mkdir "$CLIDIR"/tc$host 2>&1 > /dev/null
cp /home/ecidadania$n/.hw/{{cpu,mem}info,pci}.txt
"$CLIDIR"/tc$host
else
echo "Diretório .hw de ecidadania$n não encontrado" | tee
$CLIDIR/tc$host
fi
done
if [ ­z "$ALL" ]
then
echo "Compactando relatórios dos thin clients, aguarde..."
tar cvf "$CLIDIR".tar "$CLIDIR" 2> /dev/null
bzip2 ­f ­v ­9 "$CLIDIR".tar 2> /dev/null
fi
}
go_all()
{
ALL="true"
go_server
go_client
echo "Compactando relatórios do hardware do servidor e dos thin clients"
tar cfv hw­server­clients.tar /root/hw­{server,clients} 2> /dev/null &&\
bzip2 ­f ­v ­9 hw­server­clients.tar 2> /dev/null
}
go_clean()
{
rm ­rf /root/hw­{server,clients} 2>&1 > /dev/null
}
case "$1" in
server)
echo "Gerando relatórios do hardware do servidor"
go_server
echo "."
;;
clients)
echo "Gerando relatórios do hardware dos thin clients"
go_client
echo "."
;;
all)
echo "Gerando relatórios do hardware do servidor e dos thin clients"
go_all
echo "."
;;
clean)
echo "Limpando tudo até a última ponta"
go_clean
echo "."
;;
*)
echo "Uso: $0 {server|clients|all|clean}" >&2
exit 1
;;
esac
exit 0
­­ /usr/loca/bin/session
#!/bin/bash
# Global variables
DISPLAY=$USER:0.0
ESPEAKER=$USER:16001
LANGUAGE="pt_BR"
LANG="pt_BR"
export DISPLAY ESPEAKER LANGUAGE LANG
TELE_SHARE="/usr/share/gnome­telecentro"
# Remove old files from user
find /tmp ­user $USER ­maxdepth 1 ­exec rm ­rf {} \;
find $HOME ­maxdepth 1 \( ­name '.*' ­a ! \( ­name '.evolution' ­o \
­name '.gconf' \) \) ­exec rm ­rf {} \;
find $HOME/.gconf ­maxdepth 2 ­type d ! \( ­name '.gconf' ­o ­name 'apps' ­o \
­name 'evolution' \) ­exec rm ­rf {} \;
rm ­rf $HOME/Desktop
# Copy default Desktop
mkdir $HOME/Desktop
cp ­a $TELE_SHARE/gnome­desktop/* $HOME/Desktop
# Copy ktouch configuration
mkdir ­p $HOME/.kde/share/config
cp ­a $TELE_SHARE/ktouchrc $HOME/.kde/share/config/
# Create public_html at $HOME
mkdir $HOME/public_html
# Create Floppy icon on Desktop
echo ­e "
[Desktop Entry]
Name=Acessar Disquete
Name[pt_BR]=Acessar Disquete
Type=Application
Icon=/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png
Exec=nautilus sftp://root@$USER/floppy" > $HOME/Desktop/Acessar\
Disquete.desktop
# Create CD­ROM icon on Desktop
CDROM=$(ssh root@$USER 'hwinfo ­­cdrom | grep "Device File" | cut ­d: ­f2 | sed
s/\ //g')
[ ! ­z "$CDROM" ] &&\
ssh root@$USER "ln ­sf $CDROM /tmp/cdrom" &&\
cat <<EOF > $HOME/Desktop/Acessar\ CD­ROM.desktop
[Desktop Entry]
Name=Acessar CD­ROM
Name[pt_BR]=Acessar CD­ROM
Type=Application
Icon=/usr/share/icons/telecentro/48x48/devices/cdrom_mount.png
Exec=nautilus sfp://root@$USER/cdrom
EOF
# Create USB­STORAGE icon on Desktop
USB=$(ssh root@$USER 'hwinfo ­­scsi | grep "Device File" | cut ­d: ­f2 | sed s/\
//g')
[ ! ­z "$USB" ] &&\
USB=${USB}1
ssh root@$USER "ln ­sf $USB /tmp/camera" &&\
cat <<EOF > $HOME/Desktop/Acessar\ Dispositivo\ USB.dekstop
[Desktop Entry]
Name=Acessar Dispositivo USB
Name[pt_BR]=Acessar Dispositivo USB
Type=Application
Icon=/usr/share/icons/telecentro/48x48/devices/camera.png
Exec=nautilus sftp://root@$USER/usb
EOF
# Copy report files to $HOME
mkdir $HOME/.hw 2>&1 > /dev/null &&\
for file in cpuinfo.txt meminfo.txt pci.txt
do
scp root@$USER:/tmp/$file $HOME/.hw
done
# Start session
/usr/bin/xloadimage ­fullscreen ­onroot /usr/share/wallpapers/wallpaper­
loading.jpg
gnome­session
­­ /usr/local/bin/formatar­disquete.sh
#!/bin/bash
#
# formatar­disquete.sh
# # Este script permite a formatação de disquete
# localmente no thin­client
#
# Author: Kung te Yang <[email protected]>
#
# Version: @(#) 20050818 18­Ago­2005
#
FS=$(zenity \
­­title="Formatar Disquete" \
­­width=410 ­­height=183 \
­­window­icon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \
­­list \
­­radiolist \
­­text="Selecione o sistema de arquivo:" \
­­column="" \
­­column="Sistema de Arquivo" \
­­column="Descricao" \
TRUE "vfat" "Compativel no Windows" \
FALSE "ext2" "Compativel no Linux")
check_floppy()
{
ssh ­q root@$USER 'umount /floppy; dd if=/dev/zero of=/dev/fd0 bs=1
count=1'
}
format_floppy()
{
ssh ­q root@$USER 'fdformat ­n /dev/fd0' | \
zenity ­­title "Formatar Disquete" \
­­window­
icon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \
­­progress ­­text="Formatando o disquete ..." ­­pulsate ­­auto­close }
createfs()
{
COMMAND="mkfs.$1 /dev/fd0; mount /floppy"
echo $COMMAND
ssh ­q root@$USER $COMMAND | \
zenity ­­title "Formatar Disquete" \
­­window­
icon="/usr/share/icons/telecentro/48x48/devices/3floppy_unmount.png" \
­­progress ­­pulsate ­­text="Criando o sistema de arquivo ..."
}
# main
check_floppy
if [ $? ­ne 0 ]
then
zenity \
­­title="Formatar Disquete" \
­­error ­­text="O disquete nao foi encontrado ou esta corrompido!"
exit 1
fi
format_floppy
sleep 1
createfs $FS
­­ Lista de pacotes instalados
aalib1
adduser
airstrike
airstrike­common
anjuta
anjuta­common
apache
apache­common
apache2­utils
apt
apt­utils
arj
aspell
aspell­bin
aspell­en
aspell­pt­br
aspell­pt­common
at­spi
atftpd
atlas3­base
aumix
base­config
base­files
base­passwd
bash
bc
beep­media­player
binutils
blt
bluefish
brazilian­conjugate
bsdmainutils
bsdutils
bzip2
cabextract
capplets
capplets­data
cdrecord
console­common
console­data
console­tools
coreutils
cpio
cpp
cpp­3.3
cramfsprogs
cron
cupsomatic­ppd
cupsys
cupsys­bsd
cupsys­client
cupsys­driver­gimpprint
cupsys­driver­gimpprint­
data
dash
dbus­1
dbus­glib­1
debconf
debconf­i18n
debconf­utils
debianutils
deborphan
debsums
defoma
desktop­base
desktop­file­utils
dhcp­client
dhcp3­common
dhcp3­server
dia
dia­common
dia­gnome
dia­libs
dialog
dict
dict­freedict­deu­por
dict­freedict­eng­por
dict­freedict­por­deu
dict­freedict­por­eng
dict­gcide
dict­jargon
dict­moby­thesaurus
dict­vera
dict­wn
dictd
dictionaries­common
dictzip
diff
discover1
discover1­data
djview
djvulibre­plugin
dlocate
docbook­dsssl
docbook­xml
dosfstools
dpkg
dpkg­dev
dselect
e2fslibs
e2fsprogs
ed
eject
enigma
enigma­data
epiphany­browser
epiphany­extensions
esound
esound­clients
esound­common
evolution
evolution­data­server
exim4
exim4­base
exim4­config
exim4­daemon­light
fb­music­low
fdutils
festival
festlex­cmu
festlex­poslex
festvox­kallpc16k
file
file­roller
fileutils
findutils
flashplayer­mozilla
fontconfig
foomatic­db
foomatic­db­engine
foomatic­db­gimp­print
foomatic­filters
foomatic­filters­ppds
frozen­bubble
frozen­bubble­data
gaim
gaim­data
gawk
gcalctool
gcc
gcc­3.3
gcc­3.3­base
gcompris
gcompris­data
gcompris­sound­pt
gconf­editor
gconf2
gdb
gedit
gedit­common
gettext
gettext­base
gftp­common
gftp­gtk
ghex
gimp
gimp­data
gimp­data­extras
gimp­python
gimp­svg
gksu
gmemusage
gnome­about
gnome­applets
gnome­applets­data
gnome­control­center
gnome­cups­manager
gnome­desktop­data
gnome­doc­tools
gnome­extra­icons
gnome­games
gnome­games­data
gnome­games­extra­data
gnome­gv
gnome­icon­theme
gnome­keyring
gnome­mag
gnome­media
gnome­mime­data
gnome­panel
gnome­panel­data
gnome­photo­printer
gnome­pilot
gnome­pilot­conduits
gnome­session
gnome­spell
gnome­terminal
gnome­utils
gnome2­user­guide
gnopernicus
gnucap
gnupg
gok
gpaint
gpdf
gphoto2
gpm
gramps
grep
grep­dctrl
groff­base
grub
gs
gs­common
gs­gpl
gsfonts
gsfonts­x11
gstreamer0.8­misc
gstreamer0.8­oss
gtans
gtetrinet
gthumb
gtk2­engines­mist
gtkhtml3.2
guile­1.6­libs
gweled
gzip
hdparm
hicolor­icon­theme
hostname
hotplug
hwdata
hwinfo
ibrazilian
ifupdown
ijsgimpprint
imagemagick
indent
info
initscripts
inkscape
ipchains
iptables
iputils­ping
iso­codes
ispell
kde­i18n­ptbr
kdelibs­bin
kdelibs­data
kdelibs4
kernel­image­2.4.31­
fairsched
ktouch
kudzu
lbreakout2
lbreakout2­data
less
lesstif2
libacl1
libao2
libapache­mod­php4
libapm1
libapr0
libapt­pkg­perl
libart­2.0­2
libarts1
libartsc0
libasound2
libaspell15
libatk1.0­0
libatspi1.0­0
libattr1
libaudio2
libaudiofile0
libavcodeccvs
libbio2jack0
libblkid1
libbonobo2­0
libbonobo2­common
libbonoboui2­0
libbonoboui2­common
libbrlapi
libbz2­1.0
libc6
libc6­dev
libcap1
libcdk4
libcdparanoia0
libcomerr2
libcompfaceg1
libconfig­inifiles­perl
libconsole
libcroco3
libcupsimage2
libcupsys2­gnutls10
libcurl3
libdb1­compat
libdb3
libdb4.1
libdb4.2
libdb4.2++
libdbd­mysql­perl
libdbi­perl
libdirectfb­0.9­20
libdiscover1
libdivxdecore0
libdjvulibre1
libdps1
libdv4
libdvdread3
libebook8
libecal6
libedata­book1
libedata­cal5
libedataserver3
libeel2­2
libeel2­data
libegroupwise6
libelfg0
libesd0
libestools1.2c102
libexif10
libexpat1
libfaac0
libfaad2­0
libfam0c102
libflac6
libfontconfig1
libfreetype6
libfribidi0
libg2c0
libgail­common
libgail­gnome­module
libgail17
libgal2.2­1
libgal2.2­common
libgc1
libgcc1
libgcompris­1­0
libgconf2­4
libgcrypt11
libgda2­3
libgda2­common
libgdbm3
libggi2
libgii0
libgii0­target­x
libgimp2.0
libgimpprint1
libgksu1.2­0
libgksuui1.0­0
libglade2­0
libglib1.2
libglib2.0­0
libglibmm­2.4­1
libgnome­desktop­2
libgnome­keyring0
libgnome­mag2
libgnome­pilot2
libgnome­speech3
libgnome2­0
libgnome2­common
libgnomecanvas2­0
libgnomecanvas2­common
libgnomecups1.0­1
libgnomecupsui1.0­1
libgnomedb2­4
libgnomedb2­common
libgnomeprint2.2­0
libgnomeprint2.2­data
libgnomeprintui2.2­0
libgnomeprintui2.2­
common
libgnomeui­0
libgnomeui­common
libgnomevfs2­0
libgnomevfs2­common
libgnutls11
libgpg­error0
libgphoto2­2
libgphoto2­port0
libgpmg1
libgsf­1
libgstreamer­gconf0.8­0
libgstreamer­plugins0.8­
0
libgstreamer0.8­0
libgtk1.2
libgtk1.2­common
libgtk2.0­0
libgtk2.0­bin
libgtk2.0­common
libgtkhex0
libgtkhtml2­0
libgtkhtml3.2­11
libgtkmm­2.4­1
libgtksourceview­common
libgtksourceview1.0­0
libgtkspell0
libgtop2­2
libguile­ltdl­1
libhal0
libice6
libid3­3.8.3
libid3tag0
libidl0
libidn11
libijs­0.35
libimlib2
libjack0.80.0­0
libjasper­1.701­1
libjpeg62
libkrb53
liblame0
liblcms1
libldap2
liblircclient0
liblocale­gettext­perl
liblockfile1
liblua40
liblualib40
liblzo1
libmad0
libmagic1
libmagick++6
libmagick6
libmetacity0
libmng1
libmodplug0
libmp4­0
libmyspell3
libmysqlclient12
libnautilus­burn0
libnautilus2­2
libncurses5
libncurses5­dev
libncursesw5
libneon23
libnet­daemon­perl
libnetpbm10
libnewt0.51
libnspr4
libnss3
libogg0
liboggflac1
liboil0.2
libopencdk8
libopenexr2
liborbit2
libosp4
libostyle1
libpam­modules
libpam­runtime
libpam0g
libpanel­applet2­0
libpango1.0­0
libpango1.0­common
libpaper1
libpcap0.7
libpcre3
libperl5.8
libpisock8
libpisync0
libplot2
libplrpc­perl
libpng10­0
libpng12­0
libpopt0
libpostproc0
libpstoedit0
libqt3c102­mt
libqthreads­12
libreadline4
libreadline5
librecode0
librsvg2­2
librsvg2­bin
librsvg2­common
libsasl2
libscrollkeeper0
libsdl­console
libsdl­gfx1.2
libsdl­image1.2
libsdl­mixer1.2
libsdl­net1.2
libsdl­perl
libsdl­ttf2.0­0
libsdl1.2debian
libsdl1.2debian­oss
libselinux1
libshout3
libsigc++­2.0­0
libslp1
libsm6
libsmbclient
libsmpeg0
libsoup2.2­7
libspeex1
libss2
libssl0.9.7
libstartup­notification0
libstdc++5
libstlport4.6
libsvga1
libsysfs1
libt1­5
libtasn1­2
libtext­charwidth­perl
libtext­iconv­perl
libtext­wrapi18n­perl
libtextwrap1
libtheora0
libtiff4
libtolua0
libungif4g
libusb­0.1­4
libuuid1
libvorbis0a
libvorbisenc2
libvorbisfile3
libvte­common
libvte4
libwmf­bin
libwmf0.2­7
libwnck­common
libwnck4
libwrap0
libx11­6
libxaw7
libxcursor1
libxext6
libxft1
libxft2
libxi6
libxine1
libxklavier8
libxml2
libxmu6
libxmuu1
libxp6
libxpm4
libxrandr2
libxrender1
libxslt1.1
libxt6
libxtrap6
libxtst6
libxv1
libxvidcore4
libzipios++0c102
libzzip­0­12
linux­kernel­headers
localeconf
localepurge
locales
localization­config
login
logrotate
lsof
luola
luola­data
luola­levels
lynx
lzop
m4
mailx
make
makedev
man­db
manpages
manpages­dev
manpages­pt
mawk
mdadm
meld
menu
menu­xdg
metacity
mime­support
mkisofs
module­init­tools
modutils
mount
mozilla­browser
mozilla­locale­ptbr
mozilla­mplayer
mozilla­psm
mpg321
mplayer­586
mplayer­686
msttcorefonts
myspell­pt­br
mysql­client
mysql­common
mysql­server
nano
nautilus
nautilus­data
ncurses­base
ncurses­bin
net­tools
netbase
netkit­inetd
netpbm
nfs­common
nfs­kernel­server
nvi
openjade
openoffice.org
openoffice.org­bin
openoffice.org­debian­
files
openoffice.org­gtk­gnome
openoffice.org­help­pt­
br
openoffice.org­l10n­en
openoffice.org­l10n­pt­
br
openoffice.org­mimelnk
passwd
patch
pciutils
perl
perl­base
perl­modules
php4
php4­common
php4­mysql
phpmyadmin
planner
pmount
portmap
powermgmt­base
ppp
pppconfig
pppoe
pppoeconf
prelink
procps
psmisc
pstoedit
python
python­glade2
python­gnome2
python­gtk2
python­imaging
python­reportlab
python­tk
python­xml
python2.3
python2.3­dbus
python2.3­glade2
python2.3­gnome2
python2.3­gtk2
python2.3­imaging
python2.3­numeric
python2.3­numeric­ext
python2.3­pygame
python2.3­pyorbit
python2.3­reportlab
python2.3­tk
python2.3­xml
rcconf
read­edid
recode
reiserfsprogs
rsync
scribus
scrollkeeper
sed
sgml­base
sgml­data
shared­mime­info
sketch
slang1
slang1a­utf8
sox
squid
squid­common
ssh
starfighter
starfighter­data
sudo
supertux
supertux­data
syslog­ng
sysv­rc
sysvinit
tar
tcl8.4
tcpd
telnet
tk8.4
totem­xine
tree
ttf­bitstream­vera
ttf­freefont
ttf­opensymbol
tuxpaint
tuxpaint­config
tuxpaint­data
tuxpaint­stamps­default
tuxpuck
tuxtype
ucf
unzip
usbutils
util­linux
vim
vim­common
vim­gnome
vino
vorbis­tools
w32codecs
w3c­dtd­xhtml
wget
whiptail
xbase­clients
xchat
xchat­common
xdebconfigurator
xfonts­base
xfree86­common
xinv3d
xlibmesa­gl
xlibmesa­glu
xlibs
xlibs­data
xloadimage
xml­core
xmms
xnest
xpdf
xpdf­common
xpdf­reader
xpdf­utils
xresprobe
xrestop
xserver­common
xserver­xfree86
xterm
xutils
yelp
zenity
zip
zlib1g

Documentos relacionados