Como carregar um módulo no initrd?


13

Quero carregar explicitamente um módulo (digamos netconsole) durante o estágio initrd, da mesma forma que /etc/modulesno procedimento principal de inicialização do sistema.

Primeiro, verifiquei se o initrd no meu sistema já contém o módulo desejado (consulte o Apêndice).

Eu examinei /initrd.img(que é um arquivo cpio compactado, para dar uma rápida olhada nele, eu fiz zcat /initrd.img > initrd.cpioe entrei nele mc). Procurei por invocações modprobedentre os scripts e descobri que os módulos listados em /conf/modules( /é a raiz do initrd aqui) são carregados automaticamente pela load_modules()função de /scripts/functions(chamada por /init).

Mas qual seria a ferramenta padrão no sistema Ubuntu para atualizar /conf/moduleso initrd?

(BTW, durante meu estudo do código do initrd do Ubuntu, notei que há algum suporte especial netconsoleno /initscript, que eu poderia fazer para atender às minhas necessidades, mas, de qualquer forma, minha pergunta é mais geral sobre qualquer outro módulo personalizado .)

Apêndice

Como eu disse acima: primeiro, verifiquei se o initrd no meu sistema já contém o módulo desejado (ou seja, netconsole). É assim:

# zcat /initrd.img | cpio --extract --verbose --list  | fgrep netconsole
-rw-r--r--   1 root     root        25372 Aug 31 20:59 lib/modules/3.19.0-28-generic/kernel/drivers/net/netconsole.ko
109504 blocks
# 

E também verifiquei que ele já contém o driver de rede necessário:

# ls -ld /sys/class/net/eth0/device/driver
lrwxrwxrwx 1 root root 0 Sep 21 15:34 /sys/class/net/eth0/device/driver -> ../../../../bus/pci/drivers/sky2
# zcat /initrd.img | cpio --extract --verbose --list  | fgrep sky2
-rw-r--r--   1 root     root        92948 Aug 31 20:49 lib/modules/3.19.0-28-generic/kernel/drivers/net/ethernet/marvell/sky2.ko
109504 blocks
# 

3
Para referência futura, lsinitramfsincluído em initramfs-toolsfaz o mesmo que o zcat /initrd.img ..comando ilustrado aqui.
TIMMS

Respostas:


14

Eu descobri como adicionar módulos ao initrd no Ubuntu 14.04. Adicionei os nomes dos módulos em / etc / initramfs-tools / modules. Isso adicionou os módulos ao arquivo initrd. Não esqueça de atualizar o arquivo initrd (update-initramfs -u) depois de fazer alterações em / etc / initramfs-tools / modules.


Como você define os nomes dos módulos? Agora eu preciso adicionar o módulo ahci.ko? Então, o que deve ser incluído nesse arquivo?
sandun dhammika 4/16

@sandundhammikaahci
Ken Sharp

3

O Ubuntu usa o initramfs-tools (veja man initramfs-tools para uma introdução) para lidar com a criação do initrd.

Para adicionar um módulo netconsole no initrd e forçar o carregamento, crie um arquivo em / etc / initramfs-tools / hooks (por exemplo, / etc / initramfs-tools / hooks / netconsole) com o conteúdo:

#! / bin / sh
PREREQ = ""
prereqs ()
{
   eco "$ PREREQ"
}

caso $ 1 em
prereqs)
   prereqs
   saída 0
   ;;
esac

. / usr / share / initramfs-tools / hook-functions

force_load netconsole

e torná-lo executável. Então corra:

update-initramfs -u

para atualizar o initrd do kernel mais recente.


1
Mas não existe uma maneira mais simples de acrescentar o nome do módulo /conf/modules? Onde devo colocá-lo update-initramfs -upara usá-lo?
IMZ - Ivan Zakharyaschev
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.