1. 程式人生 > >#13 yum、編譯安裝與sed命令的使用

#13 yum、編譯安裝與sed命令的使用

yum、編譯安裝與sed命令的使用

Linux程序包管理之二

程序包管理的前端工具:

CentOS系,yum,dnf


yum:

Yellowdog Updater Modified

Yellowdog是一款發行版linux,使用rpm作為默認的程序包管理工具


URL: yum定位軟件倉庫及倉庫中程序包文件的主要標識方式;

schema://[username@]hostname[:port][/PATH/TO/DOCUMENT][parameters][method]

web站點:

http/https

http://www.163.com


yum是C/S架構的模型,其中服務器也稱為軟件倉庫(yum repository),客戶端需要書寫URL以指定服務器及程序包路徑;


在服務器上,軟件倉庫其實就是一個目錄,在目錄中包含了程序包文件及元數據文件;

元數據文件統一的存放於repodata的目錄中;也可以說,repodata目錄所在的路徑即為軟件倉庫的路徑;


createrepo命令:

createrepo - Create repomd (xml-rpm-metadata) repository

createrepo [options] <directory>

<directory>:存放程序包的目錄


客戶機的使用:

yum程序包

yum的主配置文件:/etc/yum.conf

ini風格的配置信息模式:分段式配置內容

[repositoryid]

statements


註意:所有的配置語句,其生效的範圍是從一個[]開始,到下一個[]結束

例如:

[repo1]

statements


[repo2]

statements


註意:

1.repositoryid必須全局唯一

2.repositoryid不能包括除了.和_之外的任何特殊字符,可以包含字母和數字,字母嚴格區分大小寫機制;


/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


想要更加全面的信息,可以使用man 5 yum.conf獲取;


# PUT YOUR REPOS HERE OR IN separate files named file.repo in /etc/yum.repos.d

用戶自定義的repository的指向信息,可以寫在主配置文件中;也可以將用戶自定義的repository的指向信息,以.repo為文件後綴名,並且存放於/etc/yum.repos.d目錄中;

主配置文件:

/etc/yum.conf

只提供yum倉庫指向信息的公共配置內容;

註意:該文件一般情況下,不進行任何修改;

片段配置文件:

/etc/yum.repos.d/*.repo

每一個以.repo為後綴名的文件,即為一個倉庫文件;這樣的每個文件中可以配置指向一個或多個yum倉庫;


yum程序在查找yum倉庫的時候,根據這些配置文件來查找的;每一次可能會找到多個yum倉庫,從所有可以使用的倉庫中查找最新版本的程序包並緩存到本地進行安裝,升級等操作;


同類的多個倉庫被稱為鏡像;只要有一個可用即可;

不同類的倉庫也可以同時存在多個,yum可以同時使用這些倉庫;


.repo文件該如何定義:

[repositoryid]

name=Full name of repository

baseurl=schema1://hostname/PATH/TO/REPODATA

schema2://hostname/PATH/TO/REPODATA

schema3://hostname/PATH/TO/REPODATA

schema4://hostname/PATH/TO/REPODATA

schema:

http[s]、ftp、nfs:網絡服務器指向

file:本地服務器指向

#mirrorlist=mirror_url

enabled={0|1},0表示禁用此倉庫指向,1表示啟用;如果沒有enabled語句,默認為啟用狀態;

gpgcheck={0|1},0表示不進行程序包認證,1表示認證;如果為1,需要指定認證所需要的公鑰文件,需要使用gpgkey語句;

gpgkey=schema://hostname/PATH/TO/PUBLIC_KEY_FILE

例子:gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever


failovermethod={roundrobin|priority}

故障倒換方法:

roundrobin:隨機查找,默認的方法;

priority:按照順序依次選擇

enablegroups={1|0}

cost=num,默認所有倉庫的開銷值都是1000;


一般的repo指向內容:

[repoid]

name=

baseurl=

#mirrorlist=

enbaled=1

gpgcheck=0

#gpgkey=


yum命令的用法:

yum - Yellowdog Updater Modified

yum [options] [command] [package ...]

[options]:

-y, --assumeyes:對於yum執行過程中與用戶交互的問題,全部以yes回答

-q, --quiet:安靜模式,在某一次yum執行過程中,沒有任何信息輸出到stdout;

--enablerepo=repoidglob

--disablerepo=repoidglob

在某一次yum執行過程中明確的規定啟用或禁用某個repository指向;在使用了這樣的選項之後,倉庫指向文件中的enabled語句的作用將失效;

--noplugins:

在某一次yum執行過程中,明確指出不使用任何插件;

--nogpgcheck:

在某一次yum執行過程中,明確指出不驗證程序包完整性,在倉庫指向文件中的gpgcheck=1語句會失效;


[command]

command is one of:

* install package1 [package2] [...]

安裝程序包

註意:

1.如果只是給出程序包名稱,yum搜索所有倉庫,並找到最新版本緩存安裝;

2.如果給出程序包的名稱及版本,則查找安裝指定版本的程序包;

3.如果給出的程序包是完整的程序包名,則只是查找某一個程序包;

4.程序包名稱可以使用globbing,(* ? [] [^])


* update [package1] [package2] [...]

* update-to [package1] [package2] [...]

* check-update

* upgrade [package1] [package2] [...]

* upgrade-to [package1] [package2] [...]

* downgrade package1 [package2] [...]

程序包升級或降級:

程序包不同版本之間的更叠;


* remove | erase package1 [package2] [...]

卸載程序包:


* list [...]

yum list LIST OPTIONS

LIST OPTIONS:

all: 顯示所有的程序包,包括已經安裝的和尚未安裝但可用的;

註意:

anaconda:CentOS系統的安裝器,在安裝操作系統的時候一並安裝的程序包;

installed:顯示所有已經安裝的程序包;

available:顯示所有尚未安裝但可以安裝的程序包;

updates:顯示所有可以升級更新的程序包;


* info [...]

yum info LIST OPTIONS

LIST OPTIONS:

all: 顯示所有的程序包,包括已經安裝的和尚未安裝但可用的;

註意:

anaconda:CentOS系統的安裝器,在安裝操作系統的時候一並安裝的程序包;

installed:顯示所有已經安裝的程序包;

available:顯示所有尚未安裝但可以安裝的程序包;

updates:顯示所有可以升級更新的程序包;


name[globbing]


* provides | whatprovides feature1 [feature2] [...]

查看指定的特性是由哪個程序包提供的;


* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

清理本地緩存信息


* makecache

構建緩存


* groupinstall group1 [group2] [...]

* groupupdate group1 [group2] [...]

* grouplist [hidden] [groupwildcard] [...]

* groupremove group1 [group2] [...]

* groupinfo group1 [...]

程序包組的管理命令:



* search string1 [string2] [...]

根據關鍵字進行匹配,默認情況下,搜索程序包名稱及匯總信息;

模糊搜索


* shell [filename]

給yum提供一個交互式命令的操作界面


* localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

* localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

實現本地程序包安裝,即:不依賴於軟件倉庫,直接對rpm格式包文件進行操作;

這兩個命令已經被停用,使用install和update取代;


* reinstall package1 [package2] [...]

重新安裝


* deplist package1 [package2] [...]

顯示每個程序包所有的依賴關系;


* repolist [all|enabled|disabled]

列表顯示yum倉庫的元數據信息

在沒有給出後面的參數的時候,默認為enabled;


* version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]


* history [info|list|packages-list|packages-info|summary|addon-

info|redo|undo|rollback|new|sync|stats]

查看yum事務的歷史;

安裝、升級、卸載等操作的時候,yum會開啟事務;


* load-transaction [txfile]

重新啟動已經停止的事務;


* check


* help [command]


CentOS7中的yum命令:

程序包組的管理命令:

* groups [...]

groups {install | remove | list | info | update}


別名:groupinstall groupremove grouplist groupinfo groupudpate


* autoremove [package1] [...]

自動卸載:


* repoinfo [all|enabled|disabled]


常用的第三方yum倉庫,Fedora EPEL,

到官方站點或鏡像站點中,下載epel-release程序包,並且使用rpm命令安裝至對應的Linux發行版本,在/etc/yum.repos.d目錄中,會多出一個epel.repo的文件;更新repolist即可使用;


要求Linux虛擬機能夠連接互聯網;


yum的repo配置文件中的變量:

$releasever:當前操作系統的發行版本的主版本號;

如:CentOS 7.2-1511,其發行版本的主版本號是7

CentOS 6.7,其發行版本的主版本號是6


$basearch:當前計算機所使用的基礎平臺架構類型;

如:Intel兼容機

i686

x86_64

apple計算機設備

ppc

ppc64


$arch:平臺架構類型

$YUM0~$YUM9:yum內置的由用戶自定義的10個變量;


為什麽要用這些變量?

服務器(repository, 倉庫)必須能夠提供所有的常有發行版本及平臺相關的程序包;但是服務器無法預測任何一個客戶端具體的版本使用情況;


所以讓用戶自行選擇:


.repo

baseurl=https://mirrors.aliyun.com/epel/7/x86_64


創建本地yum倉庫:

createrepo /PATH/TO/PACKAGES


yum-config-manager --add-repo=URL


CentOS程序包管理器之編譯安裝

為什麽要進行源代碼編譯安裝?

1.對應的程序包並不能直接獲取到;

2.已經編譯好的二進制中,尚不包含我們所需要的功能;

3.已經編譯好的二進制中,包含的功能太多,我們並不需要;


源代碼包有兩種:

由程序員直接打包的源代碼:name-VERSION.tar.gz

由第三方利用rpm工具制作的rpm源代碼包:name-VERIONS-release.src.rpm

/usr/src/name-VERIONS


源代碼的組織形式:

1.多文件組成

2.文件中的代碼之間,甚至是不同文件的代碼段之間都可能存在依賴關系;


源代碼的項目管理工具:

C/C++項目管理工具:make

Java項目管理工具:maven


源代碼 --> 預處理(預處理器,cpp) --> 編譯(編譯器,gcc) --> 匯編(匯編器) --> 鏈接(鏈接器) --> 用於執行操作的二進制文件


針對於每個需要編譯的源代碼文件,都可能會有一個或多個被他依賴的文件或他所依賴的文件,這樣的信息會被保存到一個配置文件中;這個配置文件會告訴我們:

1.調用哪個預處理器,如何進行預處理;

2.調用哪個編譯器,如何進行編譯;

3.文件的編譯順序等等;


這類文件一般是makefile,這樣的makefile文件並不是事先存在的,也不是對所有用戶的需求都一視同仁的;


程序員可以使用專用的工具,來對於所有的源代碼文件進行內容分析和抽取,構建出makefile文件,所有的makefile文件都有一個統一的模版——Makefile.in


用戶可以根據自己的需要,自行構建makefile文件,從而實現能夠滿足自己需求的編譯過程


幫助用戶生成makefile文件的通常是一個名為configure的腳本文件;


開發工具:

autoconf:幫助用戶生成configure腳本

automake:幫助用戶生成Makefile.in的模版文件


建議:任何的源代碼包,在解壓縮之後,都會提供INSTALL或README的文檔文件,我們在編譯操作之前,最好先查閱此類文件的內容, 以確定編譯過程;


開源程序的源代碼的獲取方式:

1.官方自建的站點:

apache.org(ASF)

mariadb.org

...


2.代碼的托管站點

SourceForge

Github

code.google.com


需要使用編譯器:gcc (GNU C Complier)


開發環境的安裝:

CentOS7:

1.yum groups install "開發工具"

yum groups install "Development Tools"


CentOS6:

yum groupinstall "Development Tools" "Server Platform Development"

"Desktop Platform Development"



2.yum install make automake autoconf gcc glibc qt ncurses


通常來講,Linux系統中的編譯安裝程序的三大步驟:

1.configure [options...]

2.make

3.make install


第一步:

./configure [options...] [VAR=VALUE]...

常用選項分類:

1.安裝路徑的設定:

--prefix=/PATH/TO/SOMEWHERE

指定默認的程序安裝路徑,如果不給該選項,默認路徑/usr/local/

--sysconfdir=DIR

指定配置文件的安裝路徑


2.系統類型:

3.可選特性:

--disable-FEATURE

在編譯過程中禁用某種特性或功能

--enable-FEATURE[=ARG]

在編譯過程中啟用某個特性或功能


4.可選程序包:

--with-PACKAGE[=ARG]

在編譯過程中,選擇使用額外的程序包

--without-PACKAGE

在編譯過程中,不使用額外的程序包


第二步:

make


第三步:

make install


編譯收尾工作:

/usr/local/apache2裏面會包含bin, sbin, etc, lib, lib64, include, man, ...


1.導出二進制文件:

創建一個文件: /etc/profile.d/httpd.sh

export PATH=/usr/local/apache2/bin:/usr/local/apache2/sbin:$PATH


2.導出庫文件:

創建一個文件:/etc/ld.so.conf.d/httpd.conf

/usr/local/apache2/lib64


ldconfig [-v]


3.導出頭文件:

在/usr/include目錄中,為編譯安裝的軟件創建頭文件的符號鏈接:

ln -sv /usr/local/apache2/include /usr/include/httpd


4.導出幫助文件:

CentOS6: /etc/man.config

新添加一行:MANPATH=/usr/local/apache2/man


CentOS7: /etc/man_db.conf

新添加一行:MANPATH_MAP=/usr/local/apache2/bin /usr/local/apache2/man

舉例安裝httpd-2.4.18

1.首先要解決開發工具環境;

yum groupinstall "Development tools"


2.使用適合httpd-2.4.18版本的apr及apr-util工具;

安裝apr工具

~]# tar xf apr-1.5.2.tar.bz2 -C /usr/src

~]# cd /usr/src/apr-1.5.2

~]# ./configure --prefix=/usr/local/apr-1.5.2

~]# make

~]# make install


安裝arp-util工具

~]# tar xf apr-util-1.5.4.tar.bz2 -C /usr/src

~]# cd /usr/src/apr-util-1.5.4

~]# ./configure --prefix=/usr/local/apr-util-1.5.4 --with-apr=/usr/local/apr-1.5.2

~]# make

~]# make install


3.需要安裝pcre-devel以滿足httpd的正則表達式使用需求;

yum -y install pcre-devel


編譯安裝httpd:

~]# tar xf httpd-2.4.18.tar.gz -C /usr/src

~]# cd /usr/src/httpd-2.4.18

~]# ./configure --with-apr=/usr/local/apr-1.5.2 --with-apr-util=/usr/local/apr-util-1.5.4

~]# make

~]# make install


收尾:

1.導出二進制文件:

vim /etc/profile.d/httpd.sh

export PATH=/usr/local/apache2/bin:$PATH


source /etc/profile.d/httpd.sh


2.導出庫文件:

vim /etc/ld.so.conf.d/httpd-x86_64.conf

/usr/local/apache2/modules


ldconfig -v


3.導出頭文件:

ln -sv /usr/local/apache2/include /usr/include/httpd


sed命令:

vim的末行命令(ex模式命令):


sed:Stream EDitor,流編輯器,以行為單位對一個或多個文件進行編輯處理;每一次sed都會處理給定文件中的一行內容。


在sed處理文本時,將正在處理的當前行存儲到臨時的緩沖區中,稱為“模式空間”;用當前行去匹配給定的PATTERN,如果能匹配,則使用command編輯處理;如果不匹配,則默認輸出至標準輸出;然後繼續處理下一行,直到文件的末尾。


默認情況下,sed的所有處理行為不會影響源文件的內容;


我們一般會使用sed命令來自動編輯一個或多個文件,簡化對文件的循環操作;


sed命令:

sed - stream editor for filtering and transforming text

sed [OPTION]... ‘script‘ [input-file]...

常用選項:

-n, --quiet, --silent:對於不能匹配模式的行,默認不輸出到屏幕;

-e script, --expression=script:多條件編輯;

-f script-file, --file=script-file:從指定的script-file中讀取腳本

註意:script-file為一個能夠定位到腳本文件的路徑,最好為絕對路徑

-i[SUFFIX], --in-place[=SUFFIX]:原文件直接編輯操作;

-r, --regexp-extended:使sed支持擴展正則表達式;


script:

‘AddressesCommand‘


Addresses(地址定界):

1.空地址:對所有文件的所有行進行處理;

2.單地址:sed對於能夠匹配該地址的那唯一一行進行處理;

num:表示行號;

/pattern/:能夠匹配該模式的所有行;

$:表示文檔最後一行

3.地址範圍:

addr1,addr2:從addr1開始到addr2結束的中間所有行;

例如:2,8

first~step:從first標記的行號開始,以step所代表的數字為步長;

例如:1~2, 2~2

addr1,+N:從addr1開始,包括addr1所在行,並繼續向後計算N行;

例如:2,+7相當於2,2+7

addr1,~N:從addr1開始,包括addr1所在行,向後計算addr1*N行;

例如:2,~5相當於2,2*5

/pattern1/,/pattern2/:從被pattern1匹配的第一行開始計算,一直到被/pattern2/匹配到的第一行結束;


Command(處理命令):

=:顯示被模式匹配的行的行號

例如:sed -n ‘/^$/=‘ /etc/grub2.cfg

a \text:在被模式匹配的行的後面追加text的內容,支持使用\n換行,從而實現多行追加;

i \text:在被模式匹配的行的前面插入text的內容,支持使用\n換行,從而實現多行插入;

c \text:將被模式匹配的行的修改為text的內容,支持使用\n換行,從而實現一行變多行;

d:在模式空間中刪除被模式匹配的行;這樣的行不能再進行標準輸出;

註意:在使用d命令的時候,不宜使用-n選項;

p:顯示模式空間中被模式匹配的行;

註意:在使用p命令的時候,通常會搭配-n選項;

w filepath:將模式空間中被模式匹配的行,另存到filepath文件中;

r filepath:將filepath文件的內容追加至模式空間中被模式匹配的行之後;

!Command:在模式空間中被模式匹配的行,不執行Command命令;相反,未被模式匹配的行,參會執行Command命令

s///:查找替換,分隔符可以任意更換,只要相同即可;

s@@@, s###, s,,,

s/pattern/text/[control]

s@/etc/fstab@/etc/mtab@


pattern:計劃查找並替換的內容

text:要替換的結果

control:如何進行替換

g:行內全部替換

p:顯示替換成功的行

w filepath:將替換成功的行另存到filepath文件中;


支持後向引用:

s/\(string\)/&/

s/\(string\)/\1/


高級編輯命令:

h: 把模式空間中的內容覆蓋至保持空間中

H:把模式空間中的內容追加至保持空間中

g: 從保持空間取出數據覆蓋至模式空間

G:從保持空間取出內容追加至模式空間

x: 把模式空間中的內容與保持空間中的內容進行互換

n: 讀取匹配到的行的下一行覆蓋至模式空間

N:追加匹配到的行的下一行至模式空間

d: 刪除模式空間中的行

D:刪除多行模式空間中的所有行


示例:

sed -n ‘n;p‘ FILE

sed ‘1!G;h;$!d‘ FILE

sed ‘$!N;$!D‘ FILE

sed ‘$!d‘ FILE

sed ‘G’ FILE

sed ‘g’ FILE

sed ‘/^$/d;G’ FILE

sed ‘n;d‘ FILE

sed -n ‘1!G;h;$p‘ FILE



grep:文本搜索

sed:文本編輯工具

awk:文件格式化工具


#13 yum、編譯安裝與sed命令的使用