如何在RPM包中保留文件修改时间戳及相关安装问题咨询
问题解答
1. 如何保留文件原始时间戳?
RPM构建和安装过程中默认会重置文件的修改时间(mtime),要保留原始时间戳需要两步操作:
- 构建阶段保留时间戳:在RPM spec文件的
%install步骤中,直接用tar解压变更包到BUILDROOT,不要用cp命令。比如:
这里tar xpf %{SOURCE0} -C %{buildroot}xpf参数会保留文件的所有原始属性(包括时间戳、权限等)。 - 禁用rpmbuild的时间戳重置:在spec文件开头添加全局定义,关闭rpmbuild默认的文件属性修改操作:
这个配置会阻止rpmbuild在打包前重置BUILDROOT内文件的时间戳和权限,确保原始时间戳被写入RPM包。%global __os_install_post %{nil}
安装后,文件的原始时间戳就会被保留下来。
2. yum install的文件替换逻辑
yum安装RPM包时,处理逻辑如下:
- 普通文件:不管目标路径下的文件是否存在、内容是否一致,都会直接替换为RPM包内的文件,不会跳过。RPM认为包内的文件是权威版本,强制覆盖。
- 配置文件(标记为
%config的文件):如果目标路径的文件被用户修改过,yum会提示用户选择:保留现有文件、替换为包内版本,或者对比差异。未修改的配置文件会直接被替换。
3. yum安装时指定自定义位置?
yum本身不支持直接指定自定义安装路径,因为RPM包的文件安装路径是在spec文件中预先定义好的。但可以通过以下方法实现类似需求:
- 重新构建RPM包:修改spec文件中的安装路径,比如将默认的
/usr/bin改为/opt/myapp/bin,重新打包后再用yum安装。如果是累积补丁包,可以调整%install步骤中的解压路径。 - 使用rpm命令的
--relocate参数:先通过yum下载RPM包(yum download package-name),再用rpm命令安装并指定路径映射:
这个命令会把包内所有以rpm -i --relocate /usr=/opt/myapp package-name.rpm/usr开头的路径替换为/opt/myapp。 - 手动解压RPM包:用
rpm2cpio将RPM转换为cpio格式,再解压到自定义位置:
这种方式不会处理依赖和系统注册,适合临时测试或非系统级安装。rpm2cpio package-name.rpm | cpio -idmv -D /opt/myapp
内容的提问来源于stack exchange,提问作者ilavarasan M
相关产品推荐
相关产品推荐

