在SPEC文件的%file段通常有一指令:%config(noreplace),这个指令是用来干什么的,和%config有什么区别呢?
1. 一个文件没有被 %config
或 %config(noreplace)
指令配置
此时,不管该文件在安装完成后,有没有在本地被修改过,当升级该 rpm 包时,该文件会被这个新的 rpm 包的里的同名文件替换,(旧文件被删除)。
2. 一个文件被 %config
指令配置
- 该文件在新的 rpm 包里相对之前的 rpm 有变化,且在本地没有被修改过。
此时执行rpm -Uvh xxxx时,新rpm包里的该文件会替换旧的文件。(旧文件被删除)
- 该文件在新的 rpm 包里相对之前的 rpm 有变化,且在本地被修改过。
此时执行 rpm -Uvh xxxx 时,新 rpm 包里的该文件会替换掉掉旧的文件,旧的文件会被保存为 xx.rpmsave,如 /etc/redis/redis.conf.rpmsave。
- 该文件在新的 rpm 包里相对之前的 rpm 没有变化,且在本地没有被修改过。
此时执行r pm -Uvh xxxx 时,新 rpm 包里的该文件会替换掉旧的文件。(旧文件被删除)
- 该文件在新的 rpm 包里相对之前的 rpm 没有变化,且在本地被修改过。
此时执行 rpm -Uvh xxxx 时,新 rpm 包里的该文件不会覆盖旧的文件,旧文件保持不变。
3. 一个文件被 %config(noreplace)
指令配置
- 该文件在新的 rpm 包里相对之前的 rpm 有变化,且在本地没有被修改过。
此时执行rpm -Uvh xxxx 时,新rpm包里的该文件会替换旧的文件。(旧文件被删除)
- 该文件在新的 rpm 包里相对之前的 rpm 有改变,且在本地被修改过。
此时执行rpm -Uvh xxxx 时,旧文件保持不变,新 rpm 包里的该文件被命名为xxxx.rpmnew。
- 该文件在新的 rpm 包里相对之前的 rpm 没有变化,且在本地没有被修改过。
此时执行 rpm -Uvh xxxx 时,新 rpm 包里的该文件会替换旧的文件。(旧文件被删除)
- 该文件在新的 rpm 包里相对之前的 rpm 没有变化,且在本地被修改过。
此时执行 rpm -Uvh xxxx 时,新rpm包里的该文件不会覆盖旧的文件,旧文件保持不变。
4.总结
文件标识 | 在RPM升级包中是否更新了? | 旧版本文件未被用户编辑过 | 旧版本文件被用户编辑过 |
默认 | No | 用新文件覆盖 | 用新文件覆盖 |
Yes | 用新文件覆盖 | 用新文件覆盖 | |
%config | No | 用新文件覆盖 | 保持旧文件 |
Yes | 用新文件覆盖 | 旧文件改名为.rpmsave并复制新文件 | |
%config(noreplace) | No | 用新文件覆盖 | 保持旧文件 |
Yes | 用新文件覆盖 | 保持旧文件,新文件安装为.rpmnew |
其中(noreplace)有效的两种情况上存在以下的问题:当spec文件中的定义改变时会发生什么?结论如下:
文件标识 | 在RPM升级包中是否更新了? | 旧版本文件被用户编辑过 |
由%config(noreplace)改为%config | Yes | 旧文件改名为.rpmsave并安装新文件 |
由%config改为%config(noreplace) | Yes | 保持旧文件,新文件安装为.rpmnew |