Ubuntu 启动卡在:A start job is running for Create Volatile Files and Directories
一、问题现象
服务器重启后,系统启动过程中卡在如下提示界面,长时间无响应,等待数分钟后仍无法进入系统登录界面:
在该界面 按 Esc 键 从图形化启动画面 切换到 详细启动的日志模式下,查看 systemd 实际在执行的启动过程日志输出。发现卡在了如下图所示的过程,提示:A start job is running for Create Volatile Files and Directories
二、问题原因
创建易失性文件和目录(Create Volatile Files and Directories) 这个过程是通过 systemd-tmpfiles-setup.service 这个服务完成的。
该服务会根据 /usr/lib/tmpfiles.d 下的配置文件规则对 /tmp、/var/tmp、以及其他一些文件系统为 tmpfs 等临时目录进行检查和清理。
通过进一步检查发现 /tmp 目录下存在十多万个临时文件,由于 /tmp 挂载在普通磁盘目录中(非 tmpfs),这些临时文件在系统重启后不会自动清理。
systemd 在启动 systemd-tmpfiles-setup.service 服务时,需要遍历并处理 /tmp 目录中的大量文件,所以导致该步骤耗时极长,从而表现为系统启动卡死在该阶段,对外表现为启动一直启动不完成。
三、解决方法
1、在 GRUB 启动项中添加启动参数,绕过systemd,直接让内核启动一个 /bin/bash 作为 PID 1 的紧急 Shell
(1)操作系统启动时 按 ESC 或 Shift 进入 GRUB 启动菜单
(2)选择第一项,这一项是用于正常启动系统的,平时开机啥都不管,其实就是走这个选项。然后 按 e 修改启动参数
修改前:
修改后:
rw init=/bin/bash
- rw:让根文件系统以可写方式挂载
- init=/bin/bash:不启动 systemd(也不启动任何服务),直接把 /bin/bash 当成第一个进程(PID 1)
(3)修改完成后,按 F10 或 crtl + x 会根据当前的启动项启动一个 bash 进程

2、将原有 /tmp 目录重命名进行隔离
mv /tmp /tmp.bak
3、 创建新的空 /tmp 目录并修复权限
mkdir /tmp
chmod 1777 /tmp
chown root:root /tmp
4、重启系统
reboot -f
系统随后可以正常完成启动,等系统正常启动后对原 /tmp.bak 目录中的临时文件进行清理。
四、预防措施
方法一:将 /tmp 挂载为 tmpfs
将 /tmp 挂载为 tmpfs(内存文件系统)后,使其在系统重启后自动清空
方法二:编写定时任务,定期清理临时文件
通过查看 /tmp 目录下大量的临时文件是由哪个进程造成的,然后编写定时任务,定期清理临时文件
浙公网安备 33010602011771号