我正在尝试学习有关 initrd 的东西。我按照本教程从头开始构建自己的 initrd,并在其上安装了 busybox。然后我用isolinux从它制作了一个.iso,所以我可以在virtualbox中测试它。它工作得很好!
我有来自 busybox 的基本命令,所以我想挂载一个文件系统。但是 /dev 目录几乎是空的(没有 sda),除了我在学习教程时创建的一些文件。我了解了 udev,我认为这就是我所需要的。但是我不知道该怎么做。
我应该从 udev 获取最新的源代码,编译它并将其添加到我的 initrd 中吗?然后在我的初始化脚本中调用 /bin/udev 或类似的东西?或者是否有其他/更好的方法来填充 /dev 目录?
编辑:关于我已经完成的工作的一些附加信息和更新。
/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 HARDDISK和Direct-Access ATA …initramfs镜像可以用gzip以外的方法压缩吗,比如lzma?
如何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(md0和md1),一种设备带有 RAID6(md2)。我指的是所需的设备名称。md0元数据版本为 0.9,另外两个版本为 1.2。md0映射到/和其他两个与引导无关。
引导驱动器是 GPT 分区的。上面有一个胶水“BIOS 启动分区”( sda1)。grub-install --no-floppy /dev/sda报告成功。
md0 == sda3 + sdb3md1 == sda2 + …我已经从全新安装中复制了两次 - 设置最初工作正常,但是当应用内核更新时,系统在重新启动时挂起。选择 GRUB 提供的旧内核效果很好。
系统详细信息:
我尝试过的 GRUB 设置肯定不起作用:
及其所有排列。
initrd.img 和 initrd.img.old(我可以启动)文件的 lsinitramfs 不会弹出任何明显的候选者。
它似乎可能与微代码或 cryptsetup 相关,但由于调试没有提供任何信息,并且一旦我用 36 启动,dmesg 可能会报告正常启动,所以我有点不知所措。
有什么想法吗?似乎存在相关的错误,但没有完全重现。
我在 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 的指南。
目前正在学习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 位)?
在如何从 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) 使用 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 操作系统,它只有一个终端界面和基本的命令/应用程序(busybox 是我选择的命令/应用程序)。我不想在我的操作系统上安装安装选项。我只是希望它完全从 RAM 启动并运行。我打算使用 ISO-Linux 作为引导加载程序。没有网络,没有虚拟化支持,没有不必要的驱动程序等。我希望它是非常非常基本的操作系统。我已经从 kernel.org 下载了最新的稳定内核 (v4.5) 源代码并准备好了构建环境。
我的另一个困惑是,默认情况下内核是否具有任何用户界面(shell、终端等),我可以在其中键入命令并查看输出?
我知道可以从 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)
...没有实际配置和/或编译内核。
参考: