【分享】RedHat Linux包管理方面的面試經(jīng)驗(yàn)
有關(guān) RPM 方面的 Linux 面試題
“大家好!我是來自 Delhi 的Shilpa Nair。我不久前才順利畢業(yè),正尋找一個(gè)實(shí)習(xí)的機(jī)會(huì)。在大學(xué)早期的時(shí)候,我就對(duì) UNIX 十分喜愛,所以我也希望這個(gè)面試機(jī)會(huì)能適合我,滿足我的興趣。我被提問了很多問題,大部分都是關(guān)于 RedHat 包管理的基礎(chǔ)問題。”本文所有的問題和回答都是 Shilpa Nair 根據(jù)回憶重寫的。
下面就是我被問到的問題,和對(duì)應(yīng)的回答。我僅貼出了與 RedHat GNU/Linux 包管理相關(guān)的,也是主要被提問的。
1.Linux 里如何查找一個(gè)包安裝與否?假設(shè)你需要確認(rèn) ‘nano’ 有沒有安裝,你怎么做?
回答:為了確認(rèn) nano 軟件包有沒有安裝,我們可以使用 rpm 命令,配合 -q 和 -a 選項(xiàng)來查詢所有已安裝的包
# rpm -qa nano
或
# rpm -qa | grep -i nano
nano-2.3.1-10.el7.x86_64
同時(shí)包的名字必須是完整的,不完整的包名會(huì)返回到提示符,不打印任何東西,就是說這包(包名字不全)未安裝。下面的例子會(huì)更好理解些:
我們通常使用 vim 替代 vi 命令。當(dāng)時(shí)如果我們查找安裝包 vi/vim 的時(shí)候,我們就會(huì)看到標(biāo)準(zhǔn)輸出上沒有任何結(jié)果。
# vi
# vim
盡管如此,我們?nèi)匀豢梢韵裆厦嬉粯舆\(yùn)行 vi/vim 命令來清楚地知道包有沒有安裝。只是因?yàn)槲覀儾恢浪耐暾挪荒苷业降?。如果我們不確切知道完整的文件名,我們可以使用通配符:
# rpm -qa vim*
vim-minimal-7.4.160-1.el7.x86_64
通過這種方式,我們可以獲得任何軟件包的信息,安裝與否。
2.你如何使用 rpm 命令安裝 XYZ 軟件包?
回答:我們可以使用 rpm 命令安裝任何的軟件包(*.rpm),像下面這樣,選項(xiàng) -i(安裝),-v(冗余或者顯示額外的信息)和 -h(在安裝過程中,打印#號(hào)顯示進(jìn)度)。
# rpm -ivh peazip-1.11-1.el6.rf.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:peazip-1.11-1.el6.rf ################################# [100%]
如果要升級(jí)一個(gè)早期版本的包,應(yīng)加上 -U 選項(xiàng),選項(xiàng) -v 和 -h 可以確保我們得到用 # 號(hào)表示的冗余輸出,這增加了可讀性。
3.你已經(jīng)安裝了一個(gè)軟件包(假設(shè)是 httpd),現(xiàn)在你想看看軟件包創(chuàng)建并安裝的所有文件和目錄,你會(huì)怎么做?
回答:使用選項(xiàng) -l(列出所有文件)和 -q(查詢)列出 httpd 軟件包安裝的所有文件(Linux 哲學(xué):所有的都是文件,包括目錄)。
# rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
...
4.假如你要移除一個(gè)軟件包,叫 postfix。你會(huì)怎么做?
回答:首先我們需要知道什么包安裝了 postfix。查找安裝 postfix 的包名后,使用 -e(擦除/卸載軟件包)和 -v(冗余輸出)兩個(gè)選項(xiàng)來實(shí)現(xiàn)。
# rpm -qa postfix*
postfix-2.10.1-6.el7.x86_64
然后移除 postfix,如下:
# rpm -ev postfix-2.10.1-6.el7.x86_64
Preparing packages...
postfix-2:3.0.1-2.fc22.x86_64
5.獲得一個(gè)已安裝包的具體信息,如版本,發(fā)行號(hào),安裝日期,大小,總結(jié)和一個(gè)簡短的描述。
回答:我們通過使用 rpm 的選項(xiàng) -qi,后面接包名,可以獲得關(guān)于一個(gè)已安裝包的具體信息。
舉個(gè)例子,為了獲得 openssh 包的具體信息,我需要做的就是:
# rpm -qi openssh
[root@tecmint tecmint]# rpm -qi openssh
Name : openssh
Version : 6.8p1
Release : 5.fc22
Architecture: x86_64
Install Date: Thursday 28 May 2015 12:34:50 PM IST
Group : Applications/Internet
Size : 1542057
License : BSD
....
6.假如你不確定一個(gè)指定包的配置文件在哪,比如 httpd。你如何找到所有 httpd 提供的配置文件列表和位置。
回答: 我們需要用選項(xiàng) -c 接包名,這會(huì)列出所有配置文件的名字和他們的位置。
# rpm -qc httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf/httpd.conf
/etc/sysconfig/httpd
相似地,我們可以列出所有相關(guān)的文檔文件,如下:
# rpm -qd httpd
/usr/share/doc/httpd/ABOUT_APACHE
/usr/share/doc/httpd/CHANGES
/usr/share/doc/httpd/LICENSE
...
我們也可以列出所有相關(guān)的證書文件,如下:
# rpm -qL openssh
/usr/share/licenses/openssh/LICENCE
忘了說明上面的選項(xiàng) -d 和 -L 分別表示 “文檔” 和 “證書”,抱歉。
#p#
7.你找到了一個(gè)配置文件,位于‘/usr/share/alsa/cards/AACI.conf’,現(xiàn)在你不確定該文件屬于哪個(gè)包。你如何查找出包的名字?
回答:當(dāng)一個(gè)包被安裝后,相關(guān)的信息就存儲(chǔ)在了數(shù)據(jù)庫里。所以使用選項(xiàng) -qf(-f 查詢包擁有的文件)很容易追蹤誰提供了上述的包。
# rpm -qf /usr/share/alsa/cards/AACI.conf
alsa-lib-1.0.28-2.el7.x86_64
類似地,我們可以查找(誰提供的)關(guān)于任何子包,文檔和證書文件的信息。
8.你如何使用 rpm 查找最近安裝的軟件列表?
回答:如剛剛說的,每一樣被安裝的文件都記錄在了數(shù)據(jù)庫里。所以這并不難,通過查詢 rpm 的數(shù)據(jù)庫,找到最近安裝軟件的列表。
我們通過運(yùn)行下面的命令,使用選項(xiàng) -last(打印出最近安裝的軟件)達(dá)到目的。
# rpm -qa --last
上面的命令會(huì)打印出所有安裝的軟件,最近安裝的軟件在列表的頂部。
如果我們關(guān)心的是找出特定的包,我們可以使用 grep 命令從列表中匹配包(假設(shè)是 sqlite ),簡單如下:
# rpm -qa --last | grep -i sqlite
sqlite-3.8.10.2-1.fc22.x86_64 Thursday 18 June 2015 05:05:43 PM IST
我們也可以獲得10個(gè)最近安裝的軟件列表,簡單如下:
# rpm -qa --last | head
我們可以重定義一下,輸出想要的結(jié)果,簡單如下:
# rpm -qa --last | head -n 2
上面的命令中,-n 代表數(shù)目,后面接一個(gè)常數(shù)值。該命令是打印2個(gè)最近安裝的軟件的列表。
9.安裝一個(gè)包之前,你如果要檢查其依賴。你會(huì)怎么做?
回答:檢查一個(gè) rpm 包(XYZ.rpm)的依賴,我們可以使用選項(xiàng) -q(查詢包),-p(指定包名)和 -R(查詢/列出該包依賴的包,嗯,就是依賴)。
# rpm -qpR gedit-3.16.1-1.fc22.i686.rpm
/bin/sh
/usr/bin/env
glib2(x86-32) >= 2.40.0
gsettings-desktop-schemas
gtk3(x86-32) >= 3.16
gtksourceview3(x86-32) >= 3.16
gvfs
libX11.so.6
...
10.rpm 是不是一個(gè)前端的包管理工具呢?
回答:不是!rpm 是一個(gè)后端管理工具,適用于基于 Linux 發(fā)行版的 RPM (此處指 Redhat Package Management)。
YUM,全稱 Yellowdog Updater Modified,是一個(gè) RPM 的前端工具。YUM 命令自動(dòng)完成所有工作,包括解決依賴和其他一切事務(wù)。
最近,DNF(YUM命令升級(jí)版)在Fedora 22發(fā)行版中取代了 YUM。盡管 YUM 仍然可以在 RHEL 和 CentOS 平臺(tái)使用,我們也可以安裝 dnf,與 YUM 命令共存使用。據(jù)說 DNF 較于 YUM 有很多提高。
知道更多總是好的,保持自我更新?,F(xiàn)在我們移步到前端部分來談?wù)劇?/p>
11.你如何列出一個(gè)系統(tǒng)上面所有可用的倉庫列表。
回答:簡單地使用下面的命令,我們就可以列出一個(gè)系統(tǒng)上所有可用的倉庫列表。
# yum repolist
或
# dnf repolist
Last metadata expiration check performed 0:30:03 ago on Mon Jun 22 16:50:00 2015.
repo id repo name status
*fedora Fedora 22 - x86_64 44,762
ozonos Repository for Ozon OS 61
*updates Fedora 22 - x86_64 - Updates
上面的命令僅會(huì)列出可用的倉庫。如果你需要列出所有的倉庫,不管可用與否,可以這樣做。
# yum repolist all
或
# dnf repolist all
Last metadata expiration check performed 0:29:45 ago on Mon Jun 22 16:50:00 2015.
repo id repo name status
*fedora Fedora 22 - x86_64 enabled: 44,762
fedora-debuginfo Fedora 22 - x86_64 - Debug disabled
fedora-source Fedora 22 - Source disabled
ozonos Repository for Ozon OS enabled: 61
*updates Fedora 22 - x86_64 - Updates enabled: 5,018
updates-debuginfo Fedora 22 - x86_64 - Updates - Debug
12.你如何列出一個(gè)系統(tǒng)上所有可用并且安裝了的包?
回答:列出一個(gè)系統(tǒng)上所有可用的包,我們可以這樣做:
# yum list available
或
# dnf list available
ast metadata expiration check performed 0:34:09 ago on Mon Jun 22 16:50:00 2015.
Available Packages
0ad.x86_64 0.0.18-1.fc22 fedora
0ad-data.noarch 0.0.18-1.fc22 fedora
0install.x86_64 2.6.1-2.fc21 fedora
0xFFFF.x86_64 0.3.9-11.fc22 fedora
2048-cli.x86_64 0.9-4.git20141214.723738c.fc22 fedora
2048-cli-nocurses.x86_64 0.9-4.git20141214.723738c.fc22 fedora
....
而列出一個(gè)系統(tǒng)上所有已安裝的包,我們可以這樣做。
# yum list installed
或
# dnf list installed
Last metadata expiration check performed 0:34:30 ago on Mon Jun 22 16:50:00 2015.
Installed Packages
GeoIP.x86_64 1.6.5-1.fc22 @System
GeoIP-GeoLite-data.noarch 2015.05-1.fc22 @System
NetworkManager.x86_64 1:1.0.2-1.fc22 @System
NetworkManager-libnm.x86_64 1:1.0.2-1.fc22 @System
aajohan-comfortaa-fonts.noarch 2.004-4.fc22 @System
....
#p#
而要同時(shí)滿足兩個(gè)要求的時(shí)候,我們可以這樣做。
# yum list
或
# dnf list
Last metadata expiration check performed 0:32:56 ago on Mon Jun 22 16:50:00 2015.
Installed Packages
GeoIP.x86_64 1.6.5-1.fc22 @System
GeoIP-GeoLite-data.noarch 2015.05-1.fc22 @System
NetworkManager.x86_64 1:1.0.2-1.fc22 @System
NetworkManager-libnm.x86_64 1:1.0.2-1.fc22 @System
aajohan-comfortaa-fonts.noarch 2.004-4.fc22 @System
acl.x86_64 2.2.52-7.fc22 @System
....
13.你會(huì)怎么在一個(gè)系統(tǒng)上面使用 YUM 或 DNF 分別安裝和升級(jí)一個(gè)包與一組包?
回答:安裝一個(gè)包(假設(shè)是 nano),我們可以這樣做,
# yum install nano
而安裝一組包(假設(shè)是 Haskell),我們可以這樣做,
# yum groupinstall 'haskell'
升級(jí)一個(gè)包(還是 nano),我們可以這樣做,
# yum update nano
而為了升級(jí)一組包(還是 haskell),我們可以這樣做,
# yum groupupdate 'haskell'
14.你會(huì)如何同步一個(gè)系統(tǒng)上面的所有安裝軟件到穩(wěn)定發(fā)行版?
回答:我們可以一個(gè)系統(tǒng)上(假設(shè)是 CentOS 或者 Fedora)的所有包到穩(wěn)定發(fā)行版,如下,
# yum distro-sync [在 CentOS/ RHEL]
或
# dnf distro-sync [在 Fedora 20之后版本]
似乎來面試之前你做了相當(dāng)不多的功課,很好!在進(jìn)一步交談前,我還想問一兩個(gè)問題。
15.你對(duì) YUM 本地倉庫熟悉嗎?你嘗試過建立一個(gè)本地 YUM 倉庫嗎?讓我們簡單看看你會(huì)怎么建立一個(gè)本地 YUM 倉庫。
回答:首先,感謝你的夸獎(jiǎng)?;氐絾栴},我必須承認(rèn)我對(duì)本地 YUM 倉庫十分熟悉,并且在我的本地主機(jī)上也部署過,作為測試用。
(1)為了建立本地 YUM 倉庫,我們需要安裝下面三個(gè)包:
# yum install deltarpm python-deltarpm createrepo
(2)新建一個(gè)目錄(假設(shè) /home/$USER/rpm),然后復(fù)制 RedHat/CentOS DVD 上的 RPM 包到這個(gè)文件夾下
# mkdir /home/$USER/rpm
# cp /path/to/rpm/on/DVD/*.rpm /home/$USER/rpm
(3)新建基本的庫頭文件如下。
# createrepo -v /home/$USER/rpm
(4)在路徑 /etc/yum.repo.d 下創(chuàng)建一個(gè) .repo 文件(如 abc.repo):
cd /etc/yum.repos.d && cat << EOF abc.repo
[local-installation]name=yum-local
baseurl=file:///home/$USER/rpm
enabled=1
gpgcheck=0
EOF
重要:用你的用戶名替換掉 $USER。
以上就是創(chuàng)建一個(gè)本地 YUM 倉庫所要做的全部工作。我們現(xiàn)在可以從這里安裝軟件了,相對(duì)快一些,安全一些,并且最重要的是不需要 Internet 連接。