Linux mkinitrd命令介绍
mkinitrd是一个用于创建初始内存盘(initrd)镜像的脚本。initrd是一个临时的根文件系统,它在内核启动时被加载到内存中,用于预加载一些必要的块设备模块(如IDE,SCSI或RAID),以便访问真正的根文件系统。mkinitrd可以自动加载文件系统模块(如ext3和jbd),IDE模块,/etc/modprobe.conf中的所有scsi_hostadapter条目,以及如果系统的根分区在RAID上的RAID模块,这使得使用模块化设备驱动程序构建和使用内核变得简单。initrd中加载的模块会根据/etc/modprobe.conf中指定的模块选项进行配置。内核使用的根文件系统仍然在引导配置文件中指定,如root=/dev/hda1或root=LABEL=rootPart等。
Linux mkinitrd命令适用的Linux版本
mkinitrd命令在大多数Linux发行版中都是可用的,但是有些发行版可能已经使用了其他的工具来生成initrd或initramfs(initrd的后继者),如dracut,update-initramfs等。如果你的系统没有mkinitrd命令,你可以尝试安装它,或者使用其他的工具来替代。下面是一些常见的Linux发行版中mkinitrd命令的安装或替代方法:
- CentOS 7/8:CentOS 7/8使用dracut来生成initramfs,你可以使用dracut命令来创建或更新initramfs,或者使用mkinitrd命令作为dracut的兼容包装器。如果你想安装mkinitrd命令,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo yum install dracut-compat
- Ubuntu/Debian:Ubuntu/Debian使用update-initramfs来生成initramfs,你可以使用update-initramfs命令来创建或更新initramfs。如果你想安装mkinitrd命令,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo apt-get install initramfs-tools
- Fedora:Fedora使用dracut来生成initramfs,你可以使用dracut命令来创建或更新initramfs,或者使用mkinitrd命令作为dracut的兼容包装器。如果你想安装mkinitrd命令,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo dnf install dracut-compat
- SUSE:SUSE使用mkinitrd-suse来生成initramfs,你可以使用mkinitrd-suse命令来创建或更新initramfs,或者使用mkinitrd命令作为mkinitrd-suse的兼容包装器。如果你想安装mkinitrd命令,你可以使用以下命令:
[linux@bashcommandnotfound.cn ~]$ sudo zypper install mkinitrd
Linux mkinitrd命令的基本语法
mkinitrd命令的基本语法格式如下:
mkinitrd [选项] [-o 输出文件] [-r 根设备] [内核版本]
其中,输出文件是要创建的initrd镜像的文件名,根设备是要访问的真正的根文件系统的设备名,内核版本是要生成initrd的内核版本号。如果不指定输出文件,mkinitrd会在/boot目录下创建一个默认的initrd文件,如initrd-内核版本.img。如果不指定根设备,mkinitrd会使用当前的根设备。如果不指定内核版本,mkinitrd会使用当前运行的内核版本。
Linux mkinitrd命令的常用选项说明
mkinitrd命令的常用选项如下表所示:
选项 | 说明 |
---|---|
--version | 显示mkinitrd的版本信息 |
-v, --verbose | 增加输出的详细程度 |
-f, --force | 覆盖已存在的initrd文件 |
--with=模块 | 添加指定的内核模块到initrd中 |
--preload=模块 | 在任何其他内核模块加载之前预加载指定的内核模块到initrd中,这可以用于确保一些设备的命名,但是建议使用/dev中的符号链接来代替 |
--nocompress | 不压缩生成的initrd文件 |
--image-version | 在输出文件的路径中追加内核版本号 |
--fstab=文件 | 使用指定的文件来自动确定根文件系统的类型,通常是/etc/fstab |
--builtin=模块 | 假设指定的模块是内核内置的,mkinitrd不会寻找这个模块,也不会报错 |
--nopivot | 不使用pivot_root系统调用作为initrd的一部分,这可以让mkinitrd为Linux 2.2内核构建合适的镜像,但是会牺牲一些功能,如ext3文件系统可能无法正常工作,根文件系统的选项也不会被使用,这个选项不推荐使用,而且会在未来的版本中移除 |
--omit-lvm-modules | 不加载任何lvm模块,即使/etc/fstab需要它们 |
--omit-raid-modules | 不加载任何raid模块,即使/etc/fstab需要它们 |
--omit-scsi-modules | 不加载任何scsi模块,即使/etc/fstab需要它们 |
--with-fips | 为initrd添加一些检查,如果系统运行在fips模式下,首先会对内核进行完整性检查,然后加载所有的加密算法模块,并运行自检 |
Linux mkinitrd命令的实例
下面是一些使用mkinitrd命令的实例:
- 为当前运行的内核创建一个默认的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd
- 为指定的内核版本创建一个指定的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd -o /boot/myinitrd.img -r /dev/sda1 5.10.0
- 为当前运行的内核创建一个不压缩的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --nocompress
- 为当前运行的内核创建一个包含ext4模块的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --with=ext4
- 为当前运行的内核创建一个预加载usb-storage模块的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --preload=usb-storage
- 为当前运行的内核创建一个在输出文件路径中追加内核版本号的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --image-version -o /boot/myinitrd
- 为当前运行的内核创建一个使用指定的fstab文件来确定根文件系统类型的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --fstab=/etc/myfstab
- 为当前运行的内核创建一个假设ext4模块是内核内置的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --builtin=ext4
- 为当前运行的内核创建一个不使用pivot_root系统调用的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --nopivot
- 为当前运行的内核创建一个不加载任何lvm模块的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mk
initrd -o /boot/myinitrd-nolvm.img
- 为当前运行的内核创建一个不加载任何raid模块的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --omit-raid-modules
- 为当前运行的内核创建一个不加载任何scsi模块的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --omit-scsi-modules
- 为当前运行的内核创建一个为fips模式添加检查的initrd文件
[linux@bashcommandnotfound.cn ~]$ sudo mkinitrd --with-fips
Linux mkinitrd命令的注意事项
使用mkinitrd命令时,需要注意以下几点:
- mkinitrd命令需要root权限,所以要使用sudo或者su来执行。
- mkinitrd命令会根据/etc/modprobe.conf中的配置来加载模块,所以要确保该文件中的内容是正确的。
- mkinitrd命令会根据/etc/fstab中的配置来确定根文件系统的类型,所以要确保该文件中的内容是正确的。
- mkinitrd命令会根据/boot目录下的内核文件来确定内核版本,所以要确保该目录下的文件是正确的。
- mkinitrd命令会覆盖已存在的同名initrd文件,除非使用-f或--force选项,所以要注意备份原有的initrd文件。
- 如果系统中没有mkinitrd命令,可能会出现bash: mkinitrd: command not found的错误,这时可以尝试安装mkinitrd命令,或者使用其他的工具来替代。
评论区