标签: initrd

构建我自己的 initrd 时如何填充 /dev 目录?

我正在尝试学习有关 initrd 的东西。我按照本教程从头开始构建自己的 initrd,并在其上安装了 busybox。然后我用isolinux从它制作了一个.iso,所以我可以在virtualbox中测试它。它工作得很好!

我有来自 busybox 的基本命令,所以我想挂载一个文件系统。但是 /dev 目录几乎是空的(没有 sda),除了我在学习教程时创建的一些文件。我了解了 udev,我认为这就是我所需要的。但是我不知道该怎么做。

我应该从 udev 获取最新的源代码,编译它并将其添加到我的 initrd 中吗?然后在我的初始化脚本中调用 /bin/udev 或类似的东西?或者是否有其他/更好的方法来填充 /dev 目录?

编辑:关于我已经完成的工作的一些附加信息和更新。

  • 我在虚拟框中测试了所有内容。我刚刚在 virtual box 中安装了 ubuntu minimum,从我的 initrd 制作了一个 .iso,然后从 virtualbox 中的 iso 启动。
  • 我使用了 vmlinuz 并且/lib/modules存在于 debian-businesscard.iso 中,并将它们复制到我按照我之前链接的教程创建的 initrd 中。
  • 内核有 CONFIG_DEVTMPFS=y
  • 某些设备出现在 中/dev,例如 tty0-tty63 和其他一些设备,但没有 sda/hda。
  • lspci -k在我当前正在运行的操作系统和虚拟框来检查哪些模块使用。SATA Controller说它ahci用作模块。
  • 当我执行modprobe -v ahci它时,它会抱怨很多“未知符号:ata_some_stuff”,但之后它返回类似SCSI Subsystem initialized,ATA-6: VBOX HARDDISKDirect-Access ATA …

udev initrd

9
推荐指数
2
解决办法
1万
查看次数

8
推荐指数
1
解决办法
1万
查看次数

Ubuntu:如何在启动时组装 md 设备?

如何md在 Ubuntu 启动时组装设备?是/etc/mdadm/mdadm.conf名副其实的相关因素,在这里?

mdadm.conf的声音很好,我在救援 CD 环境中检查了这一点。运行时,mdadm -A --scan它会根据需要查找并分配设备名称。该mdadm.conf包含AUTO -all从组装阵列采取了所有自动性。

我需要做的是能够在启动时自动组装md设备,mdadm.conf或者在组装时super-minor按照 0.9 数组的值和1.2 数组的name(显然<hostname>:<super-minor>)值自动组装设备,并且在没有mdadm.conf. 我错过了什么拼图?


我有以下问题。有两种md设备带有 RAID1(md0md1),一种设备带有 RAID6(md2)。我指的是所需的设备名称。md0元数据版本为 0.9,另外两个版本为 1.2。md0映射到/和其他两个与引导无关。

引导驱动器是 GPT 分区的。上面有一个胶水“BIOS 启动分区”( sda1)。grub-install --no-floppy /dev/sda报告成功。

  • md0 == sda3 + sdb3
  • md1 == sda2 + …

linux ubuntu mdadm initrd grub2

8
推荐指数
1
解决办法
3万
查看次数

使用 LUKS 更新内核后,Ubuntu 21.04 挂在“正在加载初始 ramdisk”

我已经从全新安装中复制了两次 - 设置最初工作正常,但是当应用内核更新时,系统在重新启动时挂起。选择 GRUB 提供的旧内核效果很好。

系统详细信息:

  • XPS 13 9380
  • i5-8265U
  • BIOS 版本 1.15.0
  • 微代码版本报告为“0xea”。apt list 的输出 --installed | grep 微码:intel-microcode/hirsute-updates,hirsute-security,现在 3.20210608.0ubuntu0.21.04.1 amd64 [已安装,自动]
  • 我认为安全启动设置为审核模式。
  • Ubuntu 毛毛(如上所述)
  • 从 LiveUSB 安装在 LUKS 分区上
  • 目前使用的是 5.11.0-37-generic,但我也使用较旧的 5.11 内核进行了复制。绝对似乎是内核版本的变化而不是版本本身。5.11.0-36-generic 启动,不需要异常的 GRUB 选项。

我尝试过的 GRUB 设置肯定不起作用

  • dis_ucode_ldr 和 Mitigations=off (一起或单独);
  • 无模式集
  • 消除安静的飞溅
  • 恢复
  • 调试(输出没有变化)
  • “initrd /initrd.img-5.11.0-37-generic”行后的任何形式的 echo

及其所有排列。

initrd.img 和 initrd.img.old(我可以启动)文件的 lsinitramfs 不会弹出任何明显的候选者。

它似乎可能与微代码或 cryptsetup 相关,但由于调试没有提供任何信息,并且一旦我用 36 启动,dmesg 可能会报告正常启动,所以我有点不知所措。

有什么想法吗?似乎存在相关的错误,但没有完全重现。

ubuntu initrd linux-kernel luks ramdisk

8
推荐指数
1
解决办法
1万
查看次数

消除 initrd 中 X11 库的包含

我在 TS412 (QNAP) 上运行 Debian Bookworm;它将内核和 initrd 存储在闪存中。它总共有 16MB 闪存。因此,即使在调整 MD 分区之后,我能得到的最好的也是 12MB initrd 。我正在使用 xz 压缩。但即便如此,最初的 initrd 也有 12.5MB。我知道常见的解决方法是减少模块,但它们不是真正的问题。

2984    .../usr/lib/modules
6036    .../usr/share
18824   .../usr/lib/arm-linux-gnueabi
Run Code Online (Sandbox Code Playgroud)

在arm-linux-gnueabi中查看它有像libX11这样的东西...这台机器甚至没有控制台(即使获得串行线也很困难)它当然不需要“X”。

因此,我完全删除了很多软件包(apt-get remove ...),实际上比我应该删除的要多。但结果是一个小得多的 initrd(大约 5MB IIRC),它启动和运行得很好。

问题是,如果我 ssh 到盒子上并运行 emacs(1) ,那么将 GUI 版本投影回我的普通桌面(有大量内存和大显示器等)会很好,但这需要安装TS412 上的 X 客户端库。

现在我不明白为什么仅仅因为我安装了带有 X 客户端库的软件包,就需要在 initrd 上保留一个副本,而在启动过程中不需要它们。有没有办法限制其他东西进入 initrd,而不仅仅是模块(这不是罪魁祸首)

我已经尝试过在文档中搜索限制 initrd 的指南。

debian initrd qnap

8
推荐指数
1
解决办法
703
查看次数

将 Apache 添加到 Ubuntu 的启动

目前正在学习Linux环境,决定手动安装Apache服务器。出于教育目的,我已将其编译为:

/server/apache
Run Code Online (Sandbox Code Playgroud)

http.conf位置被正确配置。它有效 - 我可以打开浏览器并导航到localhost并查看“它有效”消息。但是如何将 Apache 添加到 Ubuntu 的启动中,这样我就不必这样做了:

sudo /server/apache/bin/apachectl start
Run Code Online (Sandbox Code Playgroud)

每时每刻?有人可以解释如何将程序添加到 Ubuntu 启动(10.10 64 位)?

ubuntu initrd

7
推荐指数
2
解决办法
7706
查看次数

从 vmlinux.bin(嵌入式 initramfs)重新打包文件系统映像而不重建?

如何从 vmlinux.bin 中提取文件系统映像?https://wiki.gentoo.org/wiki/Custom_Initramfs#Salvaging提供了获取和解包内核映像中包含的嵌入式 initramfs/initrd 的方法。

现在我想将修改后的文件系统(cpio+ 可能使用 eg 打包lzma)插入到内核可执行文件中,而不必重新编译它。是否可以通过这种方式修改内核的 ELF 映像?如果是,那么如何?如果我只是就地替换字节(也许是一些哈希?),我是否需要保留一些东西?


objdump-h 输出:
vmlinux.64.orig:     file format elf64-big

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         004162b8  ffffffff80100000  ffffffff80100000  00010000  2**7
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 __ex_table    000063a0  ffffffff805162c0  ffffffff805162c0  004262c0  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .notes        00000024  ffffffff8051c660  ffffffff8051c660  0042c660  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .rodata       0041f700  ffffffff8051d000  ffffffff8051d000  0042d000  2**8
                  CONTENTS, ALLOC, LOAD, …
Run Code Online (Sandbox Code Playgroud)

linux initrd initramfs elf linux-kernel

7
推荐指数
1
解决办法
1299
查看次数

将内核模块添加到 initrd 时,mkinitrd 会发生什么变化?

使用 mkinitrd (CentOS 5.5) 创建 initrd 时,它添加到 initrd 的内核模块在此过程中被修改。例如,initrd 的 /lib/sata_via.ko 与 /lib/modules/2.6.18-194.32.1.el5/kernel/drivers/ata/sata_via.ko 不是二进制相同的。

我只是好奇当 mkinitrd 包含内核模块时会发生什么 - 它是否链接到依赖项,或者是什么使模块发生变化?

linux initrd kernel-modules

6
推荐指数
1
解决办法
3030
查看次数

如何从内核源代码制作最小的可引导 linux(仅使用终端)?

我想制作一个非常小的 linux 操作系统,它只有一个终端界面和基本的命令/应用程序(busybox 是我选择的命令/应用程序)。我不想在我的操作系统上安装安装选项。我只是希望它完全从 RAM 启动并运行。我打算使用 ISO-Linux 作为引导加载程序。没有网络,没有虚拟化支持,没有不必要的驱动程序等。我希望它是非常非常基本的操作系统。我已经从 kernel.org 下载了最新的稳定内核 (v4.5) 源代码并准备好了构建环境。

我的另一个困惑是,默认情况下内核是否具有任何用户界面(shell、终端等),我可以在其中键入命令并查看输出?

linux kernel initrd busybox

6
推荐指数
1
解决办法
8048
查看次数

如何在不编译的情况下结合linux内核和initrd?

我知道可以从 linux 内核中提取嵌入式 initramfs cpio。我想知道是否可以进行反向操作;即,给定已编译的内核和 initramfs 存档,如何将它们组合起来?

我正在尝试实现与此内核配置相同的效果...

CONFIG_EFI=y
CONFIG_EFI_STUB=y
...
CONFIG_FB_EFI=y
...
CONFIG_CMDLINE_BOOL=y
CONFIG_CMDLINE="root=..."
...
CONFIG_BLK_DEV_INITRD=y
CONFIG_INITRAMFS_SOURCE="my_initrd.cpio"
Run Code Online (Sandbox Code Playgroud)

...没有实际配置和/或编译内核。

参考:

linux kernel initrd initramfs linux-kernel

6
推荐指数
1
解决办法
953
查看次数