2021-05-12 14:32:11
Shilpa Nair 分享的 RedHat Linux 包管理方面的面試經驗
Shilpa Nair 剛於2015年畢業。她之後去了一家位於 Noida,Delhi 的國家新聞電視台,應聘實習生的崗位。在她去年畢業季的時候,常逛 Tecmint 尋求作業上的幫助。從那時開始,她就常去 Tecmint。
有關 RPM 方面的 Linux 面試題
所有的問題和回答都是 Shilpa Nair 根據回憶重寫的。
“大家好!我是來自 Delhi 的Shilpa Nair。我不久前才順利畢業,正尋找一個實習的機會。在大學早期的時候,我就對 UNIX 十分喜愛,所以我也希望這個機會能適合我,滿足我的興趣。我被提問了很多問題,大部分都是關於 RedHat 包管理的基礎問題。”
下面就是我被問到的問題,和對應的回答。我僅貼出了與 RedHat GNU/Linux 包管理相關的,也是主要被提問的。
1,Linux 裡如何查詢一個包安裝與否?假設你需要確認 ‘nano’ 有沒有安裝,你怎麼做?
回答:為了確認 nano 軟體包有沒有安裝,我們可以使用 rpm 命令,配合 -q 和 -a 選項來查詢所有已安裝的包
# rpm -qa nano
或
# rpm -qa |grep-i nano
nano-2.3.1-10.el7.x86_64
同時包的名字必須是完整的,不完整的包名會返回到提示符,不列印任何東西,就是說這包(包名字不全)未安裝。下面的例子會更好理解些:
我們通常使用 vim 替代 vi 命令。當時如果我們查詢安裝包 vi/vim 的時候,我們就會看到標準輸出上沒有任何結果。
#vi
#vim
儘管如此,我們仍然可以像上面一樣執行 vi/vim 命令來清楚地知道包有沒有安裝。只是因為我們不知道它的完整包名才不能找到的。如果我們不確切知道完整的檔名,我們可以使用萬用字元:
# rpm -qa vim*
vim-minimal-7.4.160-1.el7.x86_64
通過這種方式,我們可以獲得任何軟體包的資訊,安裝與否。
2. 你如何使用 rpm 命令安裝 XYZ 軟體包?
回答:我們可以使用 rpm 命令安裝任何的軟體包(*.rpm),像下面這樣,選項 -i(安裝),-v(冗餘或者顯示額外的資訊)和 -h(在安裝過程中,列印#號顯示進度)。
# rpm -ivh peazip-1.11-1.el6.rf.x86_64.rpm
Preparing...################################# [100%]
Updating/ installing...
1:peazip-1.11-1.el6.rf################################# [100%]
如果要升級一個早期版本的包,應加上 -U 選項,選項 -v 和 -h 可以確保我們得到用 # 號表示的冗餘輸出,這增加了可讀性。
3. 你已經安裝了一個軟體包(假設是 httpd),現在你想看看軟體包建立並安裝的所有檔案和目錄,你會怎麼做?
回答:使用選項 -l(列出所有檔案)和 -q(查詢)列出 httpd 軟體包安裝的所有檔案(Linux 哲學:所有的都是檔案,包括目錄)。
# rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
...
4. 假如你要移除一個軟體包,叫 postfix。你會怎麼做?
回答:首先我們需要知道什麼包安裝了 postfix。查詢安裝 postfix 的包名後,使用 -e(擦除/解除安裝軟體包)和 -v(冗餘輸出)兩個選項來實現。
# 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. 獲得一個已安裝包的具體資訊,如版本,發行號,安裝日期,大小,總結和一個簡短的描述。
回答:我們通過使用 rpm 的選項 -qi,後面接包名,可以獲得關於一個已安裝包的具體資訊。
舉個例子,為了獲得 openssh 包的具體資訊,我需要做的就是:
# rpm -qi openssh
[root@tecmint tecmint]# rpm -qi openssh
Name: openssh
Version:6.8p1
Release:5.fc22
Architecture: x86_64
InstallDate:Thursday28May201512:34:50 PM IST
Group:Applications/Internet
Size:1542057
License: BSD
....
6. 假如你不確定一個指定包的組態檔在哪,比如 httpd。你如何找到所有 httpd 提供的組態檔列表和位置。
回答: 我們需要用選項 -c 接包名,這會列出所有組態檔的名字和他們的位置。
# 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
相似地,我們可以列出所有相關的文件檔案,如下:
# rpm -qd httpd
/usr/share/doc/httpd/ABOUT_APACHE
/usr/share/doc/httpd/CHANGES
/usr/share/doc/httpd/LICENSE
...
我們也可以列出所有相關的證書檔案,如下:
# rpm -qL openssh
/usr/share/licenses/openssh/LICENCE
忘了說明上面的選項 -d 和 -L 分別表示 “文件” 和 “證書”,抱歉。
7. 你找到了一個組態檔,位於‘/usr/share/alsa/cards/AACI.conf’,現在你不確定該檔案屬於哪個包。你如何查詢出包的名字?
回答:當一個包被安裝後,相關的資訊就儲存在了資料庫裡。所以使用選項 -qf(-f 查詢包擁有的檔案)很容易追蹤誰提供了上述的包。
# rpm -qf /usr/share/alsa/cards/AACI.conf
alsa-lib-1.0.28-2.el7.x86_64
類似地,我們可以查詢(誰提供的)關於任何子包,文件和證書檔案的資訊。
8. 你如何使用 rpm 查詢最近安裝的軟體列表?
回答:如剛剛說的,每一樣被安裝的檔案都記錄在了資料庫裡。所以這並不難,通過查詢 rpm 的資料庫,找到最近安裝軟體的列表。
我們通過執行下面的命令,使用選項 -last(列印出最近安裝的軟體)達到目的。
# rpm -qa --last
上面的命令會列印出所有安裝的軟體,最近安裝的軟體在列表的頂部。
如果我們關心的是找出特定的包,我們可以使用 grep 命令從列表中匹配包(假設是 sqlite ),簡單如下:
# rpm -qa --last|grep-i sqlite
sqlite-3.8.10.2-1.fc22.x86_64 Thursday18June201505:05:43 PM IST
我們也可以獲得10個最近安裝的軟體列表,簡單如下:
# rpm -qa --last|head
我們可以重定義一下,輸出想要的結果,簡單如下:
# rpm -qa --last|head-n 2
上面的命令中,-n 代表數目,後面接一個常數值。該命令是列印2個最近安裝的軟體的列表。
9. 安裝一個包之前,你如果要檢查其依賴。你會怎麼做?
回答:檢查一個 rpm 包(XYZ.rpm)的依賴,我們可以使用選項 -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 是不是一個前端的包管理工具呢?
回答:不是!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. 你如何列出一個系統上面所有可用的倉庫列表。
回答:簡單地使用下面的命令,我們就可以列出一個系統上所有可用的倉庫列表。
#yum repolist
或
# dnf repolist
Last metadata expiration check performed 0:30:03 ago on MonJun2216:50:002015.
repo id repo name status
*fedora Fedora22- x86_64 44,762
ozonos RepositoryforOzon OS 61
*updates Fedora22- x86_64 -Updates
上面的命令僅會列出可用的倉庫。如果你需要列出所有的倉庫,不管可用與否,可以這樣做。
#yum repolist all
或
# dnf repolist all
Last metadata expiration check performed 0:29:45 ago on MonJun2216:50:002015.
repo id repo name status
*fedora Fedora22- x86_64 enabled:44,762
fedora-debuginfo Fedora22- x86_64 -Debug disabled
fedora-source Fedora22-Source disabled
ozonos RepositoryforOzon OS enabled:61
*updates Fedora22- x86_64 -Updates enabled:5,018
updates-debuginfo Fedora22- x86_64 -Updates-Debug
12. 你如何列出一個系統上所有可用並且安裝了的包?
回答:列出一個系統上所有可用的包,我們可以這樣做:
#yumlist available
或
# dnf list available
ast metadata expiration check performed 0:34:09 ago on MonJun2216:50:002015.
AvailablePackages
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
....
而列出一個系統上所有已安裝的包,我們可以這樣做。
#yumlist installed
或
# dnf list installed
Last metadata expiration check performed 0:34:30 ago on MonJun2216:50:002015.
InstalledPackages
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
....
而要同時滿足兩個要求的時候,我們可以這樣做。
#yumlist
或
# dnf list
Last metadata expiration check performed 0:32:56 ago on MonJun2216:50:002015.
InstalledPackages
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. 你會怎麼在一個系統上面使用 YUM 或 DNF 分別安裝和升級一個包與一組包?
回答:安裝一個包(假設是 nano),我們可以這樣做,
#yum install nano
而安裝一組包(假設是 Haskell),我們可以這樣做,
#yum groupinstall 'haskell'
升級一個包(還是 nano),我們可以這樣做,
#yum update nano
而為了升級一組包(還是 haskell),我們可以這樣做,
#yum groupupdate 'haskell'
14. 你會如何同步一個系統上面的所有安裝軟體到穩定發行版?
回答:我們可以一個系統上(假設是 CentOS 或者 Fedora)的所有包到穩定發行版,如下,
#yum distro-sync[在CentOS/ RHEL]
或
# dnf distro-sync[在Fedora20之後版本]
似乎來面試之前你做了相當不多的功課,很好!在進一步交談前,我還想問一兩個問題。
15. 你對 YUM 本地倉庫熟悉嗎?你嘗試過建立一個本地 YUM 倉庫嗎?讓我們簡單看看你會怎麼建立一個本地 YUM 倉庫。
回答:首先,感謝你的誇獎。回到問題,我必須承認我對本地 YUM 倉庫十分熟悉,並且在我的本地主機上也部署過,作為測試用。
1、 為了建立本地 YUM 倉庫,我們需要安裝下面三個包:
#yum install deltarpm python-deltarpm createrepo
2、 新建一個目錄(假設 /home/$USER/rpm),然後複製 RedHat/CentOS DVD 上的 RPM 包到這個資料夾下
#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 下建立一個 .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。
以上就是建立一個本地 YUM 倉庫所要做的全部工作。我們現在可以從這裡安裝軟體了,相對快一些,安全一些,並且最重要的是不需要 Internet 連線。
好了!面試過程很愉快。我已經問完了。我會將你推薦給 HR。你是一個年輕且十分聰明的候選者,我們很願意你加入進來。如果你有任何問題,你可以問我。
我:謝謝,這確實是一次愉快的面試,我感到今天非常幸運,可以搞定這次面試...
顯然,不會在這裡結束。我問了很多問題,比如他們正在做的專案。我會擔任什麼角色,負責什麼,,,balabalabala
小夥伴們,這之後的 3 天會經過 HR 輪,到時候所有問題到時候也會被寫成文件。希望我當時表現不錯。感謝你們所有的祝福。
謝謝夥伴們和 Tecmint,花時間來編輯我的面試經歷。我相信 Tecmint 好夥伴們做了很大的努力,必要要讚一個。當我們與他人分享我們的經歷的時候,其他人從我們這裡知道了更多,而我們自己則發現了自己的不足。
這增加了我們的信心。如果你最近也有任何類似的面試經歷,別自己蔵著。分享出來!讓我們所有人都知道。你可以使用如下的表單來與我們分享你的經歷。
相關文章