O kernel exclui entradas em / dev em um initramfs?

6

Eu tenho um sistema Linux (vanilla, 3.3.8, i486, Vortex86dx) totalmente customizado e mínimo, que inicializa a partir de uma imagem initramfs. Nenhum script de distribuição padrão é usado, apenas um único arquivo rcS que faz a inicialização.

Eu tenho um disco flash IDE com duas partições em / dev / hda1 e / dev / hda2.

Como esta é uma distribuição embutida mínima para um sistema fixo, ela possui um diretório estático / dev que contém / dev / hda1 e / dev / hda2, e não há nenhum UDEV.

No ponto em que o init chama o rcS, a entrada / dev / hda1 não está mais presente. Nenhum outro script, aplicativo de usuário ou daemons foi executado neste momento. / dev / hda1 aparece para ter sido deletado pelo kernel (?)

Eu não tenho este mesmo problema se eu inicializar meu alvo através de um sistema de arquivamento raiz NFS durante meu processo de desenvolvimento.

Eu uso o Buildroot para criar o diretório / dev através do arquivo device_table_dev.txt. por exemplo.

# IDE Devices
/dev/hda    b   640 0   0   3   0   0   0   -
/dev/hda    b   640 0   0   3   1   1   1   4

Eu inspecionei o rootfs.tar.gz da saída / imagens do Buildroot. O diretório / dev contém / dev / hda1:

brw-r-----  1 root root  3,   0 Jul  2 13:44 hda
brw-r-----  1 root root  3,   1 Jul  2 13:44 hda1
brw-r-----  1 root root  3,   2 Jul  2 13:44 hda2
brw-r-----  1 root root  3,   3 Jul  2 13:44 hda3
brw-r-----  1 root root  3,   4 Jul  2 13:44 hda4

Minha listagem de diretórios pós-inicialização (feita de dentro do rcS, na parte superior do script) no destino se parece com isso:

brw-r-----   1 root   root    3,   0 Jul  2 12:44 hda
brw-r-----   1 root   root    3,   2 Jul  2 12:44 hda2
brw-r-----   1 root   root    3,   3 Jul  2 12:44 hda3
brw-r-----   1 root   root    3,   4 Jul  2 12:44 hda4

/ dev / hda1 está faltando. / dev / hda2 é uma partição no mesmo disco, mas ainda está lá. Estranho.

Se eu executar o utilitário Busybox "mdev -s", ele restaurará / dev / hda1 no destino e funcionará normalmente. por exemplo. Eu posso montá-lo

Alguém já viu esse comportamento antes?

O kernel exclui entradas de / dev?

    
por Mr Stinky 03.07.2012 / 09:45

1 resposta

1

O subsistema udev cria e monta um sistema de arquivos tmpfs em /dev no momento da inicialização. O conteúdo é preenchido pelo kernel conforme os dispositivos são detectados. Como tmpfs reside na memória virtual, não é persistente, portanto, suas alterações não sobrevivem durante as reinicializações. Mesmo que você já tenha um /dev , a montagem do novo sistema de arquivos oculta o diretório e parece que todos os seus dispositivos especiais foram excluídos. Eles não têm, mas o resultado final é o mesmo: os especiais não estão onde você espera.

Suspeito que você descobrirá que as entradas hda e hdaX foram substituídas pelas entradas sda e sdaX . Como alternativa, confira /proc/devices e /proc/partitions para obter o nome udev atribuído à unidade.

Às vezes, um rápido & solução suja como fdisk -l /dev/[sh]d[a-z] pode ajudar (funciona melhor se você tiver menos de 26 discos de cada tipo).

A propósito, o esquema de nomenclatura usado por udev é padronizado, e seu /dev estático pode ser pior do que seguir as convenções. Se udev achar que é /dev/sda , vá com isso. Você pode escapar a potenciais estranhezas e mal-entendidos na estrada.

    
por 03.07.2012 / 13:54