执行预安装和配置脚本的顺序

执行预安装和配置脚本的顺序

是否可以强制某个预安装脚本在另一个脚本之前运行?

我想要做的是在我的私人存储库中创建一个包,它在安装时会首先询问一些问题,然后才会解压其他包(它所依赖的包)。

例如,假设我想创建my-mysql依赖于mysql-server-5.5标准存储库的包。我希望在用户键入apt-get install my-mysqlformy-mysql.preinst之前运行mysql-server-5.5.preinst(这样它就可以debconf-set-selections自动生成 root 密码并阻止 mysql-server 包以交互方式询问)。

我可以不将任何依赖项放在my-mysql包中,并手动运行两个命令来完成此操作:

apt-get install my-mysql
apt-get install mysql-server-5.5

但我需要它只使用一个命令 ( apt-get install my-mysql)。我尝试使用Pre-depends第三个包(可执行配置)和Dependsmysql-server-5.5,但它似乎mysql-server-5.5.preinst总是先运行。有没有办法改变这种情况并强制我的包 preinst 在它之前运行?

作为替代方法,apt-get install mysql-server-5.5由于 dpkg 锁定问题,我也无法从 postinst 运行,并且希望以比锁定像这样的临时解决方案。

更新:正如评论中提到的,似乎 mysql-server 包中也有.config脚本(带有关联.templates),它们甚至在脚本之前执行.preinst,所以我也需要对它们进行排序。

答案1

我已经找到办法了。

因此,为了让单一apt-get install my-mysql工作如所述,我必须做几件事:

  • 制作my-mysql软件包,使其预先依赖my-mysql-config并依赖于mysql-server
  • 创建附加包my-mysql-config,该包预先依赖debconf并包含my-mysql-config.templates脚本my-mysql-config.config(其中包括设置密码,以便 mysql-server-5.5 不会要求输入密码),其中包含如下代码:

    . /usr/share/debconf/confmodule
    db_set  mysql-server/root_password "$PW"
    db_fset mysql-server/root_password seen true
    
    db_set  mysql-server/root_password_again "$PW"
    db_fset mysql-server/root_password_again seen true
    
  • 还包含执行并创建配置文件my-mysql-config.preinst的代码db_getmysql-server 启动

  • 在安装并运行 mysql-server 后,您可以使用my-mysql包脚本来运行您想要的东西。.postinst

Debconf 程序员教程在那里有很大的帮助,就像使用export DEBCONF_DEBUG=developerset -x在脚本中进行调试一样。

另外两个耗时的调试问题是确保 config/preinst/postinst 脚本不会向 STDOUT 输出任何内容(因为它会以奇怪而有趣的方式破坏 debconf),以及db_stop如果你做类似的事情invoke-rc.d mysql restart(否则你的 apt-get 会卡住,甚至不会响应Ctrl+ C

相关内容