https://github.com/dracutdevs/dracut
dracut 基本介绍_金融扫地僧的博客-CSDN博客_dracut
https://mirrors.edge.kernel.org/pub/linux/utils/boot/dracut/dracut.html
dracut 介绍
1. 基本介绍
dracut 是一个事件驱动的 initramfs 基础设施。dracut(工具)被用来通过拷贝工具和文件,从一个已经安装的系统创建一个 initramfs 镜像,并将镜像与dracut框架结合在一起。通常发现在 /usr/lib/dracut/modules.d/.
不像已经存在的initramfs框架,dracut的框架尝试有尽可能更少的硬编码进入initramfs。initramfs在生命中有一个基本的目标:获取已经挂载的rootfs,以致我们能够过渡到真正的rootfs。这是所有驱动装置的可用性。因此,取代脚本硬编码去做各种事情,dracut的 initramfs 依赖 udev 去创建符号链接到设备节点,接着,当rootfs的设备节点出现的时候,它被挂载和根切换到rootfs设备。 这个有助于保持在initramfs里要求的时间尽可能的少,以致一些事情,如5s钟启动,作为一个initramfs的存在结果不是不可能的。
在dracut中,大部分的initramfs生成器功能由一群生成模块提供,这些模块是被主要的dracut工具采购,来安装特定的功能进入initramfs。他们存在于这些模块的子目录。和使用由dracut-functions提供的功能去做他们的工作。
dracut 作为新一代的 initramfs 系统,和前一代的initramfs系统的 mkinitrd 的不同点在于, dracut设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度。实际上,由于initramfs的唯一作用就是挂载rootfs(因此不需要把一堆无用的比如 plymouth 等都装进去),它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。按照官方维基的说法:5秒启动不是梦。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。
dracut 用于制作initrd启动镜像文件, dracut-network会为镜像内添加nfs等网络支持.
2. 命令行工具:
dracut create initial ramdisk images for preloading modules。 dracut创建虚拟磁盘映像,提供给内核,预加载块设备模块(例如 IDE,SCSI或者RAID),通过加载这些设备模块访问根文件系统。
创建一个带有kernel版本号,为kernel使用的 initramfs 镜像。如果 被省略,那么使用实际运行的内核版本号。如果 被省略或为空,那么缺省的位置 /boot/initramfs-.img 被使用
在启动时,内核解包这个存档进入内存,挂载和使用它作为初始化根文件系统。所有发现的根设备发生在这个早期的用户空间。
完整的内核命令行选项,详看 dracut.cmdline(7).
如果被降到一个紧急shell,当启动你的 initramfs时,文件 /run/initramfs/rdsosreport.txt 被创建,这个文件能被安全(手动挂载)的成为一个分区(通用 /启动)或一个USB盘. 通过在内核命令添加 rd.debug 产生附件的调试信息。 /run/initramfs/rdsosreport.txt 包含所有的日志和一些工具的输出。这个文件应该被联系到关于dracut问题的任何报告
3. dracut命令
3.1. 查看可用的模块
[root@localhost iso-x86_64]# dracut --list-modules
bash
systemd-bootchart
modsign
rescue
watchdog
busybox
nss-softokn
i18n
convertfs
network
ifcfg
url-lib
drm
plymouth
cms
system-upgrade-redhat
bcache
btrfs
crypt
dm
dmraid
dmsquash-live
dmsquash-live-ntfs
kernel-modules
livenet
lvm
mdraid
multipath
qemu
qemu-net
system-upgrade
crypt-gpg
crypt-loop
cifs
dasd
dasd_mod
debug
fcoe
fcoe-uefi
fstab-sys
iscsi
nbd
nfs
resume
rootfs-block
ssh-client
terminfo
udev-rules
virtfs
zfcp
znet
biosdevname
ecryptfs
pollcdrom
selinux
syslog
systemd
usrmount
base
fs-lib
img-lib
kdumpbase
microcode_ctl-fw_dir_override
shutdown
uefi-lib
3.2 通用的initramfs,
这包含了你当前运行内核当前加载的全部内核模块。
[root@localhost iso-x86_64]# dracut
Will not override existing initramfs (/boot/initramfs-3.10.0-1127.13.1.el7.x86_64.img) without --force
Broadcast message from systemd-journald@localhost (Fri 2022-09-23 15:14:13 CST):
dracut[29903]: Will not override existing initramfs (/boot/initramfs-3.10.0-1127.13.1.el7.x86_64.img) without --force
Message from syslogd@loader at Sep 23 15:14:13 ...
dracut:Will not override existing initramfs (/boot/initramfs-3.10.0-1127.13.1.el7.x86_64.img) without --force
要是那个文件已经存在了,dracut 会报错,你可以使用 dracut --force 来强行写入。
你还可以指定生成映像的名称和内核版本,如 dracut name-img kernel-version.
当前内核版本可使用 uname -r 查看,后安装的内核版本可在 /usr/src 目录中执行 ls -l 查看 linux 文件夹的链接指向来确定 。主要用于安装了多版本内核的情况,比如内核升级完成未重启前重制 initramfs(因为 openSUSE 整合 dracut 不够深,现在没有这样的自动化命令出现)。
要是想生成最小化的 dracut 的话,可是使用:
[root@localhost iso-x86_64]# dracut --hostonly
命令。该命令生成的 initramfs 映像只能在本机使用。也就说你,你既不能把硬盘放到别的机器上引导,也不能调整 root 分区。不然就会挂掉。因此请保留一份通用 initramfs 以做恢复之用。最好之前的 initrd 也留着!另外一定要看下面的常见问题,否则就目前版本的 dracut 来说,生成的映像是一定不能用的!
3.3 添加模块
dracut -a "模块名"
3.4 忽略模块
dracut -o "模块名"
这点在后面优化的时候很有用。
3.5 添加内核驱动
用来指定 kernel-modules 这个 dracut 配置模块将加载的内核驱动。默认 dracut 的 kernel-modules 会加载你在 lsmod 命令中能够见到的所有内核模块。因此如果你的内核像 openSUSE 的这么强大,那么基本上 lsmod 命令就列出了你这个硬件配置所需的模块,不必再添加新的了。有备无患:
4. lsinitrd
lsinitrd 显示一个 initramfs 镜像的内容。 如果 被省略,那么 lsinitrd 用 这个缺省的镜像 /boot///initrd 或者 /boot/initramfs-.img
[root@localhost iso-x86_64]# lsinitrd isolinux/initrd.img
Image: isolinux/initrd.img: 53M
========================================================================
Version: dracut-033-572.el7
Arguments: --nomdadmconf --nolvmconf --xz --install '/.buildstamp' --no-early-microcode --add 'fips' --add 'anaconda pollcdrom' --force
dracut modules:
bash
fips
modsign
nss-softokn
rdma
i18n
convertfs
network
ifcfg
url-lib
drm
plymouth
anaconda
btrfs
crypt
dm
dmraid
dmsquash-live
kernel-modules
livenet
lvm
mdraid
multipath
fcoe
fcoe-uefi
iscsi
nfs
resume
rootfs-block
terminfo
udev-rules
biosdevname
pollcdrom
systemd
usrmount
base
fs-lib
img-lib
shutdown
uefi-lib
5.mkinitrd
mkinitrd:通过调用 dracut 去创建一个 initramfs 带有版本的镜像 镜像。
注意: 如果需要生成一个更细粒度控制的镜像,“dracut”应该被直接调用。
lorax介绍(会直接调用dracut制作initrdfs)
https://weldr.io/lorax/f28-branch/lorax.html#:~:text=The%20lorax%20tool%20is%20used%20to%20create%20the,able%20to%20run%20in%20a%20mock%20chroot%20environment.
lorax工具用于创建 Anaconda安装程序 boot.iso 以及基本发布树和 .treeinfo 元数据文件。它的依赖是相当轻量级的,因为它需要能够在模拟 chroot 环境中运行。最好从与目标相同的版本运行 lorax,因为模板中可能包含特定于版本的逻辑。例如。使用 rawhide 版本构建 rawhide 的 boot.iso 以及 rawhide 存储库。可以给dracut传参制作initrdfs
[root@localhost iso-x86_64]# lorax --tmp=/root/work/iso/cache --isfinal --volid=jettechOS-7.9.1802x86_64 --buildarch=x86_64 -p jettechOS -v 7.9 -r 1802 -s https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/os/x86_64/ -s https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/updates/x86_64/ iso-x86_64
[root@localhost iso-x86_64]# ls
EFI images isolinux LiveOS
位置参数
OUTPUTDIR | 输出目录 |
命名参数
-V | 显示程序的版本号并退出 |
所需参数
-p, --product | 产品名称 |
-v, --version | 版本标识符 |
-r, --release | 发布信息 |
-s, --source | 源存储库(可能多次列出) 默认: [] |
--repo | 源 dnf 存储库文件 默认: [] |
命名参数
-m, --mirrorlist | |
mirrorlist 存储库(可能会列出多次) 默认: [] | |
-t, --variant | 变体名称 默认: ”” |
-b, --bugurl | 产品的错误报告 URL 默认值:“您的发行版提供了错误报告工具” |
--isfinal | 默认值:假 |
-c, --config | 配置文件 默认值:“/etc/lorax/lorax.conf” |
--proxy | 回购代理网址:端口 |
-i, --installpkgs | |
在 runtime-install.tmpl 运行之前安装包 glob。(可能多次列出) 默认: [] | |
-e, --excludepkgs | |
在 runtime-install.tmpl 运行之前要删除的包 glob。(可能多次列出) 默认: [] | |
--buildarch | 构建架构 |
--volid | 卷编号 |
--macboot | 默认值:真 |
--nomacboot | 默认值:真 |
--noupgrade | 默认值:真 |
--logfile | 日志文件路径 默认值:./lorax.log |
--tmp | 顶级临时目录 默认值:“/var/tmp” |
--cachedir | DNF 缓存目录。默认是临时目录。 |
--workdir | 工作目录,覆盖 –tmp。默认是 /var/tmp 下的临时目录 |
--force | 即使目标目录存在也运行 默认值:假 |
--add-template | 运行时映像的附加模板 默认: [] |
--add-template-var | |
为运行时图像模板设置变量 默认: [] | |
--add-arch-template | |
特定于架构的图像的附加模板 默认: [] | |
--add-arch-template-var | |
为特定于架构的图像设置变量 默认: [] | |
--noverify | 不验证安装根目录 默认值:真 |
--sharedir | 包含所有模板的目录。覆盖配置文件 sharedir |
--enablerepo | 要启用的存储库名称 默认: [] |
--disablerepo | 要禁用的存储库名称 默认: [] |
--rootfs-size | 根文件系统的大小,以 GiB 为单位。默认为 2。 默认值:2 |
--noverifyssl | 不验证 SSL 证书 默认值:假 |
激烈的论点
--dracut-arg | 重建 initramfs 时传递给 dracut 的参数。为每个参数传递一次。注意:这会覆盖默认值。(默认: ) |
在模拟中运行
如果您在 mock v1.3.4 或更高版本中使用 lorax,则需要传递 --old-chroot
给 mock。Mock 现在默认使用 systemd-nspawn,它无法创建所需的循环设备节点。通过--old-chroot
将使用/dev/loop*
为您设置的旧系统。
这个怎么运作
Lorax 使用dnf将软件包安装到临时目录中,设置配置文件,然后删除不需要的文件以节省空间,并创建文件的 squashfs 文件系统。然后使用通用 initramfs 和所选存储库中的内核构建 iso。
为了推动这些过程,Lorax 使用了一个自定义模板系统,该系统基于Mako 模板并添加了自定义命令(记录在 中pylorax.ltmpl.LoraxTemplateRunner)。Mako 支持%if/%endif
块以及标签内的自由格式 python 代码和使用. 默认模板随 lorax 一起提供并使用 扩展。<% %>
${}
/usr/share/lorax/templates.d/99-generic/
.tmpl