从事Linux环境下开发工作,一直想自己玩,纯属好奇,没撒背景。
zg-Linux etc # uname–a(查看内核)
Linux zg-Linux 4.4.0-21-generic #37-UbuntuSMP Mon Apr 18 18:34:49 UTC 2016 i686 i686 i686 GNU/Linux
zg-Linux etc # lsb_release–a(查看发布版本)
No LSB modules are available.
Distributor ID: LinuxMint
Description: Linux Mint 18 Sarah
Release: 18
Codename: sarah
从https://www.kernel.org/pub/linux/kernel/网站上下载最新的Linux内核***(我下载的是linux-4.14.tar.xz,也就是4.14稳定版内核的第一个版本,不是最新)。
打开终端,更改用户权限为root。
输入mv linux-4.14.tar.gz /usr/src ------> 目的是把下载的内核源代码文件移到/usr/src目录;
输入cd /usr/src切换到该目录下;
输入tar zxvf linux-4.14.tar.gz ------> 目的是解压内核包,生成的源代码放在linux-4.14目录下;
说明:如果下载的是的.tar.xz文件:先用 xz -d xxx.tar.xz 将 xxx.tar.xz解压成 xxx.tar 然后,再用 tar xvfxxx.tar来解包。
参考:http://blog.csdn.net/rheostat/article/details/7614451
输入cd linux-4.14,切换到该目录下;
输入cp /boot/config-,然后按下Tab键,系统会自动填上该目录下符合条件的文件名,然后继续输入 .config ------> 目的是使用在boot目录下的原配置文件。
简单说明:
1. 操作可能需要root权限;
2. 将下载的内核源代码拷贝到/usr/src目录并解压;
3. 将当前系统的配置拷贝至待编译的源代码目录,也就是以当前系统的配置编译源代码。
配置内核的方法很多,主要有如下几种:
1. #make menuconfig //基于ncurse库编制的图形工具界面
2. #make config //基于文本命令行工具,不推荐使用
3. #make xconfig //基于X11图形工具界面
4. #make gconfig //基于gtk+的图形工具界面
由于对Linux还处在初学阶段,所以选择了简单的配置内核方法,即make menuconfig。在终端输入make menuconfig,等待几秒后,终端变成图形化的内核配置界面。进行配置时,大部分选项使用其缺省值,只有一小部分需要根据不同的需要选择。
对每一个配置选项,用户有三种选择,它们分别代表的含义如下:
<*>或[*]——将该功能编译进内核
[]——不将该功能编译进内核
[M]——将该功能编译成可以在需要时动态插入到内核中的代码
说明:笔者输入make menuconfig 后并没有配置其他内核编译配置(因为还不是特别懂),只是试了下此流程,是可用的。
这步是时间最长的一个步骤,一般在2个小时左右。
编译内核只需在终端(目录:/usr/src/linux-4.14) 输入:
make
(或者make –jN 以多线程编译,N代表线程数,我的电脑是双核4线程,N填了4),然后等待编译的完成。
make –j4 modules_install
make –j4 install
zglinux src # mkinitramfs-o /boot/initrd.img-4.14.0
Warning: No support for locale: en_US.utf8
man解释:
The mkinitramfs script generates an initramfs image. The initramfs is a compressed cpio archive.The archive can be used on a different box of the same arch with the corresponding Linux kernel. mkinitramfs is meant foradvanced usage. On your local box update-initramfs calls mkinitramfs with therelevant parameters. update-initramfs keepssha1sum of generated initramfs. It takes care to generate backups andeventually runs the bootloader.
翻译:产生initramfs映像文件,它是一个压缩了cpio包。
zglinux src # update-initramfs-c -k 4.14.0
update-initramfs: Generating/boot/initrd.img-4.14.0
W: Possible missing firmware/lib/firmware/radeon/si58_mc.bin for module radeon
…
Warning: No support for locale: en_US.utf8
man解释:
The update-initramfs script manages your initramfs images on your local box. Itkeeps track of(记录、追踪) the existing initramfs archives in /boot. There are three modes of operation create,update or delete. You must at leastspecify one of those modes.
zglinux src # update-grub2
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zerovalue when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.14.0
Found initrd image: /boot/initrd.img-4.14.0
Found linux image:/boot/vmlinuz-4.4.0-21-generic
Found initrd image:/boot/initrd.img-4.4.0-21-generic
Found memtest86+ image: /memtest86+.elf
Found memtest86+ image: /memtest86+.bin
done
man解释:
update-grub is a stub for runninggrub-mkconfig -o /boot/grub/grub.cfg to generate a grub2 config file.
用vim搜索出有4.14.0的启动项,到目前为止应该都成功了。
说明:以上步骤涉及到linux的启动流程,请参阅其他文章:
https://www.linuxidc.com/Linux/2017-08/146494.htm
zglinux grub # uname -a
Linux zglinux 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 1818:34:49 UTC 2016 i686 i686 i686 GNU/Linux
zhaogang@zglinux ~ $ uname -a
Linux zglinux 4.14.0 #1 SMP Sun Mar 11 00:22:41 CST 2018 i686i686 i686 GNU/Linux
实验成功,之前安装的ssh、smb等都不受影响。整个过程断断续续花费5个小时左右,包括第一次/usr目录爆满导致重新分区装系统。
报错1(重装系统前):
In file included fromscripts/kconfig/mconf.c:23:0:
scripts/kconfig/lxdialog/dialog.h:38:20:fatal error: curses.h: No such file or directory
报错2(装系统后):
zglinux linux-4.14 # make menuconfig
HOSTCC scripts/basic/fixdep
*** Unable to find the ncurses libraries orthe
*** required header files.
*** 'make menuconfig' requires the ncurseslibraries.
***
*** Install ncurses (ncurses-devel) and tryagain.
***
scripts/kconfig/Makefile:202: recipe fortarget 'scripts/kconfig/dochecklxdialog' failed
make[1]: ***[scripts/kconfig/dochecklxdialog] Error 1
Makefile:548: recipe for target'menuconfig' failed
make: *** [menuconfig] Error 2
原因:
两个错误原因相同,因为make menuconfig是基于ncurse库编制的图形工具界面来配置内核,其依赖ncurses库,所以需要安装ncurses包:
apt-get installlibncurses5-dev
报错:
scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h: No suchfile or directory
原因:
编译环境没有openssl库,所以需要安装ssl包:
apt-get installlibssl-dev
报错:
scripts/basic/fixdep.c:105:23:fatal error: sys/types.h: No such file or directory
原因:
没有安装libc的库:
apt-get installlibc6-dev
WARNING: modpost: Found 1 sectionmismatch(es).
To see full details build your kernel with:
'make CONFIG_DEBUG_SECTION_MISMATCH=y'
Filesystem Size Used Avail Use% Mounted on
udev 1.9G 0 1.9G 0% /dev
tmpfs 392M 22M 371M 6% /run
/dev/sda1 14G 13G 623M 96% / ----快用爆了,最后还是用爆了
最后---确实把/目录用爆了,编译终止,看来要重新换系统了
ld: final link failed: No space left ondevice
scripts/Makefile.modpost:125: recipe fortarget 'drivers/net/wireless/p54/p54common.ko' failed
make[1]: ***[drivers/net/wireless/p54/p54common.ko] Error 1
此问题导致我重新分区重新装了一次系统,具体分区、重装linux系统请参考其他文章。此处只贴上我重装的分区:
zhaogang@zglinux ~ $ df -h
Filesystem Size Used Avail Use% Mounted on
udev 1.8G 0 1.8G 0% /dev
tmpfs 392M 6.5M 386M 2% /run
/dev/sda1 19G 3.0G 15G 18% /
/dev/sda7 138G 14G 118G 11% /usr
tmpfs 2.0G 876K 2.0G 1% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda6 9.1G 411M 8.2G 5% /boot
/dev/sda8 290G 82M 275G 1% /home
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 392M 16K 392M 1% /run/user/1000
http://blog.csdn.net/chengwei920412/article/details/39379499
http://blog.csdn.net/MingLLu/article/details/50960576
http://blog.csdn.net/fjt19900921/article/details/8316481
http://blog.csdn.net/qq_34247099/article/details/50949720
1) 内核编译配置页面(网上抄来,我的也一样,忘记截图了)
2) 重启后的系统内核---没骗你的。