定制内核和编译内核
转至http://www.360doc.com/content/22/0719/08/65840031_1040410733.shtml
定制kernel,就需要手动编译内核
一、准备开发环境
1.包组:Development Tools,Server Platform Development
2.包:ncurses和ncurses-dev
3.如果是图形界面,则需要额外的GTK或者QT的包组。
二、获取目标主机上硬件设备的相关信息
1.获取cpu的信息
cat /proc/cpuinfo
方法2:
# 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: 4 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 142 Model name: Intel(R) Core(TM) i5-8350U CPU @ 1.70GHz Stepping: 10 CPU MHz: 1896.003 BogoMIPS: 3792.00 Hypervisor vendor: KVM Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 6144K NUMA node0 CPU(s): 0-3
方法3:详细显示cpu信息。
# yum install x86info
# x86info -a
2.获取pci总线上的设备信息
显卡,网卡,鼠标,键盘都是连的pci总线。
详细-v:显示。
# lspci 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02) 00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II] 00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01) 00:02.0 VGA compatible controller: VMware SVGA II Adapter 00:03.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service 00:05.0 Multimedia audio controller: Intel Corporation 82801AA AC'97 Audio Controller (rev 01) 00:06.0 USB controller: Apple Inc. KeyLargo/Intrepid USB 00:07.0 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 08) 00:08.0 Ethernet controller: Intel Corporation 82540EM Gigabit Ethernet Controller (rev 02) 00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02) # lspci -v
3.获取usb设备信息
# lsusb Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
4.获取磁盘设备信息
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 60G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 59G 0 part ├─centos-root 253:0 0 37G 0 lvm / ├─centos-swap 253:1 0 3.9G 0 lvm [SWAP] └─centos-home 253:2 0 18.1G 0 lvm /home sdb 8:16 0 1G 0 disk sdc 8:32 0 1G 0 disk sdd 8:48 0 1G 0 disk └─sdd1 8:49 0 900M 0 part sr0 11:0 1 1024M 0 rom
5.获取全部硬件设备信息,类似windows的资源管理器
# hal-device
三、编译内核
1.获取内核源代码
本机内核是linux-3.10.0
# wget /pub/linux/kernel/v3.x/linux-3.10.67.tar.xz
内源码放在/usr/src下
# tar xf linux-3.10.67.tar.xz -C /usr/src # ls /usr/src debug kernels linux-3.10.67
当缺少设备驱动时,我们要编译内核源码,以获得驱动。
为什么编译内核就能获得驱动呢?
内核的源代码,基本包括所有硬件的驱动,但是我们安装的系统也是编译出来的,编译的时候没有包含你要用的驱动的源代码。所以只要在编译的时候,把你要的驱动的源代码包含进来,编译出来的系统就支持你要的设备了。当然前提是,kernel源代码里有你要的驱动的代码,如果没有,那么再怎么编译内核也得不出你要得驱动。
这时编译会去找/usr/src/linux目录,但是没有此目录,只有/usr/src/linux-3.10.67目录,不要直接修改linux-3.10.67目录的名字,建立符号链接。
理由是:当又有新版本进来时,直接把符号链接改到新版本上就号,这样一来,新版本不好用了,修改符号链接,还能执行旧的
# ln -sv linux-3.10.67 linux 'linux’ -> 'linux-3.10.67’ # ls linux arch CREDITS drivers include Kbuild lib mm REPORTING-BUGS security usr block crypto firmware init Kconfig MAINTAINERS net sound virt Documentation fs ipc kernel Makefile
目录arch里,基本包括了所有架构的cpu:
# ls linux-3.10.67/arch/ alpha arm64 c6x h8300 Kconfig metag mn10300 powerpc sh um xtensa arc avr32 cris hexagon m32r microblaze openrisc s390 sparc unicore32 arm blackfin frv ia64 m68k mips parisc score tile x86
目录block里,块设备驱动:
# ls linux-3.10.67/block/ blk-cgroup.c blk.h blk-map.c blk-tag.c cfq-iosched.c ioctl.c
目录crypto里,加密算法:
# ls linux-3.10.67/crypto 842.c asymmetric_keys cipher.c eseqiv.c md4.c scatterwalk.c twofish_common.c
目录Documentation里,kernel的文档
# ls linux-3.10.67/Documentation/
目录drivers里,基本上包括了所有设备的驱动:
# ls linux-3.10.67/drivers/ accessibility cdrom dma hwmon isdn message parisc pwm
firmware目录,主板固件驱动:
# ls linux/firmware/ 3com bnx2x emi26 korg ositech tehuti
fs目录,文件系统:
# ls linux/fs 9p block_dev.c drop_caches.c fs_struct.c Kconfig.binfmt ocfs2
init目录,/sbin/init程序:
# ls linux/init calibrate.c do_mounts.h do_mounts_md.c initramfs.c Kconfig Makefile version.c do_mounts.c do_mounts_initrd.c do_mounts_rd.c init_task.c main.c noinitramfs.c
ipc目录,进程间通信:
# ls linux/ipc compat.c ipcns_notifier.c Makefile mqueue.c msgutil.c sem.c syscall.c util.h compat_mq.c ipc_sysctl.c mq_sysctl.c msg.c namespace.c shm.c util.c
kernel目录,内核自己
lib目录,库
mm目录目录:内存管理
net目录目录:网络管理
samples目录:实例
scripts目录:编译时,安装时使用的脚本
security目录:安全相关
sound目录:声音相关
tools目录:工具
virt目录:虚拟化
# ls linux/virt/ kvm
2.获取make帮助:
cd进入/usr/src/linux目录,执行make help
获取帮助
.... Configuration targets: config - Update current config utilising a line-oriented program nconfig - Update current config utilising a ncurses menu based program menuconfig - Update current config utilising a menu based program ....
3.配置kernel安装选项,类似源码安装里的configure
# make menuconfig
如果没有安装ncurses-devel会出错误:unable to find the ncurses library,所以需要安装:yum install ncurses-devel
执行成功后,显示menu界面:
配置内核安装选项过于复杂,找个模板使用,centos的/boot目录下有个文件:config-3.10.0-957.el7.x86_64。
此文件是,centos做的配置文件,可以参考使用。
make menuconfig执行后,会在/usr/src/linux/目录下生成.config文件,所以我们不做make menuconfig了,直接把config-3.10.0-957.el7.x86_64复制从.config文件。
# cp /boot/config-3.10.0-957.el7.x86_64 /usr/src/linux/.config # cat /usr/src/linux/.config CONFIG_64BIT=y CONFIG_X86_64=y CONFIG_X86=y CONFIG_INSTRUCTION_DECODER=y CONFIG_OUTPUT_FORMAT="elf64-x86-64" ...
支持在已有的.config文件基础上进行修改
- make config:基于命令行,以遍历的方式配置。(输入yes,no等)
- make menuconfig:基于curesesd的文本界面配置
- make gconfig:基于GTK桌面开发环境的界面进行配置
- make xconfig:基于QT桌面开发环境的界面进行配置
支持从0开始配置
- make defconfig:基于内核为目标平台提供的默认配置为模板进行配置
- make allnoocnfig:所以选项均为no
centos做的配置文件,有很多是用不到的,再使用make menuconfig,关闭不要的功能。
# make menuconfig
[ ]:不编译,不使用
[M]:编译成模块,不编译进内核
[*]:直接编译进kernel
(1)修改cpu:
默认的cpu驱动是General-x86-64。是通用的驱动,但不能完全发挥酷睿cpu的作用,所以修改成core(酷睿)
修改后:
(2)添加release号
(3)关闭蓝牙功能:
(4)添加ntfs文件系统的驱动(默认配置里是没有添加ntfs的):
4.编译内核:make [-j #]
。多核心可以使用-j,指定编译线程的数量,编译非常消耗cpu。
由于编译很花时间,如果是远程连接的话,ssh万一断开了,编译一般就前功尽弃了。所以要利用一个叫screen的工具。
screen的好处是,当ssh断开后,编译还会继续。
- screen安装:
yum install screen
- 在终端上打开一个screen:
screen
- 从screen回到终端:ctrl+a d
- 查看打开了哪些scren:
screen -ls
- 从终端回到screen:
screen -r screen号
- 终止screen:在screen里面输入:
exit
使用screen编译:
# screen
进入了screen,在screen里执行编译
# make -j 4
编译时,可以退出screen。在终端使用'htop'看看,发现cpu基本都是100%运行了。
部分编译:当发现漏了某个模块或者驱动等,我们不需要重新编译,只需编译缺少的部分,部分编译的方法:
-
只编译某子目录种的相关代码:
# cd /usr/src/linux # make path/to/dir/
只编译一个特定的模块
-
# cd /usr/src/linux # make path/to/dir/file.ko
file其实是xxxx.c,要把.c去掉,换成.ko
交叉编译:目标平台与当前正在执行编译所在的平台不同。
# make ARCH=arch_name
获取特定目标平台的使用帮助:
# make ARCH=arch_name help
arch_name可以是arm等。
如何在执行过编译的内核源码目录上做重新编译?
需要先执行清理:
- make clean:删除编译生成的绝大多数文件,但保留.config
- make mrproper:删除编译生成的绝大多数文件,也删除.config
- make distclean:基本删除所有。
然后从新编译。
5.安装模块(modules):make modules_instal
模块安装完成后,在目录/lib/modules里多出3.10.67-1.el7。【-1.el7】是在配置编译选项是加的。
# ll /lib/modules total 4 drwxr-xr-x. 8 root root 4096 Feb 23 09:18 3.10.0-957.el7.x86_64 drwxr-xr-x. 3 root root 91 Feb 23 22:14 3.10.67-1.el7
6.安装内核:make install
。会自动生成grub
安装成功后,在boot目录生成了:
kernel:vmlinuz-3.10.67-1.el7
ramdisk:initramfs-3.10.67-1.el7.img
各种映射:System.map-3.10.67-1.el7
# ls -lrt /boot -rw-r--r--. 1 root root 4776128 Feb 23 22:18 vmlinuz-3.10.67-1.el7 -rw-r--r--. 1 root root 2828222 Feb 23 22:18 System.map-3.10.67-1.el7 lrwxrwxrwx. 1 root root 27 Feb 23 22:18 vmlinuz -> /boot/vmlinuz-3.10.67-1.el7 lrwxrwxrwx. 1 root root 30 Feb 23 22:18 System.map -> /boot/System.map-3.10.67-1.el7 -rw-------. 1 root root 48045100 Feb 23 22:19 initramfs-3.10.67-1.el7.img
并且在/etc/grub2.cfg文件里多出了:
### BEGIN /etc/grub.d/10_linux ### menuentry 'CentOS Linux (3.10.67-1.el7) 7 (Core)' --class cento
7.重启系统选择新的内核。