Passar o sistema de arquivos raiz por label para o kernel linux

2

Como posso inicializar o linux rootfs da partição rootfs de passagem do u-boot pelo rótulo?

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

O U-boot é exibido 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 disco rígido externo USB

Preciso que eu possa inicializar o disco rígido se eu usar a convenção de nomenclatura "classic" / 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 eu entendi fazendo pesquisas, / dev / disk / by-label é preenchido pelo udev, então ele 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 inicializar a partir do rótulo não está integrada ao kernel do Linux, como você pode ver neste arquivo do_mounts.c antes da definição da função dev_t name_to_dev_t(const char *name) .

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

Eu vejo duas soluções diferentes:

1 - Integre a funcionalidade de inicialização by-label 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;
}

em do_mounts.c e implemente 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 de seu rótulo e reinicie a inicialização do kernel com o nome do dispositivo substituído.

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

Talvez eu esteja esquecendo de 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

    
por Arkaik 22.11.2017 / 16:19

1 resposta

2

O problema é que a manipulação LABEL e UUID não é feita pelo Kernel Linux, mas é feita por meio de um initramfs, que você também deve fornecer. Se você quiser ignorar que você precisa usar o PARTUUID, que é algo que através do comando de peça, o U-Boot pode determinar para você e passar adiante.

    
por 23.11.2017 / 04:51