軟件包管理
一、c語言程序的構建過程
1.程序源代碼 --> 預處理 --> 編譯 --> 匯編 --> 鏈接--> 可執行程序
- 開放源碼:就是程序碼,文本格式的源代碼,寫給人類看的程序語言,但機器並不認識,所以無法執行;
- 編譯器:將程序碼轉譯成為機器看的懂得語言,就類似翻譯者的角色,生成二進制文件;
- 鏈接:在Linux上使用ld工具,將o文件和所需的庫文件鏈接起來組成一個可正常工作的可執行程序。鏈接了庫文件之后就可以發起一些系統調用。
- 靜態編譯:.a
- 把程序對應的依賴庫復制一份到包
- libxxx.a
- 嵌入程序包
- 升級難,需重新編譯
- 占用較多空間,遷移容易
- 動態編譯:.so
- 只把依賴加做一個動態鏈接
- libxxx.so
- “連接指向”
- 占用較少空間,升級方便
- 指針指向,軟鏈接
- 靜態編譯:.a
- 可執行文件:經過編譯器變成二進制程序后,機器看的懂所以可以執行的文件。
2.二進制程序的組成部分:二進制文件、庫文件、配置文件、幫助文件
查看二進制程序所依賴的庫文件:ldd /PATH/TO/BINARY_FILE
3.包命名規則:
源代碼:name-VERSION.tar.gz | bz2 | xz; VERSION: major.minor.release rpm包:name-VERSION-release.arch.rpm 例:bash-4.2.46-19.el7.x86_64.rpm VERSION: major.minor.release release:release.OS 常見的arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64 powerpc: ppc 跟平台無關:noarch
一般,源碼都是打包壓縮過的文件,其通常以“.gz”、“.bz2”、“.xz”結尾,源碼包中包含了源碼,還包含了一些有助於制作二進制rpm的文件;rpm包一般以“rpm”結尾,都是已經編譯完成的,安裝rpm包的過程實際上就是將包中的文件復制到Linux上,有可能還會在復制文件的前后執行一些命令,如創建一個必要的用戶,刪除非必要文件等。
4.包管理器:
- debian:deb文件, dpkg包管理器
- redhat: rpm文件, rpm包管理器
- rpm: Redhat Package Manager
- RPM Package Manager
5.包的分類與拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
注意:包之間可能存在依賴關系,甚至循環關系;
解決依賴包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
6.獲取程序包的途徑:
(1) 系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 項目官方站點
(3) 第三方組織:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推薦,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
注意:第三方包要檢查其合法性、完整性!!
7.庫文件
一些查看命令:
ldd /PATH/TO/BINARY_FILE # 查看二進制程序所依賴的庫文件 ldconfig -p # 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
8.程序的配置文件和緩存文件:
配置文件:
/etc/ld.so.conf 全部放到一個文件中,或
/etc/ld.so.conf.d/*.conf 此文件目錄下.cong結尾的文件,方便一個程序寫一個配置文件
緩存文件:
/etc/ld.so.cache
二、rpm管理器
1.程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
包文件組成 (每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
數據庫(公共):/var/lib/rpm
程序包名稱及版本
依賴關系
功能說明
包安裝后生成的各文件路徑及校驗碼信息
ll /var/lib/rpm/
total 75612
-rw-r--r--. 1 root root 5521408 Oct 23 18:48 Basenames
-rw-r--r--. 1 root root 12288 Oct 23 18:47 Conflictname
-rw-r--r--. 1 root root 73728 Dec 4 11:57 __db.001
-rw-r--r--. 1 root root 229376 Dec 4 11:57 __db.002
-rw-r--r--. 1 root root 1318912 Dec 4 11:57 __db.003
-rw-r--r--. 1 root root 753664 Dec 4 11:57 __db.004
# 這個rpm包數據庫文件夾中包含着現有已經安裝的包的各種信息,包括安裝版本,安裝時間、升級時間、卸載時間等等非常重要,最好備份
2.rpm命令的使用
CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護。
2.1 安裝
rpm {-i|--install} [install-options] PACKAGE_FILE… # option -v: verbose -vv: -h: 以#顯示程序包管理執行進度 rpm -ivh PACKAGE_FILE ... # 安裝某程序包 [install-options] --test: 測試安裝,但不真正執行安裝,即dry run模式 --nodeps:忽略依賴關系 --replacepkgs | replacefiles # 對於已經安裝過的包,如果不經過卸載,只是刪除其一些文件,就會導致這個程序無法使用,我們再重新安裝這個程序包時,會顯示此包已經安裝,是因為在/var/lib/rpm這個文件中有該程序的安裝記錄。所以這種情況下要想重新安裝這個程序包就需要rpm -ivh --replacepkgs 這個選項! --nosignature: 不檢查來源合法性 --nodigest:不檢查包完整性 --noscripts:不執行程序包腳本 %pre: 安裝前腳本; --nopre %post: 安裝后腳本; --nopost %preun: 卸載前腳本; --nopreun %postun: 卸載后腳本; --nopostun
注意:
我們在rpm安裝時截圖中紅框位置顯示nokey是因為我們沒有導入RPM-GPG-KEY-CentOS-7這個檢查工具來檢查其合法性,導入后即可顯示rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 (rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 (centos6))導入公鑰即可檢查,這樣在安裝來源合法的程序包時就不在顯示nokey。
2.2 升級
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
upgrade # 安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝” rpm {-F|--freshen} [install-options] PACKAGE_FILE... freshen # 安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則不執行升級操作 rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降級 --force: 強制安裝
注意:
(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,對直接安裝新版本內核;
(2) 如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。
2.3查詢
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a: 所有包 -f: 查看指定的文件由哪個程序包安裝生成 -p rpmfile:針對尚未安裝的程序包文件做查詢操作 --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供 --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴 [query-options] --changelog:查詢rpm包的changelog -c: 查詢程序的配置文件 -d: 查詢程序的文檔 -i: information -l: 查看指定的程序包安裝后生成的所有文件 --scripts:程序包自帶的腳本 --provides: 列出指定程序包所提供的CAPABILITY -R: 查詢指定的程序包所依賴的CAPABILITY rpm2cpio 包文件|cpio –itv 預覽包內文件 rpm2cpio 包文件|cpio –id “*.conf” 釋放包內文件
2.4 卸載
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
注意:由於我們在安裝程序包是會同時安裝許多依賴文件,而這種卸載方法只是卸載程序本身,並不同時將依賴文件卸載,所以要想完整卸載的話需要用yum
yum history # 查看歷史記錄,找到是第幾部的操作 yum history undo # # 表示對歷史操作中的第#想進行反操作
2.5 包校驗
rpm {-V|--verify} [select-options] [verify-options] # option S file Size differs M Mode differs (includes permissions and file type) 5 digest (formerly MD5 sum) differs D Device major/minor number mismatch L readLink(2) path mismatch U User ownership differs G Group ownership differs T mTime differs P capabilities differ
導入所需要公鑰
rpm -K|checksig rpmfile 檢查包的完整性和簽名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”
三、yum
yum工具通過倉庫的方式簡化rpm包的管理。它從倉庫中搜索相關的軟件包,並自動下載和解決軟件包的依賴性,非常方便。yum底層依賴rpm,如果把rpm卸載,那么yum也不能用了。
老王說:
利用yum的主要問題:
(1)配置文件格式語法錯誤;
(2)緩存問題
yum客戶端配置文件:
/etc/yum.conf # 為所有倉庫提供公共配置 /etc/yum.repos.d/*.repo # 為倉庫的指向提供配置 [root@CentOS7 ~]#cat /etc/yum.conf [main] cachedir=/var/cache/yum/$basearch/$releasever # 緩存文件夾路徑 $$basearch # cpu架構,X86_64等 $releasever # 系統版本 keepcache=0 # 0代表不緩存rpm包,下載安裝后默認刪除;1為緩存rpm安裝包 debuglevel=2 # logfile=/var/log/yum.log # yum安裝的日志文件 exactarch=1 # obsoletes=1 gpgcheck=1 # 默認1代表安裝包的完整性合法性為nokey是直接拒絕安裝 plugins=1 installonly_limit=5 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 # PUT YOUR REPOS HERE OR IN separate files named file.repo # in /etc/yum.repos.d
自己搭建一個yum配置文件
vim /etc/yum.repo.d/base.repo # 兩個必須:1必須在/etc/yum.repo.d/這個文件夾下;2.文件名必須以.repo結尾;一般習慣將光盤建的yum庫命名為base [base] # 不允許有空格 name=cdrom baseurl=file:///mnt/cdrom/ # 一般是repodata的父目錄,文件路徑不允許有空格,支持http:// https:// ftp:// file:// # 此地址可以添加多個地址,在多個地址的情況下,可以將全部地址保存在一個文本文件中,而此處的baseuer換成 mirrorlist=file:// 文件路徑 gpgcheck=0 # 0默認為不進行gpgcheck檢查完整性 以上這些是必須項, ----------------------------------------------------- 還可以添加: gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7 # 直接將光盤中的公鑰導入,也可以換成 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 # 直接導入配置文件中的公鑰;此項不加的話,gpgcheck=0; enabled=0 # 默認為1,0為臨時禁用該倉庫 failovermethod={roundrobin|priority} # 這個是在baseurl包含多個地址的情況下使用 roundrobin # 意為隨機挑選,默認值 priority # 按順序訪問 cost=1000 # 存在多個倉庫的情況下,越少優先值越高
也可以通過命令直接生成該配置文件:
yum-config-manager --add-repo=BASEURL # 即自動生成該網址的repo配置文件 yum-config-manager --disable “倉庫名" # 禁用倉庫 yum-config-manager --enable “倉庫名” # 啟用倉庫
搭建完yum配置文件即可使用yum安裝了。
[aliyunepel] name=aliyun-epel baseurl=https://mirrors.aliyun.com/epel/7/x86_64/ gpgcheck=0 # 這樣就又搭建了一個阿里雲的epel的yum庫
yum的其他一些命令
yum install PACKAGES # yum安裝程序包 yum reinstall package1 [package2] [...] # 重新安裝 yum remove PACKAGES # yum卸載程序包 yum remove | erase package1 [package2] [...] yum repolist # 可查看搭建的yum庫有多少個安裝包。 yum repolist all # 顯示所有的倉庫情況 yum clean # 清除yum緩存 cat /var/log/yum.log # 查看yum安裝報的日志文件,包括安裝、卸載、更新等 yum list # 顯示所有庫中所有的包,前帶@說明已經安裝 yum list *ftp* # 支持文件名通配符,列出包含ftp的程序包 yum list [all | glob_exp1] [glob_exp2] [...] # 列出包,支持文件名通配符 yum list {available|installed|updates} [glob_exp1] # 列出可用的、可安裝的、能升級的 yum update [package1] [package2] [...] # 升級,一般不建議升級 yum downgrade package1 [package2] [...] # 降級 yum check-update # 檢查可用升級 yum info [...] # 查詢包信息 yum provides | whatprovides feature1 [feature2] # 查看指定的特性(可以是某文件)是由哪個程序包所提供 yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] # 清除/var/cache/yum/$basearch/$releasever緩存,清楚類型指定,all為所有 yum makecache # 構建緩存 yum search string1 [string2] [...] # 以指定的關鍵字搜索程序包名及summary信息 yum deplist package1 [package2] [...] # 查看指定包所依賴的capabilities

如圖所示,兩個yum庫分別有多少個包均有顯示
注意:yum不允許同時在多個終端同時安裝
yum的repo配置文件中可用的變量:
$releasever: 當前OS的發行版的主版本號
$arch: 平台,i386,i486,i586,x86_64等
$basearch:基礎平台;i386, x86_64
$YUM0-$YUM9:自定義變量
比如:
實例:(針對不同版本的系統)
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384
對於repo文件我們也可以參考阿里雲,
http://mirrors.aliyun.com/repo/
將其的配置格式直接作為我們自己的配置。
可通過:
wget url....下載配置文件至當前目錄
查看yum歷史事務:
yum history [info|list| packages-list| packages-info| summary | addon-info | redo | undo | rollback | new|sync| stats] yum history # 查看歷史記錄 yum history info 6 # 查看yum歷史記錄第六條的詳細信息 yum history undo 6 # 反向操作yum歷史記錄第六條的操作
利用yum安裝rpg包:
yum install rpmfile1 [rpmfile2] [...] # yum update rpmfile1 [rpmfile2] [...]
利用yum安裝包組
yum groupinstall group1 [group2] [...] yum groupupdate group1 [group2] [...] yum grouplist [hidden] [groupwildcard] [...] yum groupremove group1 [group2] [...] yum groupinfo group1 [...] yum grouplist # 查看包組列表
yum的一些命令選項:
yum的命令行選項:
--nogpgcheck:禁止進行gpg check -y: 自動回答為“yes” -q:靜默模式 yum -y -q :需要分開寫 --disablerepo=repoidglob:臨時禁用此處指定的repo,repo配置文件中[]中的名字 --enablerepo=repoidglob:臨時啟用此處指定的repo --noplugins:禁用所有插件
補充:
systemctl stop firewalld # 關閉防火牆 systemctl disable firewalld # 關閉開機自動啟動防火牆
四、實驗
實驗1:
當知道是哪個庫文件被刪除(以刪除/lib64/libc.so.6這個庫文件為例),導致無法使用命令或系統不能使用時,這么修復:(以CentOS 7為例)
第一步:重啟,從光盤開機,有的系統是開機f2修改,有的是f12,還有的是Esc鍵;
第二步:進入此界面,選擇第三項Troubleshooting進入
再選擇第二項rescure centos system ,進入救援模式;
再選擇第一項continue進入bash shell界面。

通過df命令可以看到,根目錄已經變成/mnt/sysimage;所以,我們在cp丟失的文件時要使用相對路徑。
!!注意:libc.so.6 這個文件是個軟鏈接,也就是說我們實驗時cp到data目錄下的庫文件是個軟鏈接,並不是真正的庫文件,所以這樣的話我們再重新創建個軟鏈接即可。

ln -s libc-2.17.so libc.so.6
(注意,此處要切換至/mnt/sysimage/lib64下,使用相對路徑進行創建軟鏈接)
重啟,正常!(注意,將從光盤啟動改回從硬盤啟動)
實驗2:
像centos6那樣,可以直接依靠/misc/cd 打開光盤文件
第一步:yum install autufs這個包
第二步:systemctl start autofs 打開autofs服務
(注意:centos特有的,可以通過rpm -ql autofs 查看到其有個服務文件,所以需要命令打開它)
第三步:再通過systemctl enable autofs命令讓其開機自動啟動服務
此時,centos7 也可以通過 cd /misc/cd 切換至光盤
實驗3:
用centos7的安裝光盤為centos6的客戶機搭建一個yum庫
第一步:安裝並開啟httpd
yum install httpd # 安裝httpd systemctl stop firewalld # 關閉防火牆 systemctl disable filewalld # 關閉自動啟動防火牆
打開瀏覽器,在地址欄輸入ip地址,看是否可以連接,如圖所示已經連接成功
第二步:
cd /var/www/html/ # 切換至該文件夾 mkdir -p epel/{6,7}/x86_64/ # 模仿阿里雲的epel網址格式分別創建6和7兩個文件夾
第三步:掛載光盤
mount /dev/sr0 /var/www/html/epel/7/x86_64/ # 掛載硬盤至指定目錄,如果是想在centos7上使用這個庫就用7的文件夾 mount /dev/sr0 /var/www/html/epel/6/x86_64/ # 如果是想在centos6上使用這個庫就用6的文件夾
如圖所示,已經可以在瀏覽器中查看到我們掛載的光盤的內容
第四步:后面的就修改 /etc/yum.con.d/ 下的配置文件按正常操作即可。
