OpenWrt 用 dd 命令刷系统时候,刷新完成后 reboot 命令报 ‘Input/output error’。查了资料估计是硬盘锁死,内核无法从磁盘上读取二进制程序 /sbin/reboot 和 /sbin/shutdown 来执行,所以命令失败。最后使用 /proc/sys/kernel/sysrq 和 /proc/sysrq-trigger 给内核发送命令去重启设置。

先说一下,让设备重启方法,输入下面两个命令就可以让设备重启了。

echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger

让我们细看这个命令

/proc/sys/kernel/sysrq 和 /proc/sysrq-trigger

当 Linux 系统遇到一些紧急情况时,需要执行一些特殊的操作来解决问题。这些操作通常可以通过按下 Alt + SysRq 组合键来触发系统请求(system request)。但是,在某些情况下,无法使用组合键,例如系统已经崩溃或无法进入交互式 shell。这时,可以使用 /proc/sysrq-trigger 文件来触发系统请求。同时,/proc/sys/kernel/sysrq 参数可以用来控制系统请求按键的响应方式。

在本文中,我们将介绍 /proc/sys/kernel/sysrq/proc/sysrq-trigger,并说明如何使用它们来解决系统问题。

/proc/sys/kernel/sysrq

/proc/sys/kernel/sysrq 是一个内核参数,用于控制系统请求按键的响应方式。通过修改该参数的值,可以启用或禁用不同的系统请求按键。该参数的默认值为 1,表示所有的系统请求按键都是启用的。

以下是 /proc/sys/kernel/sysrq 参数的取值及其含义:

  • 0:禁用所有系统请求按键
  • 1:启用所有系统请求按键(默认)
  • 2:启用仅 REISUB 组合键(用于安全地重新启动系统)
  • 3:启用仅 REISU 组合键(用于安全地卸载系统)

要修改 /proc/sys/kernel/sysrq 参数的值,可以使用以下命令:

echo <value> > /proc/sys/kernel/sysrq

其中,<value> 为参数的取值。

/proc/sysrq-trigger

/proc/sysrq-trigger 是一个特殊的文件,用于触发系统请求。通过写入不同的字符序列到该文件中,可以触发不同的系统请求。

以下是 /proc/sysrq-trigger 文件支持的字符序列及其含义:

  • h:显示系统请求的帮助信息
  • b:立即重启系统
  • c:立即关闭系统
  • e:向所有进程发送 SIGTERM 信号,以关闭所有进程并结束会话
  • f:立即强制结束所有进程
  • i:向所有进程发送 SIGKILL 信号,以立即结束所有进程
  • k:向指定进程 ID 发送 SIGTERM 信号,以关闭该进程
  • l:显示系统锁的状态
  • m:显示当前内存使用情况
  • n:显示所有已经分配的内存页的数量
  • o:向所有进程发送 SIGKILL 信号,以立即结束所有进程,但不重启系统
  • p:显示当前进程的状态
  • q:立即强制结束所有

使用方法也是

echo <value> > /proc/sysrq-trigger

其中,<value> 为参数的取值。