一、前言
两个重要的命令: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