initrd/initramfs文件制作及解压

MKINITRAMFS(8)系统管理MKINITRAMFS(8)

名称
mkinitramfs-用于生成initramfs image的低级工具

概要

   mkinitramfs [option]...  -o outfile [version]
   mkinitramfs -h

描述
mkinitramfs脚本生成一个initramfs映像。initramfs是压缩的cpio归档文件。可以将归档文件与相应的Linux内核一起用于同一体系结构的不同机器中。
mkinitramfs用于高级用途。在您的本地机器上,update-initramfs使用相关参数调用mkinitramfs。update-initramfs保持生成的initramfs的sha1sum。它会小心生成备份并最终运行引导程序。

在启动时,内核将归档文件解压缩到RAM磁盘中,然后挂载并将其用作初始根文件系统。根设备的所有发现都发生在这个早期的用户空间中。

选项

   -c  compress
          覆盖initramfs.conf中的COMPRESS设置。

   -d confdir
          设置备用配置目录。

   -k
   		  保留用于制作映像的临时目录。

   -o  outfile
          将图像写入文件外。

   -r  root
          覆盖initramfs.conf中的ROOT设置。

   -v
   		  设置详细模式输出。

   version
          设置initramfs映像的内核版本(默认为正在运行的内核)。

   -h, --help
          显示用法信息并退出。

环境
mkinitramfs支持TMPDIR环境变量。如果设置,它将使用给定目录中的子目录创建其临时工作目录。否则,它使用/ var / tmp作为默认值。给定目录应位于允许执行存储在其中的文件的文件系统上,即,不应使用noexec挂载选项进行挂载。

   如果设置了SOURCE_DATE_EPOCH,则mkinitramfs尝试生成可再现的initramfs图像。

档案

   /etc/initramfs-tools/initramfs.conf
          脚本的默认配置文件。有关可用配置参数的描述,请参见initramfs.conf(5)。

   /etc/initramfs-tools/modules
          指定的模块将放入生成的映像中,并在系统启动时加载。格式(每行一种)与/ etc / modules相同,在modules(5)中进行了描述。

   /etc/initramfs-tools/conf.d
          conf.d目录允许您在initramfs构建时通过配置片段对bootargs进行硬编码。这允许设置ROOT或RESUME。这对于不通过根bootarg的引导加载程序特别有用。

   /etc/initramfs-tools/DSDT.aml
          如果该文件存在,它将以导致ACPI加载的方式附加到initramfs中。

initrd/initramfs文件制作—例子:

   #为当前正在运行的内核创建一个initramfs:

   mkinitramfs -o ~/tmp/initramfs-$(uname -r)

   #为特定内核创建一个initramfs,并保留builddirs:

   mkinitramfs -k -o ~/tmp/initramfs-2.6.21-686 2.6.21-686

   #调试initramfs创建(签出书面日志文件)

   sh -x mkinitramfs -o ~/tmp/initramfs-$(uname -r) 2> ~/tmp/log

作者
initramfs工具由Maximilian Attems maks@debian.org,Jeff Bailey jbailey@raspberryginger.com和其他许多人编写。

也可以看看
initramfs.conf(5),initramfs-tools(7),update-initramfs(8),lsinitramfs(8),unmkinitramfs(8)。

initramfs-工具2018/07/18 MKINITRAMFS(8)

initrd/initramfs文件解压:

sudo apt install binwalk
binwalk initrd.img-5.7.7-amd64-desktop

在这里插入图片描述

看到gzip部分起始地址是3001344,

dd if=initrd.img-5.7.7-amd64-desktop bs=3001344 skip=1 | zcat | cpio -i

即可得到initrd文件内容。

INITRAMFS-TOOLS(7)Linux程序员手册INITRAMFS-TOOLS(7)

名称
initramfs-tools-为mkinitramfs编写脚本的简介

描述
initramfs-tools有一个主脚本和两组不同的下标,它们将在执行的不同阶段使用。下面将在虚拟工具的帮助下分别讨论其中的每一个,该工具在安装根分区之前先对lvm分区进行碎片整理。

内核命令行
引导程序一如既往地指定内核使用的根文件系统。允许使用传统的root = / dev / sda1样式的设备规范。如果使用标签,如root = LABEL = rootPart一样,initrd将在所有可用设备中搜索具有适当标签的文件系统,并将该设备挂载为根文件系统。root = UUID = uuidnumber将以该UUID作为根文件系统的分区挂载。

标准

    init =“ <实际init的路径>”
          initramfs脚本完成后,将二进制文件移交给根fs执行。

    initramfs.clear
          开始时清除屏幕

    initramfs.runsize
          / run tmpfs安装点的大小(以字节为单位)(支持后缀)或以物理RAM的百分比表示。此参数用作tmpfs的大小安装选项的值。有关详细信息,请参见https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt。默认值为10%。

    root =“ <blockdevice的路径>”
          要安装为根文件系统的设备节点。建议的用法是按照“ root = UUID = xxx”指定UUID。

    rootfstype
          设置根文件系统类型。

    rootdelay
          设置延迟(以秒为单位)。确定mountroot等待root出现多长时间。默认值为180秒。

    rootflags
          设置文件系统安装选项字符串。

    nfsroot
          可以是“ auto”以尝试从DHCP获取相关信息,也可以是NFSSERVER:NFSPATH或NFSSERVER:NFSPATH:NFSOPTS形式的字符串。使用root = / dev / nfs使NFS进入。可以在nfs(5)中查找NFSOPTS。

    ip
          告诉如何配置ip地址。允许指定与DHCP服务器不同的NFS服务器。有关详细信息,请参见任何最新的Linux来源中的Documentation / filesystems / nfsroot.txt。NFS根目录的可选参数。

    BOOTIF
          是pxelinux格式的Mac地址,以“ 01-”和“-”开头。pxelinux通过此bootarg传递用于PXE引导的网卡的mac地址。

    boot
    	  本地或NFS(影响运行了哪些initramfs脚本,请参见引导脚本下的“子目录”部分)。

    resume
          简历挂钩尝试自动检测简历分区,并将第一个交换分区用作有效猜测。可以在/etc/initramfs-tools/conf.d/resume中设置RESUME变量。引导变量no​​resume将覆盖它。

    resume_offset
          指定与“ resume =”给定的分区的偏移量,交换文件的交换头位于该偏移量处。

    quiet
    	  会减少引导过程中输出到控制台的文本量。

    ro
    	  将rootfs只读安装。

    rw
    	  以可读写方式挂载rootfs。

    blacklist
          禁用特定模块的加载。使用blacklist = module1,module2,module3引导参数。

Debug
panic会使panic超时。panic = 是已记录的安全功能:它禁用调试Shell。

    调试产生大量输出。它将日志写入/run/initramfs/initramfs.debug。而是在使用任意参数调用时将输出写入控制台。例如使用“ debug = vc”。

    在实际执行相应的脚本(请参阅“启动脚本”部分)或操作之前,break在选定的阶段(顶部,模块,预安装,安装,mountroot,底部,初始化)在initramfs映像中生成一个shell。可以指定多个阶段,以逗号分隔。如果未指定阶段,则默认值为“ premount”。请注意,如果同时出现“ panic”和“ break”,则initramfs将不会生成任何shell,而是重新启动。

    网络控制台netconsole
          用选择的参数加载netconsole linux模块。

    all_generic_ide
          在启动时加载通用的IDE / ATA芯片组支持。

脚本
有效的引导和挂钩脚本名称仅包含字母,数字,破折号和下划线。其他脚本将被丢弃。

配置hook脚本
这些用于在必要时覆盖用户配置,例如,强制使用busybox而不是klibc实用程序。

hook脚本
这些在创建initramfs映像时使用,并且不包含在映像本身中。但是,它们可能导致文件包含在映像中。挂钩脚本在errexit下执行。因此,钩子脚本可能因可能的错误(退出代码!= 0)而中止mkinitramfs构建。

启动脚本
这些包含在initramfs映像中,通常在内核引导期间在安装根分区之前在早期用户空间中执行。

配置hook脚本
可以在/usr/share/initramfs-tools/conf-hooks.d中找到配置挂钩脚本。它们是由mkinitramfs在/ etc中的配置文件之后且在运行任何挂钩脚本之前获取的。它们可以覆盖initramfs.conf(5)中记录的任何变量,但是仅在绝对必要时才应这样做。例如,如果软件包的启动脚本需要klibc-utils未提供的命令,则它还应安装一个设置BUSYBOX = y的配置挂钩。

挂钩脚本
挂钩可以在两个地方找到:/ usr / share / initramfs-tools / hooks和/ etc / initramfs-tools / hooks。它们在生成initramfs映像期间执行,并负责在映像本身中包括所有必需的组件。除非在脚本中设置了先决条件,否则无法保证执行不同脚本的顺序。请注意,PREREQ仅在单个目录中使用。因此,首先要根据它们的PREREQ值对/ usr / share / initramfs-tools中的脚本进行排序并执行。然后,根据/ etc / initramfs-tools中的所有脚本按其PREREQ值排序并执行。这意味着当前不可能从包(/ usr / share / initramfs-tools)中执行本地脚本(/ etc / initramfs-tools)。

   如果钩子脚本需要的配置超出了下面列出的导出变量,它应该读取一个与/ etc / initramfs-tools目录分开的私有配置文件。它不能直接读取initramfs-tools配置文件。

标头
为了支持先决条件,每个脚本应以以下几行开头:

          #!/bin/sh
          PREREQ=""
          prereqs()
          {
               echo "$PREREQ"
          }

          case $1 in
          prereqs)
               prereqs
               exit 0
               ;;
          esac

          . /usr/share/initramfs-tools/hook-functions
          # Begin real processing below this line

   例如,如果您要编写一个依赖于lvm的新挂钩脚本,则以PREREQ开头的行应更改为PREREQ =“ lvm”,这将确保在自定义脚本之前运行lvm挂钩脚本。

帮助功能
/usr/share/initramfs-tools/hook-functions包含许多函数,这些函数处理挂钩脚本中的一些常见任务:

          manual_add_modules将模块(及其依赖的任何模块)添加到initramfs映像。

          示例:manual_add_modules isofs

          add_modules_from_file读取一个文件,其中包含要添加到initramfs映像中的模块列表(每行一个)。通过将参数写入模块名称的同一行,文件可以包含注释(以#开头的行)和模块参数。

          示例:add_modules_from_file / tmp / modlist

          force_load将模块(及其依赖项)添加到initramfs映像中,并且在引导过程中无条件加载模块。还支持通过在模块名称后列出参数来将参数传递给模块。

          示例:force_load cdrom debug = 1

          copy_modules_dir将整个模块目录从/ lib / modules / KERNELVERSION /复制到initramfs映像中。

          示例:copy_modules_dir内核/驱动程序/ ata

包括二进制
如果需要将二进制文件复制到initramfs模块,则应使用以下命令:

          copy_exec / sbin / mdadm / sbin

   mkinitramfs将自动检测可执行文件所依赖的库,并将它们复制到initramfs中。这意味着,除非使用klibc编译,否则大多数可执行文件都会在映像中自动包含glibc,这会将其大小增加几百千字节。

包括系统固件原映像(早期的initramfs)
如果需要在initramfs映像之前添加数据,则需要在文件中准备数据,然后调用prepend_earlyinitramfs函数。函数返回后即可将其丢弃。

   例:
   TEMP_FILE = $(mktemp ...)
     ...
   prepend_earlyinitramfs $ {TEMP_FILE}
   rm -f $ {TEMP_FILE}

导出变量
mkinitramfs为挂钩脚本环境设置了几个变量。

    模块化
          对应于linux模块目录。

    版
          是针对mkinitramfs运行的$(uname -r)linux版本。

    康菲迪
          是使用的initramfs-tools配置的路径。

    DESTDIR
          是新建initramfs的根路径。

    DPKG_ARCH
          允许特定于弓的钩子添加。

    冗长的
          对应于update-initramfs运行的详细程度。

    BUSYBOX,键盘映射,模块
          如initramfs.conf(5)中所述。

    BUSYBOXDIR
          是应从其中安装busybox实用程序的目录,如果不使用busybox,则为空。

引导脚本
与钩子脚本类似,引导脚本可以在两个位置/ usr / share / initramfs-tools / scripts /和/ etc / initramfs-tools / scripts /中找到。这两个目录有许多子目录,它们控制执行脚本的引导阶段。

标头
就像钩子脚本一样,不能保证一个子目录(请参见下面的“子目录”)中不同脚本的执行顺序。为了定义特定的顺序,应该使用与钩子脚本相似的标头:

          #!/ bin / sh
          PREREQ =“”
          prereqs()
          {
               回声“ $ PREREQ”
          }

          案例$ 1
          先决条件
               先决条件
               出口0
               ;;
          埃萨克

   必要时修改PREREQ以列出同一子目录中的其他脚本。

帮助功能
在/ scripts / functions中提供了许多功能(大多数用于处理输出)来引导脚本:

          log_success_msg记录成功消息

          示例:log_success_msg“成功完成分组”

          log_failure_msg记录失败消息

          示例:log_failure_msg“缺少基础设施组件froobz”

          log_warning_msg记录警告消息

          示例:log_warning_msg“只能进行部分混编”

          log_begin_msg记录一条消息,指示某些处理步骤已开始

          log_end_msg记录一条消息,指示某些处理步骤已完成

          例:

                 log_begin_msg“开始磨碎”
                 # 做一点事
                 log_end_msg

          panic记录错误消息并在initramfs映像中执行shell,以允许用户调查情况。

          示例:恐慌“粉碎失败”

子目录
/ usr / share / initramfs-tools / scripts和/ etc / initramfs-tools / scripts都包含以下子目录。

          在此目录中,init-top脚本是在挂载sysfs和procfs之后要执行的第一个脚本。它还运行用于填充/ dev树的udev挂钩(udev将一直运行,直到init-bottom为止)。

          init-premount在由钩子和/ etc / initramfs-tools / modules指定的模块加载后发生。

          local-top或nfs-top执行完这些脚本之后,根设备节点应该存在(本地),或者网络接口应该可用(NFS)。

          local-block这些脚本以本地块设备的名称调用。执行完这些脚本后,该设备节点应存在。如果local-top或local-block脚本未能创建所需的设备节点,则将定期调用local-block脚本以重试。

          在验证了根设备的健全性(本地)或启动了网络接口(NFS)之后,但在实际的根fs挂载之前,将运行local-premount或nfs-premount。

          在安装rootfs(本地)或安装NFS根共享之后,将运行local-bottom或nfs​​-bottom。

          init-bottom是将procfs和sysfs移至实际的rootfs之前执行的最后一个脚本,并且执行移交给了init二进制文件,该文件现在应该在已挂载的rootfs中找到。udev已停止。

启动参数
/conf/param.conf允许引导脚本更改init顶部列出的导出变量。将新值写入其中。如果存在启动脚本,它将在启动脚本运行后获得。

例子
挂钩脚本
钩子脚本示例如下所示(通常放在/ etc / initramfs-tools / hooks / frobnicate中):

          #!/ bin / sh
          #示例frobnication钩子脚本

          PREREQ =“ lvm”
          prereqs()
          {
               回声“ $ PREREQ”
          }

          案例$ 1
          先决条件
               先决条件
               出口0
               ;;
          埃萨克

          。/ usr / share / initramfs-tools / hook-functions
          #在此行下开始实际处理

          如果[!-x“ / sbin / frobnicate”]; 然后
               出口0
          科幻

          force_load frobnicator间隔= 10
          cp / sbin / frobnicate“ $ {DESTDIR} / sbin”
          出口0

启动脚本
引导脚本示例如下所示(通常放在/ etc / initramfs-tools / scripts / local-top / frobnicate中):

          #!/ bin / sh
          #示例frobnication引导脚本

          PREREQ =“ lvm”
          prereqs()
          {
               回声“ $ PREREQ”
          }

          案例$ 1
          先决条件
               先决条件
               出口0
               ;;
          埃萨克

          。/脚本/功能
          #在此行下开始实际处理
          如果[!-x“ / sbin / frobnicate”]; 然后
               恐慌“找不到Frobnication可执行文件”
          科幻

          如果[!-e“ / dev / mapper / frobb”]; 然后
               恐慌“找不到磨碎设备”
          科幻

          log_begin_msg“开始磨碎”
          / sbin / frobnicate“ / dev / mapper / frobb” || 恐慌“粉碎失败”
          log_end_msg

          出口0

导出变量
init为启动脚本环境设置了几个变量。

    ROOT对应于root引导选项。诸如cryptsetup或live-initramfs之类的高级引导脚本需要技巧。否则,请不要管它。

    ROOTDELAY,ROOTFLAGS,ROOTFSTYPE,IP
          对应于rootdelay,rootflags,rootfstype或ip boot选项。不建议使用ROOTDELAY;您应该实施本地阻止启动脚本,而不是延迟或轮询。

    DPKG_ARCH
          允许特定于Arch的启动操作。

    黑名单,恐慌,安静,恢复,noresume,resume_offset
          根据相关的引导选项进行设置。

    break对于在设置和编码启动脚本期间进行手动干预很有用。

    原因
          参数传递给了panic helper函数。用于找出为什么要进入initramfs外壳。

    init通常将路径传递到init(8)/ sbin / init。

    只读
          是安装根目录的默认值对应于ro bootarg。被rw bootarg覆盖。

    根源
          是通常安装/ root的路径。

    debug表示已捕获调试日志以进行进一步调查。

从其他包装中更新INITRAMFS
软件包维护者脚本不应直接运行update-initramfs。安装用于initramfs-tools的钩子的软件包应包括包含以下内容的触发器文件:
激活noawait更新initramfs

   内核软件包必须调用Debian Kernel Handbook中记录的内核挂钩。

   需要initramfs才能运行的软件包,但不是内核软件包,应包含包含以下内容的触发器文件:
          激活等待更新initramfs

内核挂钩
initramfs-tools包含挂钩脚本,这些内核脚本在安装和删除时会被内核软件包调用,因此initramfs会根据需要自动创建,更新或删除。如果环境变量INITRD设置为No,则钩子脚本不执行任何操作。对于使用make deb-pkg和CONFIG_BLK_DEV_INITRD而不是在内核配置中设置的内核软件包,或者使用make-kpkg而不使用-的内核软件包,情况就是如此。 -initrd选项。

调试
检查生成的initramfs的内容很容易。可能需要仔细检查它是否包含相关的二进制文件,库或模块:
lsinitramfs /boot/initrd.img-3.16-3-amd64

档案
/run/initramfs/fsck.log
fsck命令的日志及其初始化输出在initramfs中运行。

   / run / initramfs / fsck-root
          仅在fsck为根文件系统成功运行时存在。

   /运行/ initramfs / fsck-usr
          仅在fsck为/ usr文件系统成功运行时存在。

作者
initramfs工具由Maximilian Attems maks@debian.org,Jeff Bailey jbailey@raspberryginger.com和其他许多人编写。

该手册由DavidHärdemandavid@hardeman.nu编写,由Maximilian Attems maks@debian.org更新。

也可以看看

    initramfs.conf(5),mkinitramfs(8),update-initramfs(8),lsinitramfs(8)。

initramfs-工具2018/07/18 INITRAMFS-TOOLS(7)

INITRAMFS.CONF(5)

名称
initramfs.conf-mkinitramfs的配置文件

描述
可以通过其配置文件来修改mkinitramfs的行为。

   文件中的每一行可以是配置变量,空白行或注释。变量的值由以下形式的语句分配:name = [value]

   可以将配置选项分解为配置摘要,并放在/etc/initramfs-tools/conf.d目录中的各个文件中。此目录中的文件始终在主配置文件之后读取,因此您可以覆盖主配置文件中的设置,而无需直接对其进行编辑。

一般变量
MODULES
指定initramfs映像的模块。

          / etc / initramfs-tools / modules和/usr/share/initramfs-tools/modules.d/*中列出的模块始终包含在initramfs中,并在引导过程的早期加载。

          除了以上文件中列出的模块以外,list在引导时不会加载任何其他模块。

          最多添加了大多数文件系统,所有ata,sata,scsi和usb驱动程序。

          dep尝试猜测运行框需要哪些模块,仅添加这些模块。

          netboot添加了基本模块和网络模块,但是跳过了块设备。

          默认设置为多数。

    BUSYBOX
          包括用于启动脚本的busybox实用程序。如果设置为“ n”,则mkinitramfs将构建不带busybox的initramfs。请注意,许多启动脚本都需要busybox实用程序。

    KEYMAP
          如果设置为“ y”,则将在initramfs阶段加载控制台键盘映射。无论如何,键映射将在以后由初始化脚本加载,并且可能需要输入的程序包通常会自动设置此变量,因此通常无需设置此变量。

    COMPRESS
          指定用于initramfs映像的压缩方法。如果内核缺乏支持(CONFIG_RD)或相应的用户空间实用程序不存在,则mkinitramfs将默认为gzip。

    UMASK
          设置生成的initramfs文件的umask值。有助于避免泄露最终密钥。

    BOOT	
          允许使用nfs驱动器作为驱动器的根。默认为从本地媒体(硬盘,USB记忆棒)启动。设置为nfs以获取NFS根共享。

    RUNSIZE
          / run tmpfs安装点的大小(以字节为单位)(支持后缀)或以物理RAM的百分比表示。此参数用作tmpfs的大小安装选项的值。有关详细信息,请参见https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt。可以被可选的initramfs.runsize = bootarg覆盖。默认值为10%。

NFS启动变量

    RESUME
          指定用于磁盘暂挂(休眠)的设备,initramfs代码应尝试从该设备恢复。如果未定义或将其设置为auto,则mkinitramfs将自动选择最大的可用交换分区。将其设置为none可禁用从磁盘恢复。

NFS BOOT的变量

    DEVICE
          指定要使用的默认网络接口,例如eth0。ip或BOOTIF bootargs可能会覆盖它。

    ROOT
          当无法传递root bootarg时,允许进行可选的root bootarg硬编码。根bootarg会覆盖该特殊设置。

    NFSROOT
          默认为自动,以便从DHCP服务器获取值。否则,您需要指定HOST:MOUNT。

档案
/etc/initramfs-tools/initramfs.conf

作者
initramfs工具由Maximilian Attems maks@debian.org,Jeff Bailey jbailey@raspberryginger.com和其他许多人编写。宽松地基于Herbert Xu的mkinitrd.conf。

也可以看看
initramfs-tools(7),mkinitramfs(8),update-initramfs(8)。

initramfs-工具2018/07/18 INITRAMFS.CONF(5)

LIVE-TOOLS(8)

名称
live-update-initramfs-将更新的内核和initrd映像写到实时媒体(live media)。

描述
live-update-initramfs是一个包装,代替了initramfs-tools软件包提供的update-initramfs命令。

在具有持久层的实时系统中,live-update-initramfs会将更新后的内核和initrd映像写到实时媒体中。这允许内核通过apt-get从实时系统内部进行升级,而无需手动将内核和initrd同步到实时介质。live-update-initramfs通过所有命令行参数传递给原始的update-initramfs命令;有关原始update-initramfs命令的选项的更多信息,请参见update-initramfs.orig.initramfs-tools(8)。

也可以看看
live-tools(7)

主页
有关live-update-initramfs和Live Systems项目的更多信息,可以在主页http://live-systems.org/和手册中找到<http://live-systems.org/manual/ >。

BUG
可以通过在http://bugs.debian.org/的Bug跟踪系统中为live-tools软件包提交错误报告来报告错误,也可以通过在<debian-live @ lists上向Live Systems邮件列表写邮件来报告错误.debian.org>。

作者
live-update-initramfs由Daniel Baumann mail@daniel-baumann.ch编写。

5.0〜a2-1 2015-09-25 LIVE-TOOLS(8)

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值