<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss version="2.0">
<channel>
<title>Carlos Rodrigues</title>
<link>http://www.tiddlywiki.com/</link>
<description>administração de sistemas</description>
<language>en</language>
<copyright>Copyright 2008 Carlos Rodrigues</copyright>
<pubDate>Wed, 31 Dec 2008 01:18:54 GMT</pubDate>
<lastBuildDate>Wed, 31 Dec 2008 01:18:54 GMT</lastBuildDate>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<generator>TiddlyWiki 2.4.1</generator>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/carlosefr/wiki" type="application/rss+xml" /><item>
<title>Migrar certificados do Netscape/iPlanet para o Apache</title>
<description>Copiar os ficheiros correspondentes ao certificado que queremos extrair para uma directoria temporária na máquina de destino. Estes estão numa directoria chamada &lt;code&gt;alias&lt;/code&gt;, dentro da instalação do &lt;em&gt;iPlanet&lt;/em&gt;, e deverão ter nomes do tipo &lt;code&gt;nome-cert.db&lt;/code&gt; e &lt;code&gt;nome-key.db&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Na máquina de destino instalar o pacote &lt;code&gt;nss-tools&lt;/code&gt;, se não estiver já instalado.&lt;br&gt;&lt;br&gt;O primeiro passo na extracção dos certificados é a extracção da chave privada. Em primeiro lugar usa-se o comando &lt;code&gt;pk12util&lt;/code&gt; para gerar um ficheiro em formato PKCS#12...&lt;br&gt;&lt;pre&gt;pk12util -d . -P nome- -n Server-Cert -o private.p12 -K password
&lt;/pre&gt;...onde "password" é a senha de acesso ao ficheiro original (que o &lt;em&gt;iPlanet&lt;/em&gt; pede quando arranca). É pedida outra senha (para proteger o ficheiro novo), que deverá ficar em branco.&lt;br&gt;&lt;br&gt;Agora é necessário converter o resultado do comando anterior num ficheiro que possa ser usado pelo Apache (com a chave privada em &lt;em&gt;base64&lt;/em&gt;)...&lt;br&gt;&lt;pre&gt;openssl pkcs12 -in private.p12 -out private.key -nodes -nocerts
&lt;/pre&gt;Novamente, a senha pedida deverá ficar em branco.&lt;br&gt;&lt;br&gt;Passamos então à extracção da chave pública (o certificado). Desta vez usamos o comando &lt;code&gt;certutil&lt;/code&gt; duas vezes, uma para exportar o certificado em formato texto, outra para o exportar em &lt;em&gt;base64&lt;/em&gt;. Na realidade apenas bastaria uma destas alternativas, mas assim o ficheiro fica mais completo.&lt;br&gt;&lt;pre&gt;certutil -d . -P nome- -L -n Server-Cert &amp;gt; certificate.crt
certutil -d . -P nome- -L -n Server-Cert -a &amp;gt;&amp;gt; certificate.crt
&lt;/pre&gt;Se o certificado estiver assinado por uma CA intermédia (situação em que se torna necessário usar a directiva &lt;code&gt;SSLCertificateChainFile&lt;/code&gt; no Apache), o &lt;em&gt;root certificate&lt;/em&gt; desta pode ser extraído desta mesma forma.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Os nomes dos ficheiros originais não devem ser alterados, daí a utilização do parâmetro &lt;code&gt;-P nome-&lt;/code&gt;, caso contrário torna-se &lt;strong&gt;impossível&lt;/strong&gt; extrair a chave privada. Eu perdi horas por causa disto...</description>
<category>linux</category>
<category>security</category>
<category>migration</category>
<link>http://www.tiddlywiki.com/#%5B%5BMigrar%20certificados%20do%20Netscape%2FiPlanet%20para%20o%20Apache%5D%5D</link>
<pubDate>Fri, 26 Dec 2008 18:34:00 GMT</pubDate>
</item>
<item>
<title>Cluster simples com Linux-HA</title>
<description>Os passos seguintes mostram como se pode configurar um &lt;em&gt;cluster&lt;/em&gt; de dois servidores web &lt;a target="_blank" title="External link to http://httpd.apache.org/" href="http://httpd.apache.org/" class="externalLink"&gt;Apache&lt;/a&gt; sobre RHEL 5 (64bit) em modo &lt;em&gt;failover&lt;/em&gt;, usando o serviço &lt;code&gt;heartbeat&lt;/code&gt; do projecto &lt;a target="_blank" title="External link to http://www.linux-ha.org/" href="http://www.linux-ha.org/" class="externalLink"&gt;Linux-HA&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Salvo indicação em contrário, todas as acções indicadas referem-se a ambas as máquinas.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Requisitos&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; Apache instalado e configurado em ambas as máquinas.&lt;/li&gt;&lt;li&gt; As máquinas deverão estar ligadas directamente com um cabo de rede cruzado através de uma segunda interface de rede (por onde passará o tráfego de controlo do &lt;em&gt;cluster&lt;/em&gt;). Para este exemplo, esta será a interface &lt;code&gt;eth1&lt;/code&gt;, com os endereços &lt;code&gt;192.168.100.101&lt;/code&gt; (nó primário) e &lt;code&gt;192.168.100.102&lt;/code&gt; (nó secundário).&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;É também necessário que o Apache esteja parado e inibido de arrancar automaticamente, pois isto irá ser controlado pelo serviço &lt;code&gt;heartbeat&lt;/code&gt;...&lt;br&gt;&lt;pre&gt;$ service httpd stop
$ chkconfig httpd off
&lt;/pre&gt;&lt;br&gt;Os endereços de serviço de ambos os nós deverão estar definidos no ficheiro &lt;code&gt;/etc/hosts&lt;/code&gt;, para evitar dependências com o DNS:&lt;br&gt;&lt;pre&gt;192.168.10.11 node1.example.com node1
192.168.10.12 node2.example.com node2
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Instalação&lt;/h2&gt;&lt;br&gt;Agora é preciso instalar o software. Os pacotes necessários não fazem parte dos repositórios oficiais da Red Hat, mas podemos configurar o repositório do projecto que tem binários para o RHEL. Para isso cria-se um ficheiro &lt;code&gt;/etc/yum.repos.d/lha-2.1-branch.repo&lt;/code&gt; com o seguinte conteúdo:&lt;br&gt;&lt;pre&gt;[lha-2.1-branch]
name=Linux HA v2.1.x branch (RHEL 5)
type=rpm-md
baseurl=http://download.opensuse.org/repositories/server:/ha-clustering:/lha-2.1/RHEL_5/
gpgcheck=1
gpgkey=http://download.opensuse.org/repositories/server:/ha-clustering:/lha-2.1/RHEL_5/repodata/repomd.xml.key
enabled=1
&lt;/pre&gt;Agora já estamos em condições de os instalar com...&lt;br&gt;&lt;pre&gt;$ yum install heartbeat.x86_64
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Numa instalação de 64bit é necessário indicar explicitamente "x86_64" para evitar que os pacotes de 32bit sejam instalados.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Configuração&lt;/h2&gt;&lt;br&gt;Os ficheiros de configuração do &lt;code&gt;heartbeat&lt;/code&gt; residem na directoria &lt;code&gt;/etc/ha.d&lt;/code&gt;.&lt;br&gt;&lt;br&gt;A comunicação entre os nós é autenticada, apesar de circular por uma rede dedicada. A configuração faz-se no ficheiro &lt;code&gt;authkeys&lt;/code&gt;, que tem de estar acessível &lt;strong&gt;apenas&lt;/strong&gt; ao &lt;code&gt;root&lt;/code&gt;...&lt;br&gt;&lt;pre&gt;$ chmod 0600 authkeys
&lt;/pre&gt;&lt;br&gt;Para a autenticação precisamos de uma chave secreta. A forma mais fácil é gerar uma chave aleatória, por exemplo...&lt;br&gt;&lt;pre&gt;$ dd if=/dev/urandom count=1024 | sha1sum
&lt;/pre&gt;&lt;br&gt;Supondo que o resultado deste comando foi &lt;code&gt;46d2393c7ab52836b1169514e8cc857f511041b4&lt;/code&gt;, o ficheiro &lt;code&gt;authkeys&lt;/code&gt; ficará com o seguinte formato:&lt;br&gt;&lt;pre&gt;auth 1
1 sha1 46d2393c7ab52836b1169514e8cc857f511041b4
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Apesar do método de autenticação ser &lt;a tiddlylink="SHA-1" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#SHA-1" href="http://www.tiddlywiki.com/#SHA-1" class="externalLink null"&gt;SHA-1&lt;/a&gt; e de termos usado o comando &lt;code&gt;sha1sum&lt;/code&gt; para gerar a chave secreta, uma coisa não tem relação com a outra.&lt;br&gt;&lt;br&gt;O passo seguinte é definir no ficheiro &lt;code&gt;haresources&lt;/code&gt; que recursos existem no &lt;em&gt;cluster&lt;/em&gt;, e qual o nó primário para estes recursos. Neste caso existe um endereço partilhado &lt;code&gt;192.168.10.10&lt;/code&gt; e o serviço &lt;code&gt;httpd&lt;/code&gt;. Como ambos devem residir no mesmo nó, este ficheiro terá apenas uma linha...&lt;br&gt;&lt;pre&gt;node1.example.com MailTo::root::Apache-Cluster IPaddr2::192.168.10.10/24/eth0 httpd
&lt;/pre&gt;&lt;strong&gt;Nota 1:&lt;/strong&gt; O nome do nó deverá coincidir com o resultado do comando &lt;code&gt;uname -m&lt;/code&gt;.&lt;br&gt;&lt;strong&gt;Nota 2:&lt;/strong&gt; O &lt;code&gt;httpd&lt;/code&gt; corresponde a um serviço na directoria &lt;code&gt;/etc/init.d&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Os recursos são iniciados pela ordem em que estão definidos, pelo que o endereço do &lt;em&gt;cluster&lt;/em&gt; é adicionado à interface &lt;code&gt;eth0&lt;/code&gt; e só depois é arrancado o serviço &lt;code&gt;httpd&lt;/code&gt;. O comando &lt;code&gt;MailTo&lt;/code&gt; permite enviar um alerta ao administrador quando os recursos arrancam ou quando são migrados para outro nó.&lt;br&gt;&lt;br&gt;Partimos então para a configuração do serviço de &lt;code&gt;heartbeat&lt;/code&gt; propriamente dito, no ficheiro &lt;code&gt;ha.cf&lt;/code&gt;, que terá a seguinte forma no &lt;strong&gt;nó primário&lt;/strong&gt;:&lt;br&gt;&lt;pre&gt;debugfile       /var/log/ha-debug
logfile         /var/log/ha-log
logfacility     local0

keepalive       2
deadtime        30
warntime        10
initdead        90

udpport 694
bcast   eth1
ucast   eth1 192.168.100.102

# If this remote host is unreachable for "deadping" seconds, the heartbeat
# enters a failed state and its resources are brought up in the other node.
# However, if the host is unreachable from both cluster nodes the failover
# does not happen (it would be pointless).
ping            192.168.10.254
deadping        20
respawn         hacluster /usr/lib64/heartbeat/ipfail

# Power-cycle the machine if it hangs...
watchdog        /dev/watchdog

auto_failback   on

node    node1.example.com
node    node2.example.com
&lt;/pre&gt;&lt;strong&gt;Nota 1:&lt;/strong&gt; A linha correspondente ao &lt;em&gt;watchdog&lt;/em&gt; deverá ser eliminada se a máquina não tiver esta funcionalidade (ver p.ex. &lt;a tiddlylink="Watchdog em Debian" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Watchdog em Debian" href="http://www.tiddlywiki.com/#Watchdog%20em%20Debian" class="externalLink null"&gt;Watchdog em Debian&lt;/a&gt;).&lt;br&gt;&lt;strong&gt;Nota 2:&lt;/strong&gt; O endereço &lt;code&gt;192.168.100.102&lt;/code&gt; corresponde ao outro nó do &lt;em&gt;cluster&lt;/em&gt;.&lt;br&gt;&lt;br&gt;Esta configuração tem duas particularidades: os recursos voltam sempre ao nó primário assim que este volte a estar disponível (&lt;code&gt;auto_failback on&lt;/code&gt;) e a conectividade de rede é monitorizada fazendo regularmente &lt;em&gt;ping&lt;/em&gt; a uma terceira máquina (que normalmente será o &lt;em&gt;router&lt;/em&gt; da rede).&lt;br&gt;&lt;br&gt;No &lt;strong&gt;nó secundário&lt;/strong&gt; a configuração será praticamente igual, alterando-se apenas o endereço "ucast", ficando:&lt;br&gt;&lt;pre&gt;debugfile       /var/log/ha-debug
logfile         /var/log/ha-log
logfacility     local0

keepalive       2
deadtime        30
warntime        10
initdead        90

udpport 694
bcast   eth1
ucast   eth1 192.168.100.101

# If this remote host is unreachable for "deadping" seconds, the heartbeat
# enters a failed state and its resources are brought up in the other node.
# However, if the host is unreachable from both cluster nodes the failover
# does not happen (it would be pointless).
ping            192.168.10.254
deadping        20
respawn         hacluster /usr/lib64/heartbeat/ipfail

# Power-cycle the machine if it hangs...
watchdog        /dev/watchdog

auto_failback   on

node    node1.example.com
node    node2.example.com
&lt;/pre&gt;&lt;br&gt;Resta-nos iniciar e configurar o serviço &lt;code&gt;heartbeat&lt;/code&gt; para arrancar automaticamente...&lt;br&gt;&lt;pre&gt;$ service heartbeat start
$ chkconfig heartbeat on
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Verificação&lt;/h2&gt;&lt;br&gt;Ao parar o &lt;code&gt;heartbeat&lt;/code&gt; no nó primário, os serviços migram para o nó secundário, o que se pode verificar com...&lt;br&gt;&lt;pre&gt;$ ip address show eth0
$ service httpd status
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; O comando &lt;code&gt;ifconfig&lt;/code&gt; não mostrará o endereço do &lt;em&gt;cluster&lt;/em&gt; pois este é puramente um endereço secundário, e não uma interface de rede virtual.&lt;br&gt;&lt;br&gt;Ao arrancar o &lt;code&gt;heartbeat&lt;/code&gt; no nó primário, os serviços deverão migrar novamente.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Considerações&lt;/h2&gt;&lt;br&gt;É importante aqui referir que o &lt;code&gt;heartbeat&lt;/code&gt; não monitoriza o estado dos recursos. Isto é, se o serviço &lt;code&gt;httpd&lt;/code&gt; parar, &lt;strong&gt;não é arrancado novamente&lt;/strong&gt; nem ocorre uma migração para o nó secundário. Existem formas de o fazer, mas tal está fora do âmbito desta receita.&lt;br&gt;&lt;br&gt;Quando um endereço partilhado migra de um nó para outro, o recurso &lt;code&gt;IPaddr2&lt;/code&gt; encarrega-se de enviar pedidos &lt;em&gt;arp&lt;/em&gt; para a rede de modo a forçar a actualização das tabelas dos seus vizinhos. Isto pode verificar-se fazendo &lt;em&gt;ping&lt;/em&gt; para o endereço de &lt;em&gt;cluster&lt;/em&gt; durante uma migração e constatando que não se perdem pacotes.&lt;br&gt;&lt;br&gt;Quando o serviço &lt;code&gt;heartbeat&lt;/code&gt; é iniciado, aparece uma mensagem "INFO: Resource is stopped". Isto é normal.</description>
<category>linux</category>
<category>cluster</category>
<link>http://www.tiddlywiki.com/#%5B%5BCluster%20simples%20com%20Linux-HA%5D%5D</link>
<pubDate>Fri, 26 Dec 2008 17:48:00 GMT</pubDate>
</item>
<item>
<title>TCP wrappers (hardening)</title>
<description>Mesmo com uma &lt;em&gt;firewall&lt;/em&gt; local configurada, é conveniente ter os serviços que fazem uso dos &lt;em&gt;tcp wrappers&lt;/em&gt; (p.ex. &lt;code&gt;portmap&lt;/code&gt;) limitados à máquina local por omissão. Isto obtém-se editando o ficheiro &lt;code&gt;/etc/hosts.deny&lt;/code&gt; para conter apenas a seguinte linha:&lt;br&gt;&lt;pre&gt;ALL: ALL EXCEPT 127.0.0.0/255.0.0.0
&lt;/pre&gt;&lt;br&gt;No entanto, o &lt;a tiddlylink="OpenSSH" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#OpenSSH" href="http://www.tiddlywiki.com/#OpenSSH" class="externalLink null"&gt;OpenSSH&lt;/a&gt; também faz uso dos &lt;em&gt;tcp wrappers&lt;/em&gt; e este interessa-nos manter aberto. Para isso adiciona-se a linha seguinte ao ficheiro &lt;code&gt;/etc/hosts.allow&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;sshd: ALL
&lt;/pre&gt;&lt;br&gt;A partir daqui, se for necessário, basta adicionar mais linhas a este ficheiro. A lista dos processos que fazem uso dos &lt;em&gt;tcp wrappers&lt;/em&gt; actualmente em execução pode obter-se com o seguinte comando:&lt;br&gt;&lt;pre&gt;$ lsof | grep libwrap | cut -d' ' -f1 | sort -u
&lt;/pre&gt;</description>
<category>linux</category>
<category>security</category>
<link>http://www.tiddlywiki.com/#%5B%5BTCP%20wrappers%20(hardening)%5D%5D</link>
<pubDate>Fri, 26 Dec 2008 13:21:00 GMT</pubDate>
</item>
<item>
<title>Directorias ".DS_Store" na rede</title>
<description>Para impedir que o Mac OS X crie directorias &lt;code&gt;.DS_Store&lt;/code&gt; em &lt;strong&gt;todas&lt;/strong&gt; as partilhas de rede, abrir um terminal e escrever...&lt;br&gt;&lt;pre&gt;$ defaults write com.apple.desktopservices DSDontWriteNetworkStores true
&lt;/pre&gt;Finalmente, fazer &lt;em&gt;logoff&lt;/em&gt; e &lt;em&gt;login&lt;/em&gt; novamente.&lt;br&gt;&lt;br&gt;Esta é uma definição &lt;em&gt;per user&lt;/em&gt;, pelo que é preciso correr este comando para cada uma das contas de utilizador da máquina.</description>
<category>mac</category>
<category>tips</category>
<link>http://www.tiddlywiki.com/#%5B%5BDirectorias%20%22.DS_Store%22%20na%20rede%5D%5D</link>
<pubDate>Sat, 04 Oct 2008 15:31:00 GMT</pubDate>
</item>
<item>
<title>Efeito "glass" na Dock</title>
<description>Para remover o efeito &lt;em&gt;glass&lt;/em&gt; quando a Dock se encontra no fundo do ecrã, abrir um terminal e correr os seguintes comandos:&lt;br&gt;&lt;pre&gt;$ defaults write com.apple.dock no-glass -boolean true
$ killall Dock
&lt;/pre&gt;Para reverter ao original, basta fazer...&lt;br&gt;&lt;pre&gt;$ defaults delete com.apple.dock no-glass
$ killall Dock
&lt;/pre&gt;</description>
<category>mac</category>
<category>tips</category>
<link>http://www.tiddlywiki.com/#%5B%5BEfeito%20%22glass%22%20na%20Dock%5D%5D</link>
<pubDate>Sat, 04 Oct 2008 15:31:00 GMT</pubDate>
</item>
<item>
<title>Passos pós-instalação para RHEL 5</title>
<description>Esta receita segue o meu gosto pessoal e refere-se a um servidor com Red Hat Enterprise Linux 5, não registado, sem actualizações, com o &lt;a tiddlylink="SELinux" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#SELinux" href="http://www.tiddlywiki.com/#SELinux" class="externalLink null"&gt;SELinux&lt;/a&gt; desactivado e sem nenhum &lt;em&gt;role&lt;/em&gt; escolhido durante o processo de instalação.&lt;br&gt;&lt;br&gt;Para começar, registar o sistema na &lt;em&gt;Red Hat Network&lt;/em&gt; para podermos utilizar o &lt;code&gt;yum&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ rhn_register
&lt;/pre&gt;&lt;br&gt;Evitar ter de usar o &lt;code&gt;vi&lt;/code&gt; para editar os ficheiros de configuração que se seguem...&lt;br&gt;&lt;pre&gt;$ yum install joe
&lt;/pre&gt;&lt;br&gt;Editar o ficheiro &lt;code&gt;/etc/fstab&lt;/code&gt; e...&lt;br&gt;&lt;ol&gt;&lt;li&gt; Para os volumes LVM, substituir as &lt;em&gt;labels&lt;/em&gt; pelo nome do volume;&lt;/li&gt;&lt;li&gt; Acrescentar o parâmetro &lt;code&gt;acl&lt;/code&gt; a todos os &lt;em&gt;filesystems&lt;/em&gt; &lt;code&gt;ext3&lt;/code&gt; locais, excepto a &lt;code&gt;/boot&lt;/code&gt;;&lt;/li&gt;&lt;li&gt; Adicionar uma entrada para o leitor de CD:&lt;/li&gt;&lt;/ol&gt;&lt;pre&gt;/dev/cdrom /media/cdrom auto defaults,ro,noauto 0 0
&lt;/pre&gt;&lt;br&gt;Não queremos mostrar demasiada informação sobre a máquina aos utilizadores que se ligam remotamente, portanto criamos um novo ficheiro &lt;code&gt;/etc/issue.net&lt;/code&gt;. Por exemplo:&lt;br&gt;&lt;pre&gt;/*
 |
 | Welcome to &amp;lt;maquina&amp;gt;
 |
 | Authorized access only. All connections are logged.
 | Apenas acesso autorizado. Todas as ligacoes sao registadas.
 |
 */
&lt;/pre&gt;&lt;br&gt;Adicionar o utilizador criado durante a instalação ao grupo &lt;code&gt;users&lt;/code&gt; com o comando:&lt;br&gt;&lt;pre&gt;$ usermod -G users &amp;lt;utilizador&amp;gt;
&lt;/pre&gt;&lt;br&gt;Editar o ficheiro &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; e definir...&lt;br&gt;&lt;pre&gt;PermitRootLogin no     # não queremos acessos remotos do root
AllowGroups users      # não queremos aceitar qualquer utilizador
Banner /etc/issue.net  # queremos mostrar uma mensagem antes do login
&lt;/pre&gt;&lt;br&gt;Correr o comando &lt;code&gt;visudo&lt;/code&gt; para alterar a configuração do &lt;code&gt;sudo&lt;/code&gt; e adicionar...&lt;br&gt;&lt;pre&gt;Defaults targetpw         # pedir a password do root em vez da password do utilizador
utilizador ALL=(ALL) ALL  # dar privilégios ao utilizador criado durante a instalação
&lt;/pre&gt;&lt;br&gt;Infelizmente, algum software proprietário ainda tem problemas com internacionalização. Por isso, edita-se o ficheiro &lt;code&gt;/etc/sysconfig/i18n&lt;/code&gt; e substitui-se &lt;code&gt;en_US.UTF-8&lt;/code&gt; por...&lt;br&gt;&lt;pre&gt;LANG="en_US"
&lt;/pre&gt;&lt;br&gt;No ficheiro &lt;code&gt;/etc/hosts&lt;/code&gt;, desassociar o &lt;em&gt;hostname&lt;/em&gt; da máquina do nome &lt;code&gt;localhost&lt;/code&gt; e adicionar a seguinte linha:&lt;br&gt;&lt;pre&gt;127.0.1.1       machine.example.com machine
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Se irá existir algum serviço a correr que obrigue a que o &lt;em&gt;hostname&lt;/em&gt; da máquina esteja associado ao mesmo endereço registado no DNS (p.ex. &lt;code&gt;rmiregistry&lt;/code&gt;) &lt;strong&gt;e&lt;/strong&gt; este for um endereço estático, deve ser usado em vez de &lt;code&gt;127.0.1.1&lt;/code&gt;. Se o endereço registado no DNS for atribuído dinamicamente, a linha deve ser omitida completamente.&lt;br&gt;&lt;br&gt;Instalar o pacote &lt;code&gt;sendmail-cf&lt;/code&gt; para podermos alterar a configuração do &lt;code&gt;sendmail&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ yum install sendmail-cf
&lt;/pre&gt;Editar o ficheiro &lt;code&gt;/etc/mail/sendmail.mc&lt;/code&gt;, configurar o &lt;code&gt;SMART_HOST&lt;/code&gt; e correr &lt;code&gt;make&lt;/code&gt; para gerar a configuração nova.&lt;br&gt;&lt;br&gt;Editar o ficheiro &lt;code&gt;/etc/aliases&lt;/code&gt; para enviar o email do &lt;code&gt;root&lt;/code&gt; também para o endereço do administrador:&lt;br&gt;&lt;pre&gt;root: root,admin@example.com
&lt;/pre&gt;&lt;br&gt;Desactivar alguns serviços que não interessa ter a correr num servidor:&lt;br&gt;&lt;pre&gt;$ chkconfig avahi-daemon off
$ chkconfig rhnsd off
$ chkconfig yum-updatesd off
&lt;/pre&gt;Activar o &lt;em&gt;Name Service Caching Daemon&lt;/em&gt;:&lt;br&gt;&lt;pre&gt;$ chkconfig nscd on
&lt;/pre&gt;&lt;br&gt;Configurar a monitorização dos discos locais editando o &lt;code&gt;/etc/smartd.conf&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Se a máquina suportar IPMI, instalar o software necessário e activar o serviço:&lt;br&gt;&lt;pre&gt;$ yum install OpenIPMI-tools
$ chkconfig ipmi on
&lt;/pre&gt;Adicionalmente, editar o ficheiro &lt;code&gt;/etc/sysconfig/ipmi&lt;/code&gt; para configurar o &lt;em&gt;watchdog&lt;/em&gt; IPMI.&lt;br&gt;&lt;br&gt;Remover alguns pacotes que não interessam:&lt;br&gt;&lt;pre&gt;$ rpm -e logwatch isdn4k-utils hplip irda-utils pcsc-lite \
         vnc-server ifd-egate ccid coolkey esc autofs bluez-gnome \
         bluez-libs bluez-utils ypbind yp-tools java-1.4.2-gcj-compat \
         libgcj gjdoc antlr hpijs libsane-hpaio sane-backends \
         sane-backends-libs sane-frontends xsane
&lt;/pre&gt;E instalar alguns pacotes interessantes:&lt;br&gt;&lt;pre&gt;$ yum install sysstat procinfo iptraf strace ltrace screen lynx lsscsi gcc gcc-c++
&lt;/pre&gt;&lt;br&gt;Criar um &lt;em&gt;script&lt;/em&gt; executável &lt;code&gt;/etc/profile.d/profile.local.sh&lt;/code&gt; com definições específicas desta máquina (&lt;em&gt;aliases&lt;/em&gt;, acrescentos à &lt;code&gt;PATH&lt;/code&gt;, ...).&lt;br&gt;&lt;br&gt;Criar uma directoria &lt;code&gt;/root/bin&lt;/code&gt; para colocar eventuais &lt;em&gt;scripts&lt;/em&gt; de administração.&lt;br&gt;&lt;br&gt;Fechar o acesso aos serviços que usam &lt;em&gt;tcp wrappers&lt;/em&gt; (ver: &lt;a tiddlylink="TCP wrappers (hardening)" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#TCP wrappers (hardening)" href="http://www.tiddlywiki.com/#TCP%20wrappers%20%28hardening%29" class="externalLink null"&gt;TCP wrappers (hardening)&lt;/a&gt;).&lt;br&gt;&lt;br&gt;Configurar a &lt;em&gt;firewall&lt;/em&gt; com a ferramenta &lt;code&gt;system-config-securitylevel&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Finalmente, fazer as actualizações do sistema e limpar o lixo:&lt;br&gt;&lt;pre&gt;$ yum update
$ yum clean all
$ rpm --rebuilddb
&lt;/pre&gt;&lt;br&gt;Reiniciar a máquina para tornar as configurações efectivas.&lt;br&gt;</description>
<category>linux</category>
<category>redhat</category>
<category>cookbook</category>
<link>http://www.tiddlywiki.com/#%5B%5BPassos%20p%C3%B3s-instala%C3%A7%C3%A3o%20para%20RHEL%205%5D%5D</link>
<pubDate>Fri, 15 Aug 2008 19:53:00 GMT</pubDate>
</item>
<item>
<title>Bloquear ARP</title>
<description>&lt;h2&gt;Problema 1 (balanceamento de carga)&lt;/h2&gt;Temos várias máquinas em &lt;em&gt;cluster&lt;/em&gt; com um &lt;em&gt;load balancer&lt;/em&gt; à frente. O &lt;em&gt;load balancer&lt;/em&gt; responde num endereço &lt;code&gt;10.0.0.2&lt;/code&gt; (endereço do &lt;em&gt;cluster&lt;/em&gt;) e reencaminha o tráfego para uma das máquinas &lt;em&gt;backend&lt;/em&gt; fazendo &lt;em&gt;forward&lt;/em&gt; dos pacotes, sem alterar o endereço IP. Neste caso, para estas máquinas não rejeitarem os pacotes, têm de ter o endereço de &lt;em&gt;cluster&lt;/em&gt; configurado como &lt;em&gt;alias&lt;/em&gt; numa das suas interfaces (normalmente no &lt;em&gt;loopback&lt;/em&gt;). Se não fizermos nada, cada uma delas vai assumir o endereço como seu e responder a pedidos ARP, e aí temos confusão...&lt;br&gt;&lt;h2&gt;Solução&lt;/h2&gt;Em cada uma das máquinas &lt;em&gt;backend&lt;/em&gt; configuramos o endereço do &lt;em&gt;cluster&lt;/em&gt; e bloqueamos os pedidos ARP com...&lt;br&gt;&lt;pre&gt;$ ip addr add 10.0.0.2/32 label lo:0 dev lo
$ arptables -F
$ arptables -A IN -d 10.0.0.2 -j DROP
&lt;/pre&gt;Como salvaguarda para o caso das máquinas lançarem acidentalmente pedidos ARP na rede com o endereço de &lt;em&gt;cluster&lt;/em&gt;, fazemos ainda...&lt;br&gt;&lt;pre&gt;$ arptables -A OUT -s 10.0.0.2 -j mangle --mangle-ip-s $IP_ADDRESS
&lt;/pre&gt;Onde &lt;code&gt;$IP_ADDRESS&lt;/code&gt; é o endereço real da máquina.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Problema 2 (máquina invisível)&lt;/h2&gt;Suponhamos agora que temos uma máquina a capturar tráfego na rede e queremos que ela esteja completamente invisível aos utilizadores. No entanto, também queremos que esteja acessível a partir da máquina do administrador de rede.&lt;br&gt;&lt;h2&gt;Solução&lt;/h2&gt;Na máquina que queremos que seja invisível bloqueamos &lt;strong&gt;todos&lt;/strong&gt; os pedidos ARP e configuramos estaticamente o endereço MAC da máquina do administrador:&lt;br&gt;&lt;pre&gt;$ arptables -F
$ arptables -A IN -j DROP
$ arptables -A OUT -j DROP
$ ip neigh add $ADMIN_BOX_IP lladdr $ADMIN_BOX_MAC nud permanent dev eth0
&lt;/pre&gt;Adicionalmente, se quisermos que esta máquina consiga resolver nomes por DNS, configuramos também o endereço MAC do servidor DNS:&lt;br&gt;&lt;pre&gt;$ ip neigh add $DNS_SRV_IP lladdr $DNS_SRV_MAC nud permanent dev eth0
&lt;/pre&gt;Para que a máquina do administrador de rede consiga iniciar ligações para a máquina invisível, temos de configurar lá o endereço MAC desta...&lt;br&gt;&lt;pre&gt;$ ip neigh add $INVISIBLE_IP lladdr $INVISIBLE_MAC nud permanent dev eth0
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Nota&lt;/h2&gt;Os comandos &lt;em&gt;arptables&lt;/em&gt; indicados acima funcionam em RHEL 5. Noutras distribuições (ex: Debian 4.0) poderá ter de usar-se &lt;code&gt;INPUT/OUTPUT&lt;/code&gt; em vez de &lt;code&gt;IN/OUT&lt;/code&gt;. Para verificar quais os nomes correctos, basta correr o comando &lt;code&gt;arptables -L&lt;/code&gt;.</description>
<category>linux</category>
<category>network</category>
<category>ethernet</category>
<link>http://www.tiddlywiki.com/#%5B%5BBloquear%20ARP%5D%5D</link>
<pubDate>Sun, 24 Feb 2008 19:47:00 GMT</pubDate>
</item>
<item>
<title>Storage em Linux com LVM</title>
<description>Fundamentalmente, o &lt;em&gt;Logical Volume Manager&lt;/em&gt; (LVM) permite-nos agrupar conjuntos de &lt;em&gt;physical volumes&lt;/em&gt; em &lt;em&gt;volume groups&lt;/em&gt;, onde um &lt;em&gt;physical volume&lt;/em&gt; pode ser um disco inteiro (ex: &lt;code&gt;/dev/sda&lt;/code&gt;), uma partição (ex: &lt;code&gt;/dev/sda1&lt;/code&gt;), um &lt;a tiddlylink="RAID-1 (software) em Linux" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1 (software) em Linux" href="http://www.tiddlywiki.com/#RAID-1%20%28software%29%20em%20Linux" class="externalLink null"&gt;RAID por software&lt;/a&gt; (ex: &lt;code&gt;/dev/md0&lt;/code&gt;), um &lt;a tiddlylink="Discos remotos com AoE" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Discos remotos com AoE" href="http://www.tiddlywiki.com/#Discos%20remotos%20com%20AoE" class="externalLink null"&gt;disco remoto&lt;/a&gt; (ex: &lt;code&gt;/dev/etherd/e0.0&lt;/code&gt;), ou qualquer outro &lt;em&gt;device&lt;/em&gt; que se comporte como um disco.&lt;br&gt;&lt;br&gt;O espaço total num &lt;em&gt;volume group&lt;/em&gt; pode então ser dividido em múltiplos &lt;em&gt;volumes lógicos&lt;/em&gt;, sem quaisquer preocupações acerca da sua estrutura física. Mais concretamente, os volumes lógicos podem ser criados com qualquer tamanho, e ser &lt;a tiddlylink="Expandir ou encolher volumes LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Expandir ou encolher volumes LVM" href="http://www.tiddlywiki.com/#Expandir%20ou%20encolher%20volumes%20LVM" class="externalLink null"&gt;aumentados ou encolhidos&lt;/a&gt; conforme necessário. A única limitação é o espaço livre no &lt;em&gt;volume group&lt;/em&gt; pois, como é óbvio, não podemos expandir um volume lógico se o &lt;em&gt;volume group&lt;/em&gt; a que pertence estiver totalmente alocado, por exemplo. Na prática os volumes lógicos são equivalentes a partições, e podem ser formatados com &lt;em&gt;filesystems&lt;/em&gt;, usados como &lt;em&gt;tablespace devices&lt;/em&gt; para bases de dados, etc.&lt;br&gt;&lt;br&gt;As instruções seguintes mostram como se pode configurar um &lt;em&gt;volume group&lt;/em&gt; LVM sobre dois discos de 100Gb (por exemplo) contendo alguns volumes lógicos.&lt;br&gt;&lt;br&gt;Assim, o primeiro passo na criação do novo &lt;em&gt;volume group&lt;/em&gt; é a inicialização dos dois discos como &lt;em&gt;physical volumes&lt;/em&gt;. Como vamos usar todo o espaço disponível nos discos, podemos optar por criar uma partição em cada disco ou podemos simplesmente usar cada um deles directamente, sem partições. O resultado final é idêntico mas, por uma simples questão de gosto, eu prefiro criar partições quando se trata de discos locais.&lt;br&gt;&lt;pre&gt;$ pvcreate /dev/sda1
$ pvcreate /dev/sdb1
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Quando estamos a usar partições de discos como &lt;em&gt;physical volumes&lt;/em&gt; LVM, convém que estas sejam do tipo &lt;em&gt;Linux LVM&lt;/em&gt;. Não é obrigatório que assim seja, mas recomenda-se.&lt;br&gt;&lt;br&gt;Em seguida, criamos o &lt;em&gt;volume group&lt;/em&gt; com o nome &lt;code&gt;vg0&lt;/code&gt;, composto pelos dois &lt;em&gt;physical volumes&lt;/em&gt; inicializados acima:&lt;br&gt;&lt;pre&gt;$ vgcreate vg0 /dev/sda1 /dev/sdb1
&lt;/pre&gt;Depois, podemos experimentar alocar parte dos 200Gb agora disponíveis no &lt;em&gt;volume group&lt;/em&gt; a três volumes lógicos, ficando ainda com algum espaço livre (para &lt;a tiddlylink="Expandir ou encolher volumes LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Expandir ou encolher volumes LVM" href="http://www.tiddlywiki.com/#Expandir%20ou%20encolher%20volumes%20LVM" class="externalLink null"&gt;expansão futura&lt;/a&gt;, ou para permitir a &lt;a tiddlylink="Criar snapshots com o LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Criar snapshots com o LVM" href="http://www.tiddlywiki.com/#Criar%20snapshots%20com%20o%20LVM" class="externalLink null"&gt;criação de snapshots&lt;/a&gt;):&lt;br&gt;&lt;pre&gt;$ lvcreate -L 50G -n lv0 vg0
$ lvcreate -L 100G -n lv1 vg0
$ lvcreate -L 5.5G -n lv2 vg0
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Os nomes dos volumes não têm de ter esta forma (&lt;code&gt;vg0&lt;/code&gt;, &lt;code&gt;lv0&lt;/code&gt;, ...), podem perfeitamente chamar-se "joaquim", ou "manuel", ou o que o utilizador achar que faz sentido.&lt;br&gt;&lt;br&gt;Finalmente, podemos experimentar formatar um deles que fica assim pronto para ser utilizado:&lt;br&gt;&lt;pre&gt;$ mkfs.ext3 /dev/vg0/lv0
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Activação manual&lt;/h2&gt;Em geral, os &lt;em&gt;volume groups&lt;/em&gt; são activados automaticamente, quer seja durante o processo de arranque ou (implicitamente) no momento da sua criação. No entanto, se um ou mais discos contendo volumes LVM for adicionado depois do arranque, é preciso activá-los manualmente. Isto faz-se correndo os comandos:&lt;br&gt;&lt;pre&gt;$ vgscan
$ vgchange -ay
&lt;/pre&gt;Nesta forma o comando &lt;code&gt;vgchange&lt;/code&gt; activa todos os &lt;em&gt;volume groups&lt;/em&gt; detectados pelo comando &lt;code&gt;vgscan&lt;/code&gt;. Se quisermos activar apenas um &lt;em&gt;volume group&lt;/em&gt; em particular, podemos passá-lo como parâmetro:&lt;br&gt;&lt;pre&gt;$ vgchange -ay vg1
&lt;/pre&gt;&lt;strong&gt;Nota 1:&lt;/strong&gt; Se existir colisão de nomes entre os novos &lt;em&gt;volume groups&lt;/em&gt; e os &lt;em&gt;volume groups&lt;/em&gt; já existentes na máquina, este procedimento não pode ser utilizado. Perante esta situação é necessário usar o comando &lt;code&gt;vgexport&lt;/code&gt; (na máquina de origem) e depois utilizar o comando &lt;code&gt;vgimport&lt;/code&gt; (renomeando os volumes) antes da activação poder ser efectuada.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Nota 2:&lt;/strong&gt; Sabendo que a activação manual é mais frequentemente utilizada em situações de emergência, convém referir que na maioria dos &lt;em&gt;rescue disks&lt;/em&gt; apenas está disponível o comando &lt;code&gt;lvm&lt;/code&gt; crú, pelo que todas as operações devem ser invocadas na forma &lt;code&gt;lvm &amp;lt;comando&amp;gt;&lt;/code&gt; (ex: &lt;code&gt;lvm vgscan&lt;/code&gt;).&lt;br&gt;&lt;br&gt;&lt;h2&gt;Informação sobre &lt;em&gt;physical volumes&lt;/em&gt;, &lt;em&gt;volume groups&lt;/em&gt; e volumes lógicos&lt;/h2&gt;Para ver o espaço alocado por um &lt;em&gt;volume group&lt;/em&gt;, os volumes lógicos que contém e os &lt;em&gt;physical volumes&lt;/em&gt; que o compõem, usamos o comando &lt;code&gt;vgdisplay -v vg0&lt;/code&gt;. Adicionalmente, podemos obter um resumo de todos os &lt;em&gt;volume groups&lt;/em&gt;, volumes lógicos e &lt;em&gt;physical volumes&lt;/em&gt; disponíveis na máquina com os comandos &lt;code&gt;vgs&lt;/code&gt;, &lt;code&gt;lvs&lt;/code&gt; e &lt;code&gt;pvs&lt;/code&gt; respectivamente.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Renomear &lt;em&gt;volume groups&lt;/em&gt; e volumes lógicos&lt;/h2&gt;Se for necessário, tanto os volumes lógicos como os &lt;em&gt;volume groups&lt;/em&gt; podem ser renomeados a qualquer momento, desde que estejam activos, mesmo quando têm &lt;em&gt;filesystems&lt;/em&gt; montados. Para tal usam-se os comandos &lt;code&gt;vgrename&lt;/code&gt; e &lt;code&gt;lvrename&lt;/code&gt;. Por exemplo, o seguinte comando muda o nome do volume lógico &lt;code&gt;lv0&lt;/code&gt; para &lt;code&gt;bob&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ lvrename vg0 lv0 bob
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Eliminar &lt;em&gt;volume groups&lt;/em&gt; e volumes lógicos&lt;/h2&gt;Desde que não esteja em uso, um volume lógico pode ser eliminado com o comando &lt;code&gt;lvremove /dev/vg0/lv0&lt;/code&gt;. O espaço libertado fica disponível para reutilização no &lt;em&gt;volume group&lt;/em&gt; a que pertencia.&lt;br&gt;&lt;br&gt;Apesar de ser uma operação menos comum, um &lt;em&gt;volume group&lt;/em&gt; também pode ser eliminado. Para o fazer é necessário eliminar primeiro todos os volumes lógicos nele contidos, e só depois correr o comando &lt;code&gt;vgremove vg0&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Se não for utilizado o parâmetro &lt;code&gt;-f&lt;/code&gt;, ambos os comandos pedem a confirmação do utilizador.</description>
<category>linux</category>
<category>storage</category>
<category>lvm</category>
<link>http://www.tiddlywiki.com/#%5B%5BStorage%20em%20Linux%20com%20LVM%5D%5D</link>
<pubDate>Sat, 23 Feb 2008 18:28:00 GMT</pubDate>
</item>
<item>
<title>Expandir ou encolher volumes LVM</title>
<description>Um dos principais benefícios do &lt;a tiddlylink="Storage em Linux com LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Storage em Linux com LVM" href="http://www.tiddlywiki.com/#Storage%20em%20Linux%20com%20LVM" class="externalLink null"&gt;LVM&lt;/a&gt; é a possibilidade de alterar os tamanhos dos volumes sempre que tal seja necessário, incluindo a alteração do espaço disponível nos &lt;em&gt;volume groups&lt;/em&gt; através da adição ou remoção de discos, sem reiniciar a máquina.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Expandir um volume lógico&lt;/h2&gt;Como se compreende facilmente, para expandir um volume lógico é necessário que o &lt;em&gt;volume group&lt;/em&gt; a que pertence tenha espaço disponível. No entanto, o espaço não tem de ser contíguo nem adjacente ao volume lógico a expandir. Posto isto, e como exemplo, para atribuir mais 10Gb ao volume &lt;code&gt;lv0&lt;/code&gt; usa-se o comando &lt;code&gt;lvextend&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ lvextend -L +10G /dev/vg0/lv0
&lt;/pre&gt;Mas isto só aumenta o tamanho do volume lógico. Se este contiver um &lt;em&gt;filesystem&lt;/em&gt;, é preciso redimensioná-lo também, e a forma de o fazer vai depender do sistema de ficheiros em causa. Se for &lt;code&gt;ext3&lt;/code&gt;, basta usar o comando &lt;code&gt;resize2fs&lt;/code&gt;, sem necessidade de fazer &lt;code&gt;umount&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ resize2fs -p /dev/vg0/lv0
&lt;/pre&gt;Para outros sistemas de ficheiros existirá um comando semelhante, ou até algo completamente diferente, como é o caso do &lt;code&gt;jfs&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ mount -o resize,remount /dev/vg0/lv0
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Encolher um volume lógico&lt;/h2&gt;Para reduzir o tamanho de um volume lógico pode usar-se o comando &lt;code&gt;lvreduce&lt;/code&gt;. No entanto, é preciso ter em conta que a maioria dos sistemas de ficheiros não suportam a redução de tamanho e os que suportam não o permitem fazer sem um &lt;code&gt;umount&lt;/code&gt; prévio.&lt;br&gt;&lt;br&gt;A título de exemplo, eis como se encolhe um volume lógico &lt;code&gt;lv0&lt;/code&gt;, contendo um sistema de ficheiros &lt;code&gt;ext3&lt;/code&gt;, de 20Gb para 15Gb...&lt;br&gt;&lt;br&gt;Para evitar erros nas contas que possam provocar perdas de dados, primeiro encolhemos o &lt;em&gt;filesystem&lt;/em&gt; para um tamanho inferior ao que terá no final:&lt;br&gt;&lt;pre&gt;$ umount /mnt/filesystem
$ e2fsck -f /dev/vg0/lv0
$ resize2fs -p /dev/vg0/lv0 12G
&lt;/pre&gt;De seguida, reduzimos o volume lógico para a dimensão pretendida:&lt;br&gt;&lt;pre&gt;$ lvreduce -L -5G /dev/vg0/lv0
&lt;/pre&gt;Finalmente, expandimos o &lt;em&gt;filesystem&lt;/em&gt; para a totalidade do espaço no volume lógico:&lt;br&gt;&lt;pre&gt;$ resize2fs -p /dev/vg0/lv0
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Se o volume lógico não contiver um &lt;em&gt;filesystem&lt;/em&gt;, mas sim um &lt;em&gt;tablespace&lt;/em&gt; de uma base de dados (por exemplo), a forma mais segura de fazer a redução de tamanho deverá ser semelhante.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Alterar o tamanho de um &lt;em&gt;volume group&lt;/em&gt; (adicionar e remover discos)&lt;/h2&gt;Para adicionar um novo disco ao &lt;em&gt;volume group&lt;/em&gt; &lt;code&gt;vg0&lt;/code&gt;, e assim aumentar o espaço disponível para criar ou expandir volumes lógicos, basta correr os comandos seguintes:&lt;br&gt;&lt;pre&gt;$ pvcreate /dev/sdc1
$ vgextend vg0 /dev/sdc1
&lt;/pre&gt;Por outro lado, para remover um disco é preciso mover o espaço nele alocado (volumes lógicos) para outras zonas do &lt;em&gt;volume group&lt;/em&gt;. Para isto usa-se o comando &lt;code&gt;pvmove&lt;/code&gt; e, como é natural, o &lt;em&gt;volume group&lt;/em&gt; tem de ter espaço livre suficiente para acomodar a migração dos dados...&lt;br&gt;&lt;pre&gt;$ pvmove -v /dev/sdb1
$ vgreduce vg0 /dev/sdb1
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Alterar o tamanho de um &lt;em&gt;physical volume&lt;/em&gt; (expansão implícita do &lt;em&gt;volume group&lt;/em&gt;)&lt;/h2&gt;Se um &lt;em&gt;physical volume&lt;/em&gt; tiver aumentado de tamanho (ex: um &lt;a tiddlylink="RAID-1 (software) em Linux" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1 (software) em Linux" href="http://www.tiddlywiki.com/#RAID-1%20%28software%29%20em%20Linux" class="externalLink null"&gt;RAID por software&lt;/a&gt; que foi &lt;a tiddlylink="Expandir um array RAID-1 (software) em Linux" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Expandir um array RAID-1 (software) em Linux" href="http://www.tiddlywiki.com/#Expandir%20um%20array%20RAID-1%20%28software%29%20em%20Linux" class="externalLink null"&gt;expandido&lt;/a&gt;), para que expaço extra fique disponível no &lt;em&gt;volume group&lt;/em&gt; a que pertence é necessário executar o comando...&lt;br&gt;&lt;pre&gt;$ pvresize /dev/md0
&lt;/pre&gt;</description>
<category>linux</category>
<category>storage</category>
<category>lvm</category>
<link>http://www.tiddlywiki.com/#%5B%5BExpandir%20ou%20encolher%20volumes%20LVM%5D%5D</link>
<pubDate>Sat, 23 Feb 2008 18:27:00 GMT</pubDate>
</item>
<item>
<title>Expandir um array RAID-1 (software) em Linux</title>
<description>Os passos seguintes mostram como se pode expandir um &lt;em&gt;array&lt;/em&gt; &lt;a tiddlylink="RAID-1" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1" href="http://www.tiddlywiki.com/#RAID-1" class="externalLink null"&gt;RAID-1&lt;/a&gt; (software) sem perigo de perder dados e minimizando os tempos de espera enquanto os seus componentes se sincronizam. Se os discos forem &lt;em&gt;hot-swappable&lt;/em&gt;, todas as operações podem ser efectuadas com a máquina em funcionamento e sem reiniciar o sistema.&lt;br&gt;&lt;br&gt;Tomemos o &lt;em&gt;array&lt;/em&gt; &lt;code&gt;md0&lt;/code&gt;, composto por dois discos de 120Gb com uma partição cada (&lt;code&gt;sdb1&lt;/code&gt; e &lt;code&gt;sdc1&lt;/code&gt;). Queremos expandir este &lt;em&gt;array&lt;/em&gt; com dois discos novos de 400Gb.&lt;br&gt;&lt;br&gt;Em primeiro lugar expulsamos o primeiro disco do &lt;em&gt;array&lt;/em&gt;:&lt;br&gt;&lt;pre&gt;$ mdadm --fail /dev/md0 /dev/sdb1
$ mdadm --remove /dev/md0 /dev/sdb1
&lt;/pre&gt;Removemos este disco da máquina e colocamos no seu lugar um disco maior. Com o &lt;code&gt;cfdisk&lt;/code&gt; (ou outra ferramenta de particionamento) criamos neste novo disco uma partição de tipo &lt;em&gt;Linux raid autodetect&lt;/em&gt; e adicionamo-la ao &lt;em&gt;array&lt;/em&gt;:&lt;br&gt;&lt;pre&gt;$ mdadm --add /dev/md0 /dev/sdb1
&lt;/pre&gt;Agora esperamos que o &lt;em&gt;array&lt;/em&gt; se sincronize, o que poderá demorar bastante tempo. Para observar o progresso podemos fazer &lt;code&gt;cat /proc/mdstat&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Com os dados já replicados no disco novo, expulsamos o segundo disco antigo do &lt;em&gt;array&lt;/em&gt;:&lt;br&gt;&lt;pre&gt;$ mdadm --fail /dev/md0 /dev/sdc1
$ mdadm --remove /dev/md0 /dev/sdc1
&lt;/pre&gt;Nesta altura já podemos expandir o &lt;em&gt;array&lt;/em&gt; para o novo espaço disponível, usando o comando:&lt;br&gt;&lt;pre&gt;$ mdadm --grow --size=max /dev/md0
&lt;/pre&gt;Podemos confirmar que o &lt;em&gt;array&lt;/em&gt; aumentou verificando o número de blocos reportados pelo ficheiro &lt;code&gt;/proc/mdstat&lt;/code&gt; ou através do comando &lt;code&gt;mdadm --detail /dev/md0&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Removemos então o segundo disco antigo disco da máquina e colocamos no seu lugar um disco maior. Para este segundo disco já não precisamos de criar a partição manualmente, podemos simplesmente copiar a tabela de partições do primeiro disco (assumindo que os discos são iguais) e adicioná-la ao &lt;em&gt;array&lt;/em&gt;:&lt;br&gt;&lt;pre&gt;$ sfdisk -d /dev/sdb | sfdisk /dev/sdc
$ mdadm --add /dev/md0 /dev/sdc1
&lt;/pre&gt;Novamente, o &lt;em&gt;array&lt;/em&gt; inicia a sincronização dos dados para o novo disco. No entanto, desta vez não temos de esperar pelo fim deste processo para o continuar a utilizar.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Passos seguintes&lt;/h2&gt;Se o &lt;em&gt;array&lt;/em&gt; tiver um sistema de ficheiros &lt;code&gt;ext3&lt;/code&gt; em cima, este pode ser expandido (mesmo sem fazer &lt;code&gt;umount&lt;/code&gt;) com o comando:&lt;br&gt;&lt;pre&gt;$ resize2fs /dev/md0
&lt;/pre&gt;Se o &lt;em&gt;array&lt;/em&gt; estiver integrado num &lt;em&gt;volume group&lt;/em&gt; &lt;a tiddlylink="Storage em Linux com LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Storage em Linux com LVM" href="http://www.tiddlywiki.com/#Storage%20em%20Linux%20com%20LVM" class="externalLink null"&gt;LVM&lt;/a&gt; como um &lt;em&gt;physical volume&lt;/em&gt;, o espaço extra só estará disponível para utilização em volumes lógicos após executado o comando:&lt;br&gt;&lt;pre&gt;pvresize /dev/md0
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Segurança dos dados&lt;/h2&gt;A expulsão dos discos antigos do &lt;em&gt;array&lt;/em&gt; não destrói quaisquer dados, pelo que qualquer um deles (ou ambos) pode ser usado para activar o &lt;em&gt;array&lt;/em&gt; na sua forma inicial em caso de problemas. Desta forma pode dizer-se que a expulsão do primeiro disco constitui imediatamente um &lt;em&gt;backup&lt;/em&gt;.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Notas&lt;/h2&gt;Tal como acontece ao &lt;a tiddlylink="RAID-1 (software) em Linux" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1 (software) em Linux" href="http://www.tiddlywiki.com/#RAID-1%20%28software%29%20em%20Linux" class="externalLink null"&gt;criar&lt;/a&gt; um novo &lt;em&gt;array&lt;/em&gt;, ao colocarmos discos novos convém criar as partições destinadas ao RAID com um tamanho ligeiramente inferior ao do disco físico. Isto permite substituir um disco avariado por outro de um fabricante diferente já que, para um dado tamanho anunciado, discos de fabricantes diferentes podem ter tamanhos reais distintos.</description>
<category>linux</category>
<category>storage</category>
<category>raid</category>
<link>http://www.tiddlywiki.com/#%5B%5BExpandir%20um%20array%20RAID-1%20(software)%20em%20Linux%5D%5D</link>
<pubDate>Sat, 23 Feb 2008 18:15:00 GMT</pubDate>
</item>
<item>
<title>RAID-1 (software) em Linux</title>
<description>Em Linux, qualquer &lt;em&gt;block device&lt;/em&gt; pode ser usado como componente de um &lt;em&gt;array&lt;/em&gt; RAID por software, desde discos físicos a volumes lógicos &lt;a tiddlylink="Storage em Linux com LVM" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Storage em Linux com LVM" href="http://www.tiddlywiki.com/#Storage%20em%20Linux%20com%20LVM" class="externalLink null"&gt;LVM&lt;/a&gt;. No entanto, o mais comum é usar partições de discos, e é isso que vamos usar nos exemplos abaixo.&lt;br&gt;&lt;br&gt;Antes de seguir em frente, é necessário instalar a ferramenta &lt;code&gt;mdadm&lt;/code&gt;. Em Debian, basta fazer...&lt;br&gt;&lt;pre&gt;$ aptitude install mdadm
&lt;/pre&gt;Como extra, este pacote configura imediatamente a monitorização de todos os &lt;em&gt;arrays&lt;/em&gt; RAID activos, enviando notificações para o email do &lt;code&gt;root&lt;/code&gt; sempre que ocorra algo  importante (avaria num disco, por exemplo).&lt;br&gt;&lt;br&gt;&lt;h2&gt;Criação do &lt;em&gt;array&lt;/em&gt;&lt;/h2&gt;Para colocar dois discos em &lt;a tiddlylink="RAID-1" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1" href="http://www.tiddlywiki.com/#RAID-1" class="externalLink null"&gt;RAID-1&lt;/a&gt; (&lt;em&gt;mirror&lt;/em&gt;), começamos por criar no primeiro uma partição de tipo &lt;em&gt;Linux raid autodetect&lt;/em&gt; usando o &lt;code&gt;cfdisk&lt;/code&gt; (ou outra ferramenta de particionamento). Esta partição deverá ser ligeiramente inferior à capacidade total do disco para permitir a sua substituição por um disco de outro fabricante em caso de avaria. (Para uma dada capacidade anunciada, discos de fabricantes diferentes podem ter capacidades ligeiramente diferentes.)&lt;br&gt;&lt;br&gt;No segundo disco deverá ser criada uma partição equivalente. Se os discos são &lt;strong&gt;iguais&lt;/strong&gt;, isto pode ser feito através da simples cópia da tabela de partições do primeiro disco:&lt;br&gt;&lt;pre&gt;$ sfdisk -d /dev/sdb | sfdisk /dev/sdc
&lt;/pre&gt;Se os discos são &lt;strong&gt;diferentes&lt;/strong&gt;, a partição do segundo disco deverá ser criada manualmente. Se, por alguma razão, não se conseguir criar uma partição com exactamente a mesma capacidade da partição do primeiro disco, também não há problema, pois o &lt;em&gt;array&lt;/em&gt; ficará com o tamanho da partição mais pequena. Neste aspecto o RAID por software em Linux é bastante flexível.&lt;br&gt;&lt;br&gt;Criamos então um &lt;em&gt;array&lt;/em&gt; de nome &lt;code&gt;md0&lt;/code&gt; usando o seguinte comando:&lt;br&gt;&lt;pre&gt;$ mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdc1
&lt;/pre&gt;Nesta altura inicia-se o processo de sincronização, cujo progresso pode ser acompanhado com &lt;code&gt;cat /proc/mdstat&lt;/code&gt;. O &lt;em&gt;array&lt;/em&gt; pode começar a ser utilizado imediamente, mesmo enquanto este processo decorre.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Criação do &lt;em&gt;array&lt;/em&gt; (modo degradado)&lt;/h2&gt;É possível criar um &lt;em&gt;array&lt;/em&gt; com apenas um disco, utilizando &lt;code&gt;missing&lt;/code&gt; no lugar do outro disco:&lt;br&gt;&lt;pre&gt;$ mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 missing
&lt;/pre&gt;Isto pode ser útil quando, por exemplo, queremos começar a utilizar um &lt;em&gt;array&lt;/em&gt; imediatamente e ainda não temos o segundo disco disponível. Este pode ser adicionado mais tarde com o comando...&lt;br&gt;&lt;pre&gt;$ mdadm --add /dev/md0 /dev/sdc1
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Debian&lt;/h2&gt;Em Debian, por omissão, todos os módulos associados ao RAID por software são carregados durante o arranque do sistema. Para que apenas sejam carregados os módulos necessários para o &lt;a tiddlylink="RAID-1" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1" href="http://www.tiddlywiki.com/#RAID-1" class="externalLink null"&gt;RAID-1&lt;/a&gt;, devemos actualizar o ficheiro de configuração &lt;code&gt;/etc/mdadm/mdadm.conf&lt;/code&gt; e a imagem &lt;em&gt;initrd&lt;/em&gt; do sistema. Isto faz-se executando os comandos:&lt;br&gt;&lt;pre&gt;$ /usr/share/mdadm/mkconf force-generate
$ update-initramfs -u -k all
&lt;/pre&gt;Note-se que isto é recomendado, mas não é obrigatório. O próprio &lt;em&gt;kernel&lt;/em&gt; detecta e inicializa automaticamente os &lt;a tiddlylink="RAIDs" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAIDs" href="http://www.tiddlywiki.com/#RAIDs" class="externalLink null"&gt;RAIDs&lt;/a&gt; baseados em partições de tipo &lt;em&gt;Linux raid autodetect&lt;/em&gt;, e ter módulos carregados relativos a níveis RAID não utilizados também não faz mal, para além de consumir um pouco de memória.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Mais informação&lt;/h2&gt;Para listar os arrays RAID disponíveis na máquina, pode usar-se o comando:&lt;br&gt;&lt;pre&gt;$ mdadm --detail --scan
&lt;/pre&gt;Para obter mais detalhes sobre um &lt;em&gt;array&lt;/em&gt;, para além do que se pode ver no ficheiro &lt;code&gt;/proc/mdstat&lt;/code&gt;, faz-se...&lt;br&gt;&lt;pre&gt;$ mdadm --detail /dev/md0
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Remover e adicionar discos&lt;/h2&gt;Para remover um disco (partição) de um &lt;em&gt;array&lt;/em&gt; usam-se os comandos seguintes:&lt;br&gt;&lt;pre&gt;$ mdadm --fail /dev/md0 /dev/sdc1
$ mdadm --remove /dev/md0 /dev/sdc1
&lt;/pre&gt;Quando um disco avaria, o sistema marca-o como &lt;em&gt;failed&lt;/em&gt;, pelo que apenas é necessário executar o segundo comando (&lt;code&gt;--remove&lt;/code&gt;) antes de o remover fisicamente da máquina.&lt;br&gt;&lt;br&gt;Para adicionar um disco (partição) novo em substituição de um disco avariado, ou para voltar a adicionar um disco (partição) anteriormente removido:&lt;br&gt;&lt;pre&gt;$ mdadm --add /dev/md0 /dev/sdc1
&lt;/pre&gt;Se adicionarmos um terceiro disco a um &lt;em&gt;array&lt;/em&gt; criado com &lt;code&gt;--raid-devices=2&lt;/code&gt;, este torna-se um &lt;em&gt;spare&lt;/em&gt;. Em caso de avaria de um dos discos activos, o &lt;em&gt;spare&lt;/em&gt; é colocado no seu lugar automaticamente.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Activação manual&lt;/h2&gt;Em alguns casos pode ser necessário activar um &lt;em&gt;array&lt;/em&gt; manualmente. Imaginemos que, por alguma razão, um dos discos de um array &lt;a tiddlylink="RAID-1" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#RAID-1" href="http://www.tiddlywiki.com/#RAID-1" class="externalLink null"&gt;RAID-1&lt;/a&gt; é colocado numa caixa de discos externos e ligada a outra máquina. Para activar um novo &lt;em&gt;array&lt;/em&gt; na máquina de destino, utilizando apenas este disco, é necessário fazer:&lt;br&gt;&lt;pre&gt;$ mdadm --assemble --run /dev/md1 /dev/sdd1
&lt;/pre&gt;Onde &lt;code&gt;md1&lt;/code&gt; é um nome livre na máquina de destino e &lt;code&gt;sdd1&lt;/code&gt; é o nome atribuído ao disco externo.&lt;br&gt;&lt;br&gt;A opção &lt;code&gt;--run&lt;/code&gt; é necessária para activar o &lt;em&gt;array&lt;/em&gt; em modo degradado (sem estarem presentes todos os seus componentes). Se todos os componentes estiverem disponíveis, podemos usar o comando:&lt;br&gt;&lt;pre&gt;$ mdadm --assemble /dev/md1 /dev/sdd1 /dev/sde1
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Destruição de um &lt;em&gt;array&lt;/em&gt;&lt;/h2&gt;Não existe propriamente um comando para destruir um &lt;em&gt;array&lt;/em&gt;. A única forma de o fazer consiste em desactivá-lo e, de seguida, escrever zeros sobre cada um dos componentes. Assim:&lt;br&gt;&lt;pre&gt;$ mdadm --stop /dev/md0
$ mdadm --zero-superblock /dev/sdb1
$ mdadm --zero-superblock /dev/sdc1
&lt;/pre&gt;Assim, mesmo que as partições &lt;code&gt;sdb1&lt;/code&gt; e &lt;code&gt;sdc1&lt;/code&gt; tenham o tipo &lt;em&gt;Linux raid autodetect&lt;/em&gt;, não serão reconhecidas como tal nem activadas automaticamente durante o arranque.</description>
<category>linux</category>
<category>debian</category>
<category>storage</category>
<category>raid</category>
<link>http://www.tiddlywiki.com/#%5B%5BRAID-1%20(software)%20em%20Linux%5D%5D</link>
<pubDate>Sat, 23 Feb 2008 18:12:00 GMT</pubDate>
</item>
<item>
<title>Criar snapshots com o LVM</title>
<description>No LVM, as &lt;em&gt;snapshots&lt;/em&gt; funcionam numa lógica &lt;em&gt;copy-on-write&lt;/em&gt; e inicialmente não ocupam espaço em disco. No entanto, as necessidades de espaço vão aumentando à medida que o volume lógico original vai sendo alterado (e que a própria &lt;em&gt;snapshot&lt;/em&gt; vai sendo alterada, se a estivermos a usar em modo &lt;em&gt;read-write&lt;/em&gt;). Por esta razão é necessário especificar o tamanho máximo que poderão atingir. Claramente este valor depende do tipo de utilização dos volumes em causa, e pode até ser bastante reduzido para &lt;em&gt;snapshots&lt;/em&gt; que irão existir apenas durante um curto período de tempo, mas em geral deverá estar entre 15 e 20% do tamanho do volume original.&lt;br&gt;&lt;br&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Se o espaço alocado à &lt;em&gt;snapshot&lt;/em&gt; se esgotar, esta deixa de poder ser utilizada mas o volume lógico original não sofre quaisquer consequências.&lt;br&gt;&lt;br&gt;Assim, para capturar instantaneamente o estado actual do volume lógico &lt;code&gt;/dev/vg0/lv0&lt;/code&gt; para dentro de uma &lt;em&gt;snapshot&lt;/em&gt; de nome &lt;code&gt;lv0-snap&lt;/code&gt;, com um tamanho máximo de 2Gb, faz-se...&lt;br&gt;&lt;pre&gt;$ lvcreate -L 2G -n lv0-snap -s /dev/vg0/lv0
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Como se torna óbvio, não é possível criar &lt;em&gt;snapshots&lt;/em&gt; se o respectivo &lt;em&gt;volume group&lt;/em&gt; estiver completamente alocado.&lt;br&gt;&lt;br&gt;A partir daqui a &lt;em&gt;snapshot&lt;/em&gt; funciona como um volume perfeitamente normal. Ou seja, se contiver um &lt;em&gt;filesystem&lt;/em&gt; &lt;code&gt;ext3&lt;/code&gt; pode ser usada fazendo...&lt;br&gt;&lt;pre&gt;$ mkdir /mnt/snapshot
$ mount -t ext3 /dev/vg0/lv0-snap /mnt/snapshot
&lt;/pre&gt;&lt;br&gt;E quando já não for necessária, pode ser eliminada com:&lt;br&gt;&lt;pre&gt;$ lvremove -f /dev/vg0/lv0-snap
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Sistemas de ficheiros e UUID's&lt;/h2&gt;Um &lt;em&gt;filesystem&lt;/em&gt; contido numa &lt;em&gt;snapshot&lt;/em&gt; é uma cópia do &lt;em&gt;filesystem&lt;/em&gt; original, pelo que ambos partilham o mesmo identificador único (UUID). Se isto constitui, ou não, um problema depende do sistema de ficheiros em causa e de estarmos, ou não, a montar &lt;em&gt;filesystems&lt;/em&gt; por UUID. Em geral, devemos alterar o UUID do &lt;em&gt;filesystem&lt;/em&gt; contido na &lt;em&gt;snapshot&lt;/em&gt; sempre que esta não seja descartável a curto prazo e &lt;strong&gt;sempre&lt;/strong&gt; que o UUID esteja a ser usado para montar o &lt;em&gt;filesystem&lt;/em&gt; original.&lt;br&gt;&lt;br&gt;Cada sistema de ficheiros tem um comando diferente para alterar o UUID:&lt;br&gt;&lt;pre&gt;$ tune2fs -U time /dev/vg0/lv0-snap                 # ext3
$ reiserfstune --uuid $(uuidgen) /dev/vg0/lv0-snap  # reiserfs
$ jfs_tune /dev/vg0/lv0-snap -U time                # jfs
$ xfs_admin -U generate /dev/vg0/lv0-snap           # xfs
&lt;/pre&gt;&lt;br&gt;Quanto a montar múltiplos &lt;em&gt;filesystems&lt;/em&gt; com o mesmo UUID, com &lt;code&gt;ext3&lt;/code&gt; ou &lt;code&gt;reiserfs&lt;/code&gt; não existe qualquer tipo de problema, mas com &lt;code&gt;xfs&lt;/code&gt; é necessário indicar que o UUID do &lt;em&gt;filesystem&lt;/em&gt; contido na &lt;em&gt;snapshot&lt;/em&gt; deve ser ignorado:&lt;br&gt;&lt;pre&gt;$ mount -o nouuid -t xfs /dev/vg0/lv0-snap /mnt/snapshot
&lt;/pre&gt;&lt;br&gt;Já com o sistema de ficheiros &lt;code&gt;jfs&lt;/code&gt; a restrição é diferente: antes de montar uma &lt;em&gt;snapshot&lt;/em&gt; é &lt;strong&gt;sempre&lt;/strong&gt; necessário correr um &lt;code&gt;fsck&lt;/code&gt;, mesmo que o seu UUID tenha sido alterado:&lt;br&gt;&lt;pre&gt;$ jfs_fsck /dev/vg0/lv0-snap
&lt;/pre&gt;</description>
<category>linux</category>
<category>storage</category>
<category>lvm</category>
<link>http://www.tiddlywiki.com/#%5B%5BCriar%20snapshots%20com%20o%20LVM%5D%5D</link>
<pubDate>Sat, 23 Feb 2008 14:55:00 GMT</pubDate>
</item>
<item>
<title>Manipular PDFs com o Ghostscript</title>
<description>Concatenar um conjunto de ficheiros PDF num só:&lt;br&gt;&lt;pre&gt;$ gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=output.pdf -dBATCH file1.pdf file2.pdf ... fileN.pdf
&lt;/pre&gt;Extraír uma sequência de páginas para um ficheiro separado:&lt;br&gt;&lt;pre&gt;$ gs -sDEVICE=pdfwrite -dNOPAUSE -dQUIET -dBATCH -dFirstPage=m -dLastPage=n -sOutputFile=output.pdf file.pdf
&lt;/pre&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Em Windows o Ghostscript é invocado com o comando &lt;code&gt;gswin32&lt;/code&gt; em vez de &lt;code&gt;gs&lt;/code&gt;.&lt;br&gt;</description>
<category>pdf</category>
<category>ghostscript</category>
<link>http://www.tiddlywiki.com/#%5B%5BManipular%20PDFs%20com%20o%20Ghostscript%5D%5D</link>
<pubDate>Tue, 29 Jan 2008 00:55:00 GMT</pubDate>
</item>
<item>
<title>Cliente para o Tivoli Storage Manager Backup em Debian</title>
<description>A última versão do cliente de backup do Tivoli Storage Manager para Linux pode ser obtida no &lt;a target="_blank" title="External link to http://www-306.ibm.com/software/sysmgmt/products/support/IBMTivoliStorageManager.html" href="http://www-306.ibm.com/software/sysmgmt/products/support/IBMTivoliStorageManager.html" class="externalLink"&gt;site da IBM&lt;/a&gt;. Neste caso, iremos usar a &lt;a target="_blank" title="External link to http://www-1.ibm.com/support/docview.wss?rs=663&amp;amp;context=SSGSG7&amp;amp;dc=D400&amp;amp;uid=swg24017697&amp;amp;loc=en_US&amp;amp;cs=utf-8&amp;amp;lang=en" href="http://www-1.ibm.com/support/docview.wss?rs=663&amp;amp;context=SSGSG7&amp;amp;dc=D400&amp;amp;uid=swg24017697&amp;amp;loc=en_US&amp;amp;cs=utf-8&amp;amp;lang=en" class="externalLink"&gt;versão 5.5.0.1&lt;/a&gt; (que funciona perfeitamente com servidores de versões mais antigas, se tal for necessário).&lt;br&gt;&lt;br&gt;Para começar, vamos precisar do &lt;code&gt;rpm&lt;/code&gt; e de algumas bibliotecas de compatibilidade:&lt;br&gt;&lt;pre&gt;$ aptitude install rpm libstdc++5
&lt;/pre&gt;&lt;br&gt;Depois, descomprimimos e instalamos o cliente TSM. Neste passo é preciso ter atenção ao facto do pacote descomprimir directamente para a directoria corrente, pelo que convém fazê-lo numa directoria vazia:&lt;br&gt;&lt;pre&gt;$ mkdir tsm
$ cd tsm
$ tar xvf ../5.5.0.1-TIV-TSMBAC-LinuxX86.tar
$ rpm -Uvh --nodeps TIVsm-API.i386.rpm TIVsm-API.i386.rpm
&lt;/pre&gt;&lt;br&gt;Por alguma razão os ficheiros de localização não são correctamente instalados, pelo que o cliente (&lt;code&gt;dsmc&lt;/code&gt;) retornará este erro:&lt;br&gt;&lt;pre&gt;$ /opt/tivoli/tsm/client/ba/bin/dsmc
ANS0101E Unable to open English message repository 'dsmclientV3.cat'.
&lt;/pre&gt;A solução é simples, basta criar o &lt;em&gt;symlink&lt;/em&gt; que está em falta...&lt;br&gt;&lt;pre&gt;$ cd /opt/tivoli/tsm/client/ba/bin
$ ln -s ../../lang/en_US en_US
$ ln -s ../../lang/en_US pt_BR
&lt;/pre&gt;O segundo &lt;em&gt;symlink&lt;/em&gt; (pt_BR) evita que o cliente &lt;em&gt;web&lt;/em&gt; se queixe da falta dos ficheiros de localização para português do Brasil (que estão disponíveis em formato &lt;code&gt;rpm&lt;/code&gt; no site da IBM, se os quisermos instalar).&lt;br&gt;&lt;br&gt;O passo seguinte é a configuração do cliente. Na directoria &lt;code&gt;/opt/tivoli/tsm/client/ba/bin&lt;/code&gt; criamos o ficheiro &lt;code&gt;dsm.opt&lt;/code&gt; com o seguinte conteúdo:&lt;br&gt;&lt;pre&gt;SErvername TSM
&lt;/pre&gt;E também um ficheiro &lt;code&gt;dsm.sys&lt;/code&gt; contendo:&lt;br&gt;&lt;pre&gt;SErvername  TSM
   COMMmethod         TCPip
   TCPPort            1500
   TCPServeraddress   tsmserver.example.com

NODename LINUXBOX1

PASSWORDACCESS  GENERATE

SCHEDLOGNAME            /var/log/tsm/dsmsched.log
SCHEDLOGRETENTION       15
ERRORLOGNAME            /var/log/tsm/dsmerror.log
ERRORLOGRETENTION       15

COMPRESSIon Yes
&lt;/pre&gt;Como é óbvio, o conteúdo acima deverá ser alterado de forma a reflectir a configuração do servidor em causa. No entanto, convém notar três coisas:&lt;br&gt;&lt;ul&gt;&lt;li&gt; Em ambos os ficheiros de configuração, &lt;em&gt;servername&lt;/em&gt; é o nome atribuído ao serviço Tivoli que queremos usar, não o nome da máquina onde este está a correr;&lt;/li&gt;&lt;li&gt; O &lt;em&gt;nodename&lt;/em&gt; pode ser omitido se o cliente estiver registado no servidor com um nome igual ao &lt;em&gt;output&lt;/em&gt; do comando &lt;code&gt;hostname&lt;/code&gt;;&lt;/li&gt;&lt;li&gt; A directoria &lt;code&gt;/var/log/tsm&lt;/code&gt; tem de ser criada à mão.&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Assumindo que a máquina cliente já está configurada correctamente do lado do servidor, podemos verificar se tudo está a funcionar listando (por exemplo) as &lt;em&gt;tapes&lt;/em&gt; disponíveis:&lt;br&gt;&lt;pre&gt;$ /opt/tivoli/tsm/client/ba/bin/dsmadmc
&amp;gt; q vol
&lt;/pre&gt;&lt;br&gt;Se ocorrer um erro relacionado com a falta da biblioteca &lt;code&gt;libgpfs.so&lt;/code&gt;, criamos um ficheiro &lt;code&gt;/etc/ld.so.conf.d/tsm-client.conf&lt;/code&gt; contendo:&lt;br&gt;&lt;pre&gt;/opt/tivoli/tsm/client/api/bin
&lt;/pre&gt;...e corremos o comando &lt;code&gt;ldconfig&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Para poder controlar o calendário de backups a partir do servidor, e para que o cliente &lt;em&gt;web&lt;/em&gt; esteja disponível (em &lt;code&gt;http://localhost:1581&lt;/code&gt;), é necessário colocar o agente a correr:&lt;br&gt;&lt;pre&gt;$ /opt/tivoli/tsm/client/ba/bin/dsmcad
&lt;/pre&gt;Para que isto aconteça automaticamente no arranque da máquina, acrescentamos ao ficheiro &lt;code&gt;/etc/rc.local&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;# Tivoli Storage Manager
if [ -x /opt/tivoli/tsm/client/ba/bin/dsmcad ]; then
        echo "Starting TSM agent service..."
        /opt/tivoli/tsm/client/ba/bin/dsmcad
fi
&lt;/pre&gt;&lt;br&gt;Agora, experimentamos fazer backup de um ficheiro:&lt;br&gt;&lt;pre&gt;$ /opt/tivoli/tsm/client/ba/bin/dsmc incremental &amp;lt;ficheiro&amp;gt;
&lt;/pre&gt;Será necessário fazer &lt;em&gt;login&lt;/em&gt; (com o utilizador definido para o cliente, que poderá ser o utilizador de administração do Tivoli, ou não), mas isto apenas acontece da primeira vez que este comando é executado.&lt;br&gt;&lt;br&gt;Usar sempre o caminho completo nos comandos não é simpático, pelo que acrescentamos ao ficheiro &lt;code&gt;/etc/profile&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;#
# Tivoli Storage Manager Client
#
if [ -d /opt/tivoli/tsm/client/ba/bin ]; then
        export PATH="${PATH}:/opt/tivoli/tsm/client/ba/bin"
fi
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Nota&lt;/h2&gt;Sempre que for instalada uma nova versão do cliente TSM é necessário criar novamente os &lt;em&gt;symlinks&lt;/em&gt; para os ficheiros de localização/tradução. Isto é verdade inclusivamente em distribuições baseadas em &lt;code&gt;rpm&lt;/code&gt;, como o Red Hat Enterprise Linux.&lt;br&gt;</description>
<category>server</category>
<category>backup</category>
<category>debian</category>
<category>etch</category>
<category>linux</category>
<category>ibm</category>
<category>tivoli</category>
<link>http://www.tiddlywiki.com/#%5B%5BCliente%20para%20o%20Tivoli%20Storage%20Manager%20Backup%20em%20Debian%5D%5D</link>
<pubDate>Sat, 15 Dec 2007 14:20:00 GMT</pubDate>
</item>
<item>
<title>Cliente para DB2 em Debian</title>
<description>A IBM apenas suporta o &lt;a tiddlylink="DB2" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#DB2" href="http://www.tiddlywiki.com/#DB2" class="externalLink null"&gt;DB2&lt;/a&gt; nas distribuições enterprise da Red Hat e SUSE, pelo que são necessários alguns procedimentos manuais para instalar o &lt;em&gt;runtime client&lt;/em&gt; em distribuições que não usam &lt;code&gt;rpm&lt;/code&gt;, como a Debian.&lt;br&gt;&lt;br&gt;O primeiro passo é importar o &lt;em&gt;runtime client&lt;/em&gt; a partir do  &lt;a target="_blank" title="External link to http://www-1.ibm.com/support/docview.wss?rs=71&amp;amp;uid=swg21256051" href="http://www-1.ibm.com/support/docview.wss?rs=71&amp;amp;uid=swg21256051" class="externalLink"&gt;site da IBM&lt;/a&gt;. Não é necessário ter um CD original, os &lt;em&gt;fix packs&lt;/em&gt; também permitem fazer uma instalação de raíz. Neste caso vamos usar o &lt;a tiddlylink="DB2" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#DB2" href="http://www.tiddlywiki.com/#DB2" class="externalLink null"&gt;DB2&lt;/a&gt; 8.1 &lt;a tiddlylink="FixPak" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#FixPak" href="http://www.tiddlywiki.com/#FixPak" class="externalLink null"&gt;FixPak&lt;/a&gt; 14 (&lt;a tiddlylink="FP14" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#FP14" href="http://www.tiddlywiki.com/#FP14" class="externalLink null"&gt;FP14&lt;/a&gt;) para sistemas de 32bit.&lt;br&gt;&lt;br&gt;Excepto indicação em contrário, todos os passos seguintes deverão ser efectuados como utilizador &lt;code&gt;root&lt;/code&gt;.&lt;br&gt;&lt;br&gt;&lt;pre&gt;$ mkdir /tmp/DB2-FP14
$ cd /tmp/DB2-FP14
$ wget ftp://ftp.software.ibm.com/ps/products/db2/fixes2/english-us/db2linux2632/client/runtime/FP14_MI00176_RTCL.tar
&lt;/pre&gt;&lt;br&gt;As únicas dependências explícitas são a &lt;em&gt;korn shell&lt;/em&gt; (para correr o &lt;em&gt;script&lt;/em&gt; de instalação) e uma versão da &lt;code&gt;libstdc++&lt;/code&gt; anterior à versão instalada por omissão no Debian 4.0 (etch). Para evitar problemas, não vamos optar pela conversão dos &lt;code&gt;.rpm&lt;/code&gt; para &lt;code&gt;.deb&lt;/code&gt;, pelo que o &lt;code&gt;rpm&lt;/code&gt; também tem de ser instalado...&lt;br&gt;&lt;pre&gt;$ aptitude install ksh libstdc++5 rpm
&lt;/pre&gt;&lt;br&gt;Como a base de dados do &lt;code&gt;rpm&lt;/code&gt; está em branco, temos de forçar a instalação dos pacotes sem verificação de dependências (&lt;code&gt;--nodeps&lt;/code&gt;). Para isso, criamos um &lt;em&gt;script&lt;/em&gt; que irá invocar o &lt;code&gt;rpm&lt;/code&gt; com os parâmetros necessários. Como a directoria &lt;code&gt;/usr/local/bin&lt;/code&gt; aparece primeiro na &lt;code&gt;$PATH&lt;/code&gt; do &lt;code&gt;root&lt;/code&gt;, este &lt;em&gt;script&lt;/em&gt; pode ser criado lá (como &lt;code&gt;/usr/local/bin/rpm&lt;/code&gt;), evitando mexer no verdadeiro &lt;code&gt;rpm&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;#!/bin/bash

if [ "$1" == "-ivh" ]; then
        shift
        /usr/bin/rpm -ivh --nodeps "$@"
else
        /usr/bin/rpm "$@"
fi
&lt;/pre&gt;Tornar este ficheiro executável...&lt;br&gt;&lt;pre&gt;$ chmod +x /usr/local/bin/rpm
&lt;/pre&gt;&lt;br&gt;Em Red Hat, ou SUSE, usar-se-ia o instalador gráfico (&lt;code&gt;db2setup&lt;/code&gt;) e este faria todo o trabalho de instalação e configuração, mas aqui teremos de usar o instalador de texto (&lt;code&gt;db2_install&lt;/code&gt;), que deixa algumas configurações por fazer...&lt;br&gt;&lt;pre&gt;$ cd /tmp/DB2-FP14
$ tar xf FP14_MI00176_RTCL.tar
$ cd rtcl
$ ./db2_install 
&lt;/pre&gt;&lt;br&gt;Após terminado o processo acima, criar uma instância do &lt;a tiddlylink="DB2" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#DB2" href="http://www.tiddlywiki.com/#DB2" class="externalLink null"&gt;DB2&lt;/a&gt; (e respectivos utilizadores)...&lt;br&gt;&lt;pre&gt;$ groupadd db2iadm1
$ groupadd db2fadm1

$ useradd -g db2iadm1 -m -d /home/db2inst1 db2inst1
$ useradd -g db2fadm1 -m -d /home/db2fenc1 db2fenc1

$ /opt/IBM/db2/V8.1/instance/db2icrt -u db2fenc1 db2inst1
&lt;/pre&gt;&lt;br&gt;Ao contrário de outras &lt;a tiddlylink="SGBDs" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#SGBDs" href="http://www.tiddlywiki.com/#SGBDs" class="externalLink null"&gt;SGBDs&lt;/a&gt;, para aceder a uma base de dados remota em &lt;a tiddlylink="DB2" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#DB2" href="http://www.tiddlywiki.com/#DB2" class="externalLink null"&gt;DB2&lt;/a&gt; é necessário registá-la no catálogo local...&lt;br&gt;&lt;pre&gt;$ su - db2inst1
$ db2 catalog tcpip node &amp;lt;server_alias&amp;gt; remote &amp;lt;server&amp;gt; server 50000
$ db2 catalog database &amp;lt;db&amp;gt; as &amp;lt;db_alias&amp;gt; at node &amp;lt;server_alias&amp;gt;
&lt;/pre&gt;Os comandos acima assumem que o servidor estará à escuta na porta &lt;code&gt;tcp/50000&lt;/code&gt;, o que é o normal.&lt;br&gt;&lt;br&gt;Antes de fazer &lt;code&gt;exit&lt;/code&gt; para voltar ao utilizador &lt;code&gt;root&lt;/code&gt;, convém verificar que tudo está a funcionar normalmente. Para isso, deveremos fazer uma &lt;em&gt;query&lt;/em&gt; à base de dados. Neste caso vamos apenas listar as tabelas:&lt;br&gt;&lt;pre&gt;$ db2 connect to &amp;lt;db_alias&amp;gt; user &amp;lt;username&amp;gt; using &amp;lt;password&amp;gt;
$ db2 list tables
$ db2 terminate
&lt;/pre&gt;&lt;br&gt;Para que qualquer utilizador da máquina possa ligar-se à base de dados remota, é preciso acrescentar as linhas seguintes ao ficheiro &lt;code&gt;/etc/profile&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;if [ -f /home/db2inst1/sqllib/db2profile ]; then
        . /home/db2inst1/sqllib/db2profile
        export PATH="${PATH}:/opt/IBM/db2/8.1/bin"
fi
&lt;/pre&gt;Ou, para quem usar &lt;em&gt;shells&lt;/em&gt; derivadas da &lt;code&gt;csh&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;$ ln -s /home/db2inst1/sqllib/db2cshrc /etc/csh/login.d/
&lt;/pre&gt;&lt;br&gt;Para terminar, podemos remover o &lt;em&gt;script&lt;/em&gt; &lt;code&gt;/usr/local/bin/rpm&lt;/code&gt; para que tudo fique como estava inicialmente.&lt;br&gt;</description>
<category>server</category>
<category>db2</category>
<category>debian</category>
<category>etch</category>
<category>linux</category>
<category>ibm</category>
<category>db</category>
<link>http://www.tiddlywiki.com/#%5B%5BCliente%20para%20DB2%20em%20Debian%5D%5D</link>
<pubDate>Thu, 01 Nov 2007 16:04:00 GMT</pubDate>
</item>
<item>
<title>Envio de e-mail externo através de um smarthost autenticado (Exim 4)</title>
<description>Para que uma instalação Debian consiga enviar e-mail para fora usando um servidor SMTP que força o uso de autenticação necessitamos de, em primeiro lugar, reconfigurar o Exim:&lt;br&gt;&lt;pre&gt;$ dpkg-reconfigure exim4-config
&lt;/pre&gt;&lt;br&gt;Nos painéis de configuração apresentados pelo &lt;em&gt;debconf&lt;/em&gt;, estas são as opções mais importantes:&lt;br&gt;&lt;ul&gt;&lt;li&gt; Escolher a opção «&lt;em&gt;mail sent by smarthost; received via SMTP or fetchmail&lt;/em&gt;» no painel «&lt;em&gt;General type of mail configuration&lt;/em&gt;»;&lt;/li&gt;&lt;li&gt; Inserir o nome do servidor de mail que irá fazer &lt;em&gt;relay&lt;/em&gt; (p.ex: &lt;code&gt;smtp.telepac.pt&lt;/code&gt;) no painel «&lt;em&gt;IP address or host name of the outgoing smarthost&lt;/em&gt;»;&lt;/li&gt;&lt;li&gt; Responder &lt;strong&gt;sim&lt;/strong&gt; à questão «&lt;em&gt;Hide local mail in outgoing mail?&lt;/em&gt;»;&lt;/li&gt;&lt;li&gt; O passo anterior faz com que os e-emails enviados a partir da máquina local possam ter como remetente &lt;code&gt;user@dominio.valido&lt;/code&gt;. A configuração deste domínio faz-se no painel «&lt;em&gt;Visible domain name for local users&lt;/em&gt;».&lt;/li&gt;&lt;/ul&gt;&lt;br&gt;Isto seria suficiente para enviar e-mail para fora a partir de, por exemplo, uma rede interna de uma empresa, mas muitos &lt;a tiddlylink="ISPs" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#ISPs" href="http://www.tiddlywiki.com/#ISPs" class="externalLink null"&gt;ISPs&lt;/a&gt; configuram os seus servidores para negarem o &lt;em&gt;relay&lt;/em&gt; de e-mail a utilizadores não autenticados, mesmo a partir das suas próprias redes, por questões de segurança.&lt;br&gt;&lt;br&gt;Sempre que o Exim contactar o servidor &lt;code&gt;smtp.telepac.pt&lt;/code&gt; para envio de e-mail, deverá fazer &lt;em&gt;login&lt;/em&gt; com o utilizador &lt;code&gt;utilizador&lt;/code&gt; e password &lt;code&gt;password&lt;/code&gt;. Tal consegue-se acrescentando uma linha ao ficheiro &lt;code&gt;/etc/exim4/passwd.client&lt;/code&gt;...&lt;br&gt;&lt;pre&gt;smtp.telepac.pt:utilizador:password
&lt;/pre&gt;&lt;br&gt;Se o servidor do ISP só aceita autenticação simples (sem cifra), é ainda preciso criar um ficheiro &lt;code&gt;/etc/exim4/exim4.conf.localmacros&lt;/code&gt; contendo a seguinte linha:&lt;br&gt;&lt;pre&gt;AUTH_CLIENT_ALLOW_NOTLS_PASSWORDS=1
&lt;/pre&gt;Para tornar a configuração efectiva, reiniciar o Exim:&lt;br&gt;&lt;pre&gt;$ invoke-rc.d exim4 restart
&lt;/pre&gt;&lt;br&gt;Para verificar que tudo está a funcionar correctamente, experimentar enviar um e-mail para um endereço externo...&lt;br&gt;&lt;pre&gt;$ echo "corpo da mensagem" | mail alguem@algures.com -s "teste de envio de email externo"
&lt;/pre&gt;E, já agora, verificar também que a entrega de e-mail local continua a funcionar...&lt;br&gt;&lt;pre&gt;$ echo "corpo da mensagem" | mail utilizador -s "teste de envio de email local"
$ mail -u utilizador
&lt;/pre&gt;&lt;br&gt;&lt;h2&gt;Nota&lt;/h2&gt;Antes de tentar fazer &lt;em&gt;login&lt;/em&gt;, o Exim faz um &lt;em&gt;reverse lookup&lt;/em&gt; ao endereço IP do servidor que está a tentar contactar, e é o resultado desse &lt;em&gt;reverse lookup&lt;/em&gt; que é pesquisado no ficheiro &lt;code&gt;passwd.client&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Assim, no exemplo da Telepac acima, podemos confimar que o nome &lt;code&gt;smtp.telepac.pt&lt;/code&gt; funciona com:&lt;br&gt;&lt;pre&gt;$ host smtp.telepac.pt
smtp.telepac.pt has address 212.55.154.44
$ host 212.55.154.44
44.154.55.212.in-addr.arpa domain name pointer smtp.telepac.pt.
&lt;/pre&gt;Mas no exemplo a seguir já teriamos de usar &lt;code&gt;outmail.example.com&lt;/code&gt; em vez de &lt;code&gt;smtp.example.com&lt;/code&gt;...&lt;br&gt;&lt;pre&gt;$ host smtp.example.com
smtp.example.com has address 172.16.1.10
$ host 172.16.1.10
10.1.16.172.in-addr.arpa domain name pointer outmail.example.com.
&lt;/pre&gt;</description>
<category>linux</category>
<category>debian</category>
<link>http://www.tiddlywiki.com/#%5B%5BEnvio%20de%20e-mail%20externo%20atrav%C3%A9s%20de%20um%20smarthost%20autenticado%20(Exim%204)%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 22:02:00 GMT</pubDate>
</item>
<item>
<title>Activação do módulo 'vmxnet' em Debian</title>
<description>Para evitar que o módulo &lt;code&gt;pcnet32&lt;/code&gt; capture a placa de rede antes do módulo &lt;code&gt;vmxnet&lt;/code&gt;, é preciso que este último seja carregado o mais cedo possível, pelo &lt;code&gt;initrd&lt;/code&gt;.&lt;br&gt;&lt;br&gt;Em primeiro lugar, adicionar o seguinte ao ficheiro &lt;code&gt;/etc/initramfs-tools/modules&lt;/code&gt;:&lt;br&gt;&lt;pre&gt;# Override "pcnet32"...
vmxnet
&lt;/pre&gt;Em seguida, é necessário regenerar o &lt;code&gt;initrd.img&lt;/code&gt; do kernel que está activo actualmente, correndo...&lt;br&gt;&lt;pre&gt;$ update-initramfs -u -k $(uname -r)
&lt;/pre&gt;Para confirmar que tudo ficou a funcionar, reiniciar a máquina virtual. Depois, como &lt;code&gt;root&lt;/code&gt;, fazer...&lt;br&gt;&lt;pre&gt;$ rmmod pcnet32
$ ping www.google.com
&lt;/pre&gt;Se tudo estiver bem, a remoção do módulo &lt;code&gt;pcnet32&lt;/code&gt; não terá qualquer efeito e o &lt;code&gt;ping&lt;/code&gt; funcionará correctamente.&lt;br&gt;</description>
<category>linux</category>
<category>vmware</category>
<category>debian</category>
<category>etch</category>
<link>http://www.tiddlywiki.com/#%5B%5BActiva%C3%A7%C3%A3o%20do%20m%C3%B3dulo%20'vmxnet'%20em%20Debian%5D%5D</link>
<pubDate>Sun, 23 Sep 2007 21:07:00 GMT</pubDate>
</item>
<item>
<title>Nomes fixos para dispositivos USB</title>
<description>Numa situação em que existem diversos dispositivos USB idênticos ligados a uma máquina, a ordem pela qual são associados a &lt;em&gt;devices&lt;/em&gt; na directoria &lt;code&gt;/dev&lt;/code&gt; depende da ordem pela qual são ligados. Nestes casos, desligar e voltar a ligar um dispositivo, bem como diferentes ordens de inicialização dos dispositivos após um &lt;em&gt;reboot&lt;/em&gt;, pode resultar num &lt;em&gt;device&lt;/em&gt; diferente.&lt;br&gt;&lt;br&gt;Para evitar depender dos &lt;em&gt;devices&lt;/em&gt; directamente, podemos usar o &lt;code&gt;udev&lt;/code&gt; para criar um &lt;em&gt;symlink&lt;/em&gt; com um determinado nome, que apontará sempre para o &lt;em&gt;device&lt;/em&gt; associado ao dispositivo que queremos.&lt;br&gt;&lt;br&gt;Por exemplo, se tivermos uma máquina fotográfica digital e uma &lt;em&gt;pen&lt;/em&gt; USB, e uma vez que ambas são reconhecidas como discos, tanto podemos ter a máquina fotográfica como &lt;code&gt;/dev/sda1&lt;/code&gt; e a &lt;em&gt;pen&lt;/em&gt; como &lt;code&gt;/dev/sdb1&lt;/code&gt;, como podemos ter o contrário, dependendo de qual dos dispositivos ligamos primeiro.&lt;br&gt;&lt;br&gt;Para ter a máquina fotográfica sempre acessível através de &lt;code&gt;/dev/mycamera&lt;/code&gt;, começamos por a ligar e descobrir qual o &lt;em&gt;device&lt;/em&gt; que lhe foi atribuído (usando o comando &lt;code&gt;dmesg&lt;/code&gt;). Por exemplo, para uma máquina fotográfica da Olympus, poderíamos fazer...&lt;br&gt;&lt;pre&gt;$ dmesg | grep -A 2 -i olympus
&lt;/pre&gt;...e ficaríamos a saber que a máquina ficou associada ao disco &lt;code&gt;sdb&lt;/code&gt; a partir do seguinte resultado...&lt;br&gt;&lt;pre&gt;  Vendor: OLYMPUS   Model: X100,D540Z,C310Z  Rev: 1.00
  Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sdb: 512000 512-byte hdwr sectors (262 MB)
&lt;/pre&gt;Podemos então obter mais informação acerca do dispositivo (&lt;code&gt;/dev/sdb1&lt;/code&gt;) com o objectivo de descobrir algo que o identifique unicamente...&lt;br&gt;&lt;pre&gt;$ udevinfo -a -p $(udevinfo -q path -n /dev/sdb1)
&lt;/pre&gt;O resultado deste comando é uma lista enorme de atributos, mas o que realmente interessa é encontrar o bloco onde aparece a marca e/ou o modelo do dispositivo. No caso da máquina fotográfica acima, seria...&lt;br&gt;&lt;pre&gt;  looking at parent device '/devices/pci0000:00/0000:00:07.2/usb1/1-1':
    KERNELS=="1-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{serial}=="000365241020"
    ATTRS{product}=="X100,D540Z,C310Z"
    ATTRS{manufacturer}=="OLYMPUS"
    ATTRS{maxchild}=="0"
    ATTRS{version}==" 2.00"
    ATTRS{devnum}=="7"
    ATTRS{speed}=="12"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bcdDevice}=="0100"
    ATTRS{idProduct}=="0105"
    ATTRS{idVendor}=="07b4"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{bmAttributes}=="c0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumInterfaces}==" 1"
&lt;/pre&gt;Os atributos &lt;code&gt;manufacturer&lt;/code&gt;, &lt;code&gt;product&lt;/code&gt; e &lt;code&gt;serial&lt;/code&gt; identificam esta máquina fotográfica sem qualquer sombra de dúvida mas, na prática, o atributo &lt;code&gt;serial&lt;/code&gt; acaba por ser suficiente, já que é pouco provável que alguém tenha o "azar" de ter dois dispositivos USB diferentes com o mesmo número de série...&lt;br&gt;&lt;br&gt;Criamos então um ficheiro na directoria &lt;code&gt;/dev/udev/rules.d&lt;/code&gt; com as nossas regras (apenas uma, por agora). O nome a dar a este ficheiro dependerá da distribuição, mas terá sempre um prefixo que determinará a sua posição na ordem pela qual o &lt;code&gt;udev&lt;/code&gt; interpreta os ficheiros de regras existentes nesta directoria (ordem alfabética). Em Debian podemos chamar-lhe &lt;code&gt;z25_mysymlinks.rules&lt;/code&gt;. O seu conteúdo será...&lt;br&gt;&lt;pre&gt;BUS=="usb", ATTRS{serial}=="000365241020", SYMLINK+="mycamera"
&lt;/pre&gt;Para verificar que esta configuração funciona, desliga-se a máquina fotográfica e volta-se a ligar.&lt;br&gt;&lt;pre&gt;$ ls -l /dev/mycamera
lrwxrwxrwx 1 root root 4 2007-09-09 23:19 /dev/mycamera -&amp;gt; sdb1
&lt;/pre&gt;Vemos então que funcionou. A partir de agora podemos ignorar o &lt;em&gt;device&lt;/em&gt; atribuído à máquina fotográfica e usar &lt;code&gt;/dev/mycamera&lt;/code&gt; sempre que for necessário.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Referências:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; &lt;a target="_blank" title="External link to http://www.reactivated.net/writing_udev_rules.html" href="http://www.reactivated.net/writing_udev_rules.html" class="externalLink"&gt;Writing udev rules&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
<category>linux</category>
<category>udev</category>
<link>http://www.tiddlywiki.com/#%5B%5BNomes%20fixos%20para%20dispositivos%20USB%5D%5D</link>
<pubDate>Sun, 09 Sep 2007 21:44:00 GMT</pubDate>
</item>
<item>
<title>Configurar virtual-hosts no Apache</title>
<description>Em Debian é bastante fácil configurar virtual-hosts no Apache. Para começar, copia-se a configuração &lt;code&gt;default&lt;/code&gt; para servir de base ao novo virtual-host...&lt;br&gt;&lt;pre&gt;$ cd /etc/apache2/sites-available/
$ cp default www-example-com
&lt;/pre&gt;Partindo para a edição do ficheiro &lt;code&gt;www-example-com&lt;/code&gt;, começa-se por remover a linha...&lt;br&gt;&lt;pre&gt;NameVirtualHost *:80
&lt;/pre&gt;...uma vez que não podem existir duas directivas &lt;code&gt;NameVirtualHost&lt;/code&gt; para a mesma combinação &lt;code&gt;endereço:porta&lt;/code&gt; (&lt;code&gt;*:80&lt;/code&gt; significa que o virtual-host está acessível através de &lt;strong&gt;qualquer&lt;/strong&gt; endereço IP configurado na máquina, na porta &lt;strong&gt;80&lt;/strong&gt;).&lt;br&gt;&lt;br&gt;De seguida, adicionam-se as directivas que permitem que os acessos ao endereço &lt;code&gt;http://www.example.com&lt;/code&gt; sejam respondidas pelo virtual-host &lt;code&gt;www-example-com&lt;/code&gt; e não pelo virtual-host &lt;code&gt;default&lt;/code&gt;. Logo após o início do bloco &lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;/code&gt;...&lt;br&gt;&lt;pre&gt;ServerName www.example.com
ServerAlias www
&lt;/pre&gt;&lt;br&gt;Altera-se então a directiva &lt;code&gt;DocumentRoot&lt;/code&gt; para apontar para a directoria correcta. Por exemplo...&lt;br&gt;&lt;pre&gt;DocumentRoot /var/www/sites/www-example-com
&lt;/pre&gt;Para terminar, alteram-se as restantes directivas &lt;code&gt;Directory&lt;/code&gt; de acordo com a &lt;code&gt;DocumentRoot&lt;/code&gt; e activa-se o novo virtual-host...&lt;br&gt;&lt;pre&gt;$ a2ensite www-example-com
$ invoke-rc.d apache2 restart
&lt;/pre&gt;&lt;br&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Para os virtual-hosts que irão ser configurados com SSL importa ter em atenção que existem algumas limitações (ver: &lt;a tiddlylink="Activar HTTPs no Apache" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#Activar HTTPs no Apache" href="http://www.tiddlywiki.com/#Activar%20HTTPs%20no%20Apache" class="externalLink null"&gt;Activar HTTPs no Apache&lt;/a&gt;).</description>
<category>linux</category>
<category>apache</category>
<category>debian</category>
<category>etch</category>
<link>http://www.tiddlywiki.com/#%5B%5BConfigurar%20virtual-hosts%20no%20Apache%5D%5D</link>
<pubDate>Sat, 08 Sep 2007 13:24:00 GMT</pubDate>
</item>
<item>
<title>Configuração automática de proxy (PAC)</title>
<description>Os ficheiros &lt;code&gt;.pac&lt;/code&gt; permitem configurar automaticamente as definições de &lt;em&gt;proxy&lt;/em&gt; para qualquer um dos browsers modernos, evitando a necessidade de especificar manualmente os endereços do(s) servidor(es) e quais as máquinas que devem ser acedidas directamente. Adicionalmente, permitem ao administrador de rede alterar estas definições nos clientes sem pedir a intervenção dos utilizadores.&lt;br&gt;&lt;br&gt;A sintaxe é um subconjunto relativamente simples da linguagem javascript, apenas com algumas funções para tomar decisões baseadas em endereços IP e &lt;a tiddlylink="URLs" refresh="link" target="_blank" title="External link to http://www.tiddlywiki.com/#URLs" href="http://www.tiddlywiki.com/#URLs" class="externalLink null"&gt;URLs&lt;/a&gt;. O ficheiro seguinte demonstra uma possível configuração...&lt;br&gt;&lt;br&gt;&lt;pre&gt;//
// proxy.pac - proxy auto-config for the internal LAN at "example.com"
//

function FindProxyForURL(url, host)
{
        // Clients in the "10.1.1.x" network don't need a proxy...
        if (isInNet(myIpAddress(), "10.1.1.0", "255.255.255.0")) return "DIRECT";

        // Addresses without a explicit domain are considered local...
        if (isPlainHostName(host)) return "DIRECT";

        // Local networks...
        if (isInNet(host, "127.0.0.0", "255.0.0.0")) return "DIRECT";
        if (isInNet(host, "10.0.0.0", "255.0.0.0")) return "DIRECT";
        if (isInNet(host, "172.16.0.0", "255.240.0.0")) return "DIRECT";
        if (isInNet(host, "192.168.0.0", "255.255.0.0")) return "DIRECT";

        // Our domain...
        if (shExpMatch(host, "*.example.com")) return "DIRECT";

        // FTP connections don't require a proxy...
        if (shExpMatch(url, "ftp://*")) return "DIRECT";

        // Everything else has to use our proxy server...
        return "PROXY proxy.example.com:8080";
}
&lt;/pre&gt;&lt;br&gt;Para terminar, basta colocar este ficheiro num servidor web que possa ser contactado directamente pelos clientes, e pedir aos utilizadores para colocarem o seu endereço (p.ex. &lt;code&gt;http://internal.example.com/proxy.pac&lt;/code&gt;) no campo de "configuração automática de proxy" existente no painel de configuração do browser.&lt;br&gt;&lt;br&gt;De notar que os browsers só consultam este ficheiro ao arrancar.&lt;br&gt;&lt;br&gt;&lt;h2&gt;Referências:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt; &lt;a target="_blank" title="External link to http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html" href="http://wp.netscape.com/eng/mozilla/2.0/relnotes/demo/proxy-live.html" class="externalLink"&gt;Navigator Proxy Auto-Config File Format&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
<category>network</category>
<category>security</category>
<link>http://www.tiddlywiki.com/#%5B%5BConfigura%C3%A7%C3%A3o%20autom%C3%A1tica%20de%20proxy%20(PAC)%5D%5D</link>
<pubDate>Sat, 08 Sep 2007 12:14:00 GMT</pubDate>
</item>
</channel>
</rss>
