[已解决]mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

最大的社区版本,Ubuntu的发源地
回复
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

[已解决]mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

#1

帖子 科学之子 » 2017-01-12 4:06

mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?
虽说有"/usr/share/initramfs-tools/init"
但是这个是"包"的文件,而非用户的配置文件
如果mkinitramfs这个包哪天不知情时更新了,又更新了内核,那我特殊定制的initramfs就失效,然后系统就挂了(无法挂载特殊的root文件系统)...
"特殊的root文件系统"指的就是loop设备或者分区里的特定目录之类
而且不一定是真正的更新,有些时候升级系统,这些包会重装吗?重装了也有可能会覆盖我的init文件导致initramfs失效

debian这种还好说,可以单独弄个内核,一旦挂了就换老内核进去
要是Arch这种疯狂更新,内核太老了恐怕也就进不去系统了吧?
上次由 科学之子 在 2017-01-15 4:28,总共编辑 1 次。
头像
astolia
论坛版主
帖子: 6396
注册时间: 2008-09-18 13:11

Re: mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

#2

帖子 astolia » 2017-01-12 19:52

/usr/share/initramfs-tools/init的代码里写的很清楚,它提供了几处给你放代码的地方,你是没看到还是你改的代码在那几个地方没法放?
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

#3

帖子 科学之子 » 2017-01-14 13:58

astolia 写了:/usr/share/initramfs-tools/init的代码里写的很清楚,它提供了几处给你放代码的地方,你是没看到还是你改的代码在那几个地方没法放?
希望增加参数来进行特殊的挂载
例如将特定目录或镜像文件挂载为root文件系统
想改的是"# Parse command line options"这段

尝试了:

代码: 全选

#!/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

copy_exec /etc/initramfs-tools/init /init
copy_exec /etc/initramfs-tools/init /init2
exit 0
init文件没有被覆盖,但init2成功创建了

要是直接在后面提供的脚本里重新解析参数,感觉效率太低.
Sat Jan 14 14:52:46 CST 2017补充:
您说的那些"放自己代码的地方"指的是?
我这里只看到:

代码: 全选

. /scripts/local
. /scripts/nfs
. /scripts/${BOOT}
可以增加自己的代码(不增加额外参数选项的话,好像编码太麻烦)
但还是希望找到必要时能够完全定制/init脚本的靠谱方法
头像
astolia
论坛版主
帖子: 6396
注册时间: 2008-09-18 13:11

Re: mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

#4

帖子 astolia » 2017-01-14 22:27

所以说英文真的很重要。
你看到 /usr/share/initramfs-tools/scripts/ 下面那些目录的名字,就没点想法?
你看到 /usr/share/initramfs-tools/init 中的run_scripts,就没啥感觉?
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: mkinitramfs在定制initramfs档时如何靠谱的定制/init文件?

#5

帖子 科学之子 » 2017-01-15 4:24

找到原因了:
/usr/share/initramfs-tools/hook-functions:
# $1 = file to copy to ramdisk
# $2 (optional) Name for the file on the ramdisk
# Location of the image dir is assumed to be $DESTDIR
# We never overwrite the target if it exists.
copy_exec() {
结合mkinitramfs的代码,应该直接用类似cp ./init ${DESTDIR}/init这样的命令
man initramfs-tools:
Exported variables
mkinitramfs sets several variables for the hook scripts environment.

MODULESDIR
corresponds to the linux modules dir.

version
is the $(uname -r) linux version against mkinitramfs is run.

CONFDIR
is the path of the used initramfs-tools configurations.

DESTDIR
is the root path of the newly build initramfs.


DPKG_ARCH
allows arch specific hook additions.

verbose
corresponds to the verbosity of the update-initramfs run.

KEYMAP
sets if a keymap needs to be added to initramfs.

MODULES
specifies which kind of modules should land on initramfs. This setting shouldn't be overridden by hook script, but can guide them on how much they need to
include on initramfs.
回复