update-alternatives详解

1、简介

update-alternatives 可以创建、删除、修复、软连接,还能显示出已存在软连接的信息,而所有的这些就构成了备选方案系统(alternatives system)。

很多时候我们会将拥有相同或相似功能的不同应用程序安装在同一个操作系统上,例如同一个操作系统上的不同文本编辑器。这给了这个系统的用户在编辑文本时有了更多的选择,如果用户愿意他们可以自由选择任意一个来使用。但是假如用户没有指定他想用哪一个编辑器,那么会怎样呢?对于程序来说它很尴尬,因为它没有人一样的意愿去做出一个所谓“好”的选择。

不过alternatives系统的出现解决了这个问题。文件系统中的一个共用名(generic name)被那些拥有可交换功能的文件所共享,而备选方案系统和系统管理员共同决定具体是哪一个文件被这个共用名所指定(就是说备选方案系统并不能彻底地帮助用户来管理软连接,毕竟以人为本嘛)。举个例子,如果文本编辑器ed(1)和nvi(1)被安装在一个系统里,并且假定备选系统方案让共用名(/usr/bin/editor)默认指向/usr/bin/nvi,那么系统管理员就可以废除这个指定并且让共用名指向/usr/bin/ed,之后除非有特别明确的必要,否则备选方案系统不会改变这个设定。

其实,共用名并不是直接指向已选定程序(命令)的软连接,而是指向备选方案目录(alternatives directory)中的一个名字。这个名字也是一个软连接,它才是直接指向已选定程序(命令)。这种机制的目的是将管理员所做的更改限定在/etc目录下的相应配置文件中:FHS可以很好地给出这样做的好处。

当任意一个提供特定功能的文件(程序/包)被安装、删除或者更改,update-alternatives都会被调用以更新备选方案中相应文件的信息。update-alternatives经常被Debian包中psstinst(配置)或prerm(安装)脚本调用。

那些为了更好地发挥作用而被同步的多个备选方案被称作组;例如,当多个版本的vi编辑器都被安装时,被/usr/share/man/man1/vi.1指定的man page就应该跟当前被/usr/bin/vi指定的vi版本相对应(不同版本的vi都有各自的man,我们要做的就是要man的时候显示的man page与我们正在使用的vi编辑器对应)。

每一个链接组(link group)都有两种不同的模式:自动模式和手动模式,任一给定时刻一个组都是而且只能是其中的一种模式。如果一个组处于自动模式,当包被安装或删除时,备选方案系统会自己决定是否和如何来更新相应链接(links)。如果处于手动模式,备选方案系统会保留原先管理员所做的选择并且避免改变链接(除非发生broken)。

当第一次被安装到系统时链接组被分配为自动模式;如果之后系统管理员对模式的设置做出更改,这个组会被自动转换为手动模式。

备选方案都有自己的级别(priority);当一个链接组处于自动模式时,它的成员会指向级别高的备选方案。

当使用--config选项时,update-alternatives 会列出所有链接组的主链接名,当前被选择的组会以*号标出。可以在提示下对链接指向做出改变,不过这会将模式变为手动。如果想回复自动模式,你可以使用--auto选项,或者--config重新选择标为自动的组。

如果你不想用--config提供的交互模式,你也可以使用--set选项

提供相同文件的不同包需要进行同步,换句话说,update-alternatives的使用是对所用牵连的包起作用的。

update-alternatives是用来维护系统命令的符号链接,以决定系统默认使用什么命令,可以设置系统默认加载的首选程序

我们可能会同时安装有很多功能类似的程序和可选配置,如Web浏览器程序(firefox,konqueror)、窗口管理器(wmaker、metacity)和鼠标的不同主题等。这样,用户在使用系统时就可进行选择,以满足自已的需求。

但对于普通用户来说,在这些程序间进行选择配置会较困难。update-alternatives工具就是为了解决这个问题,帮助用户能方便地选择自已喜欢程序和配置系统功能。

比如我系统已安装有java 1.6,还想要安装java 1.7,但我不想卸载java 1.6。就可以通过update-alternatives  --config在多个java版本间进程切换。update-alternatives是用于在多个同类型命令中进行切换的一个命令。

在说明update-alternatives的详细用法之前,先让我们看看系统中已有的例子。

打开终端,执行下面的命令:

[[email protected] ~]# java -version
java version "1.7.0_45"
OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
[[email protected] ~]# which java
/usr/bin/java
[[email protected] ~]# ls -l /usr/bin/java
lrwxrwxrwx. 1 root root 22 Dec  8 20:49 /usr/bin/java -> /etc/alternatives/java
[[email protected] ~]# ls -l /etc/alternatives/java
lrwxrwxrwx. 1 root root 46 Dec  8 20:49 /etc/alternatives/java -> /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java

java这个可执行命令实际是一个链接,指向了/etc/alternatives/java。而这个也是一个链接,指向了/usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java这才是最终的可执行文件。之所以建立这样两个链接,是为了方便脚本程序的编写和系统的管理。

2、使用

[email protected] alternatives]# ll $(which update-alternatives)
lrwxrwxrwx. 1 root root 12 10月 27 16:39 /usr/sbin/update-alternatives -> alternatives
[[email protected] alternatives]# ll $(which alternatives)
-rwxr-xr-x 1 root root 27496 9月  23 2013 /usr/sbin/alternatives

以上可知:update-alternatives和alternatives是同一个命令,只是为了和debian系统一吗?

命令格式:

update-alternatives  [options]  command

[[email protected] ~]$ update-alternatives
alternatives(备用)版本 1.3.61 - 版权 (C) 2001 红帽公司
在 GNU 公共许可条款下,本软件可被自由地重发行。
 
用法:alternatives --install <链接> <名称> <路径> <优先度>
                    [--initscript <服务>]
                    [--slave <链接> <名称> <路径>]*
       alternatives --remove <名称> <路径>
       alternatives --auto <名称>
       alternatives --config <名称>
       alternatives --display <名称>
       alternatives --set <名称> <路径>
       alternatives --list
 
公用选项:--verbose --test --help --usage --version
                --altdir <目录> --admindir <目录>

install选项

install选项的功能就是增加一组新的系统命令链接符了

使用语法:

update-alternatives  --install link name path priority [--slave link name path]...

其中link为系统中功能相同软件的公共链接目录,比如/usr/bin/java(需绝对目录);

name为命令链接符名称,如java;

path为你所要使用新命令、新软件的所在目录;

priority为优先级,当命令链接已存在时,需高于当前值,因为当alternative为自动模式时,系统默认启用priority高的链接;

--slave为从alternative。

alternative有两种模式:auto和manual,默认都为auto模式,因为大多数情况下update-alternatives命令都被postinst (configure) or prerm (install)调用的,如果将其更改成手动的话安装脚本将不会更新它了。

例如:

update-alternatives --install /usr/bin/java java /usr/local/lib/java/jdk1.7.0_67 17067   
# /usr/bin/java   java link所在的路径
# java  创建link的名称
# /usr/local/lib/java/jdk1.7.0_67  java链接指向的路径
# 17067  根据版本号设置的优先级(更改的优先级需要大于当前的)

注意:

这里,你不需要再/etc/alternatives/下面建立任何你想设置的链接名称,因为这完全可以通过update-alternative  --install命令来实现;而且你也不需要在/usr/bin/目录下建立相关链接名称,理由同上。你只需要确定这几个功能类似的软件的源目的地,然后执行如下命令:(以gcc为例)
#sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-3.3 100(这个优先级100必须键入)
#sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.1 90
#sudo update-alternatives --install /usr/bin/gcc gcc /ur/bing/gcc-4.2 80

remove选项

remove选项的功能是删除一个alternative及相关从alternative

使用语法:

update-alternatives --remove name path

其中name与path与install中的一致,如果所删除的链接组中还有其他链接的话,系统将会自动从其他中选择一个priority高的链接作为默认为链接。

例如:update-alternatives --remove  java /usr/local/lib/java/jdk1.7.0_67

auto选项

auto选项用于修改命令的模式,

语法如下:

update-alternatives --auto name    #只有两个auto和manual模式,默认都为auto模式

config选项

 config选项功能为在现有的命令链接选择一个作为系统默认的

使用语法为:

update-alternatives --config name

 [[email protected] yxkong]# update-alternatives --config java
共有 2 个提供“java”的程序。
  选项    命令
-----------------------------------------------
*+ 1      /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java
   2      /usr/local/lib/java/jdk1.7.0_67/bin/java
   按 Enter 保留当前选项[+],或者键入选项编号:2

这里才是配置版本的重点,当系统中有多个版本时,可以通过该命令设置默认版本,类似于默认程序

星号表示当前系统使用的,加号表示优先级最高的。输入数值可修改默认配置,直接按回车保持原来状态。

display选项

 display选项的功能就是查看一个命令链接组的所有信息,包括链接的模式(自动还是手动)、链接priority值、所有可 用的链接命令等等。

使用语法:

update-alternatives --display name

[[email protected] ~]$ update-alternatives --display java
java - 状态为手工。
链接当前指向 /usr/local/lib/java/jdk1.7.0_67/bin/java
/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java - 优先度 170051
....
当前“最佳”版本是 /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/bin/java。
[[email protected] ~]# alternatives --display mta
mta - status is auto.
 link currently points to /usr/sbin/sendmail.postfix
/usr/sbin/sendmail.postfix - priority 30
 slave mta-mailq: /usr/bin/mailq.postfix
 slave mta-newaliases: /usr/bin/newaliases.postfix
 slave mta-pam: /etc/pam.d/smtp.postfix
 slave mta-rmail: /usr/bin/rmail.postfix
 slave mta-sendmail: /usr/lib/sendmail.postfix
 slave mta-mailqman: /usr/share/man/man1/mailq.postfix.1.gz
 slave mta-newaliasesman: /usr/share/man/man1/newaliases.postfix.1.gz
 slave mta-sendmailman: /usr/share/man/man1/sendmail.postfix.1.gz
 slave mta-aliasesman: /usr/share/man/man5/aliases.postfix.5.gz
Current `best‘ version is /usr/sbin/sendmail.postfix.
[[email protected] alternatives]# update-alternatives --display mta
mta - 状态是自动。
 链接目前指向 /usr/sbin/sendmail.postfix
/usr/sbin/sendmail.postfix - 优先度 30
 从 mta-mailq:/usr/bin/mailq.postfix
 从 mta-newaliases:/usr/bin/newaliases.postfix
 从 mta-pam:/etc/pam.d/smtp.postfix
 从 mta-rmail:/usr/bin/rmail.postfix
 从 mta-sendmail:/usr/lib/sendmail.postfix
 从 mta-mailqman:/usr/share/man/man1/mailq.postfix.1.gz
 从 mta-newaliasesman:/usr/share/man/man1/newaliases.postfix.1.gz
 从 mta-sendmailman:/usr/share/man/man1/sendmail.postfix.1.gz
 从 mta-aliasesman:/usr/share/man/man5/aliases.postfix.5.gz
当前“最佳”版本是 /usr/sbin/sendmail.postfix。
时间: 2024-12-17 07:38:41

update-alternatives详解的相关文章

SQL Update 语句详解

Update 语句 Update 语句用于修改表中的数据. 语法: UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 Person: LastName FirstName Address City Gates Bill Xuanwumen 10 Beijing Wilson   Champs-Elysees   更新某一行中的一个列 我们为 lastname 是 "Wilson" 的人添加 firstname: UPDATE Person SET First

Informatica Update 机制详解

http://wenku.baidu.com/link?url=LhVPgl5mYzQsWClWWkZNbLe7zzSW5xsmpavp5wq_gCzcp7RSnvcSDIkQYz0bPYc1j83ZY4zDIVuLR1w7cUvRVX3XoAWaBX71CJomm6OUgHi 百度文库有详细解说,非常详细,推荐阅读.

EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

EntityFramework Core 1.1方法理论详解 当我们利用EF Core查询数据库时如果我们不显式关闭变更追踪的话,此时实体是被追踪的,关于变更追踪我们下节再叙.就像我们之前在EF 6.x中讨论的那样,不建议手动关闭变更追踪,对于有些特殊情况下,关闭变更追踪可能会导致许多问题的发生. 实体状态 对于EF Core 1.1中依然有四种状态,有的人说不是有五种状态么,UnChanged.Added.Modified.Deleted.Detached.如果我们按照变更追踪来划分的话,实际

update和saveOrUpdate详解

在Hibernate中,最核心的概念就是对PO的状态管理.一个PO有三种状态: 1.未被持久化的VO 此时就是一个内存对象VO,由JVM管理生命周期 2.已被持久化的PO,并且在Session生命周期内 此时映射数据库数据,由数据库管理生命周期 3.曾被持久化过,但现在和Session已经detached了,以VO的身份在运行 这种和Session已经detached的PO还能够进入另一个Session,继续进行PO状态管理,此时它就成为PO的第二种状态了.这种PO实际上是跨了Session进行

091:QuerySet API详解-update和delete

QuerySet API详解-update和delete: update :执行更新操作,在 SQL 底层走的也是 update 命令.比如要将所有 图书的价格提高五元.示例代码如下: Book.objects.update(price=F("price") + 5) # 对比一下上下两种方式 # books = Book.objects.all() # for item in books: # item.price += 5 # item.save() 注意这个方法走的是更新的逻辑.

Varnish 3.X详解

一.varnish定义 Varnish与一般服务器软件类似,分为master(management)进程和child(worker,主要做cache的工作)进程.master进程读入命令,进行一些初始化,然后fork并监控child进程.child进程分配若干线程进行工作,主要包括一些管理线程和很多woker线程. 在网站并发量过大时:无法通过向上或向外扩展来解决时:必须引入缓存来减小服务器的压力:而互联网在传输过程中三个关键点:客户端入口.传输中间路由.服务器端出口:相对于响应报文缓存可以解决

Spring事务管理(详解+实例)

写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: Spring事务机制详解 Spring事务配置的五种方式 Spring中的事务管理实例详解 1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是要么都执行要么都

.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)

阅读目录: 1.环路执行对象模型.碎片化执行模型(假递归式调用) 2.N层对象执行模型(纵横向对比链式扩展方法) 3.LINQ查询表达式和链式查询方法其实都是空壳子 4.详细的对象结构图(对象的执行原理) 5.IQueryable<T>与IQueryProvider一对一的关系能否改成一对多的关系 6.完整的自定义查询 1]. 环路执行对象模型.碎片化执行模型(假递归式调用) 这个主题扯的可能有点远,但是它关系着整个LINQ框架的设计结构,至少在我还没有搞懂LINQ的本意之前,在我脑海里一直频

mybatis中的mapper接口文件以及example类的实例函数以及详解

##Example example = new ##Example(); example.setOrderByClause("字段名 ASC"); //升序排列,desc为降序排列. example.setDistinct(false)//去除重复,boolean型,true为选择不重复的记录. Criteria criteria = new Example().createCriteria(); is null;is not null; equal to(value);not equ

CentOS 7以yum方式安装zabbix3.2及配置文件详解

一.zabbix简介与环境准备 简介详见 ---> zabbix简介 环境准备: CentOS 7(node7):zabbix-server,web,mysql,agent mariadb:5.5.50 zabbix组件:3.2.1 apache:2.4.6 二.安装与配置 1.安装数据库(mariadb),可直接yum安装 [[email protected] ~]# vim /etc/yum.repos.d/MariaDB.repo [mariadb]  name = MariaDB  ba