Segue um razoável número mínimo de diretórios no sistema de arquivos raiz:
(A estrutura de diretórios aqui apresentada é somente para uso no disquete raiz. Sistemas Linux têm uma política mais complexa e disciplinada, chamada Padrões de Sistemas de Arquivos, para determinar quais arquivos devem estar presentes e aonde.)
Três destes diretórios devem estar vazios no sistema de arquivos raiz, devendo somente serem criados com o comando mkdir. O diretório /proc é basicamente um ponto de referência onde o sistema de arquivos proc está localizado. Os diretórios /mnt e /usr são somente pontos de montagem para uso após a inicialização do sistema e a carga do sistema de arquivos raiz. Mais uma vez, estes diretórios somente precisam ser criados.
Os quatro diretórios remanescentes estão descritos nas seções a seguir:
/dev
Um diretório /dev contendo um arquivo especial com todos os dispositivos a serem utilizados pelo sistema é fundamental para o Linux. O diretório em si é um diretório comum e pode ser criado com o comando mkdir da forma usual. Os arquivos especiais de dispositivos devem ser criados de uma forma especial, utilizando-se o comando mknod.
Há um atalho, podendo-se copiar o conteúdo do diretório /dev e apagando-se o que for desnecessário. A única exigência é que a cópia seja efetuada com a utilização do parâmetro -R. Isso copiará o diretório sem copiar o conteúdo dos arquivos. Esteja seguro de utilizar um R maiúsculo. Caso seja utilizado r em formato minúsculo, provavelmente será copiado o conteúdo completo de todo o disco rígido - ou no mínimo, o que couber no disquete! De qualquer forma, é importante estar atento ao comando:
cp -dpR /dev /mnt
Assumindo-se que o disquete esteja montado em /mnt. A opção dp garante que ligações simbólicas serão copiadas como ligações, ao invés de usar um arquivo de destino, e que os atributos originais do arquivo serão preservados, assim como as informações sobre os donos.
Alternativamente, pode-se usar o programa cpio com a opção -p, uma vez que cpio lida com arquivos especiais corretamente, e não tentará copiar o seu conteúdo. Pode-se por exemplo, utilizar o seguinte comando:
o qual irá copiar todos os arquivos especiais de /dev para /mnt/dev. Na verdade, irá copiar todos os arquivos da árvore de diretórios iniciada em /dev, e criará todos os subdiretórios necessários na árvore de diretórios de destino.
Caso se deseje fazer da forma mais difícil, deve-se usar ls -l para mostrar os números major e minor dos dispositivos desejados, e criá-los no disquete através do comando mknod.
Uma vez que os dispositivos estejam copiados, é aconselhável verificar se todos os arquivos de dispositivos necessários foram copiados no disco de emergência. Por exemplo, ftape é utilizado por unidades de fitas, sendo necessário copiar todos eles, caso se pretenda acessar um dispositivo desse tipo a partir do disco de inicialização.
Note que um inode é necessário para cada tipo de arquivo especial de dispositivo, e podem, às vezes, serem um recurso escasso, especialmente em disquetes com sistemas de arquivos configurados. Desta forma é indicada a remoção de qualquer arquivo especial de dispositivos em /dev que não seja necessário no sistema específico. Por exemplo, caso não se tenha discos SCSI, pode-se tranqüilamente remover todos os arquivos de dispositivos começados por sd. Similarmente, caso não se pretenda utilizar portas seriais, então todos os arquivos começados com cua também podem ser removidos.
Deve-se necessariamente ter os seguintes arquivos neste diretório: console, kmem, mem, null, ram, tty1.
Este diretório deve conter uma série de arquivos de configuração. Na maioria dos sistemas este pode estar dividido em três grupos:
Arquivos que não são essenciais podem ser identificados através do comando:
Este comando gera uma lista em ordem inversa de último acesso, dependendo de que arquivos não são acessados ou utilizados e que, podem não estar presentes no disquete raiz.
Nos nossos disquetes raiz, temos um número de arquivos de configuração inferior a 15. Isso reduz o trabalho de lidar com um conjunto de três tipos de arquivos.
Caso segurança seja um item importante do sistema específico, passwd e shadow devem ser suprimidos, a fim de evitar a cópia de senhas de usuários para fora do sistema, e quando o sistema for inicializado através de disquetes, acessos indesejados serão rejeitados. De qualquer forma, há uma razão para não suprimir passwd e group. tar (e provavelmente outros programas de arquivamento) armazenam o usuário e o grupo junto com os dados dos arquivos. Caso estes arquivos sejam restaurados no disco rígido a partir de uma fita, os arquivos serão restaurados com seus nomes originais. Caso os nomes dos donos e grupos não existam em passwd/group durante a restauração, as identificações de usuários e grupos (UID e GID) não estarão corretas.
Esteja certo de que o arquivo passwd contém ao menos o superusuário root. Caso se pretenda utilizar outros usuários para acessar o sistema, deve-se estar seguro da existência de seus diretórios pessoais e interpretadores de comando (shell).
Além disso, deve-se somente configurar dois arquivos, e o que eles devem conter é surpreendentemente pequeno.
#!/bin/sh /bin/mount -av /bin/hostname Conectiva
Deve-se estar seguro de que os diretórios estão corretos. A execução de hostname não é obrigatória, somente dá um melhor acabamento ao trabalho.
/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults
Pode-se copiar as entradas de um arquivo fstab, já existente, mas não se deve montar automaticamente qualquer partição do disco rígido; usando-se então o parâmetro noauto, pois o disco rígido pode estar danificado ou sem condições de uso no momento da inicialização do sistema.
O inittab deve ser alterado, de outra forma a linha sysinit executará o rc ou qualquer outro programa básico de inicialização que seja indicado. Ainda para assegurar-se de que usuários em portas seriais não poderão acessar o sistema, pode-se comentar todas as entradas em getty que incluam dispositivos ttys ou ttyS ao final da linha. Deve-se deixar as portas tty para poder-se acessar o sistema a partir da console.
Um arquivo inittab mínimo contém:
id:2:initdefault: si::sysinit:/etc/rc 1:2345:respawn:/sbin/getty 9600 tty1 2:23:respawn:/sbin/getty 9600 tty2
O arquivo inittab define o que o sistema executará nos vários estados, inclusive no seu início, em modo multiusuário, etc... Um ponto no qual deve-se ter muito cuidado é o de checar se todos os comandos informados em inittab referem-se a programas presentes e se o diretório está corretamente indicado. Caso se coloque no disco de emergência os arquivos de comandos apresentados na Seção (Listas de exemplo do conteúdo do disco de inicialização) como um guia, e após se copie o inittab para o disco sem uma checagem cuidadosa, provavelmente ele falhará, e o problema terá origem na ausência de arquivos ou indicações erradas de diretórios.
Note que alguns comandos não podem ser movidos para qualquer outro lugar, porque alguns programas têm a sua localização dentro de seu código. Por exemplo em nosso sistema, /etc/shutdown tem a sua localização definida no fonte do comando /etc/reboot. Caso reboot seja movido para /bin/reboot, e após seja executado o comando shutdown, ele falhará, porque o arquivo reboot não pode ser localizado.
Para todo o restante, deve-se simplesmente copiar os arquivos texto no diretório /etc, mais os executáveis do mesmo diretório que não possam ser definidos como desnecessários. Como um guia, pode-se consultar os exemplos na Seção (Listas de exemplo do conteúdo do disco de inicialização). Provavelmente será suficiente copiar somente aqueles arquivos, porém sistemas podem ser muito diferentes, então não se pode estar seguro de que a lista apresentada seja suficiente. O único método de estar seguro é iniciar o sistema com inittab e verificar o que é solicitado.
Muitos sistemas utilizam um diretório /etc/rc.d/ contendo shell scripts de diferentes níveis de execução. O mínimo é um simples programa rc, mas pode ser mais simples copiar o inittab e o diretório /etc/rc.d de um sistema já existente, e suprimir os scripts no diretório rc.d para remover os processamentos não relevantes do ambiente de sistema em disquete.
/bin e /sbin
O diretório /bin é um lugar adequado para utilitários extras necessários à execução de atividades básicas. Utilitários como ls, mv, cat e dd.Veja a Seção (Listagem de exemplo de conteúdo do disco de inicialização) para um exemplo da lista de arquivos que podem estar presentes nos diretórios /bin e /sbin. Ela não inclui nenhum utilitário requerido para restaurar cópias de segurança, tais como cpio, tar e gzip. Isso porque estes programas foram colocados em um disquete de utilitários em separado, visando economizar espaço no disquete de inicialização e raiz. Uma vez que o disquete de inicialização tenha sido carregado, ele é copiado para o disco em memória, deixando a unidade de disquetes livre para montar outro disquete, o disquete de utilitários. Normalmente montamos esse disquete como /usr.
A criação de um é descrito na Seção (Construindo um disquete de utilitários). É desejável manter uma cópia da mesma versão dos utilitários de cópias de segurança usados para gerar as cópias de segurança disponíveis, não perdendo-se tempo assim tentando-se instalar versões que não podem ler as cópias geradas.
Esteja seguro de incluir os seguintes programas: init, getty ou equivalente, login, mount, algum interpretador que possa executar os programas rc, e uma ligação de sh para o shell.
/lib
No diretório /lib deve-se colocar as bibliotecas compartilhadas e seus carregadores. Caso as bibliotecas necessárias não sejam encontradas no diretório /lib, o sistema não poderá ser iniciado. Com um pouco de sorte pode-se receber uma mensagem de erro dizendo a razão.
Praticamente todos os programas requerem no mínimo a biblioteca libc, libc.so.N, onde N é o número da versão corrente. Ao verificar o diretório /lib, libc.so.5 é normalmente uma ligação simbólica para um arquivo com o número completo da versão.
% ls -l /lib/libc.so* lrwxrwxrwx 1 root root 14 Nov 1 20:34 /lib/libc.so.5 -> libc.so.5.4.33* -rwxr-xr-x 1 root root 573176 Jun 12 02:05 /lib/libc.so.5.4.33*
Neste caso, tem-se disponível o arquivo libc.so.5.4.33. Para encontrar outras bibliotecas deve-se verificar todos os binários necessários e checar as suas dependências com o comando ldd . Por exemplo:
% ldd /sbin/mke2fs libext2fs.so.2 => /lib/libext2fs.so.2 libcom_err.so.2 => /lib/libcom_err.so.2 libuuid.so.1 => /lib/libuuid.so.1 libc.so.5 => /lib/libc.so.5
O arquivo apresentado na coluna da direita é necessário, tendo-se em mente que as bibliotecas listadas podem ser ligações simbólicas.
Em /lib deve-se ainda incluir um carregador de bibliotecas. O carregador será ou o ld.so (para bibliotecas a.out) ou ld-linux.so (para bibliotecas ELF). Caso não se esteja seguro do que será necessário, deve-se executar o comando file na biblioteca. Por exemplo:
% file /lib/libc.so.5.4.33 /lib/libc.so.4.7.2 /lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped /lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 386, version 1, stripped
QMAGIC indica que 4.7.2 é para bibliotecas a.out, e ELF indica que 5.4.33 é para ELF.
Deve-se então copiar o(s) carregador(es) necessário(s) para o sistema de arquivos raiz em construção. Bibliotecas e carregadores devem ser checados cuidadosamente com os binários incluídos. Caso o kernel não possa carregar a biblioteca necessária, normalmente haverá um travamento sem mensagens de erro.