FreeBSD Ports非交互式定制及配置持久化技术问询
我之前也碰到过一模一样的情况——用make临时传参数安装确实只会在本次生效,根本不会把配置写到持久化的options文件里,所以后续portupgrade才会又弹出配置选择。给你几个靠谱的解决方案:
1. 直接修改Ports配置文件(最推荐)
FreeBSD Ports的持久化配置都存在/var/db/ports/<category>_<port>/options路径下,比如screen对应的就是/var/db/ports/sysutils_screen/options。你可以用Ansible的lineinfile模块直接修改这个文件,确保配置永久生效:
- name: 持久化设置screen的Ports选项 lineinfile: path: /var/db/ports/sysutils_screen/options regexp: '^OPTIONS_UNSET=' line: 'OPTIONS_UNSET=SYSTEM_SCREENRC' create: yes # 配置文件不存在时自动创建
这么操作后,不管是后续portupgrade还是重新执行安装命令,系统都会自动读取这个配置,再也不用重复设置。
2. 用portconfig工具非交互式配置
FreeBSD自带的portconfig工具就是专门用来管理Ports配置选项的,支持非交互式设置,执行后会自动更新options文件:
portconfig -f sysutils/screen OPTIONS_UNSET=SYSTEM_SCREENRC
在Ansible里直接用command模块调用这个命令,先完成配置再执行安装/升级,就能保证配置被持久化保存。
3. 修正portinstall的参数用法
你之前用portinstall --make-args没效果,是因为参数传递的方式不对。portinstall的-m参数才是用来传递make参数的,而且要确保配置能被保存,最好先初始化配置文件:
# 先初始化screen的配置文件 portinstall -c sysutils/screen # 写入需要的配置选项 echo 'OPTIONS_UNSET=SYSTEM_SCREENRC' >> /var/db/ports/sysutils_screen/options # 再执行安装,带上BATCH参数避免交互 portinstall -m "BATCH=YES" sysutils/screen
或者用--分隔符来传递参数,但前提是配置文件已经存在:
portinstall sysutils/screen -- BATCH=YES OPTIONS_UNSET=SYSTEM_SCREENRC
不过这种方式还是不如直接修改options文件可靠,毕竟如果是第一次安装,BATCH=YES可能会跳过配置保存的步骤。
为什么原来的命令不行?
make install clean OPTIONS_UNSET=SYSTEM_SCREENRC BATCH=YES只是在本次编译安装的过程中临时生效,不会把这些选项写入到/var/db/ports下的持久化配置文件里。所以后续portupgrade运行时,会重新读取Ports的默认配置,自然就需要重新选择选项了。
内容的提问来源于stack exchange,提问作者Daniel W.

