之前在CentOS7 上源码编译安装过新内核,不过有次在6上编译就遇到问题了.
提示错误如下1
make[2]: *** [scripts/sign-file] Error 1 make[1]: *** [scripts] Error 2 make
搞了好久,好像是参数设置不正确。1
error: #error Sorry, your compiler is too old - please upgrade it
好像是说gcc版本过低。
去epel源找了一下,已经是最新版了啊~
查看了下之前CentOS7的gcc版本,是gcc-4.8.5,再去一查这个CentOS6的gcc版本,是gcc-4.4.7,可能就差在这几个小版本上了。
于是升级gcc版本就成了当务之急。
那就源码编译安装个新版的gcc吧。(后来朋友说可以直接把CentOS7上gcc的rpm包直接拿来用的,未尝试)
编译安装gcc
gcc有三个依赖包gmp、mpfr、mpc,要首先编译安装(虽然原本就有,不过如果编译高版本gcc,这三个依赖包不装新版本的话也会报错)
先去下载好三个依赖包源码包及gcc源码包1
2
3
4
5
6mkdir /data/gcc #创建目录/data/gcc
cd /data/gcc
wget https://gmplib.org/download/gmp/gmp-6.1 .tar.xz #下载gmp6
wget http://www.mpfr.org/mpfr-current/mpfr-3.1 .tar.gz #下载mpfr3
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0 .tar.gz #下载mpc1
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.3 /gcc-6.3 .tar.gz #下载gcc6
再挨个编译安装三个依赖包(注意这三个依赖包也有依赖关系,需先安装gmp,再安装mpfr,之后再装mpc)
gmp
先来第一个,编译安装装gmp1
2
3
4tar -xJf gmp-6.1.2.tar.xz gmp-6.1.2
cd gmp-6.1.2
./configure --prefix=/usr/local/gcc/gmp --build=x86_64-linux
make && make install
这当时有报错
error: could not find a working compiler
当时没有加参数 –build=x86_64-linux,加上之后成功解决,参考: 原文地址. http://www.voidcn.com/article/p-zsgyngma-ug.html
mpfr
之后编译安装mpfr1
2
3
4tar -xJf mpfr-3.1.5.tar.xz mpfr-3.1.5
cd mpfr-3.1.5
./configure --prefix=/usr/local/gcc/mpfr --with-gmp=/usr/local/gcc/gmp
make && make install
然后编译安装mpc1
2
3
4tar -xzf mpc-1.0.3.tar.gz mpc-1.0.3
cd mpc-1.0.3
./configure --prefix=/usr/local/gcc/mpc --with-gmp=/usr/local/gcc/gmp -with-mpfr=/usr/local/gcc/mpfr
make && make install
gcc
之后也没有报错,那就开始编译安装gcc。1
2
3
4tar xvf gcc-6.3.0.tar.gz
cd gcc-6.3.0
./configure --prefix=/usr/local/gcc --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gcc/gmp --with-mpfr=/usr/local/gcc/mpfr --with-mpc=/usr/local/gcc/mpc
make && make install
gcc中途有几次报错,不过也都解决了。
错误提示[1]:1
make: *** [sub-make] Error 2
显示这个问题编译不过去。这是因为找不到gmp依赖包导致的,可是我明明装了依赖包的,看来是路径设置有问题,因为当时我是把这三个依赖包都装在gcc下,不过在编译gcc的时候忘记改依赖包的地址了。
错误提示[2]:1
configure: error: cannot compute suffix of object files: cannot compile
解决办法是:
在/etc/profile里面加上以下内容:1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gcc/mpc-0.9/lib:/usr/local/gcc/gmp-5.0.1/lib:/usr/local/gcc/mpfr-3.1.0/lib
然后重新加载配置文件/etc/profile1
source /etc/profile
添加变量
/usr/local/lib #这个是默认系统的变量
/usr/local/gmp/lib
/usr/local/mpfr/lib
/usr/local/mpc/lib
/usr/local/mysql/lib
/usr/local/openssl/lib #openssl变量
添加保存后记得更新动态库的缓存:
ldconfig -v
备份系统默认的gcc版本
1 | mv /usr/bin/gcc /usr/bin/gcc-bak |
建新的gcc软连接
1 | ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc |
编译安装linux kernel 5.2.9
高高兴兴cd linux-5.2.9,进入解压好的内核目录,做好.config配置文件,准备用make menuconfig对内核进行自定义配置的时候,报错了:1
error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory
这又是怎么回事。好像是gcc出问题了。返回去检查。
原来添加完库忘了更新动态库,输入命令:1
ldconfig -v
~
结果还报错:1
2
3
4
5
6scripts/kconfig/mconf Kconfig
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
make[2]: *** [menuconfig] Error 1
make[1]: *** [menuconfig] Error 2
make: *** [sub-make] Error 2
这是因为我的XSELL窗口太小了,把XSHELL放大最大化,果然就打开了熟悉的蓝色界面~
修改一些个性化的设置(例如改名、加NFS文件系统),就可以保存了。
编译内核
因为编译内核时间比较长,为防止发生断网或者断电等意外,我们创建一个SCREEN来编译。
1
2screen -S linuxkernel
yes | make -j 16
用一个yes命令省去一直手动y了,等待他编译完成就好了。
在这又遇到一个报错,贴出来和大家分享下:1
You are building kernel with non-retpoline compiler.
去查了下,网上都说是因为gcc版本过低,或内核版本过高。可我这明显不是gcc版本低的问题(都那么高了),问题是内核版本应该也不是问题,毕竟之前CentOS7编译就没这么多事。正犯愁不知道怎么解决的时候,发现了一篇文章查看原文,发现这个报错可以通过修改参数直接不启用RETPOLINE从而跳过(具体后果未知),于是修改配置文件重新来过:1
2
3make clean
sed -ri 's@(CONFIG_RETPOLINE=).*@\1n@' .config
make -j 16
果然就顺利编译成功了。
编译模块
然后安装模块:
1
make modules_ install
安装模块的时候,有报错:
1
ERROR: modinfo: could not find module *
不过查了相关文章查看原文,好像这些模块也都可以正常使用,于是乎无视之~
最后,安装内核相关文件。
1
make install
至此,新内核就装完啦~重启切换去去体验一下!