# 安装软件

安装软件的几种方式:

  • 下载源代码包,手动编译出可执行文件,然后的操作同第二种方式。
    • 需要安装编译工具,比如 gcc、make 等。
  • 下载预编译包,将其中的库文件存放到 /usr/local 等目录下,将其中的可执行文件放到 /usr/local/bin 目录下。
    • 可能还需要安装依赖库、初始化配置。
    • 下载的预编译包不一定兼容本机运行。
  • 使用包管理工具,可以方便的安装软件(并安装依赖库、初始化配置)、更新软件、卸载软件。
    • RHEL、CentOS、Fedora 等 Linux 发行版采用 .rpm 格式的软件安装包,采用 yum 作为默认的包管理工具。
    • Ubuntu 等 Linux 发行版采用 .deb 格式的软件安装包,采用 apt 作为默认的包管理工具。

# rpm

:(Red Hat Package Manager),一个包管理工具,其软件安装包的扩展名为 .rpm 。

  • 命令:
    rpm
        -iv <name>.rpm     # 安装一个软件
        -Uv <name>.rpm     # 使用该 rpm 包升级某个已安装的软件
        -e <name>          # 卸载一个软件
        -qa                # 查看已安装的所有 rpm 包
        -ql <name>         # 查看某个包的安装位置
    
    • 例如:卸载 proftpd-1.2.3.rpm 时,可以执行 rpm -e proftpd-1.2.3 或 rpm -e proftpd 。
  • 访问网站 http://rpmfind.net/linux/RPM/ (opens new window) 可以搜索和下载常见的 rpm 包。
  • 直接安装 rpm 包时,容易遇到缺少依赖库的问题,所以应该通过包管理工具 yum 来安装。

# yum

:(Yellowdog Update Modifier),一个包管理工具。

  • 基于 rpm 工具,提供了更多功能,比如从软件仓库下载包,并自动安装其依赖包。

  • 命令:

    yum
        install <name>[-version]  # 安装一个软件包,不指定版本则安装最新版本
              -y                  # 在安装过程中遇到选项时都选择 yes
              --downloadonly --downloaddir=$PWD # 不安装,只是下载 rpm 包,包括所有依赖包,保存到当前目录
        remove <name>             # 卸载一个软件包
    
        makecache                 # 从服务器获取软件包的最新版本列表
        update                    # 根据 makecache 获得的版本列表,更新已安装的所有软件包
              [name]              # 只更新指定的软件包
    
        list                      # 显示本地仓库和远程仓库中所有可用的软件包
        search <name>             # 在软件列表中查找某个软件包
        info <name>               # 查看软件包的信息
    
        repolist                  # 显示已启用的软件包仓库
              all                 # 显示所有软件包仓库
        history                   # 查看 yum 的事务记录
                info <事务 id>    # 查看某次 yum 事务的详细信息
        clean all                 # 清除 yum 缓存的软件包和 header
    
  • yum 工具是采用 Python2 开发的,因此不能卸载或升级 CentOS 系统自带的 Python2 。

  • /etc/yum.conf 的配置示例:

    [main]
    cachedir=/var/cache/yum/$basearch/$releasever   # 一个目录,用于缓存下载的软件包
    keepcache=0                                     # 安装软件包之后,是否保留其缓存
    debuglevel=2
    logfile=/var/log/yum.log
    exactarch=1                                     # 升级软件包时,是否只采用 CPU 架构一致的软件包
    obsoletes=1                                     # 升级软件包时,是否启用过时处理逻辑
    gpgcheck=1                                      # 是否根据 gpg 签名,检查下载的文件是否被篡改
    plugins=1                                       # 是否启用插件
    # installonlypkgs=xx,xx,xx                      # 指定一些软件包,只安装,不升级
    # installonly_limit=5                           # 限制 installonlypkgs 中每个软件包可安装的版本数
    bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
    distroverpkg=centos-release                     # 指定一个软件包,用于判断当前 Linux 发行版的版本
    # reposdir=/etc/yum.repos.d/
    # proxy=socks5://10.0.0.1:1080                  # 使用代理
    
  • /etc/yum.repos.d/ 目录下保存了一些 .repo 文件,记录了 yum 可用的仓库源。

    • 修改仓库源之后,要执行 yum makecache 才会生效。
    • 一个 repo 文件中可以声明多个仓库源,每个仓库源的格式如下:
      [epel]                                                            # 仓库源的唯一标识符
      name=EPEL for redhat/centos $releasever - $basearch               # 仓库源的名称描述
      enabled=1                                                         # 是否启用
      baseurl=http://mirrors.tencentyun.com/epel/$releasever/$basearch/ # 基础链接
      gpgcheck=1                                                        # 是否检验文件
      gpgkey=http://mirrors.tencentyun.com/epel/RPM-GPG-KEY-EPEL-7      # 如果检验文件,则需要指定公钥文件
      
    • EPEL 是 Fedora 社区维护的仓库源,提供了常用的软件包。执行以下命令即可启用它:
      yum install epel-release
      
    • 例:下载阿里云的 repo 文件,使用阿里云的仓库源
      curl http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/CentOS-7-aliyun.repo
      

# dpkg

:(Debian Packager),一个包管理工具,其软件安装包的扩展名为 .deb 。

  • 命令:
    dpkg
        -i <name>.deb   # 安装一个软件包
        -r <name>       # 删除一个软件包,但是保留其配置文件
        -P <name>       # 删除一个软件包,并且删除其配置文件
        -l              # 查看已安装的所有 deb 包
        -L <name>       # 查看某个包的安装位置
    

# apt

:(Advanced Package Tool),一个包管理工具。

  • 基于 dpkg 工具,提供了更多功能,比如从软件仓库下载包,并自动安装其依赖包。
  • Debian 8 于 2015 年发布,将默认的包管理工具从 apt-get 改为 apt ,进行了一些优化。两个命令的用法大部分相同。
  • 命令:
    apt
        install <name>[=version]    # 安装一个软件包,不指定版本则安装最新版本
            --no-install-recommends # 默认会自动安装 recommends 类型的依赖包,除非启用该选项
            --install-suggests      # 默认不会自动安装 suggests 类型的依赖包,除非启用该选项
        remove <name>               # 卸载一个软件包
        update                      # 从服务器获取软件包的最新版本列表
        upgrade                     # 根据 update 获得的版本列表,更新已安装的所有软件包
              [name]                # 只更新指定的软件包
    
        list                        # 显示本地仓库和远程仓库中所有可用的软件包
        search <name>               # 在软件列表中查找某个软件包
        show <name>                 # 查看软件包的信息
    
  • /etc/apt/sources.list 文件中记录了 apt 可用的仓库源。
    • 修改仓库源之后,要执行 apt update 才能生效。
    • 例:下载腾讯云的 sources.list 文件,使用腾讯云的仓库源
      curl http://mirrors.cloud.tencent.com/repo/ubuntu20_sources.list -o /etc/apt/sources.list
      
  • 用 apt 安装一个软件包时,它可能依赖了其它软件包,分为以下几种类型:
    • depends :该依赖包是必需的,会被 apt 自动安装。如果依赖包安装失败,则当前包也不能安装。
    • recommends :该依赖包是推荐安装的,否则当前包可能缺少一些功能。
    • suggests :该依赖包是可选的,通常是提供一些额外功能。

# 相关命令

# install

:该命令用于将一个文件拷贝到指定目录,并设置可执行权限。相当于 cp+chmod 命令。

  • 用法:
    install <src> <dst>
        -o <uid>    # --owner ,设置文件所有者,默认为当前用户
        -g <gid>    # --group ,设置文件所有组,默认为当前用户组
        -m <mode>   # --mode ,设置文件权限,默认为 755
    
  • 例:
    install tmp.sh /usr/bin/