RHEL关机或重启出现的30-dm-shutdown.sh错误

问题现象就是reboot或者shutdown时出现提示信息

“rm: cannot remove /lib/drauct/hooks/shutdown/30-dm-shutdown.sh: Read-only filesystem”

不断的循环输出,服务器卡死在这一过程中。我遇到这个问题是在CentOS7.2版本上,系统安装了OpenStack mitaka版本,今天google此错误,发现在rhel的官方bug管理平台上有很多人都在反应这个错误,虽然在7.3版本中已经进行了修复,但是服务器系统不可能立马更新到,而且内网中也无法update,故而将bugzilla中的一些解决措施摘录于此,以便临时使用,原帖地址是(https://bugzilla.redhat.com/show_bug.cgi?id=1178497):

1.通过systemctl进行强制重启

# systemctl reboot -f -f

2.屏蔽服务

# systemctl mask dracut-shutdown.service

3.强制重启或关机

# sync && reboot -f
# sync && poweroff -f

4.通过dracut自己的配置取消关闭时执行

# dracut -f -o shutdown
或修改配置文件
# cat /etc/dracut.conf.d/shut.conf
omit_dracutmodules+="shutdown"

5.修改dracut的shutdown.sh脚本/usr/lib/dracut/modules.d/99shutdown/shutdown.sh

在 . /lib/dracut-lib.sh  之后添加语句:
if [ "$(stat -c '%T' -f /)" = "tmpfs" ]; then
mount -o remount,rw /
fi

编辑 /usr/lib/dracut/modules.d/99shutdown/module-setup.sh
修改:
inst_multiple umount poweroff reboot halt losetup
为:
inst_multiple umount poweroff reboot halt losetup stat

重新制作initramfs

# dracut --force

取消shutdown的屏蔽

# systemctl unmask dracut-shutdown.service

正常重启。

 

♦在原文中提供了一种获取收集日志的方法,我觉得倒是很有意思,方式如下:

开启dracut debug配置

# mkdir -p /run/initramfs/etc/cmdline.d
# echo "rd.debug rd.break=pre-shutdown rd.break=shutdown" > /run/initramfs/etc/cmdline.d/debug.conf
# touch /run/initramfs/.need_shutdown

修改kernel启动参数,添加如下内容

systemd.log_level=debug systemd.log_target=kmsg log_buf_len=1M enforcing=0

创建/usr/lib/systemd/system-shutdown下创建一个名为debug.sh的脚本,并赋予a+x权限,脚本内容如下:

#!/bin/sh
mount -o remount,rw /
dmesg > /shutdown-log.txt
cat /proc/mounts >> /shutdown-log.txt
cat /proc/self/mountinfo >> /shutdown-log.txt
cat /proc/self/mountinfo >> /shutdown-log.txt
mount -o remount,ro /

按照这里的思路,在/usr/lib/systemd/system-shutdown目录下的脚本应该就是关机是systemd会调用执行的脚本集合,有条件可以试试。

发表评论

电子邮件地址不会被公开。 必填项已用*标注