Como adicionar um módulo ao initrd usando mkinitrd

5

Eu clonei um sistema de servidor Linux (Fedora) de uma unidade IDE para uma unidade SATA, mas ele não inicializa, falhando na raiz do switch. Eu fiz uma instalação limpa na unidade de destino e aprendi através da inspeção dos arquivos initrd que ao instalar o fedora em uma unidade SATA inclui o módulo ahci, que não foi usado quando eu não tinha unidades SATA durante a instalação do meu trabalho sistema.

Então eu gostaria de executar o mkinitrd para construir o novo initrd, o mesmo que o antigo, mas adicionando o módulo ahci (provavelmente como um pré-carregamento)

Estou fazendo muitas adivinhações, então queria colocar essa questão aqui: Qual é a maneira mais fácil de criar um novo initrd a partir do existente, apenas adicionando um único módulo?

Aqui está o diff dos dois arquivos init

 diff /media/disk/SATA_initrd/initrd/init /media/disk/PATA_initrd/initrd/init 
50a51,52
> echo "Loading crc-t10dif module"
> modprobe -q crc-t10dif
57,60d58
< echo "Loading ahci module"
< modprobe -q ahci
< echo Waiting for driver initialization.
< stabilized --hash --interval 250 /proc/scsi/scsi
66a65,68
> echo "Loading pata_amd module"
> modprobe -q pata_amd
> echo Waiting for driver initialization.
> stabilized --hash --interval 250 /proc/scsi/scsi

e o arquivo init do initrd que eu quero modificar.

#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
echo "Loading ehci-hcd module"
modprobe -q ehci-hcd
echo "Loading ohci-hcd module"
modprobe -q ohci-hcd
echo "Loading uhci-hcd module"
modprobe -q uhci-hcd
mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading ext3 module"
modprobe -q ext3
echo "Loading crc-t10dif module"
modprobe -q crc-t10dif
echo "Loading scsi_mod module"
modprobe -q scsi_mod
echo "Loading sd_mod module"
modprobe -q sd_mod
echo "Loading libata module"
modprobe -q libata
echo "Loading ata_generic module"
modprobe -q ata_generic
echo "Loading pata_acpi module"
modprobe -q pata_acpi
echo Waiting for driver initialization.
stabilized --hash --interval 250 /proc/scsi/scsi
echo "Loading pata_amd module"
modprobe -q pata_amd
echo Waiting for driver initialization.
stabilized --hash --interval 250 /proc/scsi/scsi
echo "Loading dm-mod module"
modprobe -q dm-mod
echo "Loading dm-mirror module"
modprobe -q dm-mirror
echo "Loading dm-zero module"
modprobe -q dm-zero
echo "Loading dm-snapshot module"
modprobe -q dm-snapshot
echo Making device-mapper control node
mkdmnod
modprobe scsi_wait_scan
rmmod scsi_wait_scan
mkblkdevs
echo Scanning logical volumes
lvm vgscan --ignorelockingfailure
echo Activating logical volumes
lvm vgchange -ay --ignorelockingfailure  VolGroup00
resume /dev/VolGroup00/LogVol01
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
loadpolicy
echo Switching to new root and running init.
switchroot
echo Booting has failed.
sleep -1
    
por jbdavid 17.06.2009 / 18:50

4 respostas

5

Você não precisa se preocupar com todos os módulos já instalados. Para começar, inicie o disco de recuperação.

chroot /mnt/sysimage      # this is for Fedora specifically - YMMV
cp /boot/initrd-2.26.27.24-78.2.53-fc9.x86_64.img \
     /boot/initrd-2.26.27.24-78.2.53-fc9.x86_64.old
mkinitrd --preload ahci -f /boot/initrd-2.26.27.24-78.2.53-fc9.x86_64.img \
     2.26.27.24-78.2.53-fc9.x86_64

exit and reboot the system. 

liso

Você não precisa se preocupar com todos os modprobes antes da "inicialização do driver"

ignore  --> use the --preload *MODNAME* in the arguments to mkinitrd
ignore  --> for all the rest use --with

APENAS adicione um - ahcel de pré-carregamento

links úteis:

por 17.06.2009 / 18:59
3

Em um sistema Debian, você edita o / etc / initramfs-tools / modules e coloca um nome de módulo por linha no arquivo. Então você corre "mkinitramfs" e voila, está feito.

Para o Fedora, basta colocar o nome do módulo em /etc/modprobe.conf e executar o mkinitrd. Veja também o link .

    
por 18.06.2009 / 20:34
2

Você precisa criar uma nova imagem e copiar o conteúdo do seu initrd "antigo" para o novo e adicionar seu módulo:

dd if=/dev/zero of=~/file-inird count=2500 bs=1024 (or bigger if needed)
losetup /dev/loop0 ~/file-inird
mke2fs /dev/loop0
mkdir ~/mnt
mount /dev/loop0 ~/mnt
cp -a old_mounted_initrd/* ~/mnt/

[.. add your changes ..]

umount ~/mnt
losetup -d /dev/loop0
gzip -c ~/file-inird > initrd-<kernel-version>

Também encontrei isto :)

Voilà

    
por 17.06.2009 / 18:57
0

Você não apenas adiciona o módulo ao /etc/modprobe.conf e executa o mkinitrd?

    
por 18.06.2009 / 20:21

Tags