Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Como posso inicializar o rootfs do Linux a partir do u-boot passando a partição rootfs por rótulo?

Estou usando o u-boot como bootloader e a placa é uma RedPitaya. O linux é um Linux customizado baseado na imagem estável do Ubuntu disponível para o cartão.

O U-boot é atualizado na primeira partição do cartão SD com o kernel do Linux e a árvore de dispositivos. Estou tentando inicializar o sistema de arquivos raiz em um HDD USB externo

Preciso que posso inicializar o HDD se usar a convenção de nomenclatura "clássica" /dev/sdxn.


Já tentei com os seguintes parâmetros, mas ambos falharam:

console=ttyPS0,115200 root=/dev/disk/by-label/ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1

console=ttyPS0,115200 root=LABEL=ROOTFS rw rootfstype=ext4 earlyprintk rootwait isolcpus=1

Pelo que entendi fazendo pesquisas, /dev/disk/by-label é preenchido pelo udev, portanto não está disponível no u-boot ao passar os argumentos de inicialização para o kernel do Linux.

Também descobri que a funcionalidade de inicialização a partir do rótulo não está integrada ao kernel do Linux, como você pode ver neste arquivodo_mounts.cpouco antes dev_t name_to_dev_t(const char *name)da definição da função.

Então, a partir de agora, eu gostaria de encontrar uma maneira de inicializar a partição rotulada como ROOTFSno HDD USB externo.


Vejo duas soluções diferentes lá:

1 - Integre a funcionalidade de inicialização por rótulo no kernel Linux adicionando algo como

if (strncmp(name, "LABEL=", 6) == 0) {
        name += 6;
        res = devt_from_label(name);
        if (!res)
            goto fail;
        goto done;
}

e implementar do_mounts.ca função devt_from_label.

2 - Use um pequeno rootfs na segunda partição do cartão SD para resolver o nome do dispositivo a partir de seu rótulo e reinicie a inicialização do kernel com o nome do dispositivo substituído.

O que você acha disso ? Qual seria o "mais simples" de implementar?

Talvez eu esteja esquecendo algo importante ou alguém já tenha conseguido fazer a mesma coisa.

De qualquer forma, eu ficaria feliz em ter alguma ajuda para alcançá-lo

Responder1

O problema é que o tratamento de LABEL e UUID não é feito pelo Kernel do Linux, mas por meio de um initramfs, que você também precisaria fornecer. Se você quiser ignorar isso, você precisa usar PARTUUID, que é algo que através do comando part, o U-Boot pode determinar para você e repassar.

informação relacionada