You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04下AWS CloudFormation cfn-hup默认启动级别启动失败求助

解决Ubuntu 16.04上CloudFormation cfn-hup启动失败(Default-Start无运行级别)的问题

先看你的错误日志,核心问题是systemd在处理cfn-hup服务时,发现/etc/init.d/里有一个无LSB标签的cfn-hup软链接,导致尝试用sysvinit方式启用时失败——Ubuntu 16.04默认用systemd,但你同时配置了sysvinit风格的链接和systemd的service文件,两种服务管理方式冲突,才触发了这个错误。

问题根源拆解

你在UserData里做了这一步:

ln -s /usr/local/bin/cfn-hup /etc/init.d/

这会让系统误以为cfn-hup是一个sysvinit脚本,但这个软链接没有标准的LSB头部(包含Default-Start等必要配置),所以执行systemctl enable时,系统会调用sysv-install工具,进而触发update-rc.d的错误。同时你在cfn-init的services里又配置了sysvinit下的cfn-hup,进一步混淆了服务管理逻辑。

具体修复步骤

1. 删除多余的sysvinit软链接

移除UserData中以下几行,因为我们已经通过cfn-init创建了systemd的service文件,不需要再链接到/etc/init.d/:

ln -s /usr/local/bin/cfn-hup /etc/init.d/
chmod 775 /etc/init.d/cfn-hup
chown root:root /etc/init.d/cfn-hup

2. 修正cfn-init的服务配置

把services下的sysvinit配置改为systemd(适配Ubuntu 16.04的服务管理方式),同时可以删掉commands里手动执行systemctl enable/start的命令,让cfn-init自动处理服务的启用和启动:

修改后的AWS::CloudFormation::Init部分:

'AWS::CloudFormation::Init':
  configSets:
    SetupAppServer:
      - config1
  config1:
    packages:
      apt:
        git: []
        php: []
        apache2: []
        apt-transport-https: []
        ca-certificates: []
        curl: []
        software-properties-common: []
    # 移除手动执行systemctl的命令,交给services配置处理
    files:
      /etc/cfn/cfn-hup.conf:
        content: !Join
          - ''
          - |- [main]
            stack=
          - !Ref 'AWS::StackName'
          - |- region=
          - !Ref 'AWS::Region'
        mode: '000400'
        owner: root
        group: root
      /etc/cfn/hooks.d/cfn-auto-reloader.conf:
        content: !Join
          - ''
          - | [cfn-auto-reloader-hook]
          - | triggers=post.update
          - > path=Resources.LaunchConfig.Metadata.AWS::CloudFormation::Init
          - 'action=/usr/local/bin/cfn-init -v --stack '
          - !Ref 'AWS::StackName'
          - ' --resource AppServerInstanceLaunchConfig --region '
          - !Ref 'AWS::Region'
          - ''
          - | runas=root
      /lib/systemd/system/cfn-hup.service:
        content: !Join
          - ''
          - | [Unit]
          - |+ Description=cfn-hup daemon
          - | [Service]
          - | Type=simple
          - | ExecStart=/usr/local/bin/cfn-hup
          - |+ Restart=always
          - | [Install]
          - WantedBy=multi-user.target
    services:
      sysvinit:
        apache2:
          enabled: true
          ensureRunning: true
      # 添加systemd下的cfn-hup配置,让cfn-init自动管理
      systemd:
        cfn-hup:
          enabled: true
          ensureRunning: true
          files:
            - /lib/systemd/system/cfn-hup.service
            - /etc/cfn/cfn-hup.conf
            - /etc/cfn/hooks.d/cfn-auto-reloader.conf

3. 确认systemd service文件的正确性

你配置的/lib/systemd/system/cfn-hup.service是没问题的,[Install]段的WantedBy=multi-user.target已经对应了systemd的启动级别,不需要手动设置Default-Start。

为什么其他模板不需要手动修改启动级别?

那些模板要么是针对sysvinit系统(比如Ubuntu 14.04及更早)正确配置了带LSB头部的init脚本,要么是像我们上面这样,针对systemd系统纯用systemd service文件管理服务,没有混合两种服务管理方式,所以不会触发这个错误。

你的错误日志参考:
2018-01-17 11:58:36,562 P7799 [INFO] Command 01_enable_cfn_hup
2018-01-17 11:58:36,665 P7799 [INFO] -----------------------Command Output-----------------------
2018-01-17 11:58:36,665 P7799 [INFO] Synchronizing state of cfn-hup.service with SysV init with /lib/systemd/systemd-sysv-install...
2018-01-17 11:58:36,665 P7799 [INFO] Executing /lib/systemd/systemd-sysv-install enable cfn-hup
2018-01-17 11:58:36,665 P7799 [INFO] insserv: warning: script 'cfn-hup' missing LSB tags and overrides
2018-01-17 11:58:36,665 P7799 [INFO] update-rc.d: error: cfn-hup Default-Start contains no runlevels, aborting.
2018-01-17 11:58:36,665 P7799 [INFO] ------------------------------------------------------------
2018-01-17 11:58:36,665 P7799 [ERROR] Exited with error code 1

内容的提问来源于stack exchange,提问作者jasonwaiting

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:51:23