如何使用 mkinitrd 向 initrd 添加一个模块

如何使用 mkinitrd 向 initrd 添加一个模块

我已经将 Linux (Fedora) 服务器系统从 IDE 驱动器克隆到 SATA 驱动器,但它无法启动,切换根目录时失败。我在目标驱动器上进行了全新安装,并通过检查 initrd 文件了解到,在 SATA 驱动器上安装 Fedora 时,它包含 ahci 模块,而当我在安装工作系统时没有 SATA 驱动器时,不会使用该模块。

所以我想运行 mkinitrd 来构建新的 initrd,与旧的相同,但添加 ahci 模块(可能是作为预加载)

我猜测太多了,所以我想在这里提出这个问题: 从现有的 initrd 构建新的 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 中的 init 文件。

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

答案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. 

光滑的

你不必担心“驱动程序初始化”之前的所有 modprobe

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

只需添加 --preload ahci

有用的网址:

答案2

在 Debian 系统上,编辑 /etc/initramfs-tools/modules,将一个模块名称每行放入文件中。然后运行“mkinitramfs”,就大功告成了。

对于 Fedora,只需将模块名称放入 /etc/modprobe.conf 并运行 mkinitrd。另请参阅https://fedoraproject.org/wiki/KernelCommonProblems

答案3

您需要创建一个新的映像并将“旧” 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>

我还发现:)

瞧!

答案4

您不只是将模块添加到 /etc/modprobe.conf 然后运行 ​​mkinitrd 吗?

相关内容