Назад | Перейти на главную страницу

Как добавить один модуль в initrd с помощью mkinitrd

Я клонировал серверную систему Linux (Fedora) с диска IDE на диск SATA, но он не загружается из-за сбоя в корневом каталоге коммутатора. Я выполнил чистую установку на целевой диск и благодаря проверке файлов initrd узнал, что при установке Fedora на диск SATA он включает модуль ahci, который не использовался, когда у меня не было дисков SATA во время установки моего рабочего компьютера. система.

Поэтому я хотел бы запустить mkinitrd для создания нового initrd, такого же, как старый, но с добавлением модуля ahci (возможно, в качестве предварительной загрузки)

Я слишком много гадаю, поэтому я хотел оставить этот вопрос здесь: Какой самый простой способ собрать новый initrd из существующего, просто добавив один модуль?

Вот разница двух файлов инициализации

 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

и файл инициализации из initrd, который я хочу изменить.

#!/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

Вам не нужно беспокоиться обо всех уже установленных модулях. Для начала загрузитесь с аварийного диска.

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. 

ловкий

Вам не нужно беспокоиться обо всех модпробах перед "инициализацией драйвера"

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

ПРОСТО добавьте --preload ahci

Полезные ссылки:

В системе Debian вы редактируете / etc / initramfs-tools / modules и помещаете в файл по одному имени модуля в каждой строке. Затем вы запускаете mkinitramfs и готово.

Для Fedora просто поместите имя модуля в /etc/modprobe.conf и запустите mkinitrd. Смотрите также https://fedoraproject.org/wiki/KernelCommonProblems.

Вам нужно создать новый образ и скопировать содержимое вашего «старого» initrd в новый и добавить свой модуль:

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>

Я также нашел этот :)

Вуаля

Разве вы просто не добавляете модуль в /etc/modprobe.conf, а затем запускаете mkinitrd?