海派开源潮流社区

一起参与开源.共同打造海派开源潮流社区(Kernel/Fedora/CentOS/Perl/Drupal)

CentOS下非超级用户制作RPM源代码包

○相关背景:

早在' Unix大战'前 ,unix的系统管理必须从随机被压缩的计算机源代码中收集代码. 但这样做的最大的缺点

是简化了代码的可移植性和不能支持不同厂商的硬件。

RPM包管理器是一个可以让你更好的更系统的管理你的tar软件代码安装包的工具,它允许使用很高的权限

管理,复杂的包相互依赖(共享库等),允许验证,系统还没有被篡改,使复杂的配置和生命周期变得的可

以限制,安全,可以变更控制,和可维护。

○初步说明:'为什么不使用超级用户‘和'为什么选择这样的制作环境'

使用全能的Root帐号操作是许多新手系统管理员的一个不好的习惯,它很容易写入或者更改过多文件影响

系统,制作源代码和做压缩档是很很容易对系统造成影响的行为。这是因为在制作源代码包的时候可能会不

知不觉的改变一个共享库,对系统造成损害。

第二个不好的习惯是使安装程序安装一切东西,以便于程序简单的安装一个没有注意选择需要内容的制作

环境,这点虽然很细微,但同样具有潜在破坏性的影响。

想想下面的例子,从一个声誉好的包装者或者村当中做一个包,我们用红色标明潜在问题:

[herrold@new spamassassin]$ rpmbuild  --rebuild perl-Mail-SPF-2.004-1.rf.src.rpm

Installing perl-Mail-SPF-2.004-1.rf.src.rpm
warning: user dag does not exist - using root
warning: group dag does not exist - using root
warning: user dag does not exist - using root
warning: group dag does not exist - using root
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.75053
+ umask 022
+ cd /home/herrold/rpmbuild/BUILD
+ cd /home/herrold/rpmbuild/BUILD
+ rm -rf Mail-SPF-2.004
+ /bin/gzip -dc /home/herrold/rpmbuild/SOURCES/Mail-SPF-2.004.tar.gz
+ tar -xvvf -
drwxr-xr-x julian/users 0 2007-01-19 20:18:54 Mail-SPF-2.004/
-r--r--r-- julian/users 626 2007-01-19 20:18:50 Mail-SPF-2.004/INSTALL

...

+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.8915
+ umask 022
+ cd /home/herrold/rpmbuild/BUILD
+ cd Mail-SPF-2.004
+ /usr/bin/perl Makefile.PL INSTALLDIRS=vendor
PREFIX=/var/tmp/perl-Mail-SPF-2.004-1.rf-root/usr
This module requires Module::Build to install itself.

Install Module::Build now from CPAN? [y]

Can't locate CPAN.pm in @INC
(@INC contains: _build/lib /usr/lib/perl5/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/5.8.0 /usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi
/usr/lib/perl5/site_perl/5.8.0 /usr/lib/perl5/site_perl
//usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi
///usr/lib/perl5/vendor_perl/5.8.0 /usr/lib/perl5/vendor_perl .) at
///Makefile.PL line 16, <STDIN> line 1.

error: Bad exit status from /var/tmp/rpm-tmp.8915 (%build)

RPM build errors:
user dag does not exist - using root
group dag does not exist - using root
user dag does not exist - using root
group dag does not exist - using root
Bad exit status from /var/tmp/rpm-tmp.8915 (%build)
[herrold@new spamassassin]$
如果CPAN perl模块已在非超级用户的环境下以及我们使用root帐户制作,我们将仅仅安装一个新的perl模块的
收集,完全不知道包的管理人;这就奠定了陷阱,造成很大的问题。要重新整理已经更新的包,我们可能需要清除
并重新安装它,以便取得正确的安全的新版本。
在我们的例子中,我们使用RPMBUILD来制作engone,但是没有使用通常的方式

./configure && make && sudo make install
这是因为我们没有使用root帐户进行制作,我们在一个权限非常低的环境进行执着,没有损害到系统。
○适用于制作RPM源文件
 
不出意外,一个管理使用二进制代码的工具被做成了一个tar包,同样需要它的思考空间一边处理创建,安全和
 
内容。在近几年,散步的供应商和包的所有者提出了实践和包装解决方案已经基本上完全不再需要使用root建立
 
封装,在这样做的时候,他也提出了很多假设以便修改制作规则。
 
另外,少数情况下,我们需要使用root进行制作,这里有许多技巧,比如,'chroot'在一个规定的的环境中,
 
和规定的工具去发现(基本上是比较前后建立的镜像)那些已经在制作的包。
 
○So,让我们来看一个例子:
 
我们将要建立一个开发环境。我们在我们自己的开发环境中编译软件包。我们将试着制作一个包。我们将会讨论
 
许多关于如何做一个轻松的开发者,在开发的时候发生了许多不成功的事情 --错过了开发工具,陌生的消息,等等。
 
我们将要提到许多。
 
1.建立一个开发工程 -- 作为一个开始,错误是不可避免的。
这样,如果事情太乱,或者如果一个正在试验的做法被否定,可以消除并重新策划它。我们讨论 automated PXE 
based install techniques,准备一个本地安装(使用loop mounted ISOs [install-from-iso.sh])或者
update [TBD] mirror。然后使用YUm把它封装,一个号的基础设置,需要的是(as root):
# yum -y install rpm-build make m4 gcc-c++ autoconf automake \
redhat-rpm-config

Note: This last package ('redhat-rpm-config') is part of the splitting up of some RPM build
macros, to be vendor-specific, and appears in the CentOS series as a needed package(为保证重
信息的准确性,暂不做翻译)
 
2.当然,我们需要建立一个最终用户去制作,这个帐户不需要有sudo的权限,如果我们打开2个终端在制作主机上,一个用
 
root权限一边添加制作缺少的包,另外一个进行制作工作,作为选择,在 /etc/sudoers添加制作账号,也可以考虑从使
 
用root账号
 
3.我们已经公布了一些脚本用于建立一个非超级用户开发RPM的环境,我们可以建立这样的环境(依然是非超级用户):
 
       $ wget http://www.oldrpm.org/hintskinks/buildtree/RPM-build-tree.txt
$ chmod 755 RPM-build-tree.txt
$ ./RPM-build-tree.txt
 
结果,我们会发现这个文件系统树是在: ~/rpmbuild/ matches root's tree at: /usr/src/redhat/
 
4.事实上,~/.rpmmacros文件已经准备了'%_topdir'这个变量,这个变量非常重要,他是rpm开发的基础之一。
 
你可能会看到如下:
 
[herrold@dhcp-233 ~]$ rpm --showrc | grep topdir
-14: _builddir %{_topdir}/BUILD
-14: _desktopdir %{_datadir}/applications
-14: _rpmdir %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir /home/herrold/rpmbuild
[herrold@dhcp-233 ~]$
 
5.保持一个干净的开发环境,以及一本'lab notebook'--我们制作了许多的包,为了测试,或者作为独立的
 
RPM包。一个可以描述的实践中问题,我们有习惯去记住我们在处理包所做的一系列事务,我们制作了一个目录
 
~/build/以及 做了目录链接 build/{packagename}/.我们复制了一份关于SRPM的副本- RPM源 - 以便我们以后
 
可以找到他
 
 我们也可以制作一个Readme 文件,去记录我们的笔记,我们所遇到的问题都必须要记住,我们的笔记:
 
 ftp://ftp.owlriver.com/pub/mirror/ORC/xfce4/README  记录了关于 XFCE4 X window manager series
 
6.让我们制作些东西 --- 作为一个简单的例子,架设我们有joe的SRPM副本,让我们在非超级用户状态复制和编
 
译他.
 
1 [herrold@dhcp-233 ~]$ cd
2 [herrold@dhcp-233 ~]$ mkdir build
3 [herrold@dhcp-233 ~]$ cd build
4 [herrold@dhcp-233 build]$ mkdir joe
5 [herrold@dhcp-233 build]$ cd joe
6 [herrold@dhcp-233 joe]$ joe README
7 [herrold@dhcp-233 joe]$ wget ftp://ftp.owlriver.com/pub/mirror/ORC/joe/joe-2.9.8-4.src.rpm
8 [herrold@dhcp-233 joe]$ rpmbuild --rebuild joe-2.9.8-4.src.rpm
 
回顾一下,我们都做了下面的操作:
 
1 切换到根目录
2 建立~/build/ subdirectory 
3 切换进目录~/build/ subdirectory 
4 建立目录~/build/joe/ subdirectory
5 进入目录 ~/build/joe/ subdirectory
6 在README记录我们的笔记
7 使用wget下载SRPM
8 制作rpm包
 
然后我们查找~/rpmbuild/RPMS/i386/ we find the binary file: joe-2.9.8-4.i386.rpm 
 
7.弄出一个缺口 --  我们可以让unix的命令行工具仅仅读取制作处理的部分内容,并找到相应的包进行
 
编写:
 
[herrold@dhcp-233 joe]$ rpmbuild --rebuild joe-2.9.8-4.src.rpm  2>&1 | wc
450 2689 20449
[herrold@dhcp-233 joe]$ rpmbuild --rebuild joe-2.9.8-4.src.rpm 2>&1 | \
grep ^Wrote
Wrote: /home/herrold/rpmbuild/RPMS/i386/joe-2.9.8-4.i386.rpm
[herrold@dhcp-233 joe]$
 
8.关于补丁的证明....----测试是一个将要安装以及投入使用的包发行前的一部分,我们可以不安装现行的版本
 
安装过去的joe版本在测试机上。记录这里我们添加一个最终用户在 /etc/sudoers  这个组的用户允许使用root
 
权限操作,之后,提供他们的(非root )密码:
 
[herrold@dhcp-233 joe]$ rpm -q joe
joe-3.1-6
[herrold@dhcp-233 joe]$ sudo rpm -e joe


我们确信你会收到来自系统管理员的提示,他通常归结为2点:
 
#1:尊重他人隐私
 
#2:思考,然后再输入
 
密码:
 
[herrold@dhcp-233 joe]$ sudo rpm -Uvh /home/herrold/rpmbuild/RPMS/i386/joe-2.9.8-4.i386.rpm
Preparing... ########################################### [100%]
1:joe ########################################### [100%]
[herrold@dhcp-233 joe]$ rpm -q joe
joe-2.9.8-4
[herrold@dhcp-233 joe]$

 

可能会出现几个提示,一个是平常的我们不需要解决,而另一个则需要我们解决才能继续,会看到这些

 
Installing joe-2.9.8-4.src.rpm
warning: InstallSourcePackage: Header V3 DSA signature: NOKEY, key ID
897da07a
 
以后安装必须的资源:
 
error: Failed build dependencies:
ncurses-devel is needed by joe-2.9.8-4.i386
 
第一个提示,是一个警告,意思是将要安装的RPM源文件没有关键签署,他是无害的,你完全可以不理会他
 
第二个是提示需要相关的包,如果不找到相关的包,则可能无法继续
 
在任何情况下,通常用'yum’解决安装包丢失的问题:
 
$ sudo yum -y install ncurses-devel

在测试当中,joe在底部显示他的版本,这是预计的:
 
   IW   .rpmmacros                   Row 1    Col 1    1:00  Ctrl-K H for help
+-----------------------------------------------------------------------------
|
| %_topdir /home/herrold/rpmbuild
| %make make
|
| [<snip>]
|
+-----------------------------------------------------------------------------
** Joe's Own Editor v2.9.8 ** Copyright (C) 2003 **

 

9.我们可以自己清理

 

[herrold@dhcp-233 ~]$ sudo yum -y upgrade
Setting up Upgrade Process
Setting up repositories
local-proprietary 100% |=========================| 951 B 00:00
update 100% |=========================| 951 B 00:00
local-active-base 100% |=========================| 951 B 00:00
base 100% |=========================| 1.1 kB 00:00
addons 100% |=========================| 951 B 00:00
local-active-updates 100% |=========================| 951 B 00:00
extras 100% |=========================| 1.1 kB 00:00
Reading repository metadata in from local files
Resolving Dependencies
--> Populating transaction set with selected packages. Please wait.
---> Package joe.i386 0:3.1-6 set to be updated
--> Running transaction check

Dependencies Resolved

=============================================================================
Package Arch Version Repository Size
=============================================================================
Updating:
joe i386 3.1-6 local-active-base 204 k

Transaction Summary
=============================================================================
Install 0 Package(s)
Update 1 Package(s)
Remove 0 Package(s)
Total download size: 204 k
Downloading Packages:
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
Updating : joe ######################### [1/2]
Cleanup : joe ######################### [2/2]

Updated: joe.i386 0:3.1-6
Complete!
[herrold@dhcp-233 ~]$

Note: We had a question asking why we used 'upgrade' rather than 'update' as 
the operator for 'yum'; this is an artifact of when the early drafts of this 
tip were written; there is no difference in the currently available versions 
of 'yum'; in prior versions, and in our sysadmin practice, 'upgrade' then had 
the favorable characteristic of removing outdated binary RPMs, and we got into 
the habit of its use.
 
○ 结束语
 This writeup is done in the context of CentOS

------------------------------------By Rainight----------------------

个人翻译 仅供参考 更深入研究 请参考原文http://www.owlriver.com/tips/non-root/

 

Reserved by www.17LAMP.net