-
linux重启系统
2016-06-16 16:54:26linux kernel panic之后重启panic_timeout//linux-xxx/kernel/panic.c core_param(panic, panic_timeout, int, 0644);void panic(const char *fmt, ...) { ... if (panic_timeout > 0) { /*linux kernel panic之后重启
panic_timeout
//linux-xxx/kernel/panic.c core_param(panic, panic_timeout, int, 0644); void panic(const char *fmt, ...) { ... if (panic_timeout > 0) { /* * Delay timeout seconds before rebooting the machine. * We can't use the "normal" timers since we just panicked. */ printk(KERN_EMERG "Rebooting in %d seconds..", panic_timeout); for (i = 0; i < panic_timeout * 1000; i += PANIC_TIMER_STEP) { touch_nmi_watchdog(); if (i >= i_next) { i += panic_blink(state ^= 1); i_next = i + 3600 / PANIC_BLINK_SPD; } mdelay(PANIC_TIMER_STEP); } } if (panic_timeout != 0) { /* * This will not be a clean reboot, with everything * shutting down. But if there is a chance of * rebooting the system it will be rebooted. */ emergency_restart(); } ... }
只要设置模块参数panic大于0就能调用emergency_restart重启了
core_param(panic, panic_timeout, int, 0644);
通过core_param定义的参数在/sys/module/kernel/parameters目录下
通过module_param定义的参数在/sys/module/xxx/parameters目录下emergency_restart
emergency_restart machine_emergency_restart //include/asm-generic/emergency_restart.h machine_restart //arch/rlx/kernel/reset.c _machine_restart <==> bsp_machine_restart //bsp/setup.c reboot_by_wdt //drivers/watchdog/rtsx_wdt.c
最终调用了watchdog中的函数来复位整个系统。
reboot命令
reboot来自busybox,看看reboot的一步步调用流程是怎样的
reboot时打印消息:The system is going down NOW !! Sending SIGTERM to all processes. Sending SIGKILL to all processes. Please stand by while rebooting the system. Restarting system.
用户空间调用流程
在busybox代码init/init.c中有这么一段,
int init_main(int argc UNUSED_PARAM, char **argv) { ... bb_signals(0 + (1 << SIGUSR1) /* halt */ + (1 << SIGTERM) /* reboot */ + (1 << SIGUSR2) /* poweroff */ , halt_reboot_pwoff); signal(SIGQUIT, restart_handler); /* re-exec another init */ ...
单独拿出halt_reboot_pwoff和restart_handler
static void halt_reboot_pwoff(int sig) { const char *m; unsigned rb; /* We may call run() and it unmasks signals, * including the one masked inside this signal handler. * Testcase which would start multiple reboot scripts: * while true; do reboot; done * Preventing it: */ reset_sighandlers_and_unblock_sigs(); run_shutdown_and_kill_processes(); m = "halt"; rb = RB_HALT_SYSTEM; if (sig == SIGTERM) { m = "reboot"; rb = RB_AUTOBOOT; } else if (sig == SIGUSR2) { m = "poweroff"; rb = RB_POWER_OFF; } message(L_CONSOLE, "Requesting system %s", m); pause_and_low_level_reboot(rb); /* not reached */ } /* Handler for QUIT - exec "restart" action, * else (no such action defined) do nothing */ static void restart_handler(int sig UNUSED_PARAM) { struct init_action *a; for (a = init_action_list; a; a = a->next) { if (!(a->action_type & RESTART)) continue; /* Starting from here, we won't return. * Thus don't need to worry about preserving errno * and such. */ reset_sighandlers_and_unblock_sigs(); run_shutdown_and_kill_processes(); #ifdef RB_ENABLE_CAD /* Allow Ctrl-Alt-Del to reboot the system. * This is how kernel sets it up for init, we follow suit. */ reboot(RB_ENABLE_CAD); /* misnomer */ #endif if (open_stdio_to_tty(a->terminal)) { dbg_message(L_CONSOLE, "Trying to re-exec %s", a->command); /* Theoretically should be safe. * But in practice, kernel bugs may leave * unkillable processes, and wait() may block forever. * Oh well. Hoping "new" init won't be too surprised * by having children it didn't create. */ reset_sighandlers_and_unblock_sigs(); run_shutdown_and_kill_processes(); #ifdef RB_ENABLE_CAD /* Allow Ctrl-Alt-Del to reboot the system. * This is how kernel sets it up for init, we follow suit. */ reboot(RB_ENABLE_CAD); /* misnomer */ #endif if (open_stdio_to_tty(a->terminal)) { dbg_message(L_CONSOLE, "Trying to re-exec %s", a->command); /* Theoretically should be safe. * But in practice, kernel bugs may leave * unkillable processes, and wait() may block forever. * Oh well. Hoping "new" init won't be too surprised * by having children it didn't create. */ //while (wait(NULL) > 0) // continue; init_exec(a->command); } /* Open or exec failed */ pause_and_low_level_reboot(RB_HALT_SYSTEM); /* not reached */ } }
我们看到他们都会有调用这两个函数:reset_sighandlers_and_unblock_sigs();以及 run_shutdown_and_kill_processes();,我们重点关注如下这个函数:
static void run_shutdown_and_kill_processes(void) { /* Run everything to be run at "shutdown". This is done _prior_ * to killing everything, in case people wish to use scripts to * shut things down gracefully... */ run_actions(SHUTDOWN); message(L_CONSOLE | L_LOG, "The system is going down NOW!"); /* Send signals to every process _except_ pid 1 */ kill(-1, SIGTERM); message(L_CONSOLE | L_LOG, "Sent SIG%s to all processes", "TERM"); sync(); sleep(1); kill(-1, SIGKILL); message(L_CONSOLE, "Sent SIG%s to all processes", "KILL"); sync(); /*sleep(1); - callers take care about making a pause */ }
终于看到了上面的打印信息:The system is going down NOW !! 以及Sending SIGTERM to all processes.
同时在上面的halt_reboot_pwoff和restart_handler中都会调用这样一个函数:static void pause_and_low_level_reboot(unsigned magic) { pid_t pid; /* Allow time for last message to reach serial console, etc */ sleep(1); /* We have to fork here, since the kernel calls do_exit(EXIT_SUCCESS) * in linux/kernel/sys.c, which can cause the machine to panic when * the init process exits... */ pid = vfork(); if (pid == 0) { /* child */ reboot(magic); _exit(EXIT_SUCCESS); } while (1) sleep(1); }
这里最终调用了内核提供的reboot系统调用。
linux内核空间调用流程
//reboot系统调用 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd, void __user *, arg) { switch (cmd) { case LINUX_REBOOT_CMD_RESTART: kernel_restart(NULL); ... } kernel_restart kernel_restart_prepare blocking_notifier_call_chain(&reboot_notifier_list, SYS_RESTART, cmd); syscore_shutdown ops->shutdown() machine_restart //arch/rlx/kernel/reset.c _machine_restart <==> bsp_machine_restart //bsp/setup.c reboot_by_wdt //drivers/watchdog/rtsx_wdt.c
可以实现在驱动中通过register_reboot_notifier向reboot_notifier_list注册回调函数,这样在系统reboot的时候回调函数就会被调用到了
也可以在驱动中实现syscore_ops函数,这样在系统reboot的时候也会被调用到
当调用到machine_restart就和上面发生panic时调用的流程一样了,最终通过watchdog提供的函数接口复位整个系统。参考文章
-
[Linux C]重启设备(系统)
2014-08-25 11:15:17说白了其实很简单,看代码: [zcm@c #17]$cat r.c #include int main( void ) { puts("reboot now");...[zcm@c #18]$make ...gcc -g -o r r.c ...[zcm@c #19]$ ...执行下"./r",系统将会重启!说白了其实很简单,看代码:
[zcm@c #17]$cat r.c #include <sys/reboot.h> int main( void ) { puts("reboot now"); reboot(RB_AUTOBOOT); return 0; } [zcm@c #18]$make gcc -g -o r r.c [zcm@c #19]$
执行下"./r",系统将会重启! -
Linux 关机重启命令
2019-07-26 18:17:35-c 取消前一个关机命令 -h 关机 -r 重启 halt 关机 poweroff 关机 init 0 关机 reboot 重启 init 6 重启 系统运行级别 0 关机 1 单用户 2 不完全多用户,不含NFS服务 3 完全多用户 4 未分配 5 ... -
linux关机重启命令
2019-12-30 23:55:14-c 取消前一个关机命令 -h 关机 -r 重启 其他关机命令 halt poweroff init 0 其他 重启命令 reboot init 6 系统运行级别 0 关机 1 单用户 2 不完全多用户,不含NFC服务 3 完全多用户 4 未分配 5 图形界面 6 重启 ...关机重启命令 shutdown [选项] 时间 -c 取消前一个关机命令 -h 关机 -r 重启 其他关机命令 halt poweroff init 0 其他 重启命令 reboot init 6 系统运行级别 0 关机 1 单用户 2 不完全多用户,不含NFC服务 3 完全多用户 4 未分配 5 图形界面 6 重启 修改系统默认运行级别 cat /etc/inittab id:3:initdefault 查询系统运行级别 runlevel 退出登录 logout
-
Linux系统关机和重启操作
2020-08-15 03:20:47在linux中,关机和重启的指令挺多的,但主要记住三个就够了: shutdown poweroffreboot 其中shutdown可以完成一些功能: 格式: [shutdown][-krhc][时间] -k:发送一些警告,不是真的要关机 -r:重启 -h:... -
Linux关机重启命令
2021-01-20 17:27:45-c:取消前一个关机命令 -h:关机 -r:重启 其他关机命令: halt、poweroff、init 0 重启命令 reboot、init 6 系统运行级别 0 关机 1 单用户 2 不完全多用户,不含NFS服务 3 完全多用户 4 未分配 5 图形界面 6 ... -
linux关机重启指令
2021-01-05 22:25:35-c取消前一个关机指令 2.其他关机 halt poweroff init () 3.重启 init 6 reboot 4.init的系统级别 0 关机 1 单用户 最小模式 2 不完全多用户 代码行 但是不能nfs 3.完全多用户 代码行 4.未分配 未使用 5.图形... -
linux 关机重启命令
2019-07-31 22:50:40shutdown -c 取消前一个关机命令 shutdown -r 重启 // 其他关机命令 halt poweroff init 0 // 其他重启命令 reboot init 6 init (系统运行级别) 0 关机 1 单用户 2 不完全多用户,不含nfs服务... -
Linux关机重启指令
2017-06-23 15:17:18关机:init 0 [使用Linux的运行级别]haltpoweroffshutdown -h [系统会发出广播信息,显示即将关机时间]shutdown -c [取消关机计划]重启:rebootinit 6 转载于:https://blog.51cto.com/12951189/1941329... -
双系统电脑错误删除Linux后重启显示error:no such partition该如何解决?
2021-02-08 13:54:59自己给原来装win10的电脑多装了Linuxc;之后想卸载c;错误地直接用win10删除卷c;然后重启显示error:no such partition,用F12还是能进入win10的。另外c;原本用来装Linux的磁盘就被我放在那里... -
【Linux 运维】linux系统关机、重启、注销命令
2018-06-19 23:52:00linux 关机、重启、注销命令: 关机命令: shutdown -h now 立刻关机(生产常用) shutdown -h +1 一分钟后关机 ( shutdown -c 可以将刚刚shutdown设置的指令取消取消) halt 立即停止系统,需要人工关闭电源,... -
Linux操作系统:系统的关机、重启以及登出命令
2016-07-14 09:34:00dba基础课程-Linux操作系统:系统的关机、重启以及登出命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c ... -
Linux 关机与重启命令,系统运行级别
2020-05-21 16:02:47-c:取消前一个关机命令 -h:关机 -r:重启 其他关机命令(不安全) halt poweroff init 0 其他重启命令 reboot (相对安全) init 6 系统运行级别 0 关机 ... -
Linux的关机重启命令及系统级别
2017-07-19 11:20:49关机重启命令 命令:shutdown [选项] 时间(now,05:30) 选项: -c:取消前一个关机命令 -h:关机 -r:重启 Eg:shutdown –r 05:30 & ... //设置系统5点30重启,且退出当前系统资源; -
Linux 之 关机重启命令 加 系统运行级别
2018-02-15 17:55:17Linux 之 关机重启命令一、shutdown[root@localhost~]# shutdown [选项] 时间选项: -c:取消前一个关机命令 -h: 关机 -r:重启例子:[root@localhost~]# shutdown -h now 现在关机 [root@localhost~... -
一次linux系统异常重启分析过程
2019-02-13 19:05:03光猫下挂一个机顶盒,机顶盒通过DHCP从光猫获取地址上网,在机顶盒上面切换节目的时候,光猫出现重启,串口打印softirq: huh, entered softirq 3 NET_RX c0348f54 with preempt_count 00000101, exited with ... -
Linux系统中常用的关机重启命令
2021-03-08 11:01:31常用的关机重启命令 关机命令 poweroff half init 0 shutdown -h now #在指定时间点22:30,定时关机 shutdown -h 22:30 #取消正在运行的关机命令 shutdown -c 重启命令 reboot init 6 shutdown -r now -
Linux系统管理_主题01 :初识Linux_1.7 关闭和重启Linux_shutdown
2019-10-01 02:19:44shutdown [选项] 时间 [警告消息] 系统关机 -c 取消前一个 shutdown 命令。... -f 重新启动时不执行 fsck(注:fsck 是 Linux 下的一个检查和修复文 件系统的程序)。 -h 关闭系统所有服务后直接关机。... -
Linux系统学习——关机重启及用户操作
2020-02-23 15:45:49-c:取消前一个关机命令 -h:关机 -r:重启 其他关机命令 halt poweroff init 0 其他重启命令 reboot init 6 系统运行级别 0 关机 1 单用户 2 不完全用户,不含NFS服务 3 完全多用户 4 未分配 5 图形界面 6 ... -
Linux — “linux关机重启命令(CentOS版)”
2021-02-25 00:52:11关机命令 1、shutdown关机命令: shutdown - h shutdown命令比较特殊,必须要切换到ROOT用户权限...系统将在5分钟后关机,与Windows不同,在Windows里是代表5秒,Linux中代表5分钟。 shutdown -c 取消倒计时关机/重 -
七.Linux系统中关机和重启命令
2016-04-22 23:20:59Linux系统中关机和重启命令: shutdown命令 格式:shutdow [选项] 时间 选项: -c:取消前一个关机命令 -h:关机(因为在工作中,我们都是远程服务器的,一旦关机了就很难开机,因此禁止此操作) -r:重启 eg:... -
Linux下重启Oracle
2009-11-12 10:08:09一定要切换到Oracle用户下进行重启,su - oracle,这样oracle相关命令才会有效 1. 停应用层的各种程序 2. 停Oralce的监听进程 #lsnrctl stop 3. 在独占的系统用户下,备份控制文件: #sqlplus /nolog SQL&... -
linux关机重启命令.txt
2015-08-23 19:56:19c 取消前一个关机命令-h 关机-r 重启[root@localhost~] # shutdown [选项] 时间可以正常关机 重启一般先断开服务,尽量使用 shutdown -h now其它关机命令:haltpoweroffinit 0重启命令rebootinit 6init 系统运行级别... -
Linux关机和重启命令
2019-10-08 16:37:59在早期的 Linux 系统中,应该尽量使用 shutdown 命令来进行关机和重启。因为在那时的 Linux 中,只有 shutdown 命令在关机或重启之前会正确地中止进程及服务,所以我们一直认为 shutdown 才是最安全的关机与重启命令...