从源码配置和构建 Samba

运维 系统运维
和大多数 Linux 软件一样,Samba 是开源的,您可以得到程序员所用的源代码文件,然后编译成您自己系统的一个二进制文件包。这样您就可以运行新的软件而不是版本维护人员所提供的旧版本,调整编译时间选项,设置编译器特性实现最优性能,甚至更改源代码。

 和大多数 Linux 软件一样,Samba 是开源的,您可以得到程序员所用的源代码文件,然后编译成您自己系统的一个二进制文件包。这样您就可以运行新的软件而不是版本维护人员所提供的旧版本,调整编译时间选项,设置编译器特性实现最优性能,甚至更改源代码。学习操作方法。

获取 Samba 源代码

Samba 源代码在 Samba 网站中提供。如果您对从源代码编译和安装软件比较熟悉,使用 Samba 可能不会有麻烦,但是,由于 Samba 对许多安装的关键特性,您需要格外注意,确保您的软件是您所信任的。为此,Samba 开发人员提供认证密钥,您可以用来验证您的下载。

下载一个源 tarball

您可以从主 Samba Web 页面下载 Samba 源代码。一个链接连接到主页上显示的最新稳定版本(撰写本文时是版本 3.5.6)。单击它获取这个版本,tarball 出现在您的 Web 浏览器将其下载的地方。下一代 Samba(Samba 版本 4)的一个可下载链接也出现在主页面上;然而 Samba 版本 4 目前正在进行 alpha 测试,已经好几年了。如果您一定要试用其功能或者想要帮助 Samba 开发,可以使用它。

构建您自己的提要您可以构建一个 RSS、Atom 或 HTML 提要,以便在我们添加新文章或更新内容时收到通知。访问 developerWork RSS 提要。选择 Linux 作为专区,Articles 作为类型,输入 Linux Professional Institute 作为关键字。然后选择您想要的提要类型。在主下载链接附近,您将发现一个到当前版本发行说明的链接,还有另一个到签名的链接,您可以用来识别软件的完整性。如果您的目的是验证软件的完整性,就应该下载签名文件。(要实现这一点,需要右键单击该链接。)这个文件称为 samba-version.tar.asc,其中 version 是 Samba 版本号。

额外下载选项在 Samba 下载页面出现。这个页面包括到旧版 Samba 归档文件的链接;使用 Git 下载软件的操作指南、Control Version System、以及其他工具;到相关工具的链接,比如图形化用户界面管理器和用于其他平台的 Server Message Block (SMB)/Common Internet File System (CIFS)包;等等。一个尤其重要的链接是到 Samba 包 GnuPG (GPG) 密钥的链接。如果您想要验证 Samba 包的真实性,必须下载该文件(samba-pubkey.asc),如下所述。

验证软件真实性

不验证软件的真实性,也可以解压、编译、安装和使用 Samba。但是,由于服务器极其重要,运行少数必要命令来验证其真实性通常是个好主意。执行以下步骤:

1、确保您已经下载了 samba-version.tar.asc 和 samba-pubkey.asc 文件。

2、输入 gunzip samba-version.tar.gz 来解压(而不是用 untar 命令)这个打包文件。

3、如果您还没有这么做,输入 gpg --import samba-pubkey.asc 将 Samba 公共密钥导入到您的 GPG 密钥环。

4、输入 gpg --verify samba-version.tar.asc 验证这个密钥。这个程序应该响应类似的消息:

gpg: Signature made Thu 07 Oct 2010 02:23:24 PM EDT using DSA key ID 6568B7EA
gpg: Good signature from "Samba Distribution Verification Key
<samba-bugs@samba.org\>"

输出结果可能继续是一条消息,大致意思是密钥不能被一个可信签名所认证。这条消息强调了刚才描述的验证过程的一个局限性:如果主 Samba 网站被破坏,入侵者可能会使用假冒版本替换 Samba 包和两个密钥,这可能会误导您接受虚假密钥。在某种程度上,您可以通过在第 4 步 gpg 中使用 --keyserver wwwkeys.pgp.net 选项来保护您自己。该选项导致 gpg 将检索来自 wwwkeys.gpg.net 的密钥作为验证过程的一部分。除了 Samba 服务器之外,有些人发布的假 Samba 包可能会破坏这个密钥服务器。

解封 tarball

假设您的软件包已经通过了验证步骤(或者,如果您不想再为此步骤而伤神),您可以解封您的源代码 tarball。在您的主目录下,或者在 /usr/src/ 这样一个路径进行该操作,其目的是保留源代码进行软件的本地安装。如果您在 /usr/src/ 解封源代码,您可能需要请求根权限或者更改对 /usr/src/ 的访问权限,使普通用户可以写入此目录。

无论您怎样做,都需要切换到您想要将源代码解压到其中的目录区。然后输入以下命令:

$ tar xvf ~/samba-version.tar

该命令假设您已经解压了 tarball,而且位于您的主目录区。如果 tarball 仍然是压缩的,您可以先解压它,或者将 z 添加到 tar 命令中,然后更改文件名,命令如下:

$ tar xvzf ~/samba-version.tar.gz

如果文件驻留在其他位置,而不是主目录区,应相应调整路径。当然,您还应该更改文件名来反映您所使用的版本。

在解压这些文件时,该命令生成一个文件列表。如果您看到错误消息,可能是您没有权限写入当前目录,或者可能是耗尽了可用磁盘空间。一旦任务成功完成,您将看到出现一个新的子目录:samba-version。这就是您的 Samba 源代码树。

编译 Samba

源代码现在已经可用,可以开始编译流程了。在开始之前,检查您的系统中的必备软件。您必须在执行实际编译之前配置该软件。您可能会遇到问题,但您必须解决。

安装必备软件

要编译 Samba,必须提供其他一些软件包,最引人注目的就是 GCC。GCC 是 C 语言的一个编译器集合,大多数 Samba 都是用 C语言编写的。在大多数 Linux 版本中,不出预料,您可以从一个名为 gcc 的包中安装 GCC。另一个关键开发工具是 make,这可以调用 gcc 和其他开发工具,调用模式由 Samba 开发人员决定。

Samba 代码依赖其他几个 libraries— 软件包,为其他程序的使用提供支持功能。这些库可能已经安装在您的计算机上了,但要编译一个程序,您需要库的头文件,这通常安装在单独的软件包(名称以 -dev 或 -devel. 结束)中。至少,使用您的版本的打包工具确保libc 或 libc6 开发库已安装。有些库需要,有些库不需要,具体取决于您的配置选项。如果一个库找不到,configure 脚本 — 有可能是构建进程自身— 将生成一个错误消息,您可能要追查到相关库。

很多发行版可以很容易地在一次操作中安装一个开发工具和库的基本选项。例如,在 Ubuntu 中,您可以安装 build-essential 包。在诸如 Fedora 这类版本中,在安装操作系统时可以安装大量软件包,这样如果您在安装操作系统时知道您的计算机将用于软件开发,那么您可以在那时选择相关包。如果您找到这样一个适合您的操作系统的选项,您不得不逐个安装软件包。

配置 Samba

要配置 Samba,首先更改 Samba 源代码主目录的 source3 子目录。该目录有供主要 Samba 包使用的源代码。

注意: Samba 源代码主目录的其他子目录保存辅助程序、支持程序、文档等等的源代码。例如,客户端子目录保存与 Linux 作为客户机安装 SMB/CIFS 共享的能力相关的文件;swat 子目录有 Samba Web Administration Tool (SWAT) 源代码。构建 Samba 主文件包也需要编译这些程序,但是您可能需要手动编译其他程序。编译 Samba 主体,在 source3 子目录中,构建关键 smbd 和 nmbd 服务器程序以及支持库和一些相关工具。

configure 脚本处理配置流程,最简单的情况下,您可以输入 ./configure 使用其默认选项来配置 Samba。很多参数都可以对编译时间选项进行微调。输入 ./configure --help 来查看选项清单。(如果您在一个控制台上工作,不要上下滚动,您可能想将输出重新指向一个文件,这样您可以通过 less 详细阅读或者在一个文本编辑器中阅读。)

您也可能想要设置各种环境变量,这也在 ./configure --help 输出中有详细描述。大多数情况下,默认就可以了,但是,如果您对相关系统有足够的了解,您可以调整选项以满足您的需求。例如,您可以设置 CFLAGS 环境变量来调整您的 C 编译器标记。如果您对环境变量不是很了解,最好不要管它。

您详细阅读了选项和环境变量后,您就可以配置您的 Samba:

$ CFLAGS="-O3" ./configure --without-ldap

该示例告诉脚本使用 -O3 GCC 编译器,然后编译 Samba ,不需要支持 Lightweight Directory Access Protocol。您可以更改或忽略这些选项,当然,根据您安装的版本视情况而定。

编译软件

实际上,编译软件对于您而言不费吹灰之力。仅输入:

$ make

结果是出现一系列代码行,显示 make 实用工具正在进行的处理,如下:

Compiling lib/netapi/joindomain.c
Compiling lib/netapi/serverinfo.c
Compiling lib/netapi/getdc.c

运气好的话,这一进程将继续直至软件被编译,这很可能需要几分钟,但具体时间稍有差异,具体取决于您的计算机的速度。如果您的机器运行不止一个处理器或者多核处理器,您可能需要使用 -j 选项来 make,使其同时运行多个编译任务,因而加快进程速度。例如,您可以输入 make -j 4,使得 make 可以同时运行 4 个源代码文件。软件编译完成后,您可以使用 install 目标运行 make 来安装它:

# make install

尽管您可以作为一个普通用户执行上述操作(假设您像那个用户那样拥有对源代码目录树的 Write 访问权限),但是使用 make install 需要您有 root 权限,所以该命令将 Samba 二进制文件和文档复制到计算机的系统目录中(通常在 /usr/local/ 中,除非您通过 configure 脚本选项更改了该位置) 。

解决问题

很遗憾,配置和编译有时会失败。这类问题最常见的原因是库的缺失。如果配置失败,您可能会在输出底部附近看到一个消息,指出缺失什么 — 例如,该消息可能指出不能找到 Pluggable Authentication Module 库。然后,您可以使用您的系统包管理工具,比如 Synaptic 或 Yumex,来搜索和安装相关软件。记住,您可能需要将开发库与主库文件包分开安装。

您可以以类似的方式在 make 阶段处理错误;然而这类错误通常生成大量错误消息。不要管列表中后面出现的错误,向上滚动找到第一个错误消息。通常,一个错误会导致另一个,以此类推。更正了第一个错误就打破了这链条,通常会使软件能够正确编译。

更正 make 错误可能比更正 configure 错误需要更多的说明,因为 make 错误可能反映文件缺失甚至文件中不正确的元素。如果一个缺失的文件是罪魁祸首,那么它的名称通常就是一个线索,试着找到您版本的发行包,去掉文件名中的所有扩展名;这样会帮助您找到一个丢失的配置库(configure 忽略了的)进行标记。如果这也失败的话,使用文件名尝试一个 Web 搜索,这可能引导您找到需要安装的库的名称。如果错误是有关错误语法的,问题可能更严重。您可能会禁用与 configure 脚本选项相关的特性;然而您可能需要升级(或降级) 您的 C 编译器或者您想要编译的 Samba 版本。如果您正在处理软件的一个预发布版本,您可能会遇到一个 bug,需要您自己进行修补。这类任务超出了本文的范围,您需要向 Samba 开发人员或经验丰富的程序员寻求帮助。

【编辑推荐】

  1. Samba安装全过程
  2. Samba在企业中的简单应用案例
  3. 活用三种权限 理解Samba的权限控制
责任编辑:黄丹 来源: IBMDW
相关推荐

2010-02-03 14:28:15

Linux Samba

2010-03-31 10:05:40

CentOS Samb

2017-02-07 09:44:12

Chrome源码DOM树

2009-12-28 17:23:54

Fedora Samb

2017-04-10 14:23:01

typescriptjavascriptwebpack

2022-06-02 09:14:14

GNOME源码编译Linux 发行版

2010-01-07 10:34:28

Ubuntu samb

2009-12-28 16:36:06

Fedora Samb

2009-09-01 10:14:16

samba

2011-08-16 17:32:15

sambalinux

2010-01-08 17:32:11

Ubuntu samb

2009-12-09 14:45:42

2009-08-14 13:18:41

配置linux虚拟机s

2017-08-16 11:00:38

TCPIP协议

2021-07-14 09:48:15

Linux源码Epoll

2017-03-07 13:36:48

源代码Tomcat开源

2010-03-31 10:41:49

CentOS Samb

2023-03-13 08:10:09

PrometheusVM

2021-09-11 19:46:14

配置

2009-06-19 11:13:47

Scalacase类模式匹配
点赞
收藏

51CTO技术栈公众号