Capítulo 20. Operações variadas

Índice
20.1. A criação dos disquetes de instalação
20.2. Criação de um CD-ROM
20.3. Sincronizando o relógio do sistema
20.4. Instalando o gerenciador de inicialização (boot manager)
20.5. Apagando o disklabel
20.6. Speaker
20.7. Memory file system
20.8. A senha do root foi esquecida?
20.9. Adicionando um disco rígido novo
20.10. Password file is busy?
20.11. Como recriar os dispositivos no diretório /dev

Este capítulo reúne, sem uma ordem determinada, vários argumentos que não encontraram colocação nos outros capítulos.

20.1. A criação dos disquetes de instalação

O autor desta seção (A criação dos disquetes de instalação) é Eric Delcamp

Para criar os disquetes de instalação é necessário que o "pseudo-device" vnd esteja habilitado no kernel.

  1. Em primeiro lugar é necessário criar o kernel para gravar no disquete, que suporemos chamar-se FLOPPY, que deve derivar de um dos kernels INSTALL.

  2. Uma vez compilado, o kernel estará no arquivo /sys/arch/i386/compile/FLOPPY/netbsd.

  3. Deslocar-se para o diretório /usr/src/distrib/i386/floppies/ramdisk e executar o comando

    # make	  
    Isto cria o arquivo ramdisk.fs naquele diretório.

  4. Deslocar-se para o diretório /usr/src/distrib/i386/floppies/fdset e executar o comando

    # make KERN=/sys/arch/i386/compile/FLOPPY/netbsd	  

  5. O comando precedente criou um ou dois arquivos (depende da dimensão do kernel) de nome boot1.fs e boot2.fs. Nesse ponto é necessário transferir estes arquivos para o disquete com o comando (ou melhor, os comandos):

    # dd if=boot1.fs of=/dev/fd0a bs=36b
    # dd if=boot2.fs of=/dev/fd0a bs=36b
    	  
    Naturalmente, entre um comando e outro é necessário por um novo disquete no drive.

20.2. Criação de um CD-ROM

Para criar um CD-ROM de dados utilizam-se os programas mkisofs e cdrecord. O NetBSD suporta a utilização tanto dos gravadores SCSI quanto dos gravadores IDE. Esses últimos podem ser utilizados de maneira integralmente transparente, sem a necessidade de utilizar emulações SCSI ou outros artifícios porque o driver é capaz de receber diretamente os comandos ATAPI (como sempre o NetBSD consegue encontrar a solução mais simples e mais elegante).

A criação de um CD transcorre em duas fases: primeiro criamos uma imagem ISO do CD no disco rígido utilizando o programa mkisofs e depois se grava a imagem no CD com o cdrecord. Nos exemplos seguintes supõe-se a utilização de um gravador IDE/ATAPI entre os suportados pelo cdrecord: o gravador é reconhecido pelo sistema como um disco master secundário.

cd1 at atapibus1 drive 0: <HP CD-Writer Plus 8100> type 5 cdrom removable    

20.2.1. Criação da imagem ISO

Para criar a imagem do CD no disco rígido é necessário antes de mais nada que haja espaço suficiente no disco. De acordo com a quantidade de dados, ela pode ter até 700MB. Supondo que os dados que nos interessam estejam no diretório meusdados, é preciso escrever

# mkisofs -aflrTv -o cdimage meusdados/      

Uma vez criado o arquivo imagem cdimage, podemos examiná-lo montando-o como se fosse um filesystem para verificar se não existem erros e não desperdiçar um precioso CD.

# ls -l cdimage
-rw-rw-r--  1 auser     user  284672 Dec  1 11:58 cdimage
# vnconfig -v vnd0 cdimage 512/556/1/1
# mount -r -t cd9660 /dev/vnd0c /mnt
  ... browsing su /mnt ...
# umount /mnt
# vnconfig -u vnd0
      

O valor 556 foi obtido dividindo a dimensão do arquivo, 284672, por 512.

20.3. Sincronizando o relógio do sistema

Por qualquer motivo estranho parece que os relógios de sistema jamais funcionem direito e não é raro encontrarem-se com uma defasagem de muitos minutos. O problema se agrava quando se tem que mexer com vários hosts conectados em rede: com boa probabilidade jamais conseguiremos mantê-los sincronizados. Para resolver o problema vem nos socorrer o protocolo NTP (Network Time Protocol) versão 3, que permite manter sincronizados os relógios de muitas workstations conectadas em rede, utilizando o servidores adequados.

Graças ao protocolo NTP é possível tanto simplesmente manter a hora correta de um host único quanto da rede inteira. Trata-se de um protocolo um pouco complexo, que define a estrutura hierárquica master-slave de uma série de servidores, subdividindo-os em estratos. No topo da hierarquia estão os servidores do estrato 1, conectados a um hardware que é a fonte de referência para a data e para a hora. Os servidores de estrato 2 sincronizam-se via NTP com os do estrato 1 e, por sua vez, funcionam como servidores secundários para os hosts dos estratos inferiores. Esta estrutura hierárquica evita o congestionamento que se teria se todos os hosts clientes fizessem referência aos servidores do estrato 1. Se, por exemplo, se quer sincronizar uma rede inteira, não se devem conectar todos os hosts ao mesmo servidor público do estrato 1. Em vez disso, cria-se um servidor local que se sincroniza com o público e os hosts restantes sincronizam-se com o servidor local.

Afortunadamente, para desfrutar dos instrumentos NTP não é necessário compreender os detalhes do protocolo e da sua implementação (quem estiver interessado pode fazer referência ao documento RFC 1305) mas é suficiente saber como abrir alguns programas. No NetBSD já estão presentes os programas necessários para se aproveitar desse protocolo, derivados da implementação xntp. Nesta seção descreve-se um método simples para manter atualizada a hora do sistema.

Em primeiro lugar é necessário o endereço dos servidores públicos de NTP para utilizá-los como referência. Uma lista completa pode ser encontrada em http://www.eecis.udel.edu/~mills/ntp/servers.html, mas para a Itália podem ser usados tempo.cstv.to.cnr.it e time.ien.it, que são dois servidores de estrato 1.

Nesse ponto, para sincronizar o relógio do sistema basta executar o comando (é necessário ser root):

# ntpdate -b tempo.cstv.to.cnr.it time.ien.it      
A opção -b serve para indicar ao ntpdate para assumir imediatamente o novo valor da hora do sistema, ao invés de procurar corrigir o atual, e é aconselhada quando a diferença entre a hora correta (a do servidor) e a local pode ser grande.

Já vimos como funciona o ntpdate. Agora é necessário decidir o melhor modo para inicializá-lo automaticamente. Se o host a sincronizar está sempre ligado à Internet, a melhor coisa é abrir o programa a cada reinicialização especificando

ntpdate=YES      ntpdate_hosts="time.ien.it"      
no /etc/rc.conf. O nome do servidor pode ser especificado em ntpdate_hosts. Do contrário o script procurará obtê-lo do arquivo /etc/ntp.conf.

Se o host está conectado à Internet através de um provedor e a conexão não está sempre ativa, pode-se lançar o comando ntpdate a partir do script ip-up, como se explica no Capítulo 10. Nesse caso a linha a ser inserida no arquivo é:

/usr/sbin/ntpdate -s -b time.ien.it      
(o caminho é necessário, senão o script não encontrará o programa). A opção -s produz o arquivamento das mensagens, que depois poderemos encontrar em /var/log/messages (salvo configuração diferente do syslog.conf).

Além do ntpdate estão presentes vários outros comandos e também é possível fazer um host da rede tornar-se o servidor NTP dos outros hosts clientes. O servidor interno sincronizar-se-á com os servidores de referência externos à rede e os clientes se vão sincronizar com o nosso servidor. Para esse tipo de configuração deve-se utilizar o dæmon xntpd, criando o arquivo de configuração adequado /etc/ntp.conf. Por exemplo:

server time.ien.it
server tempo.cstv.to.cnr.it      

O xntpd pode ser ainda inicializado a partir do rc.conf, habilitando-se a opção adequada.

xntpd=YES      

Para a sincronização interna à rede, como alternativa à configuração descrita, também é possível usar o dæmon timed, nascido especificamente com o 4.3BSD. Também o timed baseia-se em um esquema master-slave. Quando é inicializado em uma máquina o timed pede ao master a hora do sistema da rede e corrige apropriadamente a hora da máquina local. Pode-se, assim, utilizar uma estrutura mista, na qual um dos hosts se sincroniza com um servidor NTP público e faz o papel de master para a rede local, cujos clientes, por sua vez, sincronizam-se com o timed. No host de referência devem estar ativos seja o NTP, seja o timed, e é necessário prestar atenção para que não conflitem (o timed deve ser inicializado com a opção -F hostname. Desse modo não tentará atualizar o relógio local).

20.4. Instalando o gerenciador de inicialização (boot manager)

O programa de instalação do NetBSD pode instalar seu próprio gerenciador de inicialização, se o usuário assim o desejar. No caso de uma instalação errada ou falha é possível instalá-lo de novo ou modificar suas propriedades com o comando fdisk. Por exemplo:

# fdisk -B wd0    

Se o sistema não se inicializa a partir do disco rígido, pode-se fazer o boot com o disquete de inicialização usado para a instalação e acionar o kernel do disco rígido com um comando como o seguinte:

> boot wd0a:netbsd    

20.5. Apagando o disklabel

Ainda que a deleção do disklabel não seja uma operação freqüente, pode ser útil saber como fazer em caso de necessidade. Naturalmente trata-se de uma operação a ser executada apenas quando se sabe exatamente aquilo que se está fazendo. Por exemplo:

# dd if=/dev/zero of=/dev/rwd0c bs=8k count=1    

Desse modo fica deletado o disklabel mas não a tabela das partições do MBR. Para deletar completamente o disco usar wd0d. Por exemplo:

# dd if=/dev/zero of=/dev/rwd0d bs=8k    

20.6. Speaker

Para produzir um som no speaker (por exemplo, uma advertência ao fim de um script), pode-se utilizar o device spkr do kernel, que aparece através do dispositivo /dev/speaker. Por exemplo, nas mailing lists encontrei uma mensagem que sugeria:

echo 'BPBPBPBPBP' > /dev/speaker    

20.7. Memory file system

Para melhorar a performance dos serviços, dadas determinadas configurações, pode-se utilizar um memory file system. A título de exemplo, essa estratégia pode ser útil quando se compila muito e se dispõe de memória suficiente. Para criar um sistema de arquivos (file system) na memória, deve-se acrescentar uma linha do seguinte tipo no /etc/fstab:

/dev/wd0b /tmp  mfs     rw,async,noatime,nosuid,-s=20000    

a opção -s=20000 define as dimensões em cerca de 10 MB (20000 setores), que deveriam ser suficientes para a compilação do kernel.

20.8. A senha do root foi esquecida?

Quando se esquece a senha do root nem tudo está perdido e ainda se pode recuperar o sistema. Os passos a cumprir são os seguintes: inicializar em modo monousuário, montar / e mudar a senha do root. Em mais detalhes:

  1. Inicializar em modo monousuário: quando aparece o prompt do boot e se inicia a contagem regressiva de cinco segundos, executar o comando:

    > boot -s	  

  2. Diante da solicitação

    Enter pathname of shell or RETURN for sh:	  
    apertar Enter.

  3. Executar os seguintes comandos

    # fsck -y /
    # mount -u /
    # fsck -y /usr
    # mount /usr
    	  

  4. Mudar a senha do root com passwd.

  5. Acionar o comando exit para passar ao modo multiusuário.

20.9. Adicionando um disco rígido novo

Esta seção explica como adicionar um novo disco rígido a um sistema NetBSD. No exemplo proposto serão adicionados um controlador SCSI e um disco rígido conectado ao novo controlador. Quem não precisa instalar o controlador pode simplesmente pular a leitura da parte correspondente e ir diretamente para a configuração do disco rígido. A instalação de um disco rígido IDE é idêntica à apresentada no exemplo. Somente o nome do dispositivo será diferente (wd#) no lugar de (sd#).

Como sempre, antes de adquirir hardware novo é bom consultar a lista das compatibilidades de hardware do NetBSD para certificar-se de que o dispositivo escolhido seja suportado pelo sistema.

Concluída a instalação física do controlador e do disco rígido, assim como o cabeamento correspondente, inicializa-se o sistema e nos certificamos de que o disco tenha sido reconhecido com o comando dmesg. Por exemplo, para um controlador NCR-875 o output é o seguinte:

ncr0 at pci0 dev 15 function 0: ncr 53c875 fast20 wide scsi
ncr0: interrupting at irq 10
ncr0: minsync=12, maxsync=137, maxoffs=16, 128 dwords burst, large dma fifo
ncr0: single-ended, open drain IRQ driver, using on-chip SRAM
ncr0: restart (scsi reset).
scsibus0 at ncr0: 16 targets, 8 luns per target
sd0(ncr0:2:0): 20.0 MB/s (50 ns, offset 15)
sd0: 2063MB, 8188 cyl, 3 head, 172 sec, 512 bytes/sect x 4226725 sectors      
Se o dispositivo não aparece no output é necessário certificar-se de que o kernel em uso o suporte e, eventualmente, compilar um kernel personalizado (veja-se o Capítulo 7).

Nesse ponto podem ser criadas as partições com o comando fdisk. Em primeiro lugar visualizamos o estado atual do disco:

# fdisk sd0
NetBSD disklabel disk geometry:
cylinders: 8188 heads: 3 sectors/track: 172 (516 sectors/cylinder)

BIOS disk geometry:
cylinders: 524 heads: 128 sectors/track: 63 (8064 sectors/cylinder)

Partition table:
0: sysid 6 (Primary 'big' DOS, 16-bit FAT (> 32MB))
    start 63, size 4225473 (2063 MB), flag 0x0
        beg: cylinder    0, head   1, sector  1
        end: cylinder  523, head 127, sector 63
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>    

No exemplo a partição DOS será eliminada e substituída por uma partição NetBSD que ocupará o disco inteiro. O comando fdisk -u sd0 permite a modificação interativa das partições. As modificações serão escritas no disco somente no final, depois de um pedido de confirmação, o que permite que procedamos com uma certa tranqüilidade.

Depois de ter executado fdisk -u, confirmamos as modificações e obtemos as seguintes partições:

Partition table:
0: sysid 169 (NetBSD)
    start 63, size 4225473 (2063 MB), flag 0x0
        beg: cylinder    0, head   1, sector  1
        end: cylinder  523, head 127, sector 63
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>      

Nesse ponto é necessário escrever o disklabel no disco. A seqüência correta de operações é:

# disklabel sd0 > tempfile
# vi tempfile
# disklabel -R -r sd0 tempfile
      

Nesse exemplo criemos as seguintes partições com o disklabel, editando o arquivo tempfile como foi explicado acima:

#      size   offset   fstype [fsize bsize   cpg]
a:  2048004       63   4.2BSD   1024  8192    16 # (Cyl.  0*- 3969*)
c:  4226662       63   unused      0     0       # (Cyl.  0*- 8191*)
d:  4226725        0   unused      0     0       # (Cyl.  0 - 8191*)
e:  2178658  2048067   4.2BSD   1024  8192    16 # (Cyl.  3969*- 8191*)      

Nota: uma vez criado o disklabel, podemos otimizá-lo estudando o output do comando newfs -N /dev/sd0a que assinala se no fim de uma partição permanecem setores não alocados. Este valor pode-se utilizar para modificar o tamanho da própria partição.

Por último, criemos os novos sistemas de arquivos para as partições a e e.

# newfs /dev/sd0a
# newfs /dev/sd0e
      
Agora o disco está pronto para ser usado, com duas partições para montar. Por exemplo:
# mount /dev/sd0a /mnt      

20.10. Password file is busy?

Para alguns usuários acontece o recebimento de uma misteriosa mensagem "Password file is busy" quando tentam modificar uma senha. A solução ao problema é simples: eliminar o arquivo /etc/ptmp, depois de ter verificado se não contém informações importantes (trata-se de uma cópia do arquivo /etc/master.passwd que por motivos inescrutáveis ficou em circulação ao invés de ser eliminado).

20.11. Como recriar os dispositivos no diretório /dev

O autor desta seção é Reinoud Koornstra

Em primeiro lugar é necessário passar ao modo monousuário (single user) com as partições ainda montadas "rw" (read-write). Para fazer isso convém simplesmente dar o comando shutdown now em modo multiusuário ou reinicializar o sistema com a opção -s e tornar / e /dev passíveis de escrita e leitura com os seguintes comandos:

# mount -u /
# mount -u /dev
    

Depois:

# mkdir /nudev
# cd /nudev
# cp /dev/MAKEDEV* .
# sh ./MAKEDEV all
# cd /
# mv dev odev
# mv nudev dev
# rm -r odev
    

Alternativamente, com as fontes instaladas no sistema em /usr/src, pode-se fazer assim:

# mkdir /nudev
# cd /nudev
# cp /usr/src/etc/MAKEDEV.local .
# cp /usr/src/etc/etc.$arch/MAKEDEV .
# sh ./MAKEDEV all
# cd /
# mv dev odev; mv nudev dev
# rm -r odev
    

O valor a substituir em $arch pode ser detrminado com o seguinte comando:

# uname -m    

ou com:

# sysctl hw.machine_arch    

Nota: O segundo método para recriar os dispositivos (o que se aproveita das fontes instaladas no sistema) pode adicionar alguns dispositivos àqueles já existentes (pelo menos na arquitetura i386). Por exemplo, atualmente é possível ter 16 partições ao invés de 8. Utilizando a versão original do MAKEDEV (aquela do diretório /dev), os novos dispositivos não serão criados.