Bruno Takahashi C. de Oliveira

Computação / Minix-Alan-HOWTO

Voltar para página de Computação
[[[ MINIX-PARA-AULA-DO-ALAN-HOWTO ]]]

Copyright (c) 2004 Bruno T. C. de Oliveira
                   Arthur Biazon Machado.

Mande correções/comentários/reclamações sobre esse HOWTO para
btco@linux.ime.usp.br e/ou messias@linux.ime.usp.br

VERSÃO: 1.4

CHANGELOG
2004-11-24  v1.4 - adicionadas notas sobre a nova versão do Bochs (2.1.1)
2004-09-22  v1.3 - item 19 editado para explicar melhor o processo de
                   recuperação de um sistema quebrado
2004-09-20  v1.2 - tópicos extras adicionados no final do howto
                   (sobre copiar arquivos de/para o minix)
2004-09-20  v1.1 - corrigido 'compress -d' que estava faltando no passo 16
2004-09-15  v1.0 - versão inicial

** NOTAS SOBRE A NOVA VERSÃO DO BOCHS INSTALADA NA REDE (2.1.1) *********
- no momento que você inicia o bochs agora você verá um prompt "<bochs:1>"
  Esse é o debugger. Dê o comando 'c' <ENTER> para iniciar.

- Na nova versão NÃO É MAIS NECESSÁRIO utilizar hd=bios. O hd é reconhecido
  sem problemas pelo Minix agora.

- Por esse motivo é possível agora bootar o Minix direto do "hd virtual"
  sem a necessidade de deixar o disquete ROOT linkado como a.img
  (i.e. dá para configurar o BOCHS para bootar direto da imagem de HD,
  e aí basta digitar '=' no primeiro (e único) prompt do Boot Monitor)
**************************************************************************

0. Alguns avisos preliminares

   O BOCHS tem um bug irritante que faz com que o teclado pare de funcionar
   certo quando você desfocaliza a janela e volta para ela com Alt-TAB.
   Isso acontece porque o Alt fica 'preso'. Para solucionar isso basta
   apertar e soltar o Alt quando o bochs estiver focalizado. Torne isso
   um cacoete.

   Todas as informações aqui presentes são fornecidas 'COMO ESTÃO'. Em
   nenhuma circunstância os autores serão responsabilizados pelos efeitos
   adversos advindos da utilização dessas informações. Não nos culpe
   se você queimar a sua máquina, contrair alguma doença incurável,
   tiver queda precoce de cabelos e/ou perde neurônios, ficar 
   permanentemente traumatizado com o Minix, ou se macacos de três cabeças
   invadirem seu domicílio como resultado da utilização das informações aqui 
   contidas.

1. Prepare seu diretório

        [~]$ cd
        [~]$ mkdir so
        [~/so]$ cd so

A partir daqui, a não ser que especificado em contrário, você deverá
estar no diretório ~/so

2. Baixe os arquivos binários do Minix:

        http://www.cs.vu.nl/cgi-bin/raw/pub/minix/2.0.0/i386.tar

3. Descompacte os arquivos binários no seu diretório

        [~/so]$ tar -xf /caminho/para/i386.tar
        [~/so]$ cd i386
        [~/so/i386]$ chmod 644 *

4. Configure o bochs

        [~/so]$ mkdir bochs
        [~/so]$ cd bochs
        [~/so/bochs]$ bximage
   
   Responda 32MB como tamanho do disco, c.img como nome do arquivo de imagem.
   Ele vai criar um c.img e dizer que os parâmetros são
        - 65 cilindros
        - 16 cabeças
        - 63 setores por trilha

5. Faça links para as imagens de disco

        [~/so/bochs]$ ln -s ../i386/ROOT ./a.img
        [~/so/bochs]$ ln -s ../i386/USR ./b.img

6. Configure o bochs
        
        [~/so/bochs]$ bochs
        Digite 3 ENTER 6 ENTER 2 ENTER
                    (Edit Options | Memory Options | VGA BIOS Image)
        Digite /usr/share/bochs/VGABIOS-elpin-2.40
        Digite 3 ENTER (opção ROM BIOS Image)
        Digite /usr/share/bochs/BIOS-bochs-latest
        Digite ENTER para voltar ao menu de configuração
        Selecione 8 (Disk options)
        Selecione 4 (que diz 'disabled')
                Enable this device?     yes
                Type of ATA device:     hard disk
                Path or bla bla bla:    c.img
                Cylinders:              65
                Heads:                  16
                Sectors Per Track:      63
                Model Name:             Generic
                BIOS Detection:         auto
                Translation type:       auto
        Selecione 1 (Floppy drive 0)
                Filename of first floppy image:         a.img
                What type of bla bla?                   1.44M
                Is the floppy inserted or ejected?      inserted
        Selecione 2 (Floppy drive 1)
                Filename of first floppy image:         b.img
                What type of bla bla?                   1.44M
                Is the floppy inserted or ejected?      inserted
        Selecione 16 (Boot From)
                Boot from bla bla bla?                  floppy
        Dê ENTER para voltar ao menu de configuração
        Dê ENTER de novo para voltar ao menu principal
        Selecione 4 (Save Options To)
                Save to what file?                      .bochsrc
        Selecione 6 para sair da configuração.

7. Particione sua imagem de disco (é bom particionar já de cara,
   de fora do MINIX, porque o particionador do MINIX é um saco).

        [~/so/bochs]$ /sbin/fdisk c.img
        x         (modo nerd)
        c         (setar cilindros)
        65
        h         (setar número de cabeças)
        16
        s         (setar número de setores por trilha)
        63
        r         (voltar ao menu normal [não-nerd])
        n         (criar nova partição)
        p         (partição primária)
        1
        ENTER     (a tecla, não digite E-N-T-E-R dã)
        ENTER     (vide comentário da linha anterior)
                  (isso faz com que a partição tome todo o espaço do disco)
        t         (selecionar tipo da partição)
        81        (tipo Minix)
        w         (escrever tabela de partição para a imagem)
        (ignore os erros de ioctl)

8. Inicie o MINIX

        [~/so/bochs]$ bochs
        ENTER

   Você verá o menu de inicialização do Minix. Digite 'ESC' para
   entrar na linha de comando e prossiga assim:

   [ESC]
   fd0> hd=bios
   fd0> boot

   Esse truque é necessário porque o MINIX não consegue ler o HD
   simulado sozinho sem a ajuda da BIOS. Você vai precisar fazer
   isso toda santa vez que for bootar o MINIX.

   Finish the name of the bla bla bla: /dev/fd1

   ,-------------------------------------------------------------------------,
   |Minix 2.0.0  Copyright 1997 Prentice-Hall, Inc.                          |
   |                                                                         |
   |Executing in 32-bit protected mode                                       |
   |                                                                         |
   |                                                                         |
   |Memory size = 3658K   MINIX = 295K   RAM disk =  480K   Available = 2884K|
   |                                                                         |
   |RAM disk loaded.                                                         |
   |Wed Sep  8 11:34:57 MET DST 2004                                         |
   |Finish the name of device to mount as /usr: /dev/fd1                     |
   |/dev/fd1 is read-write mounted on /usr                                   |
   |Starting standard daemons: update.                                       |
   |                                                                         |
   |Login as root and run 'setup' to install Minix.                          |
   |                                                                         |
   |Minix  Release 2.0 Version 0                                             |
   |                                                                         |
   |noname login:                                                            |
   |                                                                         |
   `-------------------------------------------------------------------------'

   Logue como 'root' e digite 'setup'
   Vá dando ENTER no bla bla bla todo que ele fala até chegar no
   particionador de disco chato. Digite 'q' para sair dele porque você
   foi esperto(a) e já particionou seu disco no passo anterior :-)

   Please finish the name of the primary bla bla bla:       /dev/hd1

   Interrompa o Bad Block scan porque sabemos que não tem blocos ruins
   na imagem de disco :-) Para interromper pressione DEL.

   By now the floppy USR has bla bla bla.
   What floppy drive is it in?   1

   What is the memory size bla bla bla?   <ENTER>

   Agora você estará de volta no prompt '#'. Digite 'halt' nesse prompt.

         # halt

   Isto lhe trará de volta ao Boot Monitor. Poderíamos continuar daqui,
   mas vamos fechar o bochs e abrí-lo de novo para mostrar como deve
   ser feito das próximas vezes com o minix já instalado.
   Então feche o BOCHS clicando no botão POWER.

9. Iniciando seu Minix já instalado.

         [~/so/bochs]$ bochs
         ENTER

   Você chegará no menu de boot. NÃO DÊ '=' ainda!
   Digite ESC para entrar na linha de comando e faça o seguinte:

         [ESC]
         fd0> hd=bios
         fd0> boot hd1

   Dejá vù. Tela de boot de novo. DESTA VEZ, dê '='.
   Logue como root.

10. Instalando os programas adicionais

   Agora que fiz você iniciar seu Minix, feche o BOCHS. Era só para
   mostrar como fazer. Essa é uma das coisas mais legais de escrever
   um HOWTO. Tudo o que eu falar você vai fazer. É um poder quase
   supernatural. Bwa ha ha ha ha. Agora você é uma tangerina.
   Seu fruta! Volte a ser humano (ou qualquer coisa que você era antes de
   virar uma tangerina).

         [~/so/bochs]$ cd ../i386
         [~/so/i386]$ split -b 1440k -d USR.TAZ USR.TAZ.D

   Agora devem ter arquivos USR.TAZ.D00, USR.TAZ.D01, etc. no diretório.

11. Agora rode o Minix como falei antes.

         [~/so/bochs]$ bochs
         ENTER
         [ESC]
         fd0> hd=bios
         fd0> boot hd1
         Dejá vù
         =

    Logue de root.

         # setup /usr

         What is the size of the bla bla bla? <ENTER>
         What floppy drive to use? 1
         Please insert bla bla and hit return.
         NÃO DÊ ENTER AINDA - VOCÊ PRECISA 'INSERIR' O DISCO

    Para 'inserir' o primeiro disco, faça o seguinte (fora do bochs):

         [~/so/bochs]$ ln -sf ../i386/USR.TAZ.D00 ./b.img

    Agora volte no bochs e (MUITO IMPORTANTE) clique duas vezes
    no ícone do DISQUETE B: (vai aparecer um X na primeira vez
    que você clicar e vai desaparecer na segunda vez). Isso é necessário
    para 'dizer' ao bochs que o disco foi trocado.

    Agora você pode dar ENTER no bochs para continuar a instalação.

    Vai chegar uma hora em tempo finito em que ele vai pedir o próximo
    disco. Faça a mesma coisa, mas com USR.TAZ.D01 ao invés de USR.TAZ.D00.
    E assim por diante. NÃO ESQUEÇA de clicar no botão DISQUETE B: do
    bochs cada vez que você trocar de disco.

12. Tudo pronto. Lembre do ritual necessário toda santa vez que você
    quiser iniciar o seu Minix (passo 9). Sem ele o Minix não vai
    reconhecer o disco rígido.

13. Dica: se você acha que a emulação está muito lenta, tente utilizar
    os seguintes valores para 'Emulated Instructions per second'
    e 'VGA update interval':

    Emulated IPS:         2000000
    VGA update interval:  20000

    Uma outra dica também é configurar o bochs para utilizar a SDL
    (ao invés de x11 ou wx) como biblioteca gráfica. A SDL (pelo menos
    para a gente) teve desempenho superior às outras duas mas faltam-lhe
    alguns features (copiar e colar, por exemplo, que é raramente usado
    de qualquer maneira).
    
[[ DICAS SOBRE HACKEAR E COMPILAR O MINIX EM SI ]]

14. Baixe o source do minix do site. Ele vai vir num arquivo SYS.TAZ,
    que é um tar comprimido (via compress, não gzip). Eis a URL:

    http://www.cs.vu.nl/pub/minix/2.0.0/src/SYS.TAZ

15. Faça o mesmo truque do split para fazer vários "discos" de 1440k:

         [/tmp]$ wget http://www.cs.vu.nl/pub/minix/2.0.0/src/SYS.TAZ
         [/tmp]$ split -b 1440k -d SYS.TAZ SYS.TAZ.D
         [/tmp]$ cd ~/so/bochs
         [~/so/bochs]$ ln -sf /tmp/SYS.TAZ.D00 ./b.img
         [~/so/bochs]$

16. Agora inicie o Minix como já explicamos e rode os seguintes comandos
    dentro do minix:

         # cd /usr
         # vol /dev/fd1 | compress -d | tar xv -

    Este comando fará o Minix exibir um prompt para trocar de discos
    e ao mesmo tempo descompactar o conteúdo dos discos com o tar.
    Toda vez que for pedido num novo disco, faça o seguinte (nesse
    exemplo estamos tirando o disco SYS.TAZ.D00 e colocando o
    SYS.TAZ.D01):

         [~/so/bochs]$ ln -sf /tmp/SYS.TAZ.D01 ./b.img

    E clique duas vezes no ícone "Drive B:" do BOCHS. Isso é necessário
    para informar ao BOCHS (e portanto ao Minix) que o disco dentro
    do drive virtual foi trocado.

    Agora basta ir trocando os discos dessa maneira e você terá
    no final um diretório /usr/src com todo o fonte do Minix.

17. Hackeando o Minix: o kernel em si estará em /usr/src/kernel.
    O init (programa que ele roda no boot) está em /usr/src/tools.
    Para editar o código-fonte, você terá que usar algum dos editores
    que vêm no Minix. Um bom editor é o elvis, que é um clone do vi
    com menos features (e portanto mais leve). Naturalmente para usá-lo
    você deve saber utilizar bem o vi (saber navegar pelo arquivo,
    alternar entre modo insert e modo comando, juntar linhas, indentar,
    etc). Não tem emacs nem nenhum desses outros editores "bonitinhos".
 
18. Compilando seu frankenstein: Quando você terminar de destruir o
    Minix, faça o seguinte para compilar:

         # cd /usr/src/tools
         # make hdboot

    Isso vai compilar o Minix e instalá-lo. A imagem do kernel vai
    para /minix/minix-2.0.0r1 (o sufixo muda conforme você compila
    novos kerneis). Quando você boota o boot monitor sempre escolhe
    o kernel mais recente.

    Agora reboote para ver os resultados do seu trabalho:

         # halt
         fd0> boot hd1

    (note que a segunda linha é o prompt do Boot Monitor, que retoma
    o controle depois que o Minix termina como resultado do comando 'halt')

19. Recuperando o seu sistema: se você (como a gente) acabar fazendo
    o kernel parar de funcionar por causa de um bug, você não vai
    conseguir bootar. Para bootar, você terá que utilizar o
    Boot Monitor da seguinte maneira: no primeiro boot monitor
    digite "hd=bios" e "boot hd1" como de costume. Mas no segundo,
    prossiga da seguinte maneira:

    fd0> image=/minix/2.0.0
    fd0> boot

    Isso fará o Minix bootar a imagem 2.0.0, que é a padrão "de fábrica".
    
[[ TÓPICOS EXTRA ]]

20. Copiando arquivos de dentro do bochs para fora: o truque é fazer o minix
    achar que está escrevendo um tar num disquete, e mapear o disquete
    para um arquivo usando o bochs. A idéia é mais ou menos essa: digamos
    que você quer extrair o diretório /usr/src/kernel de dentro do bochs
    e fazer um tar dele.

    [~/so/bochs]$ dd if=/dev/zero of=/tmp/my.tar bs=1024 count=1440
    [~/so/bochs]$ ln -sf /tmp/my.tar b.img
    [~/so/bochs]$ bochs
    <certificar-se de que o bochs está configurado para enxergar b.img
    como segundo disco flexível>
    # cd /usr/src
    # tar cvf /dev/fd1 kernel
    # halt

    Pronto, agora você tem um arquivo /tmp/my.tar que tem os fontes
    do diretório /usr/src/kernel do Minix.

    ATENÇÃO: até que você dê halt, o arquivo /tmp/my.tar PODE ESTAR EM
    ESTADO INCONSISTENTE, pois o conteúdo do arquivo pode estar 
    em cache no minix. Portanto, antes de utilizar o arquivo /tmp/my.tar,
    é fundamentalmente necessário dar 'halt' no minix.
    
21. Copiando arquivos de fora do bochs para dentro. A idéia é a inversa:
    fazer um tar e mapeá-lo para o disquete no bochs. Digamos que você
    tem o diretório ~/so/bochs/kernel e você quer copiá-lo para dentro
    do bochs.

    [~/so/bochs]$ tar -cf /tmp/my.tar kernel
    [~/so/bochs]$ ln -sf /tmp/my.tar b.img
    [~/so/bochs]$ bochs
    <certificar-se de que está configurado para enxergar b.img como
    segundo disco flexível>
    # cd /tmp
    # tar xvf /dev/fd1

    Pronto, agora você tem o diretório /tmp/kernel dentro do minix, com
    os conteúdos do ~/so/bochs/kernel.

    ATENÇÃO: Quando você expande um tar sem ser root (como é o caso de você
    estar usando a Rede Linux como usuário comum), o dono dos arquivos
    passa a ser o seu usuário. Assim, quando você refaz o tar para copiá-lo
    de volta para o Minix, o usuário fica setado. Logo, dentro do Minix
    o dono dos arquivos ficará incorreto (aparecerá uma UID ao invés de
    'root' como dono dos arquivos). Acredito que isso não é problema,
    mas se você quer ser correto é bom usar o chown.

22. Entregando o EP: acho que uma forma razoável de entregar o EP
    (ATENÇÃO: não sou o monitor, estou especulando aqui) é enviar para 
    o Panda o arquivo tar do diretório /usr/src/kernel do minix.
    Assim o monitor pode utilizar o item (21) acima para copiar o seu
    tar para dentro do minix e testá-lo.