Como posso inicializar o Linux rootfs 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 a placa.
O U-boot é exibido na primeira partição do cartão SD com o kernel Linux e a árvore de dispositivos. Estou tentando inicializar o sistema de arquivos raiz em um disco rígido USB externo
Eu preciso que posso inicializar o HDD se eu usar a convenção de nomenclatura "clássica" /dev/sdxn.
Eu 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 para inicializar a partir do rótulo não está integrada ao kernel do linux, como você pode ver neste arquivo do_mounts.c logo antes da dev_t name_to_dev_t(const char *name)
definição da função.
Portanto, a partir de agora, gostaria de encontrar uma maneira de inicializar a partição rotulada como ROOTFS
no disco rígido USB externo.
Eu vejo duas soluções diferentes lá:
1 - Integre a funcionalidade de inicialização por rótulo no kernel do Linux adicionando algo como
if (strncmp(name, "LABEL=", 6) == 0) {
name += 6;
res = devt_from_label(name);
if (!res)
goto fail;
goto done;
}
e implemente a do_mounts.c
função devt_from_label
.
2 - Use um pequeno rootfs na segunda partição do cartão SD para resolver o nome do dispositivo 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
O problema é que a manipulação de LABEL e UUID não é feita pelo Kernel do Linux, mas por meio de um initramfs, que você também precisa fornecer. Se você quiser contornar isso, você precisa usar PARTUUID, que é algo que, por meio do comando part, o U-Boot pode determinar para você e repassar.