专题:initramfs & dracut
Initramfs
An initramfs (initial ram file system) is used by Linux systems to prepare the system during boot before the operating systems'init process starts.
The initramfs usually takes care of mounting important file systems (by loading the proper kernel modules and drivers) such as/usr or /var, preparing the /dev file structure, etc. Users who use an encrypted file system will also have the initramfs ask them for the passphrase before it can mount the file systems.
When the file systems are mounted, control is passed on to init which then takes care of further starting all necessary services and booting up the remainder of the system.
『参考资料』https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#dracut.kernel
Dracut
Dracut is an initramfs infrastructure and aims to have as little as possible hard-coded into the initramfs.
Dracut can generate a customized initrams image which contains only whatever is necessary to boot some particular computer, such as ATA, SCSI and filesystem kernel modules (host-only mode).
Dracut can also generate a more generic initramfs image (default mode).
一、概述
Initramfs/Initrd 用于创建一个系统启动初期的小型用户空间,解决复杂启动流程问题,作为真实rootfs挂载前的过渡。Dracut完整的命令行参数,请查看dracut.cmdline(7)。
二、使用方法简介
创建一个initramfs
# dracut [--force] [/PATH/TO/new_image_name] [kernel version]
这将创建一个通用的initramfs image,包含尽可能多的当前active kernel的驱动模块和系统工具,image默认位置:/boot/initramfs-<kernel version>
.img;--force选项用于强行覆盖已经存在的同名initramfs;可以在cmdline指名新image的路径和名称及为哪一个版本的kernel制作image;如果想制作一个更轻、更小、启动速度更快的initramfs,可以添加--hostonly选项,通常需要制作一个全功能通用型image以备不时之需。
查看initramfs包含的文件列表及某个文件的内容
# lsinitrd | less
# lsinitrd -f /etc/ld.so.conf
include ld.so.conf.d/*.conf 注:ld.so.conf文件的全部内容
- 添加模块
一些dracut内置模块默认不会添加至initramfs中,可以在/etc/dracut.conf或/etc/dracut.conf.d/xxx.xonf中添加,也可以使用--add选项
# dracut --add bootchart initramfs-bootchart.img
查看所有可用的dracut模块
# dracut --list-modules
- 忽略(不添加)模块
用于精简initramfs,同样可以在配置文件(man 5 dracut.conf)或命令行操作,如下示例:去除lvm逻辑卷支持
# dracut --omit "multipath lvm" no-multipath-lvm.img
- 手动添加没有被dracut自动识别的kernel模块
同理,/etc/dracut.conf或/etc/dracut.conf.d/xxx.conf或cmdline
# dracut --add-drivers mymod initramfs-with-mymod.img
- kernel启动参数(/boot/grub[2]/grub.cfg)
查看当前系统启动参数
# dracut --print-cmdline
root=UUID=8b8b6f91-95c7-4da2-831b-171e12179081 rootflags=rw,relatime,discard,data=ordered rootfstype=ext4
指定启动设备
root=/dev/sdX
- OR -
root=UUID=19e9dda3-5a38-484d-a9b0-fa6b067d0331
- OR -
root=LABEL=XXX
查看磁盘id及label
blkid
- OR -
ls -l /dev/disk/by-uuid && ls -l /dev/disk/by-label
屏蔽kernel模块(即:使其不能自动加载)
rd.driver.blacklist=mptsas rd.driver.blacklist=nouveau
在kernel command line上指明initramfs的启动参数,可以加快启动速度;如果不指明,dracut将在最大的范围内查找
#This turns off every automatic assembly of LVM, MD raids, DM raids and crypto LUKS
rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0
综上所述,加快initramfs启动速的途径有两种,一是在生成initramfs image之前直接精简其内容,二是通地操作grub.cfg的启动参数实现
三、开机流程:Systemd & Dracut
systemd-journal.socket
|
v
dracut-cmdline.service
|
v
dracut-pre-udev.service
|
v
systemd-udevd.service
|
v
local-fs-pre.target dracut-pre-trigger.service
| |
v v
(various mounts) (various swap systemd-udev-trigger.service
| devices...) | (various low-level (various low-level
| | | services: seed, API VFS mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target dracut-initqueue.service sysctl, ...) debugfs, ...)
| | | | |
\_______________|____________________ | ___________________|____________________/
\|/
v
sysinit.target
|
_________________/|\___________________
/ | \
| | |
v | v
(various | rescue.service
sockets...) | |
| | v
v | rescue.target
sockets.target |
| |
\_________________ | emergency.service
\| |
v v
basic.target emergency.target
|
______________________/|
/ |
| v
| dracut-pre-mount.service
| |
| v
| sysroot.mount
| |
| v
| initrd-root-fs.target
(custom initrd services) |
| v
| dracut-mount.service
| |
| v
| initrd-parse-etc.service
| |
| v
| (sysroot-usr.mount and
| various mounts marked
| with fstab option
| x-initrd.mount)
| |
| v
| initrd-fs.target
\______________________ |
\|
v
initrd.target
|
v
dracut-pre-pivot.service
|
v
initrd-cleanup.service
isolates to
initrd-switch-root.target
|
v
______________________/|
/ |
| initrd-udevadm-cleanup-db.service
| |
(custom initrd services) |
| |
\______________________ |
\|
v
initrd-switch-root.target
|
v
initrd-switch-root.service
|
v
switch-root
四、关机流程:Systemd & Dracut
On a systemd driven system, the dracut initramfs is also used for the shutdown procedure.The following steps are executed during a shutdown:
- systemd switches to the shutdown.target
- systemd starts /lib/systemd/system/shutdown.target.wants/dracut-shutdown.service
- dracut-shutdown.service executes /usr/lib/dracut/dracut-initramfs-restore which unpacks the initramfs to /run/initramfs
- systemd finishes shutdown.target
- systemd kills all processes
- systemd tries to unmount everything and mounts the remaining read-only
- systemd checks, if there is a /run/initramfs/shutdown executable
- if yes, it does a pivot_root to /run/initramfs and executes ./shutdown. The old root is then mounted on /oldroot. /usr/lib/dracut/modules.d/99shutdown/shutdown.sh is the shutdown executable.
- shutdown will try to umount every /oldroot mount and calls the various shutdown hooks from the dracut modules.This ensures, that all devices are disassembled and unmounted cleanly
专题:initramfs & dracut的更多相关文章
- openstack、kvm CentOS升级内核
openstack平台需要使用各种Linux发行版镜像,其制作方法主要有两种,要么是基于各大Linux发行版ISO光盘手动制作,要么是使用官方提供的制作好镜像进行修改 问题 FATAL: Module ...
- centos 安装 谷歌BBR
使用root用户登录,运行以下命令: wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh ...
- Linux 一键安装最新内核并开启 BBR 脚本
原文链接 https://teddysun.com/489.html 请到原文链接仔细阅读后操作.建议查看过脚本内容后操作,方便理解运行过程. 使用root用户登录,运行以下命令: wget -- ...
- Centos7从3.10升级内核到4.9后无法启动解决办法:mpt[23]sas驱动问题
Centos7升级内核后无法启动解决办法:mpt[23]sas驱动问题 前言 这个问题存在有一段时间了,之前做的centos7的ISO,在进行内核的升级以后就存在这个问题: 系统盘在板载sata口上是 ...
- 编译制作Linux 3.18内核rpm包(升级centos6.x虚拟机内核)
介绍 openstack平台需要使用各种Linux发行版模板镜像,其制作方法主要有两种,要么是基于各大Linux发行版ISO光盘手动制作,要么是使用官方提供的模板镜像再做修改 之前制作的opensta ...
- Linux(CentOS)下安装NVIDIA GPU驱动
GCC 官网:http://gcc.gnu.org 1)检查 NVIDIA驱动需要GCC等C/C++开发环境,首先检测GCC是否已经安装 gcc –v# 如果系统显示没有找到GCC指令,或没有显示GC ...
- gnome/KDE安装,gnome出现问题,重新安装nvdia驱动, Linux(CentOS7) NVIDIA GeForece GTX 745 显卡驱动
新安装显示gtx745驱动NVIDIA-Linux-x86_64-346.59.run, yum groupremove kde-desktop yum groupinstall "Desk ...
- 13.1 CentOS系统启动流程介绍
CentOS系统启动流程介绍 本章我们将学习 Linux 启动流程和内核模块管理相关的内容.通过本章我们将学习如下内容: Linux 系统的组成及特点 CentOS 系统的启动流程 开机启动成 gru ...
- Centos7升级内核后无法启动解决办法
前言 这个问题存在有一段时间了,之前做的centos7的ISO,在进行内核的升级以后就存在这个问题: 系统盘在板载sata口上是可以正常启动新内核并且能识别面板硬盘 系统盘插在面板口上新内核无法启动, ...
随机推荐
- gerrit 解决中文乱码相关配置(转载)
From:http://www.cnblogs.com/Jerryshome/archive/2012/04/19/2457170.html 计划在团队中采用code review,因为一直是用git ...
- 隐语义模型LFM(latent factor model)
对于某个用户,首先得到他的兴趣分类,然后从分类中挑选他可能喜欢的物品.总结一下,这个基于兴趣分类的方法大概需要解决3个问题. 如何给物品进行分类? 如何确定用户对哪些类的物品感兴趣,以及感兴趣的程度? ...
- ArcGIS Viewer for Flex中引入google map作底图
在ArcGIS Viewer for Flex开发中,经常需要用到google map作为底图,我们不能通过ArcGIS Viewer for Flex - Application Builder轻易 ...
- 关于JQuery的一些知识点
1.jQuery的入口函数 1.1 语法jQuery(document).read(function(){ }); $(function(){ });// ** window.onlaod = fun ...
- 9,SFDC 管理员篇 - 安全设置
1, 使用Profile控制权限 (整体层面) Setup | Manage Users | Profiles 总结下,一个用户只能有一个Profile,但是可以有多个Permission S ...
- how to monitor system logs and export to files simultaneously
What will you do when you conduct a malware analysis on a smartphone? You will focus on running proc ...
- .NET 扩展方法
.NET 的扩展方法是在.NET 3.0引入的,MSDN给出的定义是:扩展方法使你能够向现有类型“添加”方法(包括你自定义的类型和对象噢),而无需创建新的派生类型.重新编译或以其他方式修改原始类型.扩 ...
- cin判断读取结束 C++语言
cin是C++的输入流,可以通过>>进行读取. 判断读取结束,一般有两种方法,具体取决于与输入的约定. 1 以特殊值结尾. 如输入整数,以-1结束,那么当读到-1的时候,就确定读取结束了. ...
- Windows程序设计(第五版)学习:第四章 文本输出
第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域. 2,大多数 ...
- Java日志系统框架的设计与实现
推荐一篇好的文章介绍java日志系统框架的设计的文章:http://soft.chinabyte.com/database/438/11321938.shtml 文章内容总结: 日志系统对跟踪调试.程 ...