ubuntu系统启动卡很久is-system-running显示starting状态的解决方法

我们最近遇到很多系统需要启动很久才能进入系统的情况,实际这个我们如果在有IPMI管理的情况下可以进入虚拟KVM控制台查看到应该是有某些systemd服务异常导致一致卡在某一个阶段导致,当重试多次启动失败以后才会进入系统。

那么我们在系统内可以使用systemctl is-system-running命令查看到非running的状态,检查命令如下

systemctl is-system-running

然后这个命令返回具有以下几种状态

running:系统正常完全启动、运行正常
stopped:系统已关机 / 停止
starting:正在开机启动中
stopping:正在关机 / 重启
maintenance:进入紧急维护 / 单用户模式
degraded:系统启动异常,有服务启动失败

ystemctl is-system-running命令可以精准判定系统整体运行阶段的状态

这个时候我们可以使用systemctl命令查看启动失败的服务

systemctl --failed

查看卡住的服务

journalctl -xb

如果检查系统状态是正常的,也可以进行手动切换is-system-running的状态

systemctl start default.target

执行完可以再次执行命令检查状态是否running

systemctl is-system-running

使用list-jobs可以查看启动卡住的任务

systemctl list-jobs

使用cancel-jobs可以清理卡住等待的任务

systemctl cancel-jobs

另外在最后快要进入系统内必须会执行几个基础任务

multi-user.target(多用户模式)
graphical.target(图形界面)
getty(登录终端)
cron(定时任务)
remote-fs.target(远程文件系统)

无法确定可以使用isolate来快速安全的进行修复

systemctl isolate multi-user.target

如果上述命令无效也可以使用下面一组命令进行强制清理

systemctl cancel-jobs
systemctl daemon-reload
systemctl default

实际在我们遇到这种systemd任务卡住的情况多半发生在一些依赖网络的服务,例如将网络存储服务制作成服务单元在systemd中进行管理,那么这些服务依赖网络,在网络还没有准备好的情况下会一直失败让后重试,往复循环导致启动时间非常就,所以我们在需要对这种服务进行修改,在服务单元的配置中添加以下配置

After=network-online.target
Wants=network-online.target

network.target:网卡启用
network-online.target:网络真正连通、能通外网(推荐用这个)

另外我们也可以对system全局配置进行优化

vim /etc/systemd/system.conf
# 网络联机等待超时,单位秒
DefaultTimeoutStartSec=60s
# 启动任务最大排队等待时长
DefaultStartLimitIntervalSec=30s

然后重载所有服务单元使其生效

systemctl daemon-reload

另外还有其他方式来应对这种问题,就是在服务内添加延迟并设置超时,实际也就是添加一个sleep

[Unit]
After=network-online.target
TimeoutStartSec=20s

[Service]
# 启动前休眠 N 秒
ExecStartPre=/bin/sleep 15

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.sulao.cn/post/1173

评论列表

0%