出现内核错误时重新启动(通过 ssh)的“最后手段”Linux 终端命令?

出现内核错误时重新启动(通过 ssh)的“最后手段”Linux 终端命令?

我有一台小型服务器,上面装有 Ubuntu 10.04;我正在通过另一台计算机操作该服务器ssh,并尝试使用nfs它来共享文件。这基本上是有效的,直到其中一个客户端卸载并且我想nfs-kernel-server在服务器上关闭为止。虽然停止似乎是正确的:

$ sudo service nfs-kernel-server stop
 * Stopping NFS kernel daemon                                                     [ OK ] 
 * Unexporting directories for NFS kernel daemon...                               [ OK ] 

...我确实在日志中得到了类似的内容:

Feb  5 11:50:17 user init: statd main process (3806) killed by KILL signal
Feb  5 11:50:17 user init: statd main process ended, respawning
Feb  5 11:50:17 user init: idmapd main process (3808) killed by KILL signal
Feb  5 11:50:17 user init: idmapd main process ended, respawning
Feb  5 11:50:17 user statd-pre-start: local-filesystems started
Feb  5 11:50:17 user sm-notify[3815]: Already notifying clients; Exiting!
Feb  5 11:50:17 user rpc.statd[3830]: Version 1.1.6 Starting
Feb  5 11:50:17 user rpc.statd[3830]: Flags: 

...这意味着一些与 nfs 相关的进程并不关心我说停止,并再次重生。如果此时我尝试执行sudo service nfs-kernel-server start(再次通过 ssh),该命令会冻结,并且/var/log/syslog我会得到以下信息:

Feb  5 11:43:55 user mountd[2045]: authenticated mount request from 192.168.0.2:1005 for /media/disk (/media/disk)
Feb  5 11:45:19 user mountd[2045]: Caught signal 15, un-registering and exiting.
Feb  5 11:45:19 user kernel: [27428.148368] nfsd: last server has exited, flushing export cache
Feb  5 11:45:19 user kernel: [27428.148431] BUG: Dentry d0bc8b28{i=1f6,n=} still in use (1) [unmount of vfat sdd8]
Feb  5 11:45:19 user kernel: [27428.148473] ------------[ cut here ]------------
Feb  5 11:45:19 user kernel: [27428.148481] kernel BUG at /build/buildd/linux-2.6.32/fs/dcache.c:670!
Feb  5 11:45:19 user kernel: [27428.148491] invalid opcode: 0000 [#1] SMP 
Feb  5 11:45:19 user kernel: [27428.148501] last sysfs file: /sys/devices/system/cpu/cpu1/cpufreq/scaling_cur_freq
...
Feb  5 11:45:19 user kernel: [27428.148807] Call Trace:
Feb  5 11:45:19 user kernel: [27428.148824]  [<c024c780>] ? vfs_quota_off+0x0/0x20
Feb  5 11:45:19 user kernel: [27428.148838]  [<c021d4fc>] ? shrink_dcache_for_umount+0x3c/0x50
Feb  5 11:45:19 user kernel: [27428.148852]  [<c020d090>] ? generic_shutdown_super+0x20/0xe0
...
Feb  5 11:45:19 user kernel: [27428.149511] EIP: [<c021d4a9>] shrink_dcache_for_umount_subtree+0x249/0x260 SS:ESP 0068:ccc6de6c
Feb  5 11:45:19 user kernel: [27428.149631] ---[ end trace 6198103bb62887ac ]---
Feb  5 11:49:53 user init: idmapd main process (838) killed by TERM signal
Feb  5 11:49:53 user init: idmapd main process ended, respawning
Feb  5 11:49:53 user rpc.statd[769]: Caught signal 15, un-registering and exiting.
Feb  5 11:49:53 user init: statd main process ended, respawning
Feb  5 11:49:53 user statd-pre-start: local-filesystems started
Feb  5 11:49:53 user sm-notify[3790]: Already notifying clients; Exiting!
Feb  5 11:49:53 user rpc.statd[3806]: Version 1.1.6 Starting
Feb  5 11:49:53 user rpc.statd[3806]: Flags: 
...

现在,事情是这样的 - 在这个错误发生之后,服务器的ssh服务器(由于某种原因)通常仍然是“活动的”,所以我可以再次登录ssh,并尝试关闭进程(并意识到不可能杀死/usr/sbin/rpc.nfsd 8,这是悬挂的那一个)。

但是 - 如果此时我尝试通过sudo shutdown -r now && exitssh 重新启动,那么该服务器 PC 将开始重新启动过程 - 但会不是完成它;它将下降到终端,转储一些错误消息,然后停留在那里:(

问题是 - 服务器 PC 位于一个非常难以访问的位置,并且必须去那里执行 Alt+SysRq + REISUB 才能正确重新启动(如果内核对该组合键做出反应;否则就会硬断电)确实很困难。

所以我的问题是 - Linux 中是否有一些“硬核重启”命令,它将或多或少地“保证”电脑将重新启动(而不仅仅是挂起/冻结),即使它遇到了内核错误 - 我对此可以通过 发出吗ssh?相当于硬断电(即通过按住电源按钮 10 秒以上来关闭电源)和硬通电?

答案1

为了确保系统无论如何都会重新启动,我总是执行以下顺序:

# echo s > /proc/sysrq-trigger
# echo u > /proc/sysrq-trigger
# echo s > /proc/sysrq-trigger
# echo b > /proc/sysrq-trigger

这要求内核执行以下操作:

  • 块设备的紧急同步
  • 只读挂载所有文件系统
  • 再次同步
  • 强制立即启动;您也可以用于o关机。

参见例如这里用于解释此功能。

答案2

您必须绕过卸载文件系统、停止守护进程等的正常关闭过程。这就是它停止的地方 - 它无法安全地停止进程。您需要的是reboot -f或者 您想要实现的任何目标(例如,poweroff -f某些初始化系统可能会带来自己的命令)。 systemd“强制”功能会跳过常规关闭过程,直接进行硬件重启。

相关内容