Existe uma maneira de fazer o Linux tratar um initramfs como o sistema de arquivos raiz final?

2

Eu quero inicializar um sistema com um initramfs que é o sistema de arquivos final real, não um initramf temporário para carregar drivers. Infelizmente, o Linux impõe comportamentos diferentes (e, no meu caso, indesejáveis) ao usar o initramfs, incluindo pelo menos as seguintes diferenças:

  • O devtmpfs não é montado automaticamente, pelo menos não no início, mas parece ser montado automaticamente em algum momento posterior, o que não consigo descobrir.
  • Em vez de executar /sbin/init (ou o programa init especificado por init= na linha de comando), o kernel tenta invocar /init .

Eu sei que é possível contornar isso colocando algum lixo extra no initramfs, mas eu prefiro que apenas se comporte como um root fs normal. Existe alguma maneira de conseguir isso?

Se eu precisar trabalhar com scripts de espaço de usuário no initramfs, eu pelo menos quero entender o que dispara a montagem automática do devtmpfs.

    
por R.. 10.10.2015 / 23:02

2 respostas

2

Isso é possível se CONFIG_BLOCK for indefinido, pois init/do_mounts.c contém mount_root , que é executado após o kernel não executar /init no initramfs, o seguinte:

#ifdef CONFIG_BLOCK
    {
        int err = create_dev("/dev/root", ROOT_DEV);

        if (err < 0)
            pr_emerg("Failed to create /dev/root: %d\n", err);
        mount_block_root("/dev/root", root_mountflags);
    }
#endif

Fonte: link

Nesse caso, mount_root é bem-sucedido sem ter feito nada e o kernel continua tratando o initramfs como uma raiz fs adequada.

Infelizmente, transformar CONFIG_BLOCK off não é prático para a maioria dos usos. O que me levou a acreditar que isso deveria funcionar é que, no patch para a placa de desenvolvimento específica com a qual estou trabalhando, a condição foi substituída por:

#if defined(CONFIG_BLOCK) && !defined(CONFIG_INITRAMFS_SOURCE)

Seria bom adicionar suporte para root=initramfs que faz com que mount_root retorne sem fazer nada, e isso deve ser um patch trivial de uma linha. Eu não tenho idéia se seria aceitável a montante, no entanto.

    
por 11.10.2015 / 03:08
0

Bem, isso é um pouco tarde, mas tenho uma resposta que pode ajudá-lo:

Primeiramente, você desejará incluir / dev / console em seu initramfs. Isso permitirá que você obtenha a funcionalidade sysinit reportando-se de volta ao console (as impressões do espaço do usuário aparecerão novamente na tela principal). Em seguida, se você estiver usando o busybox para o seu processo init, adicione um link sym ao busybox na raiz do seu RFS chamado init. O problema é que a camada do sistema de arquivos do kernel do Linux mudou alguns anos atrás. Originalmente, você tinha que ter o / init para iniciar o sistema. Isso foi pensado como uma falha de segurança e foi realocado para / sbin / init. Mais tarde, IIRC, isso se tornou linuxrc, mas acredito que foi removido todo agora.

No meu inittab, as duas primeiras linhas são mount proc e mount devtmpfs. Tudo parece funcionar corretamente.

    
por 13.06.2018 / 20:24