Linux使用系统命令制作initrd镜像

一、前言

两个重要的命令:update-initramfs、mkinitramfs在/boot下创建initrd.img(该两个都是脚本文件).
编译内核的最后一步执行make install时会调用update-initramfs,update-initramfs继而调用mkinitramfs生成initrd.img,省去了太多initrd的过程,已经是可用、完整的可引导文件,直接省去了人工操作的过程——不过还是手动创建才能知道整体过程。initrd目录形式如下:
ls initrd_tmp
bin conf etc init lib lib64 run sbin scripts usr var
该系统命令依赖的deb包如下:
dpkg -S which update-initramfs
initramfs-tools: /usr/sbin/update-initramfs
apt-cache depends initramfs-tools
initramfs-tools
Depends: initramfs-tools-core
Depends: linux-base
由于该两个命令是文本文件:
file /usr/sbin/update-initramfs
/usr/sbin/update-initramfs: POSIX shell script, ASCII text executable
file /usr/sbin/mkinitramfs
/usr/sbin/mkinitramfs: POSIX shell script, ASCII text executable

二、update-initramfs分析

update-initramfs --help
Illegal option –
Usage: /usr/sbin/update-initramfs [OPTION]…

Options:
-k version Specify kernel version or ‘all’
-c Create a new initramfs
-u Update an existing initramfs
-d Remove an existing initramfs
-t Take over a custom initramfs with this one
-b directory Set alternate boot directory
-v Be verbose
-h This message

首先来分析update-initramfs文件:

  1 #!/bin/sh
  2
  3 STATEDIR=/var/lib/initramfs-tools
  4 BOOTDIR=/boot
  5 CONF=/etc/initramfs-tools/update-initramfs.conf//依赖文件
  6 mode=""
  7 version=""
  8 update_initramfs=yes
  9 backup_initramfs=no
 10
 11 set -e
 12
 #conf为配置文件,进行相关的设置,update_initramfs=yes、backup_initramfs=no
 13 [ -r ${CONF} ] && . ${CONF}
 14
 15 case "$DPKG_MAINTSCRIPT_PACKAGE" in
 16 linux-image-*)
		#INITRAMFS_TOOLS_KERNEL_HOOK长度为0
 17     if [ -z "$INITRAMFS_TOOLS_KERNEL_HOOK" ]; then
 18         # kernel maintainer script called us directly; ignore
 19         # it and let the hook script handle it instead
 20         echo "update-initramfs: deferring update (hook will be called later)"
 21         exit 0
 22     fi
 23     ;;
 24 ?*)
 #参数为1,且是-u更新;--check-supported Check if the running dpkg supports triggers. --no-await No package needs to await the processing.
 25     if     [ $# = 1 ]                       \
 26         && [ x"$1" = x-u ]                  \
 27         && dpkg-trigger --check-supported 2>/dev/null
 28     then
 29         if dpkg-trigger --no-await update-initramfs; then
 30             echo "update-initramfs: deferring update (trigger activated)"
 31             exit 0
 32         fi
 33     fi
 34     ;;
 35 esac
 36
 #帮助日志显示
 37 usage()
 38 {
 39     if [ -n "${1:-}" ]; then
 40         printf "${*}\n\n" >&2
 41     fi
 42     cat >&2 << EOF
 43 Usage: ${0} [OPTION]...
 44
 45 Options:
 46  -k version Specify kernel version or 'all'
 47  -c     Create a new initramfs
 48  -u     Update an existing initramfs
 49  -d     Remove an existing initramfs
 50  -t     Take over a custom initramfs with this one
 51  -b directory   Set alternate boot directory
 52  -v     Be verbose
 53  -h     This message
 54
 55 EOF
 56     exit 1
 57 }
 58
#相关信息的处理,这个结合后续执行过程处理
 59 mild_panic()
 60 {
 61     if [ -n "${1:-}" ]; then
 62         printf "${*}\n" >&2
 63     fi
 64     exit 0
 65 }
 66
 67 panic()
 68 {
 69     if [ -n "${1:-}" ]; then
 70         printf "${*}\n" >&2
 71     fi
 72     exit 1
 73 }
 74
#打印版本号
 75 verbose()
 76 {
 77     if [ "${verbose}" = 1 ]; then
 78         printf "${*}\n"
 79     fi
 80 }
 81
 82 version_exists()
 83 {
 84     [ -e "${STATEDIR}/${1}" ] && [ -e "${initramfs}" ]
 85     return $?
 86 }
 87
 88 set_initramfs()
 89 {
 90     initramfs="${BOOTDIR}/initrd.img-${version}"
 91 }
 92
 93
 #拷贝initrd.img备份
 94 # backup initramfs while running
 95 backup_initramfs()
 96 {
 97     [ ! -r "${initramfs}" ] && return 0
 98     initramfs_bak="${initramfs}.dpkg-bak"
 99     [ -r "${initramfs_bak}" ] && rm -f "${initramfs_bak}"
100     ln -f "${initramfs}" "${initramfs_bak}" \
101         || cp -a "${initramfs}" "${initramfs_bak}"
102     verbose "Keeping ${initramfs_bak}"
103 }
104
#对initramfs_bak的处理,是否进行备份
105 # keep booted initramfs
106 backup_booted_initramfs()
107 {
108     initramfs_bak="${initramfs}.dpkg-bak"
109
110     # first time run thus no backup
111     [ ! -r "${initramfs_bak}" ] && return 0
112
113     # chroot with no /proc
114     [ ! -r /proc/uptime ] && rm -f "${initramfs_bak}" && return 0
115
116     # no kept backup wanted
117     [ "${backup_initramfs}" = "no" ] && rm -f "${initramfs_bak}" && return 0
118
119     # no backup yet
120     if [ ! -r "${initramfs}.bak" ]; then
121         mv -f ${initramfs_bak} "${initramfs}.bak"
122         verbose "Backup ${initramfs}.bak"
123         return 0
124     fi
125
126     # keep booted initramfs
127     boot_initramfs=
128     uptime_days=$(awk '{printf "%d", $1 / 3600 / 24}' /proc/uptime)
129     if [ -n "$uptime_days" ]; then
130         boot_initramfs=$(find "${initramfs}.bak" -mtime +${uptime_days})
131     fi
132     if [ -n "${boot_initramfs}" ]; then
133         mv -f "${initramfs_bak}" "${initramfs}.bak"
134         verbose "Backup ${initramfs}.bak"
135         return 0
136     fi
137     verbose "Removing current backup ${initramfs_bak}"
138     rm -f ${initramfs_bak}
139 }
140
141 # nuke generated copy
142 remove_initramfs_bak()
143 {
144     [ -z "${initramfs_bak:-}" ] && return 0
145     rm -f "${initramfs_bak}"
146     verbose "Removing ${initramfs_bak}"
147 }
148
149
#生成initrd.img文件——重要函数
150 generate_initramfs()
151 {
152     echo "update-initramfs: Generating ${initramfs}"
153     OPTS="-o"
154     if [ "${verbose}" = 1 ]; then
155         OPTS="-v ${OPTS}"
156     fi
#主要做了,mkinitram
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值