|
补充e托妮dpkg一文,如有需要,尽管合并。
diversions系统
dpkg-divert用来安装一个文件到非默认的安装位置,通常被用来处理文件冲突,但不到万不得已,最好不使用。系统所有的diversions都被存储在/var/lib/dpkg/diversions,也可通过dpkg-divert --list查看当前系统所有的diversions。
比如nvidia-glx,会安装/usr/lib/libGL.so.1,但这个文件也存在于libgl1-mesa,而nvidia-glx的libGL.so.1是应该排它的,也就是说无论libgl1-mesa安装在前还是后,相同的文件都应该被转移,于是通过nvidia-glx的preinst脚本,使用:
- dpkg-divert --remove --rename --package nvidia-glx --divert /usr/lib/nvidia/libGL.so.1.xlibmesa /usr/lib/libGL.so.1
复制代码
将libgl1-mesa带来的/usr/lib/libGL.so.1转移到/usr/lib/nvidia/libGL.so.1.xlibmesa,如果要清除nvidia-glx,则需要通过postrm脚本解除这一转移。
alternatives系统
多个软件包会提供同样的组件和功能,这时就要用到alternatives机制来选择默认哪个作为默认,举例说明:
pg, more和less同时提供了pager这个分页器,它们会通过postinst脚本(pg和more都属于util-linux)创建pager这个alternative组,并把自身加入备选列表,这个列表存储在/var/lib/alternatives/pager文件中。
/var/lib/alternative/pager的格式如下:
- auto
- /usr/bin/pager
- pager.1.gz
- /usr/share/man/man1/pager.1.gz
- /bin/more
- 50
- /usr/share/man/man1/more.1.gz
- /usr/bin/pg
- 10
- /usr/share/man/man1/pg.1.gz
- /usr/bin/less
- 77
- /usr/share/man/man1/less.1.gz
复制代码
这个文件的第一个第一行是auto,这是说明当前pager这个组处于自动模式,也就是系统默认模式,系统管理员没有进行过设置,这时alternative会自动将pager指向优先级别高的备选者。第二行/usr/bin/pager是当前组的主(master)链接的路径,一般是主要的执行程序,第三行和第四行分别是次链接(slave)的名字和路径,次链接始终跟随主链接的变化,主链接和次链接一般指向/etc/alternatives下的同名符号链接文件,但这个链接名字是可以指定的,而/etc/alternatives/下面的符号链接,则指向当前的默认提供者。接下来隔开一个空白行,就是这个组的三个备选者,格式是主(master),优先级,次(slave)。可以看出less的优先级最高,为77,一般情况下功能越丰富,优先级越高。前面说过在自动模式下,alternative系统自动将链接指向组中级别最高的备选者,因此/etc/alternatives/pager指向/usr/bin/less,因为这个组的主链接也就是/usr/bin/pager指向/etc/alternatives/pager,因此当前pager命令实际就是指向/usr/bin/less,次链接也就是manpage与此相同。
系统管理员可以通过update-alternatives命令重新设置某个组的默认提供者,
update-alternatives --list pager, 显示pager的多个备选
update-alternatives --display pager详细列出这个组的主,次链接的备选者,模式,每个备选者的优先级别,当前主链接的指向。
update-alternatives --config 提供一个菜单,让系统管理员改变默认的提供者,一旦作出改变,模式将会变为 手动(manual),下次运行update-alternatives时,比如新加入一个pager的提供者(或许如most),即便优先级再高,系统将不会自动选择链接。
此外还有--install --remove等参数用来把某个提供者从某个组加入或移除,一般都是postinst和prerm脚本调用的。
行笔至此,突然发现以前安装了eterm,现在已经purge,但eterm还存在于 /var/lib/dpkg/alternatives/x-terminal-emulator列表中,也就是说prerm脚本没有将eterm从alternative列表中移除,这是不是个bug? |
|