第四周课程总结

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(补丁)
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.178linux.com/96853

联系我们

400-080-6560

在线咨询

工作时间:周一至周五,9:30-18:30,节假日同时也值班

QR code