使用Software Collections编译最新Linux kernel

关于 Software Collections

使用 Software Collections(SCL)的契机是最近我需要在 CentOS 6 系统上编译最新版本的 Linux kernel,主要用于测试 Btrfs 的数据校验对于 AVX2 指令的支持情况。然而大家都知道 CentOS 6 自带的软件包版本都是非常老的,glibc 维持在 2.12 版本,老的 gcc 4.4 版本则根本就不支持 AVX2 指令,这样编译 Linux kernel 时会自动关闭 async xor 对 AVX2 的支持。

如果要自己动手编译新版本 gcc,这感觉还是有点吃力不讨好,幸好 Red Hat 也注意到这个问题了,我们可以通过 Software Collections 实现在一个系统上安装多个版本的开发工具或者运行环境,仓库里高版本的软件包通常都是由 Red Hat 维护的,比较常见的需求例如将 CentOS 6 自带的 Python 升级为 2.7 版本。

大家可以访问 Software Collections 官网了解更多信息:

https://www.softwarecollections.org/en/

安装 gcc 新版本

首先需要安装 SCL 支持,CentOS 6 通过 yum 安装还是非常简单的:

[root@localhost ~]# yum install centos-release-scl
Dependencies Resolved

================================================================
 Package              Arch    Version            Repository Size
================================================================
Installing:
 centos-release-scl   noarch  10:7-3.el6.centos  extras     12 k

Transaction Summary
================================================================
Install       1 Package(s)

Total download size: 12 k
Installed size: 19 k
Is this ok [y/N]: y
Downloading Packages:
centos-release-scl-7-3.el6.centos.noarch.rpm | 12 kB    00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : 10:centos-release-scl-7-3.el6.centos.noarch
duration: 120(ms)
Installed products updated.

Installed:
  centos-release-scl.noarch 10:7-3.el6.centos                               

Complete!

然后安装 SCL 工具:

[root@localhost ~]# yum install scl-utils scl-utils-build

运行 yum makecache 更新缓存之后,就可以查找 SCL 提供了哪些新版本的 gcc 和 binutils 包了:

[root@localhost ~]# yum list | grep -E "devtoolset-.*-(gcc|binutils)"
devtoolset-3-binutils.x86_64                2.24-18.el6           centos-sclo-rh
devtoolset-3-binutils-devel.x86_64          2.24-18.el6           centos-sclo-rh
devtoolset-3-gcc.x86_64                     4.9.2-6.2.el6         centos-sclo-rh
devtoolset-3-gcc-c++.x86_64                 4.9.2-6.2.el6         centos-sclo-rh
devtoolset-3-gcc-gfortran.x86_64            4.9.2-6.2.el6         centos-sclo-rh
devtoolset-3-gcc-plugin-devel.x86_64        4.9.2-6.2.el6         centos-sclo-rh
devtoolset-4-binutils.x86_64                2.25.1-8.el6          centos-sclo-rh
devtoolset-4-binutils-devel.x86_64          2.25.1-8.el6          centos-sclo-rh
devtoolset-4-gcc.x86_64                     5.3.1-6.1.el6         centos-sclo-rh
devtoolset-4-gcc-c++.x86_64                 5.3.1-6.1.el6         centos-sclo-rh
devtoolset-4-gcc-gdb-plugin.x86_64          5.3.1-6.1.el6         centos-sclo-rh
devtoolset-4-gcc-gfortran.x86_64            5.3.1-6.1.el6         centos-sclo-rh
devtoolset-4-gcc-plugin-devel.x86_64        5.3.1-6.1.el6         centos-sclo-rh
devtoolset-6-binutils.x86_64                2.27-8.el6            centos-sclo-rh
devtoolset-6-binutils-devel.x86_64          2.27-8.el6            centos-sclo-rh
devtoolset-6-gcc.x86_64                     6.2.1-3.1.el6         centos-sclo-rh
devtoolset-6-gcc-c++.x86_64                 6.2.1-3.1.el6         centos-sclo-rh
devtoolset-6-gcc-gdb-plugin.x86_64          6.2.1-3.1.el6         centos-sclo-rh
devtoolset-6-gcc-gfortran.x86_64            6.2.1-3.1.el6         centos-sclo-rh
devtoolset-6-gcc-plugin-devel.x86_64        6.2.1-3.1.el6         centos-sclo-rh

可以看到 SCL 提供了 4.9.2、5.3.1、6.2.1 这几个新版本的 gcc 支持,与 binutils 一起分别属于几个不同版本的 devtoolset 软件包。

初步确认 gcc 5.3.1 就可以支持 AVX2 指令,因此直接安装对应 devtoolset-4 版本的 gcc 和 binutils 软件包:

[root@localhost ~]# yum install devtoolset-4-gcc.x86_64 devtoolset-4-binutils.x86_64

使用 SCL

软件包安装完成之后,我们可以使用 scl -l 命令查看 SCL 安装的软件包列表:

[root@localhost ~]# scl -l
devtoolset-4
python27

当然 SCL 并不会直接替换系统自带的老版本软件包,需要通过 scl 命令切换使用:

scl enable <scl-package-name> <command>

这样我想开启一个使用新版本 gcc 的 shell,直接运行命令:

[root@localhost ~]# scl enable devtoolset-4 bash

这样会启动一个新的 bash shell,可以在其中看到 gcc 已经是新的 5.3.1 版本了:

[root@localhost ~]# gcc --version
gcc (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

当然如果不想开启新的 shell,也可以进入 Linux kernel 源代码目录直接使用新版本 gcc 来编译:

[root@localhost ~/linux-4.10]# scl enable devtoolset-4 make

最后提醒一下 Software Collections 的软件包是可以不安装直接在线搜索的哦,从 SCL 官网的 collections 里就可以搜索:

https://www.softwarecollections.org/en/scls/

搜索结果里就会有 SCL 软件包的安装方法,例如 Python 2.7 搜索到之后直接运行 yum install python27 就可以安装使用了,祝大家玩的开心。