通过Git在Ubuntu 14.04/16.04上构建Ldiskfs和ZFS格式的Lustre主版本教程

来自Lustre文件系统
跳转至: 导航搜索

本教程针对想要探索Lustre前沿功能,或者在目前自动构建器不支持的CPU/内核组合上构建的开发人员。

如果你正在评估将Lustre应用于生产,则应该选择一个稳定的Lustre版本。

请注意,在撰写本页面时,预编译的Lustre 版本只适用于Ubuntu的Lustre客户端,而非服务端。

目标

本页介绍了所有必要的步骤:

  • 下载、打补丁、并为Lustre构建适当版本的Linux内核。
  • (可选)下载并构建ZFS模块,以便Lustre可以与之进行链接。
  • 创建Lustre客户端和服务端的DEB包。
  • 安装软件包以获得Lustre客户端或服务器。

准备条件

  • 新装了Ubuntu 16.04或18.04的机器,并连接到互联网。
  • 注意:下面的编译说明是基于SE-Linux被禁用的前提。如果您启用了SE-Linux,本指南只能作为一个参考,不具权威性。

概述

如题所述,本指南是针对Ubuntu 14.04和16.04的,因为它们之间区别很小。

本指南的主要区别在于编译所针对的ZFS版本:

除此之外,在本指南中,Ubuntu的两个版本都会使用以下的软件包版本:

  • Linux内核4.15.0-32

1.) 安装构建依赖包

要编译Lustre作为服务器使用,你需要能够编译Linux内核和Lustre。

你还需要编译并启用至少一个备份文件系统--ZFS或LDISKFS(或两者)。

安装所需工具的最快方法是使用debian build-dependency功能:

sudo apt-get build-dep linux-image-$(uname -r)
sudo apt-get install build-essential debhelper devscripts fakeroot kernel-wedge libudev-dev pciutils-dev
sudo apt-get install texinfo xmlto libelf-dev python-dev liblzma-dev libaudit-dev dh-systemd libyaml-dev
sudo apt-get install module-assistant libreadline-dev dpatch libsnmp-dev quilt

要启用ZFS服务器对Ubuntu 14.04的支持,您需要添加Ubuntu-ZFS PPA:

sudo add-apt-repository ppa:zfs-native/stable
sudo apt-get update

添加完成后,你需要在Ubuntu 16.04.和18.04上运行以下程序:

sudo apt-get build-dep ubuntu-zfs spl-dpkg zfs-dpkg

要启用LDISKFS服务器支持,你需要添加以下包:

sudo apt-get install uuid-dev libblkid-dev dietlibc-dev

注意:如果你正在构建Ubuntu服务器支持,只需要在你的编译节点上安装这些包。如果您只是为客户端节点构建Lustre,则最终的服务器不需要任何这些包。

下面的说明均基于您运行在一个至少有20GB可用磁盘空间的目录中为前提,并且您的用户具有写权限。

并假设这个路径是可用的${BUILDPATH},比如/usr/src/lustre。

2.) 构建Linux内核

在你构建Lustre服务器支持之前,需要有一个编译过的、与你想要构建的版本一致的内核源码目录。 如果你只构建一个客户端,那么你需要构建内核,只需要安装内核头文件和配置文件。

根据您打算使用的备份文件系统,您必须执行以下操作:

  • 如果你打算使用LDISKFS,则需要使用特定的内核版本来生成LDISKFS模块,并对其进行性能和功能改进。
  • 如果你只使用ZFS,则不需要对内核进行任何修改,可以使用任何你想要的版本,但仍需要对其进行编译。

下面两节将概述这两种情况。重要的是:你只需要遵循其中的一种情况,而不是两个。

无论哪种情况,你都必须为你的版本下载正确的内核。你可以选择使用GIT或HTTP协议。

2.1.) (ZFS,也可以选择LDISKFS)建立一个未经修改的内核

如果你只使用ZFS (或者你更喜欢在服务器上使用LDISKFS的未经修改的内核,但功能和性能会有所降低),则不需要为内核打补丁或者制作任何Debian包。只需要在本地编译内核,以便对其进行模块编译。

因此,首先通过执行以下命令来确定目标服务器上的内核版本:

[bash-4.3]$ uname -r
4.15.0-32-generic

你也可以针对任何其他的内核版本,但是下面假设目标使用的版本是"4.15.0-35"

首先要做的是进入内核源码目录,查看该版本:

[bash-4.3]$ cd ${BUILDPATH}/ubuntu-kernel
[bash-4.3]$ git tag | grep 4.15.0-32
Ubuntu-lts-4.15.0-32.66_18.04.1
[bash-4.3]$ git checkout Ubuntu-lts-4.15.0-32.66_18.04.1

请注意,这个标签在Ubuntu 16.04和18.04中会有所不同。如你所见,我们使用的是Ubuntu 18.04。


接下来需要该版本的内核配置。最简单的方法是从运行该版本的服务器上获取。

假设当前的编译服务器已经运行了该版本的内核(这不是必须的,但肯定会使事情变得更简单)。

cp /boot/config-4.15.0-32-generic .config

这个配置文件的另一个来源是该内核的Debian软件包,你可以从网上下载。

你要找的文件在linux-image-*.deb文件中--其中"*"的值取决于内核版本和你是否使用低延迟内核。

例如:

一旦你有了配置文件,则需要确保在内核中嵌入与Ubuntu相同的版本号:

touch .scmversion
sed -i 's/^VERSION = .*/VERSION = 4/' Makefile
sed -i 's/^PATCHLEVEL = .*/PATCHLEVEL = 4/' Makefile
sed -i 's/^SUBLEVEL = .*/SUBLEVEL = 0/' Makefile
sed -i 's/^EXTRAVERSION =.*/EXTRAVERSION = -35-generic/' Makefile

最后,你可以编译内核源码,使其可以被Lustre使用。

make -j $(nproc)

注意:"nproc"返回CPU的数量。如果你没有该工具或希望使用不同的并行数量,只需在那里输入你想要的并行进程数量即可。

3.) (可选)建立ZFS软件包

如果你希望编译Lustre,使它能够使用ZFS作为备份存储,当前的编译服务器需要安装ZFS模块。

你所需要做的就是编译ZFS源代码,这样Lustre就可以针对它的模块进行链接。

虽然针对一个与目标系统上使用的ZFS版本略有不同的版本进行编译也是可行的,但最安全的方法是使用相同的版本。

首先,创建一个同时容纳SPL和ZFS的目录:

cd ${BUILDPATH}
mkdir zfs
cd zfs

然后,为您的目标Ubuntu版本下载正确的ZFS源代码:

Ubuntu 14. 04:

wget http://archive.ubuntu.com/ubuntu/pool/main/z/zfs-linux/zfs-linux_0.7.9.orig.tar.gz
wget http://archive.ubuntu.com/ubuntu/pool/main/z/zfs-linux/zfs-linux_0.7.9-3ubuntu6.debian.tar.xz
wget http://archive.ubuntu.com/ubuntu/pool/universe/s/spl-linux/spl-linux_0.7.9.orig.tar.gz
wget http://archive.ubuntu.com/ubuntu/pool/universe/s/spl-linux/spl-linux_0.7.9-3ubuntu2.debian.tar.xz

Ubuntu 16.04:

wget http://archive.ubuntu.com/ubuntu/pool/main/z/zfs-linux/zfs-linux_0.7.12.orig.tar.gz
wget http://archive.ubuntu.com/ubuntu/pool/main/z/zfs-linux/zfs-linux_0.7.12-1ubuntu3.debian.tar.xz
wget http://archive.ubuntu.com/ubuntu/pool/universe/s/spl-linux/spl-linux_0.7.12.orig.tar.gz
wget http://archive.ubuntu.com/ubuntu/pool/universe/s/spl-linux/spl-linux_0.7.12-1ubuntu1.debian.tar.xz

本教程的其余部分假设你选择了Ubuntu 18.04.版本。如果你的目标是16.04版本,请相应调整文件和路径名。


解压、打补丁并编译SPL(相应调整ZFSVERSION参数)。

ZFSVERSION=0.7.12
tar -xf spl-linux_${ZFSVERSION}.orig.tar.bz2
cd spl-linux-${ZFSVERSION}
tar -xf ../spl-linux_${ZFSVERSION}-1ubuntu1.debian.tar.gz
for f in debian/patches/*.patch; do patch -Np1 -i $f; done
./autogen.sh &&
./configure --with-linux=${BUILDPATH}/ubuntu-kernel &&
make -j $(nproc)

然后,对ZFS进行同样的操作:

cd ${BUILDPATH}/zfs
tar -xf zfs-linux_${ZFSVERSION}.orig.tar.bz2
cd zfs-linux-${ZFSVERSION}
tar -xf ../zfs-linux_${ZFSVERSION}-1~trusty.debian.tar.gz
for f in debian/patches/*.patch; do patch -Np1 -i $f; done
./autogen.sh &&
./configure --with-linux=${BUILDPATH}/ubuntu-kernel --with-spl=${BUILDPATH}/zfs/spl-linux-${ZFSVERSION} &&
make -j $(nproc)

4.) (可选)建立修改后的e2fsprogs以支持LDISKFS

如果你正在构建一个LDISKFS服务器,则需要编译和安装一个修改版的e2fsprogs包,它提供了虚拟的ldiskfsprogs包。 如果您只打算构建一个客户端,或者在服务器上使用ZFS,则需要这样做。

要编译所需的软件包,请执行以下步骤:

cd ${BUILDPATH}
git clone git://git.whamcloud.com/tools/e2fsprogs.git
cd e2fsprogs
git checkout master-lustre

如果你不能使用GIT协议(例如,如果你使用了公司的代理),则可以从以下地方下载快照:

然后,生成Ubuntu Debian软件包:

wget -P ../ http://archive.ubuntu.com/ubuntu/pool/main/e/e2fsprogs/e2fsprogs_1.44.4-2.debian.tar.xz
tar --exclude "debian/changelog" -xf ../e2fsprogs_1.44.4-2.debian.tar.xz
sudo apt-get install libfuse-dev libattr1-dev libblkid-dev uuid-dev
./configure
dpkg-buildpackage -b -us -uc

这将在${BUILDPATH} 中创建几个".deb"文件。

将它们保存在一个合理的地方,以便之后在目标服务器上安装修改后的e2fsprogs。

注意1:必须下载Ubuntu Debian的安装文件,因为GIT repo中的文件不是Ubuntu专用的。

请确保在下载Ubuntu时使用相同的版本号。

注意2:"sed"调用可以解决构建脚本不能正确识别构建输出的问题。

这对运行e2fsprogs没有影响,但如果你使用一些针对e2fsprogs编译的东西,则可能会错过那个特殊的头文件,从而引起问题。

5.) 构建Lustre客户端和服务器包

5.1) 下载Lustre源码

第一步是从HPDD Git repo中下载最新的Lustre源代码:

cd ${BUILDPATH}
git clone git://git.whamcloud.com/fs/lustre-release.git
cd lustre-release
git checkout b2_10

这样会检查出最新的2.10代码。如果您需要更新的版本,请相应调整检查出的分支。

所有2.10以下的版本都没有启用Ubuntu Server支持。2.10以上的版本则应该已经有了改动。


除非GIT报告了合并冲突,否则您应该启用Ubuntu服务器的Lustre源代码库。

2.10以上的版本很可能已经集成了这个变化,不需要手动应用这个变化。

现在,您需要编译Lustre两次--一次是为Lustre客户端生成包,另一次是为Lustre服务器生成包。 这是因为安装的内核模块和工具不同。

请注意:在服务器上安装时,您不需要安装客户端包。服务器包包含并取代了这些包。

5.2) 构建Lustre客户端包

构建客户端包的要求最低,只需要内核头文件可用。

你甚至不需要像构建服务器那样有一个4.15.0系列的内核。客户端可以在任何2.6.32或更高版本的内核下运行,只要安装的内核头符合运行中的内核版本。

除非这些编译系统已经与DKMS(动态内核模块支持)兼容,否则需要为你的客户端运行的每个内核版本生成一个合适的包。

要构建客户机软件包,请执行以下步骤:

cd ${BUILDPATH}/lustre-release
git reset --hard && git clean -dfx
sh autogen.sh &&
./configure --disable-server --with-linux=${BUILDPATH}/ubuntu-kernel &&
make debs -j $(nproc)

除非有编译错误,否则你应该在"lustre-release/debs"子目录中找到一组Debian包。

把这些包复制到一个正常的位置,这样你就可以用它们来安装Lustre客户端。

也请记住前面说的:除非DKMS已被启用,否则你需要为每个目标内核版本编译一套单独的模块。

5.3) 构建Lustre服务器包

在构建服务器包的时候,需要确保以上所有要求都已经编译好并已准备好进行下一步,这取决于你想支持哪些文件系统。

特别需要注意的是,如果你想支持LDISKFS,你必须使用4.15.0系列的Linux内核。其他内核版本可能需要对EXT4-to-LDISKFS补丁进行重大修改。如果你想只使用ZFS,那么你不需要关心这个问题。类似于客户端包,源代码将兼容任何Linux 2.6及以上的内核版本。

现在,可以直接编译Lustre服务器包:

cd ${BUILDPATH}/lustre-release
git reset --hard && git clean -dfx
sh autogen.sh &&
./configure --with-linux=${BUILDPATH}/ubuntu-kernel \
  --enable-server --enable-modules \
  --with-zfs="${BUILDPATH}/zfs/zfs-linux-${ZFSVERSION}" --with-spl="${BUILDPATH}/zfs/spl-linux-${ZFSVERSION}" \
  --enable-ldiskfs &&
make debs -j $(nproc)

如果你不需要LDISKFS,只需删除"--enable-ldiskfs"标志。

如果你不需要ZFS,只需删除"--with-zfs"和"--with-spl"标志。 (注意:ZFSVERSION是在第(3)节中设置的)

请注意,这两者至少需要有一个,否则配置会失败。 毕竟,一个服务器没有至少一个备份文件系统是无法工作的。

如果编译成功,你应该在"lustre-release/debs"下再次找到服务器模块。

把这些复制到一个正常的位置,就可以用它们来安装Lustre服务器了。