Corrigindo a instalação não inicializável na raiz do LVM a partir do Desktop LiveCD

9

Acabei de fazer uma instalação a partir do 10.10 Desktop LiveCD, tornando o volume raiz um LVM LV.

Aparentemente, isso não é suportado; Eu o gerenciei executando estas etapas antes de iniciar o aplicativo instalador da GUI:

  • instalando o lvm2pacote no sistema em execução
  • criando uma partição do tipo LVM no disco rígido do sistema
  • criando um volume físico, um grupo de volumes e um LV raiz usando as ferramentas LVM. Eu também criei um segundo LV para /var; isso eu não acho relevante.
  • criando um sistema de arquivos (ext4) em cada um dos dois LVs.

Após executar essas etapas, o instalador da GUI ofereceu os dois LVs como destinos de instalação; Aceitei com prazer, também colocando /bootuma partição primária separada da partição LVM.

A instalação parecia ter ocorrido sem problemas e eu verifiquei que os volumes raiz e var contêm estruturas de diretório com aparência aceitável.

No entanto, a inicialização falha; se eu entendi corretamente o que aconteceu, fui jogado em um busybox rodando no sistema de arquivos initrd.

Embora eu não tenha trabalhado com toda a documentação do grub2 ainda, parece que a entrada que tenta inicializar meu novo sistema está correta:

menuentry 'Ubuntu, with Linux 2.6.35-22-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    recordfail
    insmod part_msdos
    insmod ext2
    set root='(hd0,msdos3)'
    search --no-floppy --fs-uuid --set $UUID_OF_BOOT_FILESYSTEM
    linux   /vmlinuz-2.6.35-22-generic root=/dev/mapper/$LVM_VOLUME_GROUP-root ro   quiet splash
    initrd  /initrd.img-2.6.35-22-generic
}

Observe que $ VARS são substituídos no real grub.cfgpelos seus valores correspondentes.

Reiniciei novamente no livecd e descompactei a imagem initrd em um diretório temporário. Parece que a imagem initrd não possui a funcionalidade LVM. Por exemplo, se eu estiver lendo /usr/share/initramfs-tools/hooks/lvm2(instalado lvm2no sistema inicializado com livecd, não presente no instalado) corretamente, um lvmexecutável deverá estar localizado em /sbin; Esse não é o caso.

Qual é a melhor maneira de remediar esta situação? Percebo que seria mais fácil usar o CD de instalação alternativo, que aparentemente suporta o LVM, mas não quero esperar o download e ter que reinstalá-lo.

intuído
fonte

Respostas:

9

Você acertou o problema na cabeça: o initramfs não tem suporte ao LVM. Veja como corrigi-lo:

  1. Inicialize o LiveCD novamente
  2. Instale lvm2novamente no ambiente ao vivo
  3. Exiba o grupo de volumes (se -ay não funcionar, tente -a yes)

    vgchange -a y
    
  4. Obtenha o LV raiz / boot e / dev montados sob a árvore separada

    mkdir /newroot
    mount /dev/yourVG/rootLV /newroot
    mount /dev/yourbootpartition /newroot/boot
    mount -o bind /dev /newroot/dev
    
  5. Copie os pacotes necessários para a árvore / newroot

    cp /var/cache/apt/archives/*deb /newroot/tmp/
    
  6. Faça chroot na nova árvore e instale os pacotes

    chroot /newroot
    cd /tmp
    dpkg -i *.deb
    

Neste ponto, as coisas devem voltar ao normal (já que o initramfs será regenerado quando o lvm2 estiver instalado). Caso contrário, você pode brincar de correr update-initramfs -udentro do chroot.

Kees Cook
fonte
Qual é o motivo da montagem de ligação / dev?
intuited
Eu adicionei / dev no caso de o grub ser executado novamente e querer descobrir onde as unidades de inicialização estavam localizadas. Eu usei o dpkg no caso de a rede não estar ativa ou estranha dentro do chroot. Se a rede funcionar, eu recomendo "apt-get" em vez de "aptitude", pois ela tem uma melhor resolução dep hoje em dia.
Kees Cook #:
Obrigado pela dica apt-get, é difícil acompanhar o que é o quê. Você tem um link para mais informações sobre isso?
intuited
1

Depois de instalar o sistema no disco rígido, você precisa instalar o lvm2 nesse sistema antes que ele possa inicializar. Se você instalou o lvm2 no livecd, os pacotes ainda estarão em / var / cache / apt / archives. Mude para esse diretório, monte o disco rígido e instale os pacotes no disco rígido usando dpkg --root = / mnt * .deb. No seu caso, você precisa montar o root fs em / mnt e também o var fs em / mnt / var.

Além disso, você não precisa da partição / boot separada, e uma partição / var separada é questionável.

psusi
fonte
Bom ... é mais fácil do que isso chroot. Eu acho que isso não será registrado no aptitudebanco de dados dos pacotes que foram explicitamente instalados, portanto, provavelmente eu deveria apenas instalar lvm2e suas dependências dessa maneira. Alguma desvantagem em usar um separado /var? Além da questão de ter que alocar espaço extra 'folgado'? Eu gostaria de poder fazer uma captura instantânea, para não querer misturá-lo com outros arquivos variáveis ​​grandes; Estou planejando fazer um link simbólico ou montar o diretório inicial do meu diretório home em um diretório em um /datavolume separado que eu criarei após a instalação do sistema, para armazenar música e coisas assim.
intuited
Além disso: também vou precisar montar o boot fs /mnt/boot, não? Eu acho que lvm2cria um novo initrd na instalação.
intuited
@ intuited não, será gravado como instalado manualmente, como sempre. Sim, você também precisa de / boot montado se tiver um deles separado. Ter um / var separado não ajuda na criação de instantâneos.
Psusi
Uma /varpartição separada não ajudará com os instantâneos, não, mas ajudará, por exemplo, a impedir que o root fs seja preenchido inesperadamente. Você está dizendo que isso apresentará problemas ao tirar instantâneos? Oh, espere, é você no outro tópico de comentário da pergunta. Nevermind ..
intuited
1

Acabei fazendo principalmente o que Kees Cook apresenta de maneira agradável, com alguma ajuda da seção final deste passo a passo . Contudo:

  • Eu não amarrei /dev. Parece que isso causou algumas mensagens de erro mais tarde; ver abaixo.
  • Eu montei meu /varvolume na nova raiz além de /boot.
  • Não copiei os debs para /tmpa nova raiz. Em vez disso, corri # apt-get install aptitude; aptitude install lvm2atrás de chrooting.

    • Fiz isso para registrar essas ações no banco de dados apt: por exemplo aptitude, e talvez também apt-get, rastreie quais pacotes foram instalados explicitamente e quais foram instalados automaticamente como dependências.
    • Como estou recebendo meus pacotes por meio de um proxy apt local (em execução apt-cacher-ng), nem precisei esperar que eles baixassem novamente. Eu tive que criar um arquivo /etc/apt/apt.conf.d/02proxycontendo Acquire::http::Proxy "http://local-apt-proxy-server:3142";antes de executar apt-get. Eu fiz a mesma coisa antes de começar a instalar pacotes enquanto executava o LiveCD antes de fazer a instalação.
    • Recebi uma mensagem de erro ou aviso algumas vezes, informando

      Can not write log, openpty() failed (/dev/pts not mounted?)
      

** monte -o bind / dev / pts / mnt / YouNameIt / dev / pts

    This did not prevent the appropriate lines from being added to `/var/log/dpkg.log`.

    I suspect that this issue could have been averted by bind-mounting `/dev`, but I don't really understand what it means, i.e. I don't know what log it's referring to, or why it would need to access a pty in order to write to a log.
intuído
fonte
Estou aceitando minha própria resposta porque funcionou bem para mim; veja a resposta de Kees para uma solução semelhante que pode ser mais confiável em algumas situações.
intuited