zoukankan      html  css  js  c++  java
  • 专题: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:

    1. systemd switches to the shutdown.target
    2. systemd starts /lib/systemd/system/shutdown.target.wants/dracut-shutdown.service
    3. dracut-shutdown.service executes /usr/lib/dracut/dracut-initramfs-restore which unpacks the initramfs to /run/initramfs
    4. systemd finishes shutdown.target
    5. systemd kills all processes
    6. systemd tries to unmount everything and mounts the remaining read-only
    7. systemd checks, if there is a /run/initramfs/shutdown executable
    8. 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.
    9. 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
  • 相关阅读:
    Python-dict与set
    Python-实现对表插入百万条数据
    Python—元组tuple
    数据库查询
    python-操作MySQL数据库
    Python-类的继承
    Python-内置类属性
    Python-类的概念及使用1
    Python异常处理
    了解dto概念,什么是DTO
  • 原文地址:https://www.cnblogs.com/hadex/p/5830730.html
Copyright © 2011-2022 走看看