Grub2 + Loopback + LVM

0

Eu desejo inicializar meu sistema a partir de uma partição LVM hospedada por um arquivo de loopback, onde a inicialização está em uma unidade USB.

Usando uma configuração não LVM, com um arquivo de loopback ext4, ele inicia com não problemas (são guias de servidor na rede), mas eu preciso de mais ... Eu preciso de LVM!

O layout das minhas partições é:

  • drive USB (MBR): Grub 2
  • drive USB (hd0, msdos1): ext4 512Mb / boot
  • Disco interno do notebook: hospeda o arquivo .linux-loops / system0.lvm em que instalei o sistema operacional e o mapeei como / dev / mapper / vg_system-lv_root .

Aqui está a entrada do meu menu do Grub 2:

set BOOT_PART=(hd0,msdos1)
set HOST_PART=(hd1,gpt5)
set LOOP_FILE=.linux-loops/system0.lvm
set LOOP_DEV=loop0
set LVM_VG=vg_system
set LVM_LV=lv_root
set ROOT_DEV=/dev/mapper/${LVM_VG}-${LVM_LV}

menuentry 'Loopback / 4.10.0-38-generic' --class ubuntu --class gnu-linux --class gnu --class os {
    echo "Initializing environment..."

    set KERN_VER=4.10.0-38-generic

    recordfail  load_video  gfxmode $linux_gfx_mode

    echo "Loading partition drivers..."

    insmod ext2
    insmod gzio
    insmod part_msdos
    insmod part_gpt

    echo Loopback(s) setup...

    loopback ${LOOP_DEV} ${HOST_PART}/${LOOP_FILE}
    insmod lvm

    echo Debug LVM...
    ls
    ls (lvm/${LVM_VG}/${LVM_LV)/

    echo "Loading kernel..."

    set root=${BOOT_PART}

    linux   /vmlinuz-${KERN_VER} root=${ROOT_DEV} rw verbose nosplash debug
    initrd /initrd.img-${KERN_VER}

}

Os dois comandos debug ls mostram que a partição LVM foi vista pelo grub, mas durante initrd sendo executado, o sistema me mostra que o grupo vg_system não foi encontrado e lvmetad ainda não está em execução.

Eu acho que a configuração de loopback dentro do script grub não pode ser propagada para o script init, então ele não pode inicializar novamente o mapeador LVM.

No cenário não LVM (mencionado acima), o vmlinuz ... loop = ... resolve o problema.

A questão é: como configurar os arquivos de loopback para que eles estejam disponíveis para o mapeador LVM pelo grub?

Muito obrigado!

    
por Antonio Petricca 09.03.2018 / 14:41

2 respostas

0

Eu postei minha solução no GitHub:

Este guia lhe dará instruções detalhadas sobre como instalar o Linux em uma inicialização de disco de loopback LVM de uma unidade USB (grub e partição de inicialização) sem ter que alterar o setor de inicialização do disco interno do PC.

A parte relevante foi implementada pelo link script:

!/bin/sh -e

Antonio Petricca - 17/03/2018

PREREQS=""

Output pre-requisites

prereqs() { echo "$PREREQ" }

case "$1" in prereqs) prereqs exit 0 ;; esac

. /scripts/functions

MNT=/host ROOT_MNT=${rootmnt}${MNT}

_log_msg "Moving LVM loops host device mount point from \"${MNT}\" to \"${ROOT_MNT}\"...\n"

mount -o remount,rw ${rootmnt} || panic "Cannot remount \"${rootmnt}\" R/W."

[ -d ${ROOT_MNT} ] || mkdir -p ${ROOT_MNT} || panic "Cannot create \"${ROOT_MNT}\" mount point."

mount -n -o move ${MNT} ${ROOT_MNT} || panic "Cannot move \"${MNT}\" to \"${ROOT_MNT}\"."

log_end_msg "Done"

    
por 20.03.2018 / 07:58
1

Seu raciocínio está correto: o GRUB não pode fazer a configuração em nome do kernel.

O GRUB depende do firmware do sistema (BIOS ou UEFI) para acesso ao disco, então qualquer coisa que ele faz é baseada nessas rotinas de firmware. E assim que o kernel assume, essas rotinas de firmware não são mais usadas ... e qualquer coisa que seja construída sobre elas também se torna inutilizável, até que o sistema operacional forneça seus próprios drivers para o mesmo trabalho.

(No caso do BIOS, as rotinas de acesso a disco do BIOS de 16 bits ficam inutilizáveis conforme o kernel transiciona o processador para o modo 32/64-bit. No caso do UEFI, acho que os serviços de acesso ao disco são um dos Recursos do UEFI que se tornam inutilizáveis à medida que a chamada UEFI padrão de "serviços de inicialização de término" é executada, concluindo o lado UEFI da transferência do controle de hardware para o SO.

Em vez disso, você precisará configurar um script para ser executado dentro do initrd em uma fase inicial: ele deve ativar o dispositivo de loopback necessário antes do LVM ser iniciado ou, alternativamente, executar um vgscan --mknodes e / ou vgchange -ay <name of the VG containing the root filesystem> depois de configurar o dispositivo de loop se o LVM já estiver inicializado.

Sem saber o nome e a versão da distribuição do Linux que você está usando, é difícil dar mais conselhos específicos.

    
por 09.03.2018 / 16:39

Tags