Como preencher o diretório / dev ao criar meu próprio initrd?

9

Estou tentando aprender coisas sobre o initrd. Segui este tutorial para criar meu próprio initrd do zero e instalei o busybox nele. Depois fiz um .iso com o isolinux, para 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 por alguns arquivos que eu criei enquanto seguia o tutorial. Eu aprendi sobre o udev e acho que é disso que preciso. No entanto, não tenho certeza de como proceder.

Devo apenas 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 existe uma outra / melhor maneira de preencher o diretório / dev?

Edit: 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 inicializei do iso no virtualbox.
  • Eu usei o vmlinuz e /lib/modulesestava presente em um debian-businesscard.iso e copiei-os para o meu initrd que criei seguindo o tutorial que vinculei anteriormente.
  • O kernel possui CONFIG_DEVTMPFS=y
  • Alguns dispositivos aparecem /dev, como tty0-tty63 e outros, mas não sda / hda.
  • Corri lspci -kno meu sistema operacional atualmente em execução e em uma caixa virtual para verificar quais módulos estão em uso. SATA Controllerdiz que usa ahcicomo módulo.
  • Quando executo, modprobe -v ahciele reclama muito de "símbolo desconhecido: ata_some_stuff", mas depois disso retorna algo como SCSI Subsystem initialized, ATA-6: VBOX HARDDISKe Direct-Access ATA VBOX HARDDISK. No entanto, ainda não foram encontrados dispositivos de disco rígido /dev.

Meu /init/script atual é 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 devo fazer?

Carlito
fonte

Respostas:

12

Embora a resposta de gilles esteja correta, é a velha escola :-). Outro item de nota (mais um detalhe 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 têm o mesmo objetivo, mas são diferentes na maneira como a imagem é armazenada e carregada.

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

  1. Ativar devtmpfsno kernel ( CONFIG_DEVTMPFS=y)
  2. Execute mount -t devtmpfs none /devcomo a primeira coisa em seu initscript.

É isso aí. O devtmpfs será preenchido /devexatamente como o udev. Você nem precisa preencher previamente /dev(na imagem initramfs) o básico null, como zero, ou console.

Patrick
fonte
Obrigado por seu comentário. Executei seu comando e agora tenho mais dispositivos, mas ainda não tenho sda ou hda para montar. Esqueci de fazer algo? Eu uso o kernel vmlinuz que obtive do debians live system, devo realmente compilar o meu?
Carlito
@Carlito Este kernel tem o devtmpfs ativado (verifique o arquivo de configuração)? O Debian recentemente mudou para o devtmpfs.
Gilles 'SO- stop be evil'
@ Gilles Não há um arquivo de configuração fornecido, mas carreguei o kernel que obtive do debian, dizia o arquivo de configuração CONFIG_DEVTMPFS=y, mas ainda não recebi nenhum dispositivo sda. Eu acho que isso é porque eu não carreguei nenhum módulo (lsmod não retorna nada). Quais módulos devo carregar para obter os dispositivos do sistema de arquivos? Ou há algo mais que eu esqueci?
Carlito #
@ Carlito sim, se você tem outras coisas aparecendo /dev, não apenas as unidades, o devtmpfs está funcionando e você provavelmente está perdendo o módulo do controlador de disco (como adivinhou). Infelizmente, a única maneira de saber qual driver / módulo você precisa é ler as informações de cada um na configuração do kernel ou executar lspci -kem um sistema linux em execução (que mostrará qual driver do kernel os vários componentes do seu sistema estão usando) .
24412 Patrick
11
@ CiroSantilli709 大 大 六四 事件 法轮功CONFIG_DEVTMPFS_MOUNT=ynão tem nenhum efeito no initramfs. Do texto do kernel ajuda: "Esta opção não afeta initramfs inicialização baseada, aqui os devtmpfs sistema de arquivos sempre precisa ser montado manualmente após os rootfs é montado"
Patrick
4

O Udev é preenchido /devautomaticamente com base nos drivers 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 os sistemas (geralmente incorporados) em que a configuração do hardware é conhecida no momento em que o sistema é configurado e não muda depois.

Você normalmente ligaria udevbastante cedo na sequência de inicialização. Uma das poucas coisas que você deve (deve?) Fazer antes disso é montar /proce /sys. Após iniciar o daemon, chame udevadm trigger --action=add; udevadm settlepara 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 localizar o dispositivo que contém o sistema de arquivos raiz.

Além do udevdbinário, você precisará das outras partes do udevinitrd. Isso inclui arquivos de configuração /etc/udev, a configuração básica /lib/udeve binários auxiliares, como scsi_idtambém /lib/udev. Você precisa de todos os programas chamados pelas 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 udevdcomo qualquer outro programa do initrd. Isso não remove nenhum dispositivo de /dev. Use mount --move /dev /root/devpara mover o montado /devpara a raiz real.

O Gentoo possui um guia initramfs e uma página wiki initramfs que mencionam o udev entre outras coisas. Initramfs é o sucessor moderno para initrd, usando um arquivo cpio em vez de uma imagem de sistema de arquivos, e com uma diferente interface de processo (em uma initrd, /linuxrcsaída deve, enquanto em um initramfs, /initdeve execinit a partir da raiz real); a maioria dos sistemas mudou hoje em dia (mesmo que o arquivo ainda possa ser chamado de initrd).

Gilles 'SO- parar de ser mau'
fonte
Obrigado pela sua resposta. Cheguei à conclusão de que realmente criei um initramfs em vez de um initrd. Mas eu uso o kernel vmlinuz que obtive do sistema debians live, devo compilar meu próprio kernel para isso (para saber quais módulos existem para carregar discos rígidos) ou existe uma versão mínima que eu poderia usar com os módulos básicos ? Provavelmente baixarei o udev mais recente e tentarei compilar e executá-lo.
Carlito
@Carlito Eu recomendo primeiro tentar com o kernel do Debian, pois esquecer um driver necessário é um erro comum ao compilar seu próprio kernel.
Gilles 'SO- stop be evil'
Mas como eu conseguiria um? Acabei de copiar o vmlinuz que encontrei no debian-businesscard.iso (provavelmente não é a melhor ideia). Devo apenas copiar o kernel padrão que obtive do ubuntu ou debian e todo o diretório / lib / modules?
Carlito #
@Carlito Você precisará de pelo menos todos os módulos necessários para o seu hardware. Pode ser difícil encontrar tudo o que você precisa navegando na lista. A melhor maneira de descobrir o que você precisa é executar lsmodem um sistema em funcionamento. Portanto, comece com todos eles e, se necessário, economize espaço.
Gilles 'SO- stop be evil'