ABI:Application Binary Interface
Windows與Linux不相容
API即Application Programming Interface,API可以在各種不同的操作系統上實現給應用程式提供完 全相同的介面,而它們本身在這些系統上的實現卻可能迥異,主流的操作系統有兩種,一種是Windows 系統,另一種是Linux系統。由於操作系統的不同,API又分爲Windows API和Linux API。在Windows 平臺開發出來的軟體在Linux上無法執行,在Linux上開發的軟體在Windows上又無法執行,這就導致 了軟體移植困難,POSIX 標準的出現就是爲了解決這個問題
POSIX:Portable Operating System Interface 可移植操作系統介面,定義了操作系統應該爲應用程式 提供的介面標準,是IEEE爲要在各種UNIX操作系統上執行的軟體而定義的一系列API標準的總稱。 Linux和windows都要實現基本的posix標準,程式就在原始碼
級別可移植了
c程式原始碼 --> 預處理 --> 編譯 --> 彙編 --> 鏈接
C語言的程式編譯主要經過四個過程:
#分步驟編譯執行
gcc -E hello.c -o hello.i 對hello.c檔案進行預處理,生成了hello.i 檔案
gcc -S hello.i -o hello.s 對預處理檔案進行編譯,生成了彙編檔案
gcc -c hello.s -o hello.o 對彙編檔案進行編譯,生成了目標檔案
gcc hello.o -o hello 對目標檔案進行鏈接,生成可執行檔案
#一步實現編譯過程
gcc hello.c -o hello 直接編譯鏈接成可執行目標檔案
鏈接主要作用是把各個模組之間相互參照的部分處理好,使得各個模組之間能夠正確地銜接,分爲靜態 和動態鏈接
檢視二進制程式所依賴的庫檔案
ldd /PATH/TO/BINARY_FILE
管理及檢視本機裝載的庫檔案
ldconfig #載入組態檔中指定的庫檔案
/sbin/ldconfig -p #顯示本機已經快取的所有可用庫檔名及檔案路徑對映關係
組態檔:
/etc/ld.so.conf
/etc/ld.so.conf.d/*.conf
快取檔案:
/etc/ld.so.cache
注意:庫檔案誤刪後,將導致依賴的程式無法正常執行,恢復方法爲:
利用光碟映象進入緊急救援模式:
開源軟體初只提供了.tar.gz的打包的原始碼檔案,使用者必須自已編譯每個想在GNU/Linux上執行的軟 件。使用者急需系統能提供一種更加便利的方法來管理這些軟體,當Debian誕生時,這樣一個管理工具 dpkg也就應運而生,可用來管理deb後綴的"包"檔案。從而著名的「package」概念第一次出現在 GNU/Linux系統中,稍後Red Hat纔開發自己的rpm包管理系統
rpm2cpio 包檔案|cpio –itv 預覽包內檔案
rpm2cpio 包檔案|cpio –id 「*.conf」 釋放包內檔案
軟體包管理器功能:
將編譯好的應用程式的各組成檔案打包一個或幾個程式包檔案,利用包管理器可以方便快捷地實現程式 包的安裝、解除安裝、查詢、升級和校驗等管理操作
主流的程式包管理器
原始碼打包檔案命名:
name-VERSION.tar.gz|bz2|xz VERSION: major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION: major.minor.release
release:release.OS
常見的arch:
* x86: i386, i486, i586, i686
* x86_64: x64, x86_64, amd64
* powerpc: ppc
* 跟平臺無關:noarch
範例:
bash-3.2-32.el5_9.1.i386.rpm
bash-4.2.46-19.el7.x86_64.rpm
範例:統計rpm的架構型別及相應的包的數量
sed -nr 's#.*\.(.*)\.rpm$#\1#p' /misc/cd/BaseOS/Packages/*|sort|uniq -c
ls *.rpm | grep -Eo '[^.]+\.rpm$'|cut -d. -f1|sort |uniq -c
#### 2.1.4分類和拆包
軟體包爲了管理和使用的便利,會將一個大的軟體分類,放在不同的子包中。
包的分類:
* Application-VERSION-ARCH.rpm: 主包
* Application-devel-VERSION-ARCH.rpm 開發子包
* Application-utils-VERSION-ARHC.rpm 其它子包
* Application-libs-VERSION-ARHC.rpm 其它子包
#### 2.1.5包的依賴
軟體包之間可能存在依賴關係,甚至回圈依賴,即:A包依賴B包,B包依賴C包,C包依賴A包
安裝軟體包時,會因爲缺少依賴的包,而導致安裝包失敗。
解決依賴包管理工具:
* yum: rpm包管理器的前端工具
* dnf:Fedora 18+ rpm包管理器前端管理工具,CentOS 8 版代替 yum
* apt:deb包管理器前端工具
* zypper:suse上的rpm前端管理工具
#### 2.1.6 程式包管理器相關檔案
1. 包檔案組成
* 包內的檔案
* 元數據,如:包的名稱,版本,依賴性,描述等
* 可能會有包安裝或解除安裝時執行的指令碼
2. 數據庫(公共):/var/lib/rpm
* 程式包名稱及版本
* 依賴關係 功能說明
* 包安裝後生成的各檔案路徑及校驗碼資訊
#### 2.1.7獲取程式包的途徑
##### 2.1.7.1系統發版的光碟或官方網站
CentOS映象:
https://www.centos.org/download/ http://mirrors.aliyun.com https://mirrors.huaweicloud.com/ https://mirror.tuna.tsinghua.edu.cn/ http://mirrors.sohu.com http://mirrors.163.com
Ubuntu 映象:
http://cdimage.ubuntu.com/releases/
http://releases.ubuntu.com
##### 2.1.7.2第三方組織提供
* Fedora-EPEL:Extra Packages for Enterprise Linux
https://fedoraproject.org/wiki/EPEL
https://mirrors.aliyun.com/epel/?spm=a2c6h.13651104.0.0.3bc47dfaZpesAr
* Rpmforge:官網:http://repoforge.org/, RHEL推薦,包很全,即將關閉
* Community Enterprise Linux Repository:http://www.elrepo.org,支援新的內核和硬體相關包
##### 2.1.7.3軟體專案官方站點
http://yum.mariadb.org/10.4/centos8-amd64/rpms/
http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
##### 2.1.7.4搜尋引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
注意:第三方包建議要檢查其合法性,來源合法性,程式包的完整性
##### 2.1.7.5自己製作
將原始碼檔案,利用工具,如:rpmbuild,fpm等工具製作成rpm包檔案
## 3.包管理器
CentOS系統上使用rpm命令管理程式包
功能:
安裝、解除安裝、升級、查詢、校驗、數據庫維護
### 3.1安裝
格式:
rpm {-i|–install} [install-options] PACKAGE_FILE…
選項:
-v: verbose
-vv:
-h: 以#顯示程式包管理執行進度
常用組合:
rpm -ivh PACKAGE_FILE ...
rpm包安裝選項[install-options]:
--test: 測試安裝,但不真正執行安裝,即dry run模式
--nodeps:忽略依賴關係
--replacepkgs | replacefiles
--nosignature: 不檢查來源合法性
--nodigest:不檢查包完整性
--noscripts:不執行程式包指令碼
%pre: 安裝前指令碼 --nopre
%post: 安裝後腳本 --nopost
%preun: 解除安裝前指令碼 --nopreun
%postun: 解除安裝後腳本 --nopostun
### 3.2升級和降級
rpm包升級
rpm {-U|–upgrade} [install-options] PACKAGE_FILE…
rpm {-F|–freshen} [install-options] PACKAGE_FILE…
對應選項:
upgrade:安裝有舊版程式包,則「升級」,如果不存在舊版程式包,則「安裝」
freshen:安裝有舊版程式包,則「升級」, 如果不存在舊版程式包,則不執行升級操作
–oldpackage:降級
–force: 強制安裝
常用組合
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
升級注意項:
(1) 不要對內核做升級操作;Linux支援多內核版本並存,因此直接安裝新版本內核
(2) 如果原程式包的組態檔安裝後曾被修改,升級時,新版本提供的同一個組態檔不會直接覆蓋老版本的組態檔,而把新版本檔案重新命名(FILENAME.rpmnew)後保留
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a:所有包
-f:檢視指定的檔案由哪個程式包安裝生成
-p rpmfile:針對尚未安裝的程式包檔案做查詢操作
[query-options]
--changelog:查詢rpm包的changelog
-c:查詢程式的組態檔
-d:查詢程式的文件
-i:information -l:檢視指定的程式包安裝後生成的所有檔案
--scripts:程式包自帶的指令碼
#和CAPABILITY相關
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴
--provides:列出指定程式包所提供的CAPABILITY
-R:查詢指定的程式包所依賴的CAPABILITY
常用查詢用法:
-qa
-q PACKAGE
-qi PACKAGE
-qc PACKAGE
-ql PACKAGE
-qd PACKAGE
-q --scripts PACKAGE
-qf FILE -qpi PACKAGE_FILE
-qpl PACKAGE_FILE, ...
格式:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
注意:當包解除安裝時,對應的組態檔不會被刪除,以FILENAME.rpmsave形式保留
範例:強行刪除rpm包,並恢復
rpm -e rpm --nodeps
#重新啓動進入rescue模式
#mkdir /mnt/cdrom
#mount /dev/sr0 /mnt/cdrom
#rpm -ivh /mnt/cdrom/Packages/rpm-4.11.3-40.el7.x86_64.rpm --root=/mnt/sysimage
#reboot
在安裝包時,系統也會檢查包的來源是否是合法的
檢查包的完整性和簽名
rpm -K|--checksig rpmfile
在檢查包的來源和完整性前,必須匯入所需要的公鑰
範例:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
rpm -qa 「gpg-pubkey*」
軟體在安裝時,會將包裡的每個檔案的元數據,如:大小,許可權,所有者,時間等記錄至rpm相關的數據庫中,可以用來檢查包中的檔案是否和當初安裝時有所變化
rpm {-V|--verify} [select-options] [verify-options]
#範例:
#rpm -V centos-release
S.5....T. c /etc/issue
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 . (點) 表示當前位置代表的字元含義一致
c 所在的位置表示檔案型別
c 組態檔
d 檔案數據檔案
g 該檔案不屬於某個檔案(少數情況)
l 許可證檔案(license file)
r 讀我檔案(READ ME)
rpm包安裝時生成的資訊,都放在rpm數據庫中
/var/lib/rpm
可以重建數據庫
rpm {--initdb|--rebuilddb}
initdb: 初始化,如果事先不存在數據庫,則新建之,否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄
CentOS 使用 yum, dnf 解決rpm的包依賴關係
YUM: Yellowdog Update Modifier,rpm的前端程式,可解決軟體包相關依賴性,可在多個庫之間定位軟體包,up2date的替代工具,CentOS 8 用dnf 代替了yum ,不過保留了和yum的相容性,設定也是 通用的
yum/dnf 是基於C/S 模式
先在yum伺服器上建立 yum repository(倉庫),在倉庫中事先儲存了衆多rpm包,以及包的相關的元數據檔案(放置於特定目錄repodata下),當yum用戶端利用yum/dnf工具進行安裝時包時,會自動 下載repodata中的元數據,查詢元數據是否存在相關的包及依賴關係,自動從倉庫中找到相關包下載並安裝。
/etc/yum.conf #爲所有倉庫提供公共設定
/etc/yum.repos.d/*.repo: #爲每個倉庫提供組態檔
** repo倉庫組態檔指向的定義:**
[repositoryID]
name=Some name for this repository
baseurl=url://path/to/repository/
enabled={1|0} gpgcheck={1|0}
gpgkey=URL enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意爲隨機挑選,預設值
priority:按順序存取
cost= 預設爲1000
yum伺服器的baseurl形式
file:// 本地路徑
http://
https://
ftp://
注意:yum倉庫指向的路徑一定必須是repodata目錄所在目錄
相關變數
yum的repo組態檔中可用的變數:
$releasever: 當前OS的發行版的主版本號,如:8,7,6
$arch: CPU架構,如:aarch64, i586, i686,x86_64等
$basearch:系統基礎平臺;i386, x86_64
$contentdir:表示目錄,比如:centos-8,centos-7 $YUM0-
$YUM9:自定義變數
範例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i386
範例:CentOS 8 組態檔
[root@centos8 ~]# ll /etc/yum.conf
lrwxrwxrwx. 1 root root 12 May 14 2019 /etc/yum.conf -> dnf/dnf.conf
[root@centos8 ~]#cat /etc/yum.conf
[main] gpgcheck=1 #安裝包前要做包的合法和完整性校驗
installonly_limit=3 #同時可以安裝3個包,最小值爲2,如設爲0或1,爲不限制
clean_requirements_on_remove=True #刪除包時,是否將不再使用的包刪除
best=True #升級時,自動選擇安裝最新版,即使缺少包的依賴
範例:CentOS 7的組態檔
[root@centos7 ~]# ll /etc/yum.conf
-rw-r--r--. 1 root root 970 Aug 8 19:57 /etc/yum.conf
[root@centos7 ~]# cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1 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
baseurl指向的路徑
阿裡雲提供了寫好的CentOS和ubuntu的倉庫檔案下載鏈接
http://mirrors.aliyun.com/repo/
CentOS系統的yum源
#阿裡雲
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
#華爲雲
https://mirrors.huaweicloud.com/
#清華大學
https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
EPEL的yum源
#阿裡雲
https://mirrors.aliyun.com/epel/$releasever/x86_64
阿裡巴巴開源軟體
https://opsx.alibaba.com/
範例:爲CentOS7用系統安裝光碟作的本地yum倉庫
#掛載光碟至某目錄,如/mnt/cdrom
mount /dev/cdrom /mnt/cdrom
#建立組態檔
[root@centos7 ~]#vim /etc/yum.repos.d/centos7.repo
[CentOS7] name=CentOS 7
baseurl=file:///mnt/cdrom
gpgcheck=0
enabled=1
範例:爲CentOS 8 設定 yum 的系統和EPEL源倉庫
[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
[BaseOS]
name=BaseOS
baseurl=file:///misc/cd/BaseOS
gpgcheck=1
gpgkey=/etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
[AppStream]
name=AppStream
baseurl=file:///misc/cd/AppStream
gpgcheck=0
[epel]
name=EPEL
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
gpgcheck=0
enabled=1
[extras]
name=extras
baseurl=https://mirrors.aliyun.com/centos/$releasever/extras/$basearch/os
gpgcheck=0
注意:與之前的版本不同,CentOS 8系統有兩個yum源:BaseOS和AppStream,需要分別設定兩個倉庫
範例:用指令碼實現建立yum倉庫組態檔
[root@centos7 ~]# cat yum.sh
#!/bin/bash mkdir
/etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup
cat > /etc/yum.repos.d/base.repo <<EOF
[base] name=base
baseurl=https://mirrors.aliyun.com/centos/\$releasever/os/\$basearch
gpgcheck=0
EOF
** yum-config-manager命令 **
可以生成yum倉庫的組態檔及啓用或禁用倉庫,來自於yum-utils包
格式:
#增加倉庫
yum-config-manager --add-repo URL或file
#禁用倉庫
yum-config-manager --disable 「倉庫名"
#啓用倉庫
yum-config-manager --enable 「倉庫名」
範例:建立倉庫設定
[root@centos8 ~]#rpm -qf `which yum-config-manager `
dnf-utils-4.0.2.2-3.el8.noarch
[root@centos8 ~]#yum-config-manager --add-repo
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/dockerce.repo
[root@centos8 ~]#ls /etc/yum.repos.d/
backup base.repo docker-ce.repo
#生成172.16.0.1_cobbler_ks_mirror_8_.repo
[root@centos8 ~]#yum-config-manager --
addrepo=http://172.16.0.1/cobbler/ks_mirror/8/
Adding repo from: http://172.16.0.1/cobbler/ks_mirror/8/
[root@centos8 ~]#cat /etc/yum.repos.d/172.16.0.1_cobbler_ks_mirror_8_.repo
[172.16.0.1_cobbler_ks_mirror_8_]
name=created by dnf config-manager from http://172.16.0.1/cobbler/ks_mirror/8/
baseurl=http://172.16.0.1/cobbler/ks_mirror/8/
enabled=1
[root@centos8 ~]#ls /etc/yum.repos.d/
backup base.repo
[root@centos8 ~]#yum-config-manager --add-repo /data/docker-ce.repo
Adding repo from: file:///data/docker-ce.repo
[root@centos8 ~]#ls /etc/yum.repos.d/
backup base.repo docker-ce.repo
範例:啓用和禁用倉庫
[root@centos8 ~]#yum repolist
[root@centos8 ~]#yum-config-manager --disable epel
[root@centos8 ~]#cat /etc/yum.repos.d/base.repo
[root@centos8 ~]#yum repolist
[root@centos8 ~]#yum-config-manager --disable extras
[root@centos8 ~]#yum repolist
[root@centos8 ~]#yum-config-manager --enable extras
[root@centos8 ~]#yum repolist
用法:
yum [options] [command] [package ...]
yum的命令列選項:
-y #自動回答爲「yes」
-q #靜默模式
--nogpgcheck #禁止進行gpg check
--enablerepo=repoidglob #臨時啓用此處指定的repo,支援萬用字元,如:」*「 --
disablerepo=repoidglob #臨時禁用此處指定的repo,和上面語句同時使用,放在後面的生效
yum repolist [all|enabled|disabled]
範例:
[root@centos8 ~]#yum repolist
[root@centos8 ~]#yum repolist all
[root@centos8 ~]#yum --enablerepo=ep* --disablerepo=A* repolist
範例: 顯示倉庫的詳細資訊
[root@centos8 ~]#yum repolist -v
yum list
yum list [all | glob_exp1] [glob_exp2] [...]
yum list {available|installed|updates} [glob_exp1] [...]
範例:
[root@centos8 data]#dnf list mariadb-server
[root@centos8 data]#dnf list mariadb-server --showduplicates
[root@centos8 data]#dnf list mariadb-server --disablerepo=AppStream
[root@centos8 data]#dnf list mariadb-server --showduplicates -
disablerepo=AppStream
範例: 只檢視已經安裝的包
[root@centos8 ~]#yum list installed|head
範例: 檢視可安裝的包
[root@centos8 ~]#yum list available |head
範例: 檢視可以升級的包
[root@centos8 ~]#yum list updates
範例: 檢視指定的包
[root@centos8 ~]#yum list exim
#支援萬用字元
[root@centos8 ~]#yum list exim*
yum install package1 [package2] [...]
yum reinstall package1 [package2] [...] #重新安裝
--downloadonly #只下載相關包預設至/var/cache/yum/x86_64/7/目錄下,而不執行
install/upgrade/erase
--downloaddir=<path>, --destdir=<path> #--downloaddir選項來指定下載的目錄,如果不存在自動建立
範例:安裝epel源
[root@centos7 ~]#yum -y install epel-release
[root@centos7 ~]#yum -y install sl
[root@centos7 ~]#rpm -ql sl
#執行安裝sl程式,可以看到下面 下麪火車,這標誌着我們可以當老司機了
[root@centos7 ~]#sl -a
[root@centos8 ~]#dnf -y install cowsay
[root@centos8 ~]#cowsay hello
範例:利用elrepo源在CentOS 7 安裝新版內核
[root@centos7 ~]#yum install https://www.elrepo.org/elrepo-release-
7.04.el7.elrepo.noarch.rpm
[root@centos7 ~]#rpm -ql elrepo-release-7.0-4.el7.elrepo
[root@centos7 ~]#yum repolist
[root@centos7 ~]#cat /etc/yum.repos.d/elrepo.repo
[root@centos7 ~]#yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
[root@magedu ~]#yum -y --enablerepo="elrepo-kernel" install kernel-ml
[root@centos7 ~]#ls /boot
[root@centos7 ~]#ls /lib/modules
[root@centos7 ~]#reboot
[root@centos7 ~]#uname -r
#/data/目錄如果不存在,會自動建立
[root@centos8 ~]#yum -y install --downloadonly --downloaddir=/data/httpd httpd
[root@centos8 ~]#ls /data/httpd/
yum remove | erase package1 [package2] [...]
檢查可用升級:
yum check-update
升級和降級
yum upgrade|update [package1] [package2] [...]
upgrade-minimal #最小化升級
yum downgrade package1 [package2] [...] (降級)
範例:
[root@centos7 ~]# cat /etc/yum.repos.d/base.repo
[root@centos7 ~]#yum --disablerepo=* --enablerepo=updates list available
[root@centos7 ~]#yum info samba
[root@centos7 ~]#yum info samba --showduplicates
[root@centos7 ~]#yum install samba --disablerepo=updates
[root@centos7 ~]#yum update samba
[root@centos7 ~]#yum update
檢視程式包information
yum info [...]
檢視指定的特性(可以是某檔案)是由哪個程式包所提供:
yum provides | whatprovides feature1 [feature2] [...]
注意:檔案要寫全路徑,而不只是檔名,否則可能無法查詢到