Linux 内核手动编译升级

为什么80%的码农都做不了架构师?>>>   hot3.png

   以前升级内核都是通过apt或者yum之类的包管理软件进行升级,最近想把一台机器升级到最新版内核,所以只能手动编译内核进行升级了。作为一名linuxer,内核编译应该是必会的。

获取最新内核

wget 'https://www.kernel.org/pub/linux/kernel/v3.0/linux-3.8.tar.gz'
建立内核编译目录

mkdir -p /opt/linux
mv linux-3.8.tar.gz /opt/linux/
解压

tar zxvf linux-3.8.tar.gz
#结果如下
[root@localhost:/opt/linux]# ls
linux-3.8  linux-3.8.tar.gz

    内核配置被保存在内核源码树下顶级目录的.config文件中,不过刚解压的内核源码树中是没有该文件,需要我们手动建立,我们可以一步一步从头建立,也可以获取当前正在运行的内核的配置。

从头配置内核

make config
Linux 内核手动编译升级_第1张图片

    内核配置程序会逐步跟踪每一个选项,通常有几个选项供你选择,其中大写字母是默认选项,y 直接构建到内核中称为静态模块,n 完全不构建到内核中,m 构建到内核中,成为动态模块,在需要时加载,? 打印提示信息。选择好后,按回车配置下一个选项。

    这时才发现内核选项好几千个,光是按回车都得好长时间,所以换方案,换成该内核版本默认的内核配置,然后在此基础上进行修改。

获取该版本的默认配置

    每个内核版本都有一个默认配置,该配置是基于内核维护者计算机得出的配置。

make defconfig
Linux 内核手动编译升级_第2张图片

    可以看到生成一个默认的内核配置,既然该配置是基于维护者的计算机得出的配出,所以我们需要修改配置以适应我们的计算机。

修改默认的内核配置

make menuconfig
Linux 内核手动编译升级_第3张图片

修改完毕后,保存退出。

开始构建内核

    内核构建系统能够很好的把任务划成小分片,将其分配给不同的处理器,这样就可以充分利用多处理器计算机的全部能力。在使用多线程构建内核时,需要使用-j参数,-j参数的大小一般是两倍的处理器数量,由于我用的Xeon E5504的4核处理器,所以我使用-j8

make -j8
Linux 内核手动编译升级_第4张图片

可以看到新的内核已经生成,并给出了具体目录。

安装新的内核模块

make modules_install
Linux 内核手动编译升级_第5张图片

    以上把新构建好的模块安装到文件系统中,一般内核模块位于/lib/modules/目录下相应的内核版本目录下。

2.6.32-5-amd64目录是目前的内核模块目录,3.8.0目录是编译的内核模块的目录。

安装主内核镜像

make install

安装过程如下:

    1 内核构建系统验证内核是否构建成功。

    2 系统把内核的静态部分安装到/boot目录,并以所购建的内核版本号命名此文件

如果想亲自尝试安装过程,也可以手动安装主内核镜像。

cp arch/x86/boot/bzImage /boot/vmlinuz-3.8.0
cp System.map /boot/System.map-3.8.0
    至此,内核主镜像安装完毕,如果你把所有的模块都是静态的打入内核,下一步就是修改grub配置文件了,如果所有模块不是静态打入内核,就需要生成initrd.img,initrd.img的具体作用参见:http://my.oschina.net/guol/blog/37166

    所以,我门还需要生成initrd.img,可以通过mkinitramfs、update-initramfs等命令生成initrd.img。

先看用update-initramfs的生成法:

update-initramfs -c -k 3.8.0

或者使用mkinitramfs来生成

mkinitramfs -o initrd.img-3.8.0  3.8.0

   由于内核版本过于新,在生成的过程中提示我缺少网卡驱动,可以装好网卡驱动后继续生成(DELL 410)。

修改Grub:/boot/grub/grub.cfg

### BEGIN /etc/grub.d/10_linux ###下面添加
menuentry 'Debian GNU/Linux, with Linux 3.8.0' --class debian --class gnu-linux --class gnu --class os {
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set 1f8c8198-15b9-4ddc-a4f3-e8456e145ed1
        echo    'Loading Linux 3.8.0 ...'
        linux   /boot/vmlinuz-3.8.0 root=/dev/sda1 console=ttyS1,115200 ro  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initrd.img-3.8.0
}
重启机器,收获成果...



参考:https://www.kernel.org/
      https://www.kernel.org/pub/linux/kernel/v3.0/


转载于:https://my.oschina.net/guol/blog/115913

你可能感兴趣的:(Linux 内核手动编译升级)