使用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
就可以安装使用了,祝大家玩的开心。