Linux内核编译生成bzImage的详细方法步骤及错误解决
什么是bzImage
bzImage诚如其名是big image的意思,不是压缩的image。
在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到这些文件的建立等操作。那么这些文件是怎么产生的呢?以vmlinuz为例。
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。
vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,手动拷贝到/boot目录下面。zImage适用于小内核的情况,它的存在是为了向后的兼容性。
二是内核编译时通过命令make bzImage创建,然后手动拷贝至/boot目录下。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
内核文件中包含一个微型的gzip用于解压缩内核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个 640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行 时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
环境准备
虚拟机联网
刚安装的虚拟机及映像可能会产生连不上网的情况。解决办法:
-
进入VMware Workstation,编辑->虚拟网络编辑器,将VMnet8设置为NAT模式
-
虚拟机->设置,保证网络适配器配置也为NAT模式
winscp的使用
WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端。同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。
官网下载并安装。若初始连不上虚拟机,则检查远程虚拟机是否安装并开启了ssh服务(下述3.1)
搭建编译环境
-
进入root:
su
-
进入用户所在文件夹:
cd /home/siqi
-
常规配置及网络测试
-
虚拟机安装ssh服务
//检测是否已安装ssh服务,输入以下命令 #ssh localhost //出现以下提示则为未安装: ssh: connect to host localhost port 22: Connection refused (ssh:连接到主机本地主机端口22:连接被拒绝) #apt-get install openssh-server //启动服务 #/etc/init.d/ssh start //检查服务是否启动成功 #ps -e|grep ssh
-
winscp连接到虚拟机
输入主机名为虚拟机ip地址,端口号默认22,输入用户名和密码
-
-
在虚拟机新建kernel文件夹,并将linux内核解压到当前文件夹
#cd kernel #tar -zxvf linux-5.11-rc1
-
将内核中的默认x86配置到根目录
#cd linux-5.11-rc1/arch/x86/configs #cp x86_64_deconfig /home/siqi/kernel/linux-5.11-rc1/.config #cd ../../../
-
x86编译前准备:如果不执行以下指令,会有“command not found”的错误提示
#apt-get install make #apt-get install gcc #apt-get install flex #apt-get install bison #apt-get install libcurses-dev #apt-get install libssl-dev #apt-get install libelf-dev
-
基于文本选单的图形化内核配置:
make menuconfig
,会在源码的顶层目录下面生成一个.config文件可能出现的错误有
- 一些安装包没有提前安装上;(根据错误提示依次安装)
- 终端窗口太小导致错误;
正常执行会出现下面的菜单框:选择
64-bit kernel
并点击save
保存若没有这一步直接进行下一步,则会出现无尽的选择情况(需要不断按回车)
-
最后执行
make bzImage -j8
即可。 -
编译完成。找到编译生成的bzImage,拷贝出kernel
#cd linux-5.11-rc1/arch/x86/boot/ #ls 会看到bzImage在这儿啦 #cp bzImage /home/siqi/
-
附:arm交叉编译命令
make distclean ARCH-arm64 make mrproper ARCH-arm64 make dtbs ARCH-arm64 cp arch/arm64/configs/defconfig .config cp /home/siqi/ft2000plus_defconfig .config make menuconfig ARCH-arm64 make Image ARCH-arm64 -j8 CROSS_COMPILE-aarch64-none-linux-gnu- make uImage ARCH-arm64 -j8 CROSS_COMPILE-aarch64-none-linux-gnu-