【分享】RedHat Linux包管理方面的面试经验

系统 Linux 系统运维
大家好!我是来自Delhi的Shilpa Nair。我不久前才顺利毕业,正寻找一个实习的机会。在大学早期的时候,我就对UNIX十分喜爱,所以我也希望这个机会能适合我,满足我的兴趣。我被提问了很多问题,大部分都是关于 RedHat 包管理的基础问题。

有关 RPM 方面的 Linux 面试题 

“大家好!我是来自 Delhi 的Shilpa Nair。我不久前才顺利毕业,正寻找一个实习的机会。在大学早期的时候,我就对 UNIX 十分喜爱,所以我也希望这个面试机会能适合我,满足我的兴趣。我被提问了很多问题,大部分都是关于 RedHat 包管理的基础问题。”本文所有的问题和回答都是 Shilpa Nair 根据回忆重写的。 

下面就是我被问到的问题,和对应的回答。我仅贴出了与 RedHat GNU/Linux 包管理相关的,也是主要被提问的。

1.Linux 里如何查找一个包安装与否?假设你需要确认 ‘nano’ 有没有安装,你怎么做?

回答:为了确认 nano 软件包有没有安装,我们可以使用 rpm 命令,配合 -q 和 -a 选项来查询所有已安装的包

  1. # rpm -qa nano
  2. # rpm -qa | grep -i nano
  3.  
  4. nano-2.3.1-10.el7.x86_64

同时包的名字必须是完整的,不完整的包名会返回到提示符,不打印任何东西,就是说这包(包名字不全)未安装。下面的例子会更好理解些:

我们通常使用 vim 替代 vi 命令。当时如果我们查找安装包 vi/vim 的时候,我们就会看到标准输出上没有任何结果。

  1. # vi
  2. # vim

尽管如此,我们仍然可以像上面一样运行 vi/vim 命令来清楚地知道包有没有安装。只是因为我们不知道它的完整包名才不能找到的。如果我们不确切知道完整的文件名,我们可以使用通配符:

  1. # rpm -qa vim*
  2.  
  3. vim-minimal-7.4.160-1.el7.x86_64

通过这种方式,我们可以获得任何软件包的信息,安装与否。

2.你如何使用 rpm 命令安装 XYZ 软件包?

回答:我们可以使用 rpm 命令安装任何的软件包(*.rpm),像下面这样,选项 -i(安装),-v(冗余或者显示额外的信息)和 -h(在安装过程中,打印#号显示进度)。

  1. # rpm -ivh peazip-1.11-1.el6.rf.x86_64.rpm
  2.  
  3. Preparing... ################################# [100%]
  4. Updating / installing...
  5. 1:peazip-1.11-1.el6.rf ################################# [100%]

如果要升级一个早期版本的包,应加上 -U 选项,选项 -v 和 -h 可以确保我们得到用 # 号表示的冗余输出,这增加了可读性。

3.你已经安装了一个软件包(假设是 httpd),现在你想看看软件包创建并安装的所有文件和目录,你会怎么做?

回答:使用选项 -l(列出所有文件)和 -q(查询)列出 httpd 软件包安装的所有文件(Linux 哲学:所有的都是文件,包括目录)。

  1. # rpm -ql httpd
  2.  
  3. /etc/httpd
  4. /etc/httpd/conf
  5. /etc/httpd/conf.d
  6. ...

4.假如你要移除一个软件包,叫 postfix。你会怎么做?

回答:首先我们需要知道什么包安装了 postfix。查找安装 postfix 的包名后,使用 -e(擦除/卸载软件包)和 -v(冗余输出)两个选项来实现。

  1. # rpm -qa postfix*
  2.  
  3. postfix-2.10.1-6.el7.x86_64

然后移除 postfix,如下:

  1. # rpm -ev postfix-2.10.1-6.el7.x86_64
  2.  
  3. Preparing packages...
  4. postfix-2:3.0.1-2.fc22.x86_64

5.获得一个已安装包的具体信息,如版本,发行号,安装日期,大小,总结和一个简短的描述。

回答:我们通过使用 rpm 的选项 -qi,后面接包名,可以获得关于一个已安装包的具体信息。

举个例子,为了获得 openssh 包的具体信息,我需要做的就是:

  1. # rpm -qi openssh
  2.  
  3. [root@tecmint tecmint]# rpm -qi openssh
  4. Name : openssh
  5. Version : 6.8p1
  6. Release : 5.fc22
  7. Architecture: x86_64
  8. Install Date: Thursday 28 May 2015 12:34:50 PM IST
  9. Group : Applications/Internet
  10. Size : 1542057
  11. License : BSD
  12. ....

6.假如你不确定一个指定包的配置文件在哪,比如 httpd。你如何找到所有 httpd 提供的配置文件列表和位置。

回答: 我们需要用选项 -c 接包名,这会列出所有配置文件的名字和他们的位置。

  1. # rpm -qc httpd
  2.  
  3. /etc/httpd/conf.d/autoindex.conf
  4. /etc/httpd/conf.d/userdir.conf
  5. /etc/httpd/conf.d/welcome.conf
  6. /etc/httpd/conf.modules.d/00-base.conf
  7. /etc/httpd/conf/httpd.conf
  8. /etc/sysconfig/httpd

相似地,我们可以列出所有相关的文档文件,如下:

  1. # rpm -qd httpd
  2.  
  3. /usr/share/doc/httpd/ABOUT_APACHE
  4. /usr/share/doc/httpd/CHANGES
  5. /usr/share/doc/httpd/LICENSE
  6. ...

我们也可以列出所有相关的证书文件,如下:

  1. # rpm -qL openssh
  2.  
  3. /usr/share/licenses/openssh/LICENCE

忘了说明上面的选项 -d 和 -L 分别表示 “文档” 和 “证书”,抱歉。

#p#

7.你找到了一个配置文件,位于‘/usr/share/alsa/cards/AACI.conf’,现在你不确定该文件属于哪个包。你如何查找出包的名字?

回答:当一个包被安装后,相关的信息就存储在了数据库里。所以使用选项 -qf(-f 查询包拥有的文件)很容易追踪谁提供了上述的包。

  1. # rpm -qf /usr/share/alsa/cards/AACI.conf
  2. alsa-lib-1.0.28-2.el7.x86_64

类似地,我们可以查找(谁提供的)关于任何子包,文档和证书文件的信息。

8.你如何使用 rpm 查找最近安装的软件列表?

回答:如刚刚说的,每一样被安装的文件都记录在了数据库里。所以这并不难,通过查询 rpm 的数据库,找到最近安装软件的列表。

我们通过运行下面的命令,使用选项 -last(打印出最近安装的软件)达到目的。

  1. # rpm -qa --last

上面的命令会打印出所有安装的软件,最近安装的软件在列表的顶部。

如果我们关心的是找出特定的包,我们可以使用 grep 命令从列表中匹配包(假设是 sqlite ),简单如下:

  1. # rpm -qa --last | grep -i sqlite
  2.  
  3. sqlite-3.8.10.2-1.fc22.x86_64 Thursday 18 June 2015 05:05:43 PM IST

我们也可以获得10个最近安装的软件列表,简单如下:

  1. # rpm -qa --last | head

我们可以重定义一下,输出想要的结果,简单如下:

  1. # rpm -qa --last | head -n 2

上面的命令中,-n 代表数目,后面接一个常数值。该命令是打印2个最近安装的软件的列表。

9.安装一个包之前,你如果要检查其依赖。你会怎么做?

回答:检查一个 rpm 包(XYZ.rpm)的依赖,我们可以使用选项 -q(查询包),-p(指定包名)和 -R(查询/列出该包依赖的包,嗯,就是依赖)。

  1. # rpm -qpR gedit-3.16.1-1.fc22.i686.rpm
  2.  
  3. /bin/sh
  4. /usr/bin/env
  5. glib2(x86-32) >= 2.40.0
  6. gsettings-desktop-schemas
  7. gtk3(x86-32) >= 3.16
  8. gtksourceview3(x86-32) >= 3.16
  9. gvfs
  10. libX11.so.6
  11. ...

10.rpm 是不是一个前端的包管理工具呢?

回答不是!rpm 是一个后端管理工具,适用于基于 Linux 发行版的 RPM (此处指 Redhat Package Management)。

YUM,全称 Yellowdog Updater Modified,是一个 RPM 的前端工具。YUM 命令自动完成所有工作,包括解决依赖和其他一切事务。

最近,DNF(YUM命令升级版)在Fedora 22发行版中取代了 YUM。尽管 YUM 仍然可以在 RHEL 和 CentOS 平台使用,我们也可以安装 dnf,与 YUM 命令共存使用。据说 DNF 较于 YUM 有很多提高。

知道更多总是好的,保持自我更新。现在我们移步到前端部分来谈谈。

11.你如何列出一个系统上面所有可用的仓库列表。

回答:简单地使用下面的命令,我们就可以列出一个系统上所有可用的仓库列表。

  1. # yum repolist
  2. # dnf repolist
  3.  
  4. Last metadata expiration check performed 0:30:03 ago on Mon Jun 22 16:50:00 2015.
  5. repo id repo name status
  6. *fedora Fedora 22 - x86_64 44,762
  7. ozonos Repository for Ozon OS 61
  8. *updates Fedora 22 - x86_64 - Updates

上面的命令仅会列出可用的仓库。如果你需要列出所有的仓库,不管可用与否,可以这样做。

  1. # yum repolist all
  2. # dnf repolist all
  3.  
  4. Last metadata expiration check performed 0:29:45 ago on Mon Jun 22 16:50:00 2015.
  5. repo id repo name status
  6. *fedora Fedora 22 - x86_64 enabled: 44,762
  7. fedora-debuginfo Fedora 22 - x86_64 - Debug disabled
  8. fedora-source Fedora 22 - Source disabled
  9. ozonos Repository for Ozon OS enabled: 61
  10. *updates Fedora 22 - x86_64 - Updates enabled: 5,018
  11. updates-debuginfo Fedora 22 - x86_64 - Updates - Debug

12.你如何列出一个系统上所有可用并且安装了的包?

回答:列出一个系统上所有可用的包,我们可以这样做:

  1. # yum list available
  2. # dnf list available
  3.  
  4. ast metadata expiration check performed 0:34:09 ago on Mon Jun 22 16:50:00 2015.
  5. Available Packages
  6. 0ad.x86_64 0.0.18-1.fc22 fedora
  7. 0ad-data.noarch 0.0.18-1.fc22 fedora
  8. 0install.x86_64 2.6.1-2.fc21 fedora
  9. 0xFFFF.x86_64 0.3.9-11.fc22 fedora
  10. 2048-cli.x86_64 0.9-4.git20141214.723738c.fc22 fedora
  11. 2048-cli-nocurses.x86_64 0.9-4.git20141214.723738c.fc22 fedora
  12. ....

而列出一个系统上所有已安装的包,我们可以这样做。

  1. # yum list installed
  2. # dnf list installed
  3.  
  4. Last metadata expiration check performed 0:34:30 ago on Mon Jun 22 16:50:00 2015.
  5. Installed Packages
  6. GeoIP.x86_64 1.6.5-1.fc22 @System
  7. GeoIP-GeoLite-data.noarch 2015.05-1.fc22 @System
  8. NetworkManager.x86_64 1:1.0.2-1.fc22 @System
  9. NetworkManager-libnm.x86_64 1:1.0.2-1.fc22 @System
  10. aajohan-comfortaa-fonts.noarch 2.004-4.fc22 @System
  11. ....

#p#

而要同时满足两个要求的时候,我们可以这样做。

  1. # yum list
  2. # dnf list
  3.  
  4. Last metadata expiration check performed 0:32:56 ago on Mon Jun 22 16:50:00 2015.
  5. Installed Packages
  6. GeoIP.x86_64 1.6.5-1.fc22 @System
  7. GeoIP-GeoLite-data.noarch 2015.05-1.fc22 @System
  8. NetworkManager.x86_64 1:1.0.2-1.fc22 @System
  9. NetworkManager-libnm.x86_64 1:1.0.2-1.fc22 @System
  10. aajohan-comfortaa-fonts.noarch 2.004-4.fc22 @System
  11. acl.x86_64 2.2.52-7.fc22 @System
  12. ....

13.你会怎么在一个系统上面使用 YUM 或 DNF 分别安装和升级一个包与一组包?

回答:安装一个包(假设是 nano),我们可以这样做,

  1. # yum install nano

而安装一组包(假设是 Haskell),我们可以这样做,

  1. # yum groupinstall 'haskell'

升级一个包(还是 nano),我们可以这样做,

  1. # yum update nano

而为了升级一组包(还是 haskell),我们可以这样做,

  1. # yum groupupdate 'haskell'

14.你会如何同步一个系统上面的所有安装软件到稳定发行版?

回答:我们可以一个系统上(假设是 CentOS 或者 Fedora)的所有包到稳定发行版,如下,

  1. # yum distro-sync [在 CentOS/ RHEL]
  2. # dnf distro-sync [在 Fedora 20之后版本]

似乎来面试之前你做了相当不多的功课,很好!在进一步交谈前,我还想问一两个问题。

15.你对 YUM 本地仓库熟悉吗?你尝试过建立一个本地 YUM 仓库吗?让我们简单看看你会怎么建立一个本地 YUM 仓库。

回答:首先,感谢你的夸奖。回到问题,我必须承认我对本地 YUM 仓库十分熟悉,并且在我的本地主机上也部署过,作为测试用。

(1)为了建立本地 YUM 仓库,我们需要安装下面三个包:

  1. # yum install deltarpm python-deltarpm createrepo

(2)新建一个目录(假设 /home/$USER/rpm),然后复制 RedHat/CentOS DVD 上的 RPM 包到这个文件夹下

  1. # mkdir /home/$USER/rpm
  2. # cp /path/to/rpm/on/DVD/*.rpm /home/$USER/rpm

(3)新建基本的库头文件如下。

  1. # createrepo -v /home/$USER/rpm

(4)在路径 /etc/yum.repo.d 下创建一个 .repo 文件(如 abc.repo):

  1. cd /etc/yum.repos.d && cat << EOF abc.repo
  2. [local-installation]name=yum-local
  3. baseurl=file:///home/$USER/rpm
  4. enabled=1
  5. gpgcheck=0
  6. EOF

重要:用你的用户名替换掉 $USER。

以上就是创建一个本地 YUM 仓库所要做的全部工作。我们现在可以从这里安装软件了,相对快一些,安全一些,并且最重要的是不需要 Internet 连接。

责任编辑:火凤凰 来源: Linux中国
相关推荐

2022-05-07 11:08:50

Linuxapt 命令

2021-02-05 07:48:06

Linux操作系统软件

2022-05-04 11:10:58

Linuxdnf 命令

2009-12-17 09:49:18

Ruby代码管理

2020-07-16 07:00:49

容器管理考量

2015-11-03 14:23:10

新手Arch LinuxLinux

2022-05-26 10:23:06

CIO数字化转型

2011-01-14 12:43:58

2012-02-17 09:33:52

虚拟化桌面虚拟化

2010-07-30 13:06:22

NFS端口

2011-02-16 08:56:19

2020-02-18 15:53:09

AI 数据人工智能

2021-12-30 11:01:26

数字化转型企业技术服务

2016-12-13 15:18:27

机器学习搜索交互

2013-08-08 10:12:00

华为解决方案华为

2012-05-21 10:13:12

Linux系统管理

2020-06-15 19:20:00

AppImageLinux软件包管理

2021-04-20 14:25:24

云计算云安全

2023-08-03 08:05:46

面试后端查询
点赞
收藏

51CTO技术栈公众号