Como Fazer - Dicas Linux Paul Anderson, paul@geeky1.ebtech.net e Conectiva Informática, info@conectiva.com.br v3.6, Junho de 1998 Este Como Fazer contém aquelas dicas difíceis de encontrar e sugestões que fazem o uso do Linux muito mais agradáveis. ______________________________________________________________________ Índice geral 1. Introdução 2. Dicas Curtas 2.1 Dica Útil do Syslog 2.2 Programa de visualização dos Como Fazer. 2.3 Há espaço livre disponível??? 2.4 Utilitário para limpar os arquivos de históricos 2.5 Programa útil para limpar arquivos core. 2.6 Movendo diretórios ente sistemas de arquivos. 2.7 Descobrindo os maiores diretórios. 2.8 A Gazeta Linux 2.9 Ponteiro para uma atualização do GNU Make 3.70 para mudar o comportamento do VPATH. 2.10 Como evitar que o meu sistema faça a checagem de integridade a cada inicialização? 2.11 Como evitar a checagem dos sistemas de arquivos, causados por dispositivos ocupados durante a inicialização do sistema. 2.12 Como encontrar os maiores arquivos de um disco rígido. 2.13 Como imprimir páginas com margem para arquivamento. 2.14 Um meio de pesquisar em árvores de arquivos por uma expressão regular específica. 2.15 Um programa para limpeza após programas que criam arquivos de cópias de segurança e salvamento automático. 2.16 Como encontrar os processos que estão utilizando mais memória. 2.17 Configurando o vi para Programação C 2.18 Usando ctags para facilitar a programação. 2.19 O que faz com que o sendmail demore 5 minutos na inicialização do Red Hat? 2.20 Como configurar o Red Hat para utilizar o comando ls em cores? 2.21 Como descobrir qual biblioteca em /usr/lib contém determinada função? 2.22 Eu compilei um pequeno programa de testes em C, mas ao executá-lo não aparece nenhuma informação de saída! 3. Dicas Detalhadas 3.1 Compartilhando partições de troca entre o Linux e o Windows. 3.2 Recuperação de arquivos apagados. 3.3 Como utilizar um indicador imutável. 3.4 Sugestão de onde colocar novos programas. 3.5 Convertendo os nomes de todos os arquivos de um diretório para letras minúsculas. 3.6 Encerrando os processos de um usuário. 3.7 Senha de superusuário perdida. 3.8 Como atualizar o Sendmail 3.9 Algumas dicas para novos administradores de sistemas. 3.10 Como configurar o seletor de servidor do xdm. ______________________________________________________________________ 11.. IInnttrroodduuççããoo Bem-vindo ao CCoommoo FFaazzeerr -- DDiiccaass LLiinnuuxx, uma lista de dicas e otimizações que tornam o Linux mais agradável. Tudo o que temos até aqui são idéias minhas e dicas do antigo Como Fazer-Dicas (porque jogá-las fora, certo?). Então caso você queira agregar mais alguns avisos e dicas, fique à vontade e escreva para mim. Assim podemos incluí-los na próxima edição do Como Fazer-Dicas. Paul Anderson - _M_a_n_t_e_n_e_d_o_r _- _C_o_m_o _F_a_z_e_r _- _D_i_c_a_s _L_i_n_u_x . panderso@ebtech.net 22.. DDiiccaass CCuurrttaass 22..11.. DDiiccaa ÚÚttiill ddoo SSyysslloogg PPaauull AAnnddeerrssoonn,, MMaanntteenneeddoorr -- CCoommoo FFaazzeerr -- DDiiccaass LLiinnuuxx Edite o /etc/syslog.conf, e coloque a seguinte linha: # Copia tudo em tty8 *.* /dev/tty8 Um detalhe: _L_E_M_B_R_E_-_S_E _D_E _U_S_A_R _T_A_B _! syslog não gosta de espaços... 22..22.. PPrrooggrraammaa ddee vviissuuaalliizzaaççããoo ddooss CCoommoo FFaazzeerr.. DDiiddiieerr JJuuggeess,, ddjj@@ddeessttiinn..nnffddss..nneett De um iniciante para outro, segue aqui um programa curto que facilita a visualização e pesquisa em documentos Como Fazer - HOWTO. Meus documentos estão em /usr/doc/faq/howto/ e estão compactadas com gzip. O nome dos arquivos são XXX-HOWTO.gz, sendo XXX o assunto. Eu criei o seguinte programa, chamado "howto" no diretório /usr/local/sbin: ______________________________________________________________________ #!/bin/sh if [ "$1" = "" ]; then ls /usr/doc/faq/howto | less else gunzip -c /usr/doc/faq/howto/$1-HOWTO.gz | less fi ______________________________________________________________________ Quando chamado sem argumentos, mostra o conteúdo do diretório que contém os COMO FAZER disponíveis. Então ao se informar a primeira parte do nome do arquivo (antes do hífen) como argumento, ele descompacta (mantendo o original intocado) e mostra o documento. Por exemplo, para ver o documento Serial-HOWTO.gz , deve-se informar: $ howto Serial 22..33.. HHáá eessppaaççoo lliivvrree ddiissppoonníívveell?????? HHaannss ZZooeebbeelleeiinn,, zzoocckkii@@ggoollddffiisshh..ccuubbee..nneett Segue aqui um pequeno programa que checa de tempos em tempos se há espaço em disco suficiente em qualquer dispositivo que esteja montado (discos, cdrom, disquetes, etc.). Caso o espaço acabe, uma mensagem é apresentada a cada X segundos na tela e é enviado um email por dispositivo que esteja sem espaço. ______________________________________________________________________ #!/bin/sh # # $Id: check_hdspace,v 1.18 1996/12/11 22:33:29 root Exp root $ # # # Desde que erros misteriosos ocorreram durante a compilação # quando arquivos encheram o diretório tmp # eu escrevi este programa para ser avisado de que os discos estavam cheios. # # Caso este utilitário evite que o seu servidor exploda mande uma # mensagem de agradecimento para zocki@goldfish.cube.net. # # Caso você realmente saiba como lidar com o sed, por favor desculpe-me! # # Atire e esqueça: ponha 'check_hdspace &' no rc.local. # Cheque o espaço livre nos dispositivos a cada $SLEEPTIME segundos. # Pode-se verificar inclusive disquetes e fitas. # Caso o espaço livre esteja abaixo de $MINFREE (kb), será apresentada # uma mensagem e enviado um email por cada dispositivo em $MAIL_TO_ME. # Caso haja mais espaço livre do que o limite definido, um email pode # também ser enviado. # # TODO: Diferentes $MINFREE para cada dispositivo. # Liberar diretórios /*tmp de coisas antigas e inúteis caso não haja mais espaço # livre. DEVICES='/dev/sda2 /dev/sda8 /dev/sda9' # device; informe seus discos aqui MINFREE=20480 # kb; abaixo daqui, avise-me SLEEPTIME=10 # sec; tempo entre as checagens MAIL_TO_ME='root@localhost' # fool; quem deve ser avisado # ------ a partir daqui nenhuma alteração será necessária (eu espero :) ) ------ MINMB=0 ISFREE=0 MAILED="" let MINMB=$MINFREE/1024 # sim, nós somos rígidos :) while [ 1 ]; do DF="`/bin/df`" for DEVICE in $DEVICES ; do ISFREE=`echo $DF | sed s#.\*$DEVICE" "\*[0-9]\*""\*[0-9]\*" "\*## | sed s#" ".\*##` if [ $ISFREE -le $MINFREE ] ; then let ISMB=$ISFREE/1024 echo "WARNING: $DEVICE only $ISMB mb free." >&2 #echo "more stuff here" >&2 echo -e "\a\a\a\a" if [ -z "`echo $MAILED | grep -w $DEVICE`" ] ; then echo "WARNING: $DEVICE only $ISMB mb free. (Trigger is set to $MINMB mb)" \ | mail -s "WARNING: $DEVICE only $ISMB mb free!" $MAIL_TO_ME MAILEDH="$MAILED $DEVICE" MAILED=$MAILEDH # put further action here like cleaning # up */tmp dirs... fi elif [ -n "`echo $MAILED | grep -w $DEVICE`" ] ; then # Remove mailed marker if enough disk space # again. So we are ready for new mailing action. MAILEDH="`echo $MAILED | sed s#$DEVICE##`" MAILED=$MAILEDH fi done sleep $SLEEPTIME done ______________________________________________________________________ 22..44.. UUttiilliittáárriioo ppaarraa lliimmppaarr ooss aarrqquuiivvooss ddee hhiissttóórriiccooss PPaauull AAnnddeerrssoonn,, MMaanntteenneeddoorr -- CCoommoo FFaazzeerr -- DDiiccaass LLiinnuuxx Caso você seja como eu, deve manter uma lista com centenas de inscritos, mais de cem mensagens por dia chegando pelo UUCP. Bem, o que fazer para lidar com históricos enormes? Instalar chklogs. Chklogs foi escrito por Emilio Grimaldo, grimaldo@panama.iaehv.nl, e a versão atual é a 1.8 disponível em ftp.iaehv.nl:/pub/users/grimaldo/chklogs-1.8.tar.gz. Ele é auto explicativo na instalação (obviamente você verificará o conteúdo do subdiretório info). Uma vez instalado, adicione uma entrada ao crontab como esta: # Executar chklogs as 3:00AM diariamente. 00 21 * * * /usr/local/sbin/chklogs -m Enquanto você estiver lidando isso, avise ao autor quão bom seu software é. :) 22..55.. oohhaammmmeerrss@@ccuu--oonnlliinnee..ccoomm PPrrooggrraammaa úúttiill ppaarraa lliimmppaarr aarrqquuiivvooss ccoorree.. OOttttoo HHaammmmeerrssmmiitthh,, Crie um arquivo chamado rmcores (o autor chama isso de trata-cores) com o seguinte conteúdo: ______________________________________________________________________ #!/bin/sh USAGE="$0 <directory> <message-file>" if [ $# != 2 ] ; then echo $USAGE exit fi echo Apagando... find $1 -name core -atime 7 -print -type f -exec rm {} \; echo email for name in `find $1 -name core -exec ls -l {} \; | cut -c16-24` do echo $name cat $2 | mail $name done ______________________________________________________________________ E adicione uma tarefa ao cron para executar este utilitário periodicamente. 22..66.. MMoovveennddoo ddiirreettóórriiooss eennttee ssiisstteemmaass ddee aarrqquuiivvooss.. AAllaann CCooxx,, AA..CCooxx@@sswwaannsseeaa..aacc..uukk Uma maneira rápida de mover uma árvore de diretórios e arquivos de um disco para outro. (cd /origem/diretório && tar cf - . ) | (cd /destino/diretório && tar xvfp -) _[_M_u_d_e _d_e _c_d _/_o_r_i_g_e_m_/_d_i_r_e_t_ó_r_i_o_: _t_a_r_;_._e_t_c_; _p_a_r_a _p_r_e_v_e_n_i_r _p_o_s_s_í_v_e_i_s _d_a_n_o_s _a_o _d_i_r_e_t_ó_r_i_o _e_m _c_a_s_o _d_e _p_r_o_b_l_e_m_a_s_. _A_g_r_a_d_e_c_i_m_e_n_t_o_s _a _J_i_m _D_e_n_n_i_s_, _j_i_m_@_s_t_a_r_s_h_i_n_e_._o_r_g_, _p_o_r _a_v_i_s_a_r_-_n_o_s_._] 22..77.. mmiicckk@@lloowwddoowwnn..ccoomm DDeessccoobbrriinnddoo ooss mmaaiioorreess ddiirreettóórriiooss.. MMiicckk GGhhaazzeeyy,, Quer saber quais são os maiores diretórios em seu computador? Veja como descobrir. du -S | sort -n 22..88.. AA GGaazzeettaa LLiinnuuxx Congratulações a John Fisk, criador do Linux Gazette. Esta é uma excelente revista eletrônica e é GGRRÁÁTTIISS!!!!!! Agora o que mais você poderia perguntar? Visite A Gazeta Linux em: http://www.linuxgazette.com É bom saber que LG tem periodicidade mensal, e (2) John Fisk não mais a mantém e sim o pessoal da SSC. 22..99.. PPoonntteeiirroo ppaarraa uummaa aattuuaalliizzaaççããoo ddoo GGNNUU MMaakkee 33..7700 ppaarraa mmuuddaarr oo ccoommppoorrttaammeennttoo ddoo VVPPAATTHH.. TTeedd SStteerrnn,, sstteerrnn@@aammaatthh..wwaasshhiinnggttoonn..eedduu Eu não sei se muita gente tem esse problema, mas há uma funcionalidade da versão 3.70 do GNU make que eu não gosto. É que o VPATH age estranhamento caso se informe um caminho de nome absoluto. Há uma atualização muito robusta que conserta isso em Paul D. Smith <psmith@wellfleet.com>. Ele também envia mensagens e documentação após cada revisão do GNU make em "gnu.utils.bug" geralmente, eu aplico as atualizações e compilo gmake em todos os sistemas nos quais trabalho. 22..1100.. CCoommoo eevviittaarr qquuee oo mmeeuu ssiisstteemmaa ffaaççaa aa cchheeccaaggeemm ddee iinntteeggrriiddaaddee aa ccaaddaa iinniicciiaalliizzaaççããoo?? DDaallee LLuuttzz,, ddaall@@wwiimmsseeyy..ccoomm P: Como evitar que e2fsck cheque o sistema de arquivos de meu disco a cada vez que o sistema for inicializado. R: Ao reconstruir o kernel, o sistema de arquivos é marcado como ´sujo´ e então o disco será checado a cada inicialização do sistema. Para corrigir isso execute: rdev -R /zImage 1 Isso avisa ao kernel de que os sistemas de arquivos não apresentam nenhum problema. _N_o_t_a_: _c_a_s_o _s_e _e_s_t_e_j_a _u_s_a_n_d_o _L_I_L_O_, _e_n_t_ã_o _a_d_i_c_i_o_n_e read-only _à _c_o_n_f_i_g_u_r_a_ç_ã_o _d_o _L_i_n_u_x _n_o _a_r_q_u_i_v_o _d_e _c_o_n_f_i_g_u_r_a_ç_ã_o _d_o _L_I_L_O _(_n_o_r_m_a_l_m_e_n_t_e _/_e_t_c_/_l_i_l_o_._c_o_n_f_) . 22..1111.. CCoommoo eevviittaarr aa cchheeccaaggeemm ddooss ssiisstteemmaass ddee aarrqquuiivvooss,, ccaauussaaddooss ppoorr ddiissppoossiittiivvooss ooccuuppaaddooss dduurraannttee aa iinniicciiaalliizzaaççããoo ddoo ssiisstteemmaa.. JJoonn TToommbbss,, jjoonn@@ggtteexx0022..uuss..eess Caso você tenha erros de dispositivo ocupado ao desligar o sistema e que deixam os sistemas de arquivos com indicação para verificação de integridade em tempo de inicialização, segue uma correção simples: Em /etc/rc.d/init.d/halt ou /etc/rc.d/rc.0, adicione a linha mount -o remount,ro /mount.dir para todos os sistemas de arquivos montados, exceto /, antes de chamar o comando umount -a. Isto significa que, se por alguma razão, o desligamento falhar ao finalizar todos os processos e desmontar os discos, eles estarão limpos para reinicialização. Isso economiza bastante tempo durante a carga do sistema. 22..1122.. CCoommoo eennccoonnttrraarr ooss mmaaiioorreess aarrqquuiivvooss ddee uumm ddiissccoo rrííggiiddoo.. _S_i_m_o_n _A_m_o_r_, simon@foobar.co.uk ls -l | sort +4n Ou, para aqueles que realmente necessitam de espaço, segue uma alternativa que demora um pouco mas funciona perfeitamente: cd / ls -lR | sort +4n 22..1133.. CCoommoo iimmpprriimmiirr ppáággiinnaass ccoomm mmaarrggeemm ppaarraa aarrqquuiivvaammeennttoo.. MMiikkee DDiicckkeeyy,, mmddiicckkeeyy@@tthhoorrpplluuss..lliibb..ppuurrdduuee..eedduu ______________________________________________________________________ #!/bin/sh # /usr/local/bin/print # um formatador simples, que permite uma margem # para encadernações cat $1 | pr -t -o 5 -w 85 | lpr ______________________________________________________________________ 22..1144.. UUmm mmeeiioo ddee ppeessqquuiissaarr eemm áárrvvoorreess ddee aarrqquuiivvooss ppoorr uummaa eexxpprreessssããoo rreegguullaarr eessppeeccííffiiccaa.. RRaauull DDeelluutthh MMiilllleerr,, rroocckkwweellll@@nnoovvaa..uummdd..eedduu Eu chamo este programa ´forall´. Pode-se usar da seguinte forma: forall /usr/include grep -i ioctl forall /usr/man grep ioctl Aqui está forall: ______________________________________________________________________ #!/bin/sh if [ 1 = `expr 2 \> $#` ] then echo Uso: $0 dir cmd [opcargs] exit 1 fi dir=$1 shift find $dir -type f -print | xargs "$@" ______________________________________________________________________ 22..1155.. UUmm pprrooggrraammaa ppaarraa lliimmppeezzaa aappóóss pprrooggrraammaass qquuee ccrriiaamm aarrqquuiivvooss ddee ccóóppiiaass ddee sseegguurraannççaa ee ssaallvvaammeennttoo aauuttoommááttiiccoo.. BBaarrrryy TToollnnaass,, ttoollnnaass@@nneessttoorr..eennggrr..uuttkk..eedduu Segue uma dica simples em duas linhas com recursividade em uma hierarquia de diretórios removendo arquivos emacs de salvamento automático (#) e cópias de segurança (~), arquivos .o e arquivos .log do Tex. Ele ainda comprime arquivos .tex e arquivos README. Eu chamo isso de encolhimento no meu sistema. ______________________________________________________________________ #!/bin/sh #ENCOLHER remove arquivos desnecessários e comprime arquivos .tex e README #De Barry tolnas, tolnas@sun1.engr.utk.edu # echo encolhendo $PWD find $PWD \( -name \*~ -or -name \*.o -or -name \*.log -or -name \*\#\) -exec rm -f {} \; find $PWD \( -name \*.tex -or -name \*README\* -or -name \*readme\* \) -exec gzip -9 {} \; ______________________________________________________________________ 22..1166.. CCoommoo eennccoonnttrraarr ooss pprroocceessssooss qquuee eessttããoo uuttiilliizzaannddoo mmaaiiss mmeemmóórriiaa.. SSiimmoonn AAmmoorr,, ssiimmoonn@@ffoooobbaarr..ccoo..uukk ps -aux | sort +4n -OU- ps -aux | sort +5n 22..1177.. CCoonnffiigguurraannddoo oo vvii ppaarraa PPrrooggrraammaaççããoo CC PPaauull AAnnddeerrssoonn,, MMaanntteenneeddoorr -- CCoommoo FFaazzeerr -- DDiiccaass LLiinnuuxx Eu programo bastante em C em meu tempo livre, e eu usei algum tempo para melhorar o vi para ser mais amigável com o C. Segue o meu arquivo .exrc: ______________________________________________________________________ set autoindent set shiftwidth=4 set backspace=2 set ruler ______________________________________________________________________ Como isso funciona? Autoindent faz com que o vi automaticamente indente cada linha, saltando para direita a distância de ^T em 4 espaços, backspace configura o valor da tecla de retorno e ruler mostra a régua com os números. Lembre-se que para ir a uma linha especifica, digamos número 20, use: ______________________________________________________________________ vi +20 myfile.c ______________________________________________________________________ 22..1188.. UUssaannddoo ccttaaggss ppaarraa ffaacciilliittaarr aa pprrooggrraammaaççããoo.. Muitos programadores já tem ctags em seus computadores, mas não as usam. Podem ser muito úteis em diversas ocasiões. Suponha que se tenha uma função, em um dos diversos arquivos de fontes em um diretório, para um programa que está em desenvolvimento, e se deseja editar a função para sua atualização. Chamaremos esta função de foo(). Porém não lembramos onde está o fonte. É aqui que ctags começa a ser muito útil. Ao executar ctags ele produz um arquivo chamado tags no diretório atual, o qual é uma lista de todas as funções, em quais arquivos eles estão presentes e onde elas estão naqueles arquivos. O arquivo de resultado se parece com algo como: ______________________________________________________________________ ActiveIconManager iconmgr.c /^void ActiveIconManager(active)$/ AddDefaultBindings add_window.c /^AddDefaultBindings ()$/ AddEndResize resize.c /^AddEndResize(tmp_win)$/ AddFuncButton menus.c /^Bool AddFuncButton (num, cont, mods, func, menu, item)$/ AddFuncKey menus.c /^Bool AddFuncKey (name, cont, mods, func, menu, win_name, action)$/ AddIconManager iconmgr.c /^WList *AddIconManager(tmp_win)$/ AddIconRegion icons.c /^AddIconRegion(geom, grav1, grav2, stepx, stepy)$/ AddStartResize resize.c /^AddStartResize(tmp_win, x, y, w, h)$/ AddToClientsList workmgr.c /^void AddToClientsList (workspace, client)$/ AddToList list.c /^AddToList(list_head, name, ptr)$/ ______________________________________________________________________ Para editar, digamos AddEndResize() no vim, execute: vim -t AddEndResize Isto irá trazer o arquivo apropriado ao editor, com o cursor localizado no início da função. 22..1199.. OO qquuee ffaazz ccoomm qquuee oo sseennddmmaaiill ddeemmoorree 55 mmiinnuuttooss nnaa iinniicciiaalliizzaaççããoo ddoo RReedd HHaatt?? PPaauull AAnnddeerrssoonn,, ppaauull@@ggeeeekkyy11..eebbtteecchh..nneett Este é um problema muito comum, quase no ponto de tornar-se um FAQ. A Red Hat já deve ter corrigido este problema em sua distribuição, mas isso pode ser corrigido por você mesmo. Ao se verificar o conteúdo do arquivo /etc/hosts, pode-se encontrar algo como: 127.0.0.1 localhost suamáquina Quando sendmail é iniciado, ele procura pelo nome da máquina (neste exemplo suamáquina). Após, ele verifica que o IP de suamáquina é 127.0.0.1, porém ele não gosta desta definição e procura novamente, continuando neste processo por um longo período até desistir e finalizar. Corrigir este problema é muito simples, bastando editar o arquivo /etc/hosts e alterá-lo para algo como: 127.0.0.1 localhost 10.56.142.1 yourbox 22..2200.. CCoommoo ccoonnffiigguurraarr oo RReedd HHaatt ppaarraa uuttiilliizzaarr oo ccoommaannddoo llss eemm ccoorreess?? PPaauull AAnnddeerrssoonn,, ppaauull@@ggeeeekkyy11..eebbtteecchh..nneett A distribuição da Red Hat vem com o comando ls em cores, porém ele não é configurado automaticamente na instalação. Vejam como fazê-lo. Primeiro, digite eval `DIRCOLORS` Após, alias ls='ls --color=auto' E deve-se incluir o 'alias.....' no arquivo /etc/bashrc 22..2211.. CCoommoo ddeessccoobbrriirr qquuaall bbiibblliiootteeccaa eemm //uussrr//lliibb ccoonnttéémm ddeetteerrmmiinnaaddaa ffuunnççããoo?? PPaawweell VVeesseellooww,, vvppss@@uunniiccoorrnn..nniiiimmmm..ssppbb..ssuu O que fazer quando se está compilando um programa e não se sabe a biblioteca que está faltando? Todas as informações geradas pelo gcc são com nomes de funções. Veja aqui como um simples comando pode encontrar o que você está procurando: for i in *; do echo $i:;nm $i|grep nome_função 2>/dev/null;done Onde nome_função é o nome da função que se está procurando. 22..2222.. EEuu ccoommppiilleeii uumm ppeeqquueennoo pprrooggrraammaa ddee tteesstteess eemm CC,, mmaass aaoo eexxeeccuuttáá--lloo nnããoo aappaarreeccee nneennhhuummaa iinnffoorrmmaaççããoo ddee ssaaííddaa!! Provavelmente o programa foi compilado em um binário chamado test. Porém Linux tem um programa de mesmo nome, o qual testa se determinada condição é verdadeira, e nunca produz resultados na tela. Para testar seu programa, estando no diretório onde ele está localizado, digite: ./test 33.. DDiiccaass DDeettaallhhaaddaass 33..11.. CCoommppaarrttiillhhaannddoo ppaarrttiiççõõeess ddee ttrrooccaa eennttrree oo LLiinnuuxx ee oo WWiinnddoowwss.. TToonnyy AAcceerroo,, aaccee33@@mmiiddwwaayy..uucchhiiccaaggoo..eedduu 1. Formatar a partição como uma partição DOS, e criar o arquivos de troca Windows nela, mas sem rodar o Windows ainda (deve-se manter o arquivo de troca completamente vazio por enquanto, assim ele pode ser compactado com eficiência). 2. Inicie o Linux e salve a partição em um arquivo. Por exemplo, se a partição é /dev/hda8: dd if=/dev/hda8 of=/etc/dosswap 3. Compacte o arquivo de troca; uma vez que tudo que ele contém são zeros, a compressão terá um excelente resultado. gzip -9 /etc/dosswap 4. Adicione a seguinte linha ao arquivo /etc/rc para preparar e instalar a área de troca sob o Linux: _X_X_X_X_X _é _o _n_ú_m_e_r_o _d_e _b_l_o_c_o_s _d_a _p_a_r_t_i_ç_ã_o _d_e _t_r_o_c_a mkswap /dev/hda8 XXXXX swapon -av Esteja seguro de adicionar uma linha de definição da área de troca no arquivo /etc/fstab. 5. Caso o pacote init/reboot suporte /etc/brc ou /sbin/brc adicione o seguinte ao arquivo /etc/brc, ou faça manualmente ao iniciar o DOS | OS/2 para converter de volta a partição em uma versão do DOS/Windows: swapoff -av zcat /etc/dosswap.gz | dd of=/dev/hda8 bs=1k count=100 # Note que este comando grava somente os primeiros 100 blocos da partição. Eu encontrei empiricamente este número como suficiente. >> Quais os prós e contras de se utilizar essa sistemática? Prós: pode-se economizar uma quantidade substancial de disco. Contras: caso o passo 5 não seja realizado de forma automática, deve- se lembrar de executá-lo manualmente, e isso pode atrasar a inicialização em nanosegundos. :-) 33..22.. RReeccuuppeerraaççããoo ddee aarrqquuiivvooss aappaaggaaddooss.. MMiicchhaaeell HHaammiillttoonn,, mmiicchhaaeell@@aaccttrriixx..ggeenn..nnzz Segue aqui uma dica, usada por mim algumas vezes. Recuperação de arquivos texto pessoais. Caso acidentalmente um arquivo texto tenha sido apagado, por exemplo, algum email ou os resultados da última noite de programação, há uma chance de recuperá-los. Caso o arquivo tenha sido gravado em disco, isto é se não foi gravado há mais de 30 segundos, seu conteúdo pode ainda estar na partição em disco. Pode-se usar o comando grep para procurar o conteúdo do arquivo diretamente na partição em disco. Por exemplo, recentemente, eu acidentalmente apaguei um email. Então imediatamente cesse qualquer atividade que possa modificar a partição: Neste caso basta suspender qualquer atividade de salvamento de arquivos ou executar compilações, etc.. Em algumas situações eu na verdade desliguei o sistema e o inicializei em modo monousuário, sem montar os sistemas de arquivos. Após eu utilizei o comando egrep na partição do disco: no meu caso uma mensagem eletrônica em /usr/local/home/walter/. Inicialmente pode-se ver que o diretório está localizado em /dev/hdb5, utilizando-se o comando df: sputnik3:~ % df Filesystem 1024-blocks Used Available Capacity Mounted on /dev/hda3 18621 9759 7901 55% / /dev/hdb3 308852 258443 34458 88% /usr /dev/hdb5 466896 407062 35720 92% /usr/local sputnik3:~ % su Password: [michael@sputnik3 michael]# egrep -50 'ftp.+COL' /dev/hdb5 > /tmp/x Agora deve-se ser extremamente cuidadoso ao lidar com partições de discos, devendo-se verificar cuidadosamente o comando a ser aplicado antes de pressionar Enter. Neste caso procuro o email contendo a palavra ftp seguido de algum texto que contenha a palavra COL. A mensagem continha aproximadamente 20 linhas, tendo então usado -50 para recuperar todas as linhas no entorno da mensagem. No passado eu cheguei a usar -3000 para ter certeza de recuperar todas as linhas de algum código fonte. A saída do comando egrep foi direcionada para uma partição diferente do disco - prevenindo-se assim alguma gravação sobre a área que contém as informações desejadas. Após, utilizei o comando strings para auxiliar na avaliação da saída anterior: strings /tmp/x | less Seguro o suficiente para garantir que o email estava lá. Este método não é totalmente seguro, pois parte ou toda a área utilizada pelo arquivo anteriormente já pode ter sido utilizada. Esta dica é provavelmente útil somente em sistemas monousuários. Em sistemas multiusuários com alto nível de atividade em disco, o espaço liberado pode já ter sido utilizado. Em meu sistema doméstico esta dica pode ser utilizada com sucesso em pelo menos três ocasiões nos últimos anos - principalmente quando acidentalmente eu apaguei o resultado de dias de trabalho. E caso a tarefa na qual eu esteja trabalhando chegue a um ponto onde eu sinta um progresso significativo, é aconselhável copiá-lo em um ou mais disquetes, não sendo necessário usar esta dica com muita freqüência. 33..33.. CCoommoo uuttiilliizzaarr uumm iinnddiiccaaddoorr iimmuuttáávveell.. JJiimm DDeennnniiss,, jjaaddeessttaarr@@rraahhuull..nneett Uso de Um Sistema Imutável Imediatamente após a instalação e configuração de um sistema, vá aos diretórios /bin, /sbin/, /usr/bin, /usr/sbin e /usr/lib (e alguns outros prováveis candidatos) e utilize livremente o comando 'chattr +i'. Adicione também os arquivos do kernel no raiz. Após execute 'mkdir /etc/.dist/' e copie todo o conteúdo de /etc/ nele (eu normalmente faço isto em dois passos usando /tmp/etcdist.tar para evitar a recursividade) no diretório (opcionalmente pode-se simplesmente criar /etc/.dist.tar.gz) - e indicá-lo como imutável. A razão para tudo isso é limitar eventuais danos que podem ser feitos pelo usuário que acessa o sistema como superusuário root. Assim não se apagará arquivos importantes com um redirecionamento ou com um comando acidental 'rm -fr' (apesar destes comandos ainda poderem causar um grande estrago no sistema - ao menos as bibliotecas e executáveis estarão a salvo). Isso torna o sistema ainda mais seguro pois evita serviços de busca de falhas de segurança, tornando mais difícil ou praticamente impossível o seu uso (uma vez que muitos deles fundamentam-se na regravação de arquivos que executem ações com o programa SUID e tenham acesso a ambientes de trabalho). O único incoveniente deste procedimento aparece ao se executar 'make install' em diversos binários do sistema. Caso se esqueça de executar o comando chattr -i nos arquivos a serem regravados e nos diretórios onde eles estão localizados, o comando make falhará. Basta executar o comando e executar novamente make. Pode-se ainda mover os binários antigos, bibliotecas, e tudo o mais para um diretório .old/ ou renomeá-los ou ainda aplicar o comando tar, etc.. 33..44.. JJiimm DDeennnniiss,, jjaaddeessttaarr@@rraahhuull..nneett SSuuggeessttããoo ddee oonnddee ccoollooccaarr nnoovvooss pprrooggrraammaass.. Todos os arquivos e comandos novos podem estar em /usr/local! ou /usr/local/`nome_da_máquina`. Caso a sua distribuição deixe vazio o diretório /usr/local , então simplesmente crie os diretórios /usr/local/src, /usr/local/bin, etc. e utilize-os. Caso a sua distribuição coloque arquivos em /usr/local, então pode-se criar um diretório com o comando 'mkdir /usr/local/`hostname`' e atribuir a permissão de grupo +w para ele (eu ainda faço uso de SUID e SGID para garantir que cada membro do grupo w possa somente lidar com arquivos que a eles pertencem, e que assim todos os arquivos criados pertencerão ao grupo w). Após, adquira o hábito de sempre colocar novos pacotes em /usr/local/src/.from/$NOME_DO_PACOTE/ (para arquivos .tar ou qualquer outro) e construa-os em /usr/local/src (ou .../$NOME_DA_MÁQUINA/src). Esteja seguro que ele seja instalado sob a hierarquia de diretórios local. Caso ele necessariamente deva ser instalado em /bin ou /usr/bin ou algum outro local, crie uma ligação simbólica da hierarquia local com cada elemento que deva ser colocado em outro local. A razão para isto - mesmo que dê um pouco mais de trabalho - reside na capacidade de isolar o que deve ser copiado e restaurado ou reinstalado no caso de uma reinstalação completa a partir de uma mídia da distribuição (normalmente um CD). Usando um diretório /usr/local/.from pode-se ainda manter-se um histórico informal da origem dos fontes -- o que auxilia na hora de buscar atualizações - o que pode ser crítico ao se monitorar a lista de questões de segurança. Por exemplo, todos os sistemas que eu configurei no trabalho (quando eu era encarregado da administração do sistema) e que foram administrados por muitos contratados e outras pessoas, e tiveram um grande número de atualizações, mantiveram uma idéia precisa dos elementos que foram adicionados ao sistema após a instalação e configuração iniciais. 33..55.. CCoonnvveerrtteennddoo ooss nnoommeess ddee ttooddooss ooss aarrqquuiivvooss ddee uumm ddiirreettóórriioo ppaarraa lleettrraass mmiinnúússccuullaass.. JJuussttiinn DDoosssseeyy,, ddoosssseeyy@@oouu..eedduu Eu reparei em uma dificuldade desnecessária nos procedimentos recomendados na seção 2c das dicas, edição 12 da LG. Neste caso estou enviando uma alteração para facilitar o processo: ______________________________________________________________________ #!/bin/sh # lowerit # converte os nomes de todos os arquivos do diretório atual para letras # minúsculas. Funciona somente em arquivo - não muda nomes de diretórios # e solicitará confirmação antes de regravar um arquivo já existente. for x in `ls` do if [ ! -f $x ]; then continue fi lc=`echo $x | tr '[A-Z]' '[a-z]'` if [ $lc != $x ]; then mv -i $x $lc fi done ______________________________________________________________________ Bem, é um programa longo. Ao invés de usar tudo isso pode-se usar o seguinte comando: for i in * ; do [ -f $i ] && mv -i $i `echo $i | tr '[A-Z]' '[a-z]'`; done; 33..66.. EEnncceerrrraannddoo ooss pprroocceessssooss ddee uumm uussuuáárriioo.. JJuussttiinn DDoosssseeyy,, ddoosssseeyy@@oouu..eedduu Na próxima dica pode-se encerrar todo os processos de um determinado usuário com o seguinte comando. kill -9 `ps -aux |grep ^<nome_usuário> |tr -s " " |cut -d " " -f2` Por exemplo, caso o usuário se chame paloma: kill -9 `ps -aux |grep ^paloma |tr -s " " |cut -d " " -f2` 33..77.. SSeennhhaa ddee ssuuppeerruussuuáárriioo ppeerrddiiddaa.. Agora com cuidado, vamos falar de senhas do superusuário que foram esquecidas ou perdidas. A solução dada na Linux Gazette é a mais universal, mas não a mais simples. Tanto com o LILO como com o loadlin, pode-se incluir o parâmetro "single" para se iniciar diretamente no ambiente de trabalho padrão, sem a necessidade de informar senhas. A partir daqui, pode-se mudar ou remover quaisquer senhas, antes de digitar "init 3" para iniciar o sistema em modo multiusuário. Justin Dossey 33..88.. CCoommoo aattuuaalliizzaarr oo SSeennddmmaaiill PPaauull AAnnddeerrssoonn,, ppaauull@@ggeeeekkyy11..eebbtteecchh..nneett Começaremos do princípio, dos fontes do programa. Inicialmente deve-se obter os fontes do sendmail. Eu estou utilizando a versão 8.9.0, a qual é, no momento em que escrevo este artigo, o que há de mais recente. Eu o obtive em ftp.sendmail.org:/pub/sendmail/sendmail.8.9.0.tar.gz Tem o tamanho de aproximadamente 1 Mb e considerando que se esteja executando a versão 8.7.6, eu creio que o esforço vale a pena. Caso funcione, certamente você saberá prontamente, de outra forma não há como receber as novas versões dos COMO FAZER :-) Agora que já se tem os fontes, deve-se descomprimi-los. Pode-se criar um diretório chamado sendmail-8.9.0 dentro do diretório atual. Vá para o diretório (com o comando cd), e leia os arquivos README e RELEASE_NOTES (e esteja ciente das atualizações que foram feitas). Agora pode-se ir para o diretório src. Aqui é onde a maior parte do trabalho será executada. _N_o_t_a_: _O _s_e_n_d_m_a_i_l _é _u_m _p_e_q_u_e_n_o_, _p_o_d_e_r_o_s_o _e _b_e_m _e_s_c_r_i_t_o _p_r_o_g_r_a_m_a_. _O _b_i_n_á_r_i_o _é _c_o_m_p_i_l_a_d_o _e_m _m_e_n_o_s _d_e _5 _m_i_n_u_t_o_s _e_m _u_m_a _m_á_q_u_i_n_a _5_x_8_6 _1_3_3 _c_o_m _3_2_M_b _d_e _R_A_M_! _A _c_o_m_p_i_l_a_ç_ã_o _c_o_m_p_l_e_t_a _e _a _i_n_s_t_a_l_a_ç_ã_o _(_c_o_n_f_i_g_u_r_a_ç_ã_o_) _l_e_v_a_m _m_e_n_o_s _d_e _1_5 _m_i_n_u_t_o_s_. _E_u _n_o_r_m_a_l_m_e_n_t_e _n_ã_o _e_x_e_c_u_t_o _o _B_I_N_D _e_m _m_e_u _s_i_s_t_e_m_a_, _e_n_t_ã_o _e_n_c_o_n_t_r_e_i _a_s _s_e_g_u_i_n_t_e_s _l_i_n_h_a_s_: ______________________________________________________________________ # ifndef NAMED_BIND # define NAMED_BIND 1 /* usando Servidor de Domínios Berkeley */ # endif ______________________________________________________________________ e mudando 1 para 0: ______________________________________________________________________ # ifndef NAMED_BIND # define NAMED_BIND 0 /* usando Servidor de Domínios Berkeley */ # endif ______________________________________________________________________ No Debian 1.3.1, db.h é por padrão instalado em /usr/include/db, ao invés de /usr/include, onde sendmail espera encontrá-lo. Vá para os diretórios src, mailstats, makemap, praliases, rmail e smrsh e execute o seguinte comando: ./Build -I/usr/include/db Uma vez feito isso, execute `cd ..' e digite make install. Voilá! Sendmail versão 8.9.0 deve estar instalado. Isso claro, assumindo que a configuração original já foi realizada. Para que tudo funcione corretamente, uma vez que eu hospedo listas de mensagens usando majordomo, é necessário adicionar o seguinte no início de /etc/sendmail.cf: ______________________________________________________________________ O DontBlameSendmail=forwardfileinunsafedirpath, forwardfileinunsafedirpathsafe ______________________________________________________________________ Sendmail 8.9.0 é desagradável sobre permissões de arquivos e diretórios, e irá reclamar sobre arquivos e diretórios em aliases ou .forward que tenham permissões de escrita para todos os usuários ou para o grupo. Uma vez que não é uma boa idéia desabilitar estes avisos, como sou o único que utiliza o sistema, sinto-me à vontade para fazê-lo. YMMV. 33..99.. JJiimm DDeennnniiss,, jjaaddeessttaarr@@rraahhuull..nneett AAllgguummaass ddiiccaass ppaarraa nnoovvooss aaddmmiinniissttrraaddoorreess ddee ssiisstteemmaass.. Criar e manter um arquivo /LEIAME.`nome_máquina` e/ou um /etc/LEIAME.`nome_máquina` _[_O_u _p_o_s_s_i_v_e_l_m_e_n_t_e _/_u_s_r_/_l_o_c_a_l_/_e_t_c_/_L_E_I_A_M_E_._`_n_o_m_e___m_á_q_u_i_n_a_` _-_M_a_i_n_t_. _] Desde o primeiro dia da administração do sistema, tome notas neste arquivo como um histórico on-line. Pode-se incluir a linha "vi /LEIAME.$(nome_máquina)" no arquivo /bash_logout do superusuário. Uma outra forma de fazer isso é criar um programa su ou sudo que faça mais o menos o seguinte: function exit \ { unset exit; exit; \ cat ~/tmp/session.$(date +%y%m%d) \ >> /LEIAME.$(nome_máquina) && \ vi /LEIAME.$(nome_máquina) } script -a ~/tmp/session.$(date +%y%m%d) /bin/su.org - (use o comando typescript para criar um histórico da sessão e criar uma função para automatizar a inclusão e atualização do histórico). Eu admito que não utilizei essa política de automação, confiando sempre na minha disciplina. De qualquer forma a idéia está formatada. Minha última sugestão é manter o caminho para o superusuário com o seguinte formato 'PATH= /bin'. Somente isso e nada mais. Assim tudo o que o superusuário fizer pode ser provido por uma ligação simbólica com /bin ou por um nome alternativo ou por uma função de ambiente de trabalho, ou ainda pela digitação explícita do caminho. Isso torna qualquer usuário acessando o sistema como superusuário ciente de que binários estão sendo utilizados. O administrador inteligente de um sistema multiusuário irá periodicamente observar os arquivos /bin e /.*history procurando padrões ou mensagens freqüentes. O administrador realmente interessado irá buscar seqüências que podem ser automatizadas, colocar checagens em pontos necessários, e verificar quais privilégios do "superusuário" podem ser revistos (uso de editores, MTA e outros programas interativos com funcionalidades elaboradas que podem agregar informações em arquivos de dados - como o famoso vi ./.exrc e emacs ./.emacs e mesmo o $EXINIT e as macros header/footer). Naturalmente estes comandos podem ser executados da seguinte forma: cp $data $algum_diretório_usuário/tmp su -c $comando_origem $mudanças cp $algum_diretório_usuário/tmp $data onde os dados variam de comando para comando. Muitas destas precauções podem ser consideradas exageradas em estações de trabalho domésticas ou de usuários individuais, mas são altamente recomendadas como política de administração de sistemas multiusuários, particularmente em um sistema exposto ao público. 33..1100.. CCoommoo ccoonnffiigguurraarr oo sseelleettoorr ddee sseerrvviiddoorr ddoo xxddmm.. AArrrriiggoo TTrriiuullzzii,, aa..ttrriiuullzzii@@iicc..aacc..uukk 1. Edite o arquivo que inicializa o xdm, (possivelmente /etc/rc/rc.6 ou /etc/rc.local) e que contenha as seguintes linhas na seção de início do xdm. /usr/bin/X11/xdm exec /usr/bin/X11/X -indirect servidor 2. Edite o arquivo /usr/lib/X11/xdm/Xservers, comentando a linha que inicia o servidor na máquina local (por exemplo starting 0:) 3. Ao reinicializar o computador, você estará em casa e além. Eu inclui isso quando eu estava desesperadamente tentando configurar minha própria sub-rede a partir de uma máquina e levei mais de uma semana para corrigir todos os problemas. Adicional: com o velho SLS (1.1.1) por alguma razão pode-se utilizar o parâmetro -nodaemon após a linha do xdm - porém isso NNÃÃOO funciona para versões mais recentes.