軟體包管理
【1】、Linux軟體型別
-
開源軟體
軟體原始碼開放,供使用者免費學習,允許使用者二次開發,使用者使用放心,後期如果開發者不再進行維護,會有其他人進行維護
-
閉源軟體
軟體程式碼不公開發布,無法二次開發,後期開發者如果不進行維護損失很大
【2】、開源軟體包型別
-
原始碼包
-
優點:
可以看到軟體原始碼,安裝靈活,可以自定義安裝路徑和按照功能,解除安裝方便
-
缺點:
安裝過程麻煩,需要使用者手動編譯,需要手動解決軟體包的依賴關係
-
-
二進位制包(RPM包)
-
優點
已經被編譯好了,安裝簡單、安裝速度快
-
缺點
所有功能、路徑無法自定義
-
封包型別 | 說明 |
---|---|
rpm軟體包 | 副檔名為.rpm,適用於RedHat系列 |
deb軟體包 | 副檔名為.deb,適用於Debian系列 |
原始碼軟體包 | 通常以.tar.gz、.tar.bz2格式的壓縮包提供包含程式的原始程式碼檔案 |
其他 | 提供install.sh、setup、*bin、*.pl |
綠色免安裝、提供已經編譯好的程式及相關軟體 |
【3】、RPM軟體包
Redhat Package Manager
- 由紅帽公司提出,Redhat、SUSE等系列採用
- 建立集中資料庫,記錄軟體包安裝/解除安裝等變化資訊,分析軟體包依賴關係
RPM包檔名特徵
軟體名-版本資訊.作業系統.硬體架構.rpm
firefox-91.9.0-1.el8_5.x86_64.rpm
rpm軟體包下載網站
1、RPM包的安裝位置
檔案類別 | 預設安裝位置 |
---|---|
普通執行程式(命令) | /usr/bin、/bin/ |
伺服器程式、管理工具 | /usr/sbin/、/sbin/ |
配置檔案 | /etc/、/etc/軟體名/ |
日誌檔案 | /var/log/、/var/log/軟體名 |
程式文件、man手冊頁 | /usr/share/doc/、/usr/share/man/ |
2、RPM查詢軟體
-q:查詢某一軟體是否安裝
-qa:查詢系統中安裝的所有軟體包
-ql:顯示軟體在系統中安裝產生了哪些資料
-qi:顯示軟體的詳細資訊
-qf:檢視某一個命令是由哪一個軟體包產生的
# 檢視軟體在系統中安裝產生了哪些資料
rpm -ql tree-1.7.0-15.el8.x86_64
/usr/bin/tree
/usr/lib/.build-id
/usr/lib/.build-id/47
/usr/lib/.build-id/47/6e749c56abc75d25e3bc5c29e83507a605fd53
/usr/share/doc/tree
/usr/share/doc/tree/LICENSE
/usr/share/doc/tree/README
/usr/share/man/man1/tree.1.gz
# 查詢軟體的詳細資訊
{24-05-29 16:28}locahost:/ root# rpm -qi tree-1.7.0-15.el8.x86_64
Name : tree
Version : 1.7.0
Release : 15.el8
Architecture: x86_64
Install Date: Tue 28 May 2024 07:45:59 PM CST
Group : Unspecified
Size : 108563
License : GPLv2+
Signature : RSA/SHA256, Mon 12 Apr 2021 05:23:54 PM CST, Key ID 15af5dac6d745a60
Source RPM : tree-1.7.0-15.el8.src.rpm
Build Date : Mon 12 Apr 2021 04:38:17 PM CST
Build Host : ord1-prod-x86build003.svc.aws.rockylinux.org
Relocations : (not relocatable)
Packager : infrastructure@rockylinux.org
Vendor : Rocky
URL : http://mama.indstate.edu/users/ice/tree/
Summary : File system tree viewer
Description :
The tree utility recursively displays the contents of directories in a
tree-like format. Tree is basically a UNIX port of the DOS tree
utility.
# 檢視系統中安裝了多少個軟體包
{24-05-29 16:43}locahost:/ root# rpm -qa | wc -l
663
# 檢視某一個命令是由哪一個軟體包產生的
{24-05-29 16:51}locahost:/ root# rpm -qf /usr/bin/chsh
util-linux-user-2.32.1-43.el8.x86_64
{24-05-29 16:51}locahost:/ root# rpm -qf /usr/bin/ls
coreutils-8.30-15.el8.x86_64
3、rpm軟體包管理
-
軟體包依賴問題
- 樹形依賴:a--->b--->c--->d
- 環形依賴:a--->b--->c--->d--->a
- 模組依賴:需要模組檔案支援
-
如何使用光碟機所提供的軟體包
-
首先我們需要將光碟機掛載到系統中
[root@bogon ~]# ll /dev/cdrom lrwxrwxrwx. 1 root root 3 Apr 9 08:35 /dev/cdrom -> sr0 #這是光碟機所在的位置
-
進行掛載
-
建立磁碟分割槽
mkdir /mnt/cdrom
-
把光碟機掛載到建立的磁碟分割槽下,這是臨時掛載,重啟或者關機後失效
mount /dev/sr0 /mnt/cdrom
-
永久掛載,修改配置檔案,在path:/erc/fstab寫入如下檔案,儲存並退出
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
-
-
對於RPM軟體包的管理,我們使用rpm命令去進行管理
-ivh:i安裝,v顯示詳細資訊,h顯示軟體安裝進度
{24-05-29 17:15}locahost:/opt root# rpm -i /mnt/sr0/AppStream/Packages/v/vsftpd-3.0.3-36.el8.x86_64.rpm
{24-05-29 17:20}locahost:/opt root# rpm -q /mnt/sr0/AppStream/Packages/v/vsftpd-3.0.3-36.el8.x86_64.rpm
vsftpd-3.0.3-36.el8.x86_64
-Uvh:升級安裝包(升級前先做好備份)
-e:解除安裝軟體包
-qpi:查詢軟體包的資訊
--nodesps:解除安裝軟體包時忽略依賴關係(一般不要忽略)
--import:匯入紅帽簽名檔案,一般來源於光碟的包都存在簽名
【4】、yum機制
軟體倉庫
- 本地倉庫(也稱本地yum源):自己搭建的,建立檔案,在檔案中配置倉庫引數
- 特點:不需要連線外網,軟體包存放本機
- 網路倉庫:阿里、中科大、清華大學、163倉庫等
- 特點:需要連線外網、無需任何配置,直接下載
yum可以幫助我們自動解決依賴
-
yum repolist:列出可用的軟體倉庫
[root@xu ~]# yum repolist Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. repo id repo name appstream local_redhat_appstream base local_redhat_base
-
yum list:列出軟體包(包含為安裝的),也可以查詢包
[root@xu ~]# yum list nginx Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. Last metadata expiration check: 0:09:44 ago on Tue 09 Apr 2024 10:14:00 PM CST. Available Packages nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe appstream
-
yum provides 命令:搜尋該命令是由哪個軟體包提供的
-
yum update:升級軟體包
-
yum list 軟體包 --showduplicate:列出軟體包所有的版本
[root@xu yum.repos.d]# yum list nginx --showduplicates Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. nginx stable repo 51 kB/s | 55 kB 00:01 Available Packages nginx.x86_64 1.16.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.14.1-9.module+el8.0.0+4108+af250afe appstream nginx.x86_64 1:1.16.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.18.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.18.0-2.el8.ngx nginx-stable nginx.x86_64 1:1.20.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.20.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.20.2-1.el8.ngx nginx-stable nginx.x86_64 1:1.22.0-1.el8.ngx nginx-stable nginx.x86_64 1:1.22.1-1.el8.ngx nginx-stable nginx.x86_64 1:1.24.0-1.el8.ngx nginx-stabl
-
yum install --setopt=obsoletes=0 軟體包:指定安裝版本(使用yum安裝軟體,如果不指定軟體版本,則預設安裝軟體倉庫中的最新版)
-
[root@xu yum.repos.d]# yum install --setopt=obsoletes=0 nginx*1.20.0 -y
-
yum clean all :清楚快取
-
yum makecache :生成快取
在使用網路倉庫時一般會生成快取,提高下載速度,記錄軟體在網路倉庫所在的位置
【5】、yum軟體倉庫配置
1、永久掛載光碟機
-
建立磁碟分割槽
mkdir /mnt/cdrom
-
把光碟機掛載到建立的磁碟分割槽下,這是臨時掛載,重啟或者關機後失效
mount /dev/sr0 /mnt/cdrom
-
永久掛載,修改配置檔案,在path:/erc/fstab寫入如下檔案,儲存並退出
/dev/sr0 /mnt/cdrom iso9660 defaults 0 0
2、yum的本地配置
-
修改yum的repo檔案
-
在path:/etc/yum.repo.d/rhel8.repo中填入以下內容,儲存退出
[basos] # 具有唯一性,不可重複 name=cdrom baseos packages #倉庫描述,描述資訊,自定義,不具備唯一性 baseurl=file:///mnt/cdrom/BaseOS #指定軟體倉庫地址,file://用於指定本地軟體包存放位置 enabled=1 #軟體倉庫是否啟動,1啟動,0不啟動 gpgcheck=0 #是否檢測軟體包簽名,0不檢測,1檢測,一般自己建立的倉庫都是0 [appstream] name=cdrom baseos packages baseurl=file:///mnt/cdrom/AppStream enabled=1 gpgcheck=0
-
清理yum的快取檔案
[root@localhost ~]# yum clean all Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. 20 files removed
-
重新載入cache
[root@localhost ~]# yum makecache Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. mplayer 5.6 MB/s | 23 kB 00:00 cdrom baseos packages 33 MB/s | 2.4 MB 00:00 cdrom appstream package 65 MB/s | 8.1 MB 00:00 Metadata cache created.
3、禁用yum源
-
修改yum源的名字
能夠正常使用yum源的必要條件:
1、yum源的檔名必須以:.repo結尾
2、yum源的檔案必須在path:/etc/yum.repo.d/目錄下
因此我們可以採用移動資料夾或者修改yum源的檔案路徑
-
修改yum源的配置檔案,將enabled=1,改為enabled=0
yum源的配置檔案中enabled=1表示允許呼叫這個源
我們把想要禁用的源中的enabled改為0,則表示這會源被禁用。
4、系統升級 / kernel升級
-
把虛擬機器的光碟機更換為更新的版本(8.8--->8.9)
-
將新的光碟機掛載到/mnt/cdrom下
-
yum list kernel 列出當前使用的kernel,和可用的kernel
-
yum update 更新yum源(更新所有的源-->系統升級)
yum install kernel -y,下載新的kernel(只更新kernel-->核心升級)
-
systemctl reboot,重啟系統,升級完成
-
如果是系統升級,重啟後會有兩個選項(8.8 / 8.9)我們選擇8.9,進入系統
-
查詢系統中所有的kernel version
rpm -qa | grep kernel
447是舊的版本
513是新的版本
-
將舊的版本刪除
rpm -qa | grep kernel | grep 477 | rpm -e
5、下載阿里雲的yum的repo檔案
-
使用wget下載
wget https://mirrors.aliyun.com/repo/Centos-8.repo
-
我們可以禁用其他的repo源,也可以保留,但是要保證每一個repo源的唯一性,即repo原始檔中【name】的唯一性
【6】、原始碼包管理
現有原始碼包(tar包)-----> 編譯安裝
- 自定義性強,靈活度高
再有rpm軟體包----->yum rpm
原始碼包安裝步驟,以nginx
為例
-
官網下載原始碼包
[root@xu ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz #我們透過官網下載的原始碼包一般都是tar包
-
系統安裝原始碼包依賴
#我們可以去nginx官網查詢下載nginx時所需要的依賴,通常我們對於依賴的下載是透過yum去下載,每一個軟體的依賴都是不同的,需要去對應的官網進行查詢
-
解壓原始碼包&進入原始碼包安裝路徑
[root@xu ~]# tar -xf nginx-1.24.0.tar.gz [root@xu ~]# ls anaconda-ks.cfg nginx-1.24.0 nginx-1.24.0.tar.gz [root@xu ~]# cd nginx-1.24.0/ [root@xu nginx-1.24.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE man README src
-
configure檢測系統環境&指定安裝路徑與功能
#透過config我們可以指定安裝路徑,指定安裝的功能模組,這就是透過原始碼包安裝的優勢,方便我們的管理和自定義 #在我們完成指定之後,他就會幫我們去檢測系統安裝環境 [root@xu nginx-1.24.0]# ./configure --prefix=/usr/local/ngix checking for OS + Linux 4.18.0-513.5.1.el8_9.x86_64 x86_64 checking for C compiler ... found + using GNU C compiler + gcc version: 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) checking for gcc -pipe switch ... found checking for -Wl,-E switch ... found checking for gcc builtin atomic operations ... found ...
-
make編譯,將原始碼轉換為二進位制
#檢測完成後,將原始碼,編譯為二進位制檔案,所謂的原始碼都是一個一個的用程式語言寫的原始檔,因此需要透過編譯成為計算機可以識別的二進位制檔案 [root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ src/core/nginx.c ...
-
make install 安裝軟體包
#編譯為二進位制檔案後,我們就可以直接去安裝了 [root@xu nginx-1.24.0]# make install
-
補充
-
在我們透過原始碼包安裝後,我想增加新的功能,我們還需要重新編譯,但不安裝
#由於我們是透過原始碼包安裝的軟體,因此對其功能的選擇是很方便的,我們首先看一下nginx當前的資訊 [root@xu sbin]# ./nginx -V nginx version: nginx/1.24.0 built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) configure arguments: --prefix=/usr/local/nginx #我們想增加新的功能時,必須要帶上之前使用config指定的內容,再重新透過config去檢查安裝環境,進行編譯 [root@xu nginx-1.24.0]# ./configure --prefix=/usr/local/nginx/ --with-http_ssl_module checking for OS + Linux 4.18.0-513.5.1.el8_9.x86_64 x86_64 checking for C compiler ... found + using GNU C compiler + gcc version: 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) checking for gcc -pipe switch ... found checking for -Wl,-E switc[root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ h ... found checking for gcc builtin atomic operations ... found checking for C99 variadic macros ... found #然後再重新編譯 [root@xu nginx-1.24.0]# make make -f objs/Makefile make[1]: Entering directory '/root/nginx-1.24.0' cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ ## !!!編譯完成後不要安裝!!!,如果安裝會覆蓋之前的內容 #在編譯完成後,nginx原始碼包目錄下會有一個objs目錄,裡面由nginx可執行檔案,我們需要將nginx複製到安裝路徑下的/sbin/下,替換掉原來的nginx可執行檔案 [root@xu nginx-1.24.0]# ls auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man objs README src [root@xu objs]# cp ./nginx /usr/local/nginx/sbin/ cp: overwrite '/usr/local/nginx/sbin/nginx'? y [root@xu objs]# cd /usr/local/nginx/sbin/ [root@xu sbin]# ls nginx #最後我們檢查nginx的版本資訊,至此增加完成 [root@xu sbin]# ./nginx -V nginx version: nginx/1.24.0 built by gcc 8.5.0 20210514 (Red Hat 8.5.0-20) (GCC) built with OpenSSL 1.1.1k FIPS 25 Mar 2021 TLS SNI support enabled configure arguments: --prefix=/usr/local/nginx/ --with-http_ssl_module
-
【7】、自定義軟體倉庫
yum執行思路:
執行yum命令程式---->倉庫配置檔案---->軟體包倉庫
軟體包倉庫:
1、眾多的軟體包
2、倉庫資料檔案(倉庫清單)
-
模擬在Linux不能上網的情況下去按照軟體
1、我們首先需要透過宿主機把軟體下載好,在使用傳輸工具或者命令傳到虛擬機器中
2、然後就可以在虛擬機器中進行安裝了
-
解壓傳入的壓縮包,裡面是一個個的rpm軟體包
-
在下載之前需要讓yum去識別這個軟體的安裝方式
1、首先看下光碟中的安裝方式是什麼樣的
BaseOS和AppStream目錄下的repodata裡面的repomd儲存的是下載方式的索引,在使用yum去下載時都需要在repomd裡找到對應的軟體下載方式後再去packages目錄下去下載
repodata也就倉庫清單
[root@localhost ~]# ls /mnt/cdrom/BaseOS/repodata/
005f3daf06049c081565a4066404ce4ca5bb0275b8a9e5a04c725b09ac0bbb07-comps-BaseOS.x86_64.xml
6dcf6de7dd1089a452d5caa14fa1db8ce7cb79aad28a47a95f5aed14bd22f767-productid.gz
9b3a380a984ef4d552ce527b40f3415775e18955b6ca9a9c305f60cf6529f602-filelists.xml.gz
a28f983c96f2d691c966620431244d8c4a8415ec349e31b9cce280783ec323d3-primary.xml.gz
ab4ec8c050898edbe33646155dff8b15d16e3d29f3a13b029b2e2e6ca5c24a57-other.xml.gz
dd3fd62a2077ecf119b6f7971aa8882a546356fef66a874bf4860f8a6d45f416-comps-BaseOS.x86_64.xml.gz
productid
repomd.xml
TRANS.TBL
[root@localhost ~]# ls /mnt/cdrom/AppStream/repodata/
2adc257c8b938376e8d66f70b6dd601f46111b6f46e06d610d67f4e9daab434c-primary.xml.gz
2c384cc97bc979264430666010a3f52aeca381fd2137abba70ab6672429ac194-filelists.xml.gz
45295e7b00a783d7ef66a3d6f2f5890477a61c5c465f7190a910b50d7cf222e4-modules.yaml.gz
468fea75becd836ab1fc45fe77d820e37ab22b18cc2a4a992f65b81833f96854-comps-AppStream.x86_64.xml
6dcf6de7dd1089a452d5caa14fa1db8ce7cb79aad28a47a95f5aed14bd22f767-productid.gz
ad09469a33bac2649097cdf63bdc43d4415c6bfaffabdf6ce3da47b6fcb03596-comps-AppStream.x86_64.xml.gz
e0bb60aac5d524ef1cf945f2a934e27a63d77238bc2b25f13c7335286bf1869c-other.xml.gz
productid
repomd.xml
TRANS.TBL
2、生成repodata檔案
因此我們也需要按照BaseOS和AppStream目錄下的repodata生成新的repodata
使用createrepo命令去生成mplayer的repodata檔案
createrepo預設是沒有下載的
yum list createrepo # 檢視下載createrepo所需要的包
createrepo_c # 需要createrepo_c
yum install createrepo_c -y
createrepo /opt/tools #生成了repodata檔案
3、編寫yum的repo源
[mytools]
name=mytools
baseurl=file:///opt/tools
enabled=1
gpgcheck=0
清理yum下載的包,重進載入快取,下載mplayer
yum clean
yum makecache
yum install mplayer
4、repomd.xml、repodata、yum源的repo檔案的作用、聯絡
-
repomd.xml檔案的作用是存放軟體的索引資訊,透過yum去下載時,會根據repo檔案中的【name】去找對應目錄下的repomd.xml
-
repodata目錄的作用是收集當前軟體的各種資訊(版本資訊等),並且寫入repomd.xml中
-
yum源的repo檔案,在使用yum去下載時會去所有的repo檔案中去找到對應路徑,去看哪個路徑下有有對應軟體的repodata目錄(如果找遍了所有的源都沒有,則會報錯)。因此在寫repo原始檔時,一定要保證路徑的正確性
-
聯絡
-
首先使用createrepo命令
會發生兩個步驟
- 在軟體包所在的目錄生成repodata目錄
- repodata目錄收集對應軟體的各種資訊,寫入repomd.xml中
-
透過yum去下載軟體
- 首先去/etc/yum.repos.d/目錄下查詢可用的repo原始檔
- 可用的repo檔案也就是在baseurl寫的路徑中可以找到repodata目錄
- 進而可以找到repom.xml檔案,索引到對應的軟體,然後在packages中下載
- 首先去/etc/yum.repos.d/目錄下查詢可用的repo原始檔
-
-
在一個系統中可以存在多個yum源,但是一般來說通常只保留一個,可用的repo源越多,當一個源出錯時,可能會造成連帶影響
【8】、網路yum倉庫
構建網路服務,透過網路服務提供倉庫內容
- 構建FTP服務
- 利用FTP服務共享目錄,我們將自定義軟體倉庫,放到共享目錄下即可
- 在客戶端透過curl去訪問ftp共享服務目錄
# 服務端進行配置
cp -r /etc/yum.repos.d/mytools /var/ftp/rpms
# 客戶端進行測試
curl ftp://192.168.121.180/rpms
在客戶端需要寫yum的repo檔案,告訴yum你可以去ftp共享目錄下獲取軟體
[ftp]
name=my_ftp
baseurl=ftp://192.168.121.180/rpms
gpgcheck=0
enable=1
利用這種架構,
在ftp伺服器上可以為很多主機提供一個自定義的網路yum倉庫
利用ftp服務提供光碟yum倉庫的提供
我們只需將光碟機裝置掛載到/var/ftp目錄下即可
mount /dev/cdrom /var/ftp/dvd/
# 修改/etc/fstab檔案
# 在客戶端進行測試
curl ftp://192.168.121.180/dvd/
dr-xr-xr-x 4 0 0 2048 Nov 21 2023 AppStream
dr-xr-xr-x 4 0 0 2048 Nov 21 2023 BaseOS
dr-xr-xr-x 3 0 0 2048 Nov 21 2023 EFI
-r--r--r-- 1 0 0 2204 Nov 03 2023 LICENSE
-r--r--r-- 1 0 0 883 Nov 21 2023 TRANS.TBL
dr-xr-xr-x 3 0 0 2048 Nov 21 2023 images
dr-xr-xr-x 2 0 0 2048 Nov 21 2023 isolinux
-r--r--r-- 1 0 0 88 Nov 21 2023 media.repo
# 修改客戶端的配置檔案
[basos]
name=local_basos
baseurl=ftp://192.168.121.180/dvd/BaseOS
gpgcheck=0
enable=1
[appstream]
name=local_appstream
baseurl=ftp://192.168.121.180/dvd/AppStream
gpgcheck=0
enable=1
【9】、yum倉庫更新
yum倉庫的更新分為兩個方面
- 倉庫資料檔案的更新
- yum快取的更新
# 服務端倉庫資料檔案的更新
mv /opt/tools/xxx.rpm /root
createrepo --update /var/ftp/rpms
# 客戶端yum快取的更新
yum makecache
yum repoinfo