如何更新远程主机上的 Linux 内核

http://blog.csdn.net/robertsong2004/article/details/47277121

转载至:http://www.tinylab.org/how-to-update-the-linux-kernel-of-a-remote-machine/

注:最近在 linuxsir.org 看到有一篇《能否不重新起動而使用新遍譯好的內核》的帖子,最近楼主自己发了一个解决办法的帖子,叫《用 kexec 迅速切换内核》,即参考资料,另外,也请参考一下资料。这种方法启动更快,但是要求内核高于2.6.23。

问题背景

先来讨论这样一个问题:

假设我们有一台服务器放在网络中心,网络中心却离我们呆的地方比较远,如果想更新这台服务器上的 Linux 内核,那该怎么办呢?类似的问题是:即使网络中心就在我们隔壁,那里头嘈杂的环境确实不应该是人呆的地方,所以还是有必要试图远程更新这台主机上的内核。

也许答案很简单:直接在服务器上安装一个远程 Shell 服务,比如 ssh,在本地登录上去,通过发行版提供的方式或者是自己手动配置和编译一个内核,然后在启动引导管理器 grub 或者 lilo 中修改相关配置,启动新内核就 ok。

如果新编译的内核没有问题,这肯定就是最简单的方式了,但是:如果新编译的内核无法启动,比如 kernel panic,那该怎么办?系统挂在那里,所以这个时候别指望那个 ssh 服务器开着,等你连上解决问题,因为内核都没有起来,这个 ssh 服务就没有办法起来了,这个时候你得给网络中心的老大打个电话或者自己驱车过去跑一趟,而且还得忍受那嘈杂的机房环境,真是够倒霉的 

解决办法

不要灰心,也许这个内核的启动参数会有帮助:

 
1
2
panic=10
 

上述参数告诉内核,在它出现 panic 的10秒后,自动重启(请参考man bootparam)。

如果内核重启解决不了问题呢?你还得重复上面的工作,叫网络中心老大……所以我们还得找其他的解决办法,比如:

在那台服务器之上安装一个虚拟机(比如 Linux+xen, UML, qemu 等,更多请参考资料),在虚拟机之上再安装提供服务的 Linux 操作系统,因此更新内核的操作可以通过虚拟机来完成了,就不存在重启硬件的问题了。

这个基本上是可以解决问题的,但是如果你嫌弃虚拟机可能带来的效率问题,而不想这么干,那该怎么办呢?

还是有办法,因为有专门的工具来引导 Linux 的启动,所以如果启动失败,启动管理器应该可以作一些力所能及的工作。

资料提到 grub 0.95 及以后的版本提供了这样的功能:通过一定的配置,可以告诉 grub,如果它引导的内核启动失败,那么可以让它启动其他的内核。

这里头存在两个比较重要的问题,我们需要告诉 grub:

  • 你想启动哪个内核
  • 你想启动的内核启动失败后应该启动哪个内核

它们可以分别通过 default,fallback 在 grub 配置文件(例如 Ubuntu 中 0.97 版的 Grub 的配置文件为 /boot/grub/menu.lst)中指定:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#
# Sample boot menu configuration file
#
 
# Boot automatically after 30 secs.
timeout 10
 
# By default, boot the first entry.
default 0
 
# Fallback to the second entry.
fallback 1
 
# For booting GNU (also known as GNU/Hurd)
title  Ubuntu/Hardy
root   (hd0,0)
kernel /boot/vmlinuz-2.6.24-16-generic root=/dev/sda1 ro quiet splash
initrd /boot/initrd.img-2.6.24-16-generic
boot
 
title  Ubuntu/Hardy (recover mode)
root   (hd0,0)
kernel /boot/vmlinuz-2.6.24-16-generic root=/dev/sda1 ro single
initrd /boot/initrd.img-2.6.24-16-generic

default 和 fallback 后面跟上内核入口“编号”,即它们的配置信息在上述配置文件中所处的位置,上面的配置文件通过”default 0″把Ubuntu/Hardy 设置为你想启动的内核,通过”fallback 1″把 Ubuntu/Hardy (recover mode) 设置为”你想启动的内核”启动失败后 grub 自动进入的内核。因此,当无法正常进入 Ubuntu/Hardy 内核时,grub 会自动切换到 Ubuntu/Hardy (recover mode)。

这样的话,只要我们的服务器上有一个能够正常启动的内核,并通过”fallback 该内核的入口编号”进行设置,那么我们就可以非常方便地编译新内核,通过”default 新内核的入口编号”设置为默认启动的内核(也可以直接通过”grub-set-deafult 新内核入口编号”命令来配置),并尝试远程启动进入新内核了。即使新内核启动失败,我们也不用担心系统一直挂在那里,因为 grub 会帮我们启动到正常的内核。

关于重启远程服务器的更多办法,建议阅读一下资料;关于虚拟机的更多信息,建议阅读资料;关于 Grub 的详细用法可以参考一下下面的 Grub 相关资料。

参考资料

如何更新远程主机上的 Linux 内核的更多相关文章

  1. 如何在Ubuntu/CentOS上安装Linux内核4.0

    大家好,今天我们学习一下如何从Elrepo或者源代码来安装最新的Linux内核4.0.代号为‘Hurr durr I'm a sheep’的Linux内核4.0是目前为止最新的主干内核.它是稳定版3. ...

  2. ubuntu上编译linux内核

    Linux 编译:1,首先解压缩内核.2,make     ARCH=arm      CROSS_COMPILE=arm-xilinx-linux-gnueabi-       digilent_z ...

  3. 使用yum更新时不升级Linux内核的方法

    RedHat/CentOS/Fedora使用 yum update 更新时,默认会 升级内核 .但有些服务器硬件(特别是组装的机器)在升级内核后,新的内核可能会认不出某些硬件,要重新安装驱动,很麻烦. ...

  4. 运行在TQ2440开发板上以及X86平台上的linux内核编译

    一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...

  5. 嵌入式Linux内核制作【转】

    本文转载自:http://blog.csdn.net/coding__madman/article/details/51291316 1. Linux体系结构 从整体上来分,linux可以分为User ...

  6. linux内核--内存管理(二)

    一.进程与内存     所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...

  7. Linux内核设计与实现(chapter1/2)

    Linux内核简介 Unix从一个失败的多用户操作系统Multics中衍生来的. Unix强大的原因: 简洁 几乎所有的东西都被当做文件来对待,可以通过相同的系统调用接口来进行调用. 因为它是由c语言 ...

  8. Linux内核内存管理-内存访问与缺页中断【转】

    转自:https://yq.aliyun.com/articles/5865 摘要: 简单描述了x86 32位体系结构下Linux内核的用户进程和内核线程的线性地址空间和物理内存的联系,分析了高端内存 ...

  9. Linux内核学习总览

    断断续续学习操作系统已经有大半年时间了,一直想系统地梳理一下. 正好借助<深入Linux内核架构> (Wolfgang Manuere 著,郭旭 译)汇总一下. 首先基础框架篇,Linux ...

随机推荐

  1. 【bzoj3754】Tree之最小方差树 最小生成树

    题目描述 给出一张无向图,求它的一棵生成树,使得选出的所有边的方差最小.输出这个最小方差. 输入 第一行两个正整数N,M 接下来M行,每行三个正整数Ui,Vi,Ci N<=100,M<=2 ...

  2. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  3. hdu 1851(A Simple Game)(sg博弈)

    A Simple Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/65535 K (Java/Others)Tot ...

  4. Skills - CF613B

    Lesha plays the recently published new version of the legendary game hacknet. In this version charac ...

  5. cf 442 div2 F. Ann and Books(莫队算法)

    cf 442 div2 F. Ann and Books(莫队算法) 题意: \(给出n和k,和a_i,sum_i表示前i个数的和,有q个查询[l,r]\) 每次查询区间\([l,r]内有多少对(i, ...

  6. 使用openssl进行文件加密

    #include <iostream> #include <string> #include <stdlib.h> using namespace std; int ...

  7. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

    SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...

  8. ACE线程管理机制-并发控制(1)

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/04/581771.html ACE Lock类属 锁类属包含的类包装简单的锁定机制,比如互斥体 ...

  9. Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) A B C D 水 模拟 构造

    A. Neverending competitions time limit per test 2 seconds memory limit per test 512 megabytes input ...

  10. Educational Codeforces Round 48 (Rated for Div. 2) CD题解

    Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...