<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>idv2 &#187; rpm</title>
	<atom:link href="http://tech.idv2.com/tag/rpm/feed/" rel="self" type="application/rss+xml" />
	<link>http://tech.idv2.com</link>
	<description>关注Web开发技术，关注Internet。</description>
	<lastBuildDate>Tue, 27 Jul 2010 12:54:54 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>rpm -i &#8211;nodeps时出现警告的原因</title>
		<link>http://tech.idv2.com/2008/12/18/rpm-i-nodeps-warning/</link>
		<comments>http://tech.idv2.com/2008/12/18/rpm-i-nodeps-warning/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 06:30:58 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rpm]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/2008/12/18/rpm-i-nodeps-warning/</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>今天发现，制作的某个rpm包在执行 rpm -i --nodeps &lt;packagename.rpm&gt;时会出现以下的警告信息：</p>
<pre>warning: cannot get shared lock on /var/lib/rpm/Packages</pre>
<p>但如果不加--nodeps参数，就不会出现这个信息。</p>
<p>网上查了半天没找到相关资料，最后用排除法发现，SPEC文件的%post中有一行 rpm -qa，就是这行命令导致了该警告的发生。
原因尚且不明，估计是在安装过程中，rpm正在执行，此时在%post中再次启动rpm，当然会发生共享锁的错误。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>今天发现，制作的某个rpm包在执行 rpm -i --nodeps &lt;packagename.rpm&gt;时会出现以下的警告信息：</p>
<pre>warning: cannot get shared lock on /var/lib/rpm/Packages</pre>
<p>但如果不加--nodeps参数，就不会出现这个信息。</p>
<p>网上查了半天没找到相关资料，最后用排除法发现，SPEC文件的%post中有一行 rpm -qa，就是这行命令导致了该警告的发生。
原因尚且不明，估计是在安装过程中，rpm正在执行，此时在%post中再次启动rpm，当然会发生共享锁的错误。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2008/12/18/rpm-i-nodeps-warning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RPM的一些使用技巧及其他</title>
		<link>http://tech.idv2.com/2007/12/20/rpm-tips-and-etc/</link>
		<comments>http://tech.idv2.com/2007/12/20/rpm-tips-and-etc/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 02:26:41 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rpm]]></category>
		<category><![CDATA[sed]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/2007/12/20/rpm-tips-and-etc/</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>最近工作中用到的一些Linux小技巧，比较零散，所以没有分类整理，可能看起来比较麻烦。</p>
<p>查询某个RPM包依赖的包。-qR这么有用的参数rpm --help里面居然没有写！（仅写了长格式 --requires ）</p>
<pre>rpm -qR coreutils</pre>
<p>创建RPM包时的两个有用的设置：</p>
<pre># 防止创建带调试信息的RPM包
%define debug_package %{nil}

# 打包之前不要对目标文件做strip（如打包脚本时没必要strip）
%define __os_install_post %{nil}

# 禁止自动搜索依赖关系
Autoreq: no
Autoprov: no</pre>
<p>关于sed：sed正则表达式中的 . 符号匹配对象并不是“任意字符”而是“任意可显示的英文字符”，
包括英文字母、数字、特殊符号、空白等，但不包括0-31的控制字符和127以后的特殊字符。
因此在匹配非英文字符时要当心，虽然多语言版能匹配绝大部分的非英文字符，但也有特例。
目前发现 euc-jp 编码下的日文字符大部分都不能被匹配。例如：</p>
<pre>$ cat japanese
テスト
test 添付ファイル
$ sed -e 's/.*/__&amp;__/' &lt; japanese
____テスト
__test 添__付ファイル</pre>
<p>另一个使用sed的简单脚本，实现类似grep的功能，但它将匹配的行用特殊颜色显示：</p>
<pre># cat mgrep
#!/bin/sh

sed -e &quot;/$1/s/.*/\x1b[0;30;43m&amp;\x1b[m/&quot;</pre>
<p>如何将文件比较结果直接输出到vim中（因为vim有语法高亮）：</p>
<pre>$ diff foo bar | vi -</pre>
<p>另外<a href="http://www.dbanotes.net/">Fenng</a>最近提到的一篇<a href="http://www.dbanotes.net/techmemo/unix_rm_-f.html">关于防止 rm -rf /</a> 的文章也很有参考价值。</p>
<!-- end Pukiwiki generated code-->
]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>最近工作中用到的一些Linux小技巧，比较零散，所以没有分类整理，可能看起来比较麻烦。</p>
<p>查询某个RPM包依赖的包。-qR这么有用的参数rpm --help里面居然没有写！（仅写了长格式 --requires ）</p>
<pre>rpm -qR coreutils</pre>
<p>创建RPM包时的两个有用的设置：</p>
<pre># 防止创建带调试信息的RPM包
%define debug_package %{nil}

# 打包之前不要对目标文件做strip（如打包脚本时没必要strip）
%define __os_install_post %{nil}

# 禁止自动搜索依赖关系
Autoreq: no
Autoprov: no</pre>
<p>关于sed：sed正则表达式中的 . 符号匹配对象并不是“任意字符”而是“任意可显示的英文字符”，
包括英文字母、数字、特殊符号、空白等，但不包括0-31的控制字符和127以后的特殊字符。
因此在匹配非英文字符时要当心，虽然多语言版能匹配绝大部分的非英文字符，但也有特例。
目前发现 euc-jp 编码下的日文字符大部分都不能被匹配。例如：</p>
<pre>$ cat japanese
テスト
test 添付ファイル
$ sed -e 's/.*/__&amp;__/' &lt; japanese
____テスト
__test 添__付ファイル</pre>
<p>另一个使用sed的简单脚本，实现类似grep的功能，但它将匹配的行用特殊颜色显示：</p>
<pre># cat mgrep
#!/bin/sh

sed -e &quot;/$1/s/.*/\x1b[0;30;43m&amp;\x1b[m/&quot;</pre>
<p>如何将文件比较结果直接输出到vim中（因为vim有语法高亮）：</p>
<pre>$ diff foo bar | vi -</pre>
<p>另外<a href="http://www.dbanotes.net/">Fenng</a>最近提到的一篇<a href="http://www.dbanotes.net/techmemo/unix_rm_-f.html">关于防止 rm -rf /</a> 的文章也很有参考价值。</p>
<!-- end Pukiwiki generated code-->
]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2007/12/20/rpm-tips-and-etc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建交互式的rpm包</title>
		<link>http://tech.idv2.com/2007/10/25/interactive-rpm/</link>
		<comments>http://tech.idv2.com/2007/10/25/interactive-rpm/#comments</comments>
		<pubDate>Thu, 25 Oct 2007 14:42:26 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rpm]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/2007/10/25/interactive-rpm/</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>所谓交互式的rpm包，就是说在安装过程中接受用户输入，来完成诸如许可证确认、创建配置文件等工作。</p>
<p>首先要说明，<strong>不推荐使用rpm创建交互式安装包</strong>。rpm的设计目标就是在完全不需要用户干涉的前提下完成软件的安装、升级等工作，这样可以通过cron或者yum/apt/up2date等脚本完成自动安装和自动升级。而交互式rpm包将破坏这种特性。另外，通过图形界面安装rpm包时，交互式脚本将完全不能执行（因为没有终端）。因此，在rpm中执行脚本时，<strong>标准输入是被关闭的</strong>，也就是说你无法在rpm安装过程中获得任何用户输入。</p>
<p>但有时真的需要创建交互式rpm包，如迫于工作压力，或者创建内部使用的安装程序，或者作为产品分发给完全不懂计算机的用户等。虽然rpm中的脚本无法获取用户输入，但方法总是人想出来的。</p>
<p>我们知道在spec文件的%post节中可以书写bash脚本，而通过read命令可以获取用户输入。但如果在%post中使用read命令，你会发现read并不等到你输入而是直接就结束了。原因就是rpm安装时关闭了标准输入。我们可以手动将它重新打开，方法就是在read之前加入以下代码：</p>
<pre>exec 6&lt;&amp;0 0&lt;/dev/tty       # 将标准输入保存到6，然后在标准输入上打开/dev/tty
read MYVAR
exec 0&lt;&amp;6 6&lt;&amp;-               # 恢复备份的标准输入并关闭6</pre>
<p>当然标准输入(0)本身就是关闭的，所以不备份应该也无所谓。/dev/tty是指向用户控制台的一个链接，在命令行控制台和远程终端的情况下都可以正确使用。</p>
<!-- end Pukiwiki generated code-->]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>所谓交互式的rpm包，就是说在安装过程中接受用户输入，来完成诸如许可证确认、创建配置文件等工作。</p>
<p>首先要说明，<strong>不推荐使用rpm创建交互式安装包</strong>。rpm的设计目标就是在完全不需要用户干涉的前提下完成软件的安装、升级等工作，这样可以通过cron或者yum/apt/up2date等脚本完成自动安装和自动升级。而交互式rpm包将破坏这种特性。另外，通过图形界面安装rpm包时，交互式脚本将完全不能执行（因为没有终端）。因此，在rpm中执行脚本时，<strong>标准输入是被关闭的</strong>，也就是说你无法在rpm安装过程中获得任何用户输入。</p>
<p>但有时真的需要创建交互式rpm包，如迫于工作压力，或者创建内部使用的安装程序，或者作为产品分发给完全不懂计算机的用户等。虽然rpm中的脚本无法获取用户输入，但方法总是人想出来的。</p>
<p>我们知道在spec文件的%post节中可以书写bash脚本，而通过read命令可以获取用户输入。但如果在%post中使用read命令，你会发现read并不等到你输入而是直接就结束了。原因就是rpm安装时关闭了标准输入。我们可以手动将它重新打开，方法就是在read之前加入以下代码：</p>
<pre>exec 6&lt;&amp;0 0&lt;/dev/tty       # 将标准输入保存到6，然后在标准输入上打开/dev/tty
read MYVAR
exec 0&lt;&amp;6 6&lt;&amp;-               # 恢复备份的标准输入并关闭6</pre>
<p>当然标准输入(0)本身就是关闭的，所以不备份应该也无所谓。/dev/tty是指向用户控制台的一个链接，在命令行控制台和远程终端的情况下都可以正确使用。</p>
<!-- end Pukiwiki generated code-->]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2007/10/25/interactive-rpm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>关于RPM的%config和(noreplace)</title>
		<link>http://tech.idv2.com/2007/10/16/rpm-config-noreplace/</link>
		<comments>http://tech.idv2.com/2007/10/16/rpm-config-noreplace/#comments</comments>
		<pubDate>Tue, 16 Oct 2007 02:26:31 +0000</pubDate>
		<dc:creator>charlee</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[rpm]]></category>

		<guid isPermaLink="false">http://tech.idv2.com/2007/10/16/rpm-config-noreplace/</guid>
		<description><![CDATA[<!-- begin Pukiwiki generated code--><p>这篇文章翻译自<a href="http://www-uxsup.csx.cam.ac.uk/~jw35/docs/rpm_config.html">这里</a>，
是一篇关于制作RPM包中的一个比较难于理解的地方。
不做开发的同学就不要看了。</p>
<!-- end Pukiwiki generated code--><span id="more-526"></span><!-- begin Pukiwiki generated code--><p>RPM spec文件有个名为 %config 的宏，它可以标识配置文件，
这样在升级时用户对配置文件做过的修改就不会丢失。
没有它，用户千辛万苦修改过的配置文件会在升级过程中被覆盖。</p>
<p>%config也可以写成%config(noreplace)，不过网上关于它的说明却屈指可数。
下面是关于这两者的一些实验，都是在RedHat 9的RPM(rpm-4.2-0.69)上进行的，
其他版本有可能不同。</p>
<p>RPM中的文件的制约条件有三个：1. 该文件在spec中如何标识（默认，%config或者%config(noreplace)）；
2. 在rpm升级包中该文件是否被更新；3. 该文件是否被用户编辑过。</p>
<p>下表就是各个条件的组合结果。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">文件标识</td><td class="style_td">在RPM升级包中是否更新了？</td><td class="style_td">旧版本文件未被用户编辑过</td><td class="style_td">旧版本文件被用户编辑过</td></tr><tr><td class="style_td" rowspan="2">默认</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">用新文件覆盖</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">用新文件覆盖</td></tr><tr><td class="style_td" rowspan="2">%config</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">旧文件改名为.rpmsave并复制新文件</td></tr><tr><td class="style_td" rowspan="2">%config(noreplace)</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件，新文件安装为.rpmnew</td></tr></tbody></table></div>
<p>其中(noreplace)有效的两种情况上存在以下的问题：当spec文件中的定义改变时会发生什么？结论如下：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">文件标识</td><td class="style_td">在RPM升级包中是否更新了？</td><td class="style_td">旧版本文件被用户编辑过</td></tr><tr><td class="style_td">由%config(noreplace)改为%config</td><td class="style_td">Yes</td><td class="style_td">旧文件改名为.rpmsave并安装新文件</td></tr><tr><td class="style_td">由%config改为%config(noreplace)</td><td class="style_td">Yes</td><td class="style_td">保持旧文件，新文件安装为.rpmnew</td></tr></tbody></table></div>
<p>结论：非配置文件或是上次安装后没有被修改的文件会被RPM包内的新文件覆盖。
如果配置文件被修改过，但在新的RPM包中未作更新，则修改过的文件保留。
仅当配置文件被修改并且在新的RPM包中被更新时，具体动作取决于(noreplace)。
%config使得旧文件被改名为.rpmsave并安装新文件，而%config(noreplace)将保持旧文件
并将新文件安装为.rpmnew。</p>
<p>建议一般配置文件都标识为(noreplace)，除非升级所带来的配置文件变动非常重要，
使用上一版本的配置文件无法正常工作时才使用%config。</p>
<!-- end Pukiwiki generated code-->

]]></description>
			<content:encoded><![CDATA[<!-- begin Pukiwiki generated code--><p>这篇文章翻译自<a href="http://www-uxsup.csx.cam.ac.uk/~jw35/docs/rpm_config.html">这里</a>，
是一篇关于制作RPM包中的一个比较难于理解的地方。
不做开发的同学就不要看了。</p>
<!-- end Pukiwiki generated code--><span id="more-526"></span><!-- begin Pukiwiki generated code--><p>RPM spec文件有个名为 %config 的宏，它可以标识配置文件，
这样在升级时用户对配置文件做过的修改就不会丢失。
没有它，用户千辛万苦修改过的配置文件会在升级过程中被覆盖。</p>
<p>%config也可以写成%config(noreplace)，不过网上关于它的说明却屈指可数。
下面是关于这两者的一些实验，都是在RedHat 9的RPM(rpm-4.2-0.69)上进行的，
其他版本有可能不同。</p>
<p>RPM中的文件的制约条件有三个：1. 该文件在spec中如何标识（默认，%config或者%config(noreplace)）；
2. 在rpm升级包中该文件是否被更新；3. 该文件是否被用户编辑过。</p>
<p>下表就是各个条件的组合结果。</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">文件标识</td><td class="style_td">在RPM升级包中是否更新了？</td><td class="style_td">旧版本文件未被用户编辑过</td><td class="style_td">旧版本文件被用户编辑过</td></tr><tr><td class="style_td" rowspan="2">默认</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">用新文件覆盖</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">用新文件覆盖</td></tr><tr><td class="style_td" rowspan="2">%config</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">旧文件改名为.rpmsave并复制新文件</td></tr><tr><td class="style_td" rowspan="2">%config(noreplace)</td><td class="style_td">No</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件</td></tr><tr><td class="style_td">Yes</td><td class="style_td">用新文件覆盖</td><td class="style_td">保持旧文件，新文件安装为.rpmnew</td></tr></tbody></table></div>
<p>其中(noreplace)有效的两种情况上存在以下的问题：当spec文件中的定义改变时会发生什么？结论如下：</p>
<div class="ie5"><table class="style_table" cellspacing="1" border="0"><tbody><tr><td class="style_td">文件标识</td><td class="style_td">在RPM升级包中是否更新了？</td><td class="style_td">旧版本文件被用户编辑过</td></tr><tr><td class="style_td">由%config(noreplace)改为%config</td><td class="style_td">Yes</td><td class="style_td">旧文件改名为.rpmsave并安装新文件</td></tr><tr><td class="style_td">由%config改为%config(noreplace)</td><td class="style_td">Yes</td><td class="style_td">保持旧文件，新文件安装为.rpmnew</td></tr></tbody></table></div>
<p>结论：非配置文件或是上次安装后没有被修改的文件会被RPM包内的新文件覆盖。
如果配置文件被修改过，但在新的RPM包中未作更新，则修改过的文件保留。
仅当配置文件被修改并且在新的RPM包中被更新时，具体动作取决于(noreplace)。
%config使得旧文件被改名为.rpmsave并安装新文件，而%config(noreplace)将保持旧文件
并将新文件安装为.rpmnew。</p>
<p>建议一般配置文件都标识为(noreplace)，除非升级所带来的配置文件变动非常重要，
使用上一版本的配置文件无法正常工作时才使用%config。</p>
<!-- end Pukiwiki generated code-->

]]></content:encoded>
			<wfw:commentRss>http://tech.idv2.com/2007/10/16/rpm-config-noreplace/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
