之前在CentOS7 上源码编译安装过新内核,不过有次在6上编译就遇到问题了.

提示错误如下

make[2]: *** [scripts/sign-file] Error 1 make[1]: *** [scripts] Error 2 make

搞了好久,好像是参数设置不正确。

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源码包

mkdir /data/gcc                                             #创建目录/data/gcc
cd /data/gcc
wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.xz       #下载gmp6.1.2
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.5.tar.gz     #下载mpfr3.1.5
wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz             #下载mpc1.0.3
wget ftp://ftp.gnu.org/gnu/gcc/gcc-6.3.0/gcc-6.3.0.tar.gz   #下载gcc6.3.0

  再挨个编译安装三个依赖包(注意这三个依赖包也有依赖关系,需先安装gmp,再安装mpfr,之后再装mpc)

gmp

  先来第一个,编译安装装gmp

tar -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

  之后编译安装mpfr

tar -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

  然后编译安装mpc

tar -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。

tar 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]:

make: *** [sub-make] Error 2

  显示这个问题编译不过去。这是因为找不到gmp依赖包导致的,可是我明明装了依赖包的,看来是路径设置有问题,因为当时我是把这三个依赖包都装在gcc下,不过在编译gcc的时候忘记改依赖包的地址了。
错误提示[2]:

configure: error: cannot compute suffix of object files: cannot compile

  解决办法是:
  在/etc/profile里面加上以下内容:

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/profile

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版本

mv /usr/bin/gcc /usr/bin/gcc-bak
mv /usr/bin/g++ /usr/bin/g++-bak
mv /usr/bin/c++ /usr/bin/c++-bak

建新的gcc软连接

ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc
ln -s /usr/local/gcc/bin/c++ /usr/bin/c++
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
ln -s /usr/local/gcc/lib64/libstdc++.so.6.0.22 /usr/lib64/libstdc++.so.6

编译安装linux kernel 5.2.9

  高高兴兴cd linux-5.2.9,进入解压好的内核目录,做好.config配置文件,准备用make menuconfig对内核进行自定义配置的时候,报错了:

error while loading shared libraries: libmpc.so.3: cannot open shared object file: No such file or directory

  这又是怎么回事。好像是gcc出问题了。返回去检查。
  原来添加完库忘了更新动态库,输入命令:

ldconfig -v

~
结果还报错:

scripts/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来编译。
  

screen -S linuxkernel
yes | make -j 16

  用一个yes命令省去一直手动y了,等待他编译完成就好了。
  
  在这又遇到一个报错,贴出来和大家分享下:

You are building kernel with non-retpoline compiler.

  去查了下,网上都说是因为gcc版本过低,或内核版本过高。可我这明显不是gcc版本低的问题(都那么高了),问题是内核版本应该也不是问题,毕竟之前CentOS7编译就没这么多事。正犯愁不知道怎么解决的时候,发现了一篇文章查看原文,发现这个报错可以通过修改参数直接不启用RETPOLINE从而跳过(具体后果未知),于是修改配置文件重新来过:

make clean
sed -ri 's@(CONFIG_RETPOLINE=).*@\1n@' .config
make -j 16

  果然就顺利编译成功了。

编译模块

  然后安装模块:
  

make modules_ install

  安装模块的时候,有报错:
  

ERROR: modinfo: could not find module *

  不过查了相关文章查看原文,好像这些模块也都可以正常使用,于是乎无视之~
  最后,安装内核相关文件。
  

make install

  至此,新内核就装完啦~重启切换去去体验一下!


一个低调的男人