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 ROOTFS
no 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.c
a 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.