马哥培训第四周 强大的行编辑器sed 包管理器rpm和yum(含如何将centos6.9的cd1和cd2合并)

课程慢慢开始难了,心情一言难尽~~

老师每次点开新pdf的的开场白:“下面我们来看看XXX,嗯,这章很重要,嗯,都重要是吧,呵呵,但这章非常重要。”

20100426补充完整上周没做完的笔记

文本处理工具sed

sed 功能强大的行编辑器

学习sed的功能之前,首先要了解sed命令的工作原理,sed命令是一种处理文本的行编辑器,也或者称为流编辑器,之所以被称为流编辑器,是因为sed命令在处理文本时,会在内存中开辟一个空间,然后从文本中顺序读取一行内容,放在内存的缓冲区中按要求进行处理,这个空间被称之为“模式空间”,在默认情况下,sed命令会在处理完每次‘script’(sed命令的自带“脚本”,由“定界”和“编辑命令(处理动作)”两部分组成)后将模式空间中的内容输出到终端上显示,再将按要求处理过的文本也输出到终端上显示(没有处理(不符合匹配要求的行)的行不显示处理结果),没完成一行之后,命令再从文本中读入下一行放在模式空间中进行处理,循环处理到文件的最后一行,文本数据就像水流一样流过模式空间,并输出处理的结果,但要注意的是,在这个过程中,源文件的内容是没有发生任何改变的,仅仅是按照命令使用者进行的规则对内容进行了过滤和处理。

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

语法:

sed 【选项】‘地址定界直接跟处理动作’  filename

sed [option]… ‘script’ inputfile…  这里的script指的是sed自有语法的脚本,包含对文本的地址定界和处理动作

常用选项:

-n:不输出模式空间内容到屏幕,即不自动打印,注意,准确的说,-n并不是不输出内容到屏幕,只是将输出内容改为输出“空”,达到不输出内容的效果,大多数情况下结果看起来一样,但在某些场景下,这一差别会影响最终的输出结果。

-e: 多点编辑,每个-e后面可以跟一种匹配规则对文本进行编辑

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r: 支持使用扩展正则表达式

-i:对文件进行编辑,将操作的结果写入文件中而不是显示在终端上,-i选项的运行机制是,sed命令将源文件复制一个副本进行操作,如果加了-i选项,则会在处理完毕后,将副本重命名为源文件的文件名,此时源文件被覆盖,从而达到了编辑文件内容的目的。

-i.bak: -i命令是会改变文件内容的,如果文件比较重要,那么这个操作时很危险的,上面-i的说明已经解释了-i的运行流程,那么-i.bak会给源文件的文件名加一个指定的后缀,这样在副本被重命名为原文件名的时候,就不会覆盖掉原始内容的文件(因为文件名已经不同),从而达到了备份源文件的效果。注意:-i.bak其实等效于-i*.bak ,“*”无论出现在任何位置,都代表源文件的文件名,那么可以看出,-i选项的备份功能其实是支持用任意前缀或后缀来重命名源文件的:

[root@Centos6 ~ 09:42:51]#cat f2

I

am

linux

too.

[root@Centos6 ~ 09:42:55]#sed -ibak*.old ‘a\  ***  ‘ f2  原文件名加前后缀备份,并在文件每一行后追加内容。

[root@Centos6 ~ 09:43:58]#cat bakf2.old

I

am

linux

too.

[root@Centos6 ~ 09:44:12]#cat f2

I

***

am

***

linux

***

too.

***

地址定界:

(1) 不给地址:默认匹配全文,对全文进行处理

(2) 单地址:

#: 指定的行,$:最后一行

/pattern/:被此处模式所能够匹配到的每一行

(3) 地址范围可以简单的输入代表行数的数字,用逗号隔开来对需要处理的行进行定界:

#,#       第几行到第几行

#,+#       第几行及之后的多少行

/pat1/,/pat2/ 也可以使用模式匹配从符合模式的一行到另外一行之间的所有行

#,/pat1/

(“#”号代表行数)

(4) ~:步进

1~2 奇数行

2~2 偶数行

编辑命令(处理动作):

d: 删除模式空间匹配的行,并立即启用下一轮循环

[root@Centos6 /data 03:42:26]#ifconfig  eth0 | sed  ‘/inet addr/!d’

inet addr:192.168.65.145  Bcast:192.168.65.255  Mask:255.255.255.0

p:打印当前模式空间内容,追加到默认输出之后

[root@Centos6 /data 03:40:23]#ifconfig  eth0 | sed -n ‘/inet addr/p’  显示的和上面是一样,但思路不同

inet addr:192.168.65.145  Bcast:192.168.65.255  Mask:255.255.255.0

a [\]text:在指定行后面追加文本 支持使用\n实现多行追加,“\”在这里也是一个定界标志,表示在\之后的内容都是要追加的内容,一般可以不写,命令也能识别,但有时也需要加上,比如插入的内容是以空格开头时,就必须加上,否则命令是不会识别空格的,类似的还有i,c同。

创建一个试验文件

[root@Centos6 ~ 03:53:32]#cat f1

1   this is a testfile

2   this is a testfile

3   this is a testfile

4   this is a testfile

5   this is a testfile

6   this is a testfile

7   this is a testfile

8   this is a testfile

9   this is a testfile

10  this is a testfile

11  this is a testfile

12  this is a testfile

[root@Centos6 ~ 03:53:51]#sed ‘3,5a\ **   I am coming   **’ f1  效果是在3到5的每一行后面都插入了新文本

1   this is a testfile

2   this is a testfile

3   this is a testfile

**   I am coming   **

4   this is a testfile

**   I am coming   **

5   this is a testfile

**   I am coming   **

6   this is a testfile

7   this is a testfile

8   this is a testfile

9   this is a testfile

10  this is a testfile

11  this is a testfile

12  this is a testfile

i [\]text:在行前面插入文本,支持使用\n实现多行追加

[root@Centos6 ~ 03:55:57]#sed ‘/4/,/6/i\ **   I am coming   **’ f1   效果是在4到6的每一行都插入的新文本

1   this is a testfile                                             要注意的是,这里使用的不是行数定界,

2   this is a testfile                                             而是模式匹配,默认使用正则表达式匹配

3   this is a testfile                                             合乎要求的字符串,如果要使用扩展的正则

**   I am coming   **                                         表达式,则需要在sed后加-r选项

4   this is a testfile

**   I am coming   **

5   this is a testfile

**   I am coming   **

6   this is a testfile

7   this is a testfile

8   this is a testfile

9   this is a testfile

10  this is a testfile

11  this is a testfile

12  this is a testfile

c [\]text:替换行为单行或多行文本,支持使用\n实现多行追加

[root@Centos6 ~ 03:56:46]#sed ‘3,10c\ **   I am coming   **’ f1  -c选项与上面的两个选项不同,它会将所有

1   this is a testfile                                           匹配到的行全部作为一个整体,替换成新行

2   this is a testfile                                           而不是逐行替换。

**   I am coming   **

11  this is a testfile

12  this is a testfile

w /path/somefile: 仅保存模式匹配的行至指定文件,注意“仅”字

[root@Centos6 ~ 04:28:22]#sed ‘3,10wf3’ f1

[root@Centos6 ~ 04:28:25]#cat f3

3   this is a testfile

4   this is a testfile

5   this is a testfile

6   this is a testfile

7   this is a testfile

8   this is a testfile

9   this is a testfile

10  this is a testfile

r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后

[root@Centos6 ~ 04:31:26]#sed ‘5rf2’ f1

1   this is a testfile

2   this is a testfile

3   this is a testfile

4   this is a testfile

5   this is a testfile

I

am

linux

too.

……省略……

=: 为模式空间中的行打印行号,显示匹配到的行的行号

!:模式空间中匹配行取反处理,应该这样理解,除了匹配的不处理,其他都按动作命令处理。

sed的查找替换功能

sed命令的强大之处不仅在于其能够对文本进行搜索,而且还能进行编辑,除了上面的插入和替换整行的功能,也支持使用正则表达式进行行内的替换,极大的提高了sed命令的应用范围,使用查找替换有一个固定的格式:

s/// 支持使用其它分隔符,s@@@,s###

在第一个/和第二个/之间支持填入正则表达式对文本进行匹配,也支持后向引用的小括号,扩号里匹配的内容在后面的第二个/和第三个/之间可以用\1、\2等符号表示,也可以使用&来表示前面表达式匹配到的内容。(注意表示的并非表达式本身,而是表达式匹配到的内容)

支持在最后一个分割符后面加上替换标记实现扩展的功能

g: 行内全局替换

p: 显示替换成功的行

w FILENAME:将替换成功的行保存至文件中

sed示例

sed ‘2p’ /etc/passwd               显示文件内容,并在第二行下将第二行再打印一遍

sed –n ‘2p’ /etc/passwd             显示文件第二行的内容

sed –n ‘1,4p’ /etc/passwd           显示文件1到4行的内容

sed –n ‘/root/p’ /etc/passwd         显示文件中含有关键字root的行

sed –n ‘2,/root/p’ /etc/passwd       从2行开始显示到有关键字root的行

sed -n ‘/^$/=’ file                 显示空行行号

sed –n –e ‘/^$/p’ –e ‘/^$/=’ file      显示文件中的空行且显示其行号

sed ‘/root/a\superman’ /etc/passwd   在每个含root关键字的行后插入文本

sed ‘/root/i\superman’ /etc/passwd     行前

sed ‘/root/c\superman’ /etc/passwd    代替行

sed ‘/^$/d’ file                       删除空行

sed ‘1,10d’ file                       删除1到10行

y///对字符进行一一的对位替换

[root@Centos6 ~ 09:44:19]#sed ‘y/linut/LINUT/’ f2

I

***

am

***

LINUx

***

Too.

***

补充一个命令:

nl命令可显示文件的内容并加上行号

-b  :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);

-b t :如果有空行,空的那一行不要列出行号(默认值);

-n  :列出行号表示的方法,主要有三种:

-n ln :行号在萤幕的最左方显示;

-n rn :行号在自己栏位的最右方显示,且不加 0 ;

-n rz :行号在自己栏位的最右方显示,且加 0 ;

-w  :行号栏位的占用的位数。

-p 在逻辑定界符处不重新开始计算。

nl /etc/passwd | sed ‘2,5d’        在nl命令的标准输出中删除第2到5行后显示

nl /etc/passwd | sed ‘2a tea’       在nl命令的标准输出中的第2行后加入tea作为一行,再显示

sed ‘s/test/mytest/g’ example      将文件中的test替换为mytest

sed –n ‘s/root/&superman/p’ /etc/passwd 在文本中单词root后加上superman显示

sed –n ‘s/root/superman&/p’ /etc/passwd 单词前

sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets       将文件中的dog替换成cat,hi替换成lo显示

sed –i.bak ‘s/dog/cat/g’ pets             将文件以pets.bak的名字进行备份,然后在原文件中将dog替换为cat

除了模式空间,sed工具还提供了另一个空间用作临时存储处理过的行,以便在之后能够继续提取出来继续和后面的行一起处理的功能,这个空间称为“保持空间”,保持空间的加入使得sed命令的功能变得更加强大,使用更加灵活,为了更加便于理解,模式空间又可以称为”动态空间”,文本的每一行数据在模式空间中根据用户输入的“动作命令”进行处理,而保持空间可称为“静态空间”,被处理过但是因为某些需要,用户希望临时存放在保持空间中数据,被放置在保持空间中,不进行任何处理(动作),在用户给出下面的某些高级编辑命令时,“静态空间”里的内容才会发生变化。

高级编辑命令

P:打印模式空间开端至\n内容,并追加到默认输出之前

h: 把模式空间中的内容覆盖至保持空间中

H:将保持空间的内容后面加上一个\n,然后把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出数据后面加上一个换行符\n,然后追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行覆盖至模式空间

N:读取匹配到的行的下一行追加至模式空间

d: 删除模式空间中的行

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不读取新的输入行,而使用合成的模式空间重新启动循环(即,如果在D命令生效后,模式空间中仍有内容,内容将保持住,进入下一个script循环)。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。

sed示例:

sed -n ‘n;p’ FILE

关闭了默认的将模式空间中的内容显示一遍的功能,n每次会处理两行,而仅保留第二行在模式空间中,p再将这些行打印出来,所以,这条命令显示的就是文件的偶数行。

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

这个命令有3个子命令1、如果模式空间读入的不是文件第一行,就将保持空间中的内容调出来追加到模式空间内容的后面2、将模式空间的内容覆盖到保持空间。3、如果读入的不是最后一行,就将模式空间的数据删除掉。那么文件的每一行就会在模式空间和保持空间中来回的“流动”,当没有新的行读入时,模式空间中的内容才会被sed显示在终端上。假设一个文件有4行,其进行了如下的流程:

第一个循环                                    模式空间        保持空间

读入第一行                                               1

因为是第一行,1命令不动作                                 1

2命令动作读入模式空间覆盖到保持空间                       1                          1

1行不是最后一行,3命令执行                                               1

进入第二个循环

读入第二行                                                     2                          1

因为不是第一行,1命令动作                                 2,1                     1

命令2动作                                                                     2,1                        2,1

命令3动作                                                                                                2,1

进入第三个循环

读入第三行                                                                    3                          2,1

命令1                                                                            3,2,1                     2,1

命令2                                                                            3,2,1                     3,2,1

命令3                                                            3,2,1

进入第四个循环                                                             4                          3,2,1

命令1                                                                           4,3,2,1

命令2                                                                           4,3,2,1            4,3,2,1

最后一行,命令3不动作                                                4,3,2,1                  4,3,2,1

所以最后的结果就是将文件的内容从最后一行到第一行反向显示了一遍,其实通过tac命令可以轻易的得到结果。

 

sed ‘N;D‘ FILE

动作命令N读入两行作为一行处理,动作命令2将第一个/n前的内容删除掉,然后模式空间会留下当前的第二行进入下一轮循环,反复读取删除后,留下的是文件的最后一行。

sed ‘$!N;$!D’ FILE

和上面的命令类似,但读入到最后一行时,不再追加也不删除,而模式空间中剩下的就是最后两行,所以该代码显示的就是最后两行。

sed ‘$!d’ FILE

最后一行不删除,就是只显示最后一行,tail -1同样能做到

sed ‘G’ FILE

从保持空间中取出数据并在数据后面加一个换行符,追加到模式空间的后面,处理完成后,模式空间的内容输出到终端,但保持空间并没有数据,那么只追加了一个”\n”,效果就是在每一行后面追加了一行空行,类似:另一种写法sed ‘a\ ‘ FILE。

sed ‘g’ FILE

类似上面的,只是这次是覆盖了模式空间的内容,那么输出的就是一堆空行,而且这些空行只有“\n”。

sed ‘/^$/d;G’ FILE

读入一行后,如果是空行就将空行删除掉,输出一个“空”,有内容就输出原内容,然后从保持空间中读入一个“\n”到模式空间中,继续读入下一行,此时模式空间中是一个只有”\n”的行加上新读入的行,如果新读入的行非空,就输出一个只有“\n”的行和新行组成的两行内容,如果是新行是空行,就删除掉模式空间的内容,再从保持空间读入一个/n,接着读下一行,最终达到的效果就是将连续的空行压缩为一行,但文本中的空行不一定只有“空”,改进一下写成sed ‘/^[ \t]*$/d;G’   将空格,\n以及tab组成的没有实际内容的行都匹配上。

sed ‘n;d’ FILE

显示奇数行

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

同样是倒序显示文本的内容

sed -r ‘N;/^(.*)\n\1/!P;D’ FILE

就像一个“窗口”,模式空间里面始终放着两行文本的内容,然后进行比较,如果内容不同,就打印第一行,并且删除掉第一行,剩下的一行继续和后面的行比较(这行就变成第一行了);如果两行相同,就不打印任何一行,直接删除掉第一行,剩下的一行变成第一行继续和后面的比较,一直到和后面的行内容不同为止,才会打印出来,否则会直接被删除。最终的效果是,将所有连续重复的行压缩为一行。

sed ‘/^#/{1!d}’ FILE

使用了两个定界地址,用大括号括起来,效果是除了第一行,剩下的所有以井号开头的行都删除掉。同样的还有sed ‘2,${/^#/d}’ FILE, 当连续定界时使用大括号扩起来,连续执行的动作命令用“;”隔开。

sed  ‘1!s/^#\(.*\)/\1/’ FILE

隐含为输入定界就读入所有行,1!排除第一行,删除除了第一行以外的,由#号开头的行的#,可以进一步简化:sed  ‘1!s/^#//’ FILE

 

练习题:

1、删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符

sed -n ‘s/^[[:space:]]\+//;p’  /etc/grub2.cfg

sed -n ‘s/^[ \t]\+//;p’  /etc/grub2.cfg

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符

sed -n ‘s/^#[[:space:]]\+//;p’ /etc/fstab

sed -n ‘s/^#[[ \t]\+//;p’ /etc/fstab

3、在centos6系统/root/install.log每一行行首增加#号

sed -n ‘s/.*/#&/p’ /root/install.log

4、在/etc/fstab文件中不以#开头的行的行首增加#号

sed -n ‘s/^[^#]/#&/;p’ /etc/fstab

5、处理/etc/fstab路径,使用sed命令取出其目录名和基名

echo “/etc/fstab”|sed -n ‘s@\(/.*\)/\([^/].*\)$@\1@p’

echo “/etc/fstab”|sed -n ‘s@\(/.*\)/\([^/].*\)$@\2@p’

6、利用sed 取出ifconfig命令中本机的IPv4地址

centOS6和7格式不同,需要考虑到通用性

ifconfig |sed -n ‘/^[ens|eth]/{n;p}’|sed -n ‘s/^[[:space:]]\+inet \(addr:\)\?\([[:digit:].]\+\).*/\2/p’

7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数

[root@Centos6 ~ 10:47:24]#ls /media/CentOS_6.9_Final/Packages |sed -n ‘s/.*\.\([^.]\+\)\.rpm$/\1/p’| sort |uniq -c

4 i686

925 noarch

2311 x86_64

老师讲了一个更牛X的办法:

[root@Centos6 ~/bin 12:12:14]#ls /media/CentOS_6.9_Final/Packages|grep “.*\.rpm”|rev|cut -d. -f2|rev|sort|uniq -c

4 i686

925 noarch

2311 x86_64

 

8、统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和sed两种方法分别实现)

grep -E  -o  “\<[[:alpha:]]+\>”  /etc/init.d/functions | sort | uniq -c | sort -nr

sed -n ‘s/[^[:alpha:]]/\n/g;p’ /etc/init.d/functions | tr -s “\n” | sort | uniq -c | sort -nr

如果要把数字和下划线也认为是单词的一部分,只需要将匹配的条件改为[^[:alnum:]_]即可

9、将文本文件的n和n+1行合并为一行,n为奇数行

[root@Centos6 ~ 11:49:19]#cat f1

1   this is aaa testfile

2   this is bbb testfile

3   this is ccc testfile

4   this is ddd testfile

5   this is eee testfile

6   this is fff testfile

7   this is ggg testfile

8   this is hhh testfile

9   this is iii testfile

10  this is jjj testfile

11  this is kkk testfile

12  this is lll testfile

[root@Centos6 ~ 11:50:07]#sed -n ‘N;s@[\n]@ @;p’ f1

1   this is aaa testfile 2   this is bbb testfile

3   this is ccc testfile 4   this is ddd testfile

5   this is eee testfile 6   this is fff testfile

7   this is ggg testfile 8   this is hhh testfile

9   this is iii testfile 10  this is jjj testfile

11  this is kkk testfile 12  this is lll testfile

[root@Centos6 ~ 10:29:04]#cat f1 | xargs -d”\n” -n2     参考前面xargs的条目

1   this is aaa testfile 2   this is bbb testfile

3   this is ccc testfile 4   this is ddd testfile

5   this is eee testfile 6   this is fff testfile

7   this is ggg testfile 8   this is hhh testfile

9   this is iii testfile 10  this is jjj testfile

11  this is kkk testfile 12  this is lll testfile

包管理器rpm和yum

rpm工具

在linux中有各种各样的软件包,通常我们会称之为某某命令,但对于许多强大的命令而言,比如find,sed等等,用命令来称呼似乎有点不合适,因为这些命令自己就自带大量的小命令,通过各种组合,可以实现许多强大功能,这样的命令,我更愿意称之为“工具包”,就像一个放满的扳手、起子、钳子等等工具的工具包一样,可以实现用户在某一方面各种各样的要求。

rpm是Redhat公司制定的一种打包标准,是Redhat Package Manager的缩写,后因应用面广,改成RPM Package Manager,对打包的标准进行了一系列的规定:

这是一个操作系统安装光盘自带包的命名格式

tree-1.5.3-3.el6.x86_64.rpm

从左往右分别是:

程序名称及版本号

打包次数和操作系统版本号el6=rhel6,因为centos就是无售后版的rhel,包名还是保留了

适用的cpu架构,还有noarch(无关架构)、i686(32位)等

.rpm的后缀

由于软件的发展,有很多软件的功能逐渐强大,对某些用户而言这些功能可能就过于臃肿了,因此就将包拆开分成多个部分,用户可以根据自己的需要安装:

Application-VERSION-ARCH.rpm: 主包

Application-devel-VERSION-ARCH.rpm 开发子包

Application-utils-VERSION-ARHC.rpm 其它子包

Application-libs-VERSION-ARHC.rpm 其它子包

在使用rpm工具安装rpm包时,可能会遇到软件的依赖性问题,某些软件要实现设计的功能,可能需要调用其他软件的功能来帮助完成,所以在安装时,rpm会检查rpm包的安装信息中保存的依赖性信息,然后检查当前机器上是否安装了这些软件,如果没有,rpm工具默认是不会进行安装的,前面提到yum比rpm好用的原因之一是yum可以自动解决包的依赖性问题,而rpm只能根据提示手动解决。

包管理器的功能:

将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作。

包文件组成 (每个包独有)

RPM包内的文件

RPM的元数据,如名称,版本,依赖性,描述等

安装或卸载时运行的脚本(较大型的包有)

数据库(公共):/var/lib/rpm

程序包名称及版本

依赖关系

功能说明

包安装后生成的各文件路径及校验码信息

获取程序包的途径:

(1) 系统发版的光盘或官方的服务器;

CentOS镜像:

https://www.centos.org/download/

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

(2) 项目官方站点

http://apache.org/

http://nginx.org/

http://mariadb.org/

(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工具包的使用:

在CentOS系统上使用rpm命令管理程序包可以进行程序的:安装、卸载、升级、查询、校验、数据库维护。

常用:rpm -ivh   -e

i 安装

–test: 测试安装,但不真正执行安装,即dry run模式

–nodeps:忽略依赖关系

–replacepkgs | replacefiles

–nosignature: 不检查来源合法性

–nodigest:不检查包完整性

–noscripts:不执行程序包脚本

%pre: 安装前脚本; –nopre

%post: 安装后脚本; –nopost

%preun: 卸载前脚本; –nopreun

%postun: 卸载后脚本; –nopostun

–oldpackage:降级

–force: 强制安装

v 显示安装信息,还可以-vv,-vvv,v越多,显示的信息越多

h 显示安装进度,以#号表示

U 升级或升级包,未安装的包会安装,如非必要(如重大安全漏洞,必须上线的功能等),不要轻易升级。

F 只升级已安装的包,如果没有安装过则不进行操作,如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留

rpm工具查询功能:

-q【p】 :-q 查询已安装的包 -qp查询未安装的包,后面接的是包名。它们都可以接下面的参数

-a查询所有已安装的包(和p一起使用无效),也可以指定通配符的名称进行查询

-i查询指定包的信息(版本、开发商、安装时间等)。从这里面可以查看到软件包属于哪个包组

-l 查询包的文件列表和目录(包在生产的时候就指定了文件的路径,因此可查未装包)

-R 查询包的依赖性

-c查询安装后包生成的配置文件

-d查询安装后包生成的帮助文档

-f查询系统中的文件属于哪个已安装的包(接的是文件名而不是包名)

–scripts 查询包相关的脚本文档,脚本文档分四类:安装前运行(preinstall scriptlet)、安装后运行(postinstall scriptlet)、卸载前运行(preuninstall scriptlet)、卸载后运行(posttrans scriptlet),要注意不是所有包都有脚本文档,没有的话是不会显示任何信息的。

–whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供

–whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖

rpm软件包中提供的另一个命令rpm2cpio

rpm2cpio 完整的包文件名|cpio –itv                        预览包内文件

rpm2cpio 完整的包文件名|cpio –id 要提取的文件名          释放包内文件

包校验

使用公钥校验,如果是安装的centOS光盘中的包,其公钥就在安装光盘目录的第一层中:

centOS6校验公钥:RPM-GPG-KEY-CentOS-6

centOS7校验公钥:RPM-GPG-KEY-CentOS-7

安装系统后,上面的两个公钥其实会复制一个到系统中:

/etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-6

/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

公钥在使用前应该进行导入,导入后rpm工具的校验功能才能正常使用:

导入:rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 如果要使用光盘路径就填入系统上光盘的路径

校验:rpm -K 包名

一般建议在安装之前应该对包进行校验,校验尽量使用光盘上的密钥,因为光盘是只读的,相对安全。

rpm -V用来检查已安装rpm包的完整性。所谓“完整性”,这里就是指安装rpm包产生的所有文件和原始rpm包中的信息是否一致。如果完全一致,则不做任何输出,只有发现有不正确的文件时才会输出。

rpm -V的输出格式如下:

SM5DLUGT c

其中每当发现一个不一致的文件就会有一行类似的输出,每个字符的含义:

S:表示对应文件的大小(Size)不一致;

M:表示对于文件的mode不一致;

5:表示对应文件的MD5不一致;

D:表示文件的major和minor号不一致;

L:表示文件的符号连接内容不一致;

U:表示文件的owner不一致;

G:表示文件的group不一致;

T:表示文件的修改时间不一致;

c:只有文件是一个配置文件时才会有此标志,可以用这种方法快速定位rpm包的配置文件安装位置。(不是说只有文件不一致情况下才会显示吗?没错,但是配置文件通常会被修改,所以通常都会被检测出不一致)

file:检测出不一致的文件安装路径;

当然一般不可能一个文件的所有以上属性都不一致,所以检测通过的属性就会用一个“.”表示。

安装包后的文件分布:

rpm包被安装后,会在/var/lib/rpm下建立已安装的rpm数据库,以后有任何rpm包的升级,查询、版本比较等包的操作都是从这个目录下获取信息并完成相应操作的,对于rpm命令而言,其大多数功能的实现都是依赖于这个数据库的,一旦数据库损坏,连基本的安装、卸载等操作都无法进行,因为rpm工具无法获知需要安装或卸载的包在系统上的位置信息。

数据库的重建:

rpm {–initdb|–rebuilddb}

initdb: 初始化

如果事先不存在数据库,则新建之,否则,不执行任何操作

rebuilddb:重建已安装的包头的数据库索引目录

rpm包安装完成后,相关的文件会复制到多个目录下,对于使用rpm安装的软件包,其安装位置在制作rpm包时已经指定好,使用的是“默认”路径和配置(对应编译安装可以自行指定路径和配置),其放置文件的位置一般约定俗成的在下面几个位置:

/etc                                                   放置配置文件的目录

/bin、/sbin、/usr/bin、/usr/sbin       一些可执行文件

/lib、/lib64、/usr/lib(/usr/lib64)         一些库文件

/usr/include                                      一些头文件

/usr/share/doc                          一些基本的软件使用手册与帮助文件

/usr/share/man                   一些man page档案

自动化的包管理器yum工具

前面已经简单的介绍了一下yum是依赖于yum仓库,能够进行一定程度的自动化安装的包管理器,其运行的过程是读取yum源中的repodata文件夹中的数据,来获得用户指定的包的安装数据,包括:完整包名、在yum源中的位置、包大小、依赖性等等内容,yum工具可以通过这些信息找到包的位置,并调用rpm工具完成安装,可以简单的理解为repodata中的文件类似磁盘文件管理中的“元数据”,事实上,在yum的全局配置文件的注释中,就多次出现了“metadata”字样(不要问我注释写的是什么,英语学渣全靠蒙),看一下yum的全局默认设置文件(同样的在/etc/下):

[root@Centos6 ~ 04:16:34]#cat /etc/yum.conf

[main]                                              yum配置文件同样有自己的格式,【】中写的ID名

cachedir=/var/cache/yum/$basearch/$releasever         缓存目录,用到变量分别表示cpu架构和版本号

keepcache=0                                                                   0不保留安装时下载的包,1安装包时下载的包保留

debuglevel=2                                                                       调试信息级别

logfile=/var/log/yum.log                                                      日志文件位置

exactarch=1                                         设置为1将只允许安装和系统架构完全匹配的包

obsoletes=1                                              是否允许更新旧的包

gpgcheck=1                                         是否进行包校验

plugins=1                                                                            是否允许使用yum插件

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                                   bug提交地址

distroverpkg=centos-release                                                指定基准包,yum会根据这个包判断发行版本

 

#……省略……

 

# PUT YOUR REPOS HERE OR IN separate files named file.repo  提示将你的配置写在这里或建立一个以.repo

# in /etc/yum.repos.d                                      结尾的文件到/etc/yum.repos.d下

提到了yum.repos.d文件夹,进去看下里面已经有了很多默认的配置文件,里面的内容主要由默认的yum源地址和一些配置信息,以及一些注释条目组成,太长,其主要的配置条目如下:

[base]            仓库ID,ID可随意填写,用【】括起来,但ID必须保证唯一性,一般建议带一定提示功能

name            仓库名称,可随意命名,相当于一个注释

mirrorlist             该地址下包含了仓库地址列表,包含一个或多个镜像站点,和baseurl使用一个就可以了

#baseurl            仓库地址。网络上的地址则写网络地址,注意是地址栏中的完整路径名(即自动补全了类似http://字样的地址),本地地址则写本地地址,格式为“file://”后接路径,如file:///mnt/cdrom

gpgcheck=1        指定是否需要验证签名(公钥),1表示需要,0表示不需要

gpgkey=           签名(公钥)文件的路径

enabled=         该仓库是否生效,enabled=1表示生效,enabled=0表示不生效

cost=              “cost”直译为开销,开销越高,优先级越低

注意:在配置文件中用到了两个特殊的变量:

$releasever:表示系统的版本号

$basearch:表示系统的架构,如x86_64

如果有看官已经在系统中尝试过打印这两个变量,会发现这两个变量并没有值,注意看/etc/yum.conf文件中的最后一行:

distroverpkg=centos-release                                                指定基准包,yum会根据这个包判断发行版本

centos-release是一个包名,上面的两个特殊的变量的值的来源就是这里,由yum读取这个包中的信息后赋予这两个变量,也可以进到/var/cache/yum/下查看:

[root@Centos6 /var/cache/yum 05:07:42]#rpm -qa |grep centos-release

centos-release-6-9.el6.12.3.x86_64

[root@Centos6 /etc/yum.repos.d 05:20:28]#rpm -qi centos-release

Name        : centos-release               Relocations: (not relocatable)

Version     : 6                                 Vendor: CentOS

Release     : 9.el6.12.3                    Build Date: Tue 28 Mar 2017 06:25:08 PM CST

Install Date: Tue 27 Mar 2018 05:02:34 PM CST      Build Host: c1bm.rdu2.centos.org

Group       : System Environment/Base       Source RPM: centos-release-6-9.el6.12.3.src.rpm

Size        : 37364                            License: GPLv2

Signature   : RSA/SHA1, Tue 28 Mar 2017 06:36:02 PM CST, Key ID 0946fca2c105b9de

Packager    : CentOS BuildSystem <http://bugs.centos.org>

Summary     : CentOS release file

Description :

CentOS release files

了解了yum的配置文件,我们就可以进行yum使用的第一步,配置yum源。上面看到了,在系统中,yum源的配置文件其实都配置好了,有很多yum源的地址,为什么还要自行配置yum源?——因为linux系统的发行方基本都是外国人,除了调用系统中的rpm包外,其默认配置的网络yum源服务器大多在国外,并不适合我们在国内使用,好在国内有大量的镜像网站可供我们选择。

epel yum仓库服务器

epel是由fedora社区维护的高质量高可靠性的安装源,有很多包是比系统包新的,且多出很多系统没有的包,建立一个epel仓库是很有必要的,建立过程很简单,选择阿里云的镜像为epel源:

[root@Centos6 /etc/yum.repos.d 05:39:26]#ls      事先已经先干掉了系统默认生成的一系列.repo文件

cdrom.repo            CentOS-Debuginfo.repo.bak  CentOS-Media.repo.bak

CentOS-Base.repo.bak  CentOS-fasttrack.repo.bak  CentOS-Vault.repo.bak

进入https://opsx.alibaba.com/mirror网站,找到epel条目,根据自己的系统版本和架构,一路点击到页面出现上面提到的,保存的yum源包元数据的“repodata”文件夹,注意不要继续点进去,我们需要的路径就到repodata文件夹的父目录为止,配置其他源时也是一样的原则,观察路径的命名规律:https://mirrors.aliyun.com/epel/6/x86_64/ 其中的6就是上面的特殊变量$ releasever的内容,x86_64就是上面的特殊变量$basharch的内容:那么配置文件就可以写作:

[root@Centos6 /etc/yum.repos.d 06:13:13]#vim epel.repo

[epel]

name=aliyun epel

baseurl=https://mirrors.aliyun.com/epel/$releasever/$basharch/

gpgcheck=0

[root@Centos6 /etc/yum.repos.d 06:15:00]#ls

cdrom.repo.bak        CentOS-Debuginfo.repo.bak  CentOS-Media.repo.bak  epel.repo

CentOS-Base.repo.bak  CentOS-fasttrack.repo.bak  CentOS-Vault.repo.bak

将其他的配置文件暂时禁用,检验yum源仓库是否能够正常使用,但是要注意的是,在前面的学习中我们知道,linux系统中配置文件在更改之后并不是立即就能生效的,yum配置文件要生效与bash配置文件生效的方法不同,需要清除yum缓存,然后再使用yum就能够读取到最新的配置文件了:

[root@Centos6 /etc/yum.repos.d 06:15:02]#yum clean all         清除yum缓存

Loaded plugins: fastestmirror, refresh-packagekit, security

Cleaning repos: epel

Cleaning up Everything

Cleaning up list of fastest mirrors

[root@Centos6 /etc/yum.repos.d 06:26:18]#yum repolist            这条命令用于生成新的可用仓库的列表

Loaded plugins: fastestmirror, refresh-packagekit, security

Loading mirror speeds from cached hostfile

epel                                                                                 | 4.7 kB     00:00

epel/primary_db                                                                      | 6.0 MB     00:12

repo id                                         repo name                                             status

epel                                            “aliyun epel”                                         12,501

repolist: 12,501                                        目前只有一个仓库,该仓库有12501个包可用

因为在配置文件中使用了两个变量来表示系统版本和架构,而且镜像网站的命名方式是很有规律的,在7上同样可以套用该配置文件,效果一样。

利用本地光盘为yum源建立仓库

只需要在上面的配置文件后按同样的格式,追加几个条目即可,但我们发现,7的光盘是打包在一起的,而6分为了cd1和cd2两个文件,如果仅仅是使用其作为yum源,那么我们可以利用iso制作命令mkisofs来制作一个everything的6.9包:

事先将cd1和cd2的内容复制到事先创建的6.9CDEverything/文件夹下,然后执行:

[root@Centos6 /data 07:51:11]#mkisofs -r -o /data/CentOS-6.9-x86_64-bin-Everything.iso  6.9CDEverything/

[root@Centos6 /data 07:51:01]#ll /data/CentOS-6.9-x86_64-bin-Everything.iso

-rw-r–r–. 1 root root 6193514496 Apr 22 07:25 /data/CentOS-6.9-x86_64-bin-Everything.iso

mount -o loop  CentOS-6.9-x86_64-bin-Everything.iso  /mnt/cd  将生成的镜像文件挂载到/mnt/cd下,注意,文

件挂载需要加上-o loop,7版本不用加

修改配置文件:

[root@Centos6 /data 07:53:35]#vim /etc/yum.repos.d/epel.repo

[epel]

name=aliyun epel

baseurl=https://mirrors.aliyun.com/epel/$releasever/$basearch/

gpgcheck=0

enabled=0                                                 添加一项暂时禁用epel源,注意结尾有个d

 

[base]

name=IOS

baseurl=file:///mnt/cd

gpgcheck=0

[root@Centos6 /mnt/cd/repodata 09:25:21]#yum repolist        可以正确生成列表了

Loaded plugins: fastestmirror, refresh-packagekit, security

Determining fastest mirrors

base                                                                                 | 4.0 kB     00:00 …

base/primary_db                                                                      | 4.7 MB     00:00 …

repo id                                              repo name                                        status

base                                                 IOS                                              6,706

repolist: 6,706

随便安装了个小包可以正常使用,就不贴出来了。

制作一个可以作为引导盘的CentOS6.9-Everything镜像

需要用到一个脚本mkdvdiso.sh,下载地址为:https://wiki.centos.org/搜索mkdvdiso.sh。

可能遇到网页打开很慢的问题:这里将脚本内容粘贴在下面,需要的可以复制后自行制作一个脚本:

[root@Centos6 ~/bin 12:20:08]#cat mkdvdiso.sh

#!/bin/bash

 

# by Chris Kloiber <ckloiber@redhat.com>

# Mods under CentOS by Phil Schaffner <pschaff2@verizon.net>

 

# A quick hack that will create a bootable DVD iso of a Red Hat Linux

# Distribution. Feed it either a directory containing the downloaded

# iso files of a distribution, or point it at a directory containing

# the “RedHat”, “isolinux”, and “images” directories.

 

# This version only works with “isolinux” based Red Hat Linux versions.

 

# Lots of disk space required to work, 3X the distribution size at least.

 

# GPL version 2 applies. No warranties, yadda, yadda. Have fun.

 

# Modified to add sanity checks and fix CentOS4 syntax errors

 

# TODO:

#   Add checks for available disk space on devices holding output and

#       temp files.

#   Add optional 3rd parameter to specify location of temp directory.

#   Create .discinfo if not present.

 

OS_VER=\

$((test -e /etc/fedora-release && rpm -qf /etc/fedora-release –qf “FC%{VERSION}”) \

|| (test -e /etc/redhat-release && rpm -qf /etc/redhat-release –qf “EL%{VERSION}”) \

|| echo OS_unknown)

 

case “$OS_VER” in

EL[45]*|FC?)

IMPLANT=/usr/lib/anaconda-runtime/implantisomd5

if [ ! -f $IMPLANT ]; then

echo “Error: $IMPLANT Not Found!”

echo “Please install anaconda-runtime and try again.”

exit 1

fi

;;

EL6*|FC1?)

IMPLANT=/usr/bin/implantisomd5

if [ ! -f $IMPLANT ]; then

echo “Error: $IMPLANT Not Found!”

echo “Please install isomd5sum and try again.”

exit 1

fi

;;

OS_unknown)

echo “Unknown OS.”

exit 1

;;

*)

echo “Fix this script for $OS_VER”

exit 1

esac

 

if [ $# -lt 2 ]; then

echo “Usage: basename $0 source /destination/DVD.iso”

echo “”

echo ”        The ‘source’ can be either a directory containing a single”

echo ”        set of isos, or an exploded tree like an ftp site.”

exit 1

fi

 

DVD_DIR=dirname $2

DVD_FILE=basename $2

 

echo “DVD directory is $DVD_DIR”

echo “ISO file is $DVD_FILE”

 

if [ “$DVD_DIR” = “.” ]; then

echo “Destinaton Directory $DVD_DIR does not exist”

exit 1

else

if [ ! -d “/$DVD_DIR” ]; then

echo “Destinaton Directory $DVD_DIR must be an absolute path”

exit 1

else

if [ “$DVD_FILE” = “” ] || [ -d “$DVD_DIR/$DVD_FILE” ]; then

echo “Null ISO file name.”

exit 1

fi

fi

fi

 

which mkisofs >&/dev/null

if [ “$?” != 0 ]; then

echo “mkisofs Not Found”

echo “yum install mkisofs”

fi

 

which createrepo >&/dev/null

if [ “$?” != 0 ]; then

echo “createrepo Not Found”

echo “yum install createrepo”

fi

 

if [ -f $2 ]; then

echo “DVD ISO destination $2 already exists. Remove first to recreate.”

exit 1

fi

 

# Make sure there is enough free space to hold the DVD image on the filesystem

# where the home directory resides, otherwise change ~/mkrhdvd to point to

# a filesystem with sufficient free space.

 

cleanup() {

[ ${LOOP:=/tmp/loop} = “/” ] && echo “LOOP mount point = \/, dying!” && exit

[ -d $LOOP ] && rm -rf $LOOP

[ ${DVD:=~/mkrhdvd} = “/” ] && echo “DVD data location is \/, dying!” && exit

[ -d $DVD ] && rm -rf $DVD

}

 

cleanup

mkdir -p $LOOP

mkdir -p $DVD

 

ls $1/*.iso &>/dev/null

if [ “$?” = 0 ]; then

 

echo “Found ISO CD images…”

 

CDS=expr 0

DISKS=”1″

 

[ -w / ] || {   # Very portable, but perhaps not perfect, test for superuser.

echo “Only ‘root’ may use this script for loopback mounts” 1>&2

exit 1

}

 

for f in ls $1/*.iso; do

mount -o loop $f $LOOP

cp -av $LOOP/* $DVD

if [ -f $LOOP/.discinfo ]; then

cp -av $LOOP/.discinfo $DVD

CDS=expr $CDS + 1

if [ $CDS != 1 ] ; then

DISKS=echo ${DISKS},${CDS}

fi

fi

umount $LOOP

done

else

if [ -f $1/isolinux/isolinux.bin ]; then

 

echo “Found FTP-like tree…”

 

if [ -e $1/.discinfo ]; then

cp -av $1/.discinfo $DVD

else

# How does one construct a legal .discinfo file if none is found?

echo “Error: No .discinfo file found in $1”

cleanup

exit 1

fi

cp -av $1/* $DVD

else

echo “Error: No CD images nor FTP-like tree found in $1″

cleanup

exit 1

fi

fi

 

if [ -e $DVD/.discinfo ]; then

awk ‘{ if ( NR == 4 ) { print disks } else { print ; } }’ disks=”ALL” $DVD/.discinfo > $DVD/.discinfo.new

mv $DVD/.discinfo.new $DVD/.discinfo

else

echo  “Error: No .discinfo file found in $DVD”

cleanup

exit 1

fi

 

rm -rf $DVD/isolinux/boot.cat

find $DVD -name TRANS.TBL | xargs rm -f

 

cd $DVD

createrepo -g repodata/comps.xml ./

mkisofs -J -R -v -T -o $2 -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 8 -boot-info-table $DVD

if [ “$?” = 0 ]; then

 

echo “”

echo “Image complete, create md5sum…”

 

#  $IMPLANT –force $2

# Don’t like forced mediacheck? Try this instead.

$IMPLANT –supported-iso –force $2

 

echo “Start cleanup…”

 

cleanup

 

echo “”

echo “Process Complete!”

echo “Wrote DVD ISO image to $DVD_DIR/$DVD_FILE”

echo “”

else

echo “ERROR: Image creation failed, start cleanup…”

 

cleanup

 

echo “”

echo “Failed to create ISO image $DVD_DIR/$DVD_FILE”

echo “”

fi

 

运行时有依赖性问题,使用yum解决:

[root@Centos6 ~/bin 12:18:58]#yum install isomd5sum

[root@Centos6 /misc/cd 12:45:29]#yum install createrepo

将两张光盘分别挂载到系统中,复制其中的内容到一个文件夹,其中cd2只需要复制Packages中的内容到cd1的Packages中即可

mkdvdiso.sh  /data/6.9CDEverything/  /data/CentOS-6.9-x86_64-bin–Everything.iso

yum工具 子命令

较老的centos系统,yum命令可能功能上有所不同,更新yum包之后就相同了。

Usage: yum [options] COMMAND

选项    子命令

子命令列表:

help             命令的帮助信息,用法:yum help command,如yum help install则查看install命令的用法说明

clean              清除缓存数据,如yum clean all

makecache      生成元数据缓存数据,yum makecache

deplist           列出包的依赖关系

erase             卸载包

fs                为当前文件系统创建快照,或者列出或删除当前已有快照。快照是非常有用的,升级或打补丁前拍个快照,就能放心地升级或打补丁了

fssnapshot        同fs一样

groups           操作包组

history            查看yum历史事务信息,yum是独占模式的进程,同样的yum的每条历史也有个编号,通过yum history可以查询很多信息,并支持回滚操作:

yum history   info 不跟进程号,显示最后一项事务的信息,跟进程号 查看对应历史事务信息

list  不跟进程号,查询所有历史事物表,跟进程号 显示单项历史事物

packages-list 类似list,跟的是软件名

packages-info 类似info,跟的是软件名

summary   概要显示那些用户在大概什么时候安了多少个包,跟进程号显示对应的历史信息

addon-info 插件信息

redo       重做指定的第几条历史的操作

undo       history最有意义的一条子命令,前面说过yum的出现,解决了rpm安装时可能会出现的烦人的依赖性问题,但同时带来了另外一个问题,安装的时候是很方便,但卸载的时候,那些为解决依赖性问题而安装的其他软件是不会被卸载的,放在系统上占用空间,甚至可能影响性能,那么这是使用undo的重做功能,就能很方便的进行反向操作,将为解决依赖性而额外安装的包一并删除掉。

rollback 回滚,撤销指定的事务之后的所有事务,即将指定事务之后的所有事务进行反向(undo)操作

new 使用新的历史文件,可以到/var/lib/yum/history下找到旧的历史文件,水平有限只能通过给新历史文件加后缀的方式恢复原来的历史列表,如果以后知道了新方法再补充。

sync 同步历史数据库

stats 统计数据

[root@Centos6 /var/lib/yum/history 11:39:11]#yum history stats

Loaded plugins: fastestmirror, refresh-packagekit, security

File        : //var/lib/yum/history/history-2018-03-27.sqlite

Size        : 1,763,328

Transactions: 8

Begin time  : Tue Mar 27 17:00:14 2018

End time    : Sun Apr 22 10:59:46 2018

Counts      :

NEVRAC :  1,280

NEVRA  :  1,280

NA     :  1,280

NEVR   :  1,280

rpm DB :  1,280

yum DB :  1,280

history stats

 

info              输出包或包组的信息,例如该包是谁制作的,大概是干什么用的,来源于哪个包组等信息

install              包安装命令

list                列出包名,一般会结合grep来搜索包,如yum list all | grep -i zabbix

provides          搜索给定的内容是谁提供的,可用来搜索来源于个包,如CentOS 7上mysql被mariadb替代,搜索Mysql提供者时就能找出包mariadb

reinstall           重新安装包

repolist            列出可用的仓库列表

search            给定字符串搜索相关包(支持模糊搜索),并给出相关包较为详细的信息

update           更新包,同样的不是必要,不建议更新。

downgrade       降级

check-update     检查可用的升级

选项:

-R [minutes], –randomwait=[minutes]:最多等待时间

-q, –quiet               安静模式,不能与其他选项合并简写,必须单独写

-v, –verbose             详细模式

-y, –assumeyes           对所有问题回答yes

–assumeno              对所有问题回答no

–enablerepo=[repo]      启用一个或多个仓库,可用通配符通配仓库ID

–disablerepo=[repo]      禁用一个或多个仓库,可用通配符通配仓库ID

-x [package], –exclude=[package]  通配要排除的包

–nogpgcheck           禁用gpgcheck

–color=COLOR          带颜色

–downloadonly      仅下载包,不安装或升级。默认下载在yum的缓存目录中,默认/var/cache/yum/$basearch/$releasever

–downloaddir=DLDIR   指定下载目录

–noplugins:禁用所有插件

包组的管理命令:

yum groupinstall group1 [group2] […]       安装包组

yum groupupdate group1 [group2] […]      升级包组

yum grouplist [hidden] [groupwildcard] […]   显示当前系统上已安装包组和可用包组

yum groupremove group1 [group2] […]           卸载包组

yum groupinfo group1 […]                 显示包组信息

yum是一个自动化程度很高的命令,在大多数情况下,yum操作失败的原因是:

1、repo的配置错误。

2、或者缓存未更新。

编译安装基本流程(理想状态的简单编译)

在实际工作中安装大型软件时,为了能够精确的开启所需的服务、关闭不需要的服务、以及便于以后的管理,往往进行的是编译安装,编译安装的过程类似在windows中进行自定义安装,不同之处在于windows可以拿鼠标点,而linux需要输入代码来开启和关闭服务,以及指定软件的安装目录,编译安装需要获得源码包,以apache为例

在网站http://httpd.apache.org/处获取需要的源码包。(本次安装仅为学习编译安装的流程,并不以在实际生产中能使用为目标,CentOS版本为6.9,apache版本为2.2.34):

1、下载源码包并上传到CentOS系统中

2、解压缩到试验目录并cd到该文件夹查看其中的内容

[root@Centos6 /data/scr/httpd-2.2.34 07:52:21]#ls

ABOUT_APACHE  buildconf      emacs-style  INSTALL         LICENSE        os                srclib

acinclude.m4  CHANGES        httpd.dep    InstallBin.dsp  Makefile.in    README            support

Apache.dsw    config.layout  httpd.dsp    LAYOUT          Makefile.win   README.platforms  test

build         configure      httpd.mak    libhttpd.dep    modules        README-win32.txt  VERSIONING

BuildAll.dsp  configure.in   httpd.spec   libhttpd.dsp    NOTICE         ROADMAP

BuildBin.dsp  docs           include      libhttpd.mak    NWGNUmakefile  server

这里有几个重要的文件和脚本

文本文件 README   INSTALL  脚本文件configure/config

安装之前阅读README 和INSTALL,阅读安装相关部分。(Quick Start)

使用./configure –help可以看到帮助信息,帮助信息包含:

1、脚本支持的选项主要有:

-h帮助

-V版本信息

-q 不显示检查信息,静默

2、安装路径:

–prefix 以指定的目录为安装参照点而不是根目录

3、详细安装路径选择

–sysconfdir指定配置文件的安装目录,常和安装路径配合使用,将软件其他部分放置在指定位置,而将配置文件单独放置在系统自身的/etc目录下,方便管理。

4、系统类型指定

5、功能选择:

–enable开头的功能默认为关闭状态,加上对应选项开启

–disable开头的功能默认为开启状态,加上对应选项关闭

6、可选包

做好准备工作后,安装过程主要分为几步:

1、cd到解压后文件存放的目录,运行./ configure ,如果需要指定安装位置则跟上上面介绍的选项和路径,以及需要开启或禁用的功能,如果需要跟的选项过多,建议使用“\”的方式进行分行显示。在运行时,脚本会自动检查软件的依赖性问题并给出提示,逐个解决就好。

2、执行make

3、执行make install,这样软件的安装就完成了。

4、将安装路径下的bin文件夹,加入到$PATH中,写入到/etc/profile.d/下的配置文件中。

5、关闭防火墙,禁用防火墙服务,关闭SElinux。

6、启动服务

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96908

发表评论

登录后才能评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

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