精华内容
下载资源
问答
  • linux重启系统

    千次阅读 2016-06-16 16:54:26
    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) { /*

    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提供的函数接口复位整个系统。


    参考文章

    1. 基于Linux与Busybox的Reboot命令流程分析
    展开全文
  • [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 ...
    shutdown 命令
    shutdown [选项] 时间
    • -c 取消前一个关机命令
    • -h 关机
    • -r 重启
      shutdown -h now 马上关机

    halt 关机
    poweroff 关机
    init 0 关机
    reboot 重启
    init 6 重启

    系统运行级别
    • 0 关机
    • 1 单用户
    • 2 不完全多用户,不含NFS服务
    • 3 完全多用户
    • 4 未分配
    • 5 图形界面
    • 6 重启
    runlevel 查询系统运行级别:

    N 3
    进入当前级别前的级别 当前级别

    /etc/inittab 修改系统默认运行级别

    id:3:initdefault: 3 为默认级别

    logout 退出登录
    展开全文
  • 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中,关机和重启的指令挺多的,但主要记住三个就够了: 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:40
    shutdown -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...
  • 自己给原来装win10的电脑多装了Linuxc;之后想卸载࿰c;错误地直接用win10删除卷࿰c;然后重启显示error:no such partition,用F12还是能进入win10的。另外࿰c;原本用来装Linux的磁盘就被我放在那里&#...
  • linux 关机、重启、注销命令: 关机命令: shutdown -h now 立刻关机(生产常用) shutdown -h +1 一分钟后关机 ( shutdown -c 可以将刚刚shutdown设置的指令取消取消) halt 立即停止系统,需要人工关闭电源,...
  • dba基础课程-Linux操作系统系统的关机、重启以及登出命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c ...
  • -c:取消前一个关机命令 -h:关机 -r:重启 其他关机命令(不安全) halt poweroff init 0 其他重启命令 reboot (相对安全) init 6 系统运行级别 0 关机 ...
  • 关机重启命令 命令:shutdown [选项] 时间(now,05:30)  选项:  -c:取消前一个关机命令  -h:关机  -r:重启 Eg:shutdown –r 05:30 & ... //设置系统5点30重启,且退出当前系统资源;  
  • Linux 之 关机重启命令一、shutdown[root@localhost~]# shutdown [选项] 时间选项: -c:取消前一个关机命令 -h: 关机 -r:重启例子:[root@localhost~]# shutdown -h now 现在关机 [root@localhost~...
  • 光猫下挂一个机顶盒,机顶盒通过DHCP从光猫获取地址上网,在机顶盒上面切换节目的时候,光猫出现重启,串口打印softirq: huh, entered softirq 3 NET_RX c0348f54 with preempt_count 00000101, exited with ...
  • 常用的关机重启命令 关机命令 poweroff half init 0 shutdown -h now #在指定时间点22:30,定时关机 shutdown -h 22:30 #取消正在运行的关机命令 shutdown -c 重启命令 reboot init 6 shutdown -r now
  • shutdown [选项] 时间 [警告消息] 系统关机  -c 取消前一个 shutdown 命令。... -f 重新启动时不执行 fsck(注:fsck 是 Linux 下的一个检查和修复文 件系统的程序)。  -h 关闭系统所有服务后直接关机。...
  • -c:取消前一个关机命令 -h:关机 -r:重启 其他关机命令 halt poweroff init 0 其他重启命令 reboot init 6 系统运行级别 0 关机 1 单用户 2 不完全用户,不含NFS服务 3 完全多用户 4 未分配 5 图形界面 6 ...
  • 关机命令 1、shutdown关机命令: shutdown - h shutdown命令比较特殊,必须要切换到ROOT用户权限...系统将在5分钟后关机,与Windows不同,在Windows里是代表5秒,Linux中代表5分钟。 shutdown -c 取消倒计时关机/重
  • Linux系统中关机和重启命令: 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:19
    c 取消前一个关机命令-h 关机-r 重启[root@localhost~] # shutdown [选项] 时间可以正常关机 重启一般先断开服务,尽量使用 shutdown -h now其它关机命令:haltpoweroffinit 0重启命令rebootinit 6init 系统运行级别...
  • Linux关机和重启命令

    2019-10-08 16:37:59
    在早期的 Linux 系统中,应该尽量使用 shutdown 命令来进行关机和重启。因为在那时的 Linux 中,只有 shutdown 命令在关机或重启之前会正确地中止进程及服务,所以我们一直认为 shutdown 才是最安全的关机与重启命令...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,078
精华内容 431
关键字:

linuxc重启系统

linux 订阅