问题现象就是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会调用执行的脚本集合,有条件可以试试。