Participe da Maratona Behind the Code! A competição de programação que mais te desafia! Inscreva-se aqui

Localizando rootfs Durante a Reinicialização

Descrevendo o Problema

O sistema de arquivos raiz (chamado de rootfs nesta mensagem de erro de amostra) é o componente mais básico do Linux. Um sistema de arquivos raiz contém tudo o que você precisa para suportar um sistema Linux completo. Ele contém todos os aplicativos, configurações, dispositivos, dados e muito mais. Sem o sistema de arquivos raiz, seu sistema Linux não pode ser executado.

Você pode ter recebido o erro não é possível montar rootfs (seguido pelo host do Linux que sofre um pânico de kernel) depois da reinicialização de seu sistema. Isso provavelmente ocorrerá depois de você anexar algum volume de armazenamento a partir de um armazenamento externo. Isso também pode ocorrer quando você terminou de copiar os arquivos e precisou fazer uma reinicialização para concluir a instalação.

Se isso acontecer, o sistema não será reiniciado. Pode levar algum tempo para tratar esse problema e corrigi-lo. Esse conjunto de dicas ajuda você a resolver o problema e economizar tempo.

Outro problema pode ser que o kernel do Linux precise montar o sistema de arquivos raiz, mas ele não consegue localizar o dispositivo de destino. Em outras palavras, seu sistema de arquivos raiz não é exibido onde deveria ser. Por exemplo, você instala o sistema de arquivos raiz do Linux no disco /dev/sda, mas o sistema não consegue montá-lo durante a reinicialização. Há dois motivos possíveis para isso:

  1. O disco /dev/sda não é exibido durante a reinicialização do seu sistema.

    Isso pode ocorrer porque o host Linux não conseguiu carregar o driver principal para seu sistema de arquivos raiz. Esse comportamento é anormal. O programa de instalação Linux criará todos os drivers necessários na imageminitrd para que o sistema Linux possa facilmente carregar os drivers de dispositivo durante o boot. Porém, se você instalou os drivers manualmente, esse erro poderá ocorrer.

  2. O disco /dev/sda é exibido, mas não está no seu sistema de arquivos raiz. O sistema de arquivos raiz foi alterado para /dev/sdb após a reinicialização.

    Essa é a causa mais provável.

Então, como /dev/sda foi renomeado como /dev/sdb depois das reinicializações do sistema? No Linux, /dev/sd* significa dispositivo SCSI. O Linux nomeia esses dispositivos de sda para sdz (em seguida sdaa para sdzz, e assim por diante). Ele nomeia primeiro o dispositivo SCSI /dev/sda, o segundo /dev/sdb, e assim por diante.

Se você instalar um dispositivo em um adaptador com um driver que é carregado antes do driver do adaptador de dispositivo do sistema de arquivos raiz (que está originalmente em /dev/sda), o sistema de arquivos raiz mudará para uma letra seguinte na cadeia do comando (/dev/sdb) e o sistema de arquivos raiz não será o primeiro dispositivo encontrado. Dessa forma, ele não conseguirá montar os rootfs se ele não conseguir localizá-lo no início da linha.

Essa é uma explicação direta sobre o que acontece, mas para dar um pouco mais de contexto para a situação, vamos descrever o processo de boot do Linux. (Se você souber as causas “raiz”, poderá avançar diretamente para as As Quatro Dicas.)

Como o Boot do Linux Funciona

As seguintes etapas descrevem como o processo de boot do Linux funciona:

  1. A primeira coisa que um computador faz na inicialização é um teste inicial, o Power On Self Test (POST). Vários dispositivos são testados, incluindo o processador, memória, placa gráfica e o teclado. Além disso, a unidade de boot (disco rígido, unidade de disquete e CD-ROMs) é testada. Após o POST, o carregador a partir de um ROM carrega o setor de boot, que em seguida carrega o sistema operacional a partir da partição ativa. Você pode editar a sequência da unidade de boot ao editar o BIOS do servidor.
  2. O setor do boot está sempre no mesmo local — trilha 0, cilindro 0, head 0 do dispositivo de boot. Este setor contém um programa chamado loader (para Linux geralmente é o LILO ou GRUB), que realmente executa o boot do sistema operacional. O carregador é instalado ou no MBR ou no primeiro setor da partição primária ativa.
  3. Se você tiver vários sistemas operacionais instalados no servidor, deverá selecionar qual deles você deseja no menu de carregador do boot. Você também pode selecionar neste menu qual kernel será carregado se você tiver vários kernels instalados.
  4. Em seguida, o carregador de boot descompactará e carregará o kernel. O kernel carregará primeiro os módulos de kernel e, em seguida, detectará o hardware (unidade de disquete, disco rígido, adaptadores de rede, etc.), verificará a configuração de hardware e varrerá e carregará os drivers de dispositivos.
  5. Nesta etapa, o kernel montará o sistema de arquivos raiz e os arquivos do sistema. O local dos arquivos do sistema é configurável durante a recompilação ou com outros programas. Se a montagem falhar, um pânico de kernel ocorrerá e o sistema congelará. Esse é o tipo de falha de montagem mencionado anteriormente.
  6. A seguir, o kernel iniciará o processo de inicialização do sistema init que será o processo número 1. Em seguida, ele inicializará o restante do sistema. O processo init é o primeiro processo do Linux, o principal de todos os outros processos. Esse processo é o primeiro a ser executado em qualquer sistema Linux/UNIX® e o seu PID sempre será 1.
  7. Em seguida, init examina o arquivo /etc/inittab para determinar quais processos devem ser ativados. Esse arquivo fornece informações sobre init em níveis de execução e sobre quais processos devem ser ativados em cada nível de execução. Após isso, init procura a primeira linha com uma ação sysinit (inicialização do sistema) e executa o arquivo de comando especificado, como /etc/rc.d/rc.sysinit no Red Hat Linux. Depois da execução dos scripts em /etc/rc.d/rc.sysinit, init será iniciado para ativar os processos associados ao nível de execução inicial. Ao final da execução dos scripts iniciais do nível de execução, o Linux permitirá você efetuar login.

Cada uma das soluções discutidas refere-se à etapa 5 desta lista.

As Quatro Dicas

Como o erro não é possível montar rootfs na maioria das vezes é causado pela ordem do dispositivo, alterar a ordem do dispositivo ou a sequência de carregamento do driver resolverá este problema.

Essas duas abordagens podem ser implementadas das seguintes quatro maneiras (cada método é designado para permitir que o seu disco raiz Linux seja exibido no kernel/sistema em primeiro lugar para que ele sempre use /dev/sda como o nome do dispositivo):

  1. Altere a ordem de boot do dispositivo PCI no BIOS do servidor.
  2. Conecte o disco do sistema de arquivos raiz no primeiro slot do adaptador.
  3. Edite a imagem initrd para permitir que o driver do adaptador do sistema de arquivos raiz seja carregado antes de todos os outros drivers adaptadores de armazenamento.
  4. Use o rótulo, o UUID ou um nome fácil em vez do nome do dispositivo para a montagem do sistema de arquivos raiz.

1. Altere a ordem de boot do dispositivo PCI no BIOS do servidor

Se você estiver usando um IBM System x® ou um IBM BladeCenter® HS Series, o procedimento será:

  1. Pressione F1 quando o servidor exibir informações de autoteste e solicitar que você Pressione F1 para acessar o BIOS.
  2. Selecione Opções de Início e pressione Enter como mostra a Figura 1.

Figura 1. O utilitário de configuração/instalação

Printscreen da BIOS do servidor no utilitário de configuração/instalação.

  1. Altere a Prioridade de Boot de Dispositivo PCI para o adaptador que seu disco de sistema de arquivos raiz está usando (como mostra a Figura 2 a seguir), se o seu Linux estiver instalado em um disco SAS planar local.
Figura 2. Opções de início

Printscreen da BIOS do servidor nas opções de inicialização.

Você também pode selecionar o slot de PCI relacionado para permitir que o Slot 1 da Placa Filha seja exibido para o sistema primeiro com o ID de dispositivo mais baixo (veja a Figura 3).

Figura 3. Outro conjunto de opções de início

Printscreen da BIOS do servidor nas opções de inicialização com PCI Device Boot Priority selecionado.

Nesse caso, o disco SAS Planar local terá o ID do dispositivo maior. Se você instalou o Linux no disco SAS Planar com o nome do dispositivo /dev/sda e depois anexou um novo dispositivo de disco no Slot 1 da Placa Filha, este novo disco usará o nome do dispositivo /dev/sda e o disco do sistema de arquivos raiz será alterado para /dev/sdb. Isso causará o erro não é possível montar rootfs.

2. Conecte o disco do sistema de arquivos raiz no primeiro slot do adaptador.

Se o seu adaptador de disco do sistema de arquivos raiz puder anexar mais de dois dispositivos ou você tiver mais de dois adaptadores de disco, assegure que o seu disco de sistema de arquivos raiz esteja localizado no slot com ID do dispositivo mais baixo (como o primeiro slot do primeiro adaptador). Se houver um novo disco incluído com um ID mais baixo do que o seu disco de sistema de arquivos raiz, será necessário colocar seu disco de sistema de arquivos raiz em um slot antes dele. Isso fará com que o disco do sistema de arquivos raiz seja exibido primeiro no sistema Linux.

3. Edite a imagem initrd para alterar a sequência do adaptador de armazenamento

A imagem initrd é na realidade um disco RAM que contém um pequeno sistema de arquivos com arquivos de configuração, binários, bibliotecas e drivers básicos. Nesse pequeno sistema de arquivos, há um sistema de arquivos raiz que será carregado na memória durante o boot e há um script inicial para carregar os drivers do dispositivo do sistema; ele remontará o disco do sistema de arquivos raiz real depois de concluir o carregamento de todos os drivers dos dispositivos. O erro não é possível montar rootfs sempre ocorre quando o sistema tenta alternar o sistema de arquivos raiz initrd para o disco do sistema de arquivos raiz real com o nome do dispositivo nesta configuração. É necessário alterar a sequência de carregamento do driver de dispositivo no script de carregamento do driver da imagem initrd para permitir que o disco do sistema de arquivos raiz seja exibido com o nome do dispositivo correto antes que o sistema tente remontar o sistema de arquivos raiz real. Para fazer isso:

  1. Use um CD de recuperação Linux para fazer o boot do sistema para o modo de recuperação já que não é possível acessar o sistema de arquivos raiz.
  2. Monte seu sistema de arquivos raiz em um diretório temporário como sysroot (alguns CDs de recuperação Linux farão isso automaticamente para você). Por exemplo, seu disco do sistema de arquivos raiz é reconhecido como /dev/sdc ao fazer o boot do sistema para o modo de recuperação e o seu sistema de arquivos raiz está usando a partição 3.

    [root@linuxhost ~]#mount /dev/sdc3 sysroot
    
  3. Alterne a raiz do sistema de recuperação para sysroot para que você possa acessar o sistema de arquivos raiz do sistema de servidor com problema.

    [root@linuxhost ~]#chroot sysroot
    
  4. Extraia a imagem initrd.

    1. Para o Red Hat Enterprise Linux anterior à versão 3 e para o SUSE Linux Enterprise Server anterior à versão 9:

      [root@linuxhost ~]#cp /boot/initrd-x.x.x-x.ELsmp.img ./initrd.gz [root@linuxhost ~]#mkdir temp [root@linuxhost ~]#gunzip ./initrd.gz [root@linuxhost ~]#mount -o loop -t ext2 initrd tempIsso extrairá a imagem initrd para um arquivo initrd. Em seguida, monte este arquivo com o tipo de sistema de arquivos ext2 no diretório temp do ponto de montagem. Após isso, você poderá ver todos os arquivos empacotados na imagem initrd.

    2. Para o Red Hat Enterprise Linux versão 4 e superior ou para o SUSE Linux Enterprise Server versão 10 e superior:

      [root@linuxhost ~]#cp /boot/initrd-*.img ./initrd.gz [root@linuxhost ~]#mkdir temp [root@linuxhost ~]#cd temp [root@linuxhost ~]#gzip -dc ../initrd.gz | cpio -idDa mesma forma para com essas distribuições Linux mais recentes, a imagem initrd também é compactada com cpio. Esses comandos extrairão o sistema de arquivos inteiro com sua estrutura de diretórios no diretório temp. Agora você poderá localizar todos os arquivos na imagem initrd no diretório temp.

  5. Agora você localizará o arquivo init para o Red Hat Enterprise Linux e para o SUSE Linux Enterprise Server versão 10 ou o arquivo linuxrc para o SUSE Linux Enterprise Server anterior à versão 9 no diretório temp. Este arquivo é um script de shell Linux simples que contém todos os comandos para carregar os drivers do dispositivo na memória do sistema. Você pode editá-lo com um editor de texto ou outros editores.
  6. Edite o arquivo init ou linuxrc para que o adaptador de disco do sistema de arquivos raiz seja exibido antes de todos os outros adaptadores de armazenamento na mesma categoria. Na maioria dos casos, o disco do sistema de arquivos raiz será um dispositivo SCSI com um prefixo sd. Você deverá colocar todos os outros adaptadores de armazenamento, como os drivers FC ou HBA SAS, após o driver do qual o disco do sistema de arquivos raiz depende.

    1. Por exemplo, se o seu disco físico do sistema de arquivos raiz for conectado a um adaptador SAS, o arquivo init poderá ter um campo como o seguinte:

      ....... echo "Loading mptbase.ko module" insmod /lib/mptbase.ko echo "Loading mptscsi.ko module" insmod /lib/mptscsi.ko echo "Loading mptspi.ko module" insmod /lib/mptspi.ko echo "Loading mptsas.ko module" insmod /lib/mptsas.ko echo "Loading mptscsih.ko module" insmod /lib/mptscsih.ko echo "Loading qla2xxx.ko module" insmod /lib/qla2xxx.ko .......Nesse caso, coloque todos os outros drivers de adaptadores SCSI (como o driver HBA Qlogic qla2xxx.ko) depois do driver do adaptador SAS mptsas.ko.

    2. Se você estiver usando o SUSE Linux Enterprise Server versão 10, ele será semelhante ao seguinte:

         modprobe scsi_mod $params
         modprobe sd_mod $params
         params=
         for p in $(cat /proc/cmdline) ; do
           case $p in
             aacraid.*)
               params="$params ${p#aacraid.}"
               ;;
           esac
         done
         echo "Loading aacraid"
         modprobe aacraid $params
         modprobe scsi_transport_fc $params
         modprobe firmware_class $params
         params=
         for p in $(cat /proc/cmdline) ; do
           case $p in
             qla2xxx.*)
                 params="$params ${p#qla2xxx.}"
                 ;;
              esac
         done
         echo "Loading qla2xxx"
         modprobe qla2xxx $params
      
  7. Verifique se sua edição está correta para que você carregue todos os drivers necessários (o SAS, por exemplo, requer que os drivers mptbase.ko, mptscsi.ko, mptspi.ko, mptsas.ko e mptscsih.ko sejam carregados juntos para que você não deixe que qla2xxx.ko seja carregado antes do mptscsih.ko). Além disso, você poderá verificar a ortografia.

  8. Neste ponto, será necessário recompactar o sistema de arquivos initrd em uma imagem e substituir o original no diretório /boot.

    1. Para o Red Hat Enterprise Linux anterior à versão 3 e para o SUSE Linux Enterprise Server anterior à versão 9:

         [root@linuxhost ~]#umount temp
         [root@linuxhost ~]#gzip initrd
         [root@linuxhost ~]#cp initrd.gz /boot/initrd-2.x.x-x.img
      
    2. Para o Red Hat Enterprise Linux versão 4 e superior ou para o SUSE Linux Enterprise Server versão 10 e superior:

      [root@linuxhost ~]#find ./ | cpio ‑H newc ‑o > ../initrd
      [root@linuxhost ~]#gzip initrd
      [root@linuxhost ~]#cp initrd.gz /boot/initrd‑2.6.x‑x.img

  9. Parabéns! Você corrigiu o problema. Agora reinicialize e verifique o resultado.

4. Use o rótulo, o UUID ou um nome fácil.

Alguns tipos de sistemas de arquivos Linux (como ext2, ext3, reiserfs, swap e XFS) suportam a montagem do sistema de arquivos com um rótulo em vez de um nome de dispositivo e você pode usar o UUID em vez do sistema Linux que o suporta. Além disso, você pode usar um nome fácil se o driver de dispositivo suportar.

Esses métodos precisam que o seu sistema Linux suporte esses recursos (como o Red Hat Enterprise Linux V4 e superior ou o SUSE Linux Enterprise Server V9 e superior). Como o rótulo, o UUID e o nome fácil sempre serão associados a um dispositivo dedicado, seu sistema sempre localizará seu disco de sistema de arquivos raiz, independente de qual ID de dispositivo ele possuir ou de qual nome de dispositivo ele receber.

Use um rótulo

  1. Crie um rótulo ao criar um sistema de arquivos, como root, swap ou outros sistemas de arquivos.

    [root@linuxhost ~]#mkfs.ext3 -L ROOT /dev/sda1
    [root@linuxhost ~]#mkfs.reiserfs -l OSROOT /dev/sdb2
    [root@linuxhost ~]#mkfs.xfs -L XFSROOT /dev/sde3
    [root@linuxhost ~]#mkswap -L SWAP0 /dev/sdb5
    
  2. Inclua um rótulo no seu sistema de arquivos depois de ser criado.

    [root@linuxhost ~]#e2label /dev/sda1 PRIMARY_ROOT
    [root@linuxhost ~]#reiserfstune -l OSROOT /dev/sdb2
    [root@linuxhost ~]#xfs_admin -L DATA1 /dev/sdf4
    
  3. Use um rótulo no seu sistema.

    1. Edite /etc/fstab para o seu sistema Linux para que ele use um rótulo para montar o sistema de arquivos em vez de um nome de dispositivo. A seguir há um exemplo simples do conteúdo de /etc/fstab:

         LABEL=ROOT          /         ext3    defaults        1 1
         LABEL=BOOT          /boot     ext3    defaults        1 2
         LABEL=SWAP          swap      swap    defaults        0 0
         LABEL=HOME          /home     ext3    nosuid,auto     1 2
      
    2. Edite grub.conf do seu carregador de boot Linux.

         title Linux
           root (hd0,0)
           kernel (hd0,0)/vmlinuz ro root=LABEL=ROOT rhgb quiet
         initrd (hd0,0)/initrd-2.x.x-xx.img
      

Use o UUID

  1. Utilize o UUID para seu dispositivo raiz. Suponhamos que o seu sistema de arquivos raiz esteja localizado no dispositivo de disco /dev/sda como no seguinte exemplo:

    [root@linuxhost ~]#scsi_id -g -s -u /block/sda
    
  2. Use o seguinte comando para verificar o ID do seu dispositivo do sistema de arquivos raiz com o UUID do dispositivo obtido na etapa 1.

    [root@linuxhost ~]#ls /dev/disk/by-id/<your device UUID>
    
  3. Use o UUID no seu sistema ao editar /etc/fstab como neste exemplo:

    /dev/disk/by-id/scsi-<your uuid>-part2 / ext3  defaults  1 1
    

Use um nome de dispositivo fácil

Se você usar a ferramenta Device Mapper Multi-Path (DMMP) para o seu armazenamento multi-path será possível usar um nome fácil para seu sistema de arquivos raiz para evitar que o dispositivo seja renumerado pelo DMMP após a reinicialização.

  1. Utilize o UUID para seu dispositivo raiz. Suponhamos que o seu sistema de arquivos raiz esteja localizado no dispositivo de disco /dev/sda:

    [root@linuxhost ~]#scsi_id -g -s -u /block/sda
    
  2. Edite /etc/multipath.conf para incluir um nome fácil no seu dispositivo de sistema de arquivos raiz como no seguinte exemplo:

    multipaths {
           multipath {
                   wwid   <your disk UUID get from above command>
                   alias    OSROOT
            }
    }
    
  3. Em seguida, depois da reinicialização do sistema ou de carregar novamente o DMMP, o nome do dispositivo de sistema de arquivos raiz será /dev/mapper/OSROOT (se o seu sistema de arquivos raiz estiver usando a partição 3 desse disco, o nome do dispositivo poderá ser/dev/mapper/OSROOT-part3 ou /dev/mapper/OSROOTp3).

  4. Edite /etc/fstab para usar esse nome fácil para esse dispositivo de sistema de arquivos raiz da seguinte forma:

    /dev/mapper/OSROOT-part3    /     ext3  defaults     1 1
    
  5. Edite /etc/grub.conf para usar esse nome quando o sistema for inicializado.

    title Linux
        root (hd0,0)
        kernel (hd0,0)/vmlinuz ro root=/dev/mapper/OSROOT-part3 rhgb quiet
        initrd (hd0,0)/initrd-2.x.x-xx.img
    
  6. Neste ponto, você já terminou. Agora reinicialize e verifique se tudo deu certo.

Conclusão

Este artigo mostrou como configurar seu sistema para evitar ou corrigir erros não é possível montar rootfs do Linux além de fornecer uma base sobre o processo de boot de um sistema Linux.

Avisos

o conteúdo aqui presente foi traduzido da página IBM Developer US. Caso haja qualquer divergência de texto e/ou versões, consulte o conteúdo original.