console-setup 导致 apt-get update 挂起

console-setup 导致 apt-get update 挂起

我想在第一次加载时自动在 EC2 实例上安装 apache2。我使用的是基本 Ubuntu 16.04 LTS 映像:

ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20180522 (ami-a4dc46db)

我的用户数据脚本如下:

#!/bin/bash
apt-get update && apt-get upgrade -y
apt-get install apache2 -y

登录后,耐心等待,我发现 apache2 没有安装。由于此脚本以 root 身份运行,因此我无法看到输出,就像我手动运行它一样,因此我将所有输出重定向到日志文件。

#!/bin/bash
apt-get update && apt-get upgrade -y &>/var/log/erich

这是挂起的部分,等待用户输入:

Setting up console-setup (1.108ubuntu15.4) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
Configuring console-setup
-------------------------


  1. ARMSCII-8         8. ISIRI-3342    15. ISO-8859-16  22. ISO-8859-8
  2. CP1251            9. ISO-8859-1    16. ISO-8859-2   23. ISO-8859-9
  3. CP1255            10. ISO-8859-10  17. ISO-8859-3   24. KOI8-R
  4. CP1256            11. ISO-8859-11  18. ISO-8859-4   25. KOI8-U
  5. GEORGIAN-ACADEMY  12. ISO-8859-13  19. ISO-8859-5   26. TIS-620
  6. GEORGIAN-PS       13. ISO-8859-14  20. ISO-8859-6   27. UTF-8
  7. IBM1133           14. ISO-8859-15  21. ISO-8859-7   28. VISCII

Encoding to use on the console:

我可以apt-mark hold将此包作为权宜之计,但这不是解决方案。我该如何设置默认编码类型?

答案1

在 Google 上搜索我的脚本遇到的一些 debconf 错误,其他 问题 已回答所有这些似乎都有一个共同点——通过 SSH 进行远程执行。这似乎也是 Amazon 在配置实例时执行用户数据脚本的方法。

这些 SSH 连接似乎无法访问某些环境变量或默认配置数据,因此明确设置这些有助于减少错误。将DEBCONF_FRONTEND=noninteractive环境变量设置为建议在这里而在其他问题上,在这个特定情况下却不起作用。

debconf-set-selections在第一次调用之前,我能够使用来更新配置数据库,从而为控制台设置包设置默认编码(这导致我的脚本挂起)apt-get。它以文件作为参数,因此可以将配置行写入临时文件,然后删除:

echo "console-setup   console-setup/charmap47 select  UTF-8" > encoding.conf
debconf-set-selections encoding.conf
rm encoding.conf
apt-get update && apt-get upgrade -y

此外,我可以通过添加到export TERM=xterm脚本顶部来抑制许多 debconf 警告。

答案2

您应该在脚本顶部设置以下环境变量:export DEBCONF_FRONTEND=noninteractive;有关进一步的解释,请参阅手册(请参阅http://manpages.ubuntu.com/manpages/artful/man7/debconf.7.html)。另外,为了确保万无一失,请将-qq开关添加到apt-get

请注意,我使用 ,export因为它会将环境变量传播到当前环境和子环境(与符号相反VAR=VALUE)。这是必要的,因为apt-get将产生其他进程来配置软件包。

这是 Bash 手册页的摘录:

export [-fn] [name[=word]] ... export -p 提供的名称被标记为自动导出到后续执行的命令的环境。如果给出了 -f 选项,则名称引用函数...

希望这可以帮助!

相关内容