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/modules
estava 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 -k
no meu sistema operacional atualmente em execução e em uma caixa virtual para verificar quais módulos estão em uso.SATA Controller
diz que usaahci
como módulo. - Quando executo,
modprobe -v ahci
ele reclama muito de "símbolo desconhecido: ata_some_stuff", mas depois disso retorna algo comoSCSI Subsystem initialized
,ATA-6: VBOX HARDDISK
eDirect-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?
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?/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 executarlspci -k
em um sistema linux em execução (que mostrará qual driver do kernel os vários componentes do seu sistema estão usando) .CONFIG_DEVTMPFS_MOUNT=y
nã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"O Udev é preenchido
/dev
automaticamente 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
udev
bastante cedo na sequência de inicialização. Uma das poucas coisas que você deve (deve?) Fazer antes disso é montar/proc
e/sys
. Após iniciar o daemon, chameudevadm 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 localizar o dispositivo que contém o sistema de arquivos raiz.Além do
udevd
binário, você precisará das outras partes doudev
initrd. Isso inclui arquivos de configuração/etc/udev
, a configuração básica/lib/udev
e binários auxiliares, comoscsi_id
també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
udevd
como qualquer outro programa do initrd. Isso não remove nenhum dispositivo de/dev
. Usemount --move /dev /root/dev
para mover o montado/dev
para 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,
/linuxrc
saída deve, enquanto em um initramfs,/init
deveexec
init a partir da raiz real); a maioria dos sistemas mudou hoje em dia (mesmo que o arquivo ainda possa ser chamado de initrd).fonte
lsmod
em um sistema em funcionamento. Portanto, comece com todos eles e, se necessário, economize espaço.