- useradd ibuler
- su - ibuler
2.确定我们在哪个目录下制作RPM,通常这个目录我们topdir,这个需要在宏配置文件中指定,这个配置文件称为macrofiles,它们通常为 /usr/lib/rpm/macros:/usr/lib/rpm/macros.*:~/.rpmmacros,这个在rhel 5.8中可以通过rpmbuild --showrc | grep macrofiles 查看,6.3的我使用这个找不到,但使用是一样的。你可以通过rpmbuild --showrc | grep topdir 查看你系统默认的工作车间
- rpmbuild --showrc | grep topdir
-
- -14: _builddir %{_topdir}/BUILD
- -14: _buildrootdir %{_topdir}/BUILDROOT
- -14: _rpmdir %{_topdir}/RPMS
- -14: _sourcedir %{_topdir}/SOURCES
- -14: _specdir %{_topdir}/SPECS
- -14: _srcrpmdir %{_topdir}/SRPMS
- -14: _topdir %{getenv:HOME}/rpmbuild
我们还是自定义工作目录(或车间)吧
- vi ~/.rpmmacros
- %_topdir /home/ibuler/rpmbuild ##目录可以自定义
-
- mkdir ~/rpmbuild
3.在topdir下建立需要的目录
- cd ~/rpmbuild
- mkdir -pv {BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
4.把收集的源码放到SOURCES下
- cp /tmp/tengine-1.4.2.tar.gz SOURCES ##事先放好的
5.在SPECS下建立重要的spec文件
- cd SPECS
- vi tengine.spec ##内容见后讲解,rhel6.3会自动生成模板
6.用rpmbuild命令制作rpm包,rpmbuild命令会根据spec文件来生成rpm包
- rpmbuild
- -ba 既生成src.rpm又生成二进制rpm
- -bs 只生成src的rpm
- -bb 只生二进制的rpm
- -bp 执行到pre
- -bc 执行到 build段
- -bi 执行install段
- -bl 检测有文件没包含
我们可以一步步试,先rpmbuild -bp ,再-bc 再-bi 如果没问题,rpmbuild -ba 生成src包与二进制包吧
7.安装测试有没有问题,能否正常安装运行,能否正常升级,卸载有没有问题
root用户测试安装:
- cd /tmp
- cp /home/ibuler/rpmbuild/RPMS/x86_64/tengine-1.4.2-1.el6.x86_64.rpm /tmp
- rpm -ivh tengine-1.4.2-1.el6.x86_64.rpm ##测试安装
- rpm -e tengine ##测试卸载,如果版本号比原来的高,升级测试
8.如果没问题为rpm包签名吧,防止有人恶意更改 ##这个先不写了,有点晚了,以后补上
到此整个流程完毕。下面来说说其中最最重要的spec的格式,先说最简单的,最容易实现的
- vi tengine.spec
-
- ### 0.define section #自定义宏段,这个不是必须的
- ### %define nginx_user nginx #这是我们自定义了一个宏,名字为nginx_user值为nginx,%{nginx_user}引用
-
- ### 1.The introduction section #介绍区域段
-
- Name: tengine #名字为tar包的名字
- Version: 1.4.2 #版本号,一定要与tar包的一致哦
- Release: 1%{?dist} #释出号,也就是第几次制作rpm
- Summary: tengine from TaoBao #软件包简介,最好不要超过50字符
-
- Group: System Environment/Daemons #组名,可以通过less /usr/share/doc/rpm-4.8.0/GROUPS 选择合适组
- License: GPLv2 #许可,GPL还是BSD等
- URL: http://laoguang.blog.51cto.com #可以写一个网址
- Packager: Laoguang <ibuler@qq.com>
- Vendor: TaoBao.com
- Source0: %{name}-%{version}.tar.gz
- #定义用到的source,也就是你收集的,可以用宏来表示,也可以直接写名字,上面定义的内容都可以像上面那样引用
- #patch0: a.patch #如果需要补丁,依次写
- BuildRoot: %_topdir/BUILDROOT
- #这个是软件make install 的测试安装目录,也就是测试中的根,我们不用默认的,我们自定义,
- #我们可以来观察生成了哪此文件,方便写file区域
- BuildRequires: gcc,make #制作过程中用到的软件包
- Requires: pcre,pcre-devel,openssl,chkconfig #软件运行需要的软件包,也可以指定最低版本如 bash >= 1.1.1
- %description #软件包描述,尽情的写吧
- It is a Nginx from Taobao. #描述内容
-
- ### 2.The Prep section 准备阶段,主要目的解压source并cd进去
-
- %prep #这个宏开始
- %setup -q #这个宏的作用静默模式解压并cd
- #%patch0 -p1 #如果需要在这打补丁,依次写
-
- ### 3.The Build Section 编译制作阶段,主要目的就是编译
- %build
- ./configure \ #./configure 也可以用%configure来替换
- --prefix=/usr \ #下面的我想大家都很熟悉
- --sbin-path=/usr/sbin/nginx \
- --conf-path=/etc/nginx/nginx.conf \
- --error-log-path=/var/log/nginx/error.log \
- --http-log-path=/var/log/nginx/access.log \
- --pid-path=/var/run/nginx/nginx.pid \
- --lock-path=/var/lock/nginx.lock \
- --user=nginx \
- --group=nginx \
- --with-http_ssl_module \
- --with-http_flv_module \
- --with-http_stub_status_module \
- --with-http_gzip_static_module \
- --http-client-body-temp-path=/var/tmp/nginx/client/ \
- --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
- --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
- --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
- --http-scgi-temp-path=/var/tmp/nginx/scgi \
- --with-pcre
- make %{?_smp_mflags} #make后面的意思是:如果就多处理器的话make时并行编译
-
- ### 4.Install section 安装阶段
- %install
- rm -rf %{buildroot} #先删除原来的安装的,如果你不是第一次安装的话
- make install DESTDIR=%{buildroot}
- #DESTDIR指定安装的目录,而不是真实的安装目录,%{buildroot}你应该知道是指的什么了
-
- ### 4.1 scripts section #没必要可以不写
- %pre #rpm安装前制行的脚本
- if [ $1 == 1 ];then #$1==1 代表的是第一次安装,2代表是升级,0代表是卸载
- /usr/sbin/useradd -r nginx 2> /dev/null ##其实这个脚本写的不完整
- fi
- %post #安装后执行的脚本
-
- %preun #卸载前执行的脚本
- if [ $1 == 0 ];then
- /usr/sbin/userdel -r nginx 2> /dev/null
- fi
- %postun #卸载后执行的脚本
-
- ### 5.clean section 清理段,删除buildroot
-
- %clean
- rm -rf %{buildroot}
-
- ### 6.file section 要包含的文件
- %files
- %defattr (-,root,root,0755) #设定默认权限,如果下面没有指定权限,则继承默认
- /etc/ #下面的内容要根据你在%{rootbuild}下生成的来写
- /usr/
- /var/
-
- ### 7.chagelog section 改变日志段
- %changelog
- * Fri Dec 29 2012 laoguang <ibuler@qq.com> - 1.0.14-1
- - Initial version
到此一个简单的tengine RPM包制作好了。
三.RPM包制作拓展
下面我们来拓展一下,比如:我们想为tengine增加控制脚本,可以通过start|stop控制,我们还想更换一下默认的首页index.html,默认的fastcgi_params是不能直接连接php的,所以我们替换为新的配置文件,我们也可以用设置好的nginx.conf替换原来的nginx.conf。基于上述步骤下面继续
1.把修改后的首页文件index.html,控制脚本init.nginx,fastCGI配置文件fastcgi_params,Nginx配置文件nginx.conf 放到SOURCES中 。
- [ibuler@ng1 rpmbuild]$ ls SOURCES/
- fastcgi_params index.html init.nginx nginx.conf tengine-1.4.2.tar.gz
2 编辑tengine.spec,修改
2.1 介绍区域的SOURCE0下增加如下
- Source0: %{name}-%{version}.tar.gz
- Source1: index.html
- Source2: init.nginx
- Source3: fastcgi_params
- Source4: nginx.conf
2.2 安装区域增加如下
- make install DESTDIR=%{buildroot}
- %{__install} -p -D %{SOURCE1} %{buildroot}/usr/html/index.html #%{__install}这个宏代表install命令
- %{__install} -p -D -m 0755 %{SOURCE2} %{buildroot}/etc/rc.d/init.d/nginx
- %{__install} -p -D %{SOURCE3} %{buildroot}/etc/nginx/fastcgi_params
- %{__install} -p -D %{SOURCE4} %{buildroot}/etc/nginx/nginx.conf
2.3 脚本区域增加如下
- %post
- if [ $1 == 1 ];then
- /sbin/chkconfig --add nginx
- fi
2.4 %file区域增加如下
- %files
- %defattr (-,root,root,0755)
- /etc/
- /usr/
- /var/
- %config(noreplace) /etc/nginx/nginx.conf #%config表明这是个配置文件noplace表明不能替换
- %config(noreplace) /etc/nginx/fastcgi_params
- %doc /usr/html/index.html #%doc表明这个是文档
- %attr(0755,root,root) /etc/rc.d/init.d/nginx #%attr后面的是权限,属主,属组
3. 生成rpm文件测试
- rpmbuild -ba tengine.spec
4. 安装测试
到此RPM包制作完毕,你可以根据你的需求制作RPM包吧。
四.RPM包签名
1.生成GPG签名密钥,我用的是root用户
- gpg --gen-key
-
- Your selection?1<Enter> ##默认即可
- What keysize do you want? (2048) 1024<Enter> ##密钥长度
- Key is valid for? (0) 1y<Enter> ##有效期
- Is this correct? (y/N) y<Enter> ##确认
- Real name: LaoGuang<Enter> ##密钥名称
- Email address: ibuler@qq.com<Enter> ##邮件
- Comment: GPG-RPM-KEY<Enter> ##备注
- Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O<ENTER>
- Enter passphrase OK <Enter> ##使用空密码,也可以输入
- <Take this one anyway> <Enter>
- <Take this one anyway> <Enter>
有时可能因为随机数不够导致卡在那里,这时候你就yum 安装几个包组,马上就够了。
2.查看成生的密钥
- [root@ng1 dev]# gpg --list-keys
- /root/.gnupg/pubring.gpg
- ------------------------
- pub 1024R/49C99488 2012-11-28 [expires: 2013-11-28]
- uid LaoGuang (GPG-RPM-KEY) <ibuler@qq.com>
- sub 1024R/69BA199D 2012-11-28 [expires: 2013-11-28]
3.导出公钥以供大家使用验证
- gpg --export -a "LaoGuang" > RPM-GPG-KEY-LaoGuang
4.编缉 .rpmmacros说明我们用哪一个密钥加密,我们用root加密的那就在/root下编辑
- vi ~/.rpmmacros
- %_gpg_name LaoGuang
5.为rpm包加签名
- rpm --addsign tengine-1.4.2-1.el6.x86_64.rpm
- Enter pass phrase: ##输入密钥
- Pass phrase is good.
- tengine-1.4.2-1.el6.x86_64.rpm:
到此签名添加成功,下面来验证
6.讲刚才导出的公钥导入rpm中
- rpm --import RPM-GPG-KEY-LaoGuang
7.验证
- rpm --checksig tengine-1.4.2-1.el6.x86_64.rpm
-
- tengine-1.4.2-1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
到此整个过程完毕,你也试试吧
PS:觉的写的不错就赞一下吧,写篇文档不容易啊。Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
我有一个关于多维数组的初学者ruby问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu
问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub
我正在使用Ruby1.8。似乎downcase不会改变非拉丁字符。例如:"Δ".downcase返回“Δ”我知道在Ruby1.9.1及更高版本中,我可以使用UnicodeUtils(fromhere)。我试过了,它工作正常。返回上一个示例的"δ"。是否有适用于1.8Ruby的等效(或任何)解决方案? 最佳答案 nash@nash:~$ruby-vruby1.8.7(2011-02-18patchlevel334)[i686-linux]gem安装unicode(https://rubygems.org/gems/unicode)re
我正在使用Ruby制作一个命令行工具。它将在屏幕上打印大量文本。目前,我正在使用shell管道(may_app|more)来执行此操作。但我认为最好有一个默认的寻呼机。就像你在执行gitlog时看到的一样。可以使用git--nopagerlog禁用寻呼机。我已经完成了大量的谷歌工作并找到了一颗gem:hirb,但似乎有点矫枉过正。经过多次尝试,我目前正在使用shellwrapper来这样做:#!/bin/bash#xray.rbisthecorescript#doingthemainlogicandwill#outputmanyrowsoftexton#screenXRAY=$HOME
我想知道如何在shell中创建“全屏”窗口的外观,如在vim、emacs等中。是否可以在Ruby中以编程方式执行此操作?这对平台的依赖程度如何?编辑:我不是在寻找如何让我的shell进入全屏模式。我正在寻找一种方法来隐藏以前输入的命令并用应用程序“填充”shell屏幕。它适用于安装程序。 最佳答案 您可能正在寻找的是ncurses或S-Lang支持提供你的全TUI经验。Ruby的gem环境提供了几个可能值得探索的gem:$gemlist--remote|grep-icursescursesx(003)ffi-ncurses(0.4.
我想制作一个gem,当其他人尝试将它与MRI一起使用时,它将使用C代码,而当他们从JRuby中使用它时,它将使用Java代码。nokogiri和pumagems就是这样做的,我看过他们的代码,但没有看到他们是如何实现的。 最佳答案 这是通过使用rvm(或其他类似工具在rubies之间切换)和rake-compiler为您针对的不同平台交叉编译gem来完成的。.gemspec文件必须指定每个平台所需的文件;这是通过检查gem正在编译的平台来完成的:Gem::Specification.newdo|gem|#...ifRUBY_PLAT
我正在尝试实现/转换daltonize将色盲人的图像校正为ruby的算法。在javascript中编写了两个主要的引用实现和python+我不熟悉的语言/环境中的其他实现。我几乎没有图像处理方面的经验,更不用说VIPS/ruby-vips了。我想知道如何迈出第一步。该文档似乎主要使用C/C++,而在ruby方面很少。它也非常详细。我什至不确定要使用哪些基本操作。看起来lin函数是一个很好的起点,但我不确定如何应用它。任何具有VIPS经验的人都可能在几分钟内算出整个算法。我想知道是否有人可以给我一些关于从哪里开始的指示。具体来说:如何访问单个(R/G/B)元素?是否有基于道尔顿化
我有一个连接表create_table"combine_tags",force:truedo|t|t.integer"user_id"t.integer"habit_id"t.integer"valuation_id"t.integer"goal_id"t.integer"quantified_id"end其目的是让tag_cloud为多个模型工作。我把它放在application_controllerdeftag_cloud@tags=CombineTag.tag_counts_on(:tags)end我的tag_cloud看起来像这样:css_class%>#orthisdepen