construindo meu próprio initrd, como preencher o diretório dev

8

Estou tentando aprender coisas sobre o initrd. Eu segui este tutorial para criar meu próprio initrd do zero, e instalei o busybox nele. Então eu fiz um .iso dele com o isolinux, então eu pude testá-lo no virtualbox. Isso funciona muito bem!

Eu tenho os comandos básicos do busybox, então eu queria montar um sistema de arquivos. Mas o diretório / dev está quase vazio (sem sda), exceto alguns arquivos que criei enquanto seguia o tutorial. Eu aprendi sobre o udev e acho que é disso que eu preciso. No entanto, não tenho certeza de como fazer isso.

Devo pegar o código-fonte mais recente do udev, compilá-lo e adicioná-lo ao meu initrd? E então chame / bin / udev ou algo parecido no meu script de inicialização? Ou há outra maneira melhor de preencher o diretório / dev?

Editar: Algumas informações adicionais e atualizações sobre o que eu já fiz.

  • Eu testo tudo na caixa virtual. Acabei de instalar o ubuntu minimal na caixa virtual, fiz um .iso do meu initrd e, em seguida, inicializei a partir do iso no virtualbox.
  • Eu usei o vmlinuz e o /lib/modules que estavam presentes em um debian-businesscard.iso e os copiei para o meu initrd que criei seguindo o tutorial que eu vinculei anteriormente.
  • O kernel tem CONFIG_DEVTMPFS=y
  • Alguns dispositivos aparecem em /dev , como tty0-tty63 e outros, mas não sda / hda.
  • Ran lspci -k no meu sistema operacional em execução e em uma caixa virtual para verificar quais módulos estão em uso. SATA Controller diz que usa ahci como módulo.
  • Quando executo modprobe -v ahci , ele reclama muito sobre "símbolo desconhecido: ata_some_stuff", mas depois disso ele retorna algo como SCSI Subsystem initialized , ATA-6: VBOX HARDDISK e Direct-Access ATA VBOX HARDDISK . No entanto, ainda não há dispositivos de disco rígido encontrados em /dev .

Meu atual script /init/ é o seguinte:

#!/bin/ash
mount -t devtmpfs none /dev
mount -t proc /proc /proc
mount -t sysfs none /sys
modprobe -v ahci
echo "Hello world"
exec /bin/ash --login

Alguém tem alguma idéia do que estou fazendo de errado e do que eu deveria estar fazendo?

    
por Carlito 23.10.2012 / 22:31

2 respostas

11

Enquanto a resposta de Gilles está correta, é old school :-). Outro item de nota (mais um palpite sobre a terminologia do que qualquer outra coisa) é que o guia ao qual você está vinculado é instruções sobre como criar um initramfs, não um initrd. Os dois são semelhantes e servem ao mesmo propósito, mas são diferentes em como a imagem é armazenada e carregada.

De qualquer forma, a resposta à sua pergunta é realmente muito simples.

  1. Ativar devtmpfs no kernel ( CONFIG_DEVTMPFS=y )
  2. Execute mount -t devtmpfs none /dev como a primeira coisa no seu script init .

É isso. Os devtmpfs preencherão /dev da mesma forma que o udev. Você nem precisa preencher previamente /dev (na imagem initramfs) com o básico, como null , zero ou console .

    
por 24.10.2012 / 05:25
3

O Udev preenche /dev automaticamente com base nos drivers que são carregados no kernel e nos dispositivos que esses drivers detectam. Os nomes dos dispositivos e suas permissões são baseados em um conjunto de regras que os administradores podem ajustar. A maioria dos sistemas Linux deve usar o udev; a exceção são sistemas (geralmente incorporados) onde a configuração de hardware é conhecida no momento em que o sistema é configurado e não será alterado posteriormente.

Você normalmente chamaria udev razoavelmente cedo na sua sequência de inicialização. Uma das poucas coisas que você deve (deve?) Fazer antes disso é montar /proc e /sys . Depois de iniciar o daemon, chame udevadm trigger --action=add; udevadm settle para fazer o udev processar todos os eventos pendentes do kernel ( trigger ) e aguarde até que os eventos sejam processados antes de continuar ( settle ). Você pode então prosseguir para localizar o dispositivo que contém o sistema de arquivos raiz.

Além do binário udevd , você precisará das outras partes de udev em seu initrd. Isso inclui arquivos de configuração em /etc/udev , a configuração básica em /lib/udev , bem como binários auxiliares, como scsi_id também em /lib/udev . Você precisa de todos os programas que são chamados das regras do udev que você inclui no initrd.

No final do initrd, antes de transferir o controle para a partição raiz real, você precisará parar udevd como qualquer outro programa do initrd. Isso não remove nenhum dispositivo de /dev . Use mount --move /dev /root/dev para mover o /dev montado para a raiz real.

O Gentoo tem um guia initramfs e um página wiki do initramfs que menciona o udev entre outras coisas. O initramfs é o sucessor moderno do initrd, usando um arquivo cpio em vez de uma imagem do sistema de arquivos e com uma interface de processo diferente (em um initrd, /linuxrc deve sair, enquanto em um initramfs, /init deve exec do init a raiz real); a maioria dos sistemas mudaram atualmente (mesmo que o arquivo ainda possa ser chamado de initrd).

    
por 24.10.2012 / 01:24

Tags