sed高級編輯命令
模式空間相當于正在處理數據的這塊空間
保持空間相當于倉庫,臨時存放暫時沒有處理完的半成品的空間
P(大寫):打印模式空間開端至\n內容,并追加到默認輸出之前(即只打印第一行)
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:讀取匹配到的行的下一行追加至模式空間
d: 刪除模式空間中的行
D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,
并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間
不包含換行符,則會像發出d命令那樣啟動正常的新循環(即如果有換行符,則刪除第一行,且不讀取新的輸入行)
示例
ed -n ‘n;p’ FILE 打印偶數行 等價于seq 10 | sed -n ‘2~2p’
sed ‘1!G;h;$!d’ FILE 倒敘顯示 等價于seq 10 | tac
1!G 意思是不是第一行才執行G,是第一行就不執行G,繼續往下執行h,將第一行覆蓋至保持空間,
再執行$!d,意思是不是最后一行的刪除,則模式空間中的第一行刪除,當讀第二行時,執行1!G,將
保持空間中的1追加到模式空間2的后面,再將2和1覆蓋至保持空間,不是最后一行刪除模式空間中的2和1
以此類推,到最后一行就不刪除,所以是倒敘顯示
sed ‘N;D‘ FILE 只留最后一行 例如:seq 10 | sed ‘N;D’,顯示第十行
讀入第一行,遇N,將第二行追加到第一行后面,執行D,刪除第一行,則模式空間只剩第二行
執行N,將第三行追加到第二行后面,執行D,刪除第二行,依次類推
sed ‘$!N;$!D’ FILE 只留倒數兩行 例如seq 10 | sed ‘$!N;$!D’,顯示第九行和第十行
先讀第一行,執行N,模式空間有第一行和第二行,然后執行D,刪除第一行,執行N,模式空間剩
第二行和第三行,執行D,刪除第二行,以此類推到最后一行不刪除,則剩余倒數兩行
sed ‘$!d’ FILE 只留最后一行 例如:seq 10 | sed ‘$!d’,顯示第十行內容
sed ‘G’ FILE 每一行后面都有空行
第一行讀入模式空間,執行G,保持空間為空,所以就是第一行后面跟著空行,讀入
第二行,執行G,將空行追加至模式空間第二行的后面,以此類推,最后顯示每行后面都有空行
sed ‘g’ FILE 顯示為空 保持空間覆蓋模式空間后再踢出去,就是空了
sed ‘g;p’ FILE 顯示的是文件里面有多少行就顯示多少空行
sed ‘/^$/d;G’ FILE 文件的每一行后面都有一個空行
意思是如果有空行就刪除,執行G,在后面追加空行,沒有空行也執行G,追加空行
sed ‘n;d’ FILE 顯示奇數行
理解方式:文本中的行覆蓋模式空間里面的內容的意思是原內容從模式空間踢出去,如果沒有-n選項它會在屏幕上顯示
從保持空間中的覆蓋到模式空間中就相當于殺掉了,徹底消失。
seq 10 | sed “n;g” 顯示奇數行,且每行后面均有空行。
文本中的行覆蓋模式空間,相當于把原模式空間的內容踢出去,而保持空間覆蓋模式空間就真覆蓋了。
sed -n ‘1!G;h;$p’ FILE 倒序排列 例如:seq 10 | sed -n ‘1!G;h;$p’ 顯示倒敘
練習題
1、刪除centos7系統/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#
和空白字符
3、在centos6系統/root/install.log每一行行首增加#號
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
6、利用sed 取出ifconfig命令中本機的IPv4地址
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個
字段的重復次數
ls /run/media/root/CentOS\ 7\ x86_64/Packages/ | sed -r ‘s/(.+[.])([^.].+)([.]rpm)$/\2/g’| sort | uniq -c
ls /run/media/root/CentOS\ 7\ x86_64/Packages/ | rev | cut -d. -f2 | rev | sort | uniq -c
ls *.rpm | sed -r ‘s/.*\.([^.]+)\.rpm$/\1/’ |sort |uniq -c
ls *.rpm | sed -r ‘s/.*\.(.*)\.rpm$/\1/’ |sort |uniq -c .*具備貪婪模式
8、統計/etc/init.d/functions文件中每個單詞的出現次數,并排序(用grep和
sed兩種方法分別實現)
9、將文本文件的n和n+1行合并為一行,n為奇數行
seq 10 | sed ‘N;s/\n/ /’
seq 10 | xargs -n2
軟件包管理
靜態和動態鏈接
鏈接主要作用是把各個模塊之間相互引用的部分處理好,使得各個模塊之間能
夠正確地銜接,分為靜態鏈接和動態鏈接
靜態鏈接(libxxx.a)
把程序對應的依賴庫復制一份到包
嵌入程序包
升級難,需重新編譯
占用較多空間,遷移容易
動態鏈接(libxxx.so)
只把依賴加做一個動態鏈接
連接指向
占用較少空間,升級方便
ldd /bin/ls 查詢ls所引用的庫
linux-vdso.so.1 => (0x00007ffc84dee000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f33adb9c000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f33ad997000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007f33ad78d000)
libc.so.6 => /lib64/libc.so.6 (0x00007f33ad3ca000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f33ad168000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f33acf63000)
/lib64/ld-linux-x86-64.so.2 (0x00005602e4181000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f33acd5e000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f33acb42000)
如果將/lib64/libc.so.6移走或者刪除,如何利用救援模式找回?以centos7為例
將/lib64/libc.so.6移走或者刪除后,無法ls、mv、cp、包括圖形界面都點不了。說明這個庫被很多命令所引用
1、重啟,按esc(生產環境可能是別的按鍵)
2、CD-ROM Drive 光盤啟動
3、Troublesbooting 排錯
4、rescue a centos system 救援模式(使用救援模式可以加載一個小的Linux系統到內存中,由于是用光盤啟動與硬盤故障無關系)
5、1 continue (將原來硬盤的根掛載到/mnt/sysimage下)
6、回車 (使用df命令可以看到原來的sd2分區掛載到/mnt/sysimage下,說明/mnt/sysimage就是原來硬盤的根)
7、cd /mnt/sysimage/lib64
8、ln -s libc-2.17.so lib.so.6 注意:不能使用絕對路徑,必須使用相對路徑,因為現在的根和硬盤的根不一樣
包管理器
二進制應用程序的組成部分:
二進制文件、庫文件、配置文件(復雜程序有配置文件,簡單的只要有選項就可以)、幫助文件
程序包管理器:
debian:deb文件, dpkg包管理器
redhat: rpm文件, rpm包管理器
rpm: Redhat Package Manager(以前叫法) RPM Package Manager(現在叫法)
包命名
源代碼:name-VERSION.tar.gz|bz2|xz
VERSION(版本號): major(主).minor(次).release(補?。?br />rpm包命名方式:
name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
bash:程序名
VERSION(版本號): major.minor.release
release(哪個公司的):release.OS
常見的arch(cpu架構):
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
powerpc: ppc
跟平臺無關:noarch
包命名和工具
包:分類和拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 開發子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
包之間:可能存在依賴關系,甚至循環依賴
解決依賴包管理工具:
yum:rpm包管理器的前端工具,解決包的依賴性,yum底層還是調用rpm,所以說并不是有了yum就可以拋棄rpm
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具
庫文件
查看二進制程序所依賴的庫文件
ldd /PATH/TO/BINARY_FILE
管理及查看本機裝載的庫文件
ldconfig 加載庫文件 ldconfig -p 查看系統中所有加載的庫
/sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關系
配置文件:/etc/ld.so.conf(主配置文件), /etc/ld.so.conf.d/*.conf(也可以放在ld.so.conf.d目錄下,但是命名必須是以.conf結尾的文件)
包管理器
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而
方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
包文件組成 (每個包獨有)
RPM包內的文件
RPM包內文件的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本
數據庫(公共):/var/lib/rpm (如果一個包已經裝到系統中,在該目錄下會存放該包的一些元數據信息,即該目錄下存放的是已經安裝好的rpm包的元數據信息)
所以/var/lib/rpm很重要,如果把它刪了或者移走,系統將無法安裝任何rpm包也無法卸載包,因為系統找不到元數據,它不知道都安裝過哪些包,哪些包沒有安過,可以定期做個備份。
/var/lib/rpm下內容包括:
1、程序包名稱及版本
2、依賴關系
3、功能說明
4、包安裝后生成的各文件路徑及校驗碼信息
程序包的來源
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
獲取程序包的途徑:
(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/
(4) 自己制作(將源碼做成rpm包,方法可以上網搜)
注意:第三方包建議要檢查其合法性來源合法性,程序包的完整性
rpm包管理
CentOS系統上使用rpm命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝:rpm {-i|–install} [install-options] PACKAGE_FILE…
-v: 顯示安裝過程
-vv:
-h: 以#顯示程序包管理執行進度
rpm -ivh PACKAGE_FILE …
[install-options]
–test: 測試安裝,但不真正執行安裝,即dry run模式
–nodeps:忽略依賴關系
–replacepkgs 重新安裝rpm包
–replacefiles 重新覆蓋文件 (有可能有兩個包,這兩個包里包含相同的文件,路徑都完全一樣,如果A包已經裝好,就因為一個文件我無法安裝B包,可以使用該選項,覆蓋A包的那個文件)
–nosignature: 不檢查來源合法性 檢查包的來源合法性依賴于工具,工具就在光盤里,以7為例,即RPM-GPG-KEY-CentOS-7,將該工具導入才可以檢查,導入方式:rpm –import RPM-GPG-KEY-CentOS-7
–nodigest:不檢查包完整性
–noscripts:不執行程序包腳本
%pre: 安裝前腳本; –nopre
%post: 安裝后腳本; –nopost
%preun: 卸載前腳本; –nopreun
%postun: 卸載后腳本; –nopostun
rpm包升級(升級后舊版本就沒有了)
升級:并不是一定能升級成功的,因為你去升級的時候新版本依賴的包版本號可能比較高
rpm {-U|–upgrade} [install-options] PACKAGE_FILE …
rpm {-F|–freshen} [install-options] PACKAGE_FILE …
upgrade:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則“安裝”
freshen:安裝有舊版程序包,則“升級”
如果不存在舊版程序包,則不執行升級操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
–oldpackage:降級
–force: 強制安裝(只能與安裝、升級配合使用,不能與-e配合使用) 例如:rpm -ivh tree-1.6.0-10.el7.x86_64.rpm –force 強制安裝tree包
升級注意項
注意:
(1)不要對內核做升級操作;Linux支持多內核版本并存,因此,可以直接安裝新版本內核,但是一般情況下軟件做不到不同版本并存
(2)如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配
置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名
(FILENAME.rpmnew)后保留
(3)如果原程序包的配置文件安裝后被修改,卸載時,舊版本的配置文件會保留下來,但命名為(.rpmsave)
包查詢 -q查詢的意思
rpm {-q|–query} [select-options] [query-options]
[select-options]
rpm -q 包名(即程序名,不是rpm文件名,不需要寫路徑,包名) 查詢某個包是否已經安裝好
可以用在寫腳本的條件判斷,比方說生產中想部署一個軟件,而這個軟件依賴特定的包,需要判斷這個依賴的包是否裝上。
例如:想判斷vsftpd這個軟件是否裝上,如果沒裝上就給它裝上。
rpm -q vsftpd &>/dev/null || rpm -ivh /misc/cd/Package/vsftpd-2.2.2-24.el6.x86_64.rpm &>/dev/null
-a: 所有包 可以實現模糊搜索 rpm -qa | grep vs 查找vsftpd軟件是否安裝過
-f: 查看指定的文件由哪個程序包安裝生成 例: rpm -qf /etc/passwd 查詢passwd文件是由哪個包生成的
如果我將/usr/bin/tree刪了,我想重新安裝這個包,但是前提我得知道這個包是什么,還可以通過rpm -qf /usr/bin/tree來查詢。
之所以還能查是因為裝這個tree包的時候,它的元數據都記錄在/var/lib/rpm數據庫里。
如果mv /var/lib/rpm/* /data/ 則所有的rpm命令都不好使了,但是會在/var/bin/rpm下生成新的數據庫,但是沒有任何內容,所以不能動該數據庫。移回去使用\mv /data/* /var/lib/rpm/
數據庫刪了是沒有辦法還原的。
-p rpmfile(文件名):針對尚未安裝的程序包文件做查詢操作
例如:rpm -qpl zsh-4.3.11-4.el6.centos.2.x86_64.rpm
–whatprovides CAPABILITY :查詢指定的 CAPABILITY 由哪個包所提供
例如:rpm -q –whatprovides bash 查詢bsh是由哪個包提供的
顯示 bash-4.1.2-48.el6.x86_64
–whatrequires CAPABILITY :查詢指定的 CAPABILITY 被哪些包所依賴
例如:rpm -q –whatrequires bash
顯示mysql-5.1.73-8.el6_8.x86_64
initscripts-9.03.58-1.el6.centos.x86_64
dracut-004-409.el6_8.2.noarch
rsyslog-5.8.10-10.el6_6.x86_64
cronie-1.4.4-16.el6_8.2.x86_64
autofs-5.0.5-132.el6.x86_64
lvm2-2.02.143-12.el6.x86_64
意思是顯示的這些包是依賴于bash的,而bash是由bash-4.1.2-48.el6.x86_64提供的,所以說顯示的那些包是依賴于bash-4.1.2-48.el6.x86_64包的
rpm2cpio 包文件|cpio –tv 預覽包內文件
rpm2cpio 包文件|cpio –idv “*.conf” 釋放包內文件
例如:如果將/usr/bin/tree刪除,不用重新強制安裝tree包的情況下如何恢復?
rpm2cpio /media/CentOS_6.9_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -tv 預覽tree包內包含的文件列表及屬性信息
-rwxr-xr-x 1 root root 41136 Jan 14 2015 ./usr/bin/tree
drwxr-xr-x 2 root root 0 Jan 14 2015 ./usr/share/doc/tree-1.5.3
-rw-r–r– 1 root root 18009 Aug 13 2004 ./usr/share/doc/tree-1.5.3/LICENSE
-rw-r–r– 1 root root 4167 Oct 20 2009 ./usr/share/doc/tree-1.5.3/README
-rw-r–r– 1 root root 3375 Jan 14 2015 ./usr/share/man/man1/tree.1.gz
132 blocks
rpm2cpio /media/CentOS_6.9_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idv 全部解壓到當前文件夾
rpm2cpio /media/CentOS_6.9_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idv ./usr/bin/tree 只解壓/usr/bin/tree到當前文件夾
然后將./usr/bin/tree移到/usr/bin/tree下即可恢復
注意:利用rpm2cpio恢復數據,有可能數據的屬性發生變化,例如所有者、所有者、權限等
[query-options]
–changelog:查詢rpm包更新過哪些版本,是一個日志
-c: 查詢程序的配置文件
-d: 查詢程序的文檔
-i: information 顯示這個包的說明信息 例如:rpm -qi tree
-l: 查看指定的程序包安裝后生成的所有文件 例如:rpm -ql tree
–scripts:程序包自帶的腳本 例如:rpm -q –scripts bash
–provides: 列出指定程序包所提供的CAPABILITY
例如:rpm -q –provides tree 查詢tree包提供哪些能力
顯示 tree = 1.5.3-3.el6
tree(x86-64) = 1.5.3-3.el6
-R: 查詢指定的程序包所依賴的CAPABILITY
例如:rpm -qR tree 查詢tree包依賴于哪些能力
顯示libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
常用查詢用法:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, …
-qa
包卸載:-e
rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers][–test] PACKAGE_NAME …(跟的是包名,不是文件名)
–allmatches 卸載所有版本
包校驗 -V 校驗是與/var/lib/rpm數據庫中的元數據做比對
rpm {-V|–verify} [select-options] [verify-options]
rpm -Va 查詢所有包內是否有發生變化的數據
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
包來源合法性驗正及完整性驗正
完整性驗正:SHA256
來源合法性驗正:RSA
公鑰加密
對稱加密:加密、解密使用同一密鑰
非對稱加密:密鑰是成對兒的
public key: 公鑰,公開所有人
secret key: 私鑰, 不能公開
導入所需要公鑰
rpm -K|checksig rpmfile 檢查包的完整性和簽名,后面跟的是文件名
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7(rpm -K 嚴重依賴這個公鑰,必須先安裝這個公鑰,否則查詢都是not ok)
或者rpm –import /run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7
安裝完公鑰,會生成一個包,使用rpm -qa “gpg-pubkey*”來查詢
顯示gpg-pubkey-f4a80eb5-53a7ff4b
rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b顯示的內容與
cat /run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7 一樣
導入公鑰以后我如果不想要這個公鑰,也可以卸載,使用rpm -e gpg-pubkey-f4a80eb5-53a7ff4b進行卸載
例如:echo >> sl-5.02-1.el7.x86_64.rpm (可以往rpm包內追加空行,但追到哪去就不清楚了)
rpm -K sl-5.02-1.el7.x86_64.rpm
sl-5.02-1.el7.x86_64.rpm: RSA sha1 (MD5) PGP MD5 NOT OK
如果將/bin/rpm刪了,如何恢復?
rpm2cpio /run/media/root/CentOS\ 7\ x86_64/Packages/rpm-4.11.3-25.el7.x86_64.rpm | cpio -idv ./bin/rpm
cp ./rpm /bin 就可以了
如果將rpm包卸載了,例如:rpm -e rpm –nodeps ,如何恢復?此時yum也不好用了,因為yum依賴于rpm
重啟進入救援模式,df下,看看原來硬盤的根現在掛在哪個文件夾下
由于目前光盤還未掛載,所以先將光盤掛載
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
df 確認下
rpm -ivh /mnt/cdrom/Packages/rpm-4.8.0-55.el6.x86_64 –root=/mnt/sysimage/ (這塊是特殊寫法,必須這么寫,意思是安裝到原來硬盤的根下)
chroot /mnt/sysimage 在救援模式下切到原來硬盤真正的根
rpm數據庫
數據庫重建:重建沒有什么意義,因為原數據內容已經沒有了
/var/lib/rpm
rpm {–initdb|–rebuilddb}
initdb: 初始化
如果事先不存在數據庫,則新建之
否則,不執行任何操作
rebuilddb:重建已安裝的包頭的數據庫索引目錄
yum
CentOS: yum, dnf
YUM: Yellowdog Update Modifier,rpm的前端程序,可解決軟件包相關依賴性,
可在多個庫之間定位軟件包,up2date的替代工具
yum是基于c/s結構,c:client s:server
服務器中存放的是rpm包以及這些rpm包的元數據,客戶端想通過yum去安裝rpm包的時候,事先需要在客戶端配置一個文件,
這個配置文件里面寫清楚服務器的路徑是什么,客戶端如果要安裝tree包,只需要輸入yum install tree,客戶端將該指令發送給
服務器,服務器在元數據中搜索關于tree包的相關信息,包括依賴的包等等,然后將這些元數據信息返回給客戶端,
客戶端將這些元數據的信息存放在yum緩存中,然后再由客戶端發指令從服務器上將這些包下載下來并安裝,默認裝完以后將rpm包刪除,
但是yum緩存中的元數據信息不刪??梢杂卸鄠€服務器,當有兩個服務器的時候,由客戶端發出安裝指令后會自動到兩個服務器中搜索關于
你要安裝的包的元數據,找到一個它就安裝,如果兩個服務器都有,那看誰的版本新,默認安裝新版本。
重點:利用yum將來出故障,一般有兩個地方,第一配置文件格式寫錯,第二就是緩存問題(例如服務器地址改變了,就必須清一下緩存,否則還去原來的地址找不著)
yum repository: yum repo,存儲了眾多rpm包,以及包的相關的元數據
文件(放置于特定目錄repodata下)
文件服務器:
http://
https://
ftp://
file://
yum配置文件
yum客戶端配置文件:
/etc/yum.conf:為所有倉庫提供公共配置(一般不改此配置文件)
cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0 默認將包安裝好后刪除rpm包,如果改成1就是安裝好后也不刪除rpm包
debuglevel=2 調式
logfile=/var/log/yum.log yum日志
exactarch=1
obsoletes=1
gpgcheck=1 默認是檢查包的完整性及簽名的,同等rpm -K,如果不完整直接拒絕安裝,如果改成0,它就不檢查
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
yum命令是禁止同時在一個機子上并行運行多個yum命令
/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的客戶端就寫一個配置文件就可以了,而yum服務器的配置需要rpm包和這些包所對應的各種元數據。
如何利用系統光盤作為yum服務器,搭建yum
1、先將光盤掛在到一個文件夾下
mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom
2、在客戶端上準備yum倉庫的配置文件,在/etc/yum.repos.d/下
vim base.repo
[base] 表示倉庫的名字,不要帶空格
name=centos cdrom
baseurl=file:///mnt/cdrom 支持http;// https:// ftp:// file://(本地)倉庫路徑,路徑只填到repodata(yum的元數據)的父目錄
gpgcheck=0 不檢查包的完整性及簽名
到此yum的配置到此結束!
yum repolist 顯示可用的倉庫列表,如果倉庫被禁用則不顯示
也可以創建多個倉庫,在上面倉庫的基礎上:
vim base.repo
[base]
name=centos cdrom
baseurl=file:///mnt/cdrom
gpgcheck=0
[epel]
name=epel
baseurl=http://172.20.0.1/epel/7/x86_64/
gpgcheck=0
yum repolist
顯示
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
base centos cdrom 9,591
epel epel 5,919
repolist: 15,510
顯示不全,到阿里云找一個epel
vim base.repo
[base]
name=centos cdrom
baseurl=file:///mnt/cdrom
gpgcheck=0
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
yum repolist
顯示
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
base centos cdrom 9,591
epel epel 5,919
repolist: 15,510
沒有變化的原因是未清緩存?。?!
緩存路徑在/var/cache/yum
yum clean all 清除yum緩存
再執行yum repolist
顯示
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id repo name status
base centos cdrom 9,591
epel epel 12,492
repolist: 22,083
生產中gpgcheck=0并不好,萬一安裝的軟件有病毒木馬就麻煩了,所以我既希望可以檢查也希望不用impeort導,可以在倉庫配置文件中改一行gpgkey
vim base.repo
[base]
name=centos cdrom
baseurl=file:///mnt/cdrom
http://172.20.0.1/epel/7/x86_64/ (一個倉庫可以有多個地址,容錯包括隨機和按順序,默認隨機)
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7 自動將光盤路徑中的key導入,所以安裝軟件的時候就可以檢查包的完整性及簽名了,第一次使用的時候導入,以后就不導入了
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
enabled=0 (臨時禁用某個倉庫)
如果一個倉庫內地址有很多的時候,可將所有地址寫在一個文件內,假如我在root下將地址寫在baselist文件內,
vim baselist
file:///mnt/cdrom
http://172.20.0.1/epel/7/x86_64/
然后
vim base.repo
[base]
name=centos cdrom
mirrorlist=file:///root/baselist
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
enabled=0
yum repolist 顯示可用的倉庫列表,如果倉庫被禁用則不顯示
yum repolist all 顯示所有倉庫,包括被禁用的倉庫
yum repolist disabled 顯示被禁用的倉庫
yum list 顯示倉庫內的所有包
yum list | less 凡是帶@符號表示該包已經安上了。
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
centos7上神奇的文件夾給弄出來,方法:
yum install autofs 安裝autofs包
systemctl start autofs 啟動autofs服務
systemctl enable autofs 下次開機自動啟動autofs服務
ls /misc/cd 就掛上了
yum源
阿里云repo文件:
http://mirrors.aliyun.com/repo/
CentOS系統的yum源
阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
教學環境: http://172.20.0.1/cobbler/ks_mirror/$releasever/
EPEL的yum源:
阿里云: https://mirrors.aliyun.com/epel/$releasever/x86_64
教學環境: http://172.20.0.1/fedora-epel/$releasever/x86_64/
如果我想直接用阿里的repo文件,順序如下:(前提你可以鏈接互聯網)
cd /etc/yum.repo.d/
wget http://mirrors.aliyun.com/repo/Centos-7.repo 就可以了
yum-config-manager
生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager –add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager –disable “倉庫名” 禁用倉庫
yum-config-manager –enable “倉庫名” 啟用倉庫
yum命令
yum命令的用法:
yum [options] [command] [package …]
顯示倉庫列表:
yum repolist 顯示可用的倉庫列表,如果倉庫被禁用則不顯示
yum repolist all 顯示所有倉庫,包括被禁用的倉庫
yum repolist disabled 顯示被禁用的倉庫
yum repolist enabled 顯示可用的倉庫
顯示程序包:
yum list 顯示倉庫內的包列表
yum list [all | glob_exp1] [glob_exp2] […]
yum list *ftp* 查詢包含ftp的包列表
yum list {available|installed|updates} [glob_exp1] […]
安裝程序包:
yum install package1 [package2] […]
yum reinstall package1 [package2] […] (重新安裝)
升級程序包:(生產中不建議升級)
yum update [package1] [package2] […]
yum downgrade package1 [package2] […] (降級)
檢查可用升級:
yum check-update
卸載程序包:
yum remove | erase package1 [package2] […]
查看程序包information:
yum info […]
查看指定的特性(可以是某文件)是由哪個程序包所提供:
yum provides | whatprovides feature1 [feature2] […]
清理本地緩存:
清除/var/cache/yum/$basearch/$releasever緩存 緩存的是元數據
如果將配置文件路徑或者倉庫格式調整后必須清緩存。
yum clean [ packages | metadata | expire-cache | rpmdb | plugins |all ]
構建緩存:yum makecache (不需要手工做,因為安裝的時候會自動構建)
思考:安裝某個具有依賴性的包時會順帶將依賴包安裝上,那么卸載該包的時候會將依賴的包也卸載掉嗎?
答:不會卸載,以為卸載的時候并沒有依賴關系,且別的包可能還依賴那些包,所以不合理。
搜索:yum search string1 [string2] […] 只要包含,不分大小寫都可以列出
以指定的關鍵字搜索程序包名及summary(摘要)信息
查看指定包所依賴的capabilities:
yum deplist package1 [package2] […]
查看yum事務歷史:
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
yum history list 12 查看歷史中第12條yum命令
yum history info 12 具體查看歷史中第12條命令的信息
yum history undo 12 撤銷歷史中第12條命令的操作。(主要用于安裝包時有依賴的包也安裝了,我希望卸載包時也將依賴的包同時卸載)
yum history redo 12 重新執行歷史中第12條命令
日志 :/var/log/yum.log 安裝卸載都記錄在日志當中
安裝及升級本地程序包:
yum install rpmfile1 [rpmfile2] […] 優勢是如果有依賴性的話直接將依賴的包也裝上
例如:yum install /misc/cd/Packages/tree-1.6.0-10.el7.x86_64.rpm 安裝tree包
yum update rpmfile1 [rpmfile2] […]
包組管理的相關命令:
如果一些復雜的軟件,可能單個rpm包無法滿足,需要裝一堆rpm包,而一堆rpm包一個一個裝來實現某個常用的
功能似乎太麻煩,所以有了包組的概念,把一些提供相同類似功能的rpm包組成一個集合叫包組,只要安裝包組
就會自動的把包組中的所有關聯的包進行安裝。
yum groupinstall group1 [group2] […] 安裝包組
yum groupupdate group1 [group2] […] 更新包組
yum grouplist [hidden] [groupwildcard] […] 查詢包組列表
yum groupremove group1 [group2] […] 卸載包組
yum groupinfo group1 […] 查看包組信息
不帶任何符號的表示包已經裝上,而且它不是隨著包組裝好的,裝系統的時候裝好的
= 表示包已經裝好,而且是隨著包組裝好的
+ 表示包未安裝,未來隨著包組升級會一塊安裝
– 表示包未安裝,隨著包組安裝也不會安裝
yum的命令行選項:
–nogpgcheck:禁止進行gpg check
-y: 自動回答為“yes”
yum install httpd -y 安裝時不會問y/n,自動回答y 常用腳本中
-q:靜默模式 不做任何顯示,-y和-q不能合在一起寫。
–disablerepo=repoidglob:臨時禁用此處指定的repo ?
–enablerepo=repoidglob:臨時啟用此處指定的repo ?
–noplugins:禁用所有插件
系統光盤yum倉庫
系統安裝光盤作為本地yum倉庫:
(1) 掛載光盤至某目錄,例如/mnt/cdrom
mount /dev/sr0 /mnt/cdrom
(2) 創建配置文件
[CentOS7]
name=
baseurl=
gpgcheck=
enabled=
創建yum倉庫:createrepo [options] <directory>
如果在生產中用到的倉庫那些rpm包以及元數據沒有現成的,比方說開發人員做了個軟件,把它做成rpm包,如何創建yum倉庫?
cp /misc/cd/Packages/httpd-2.4.6-67.el7.centos.x86_64.rpm /data
假設httpd-2.4.6-67.el7.centos.x86_64.rpm為開發人員做的rpm包
createrepo /data 將data目錄設為yum倉庫,會自動生成repodata元數據
vim /etc/yum.repos.d/base.repo
[base]
name=base
baseurl=file:///data
gpgcheck=0
這就可以了!
需求:在生產中要用yum安裝,顯而易見不是單臺機器yum安裝,可能很多臺機器都要yum安裝,這時候我們很有必要
創建一個專門的yum服務器來支持網絡中的成百上千的客戶端來利用yum安裝,所以我們現在要搭建一個yum服務器,讓
其他的客戶端來通過網絡來安裝,如何實現呢?
假設我們利用centos7.4作為倉庫服務器,但是它里面放的yum元數據是給centos6.9用的,使用http搭建
systemctl start httpd 啟動網絡服務
iptables -vnL 查詢防火墻是否關閉
systemctl stop firewalld 關閉防火墻
systemctl disable firewalld 下次開機不啟動防火墻
使用橋接的網址(172.20.102.225)就能上網了
cd /var/www/html
echo welcome to magedu > index.html
此時刷新頁面會出現welcome to magedu字樣
在/var/www/html目錄下
mkdir -p centos/{7,6}/os/x86_64/
先為6做準備,6只需要掛光盤即可,在7上增加一塊光驅,掛6的盤
echo ‘- – – ‘ > /sys/class/scsi_host/host2/scan
mount /dev/sr1 /centos/6/os/x86_64/ 使用mount命令查看是否掛載成功
進入網站http://172.20.102.225/centos/6/os/x86_64/就有內容了
此時將centos6上的配置文件地址改到http://172.20.102.225/centos/$releasever/os/$basearch/
在centos6上就可以使用yum安裝軟件了。
在7上搭建,在/var/www/html目錄下
mount /dev/sr0 centos/7/os/x86_64
進入網站http://172.20.102.225/centos/7/os/x86_64/就有內容了
此時將centos7上的配置文件地址改到http://172.20.102.225/centos/$releasever/os/$basearch/
在centos7上就可以使用yum安裝軟件了。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96853