Linux基础之内核编译
内核介绍
- 在我们的Linux世界虽然版本众多,但是内核却不变
- 内核就像我们人类的大脑负责,负责整个系统的运行
- 这次告诉大家怎么编译Linux内核
- 我们普通光盘里面的内核是已经编译好的,如CentOS ,乌班图,Debian,等等
- 他们虽然版本各异,但是他们内核都一样
- 在出厂的时候编译好的内核,已最稳定的方式来编译,所以关闭了很多功能
- 有些功能我们需要用如今天给大家演示Windows的NTFS文件系统Linux有但是只是出厂的时候没打开
- 当然编译系统很浪费时间,他还得看计算机的性能,时间的长短也就决定了你的计算机的速度
- 那我们开始吧
内核编译
- 编译内核我们首先得要内核包吧
- 我们可以去www.kernel.org去下载
- 可以自己选择自己喜欢的内核来编译
- 我今天这里编译的是最新版linux-4.12.tar.xz版本
环境检查
- 想要编译得需要编译环境
- 怎么创建环境
- 那就是你的yum源和开发组工具包
检查yum源
- 关于yum的详细配置就不过多介绍
- 但是我会说说如何检查
- 命令行输入yum clean all 清除缓存
[root@localhost ~]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: base epel
Cleaning up everything
Cleaning up list of fastest mirrors
- 命令行输入yum makecache载入缓存
[root@localhost ~]# yum makecache
Loaded plugins: fastestmirror
base | 3.6 kB 00:00
epel | 4.3 kB 00:00
(1/9): base/group_gz | 155 kB 00:00
(2/9): base/filelists_db | 6.6 MB 00:00
(3/9): base/other_db | 2.4 MB 00:00
(4/9): epel/group_gz | 170 kB 00:00
(5/9): base/primary_db | 5.6 MB 00:00
(6/9): epel/updateinfo | 757 kB 00:00
(7/9): epel/filelists_db | 7.6 MB 00:00
(8/9): epel/other_db | 2.1 MB 00:00
(9/9): epel/primary_db | 4.6 MB 00:00
Determining fastest mirrors
Metadata Cache Created
- 如果中间出现错误要好好检查自己的源是否配置完成
- 还是你用的源有问题等等
开发组包安装或检查
- 开发组包很重要有GCC等等出名的开发包软件
- 首先检查你的电脑是否已安装开发包组,Development Tools 这个包组
- 命令行输入yum grouplist
- 下面显示我电脑已经安装开发包组
- Installed Groups 已安装的组 的意思
- 其他包组不过多介绍
- 那怎么看电脑有没有安装包组,那就是看Development Tools 就可以了
[root@localhost ~]# yum grouplist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Available Environment Groups:
Minimal Install
Compute Node
Infrastructure Server
File and Print Server
MATE Desktop
Basic Web Server
Virtualization Host
Server with GUI
GNOME Desktop
KDE Plasma Workspaces
Development and Creative Workstation
Installed Groups: <<<<<<<<<<已安装的包组
Development Tools
Available Groups:
CIFS file server
Compatibility Libraries
Console Internet Tools
Desktop
Desktop Platform
Desktop Platform Development
Eclipse
Educational Software
Electronic Lab
FCoE Storage Client
Fedora Packager
General Purpose Desktop
Graphical Administration Tools
Haskell
Legacy UNIX Compatibility
Messaging Client Support
Messaging Server Support
Milkymist
MySQL Database client
MySQL Database server
NFS file server
Network Storage Server
SNMP Support
Scientific Support
Security Tools
Server Platform
Server Platform Development
Smart Card Support
Storage Availability Tools
System Administration Tools
System Management
TeX support
TurboGears application framework
Virtualization
Web-Based Enterprise Management
Xfce
iSCSI Storage Client
Done
开始编译
- 由于我是用虚拟机演示
- 需要上传内核,上次命令rz 这个命令是自己用包安装才有
- 编译的时候千万要注意下自己的硬盘的容量用df 查看下
- 因为编译的时候会出现很大量的数据流动会到达10G以上
- 当然你功能越多内核就越大,看个人习惯
编译事项
- 内核编译很多东西是和硬件相关的如、网卡、声卡、硬盘,文件系统驱动,大部分是很多和硬件打交道的功能和模块
- 这里我们是用菜单选项来编译,我们在他的基础之上来编译
- 在出厂的时候没有NTFS,我们就在他的基础上加个NTFS就可以了
- 那怎么加,我们可以参考当前操作系统
- 那怎么参考,在/boot下面有个vmlinuz-3.10.0-327.el7.x86_64,我们可以参考他来编译,在他现有的模板之上加个NTFS,或等等功能
- [root@localhost ~]# ll /boot/vmlinuz-3.10.0-327.el7.x86_64
-rwxr-xr-x. 1 root root 5156528 Nov 19 2015 /boot/vmlinuz-3.10.0-327.el7.x86_64
- 那为什么要用他,因为这个模板对应的有个配置文件在/boot/config 里面,里面给我们说了当前那些模块打到里面去了,那些没有打进去
[root@localhost ~]# ll /boot/config-3.10.0-327.el7.x86_64
-rw-r--r--. 1 root root 126426 Nov 19 2015 /boot/config-3.10.0-327.el7.x86_64
- 注意他的功能启用方式有两种,一种是打到/boot/vmlinu文件里面去,还有些不是常用的我们可以放到/lib/modules里面,这里目录里面也放了一些驱动模块
- 编译内核你可以放到核心文件里也可以放在模块里面,还有一个选择就是不要这个功能
编译开始
- 那我们开始
- 我的内核包已经上传到我虚拟机里面的家目录里面
[root@localhost ~]# ls
anaconda-ks.cfg linux-4.12.tar.xz
- 我们来看下他的大小用
ll -h
命令
[root@localhost ~]# ll
total 96868
-rw-------. 1 root root 1147 Jul 5 17:13 anaconda-ks.cfg
-rw-r--r--. 1 root root 99186576 Jul 11 08:47 linux-4.12.tar.xz
4.12.tar.xz
- 我们先解压内核包用
tar xfv
命令,由于界面过长截图最后一张
[root@localhost ~]# tar xfv linux-4.12.tar.xz
linux-4.12/virt/kvm/arm/vgic/vgic-v3.c
linux-4.12/virt/kvm/arm/vgic/vgic.c
linux-4.12/virt/kvm/arm/vgic/vgic.h
linux-4.12/virt/kvm/async_pf.c
linux-4.12/virt/kvm/async_pf.h
linux-4.12/virt/kvm/coalesced_mmio.c
linux-4.12/virt/kvm/coalesced_mmio.h
linux-4.12/virt/kvm/eventfd.c
linux-4.12/virt/kvm/irqchip.c
linux-4.12/virt/kvm/kvm_main.c
linux-4.12/virt/kvm/vfio.c
linux-4.12/virt/kvm/vfio.h
linux-4.12/virt/lib/
linux-4.12/virt/lib/Kconfig
linux-4.12/virt/lib/Makefile
linux-4.12/virt/lib/irqbypass.c
- 解压完毕以后可以用ls命令查看
[root@localhost ~]# ls
anaconda-ks.cfg linux-4.12 linux-4.12.tar.xz
- 还可以用du -sh命令查看下解压的文件有多大
[root@localhost ~]# du -sh linux-4.12
842M linux-4.12
编译功能模块
- 在/boot/config下 这是我们生成功能模块的配置文件,在里面已经启动了一些功能,或没有启用的
[root@localhost boot]# ls /boot/config-3.10.0-327.el7.x86_64
/boot/config-3.10.0-327.el7.x86_64
- 用vim命令打开,我们进里面去看下
[root@localhost boot]# vim /boot/config-3.10.0-327.el7.x86_64
# Automatically generated file; DO NOT EDIT.
# Linux/x86_64 3.10.0-327.el7.x86_64 Kernel Configuration
#
CONFIG_64BIT=y
CONFIG_X86_64=y
CONFIG_X86=y
CONFIG_INSTRUCTION_DECODER=y
CONFIG_OUTPUT_FORMAT="elf64-x86-64"
CONFIG_ARCH_DEFCONFIG="arch/x86/configs/x86_64_defconfig"
CONFIG_LOCKDEP_SUPPORT=y
CONFIG_STACKTRACE_SUPPORT=y
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
CONFIG_MMU=y
- y的意思是打到核心文件里面,那就是打到vmlinuz里面去了
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_KERNEL_GZIP=y
# CONFIG_KERNEL_BZIP2 is not set
# CONFIG_KERNEL_LZMA is not set
# CONFIG_KERNEL_XZ is not set
# CONFIG_KERNEL_LZO is not set
-
#
号开头的就是功能没启动
CONFIG_TCP_CONG_ADVANCED=y
CONFIG_TCP_CONG_BIC=m
CONFIG_TCP_CONG_CUBIC=y
CONFIG_TCP_CONG_WESTWOOD=m
CONFIG_TCP_CONG_HTCP=m
CONFIG_TCP_CONG_HSTCP=m
CONFIG_TCP_CONG_HYBLA=m
CONFIG_TCP_CONG_VEGAS=m
CONFIG_TCP_CONG_SCALABLE=m
CONFIG_TCP_CONG_LP=m
CONFIG_TCP_CONG_VENO=m
CONFIG_TCP_CONG_YEAH=m
CONFIG_TCP_CONG_ILLINOIS=m
CONFIG_TCP_CONG_DCTCP=m
- m 的就是打到模块里
- 我们这篇是要添加NTSF,我们看看NTFS是什么状态
CONFIG_FAT_FS=m
CONFIG_MSDOS_FS=m
CONFIG_VFAT_FS=m
CONFIG_FAT_DEFAULT_CODEPAGE=437
CONFIG_FAT_DEFAULT_IOCHARSET="ascii"
# CONFIG_NTFS_FS is not set 《《《没有启用状态
#
# Pseudo filesystems
#
CONFIG_PROC_FS=y
CONFIG_PROC_KCORE=y
CONFIG_PROC_VMCORE=y
CONFIG_PROC_SYSCTL=y
- 那接下来我们来如何利于这个模板,编译安装
- 说简单来就是直接把他,复制到我们刚才解压缩的路径
- 用cp命令,注意复制的时候一定要改名
[root@localhost boot]# cp /boot/config-3.10.0-327.el7.x86_64 /root/linux-4.12/.config
- 复制和改名成功以后接下来我们用比较直观的菜单来定制内核选项
- 首先切入我们解压的那个文件夹下面,然后执行命令
make menuconfig
- 执行这个命令需要安装ncurses-devel 才能打开菜单 ,因为他是个图形界面
- 安装玩以后在执行mek menuconfig 命令,但是你用的是CRT或者是Xshell必须全屏不然打不开,这个软件
- 带箭头的就表示他地下有子菜单
- 在菜单里面
*
就是打到核心里面吗,M
开头就是模块里面,什么都没有表示没有启用 - 接下来我们来改文件系统,选择File systems项
- 进入以后我们选择DOS/FAT/NT选项以后在回车
- 回车以后在里面选择NTFS选项,用空格来切换来选择打到核心还是模块里面
- 我们已模块的方式来进行
- 选择完毕以后用EXC退出,如果你改动了他会提示你保存按yes就可以了
- 这时候配置文件已经存到新的.config文件里面去了
- 如果有兴趣可以比较下,这里不过多操作
- 接下来正在进入编译过程中,时间很长,耐心等待,可能编译过程中,会遇到很多问题,耐心解决
- 进入编译过程之前,我们先看下我们几颗CPU,用lscpu
[root@localhost linux-4.12]# lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 1
Socket(s): 4
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 58
Model name: Intel(R) Core(TM) i5-3320M CPU @ 2.60GHz
Stepping: 9
CPU MHz: 2594.107
BogoMIPS: 5188.21
Hypervisor vendor: VMware
Virtualization type: full
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 3072K
NUMA node0 CPU(s): 0-3
- 我一共4颗,4线程的方式,为了计算速度我会全用上
- 用命令make -j 4 ,但是一定要在我们解压的文件夹里面运行
- 好了走起
[root@localhost linux-4.12]# make -j 4
- 运气不好没有第一次成功,他的意思是缺少包,那我们就安装
HOSTCC scripts/sign-file
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: No such file or directory
#include <openssl/opensslv.h>
- 他说的是缺少 openssl-devel这个包
- [root@localhost linux-4.12]# yum -y install openssl-devel
好了在走起
编译完成我好像花了快30分钟
IHEX2FW firmware/emi26/firmware.fw
IHEX2FW firmware/emi26/bitstream.fw
IHEX2FW firmware/emi62/loader.fw
IHEX2FW firmware/emi62/bitstream.fw
IHEX2FW firmware/emi62/spdif.fw
IHEX2FW firmware/emi62/midi.fw
H16TOFW firmware/edgeport/boot.fw
H16TOFW firmware/edgeport/boot2.fw
H16TOFW firmware/edgeport/down.fw
H16TOFW firmware/edgeport/down2.fw
IHEX2FW firmware/whiteheat_loader.fw
IHEX2FW firmware/whiteheat.fw
IHEX2FW firmware/keyspan_pda/keyspan_pda.fw
IHEX2FW firmware/keyspan_pda/xircom_pgs.fw
- 接下来开始安装运行
make modules_install
[root@localhost linux-4.12]# make modules_install
- 接下他们会安装在/lib/modules里面,看里面已经有了两个内核,这只是文件复制还没有安装
[root@localhost linux-4.12]# ls /lib/modules
3.10.0-327.el7.x86_64 4.12.0-1.0-li-linux
- 接下来我们要把内核拷贝到我们/boo下,同时修改grub文件
- 执行命令make intsall
[root@localhost linux-4.12]# make install
sh ./arch/x86/boot/install.sh 4.12.0-1.0-li-linux arch/x86/boot/bzImage \
System.map "/boot"
- 我来重启运行reboot
第一条就是我编译的内核
编译内核完成
虽然内核编译内核完成但是我们系统里面的程序不知道支持新内核不
所以生产过程中,升级内核需要谨慎