Instalando o ubuntu + grub personalizado em uma unidade inicializável secundária

0

Estou usando o debootstrap para criar uma distro baseada em Xenial que pode ser gravada em uma unidade de boot secundária a partir de uma máquina host. (O destino é um Intel NUC.) Quando coloco a unidade no PC alvo e ligo, a EFI reconhece a unidade inicializável, mas não consegue inicializá-la (ela retorna imediatamente ao menu de inicialização EFI.)

Então eu não acredito que estou realmente chegando ao lançamento do grub. Eu estou supondo que este é um problema de instalação / configuração do grub.

Parte relevante do meu script:

local DISK=$1 # e.g. /dev/sdc
local EFI_PARTITION=${DISK}1
local ROOT_PARTITION=${DISK}2
local ROOT_MOUNT=$(mktemp -d)

# create partitions and format
parted -s --align=minimal $DISK \
       mklabel gpt \
       mkpart ESP fat32 0% 513MiB \
       mkpart primary ext4 513MiB 100% \
       set 1 boot on
partprobe $DISK
sleep 1
mkfs.fat -F32 $EFI_PARTITION
mkfs.ext4 $ROOT_PARTITION

# copy rootfs
mount $ROOT_PARTITION $ROOT_MOUNT
rsync -a $CHROOT_DIR/ $ROOT_MOUNT

# enter chroot and install grub
for dir in /dev /proc /sys /run; do
  mount --bind $dir $ROOT_MOUNT/$dir
done
mkdir $ROOT_MOUNT/boot/efi
mount $EFI_PARTITION $ROOT_MOUNT/boot/efi

chroot $ROOT_MOUNT <<EOF
/usr/sbin/grub-install --bootloader-id=ubuntu ${DISK}
/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
EOF

# generate fstab and additional customizations

# sync, unmount eject

Eu faço ver o UUID da partição correta no grub.cfg resultante.

Aqui estão os detalhes da minha partição:

$ sudo parted /dev/sdb print
Model: ASMT 2115 (scsi)
Disk /dev/sdb: 64.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system  Name     Flags
 1      17.4kB  538MB   538MB   fat32        ESP      boot, esp
 2      538MB   64.0GB  63.5GB  ext4         primary

Depois de adicionar shim-singed ao meu debootsrap, aqui está o que eu vejo em /boot/efi :

$ sudo tree efi
efi
└── EFI
    └── ubuntu
        ├── grub.cfg
        ├── grubx64.efi
        ├── MokManager.efi
        └── shimx64.efi

Depois de renomear EFI/ubuntu para EFI/BOOT e shimx64.efi para bootx64.efi , posso inicializar a partir da unidade! No entanto, recebo um prompt grub ... Adivinhando que estou com problemas de configuração agora.

Estou usando esses documentos como minhas principais fontes:

Para ser claro, estou tentando instalar um kernel / rootfs / bootloader do Linux em uma unidade conectada a uma máquina host . Essa unidade inicializável é então colocada em uma máquina target e inicializada. Este não é um cenário de inicialização dupla.

Preciso fazer algo com efibootmgr no alvo?

    
por thom_nic 05.10.2017 / 19:20

1 resposta

1

Suspeito que o problema seja um dos nomes do carregador de boot. Sob o EFI, um computador pode inicializar de várias maneiras:

  • A partir de um disco rígido - Em uma instalação normal do SO, o carregador de boot reside na partição do sistema EFI do disco rígido (ESP), que é uma partição FAT32 com um código de tipo específico (C12A7328-F81F-11D2-BA4B-00A0C93EC93B; EF00 em gdisk ; "sinalizador de inicialização" e "esp flag" definidos em parted , GParted, ou ferramentas relacionadas). O gerenciador de inicialização pode ser chamado de qualquer coisa, mas é convencionalmente colocado em um subdiretório de EFI com o nome do SO ou do carregador de inicialização. Para o Ubuntu, é EFI/ubuntu/shimx64.efi , embora este seja realmente um programa shim que chame o GRUB em EFI/ubuntu/grubx64.efi , e o GRUB pode ser configurado para iniciar diretamente se a Inicialização Segura estiver desativada. O computador sabe qual programa iniciar porque essa informação é armazenada na NVRAM.
  • A partir de um disco removível - Em um disco removível, incluindo um instalador do sistema operacional ou qualquer coisa que você queira mover de um computador para outro (como no seu caso), as regras são semelhantes a uma instalação do disco rígido; no entanto, como a NVRAM não pode ser usada para armazenar as informações do carregador de boot, o carregador de boot é armazenado usando um nome de arquivo padronizado, que é EFI/BOOT/bootx64.efi para computadores x86-64 / AMD64 / X64. Isso geralmente é chamado de nome de arquivo de fallback. Você colocaria Shim nesse nome de arquivo e manteria o GRUB com o nome grubx64.efi , mas no diretório EFI/BOOT .
  • De diversas outras formas - Existem outros métodos de inicialização, como inicialização de uma rede ou no modo BIOS / CSM / legado. Estes não são relevantes para sua pergunta.

O instalador do Ubuntu foi projetado para instalar em um disco rígido. Se você deseja instalar em um disco removível, deve mover / renomear os arquivos do carregador de inicialização após a instalação ou instalar o GRUB (ou outro carregador de inicialização) manualmente. Você pode fazer isso renomeando EFI/ubuntu para EFI/BOOT e, em seguida, renomeando shimx64.efi dentro desse diretório para bootx64.efi ou copiando os arquivos para obter um efeito semelhante. Como alternativa, você pode instalar outro gerenciador de inicialização por completo, embora seja provável que seja uma proposta mais entediante, e isso pode criar complicações, principalmente se você quiser inicializar em computadores com inicialização segura ativada.

    
por Rod Smith 06.10.2017 / 16:26