-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path0520rpm_and_srpm.html
1842 lines (1841 loc) · 147 KB
/
0520rpm_and_srpm.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Author" content="VBird, 鸟哥">
<meta name="Description" content="利用 RPM 来管理整个 Linux 的软件,同时以一个简单的范例来操纵 SRPM 的创建">
<title>鸟哥的 Linux 私房菜 -- 第二十二章、软件安装 RPM, SRPM 与 YUM</title>
<style type="text/css">
</style>
<link href="./vbird_files/style_2013.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="tablearea">
<div class="mainarea">
<div class="block1">
<!-- 本文的档头部分 -->
<h1>第二十二章、软件安装 RPM, SRPM 与 YUM</h1>
<div style="text-align:right">
<span class="text_history">最近更新日期:2015/10/16</span>
</div>
<!-- 本文的档头部分 -->
<div class="abstract">
<p>虽然使用原代码进行软件编译可以具有客制化的设置,但对于 Linux distribution 的发布商来说,则有软件管理不易的问题,
毕竟不是每个人都会进行原代码编译的。如果能够将软件预先在相同的硬件与操作系统上面编译好才发布的话,
不就能够让相同的 distribution 具有完全一致的软件版本吗?如果再加上简易的安装/移除/管理等机制的话,
对于软件控管就会简易的多。有这种东西吗?有的,那就是 RPM 与 YUM 这两个好用的咚咚。
既然这么好用,我们当然不能错过学习机会啰!赶紧来参详参详!</p>
</div>
<!-- 本文的链接区部分 -->
<div class="links">
<ul>
<li><a href="0520rpm_and_srpm.html#intro">22.1 软件管理员简介</a>
<ul>
<li><a href="0520rpm_and_srpm.html#intro_import2">22.1.1 Linux 界的两大主流: RPM 与 DPKG</a></li>
<li><a href="0520rpm_and_srpm.html#intro_whatisrpm">22.1.2 什么是 RPM 与 SRPM</a></li>
<li><a href="0520rpm_and_srpm.html#intro_i386586">22.1.3 什么是 i386, i586, i686, noarch, x86_64</a></li>
<li><a href="0520rpm_and_srpm.html#intro_advance">22.1.4 RPM 的优点</a></li>
<li><a href="0520rpm_and_srpm.html#intro_solution">22.1.5 RPM 属性相依的克服方式: YUM 在线升级</a></li>
</ul></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager">22.2 RPM 软件管理程序: rpm</a>
<ul>
<li><a href="0520rpm_and_srpm.html#rpmmanager_dir">22.2.1 RPM 缺省安装的路径</a></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager_install">22.2.2 RPM 安装 (install)</a></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager_update">22.2.3 RPM 升级与更新 (upgrade/freshen)</a></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager_query">22.2.4 RPM 查找 (query)</a></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager_verify">22.2.5 RPM 验证与数字签章 (Verify/signature)</a></li>
<li><a href="0520rpm_and_srpm.html#rpmmanager_rebuild">22.2.6 RPM 反安装与重建数据库 (erase/rebuilddb)</a></li>
</ul></li>
<li><a href="0520rpm_and_srpm.html#yumclient">22.3 YUM 在线升级机制</a>
<ul>
<li><a href="0520rpm_and_srpm.html#yumclient_yum">22.3.1 利用 yum 进行查找、安装、升级与移除功能</a></li>
<li><a href="0520rpm_and_srpm.html#yumclient_config">22.3.2 yum 的设置档</a></li>
<li><a href="0520rpm_and_srpm.html#yumclient_group">22.3.3 yum 的软件群组功能</a></li>
<li><a href="0520rpm_and_srpm.html#yumclient_epel">22.3.4 EPEL/ELRepo 插件软件以及自订设置档</a></li>
<li><a href="0520rpm_and_srpm.html#yumclient_system">22.3.5 全系统自动升级</a></li>
<li><a href="0520rpm_and_srpm.html#rpmortarball">22.3.6 管理的抉择:RPM 还是 Tarball</a></li>
<li><a href="0520rpm_and_srpm.html#servicenow">22.3.7 基础服务管理:以 Apache 为例</a></li>
</ul></li>
<li><a href="0520rpm_and_srpm.html#srpmmanager">22.4 SRPM 的使用: rpmbuild (Optional)</a>
<ul>
<li><a href="0520rpm_and_srpm.html#srpmmanager_rebuild">22.4.1 利用默认值安装 SRPM 文件 (--rebuid/--recompile)</a></li>
<li><a href="0520rpm_and_srpm.html#srpmmanager_dir">22.4.2 SRPM 使用的路径与需要的软件</a></li>
<li><a href="0520rpm_and_srpm.html#srpmmanager_config">22.4.3 设置档的主要内容 (*.spec)</a></li>
<li><a href="0520rpm_and_srpm.html#srpmmanager_command">22.4.4 SRPM 的编译指令 (-ba/-bb)</a></li>
<li><a href="0520rpm_and_srpm.html#srpmmanager_myself">22.4.5 一个打包自己软件的范例</a></li>
</ul></li>
<li><a href="0520rpm_and_srpm.html#hint">22.5 重点回顾</a></li>
<li><a href="0520rpm_and_srpm.html#ex">22.6 本章习题</a></li>
<li><a href="0520rpm_and_srpm.html#reference">22.7 参考数据与延伸阅读</a></li>
</ul>
</div>
</div>
<!-- 本文的正式部分 -->
<a id="intro"></a>
<div class="block1">
<h2>22.1 软件管理员简介</h2>
<p>在前一章我们提到以原代码的方式来安装软件,也就是利用厂商发布的 Tarball
来进行软件的安装。不过,你应该很容易发现,那就是每次安装软件都需要侦测操作系统与环境、设置编译参数、实际的编译、
最后还要依据个人喜好的方式来安装软件到定位。这过程是真的很麻烦的,而且对于不熟整个系统的朋友来说,还真是累人啊!</p>
<p>那有没有想过,如果我的 Linux 系统与厂商的系统一模一样,那么在厂商的系统上面编译出来的运行档,
自然也就可以在我的系统上面跑啰!也就是说,<span class="text_import2">厂商先在他们的系统上面编译好了我们用户所需要的软件,
然后将这个编译好的可运行的软件直接发布给用户来安装</span>,如此一来,由于我们本来就使用厂商的
Linux distribution ,所以当然系统 (硬件与操作系统) 是一样的,那么使用厂商提供的编译过的可运行档就没有问题啦!
说的比较白话一些,那就是利用类似 Windows
的安装方式,由程序开发者直接在已知的系统上面编译好,再将该程序直接给用户来安装,如此而已。</p>
<p>那么如果在安装的时候还可以加上一些与这些程序相关的信息,将他创建成为数据库,那不就可以进行安装、反安装、
升级与验证等等的相关功能啰 (类似 Windows 底下的『添加移除程序』)?确实如此,在 Linux
上面至少就有两种常见的这方面的软件管理员,分别是 RPM 与 Debian 的 dpkg 。我们的 CentOS
主要是以 RPM 为主,但也不能不知道 dpkg 啦!所以底下就来约略介绍一下这两个玩意儿。</p>
<a id="intro_import2"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.1.1 Linux 界的两大主流: RPM 与 DPKG</h2>
<p>由于自由软件的蓬勃发展,加上大型 Unix-Like 主机的强大性能,让很多软件开发者将他们的软件使用 Tarball 来发布。
后来 Linux 发展起来后,由一些企业或社区将这些软件收集起来制作成为 distributions
以发布这好用的 Linux 操作系统。但后来发现到,这些 distribution 的软件管理实在伤脑筋,
如果软件有漏洞时,又该如何修补呢?使用 tarball 的方式来管理吗?又常常不晓得到底我们安装过了哪些程序?
因此,一些社区与企业就开始思考 Linux 的软件管理方式。</p>
<p>如同刚刚谈过的方式,Linux 开发商先在固定的硬件平台与操作系统平台上面将需要安装或升级的软件编译好,
然后将这个软件的所有相关文件打包成为一个特殊格式的文件,在这个软件文件内还包含了预先侦测系统与相依软件的脚本,
并提供记载该软件提供的所有文件信息等。最终将这个软件文件发布。<span class="text_import2">用户端取得这个文件后,只要透过特定的指令来安装,
那么该软件文件就会依照内部的脚本来侦测相依的前驱软件是否存在,若安装的环境符合需求,那就会开始安装</span>,
安装完成后还会将该软件的信息写入软件管理机制中,以达成未来可以进行升级、移除等动作呢。</p>
<p>目前在 Linux 界软件安装方式最常见的有两种,分别是:</p>
<ul>
<li><span class="text_import1">dpkg</span>:<br>
这个机制最早是由 Debian Linux 社区所开发出来的,透过 dpkg 的机制, Debian
提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。
只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的,
包括 B2D, Ubuntu 等等。<br><br></li>
<li><span class="text_import1">RPM</span>:<br>
这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributions
就使用这个机制来作为软件安装的管理方式。包括 Fedora, CentOS, SuSE 等等知名的开发商都是用这咚咚。</li>
</ul>
<p>如前所述,不论 dpkg/rpm 这些机制或多或少都会有软件属性相依的问题,那该如何解决呢?
其实前面不是谈到过每个软件文件都有提供相依属性的检查吗?那么如果我们将相依属性的数据做成列表,
等到实际软件安装时,若发生有相依属性的软件状况时,例如安装 A 需要先安装 B 与 C ,而安装 B 则需要安装
D 与 E 时,那么当你要安装 A ,透过相依属性列表,管理机制自动去取得 B, C, D, E 来同时安装,
不就解决了属性相依的问题吗?</p>
<p>没错!您真聪明!目前新的 Linux 开发商都有提供这样的『在线升级』机制,透过这个机制,
原版光盘就只有第一次安装时需要用到而已,其他时候只要有网络,你就能够取得原本开发商所提供的任何软件了呢!
在 dpkg 管理机制上就开发出 APT 的在线升级机制,RPM 则依开发商的不同,有 Red Hat 系统的 yum ,
SuSE 系统的 Yast Online Update (YOU) 等。</p>
<table class="news" style="width: 95%">
<tbody><tr class="theader"><td>distribution 代表</td><td>软件管理机制</td><td>使用指令</td><td>在线升级机制(指令)</td></tr>
<tr class="tcenter"><td>Red Hat/Fedora</td><td>RPM</td><td>rpm, rpmbuild</td><td>YUM (yum)</td></tr>
<tr class="tcenter"><td>Debian/Ubuntu</td><td>DPKG</td><td>dpkg</td><td>APT (apt-get)</td></tr>
</tbody></table>
<p>我们这里使用的是 CentOS 系统嘛!所以说:<span class="text_import2">使用的软件管理机制为 RPM
机制,而用来作为在线升级的方式则为 yum </span>!底下就让我们来谈谈 RPM 与 YUM 的相关说明吧!</p>
<br></div><br>
<a id="intro_whatisrpm"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.1.2 什么是 RPM 与 SRPM</h2>
<p>RPM 全名是『<span class="text_import2"> RedHat Package Manager </span>』简称则为
RPM 啦!顾名思义,当初这个软件管理的机制是由 Red Hat 这家公司发展出来的。
RPM 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。</p>
<p>他最大的特点就是将你要安装的软件先编译过,
并且打包成为 RPM 机制的包装文件,透过包装好的软件里头缺省的数据库记录,
记录这个软件要安装的时候必须具备的相依属性软件,当安装在你的 Linux 主机时,
RPM 会先依照软件里头的数据查找 Linux 主机的相依属性软件是否满足,
若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入
RPM 的数据库中,以便未来的查找、验证与反安装!这样一来的优点是:</p>
<ol class="text_import2">
<li>由于已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);</li>
<li>由于软件的信息都已经记录在 Linux 主机的数据库上,很方便查找、升级与反安装</li>
</ol>
<p>但是这也造成些许的困扰。由于 RPM 文件是已经包装好的数据,也就是说,
里面的数据已经都『编译完成』了!所以,<span class="text_import2">该软件文件几乎只能安装在原本缺省的硬件与操作系统版本中。</span>
也就是说,你的主机系统环境必须要与当初创建这个软件文件的主机环境相同才行!
举例来说,rp-pppoe 这个 ADSL 拨接软件,他必须要在 ppp 这个软件存在的环境下才能进行安装!如果你的主机并没有
ppp 这个软件,那么很抱歉,除非你先安装 ppp 否则 rp-pppoe 就是不让你安装的
(当然你可以强制安装,但是通常都会有点问题发生就是了!)。</p>
<p>所以,<span class="text_import2">通常不同的 distribution 所发布的 RPM 文件,并不能用在其他的
distributions 上</span>。举例来说,Red Hat 发布的 RPM 文件,通常无法直接在 SuSE
上面进行安装的。更有甚者,相同 distribution 的不同版本之间也无法互通,例如 CentOS 6.x 的 RPM
文件就无法直接套用在 CentOS 7.x !因此,这样可以发现这些软件管理机制的问题是:</p>
<ol class="text_import2">
<li>软件文件安装的环境必须与打包时的环境需求一致或相当;</li>
<li>需要满足软件的相依属性需求;</li>
<li>反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!</li>
</ol>
<p>那怎么办?如果我真的想要安装其他 distributions 提供的好用的 RPM 软件文件时?
呵呵!还好,还有 SRPM 这个东西!<span class="text_import2">SRPM 是什么呢?顾名思义,他是
Source RPM 的意思,也就是这个 RPM 文件里面含有原代码哩</span>!特别注意的是,这个
<span class="text_import2">SRPM 所提供的软件内容『并没有经过编译』</span>,
它提供的是原代码喔!</p>
<p>通常 <span class="text_import2">SRPM 的扩展名是以 ***.src.rpm 这种格式来命名的</span>。不过,既然 SRPM
提供的是原代码,那么为什么我们不使用 Tarball 直接来安装就好了?这是因为 SRPM 虽然内容是原代码,
但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM 文件所提供的数据。同时,他与 RPM
不同的是,他也提供了参数设置档 (就是 configure 与 makefile)。所以,如果我们下载的是
SRPM ,那么要安装该软件时,你就必须要:</p>
<ul class="text_import2">
<li>先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件;</li>
<li>然后将编译完成的 RPM 文件安装到 Linux 系统当中</li>
</ul>
<p>怪了,怎么 SRPM 这么麻烦呐!还要重新编译一次,那么我们直接使用 RPM
来安装不就好了?通常一个软件在发布的时候,都会同时发布该软件的
RPM 与 SRPM 。我们现在知道 RPM 文件必须要在相同的 Linux 环境下才能够安装,而 SRPM
既然是原代码的格式,自然<span class="text_import2">我们就可以透过修改 SRPM 内的参数设置档,然后重新编译产生能适合我们
Linux 环境的 RPM 文件</span>,如此一来,不就可以将该软件安装到我们的系统当中,而不必与原作者打包的
Linux 环境相同了?这就是 SRPM 的用处了!</p>
<table class="news" style="width: 95%">
<tbody><tr class="theader"><td>文件格式</td><td>文件名格式</td><td>直接安装与否</td><td>内含程序类型</td><td>可否修改参数并编译</td></tr>
<tr class="tcenter"><td>RPM</td><td>xxx.rpm</td><td>可</td><td>已编译</td><td>不可</td></tr>
<tr class="tcenter"><td>SRPM</td><td>xxx.src.rpm</td><td>不可</td><td>未编译之原代码</td><td>可</td></tr>
</tbody></table><br>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 为何说 CentOS 是『社区维护的企业版』呢? Red Hat 公司的 RHEL 发布后,连带会将 SRPM 发布。
社区的朋友就将这些 SRPM 收集起来并重新编译成为所需要的软件,再重复发布成为 CentOS,所以才能号称与
Red Hat 的 RHEL 企业版同步啊!真要感谢 SRPM 哩!如果你想要理解 CentOS 是如何编译一支程序的,
也能够透过学习 SRPM 内含的编译参数,来学习的啊!
</fieldset><br>
<br></div><br>
<a id="intro_i386586"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.1.3 什么是 i386, i586, i686, noarch, x86_64</h2>
<p>从上面的说明,现在我们知道 RPM 与 SRPM 的格式分别为:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_write">xxxxxxxxx.rpm</span> <span class="term_note"><==RPM 的格式,已经经过编译且包装完成的 rpm 文件;</span>
<span class="term_write">xxxxx.src.rpm</span> <span class="term_note"><==SRPM的格式,包含未编译的原代码信息。</span>
</pre></td></tr></tbody></table>
<p>那么我们怎么知道这个软件的版本、适用的平台、编译发布的次数呢?只要透过文件名就可以知道了!例如
<span class="text_import2">rp-pppoe-3.11-5.el7.x86_64.rpm</span>
这的文件的意义为:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_write">rp-pppoe - 3.11 - 5 .el7.x86_64 .rpm</span>
软件名称 软件的版本信息 发布的次数 适合的硬件平台 扩展名
</pre></td></tr></tbody></table>
<p>除了后面适合的硬件平台与扩展名外,主要是以『-』来隔开各个部分,这样子可以很清楚的发现该软件的名称、
版本信息、打包次数与操作的硬件平台!好了,来谈一谈每个不同的地方吧:</p>
<ul>
<li><span class="text_import2">软件名称</span>:<br>
当然就是每一个软件的名称了!上面的范例就是 rp-pppoe 。<br><br></li>
<li><span class="text_import2">版本信息</span>:<br>
每一次更新版本就需要有一个版本的信息,否则如何知道这一版是新是旧?这里通常又分为主版本跟次版本。以上面为例,主版本为
3 ,在主版本的架构下更动部分原代码内容,而发布一个新的版本,就是次版本啦!以上面为例,就是 11 啰!所以版本名就为 3.11<br><br></li>
<li><span class="text_import2">发布版本次数</span>:<br>
通常就是编译的次数啦!那么为何需要重复的编译呢?这是由于同一版的软件中,可能由于有某些
bug 或者是安全上的顾虑,所以必须要进行小幅度的 patch 或重设一些编译参数。
设置完成之后重新编译并打包成 RPM 文件!因此就有不同的打包数出现了!<br><br></li>
<li><span class="text_import2">操作硬件平台</span>:<br>
这是个很好玩的地方,由于 RPM 可以适用在不同的操作平台上,但是不同的平台设置的参数还是有所差异性!
并且,我们可以针对比较高端的 CPU 来进行最佳化参数的设置,这样才能够使用高端 CPU 所带来的硬件加速功能。
所以就有所谓的 i386, i586, i686, x86_64 与 noarch 等的文件名称出现了!<br><br>
<table class="news" style="width:95%">
<tbody><tr class="theader"><td style="width:80px">平台名称</td><td>适合平台说明</td></tr>
<tr><td class="tcenter"><span class="text_import2">i386</span></td>
<td>几乎适用于所有的 x86 平台,不论是旧的 pentum 或者是新的 Intel Core 2 与
K8 系列的 CPU 等等,都可以正常的工作!那个 i 指的是 Intel 兼容的 CPU 的意思,至于 386
不用说,就是 CPU 的等级啦!</td></tr>
<tr><td class="tcenter"><span class="text_import2">i586</span></td>
<td>就是针对 586 等级的电脑进行最佳化编译。那是哪些 CPU 呢?包括 pentum 第一代 MMX CPU, AMD 的 K5, K6 系列 CPU
(socket 7 插脚) 等等的 CPU 都算是这个等级;</td></tr>
<tr><td class="tcenter"><span class="text_import2">i686</span></td>
<td>在 pentun II 以后的 Intel 系列 CPU ,及 K7 以后等级的 CPU 都属于这个 686 等级!
由于目前市面上几乎仅剩 P-II 以后等级的硬件平台,因此很多 distributions 都直接发布这种等级的 RPM 文件。</td></tr>
<tr><td class="tcenter"><span class="text_import2">x86_64</span></td>
<td>针对 64 比特的 CPU 进行最佳化编译设置,包括 Intel 的 Core 2 以上等级 CPU ,以及 AMD 的 Athlon64
以后等级的 CPU ,都属于这一类型的硬件平台。</td></tr>
<tr><td class="tcenter"><span class="text_import2">noarch</span></td>
<td>就是没有任何硬件等级上的限制。一般来说,这种类型的 RPM 文件,里面应该没有 binary program 存在,
较常出现的就是属于 shell script 方面的软件。</td></tr>
</tbody></table><br>
截至目前为止 (2015),就算是旧的个人电脑系统,堪用与能用的设备大概都至少是 Intel Core 2 以上等级的电脑主机,泰半都是 64 比特的系统了!
因此目前 CentOS 7 仅推出 x86_64 的软件版本,并没有提供 i686 以下等级的软件了!如果你的系统还是很老旧的机器,
那才有可能不支持 64 比特的 Linux 系统。此外,目前仅存的软件版本大概也只剩下 i686 及 x86_64 还有不分版本的 noarch 而已,
i386 只有在某些很特别的软件上才看到的到啦!<br><br>
受惠于目前 x86 系统的支持方面,新的 CPU 都能够运行旧型 CPU 所支持的软件,也就是说硬件方面都可以向下兼容的,
因此<span class="text_import2">最低等级的 i386 软件可以安装在所有的 x86 硬件平台上面</span>,不论是 32
比特还是 64 比特。但是反过来说就不行了。举例来说,目前硬件大多是 64 比特的等级,因此你可以在该硬件上面安装
x86_64 或 i386 等级的 RPM 软件。但在你的旧型主机,例如 P-III/P-4 32 比特机器上面,就不能够安装 x86_64 的软件!
</li>
</ul>
<p>根据上面的说明,其实我们只要选择 i686 版本来安装在你的 x86 硬件上面就肯定没问题。但是如果强调性能的话,
还是选择搭配你的硬件的 RPM 文件吧!毕竟该软件才有针对你的 CPU 硬件平台进行过参数最佳化的编译嘛!</p>
<br></div><br>
<a id="intro_advance"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.1.4 RPM 的优点</h2>
<p>由于 RPM 是透过预先编译并打包成为 RPM 文件格式后,再加以安装的一种方式,并且还能够进行数据库的记载。
所以 RPM 有以下的优点:</p>
<ul class="text_import2">
<li>RPM 内含已经编译过的程序与设置档等数据,可以让用户免除重新编译的困扰;</li>
<li>RPM 在被安装之前,会先检查系统的硬盘容量、操作系统版本等,可避免文件被错误安装;</li>
<li>RPM 文件本身提供软件版本信息、相依属性软件名称、软件用途说明、软件所含文件等信息,便于了解软件;</li>
<li>RPM 管理的方式使用数据库记录 RPM 文件的相关参数,便于升级、移除、查找与验证。</li>
</ul>
<p>为什么 RPM 在使用上很方便呢?我们前面提过, RPM 这个软件管理员所处理的软件,是由软件提供者在特定的
Linux 作业平台上面将该软件编译完成并且打包好。那用户只要拿到这个打包好的软件,
然后将里头的文件放置到应该要摆放的目录,不就完成安装啰?对啦!就是这样!</p>
<p>但是有没有想过,我们在前一章里面提过的,有些软件是有相关性的,例如要安装网络卡驱动程序,就得要有
kernel source 与 gcc 及 make
等软件。那么我们的 RPM 软件是否一定可以安装完成呢?如果该软件安装之后,却找不到他相关的前驱软件,
那不是挺麻烦的吗?因为安装好的软件也无法使用啊!</p>
<p>为了解决这种具有相关性的软件之间的问题 (就是所谓的软件相依属性),RPM
就在提供打包的软件时,同时加入一些消息登录的功能,这些消息包括软件的版本、
打包软件者、相依属性的其他软件、本软件的功能说明、本软件的所有文件记录等等,然后在
Linux 系统上面亦创建一个 RPM 软件数据库,如此一来,当你要安装某个以
RPM 型态提供的软件时,在安装的过程中, RPM 会去检验一下数据库里面是否已经存在相关的软件了,
如果数据库显示不存在,那么这个 RPM 文件『缺省』就不能安装。呵呵!没有错,这个就是 RPM
类型的文件最为人所诟病的『<span class="text_import2">软件的属性相依</span>』问题啦!</p>
<br></div><br>
<a id="intro_solution"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.1.5 RPM 属性相依的克服方式: YUM 在线升级</h2>
<p>为了重复利用既有的软件功能,因此很多软件都会以函数库的方式发布部分功能,以方便其他软件的调用应用,
例如 PAM 模块的验证功能。此外,为了节省用户的数据量,目前的 distributions 在发布软件时,
都会将软件的内容分为一般使用与开发使用 (development) 两大类。所以你才会常常看到有类似
pam-x.x.rpm 与 pam-devel-x.x.rpm 之类的文件名啊!而缺省情况下,大部分的 software-devel-x.x.rpm
都不会安装,因为终端用户大部分不会去开发软件嘛!</p>
<p>因为有上述的现象,因此 RPM 软件文件就会有所谓的属性相依的问题产生 (其实所有的软件管理几乎都有这方面的情况存在)。
那有没有办法解决啊?前面不是谈到 RPM 软件文件内部会记录相依属性的数据吗?那想一想,要是我将这些相依属性的软件先列表,
在有要安装软件需求的时候,先到这个列表去找,同时与系统内已安装的软件相比较,没安装到的相依软件就一口气同时安装起来,
那不就解决了相依属性的问题了吗?有没有这种机制啊?有啊!那就是 YUM 机制的由来!</p>
<p>CentOS (1)先将发布的软件放置到 YUM 服务器内,然后(2)分析这些软件的相依属性问题,将软件内的记录信息写下来 (header)。
然后再将这些信息分析后记录成软件相关性的清单列表。这些列表数据与软件所在的本机或网络位置可以称呼为容器或软件仓库或软件库 (repository)。
当用户端有软件安装的需求时,用户端主机会主动的向网络上面的 yum 服务器的软件库网址下载清单列表,
然后透过清单列表的数据与本机 RPM 数据库已存在的软件数据相比较,就能够一口气安装所有需要的具有相依属性的软件了。
整个流程可以简单的如下图说明:</p>
<a id="fig22.1.1"></a>
<div style="text-align:center; margin: 0 auto 0 auto; "><img src="./vbird_files/yum-01.gif" alt="YUM 使用的流程示意图" title="YUM 使用的流程示意图" style="border: 1px solid black; padding: 10px "></div>
<div style="text-align: center;">图22.1.1、YUM 使用的流程示意图</div>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 所以软件仓库内的清单会记载每个文件的相依属性关系,以及所有文件的网络位置 (URL)!由于记录了详细的软件网络位置,
所以有需要的时候,当然就会自动的从网络下载该软件啰!
</fieldset><br>
<p>当用户端有升级、安装的需求时, yum 会向软件库要求清单的更新,等到清单更新到本机的 /var/cache/yum 里面后,
等一下更新时就会用这个本机清单与本机的 RPM 数据库进行比较,这样就知道该下载什么软件。接下来 yum 会跑到软件库服务器
(yum server) 下载所需要的软件 (因为有记录软件所在的网址),然后再透过 RPM 的机制开始安装软件啦!这就是整个流程!
谈到最后,还是需要动到 RPM 的啦!所以下个小节就让我们来谈谈 RPM 这咚咚吧!</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 为什么要做出『软件库』呢?由于 yum 服务器提供的 RPM 文件内容可能有所差异,举例来说,原厂发布的数据有
(1)原版数据; (2)更新数据 (update); (3)特殊数据 (例如第三方协力软件,或某些特殊功能的软件)。
这些软件文件基本上不会放置到一起,那如何分辨这些软件功能呢?就用『软件库』的概念来处理的啦!
不同的『软件库』网址,可以放置不同的功能的软件之意!
</fieldset><br> <br></div>
</div>
<a id="rpmmanager"></a>
<div class="block1">
<h2>22.2 RPM 软件管理程序: rpm</h2>
<p>RPM 的使用其实不难,只要使用 rpm 这个指令即可!鸟哥最喜欢的就是
rpm 指令的查找功能了,可以让我很轻易的就知道某个系统有没有安装鸟哥要的软件呢!此外,
我们最好还是得要知道一下,到底 RPM 类型的文件他们是将软件的相关文件放置在哪里呢?还有,我们说的那个 RPM
的数据库又是放置在哪里呢?</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 事实上,下一小节要讲的 yum 就可以直接用来进行安装的动作,基本上 rpm 这个指令真的就只剩下查找与检验的功能啰!
所以,查找与检验还是要学的,至于安装,透过 yum 就好了!
</fieldset><br>
<a id="rpmmanager_dir"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.1 RPM 缺省安装的路径</h2>
<p>一般来说,RPM 类型的文件在安装的时候,会先去读取文件内记载的设置参数内容,然后将该数据用来比对
Linux 系统的环境,以找出是否有属性相依的软件尚未安装的问题。例如 Openssh 这个连接软件需要透过
Openssl 这个加密软件的帮忙,所以得先安装 openssl 才能装 openssh 的意思。那你的环境如果没有 openssl ,
你就无法安装 openssh 的意思啦。</p>
<p>若环境检查合格了,那么 RPM 文件就开始被安装到你的 Linux 系统上。安装完毕后,该软件相关的信息就会被写入
<span class="text_import2">/var/lib/rpm/</span> 目录下的数据库文件中了。
上面这个目录内的数据很重要喔!因为未来如果我们有任何软件升级的需求,版本之间的比较就是来自于这个数据库,
而如果你想要查找系统已经安装的软件,也是从这里查找的!同时,目前的 RPM 也提供数字签章信息,
这些数字签章也是在这个目录内记录的呢!所以说,这个目录得要注意不要被删除了啊!</p>
<p>那么软件内的文件到底是放置到哪里去啊?当然与文件系统有关对吧!我们在<a href="0210filepermission.html#dir">第五章的目录配置</a>谈过每个目录的意义,
这里再次的强调啰:</p>
<table class="news" style="width: 95%">
<tbody><tr><td style="width: 120px; font-family:'细明体'; color:#000066">/etc</td>
<td style="font-family:'细明体'; color:#000066">一些设置档放置的目录,例如 /etc/crontab</td></tr>
<tr><td style="font-family:'细明体'; color:#000066">/usr/bin</td>
<td style="font-family:'细明体'; color:#000066">一些可运行文件</td></tr>
<tr><td style="font-family:'细明体'; color:#000066">/usr/lib</td>
<td style="font-family:'细明体'; color:#000066">一些程序使用的动态函数库</td></tr>
<tr><td style="font-family:'细明体'; color:#000066">/usr/share/doc</td>
<td style="font-family:'细明体'; color:#000066">一些基本的软件使用手册与说明档</td></tr>
<tr><td style="font-family:'细明体'; color:#000066">/usr/share/man</td>
<td style="font-family:'细明体'; color:#000066">一些 man page 文件</td></tr>
</tbody></table>
<p>好了,底下我们就来针对每个 RPM 的相关指令来进行说明啰!</p>
<br></div><br>
<a id="rpmmanager_install"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.2 RPM 安装 (install)</h2>
<p>因为安装软件是 root 的工作,因此你得要是 root 的身份才能够操作 rpm 这指令的。
用 rpm 来安装很简单啦!假设我要安装一个文件名为 rp-pppoe-3.11-5.el7.x86_64.rpm 的文件,那么我可以这样:(假设原版光盘已经放在 /mnt 底下了)</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -i /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm</span>
</pre></td></tr></tbody></table>
<p>不过,这样的参数其实无法显示安装的进度,所以,通常我们会这样下达安装指令:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -ivh package_name</span>
<span class="term_say">选项与参数:
-i :install 的意思
-v :察看更细部的安装信息画面
-h :以安装信息列显示安装进度</span>
<span class="term_hd">范例一:安装原版光盘上的 rp-pppoe 软件</span>
[root@study ~]# <span class="term_command">rpm -ivh /mnt/Packages/rp-pppoe-3.11-5.el7.x86_64.rpm</span>
Preparing... ################################# [100%]
Updating / installing...
1:rp-pppoe-3.11-5.el7 ################################# [100%]
<span class="term_hd">范例二、一口气安装两个以上的软件时:</span>
[root@study ~]# <span class="term_command">rpm -ivh a.i386.rpm b.i386.rpm *.rpm</span>
<span class="term_say"># 后面直接接上许多的软件文件!</span>
<span class="term_hd">范例三、直接由网络上面的某个文件安装,以网址来安装:</span>
[root@study ~]# <span class="term_command">rpm -ivh http://website.name/path/pkgname.rpm</span>
</pre></td></tr></tbody></table>
<p>另外,如果我们在安装的过程当中发现问题,或者已经知道会发生的问题,
而还是『执意』要安装这个软件时,可以使用如下的参数『强制』安装上去:</p>
<table class="news" style="width: 95%">
<caption>rpm 安装时常用的选项与参数说明</caption>
<tbody><tr class="theader"><td style="width: 130px">可下达的选项</td><td>代表意义</td></tr>
<tr><td class="text_import1" style="font-family:'细明体'">--nodeps</td>
<td><span class="text_import2">使用时机</span>:当发生软件属性相依问题而无法安装,但你执意安装时<br>
<span class="text_import2">危险性</span>:
软件会有相依性的原因是因为彼此会使用到对方的机制或功能,如果强制安装而不考虑软件的属性相依,
则可能会造成该软件的无法正常使用!</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--replacefiles</td>
<td><span class="text_import2">使用时机:</span>
如果在安装的过程当中出现了『某个文件已经被安装在你的系统上面』的信息,又或许出现版本不合的消息 (confilcting files)
时,可以使用这个参数来直接覆盖文件。<br>
<span class="text_import2">危险性:</span>
覆盖的动作是无法复原的!所以,你必须要很清楚的知道被覆盖的文件是真的可以被覆盖喔!否则会欲哭无泪!</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--replacepkgs</td>
<td><span class="text_import2">使用时机:</span>
重新安装某个已经安装过的软件!如果你要安装一堆 RPM 软件文件时,可以使用 rpm -ivh *.rpm ,但若某些软件已经安装过了,
此时系统会出现『某软件已安装』的信息,导致无法继续安装。此时可使用这个选项来重复安装喔!</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--force</td>
<td><span class="text_import2">使用时机:</span>这个参数其实就是 --replacefiles 与 --replacepkgs 的综合体!</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--test</td>
<td><span class="text_import2">使用时机:</span>
想要测试一下该软件是否可以被安装到用户的 Linux 环境当中,可找出是否有属性相依的问题。范例为:<br>
<span class="text_import2" style="font-family: '细明体'">rpm -ivh pkgname.i386.rpm --test</span></td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--justdb</td>
<td><span class="text_import2">使用时机:</span>
由于 RPM 数据库破损或者是某些缘故产生错误时,可使用这个选项来更新软件在数据库内的相关信息。</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--nosignature</td>
<td><span class="text_import2">使用时机:</span>
想要略过数字签章的检查时,可以使用这个选项。</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--prefix 新路径</td>
<td><span class="text_import2" style="font-family: '细明体'">使用时机:</span>
要将软件安装到其他非正规目录时。举例来说,你想要将某软件安装到 /usr/local 而非正规的 /bin, /etc 等目录,
就可以使用『 --prefix /usr/local 』来处理了。</td></tr>
<tr><td class="text_import2" style="font-family:'细明体'">--noscripts</td>
<td><span class="text_import2">使用时机:</span>不想让该软件在安装过程中自行运行某些系统指令。<br>
<span class="text_import2">说明:</span>
RPM 的优点除了可以将文件放置到定位之外,还可以自动运行一些前置作业的指令,例如数据库的初始化。
如果你不想要让 RPM 帮你自动运行这一类型的指令,就加上他吧!</td></tr>
</tbody></table>
<p>一般来说,rpm 的安装选项与参数大约就是这些了。通常鸟哥建议直接使用 -ivh 就好了,
如果安装的过程中发现问题,一个一个去将问题找出来,尽量不要使用『
<span class="text_import2">暴力安装法</span> 』,就是透过 --force 去强制安装!
因为可能会发生很多不可预期的问题呢!除非你很清楚的知道使用上面的参数后,安装的结果是你预期的!</p>
<table class="exam" style="width: 90%"><tbody><tr><td>
例题:<div>
在没有网络的前提下,你想要安装一个名为 pam-devel 的软件,你手边只有原版光盘,该如何是好?
</div>
答:<div>
你可以透过挂载原版光盘来进行数据的查找与安装。请将原版光盘放入光驱,底下我们尝试将光盘挂载到 /mnt 当中,
并据以处理软件的下载啰:
<ul style="font-family:'细明体'">
<li>挂载光盘,使用: mount /dev/sr0 /mnt</li>
<li>找出文件的实际路径:find /mnt -name 'pam-devel*' </li>
<li>测试此软件是否具有相依性: rpm -ivh pam-devel... --test</li>
<li>直接安装: rpm -ivh pam-devel...</li>
<li>卸载光盘: umount /mnt</li>
</ul>
在鸟哥的系统中,刚好这个软件并没有属性相依的问题,因此最后一个步骤可以顺利的进行下去呢!
</div>
</td></tr></tbody></table><br>
<br></div><br>
<a id="rpmmanager_update"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.3 RPM 升级与更新 (upgrade/freshen)</h2>
<p>使用 RPM 来升级真是太简单了!就以 -Uvh 或 -Fvh 来升级即可,而 -Uvh 与 -Fvh 可以用的选项与参数,跟 install
是一样的。不过, -U 与 -F 的意义还是不太一样的,基本的差别是这样的:</p>
<table class="news" style="width: 95%">
<tbody><tr><td class="tcenter" style="width: 50px; font-family: '细明体'; color: #000066">-Uvh</td>
<td>后面接的软件即使没有安装过,则系统将予以直接安装;
若后面接的软件有安装过旧版,则系统自动更新至新版;</td></tr>
<tr><td class="tcenter" style=" font-family: '细明体'; color: #000066">-Fvh</td>
<td>如果后面接的软件并未安装到你的 Linux 系统上,则该软件不会被安装;亦即只有已安装至你
Linux 系统内的软件会被『升级』!</td></tr>
</tbody></table>
<p>由上面的说明来看,如果你想要大量的升级系统旧版本的软件时,使用 -Fvh
则是比较好的作法,因为没有安装的软件才不会被不小心安装进系统中。但是需要注意的是,如果你使用的是 -Fvh
,偏偏你的机器上尚无这一个软件,那么很抱歉,该软件并不会被安装在你的 Linux 主机上面,所以请重新以 ivh
来安装吧!</p>
<p>早期没有 yum 的环境底下,同时网络带宽也很糟糕的状况下,通常有的朋友在进行整个操作系统的旧版软件修补时,喜欢这么进行:</p>
<ol class="text_import2">
<li>先到各发展商的 errata 网站或者是国内的 FTP 映像站捉下来最新的 RPM 文件;</li>
<li>使用 -Fvh 来将你的系统内曾安装过的软件进行修补与升级!(真是方便呀!)</li>
</ol>
<p>所以,在不晓得 yum 功能的情况下,你依旧可以到 CentOS 的映设站台下载 updates 数据,然后利用上述的方法来一口气升级!
当然啰,升级也是可以利用 <span class="text_import2">--nodeps/--force</span> 等等的参数啦!
不过,现在既然有 yum 的机制在,这个笨方法当然也就不再需要了!</p>
<br></div><br>
<a id="rpmmanager_query"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.4 RPM 查找 (query)</h2>
<p>RPM 在查找的时候,其实查找的地方是在 <span class="text_import2">/var/lib/rpm/</span>
这个目录下的数据库文件啦!另外, RPM 也可以查找未安装的 RPM 文件内的信息喔!那如何去查找呢?
我们先来谈谈可用的选项有哪些?</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -qa </span> <span class="term_note"><==已安装软件</span>
[root@study ~]# <span class="term_command">rpm -q[licdR] 已安装的软件名称 </span> <span class="term_note"><==已安装软件</span>
[root@study ~]# <span class="term_command">rpm -qf 存在于系统上面的某个文件名 </span> <span class="term_note"><==已安装软件</span>
[root@study ~]# <span class="term_command">rpm -qp[licdR] 未安装的某个文件名称</span> <span class="term_note"><==查阅RPM文件</span>
<span class="term_say">选项与参数:
查找已安装软件的信息:
-q :仅查找,后面接的软件名称是否有安装;
-qa :列出所有的,已经安装在本机 Linux 系统上面的所有软件名称;
-qi :列出该软件的详细信息 (information),包含开发商、版本与说明等;
-ql :列出该软件所有的文件与目录所在完整文件名 (list);
-qc :列出该软件的所有设置档 (找出在 /etc/ 底下的文件名而已)
-qd :列出该软件的所有说明档 (找出与 man 有关的文件而已)
-qR :列出与该软件有关的相依软件所含的文件 (Required 的意思)
-qf :由后面接的文件名称,找出该文件属于哪一个已安装的软件;
-q --scripts:列出是否含有安装后需要运行的脚本档,可用以 debug 喔!
查找某个 RPM 文件内含有的信息:
-qp[icdlR]:注意 -qp 后面接的所有参数以上面的说明一致。但用途仅在于找出
某个 RPM 文件内的信息,而非已安装的软件信息!注意!</span>
</pre></td></tr></tbody></table>
<p>在查找的部分,所有的参数之前都需要加上 -q 才是所谓的查找!查找主要分为两部分,
一个是查已安装到系统上面的的软件信息,这部份的信息都是由 /var/lib/rpm/ 所提供。另一个则是查某个 rpm 文件内容,
等于是由 RPM 文件内找出一些要写入数据库内的信息就是了,这部份就得要使用 -qp (p 是 package 的意思)。
那就来看看几个简单的范例吧!</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd">范例一:找出你的 Linux 是否有安装 logrotate 这个软件?</span>
[root@study ~]# <span class="term_command">rpm -q logrotate</span>
logrotate-3.8.6-4.el7.x86_64
[root@study ~]# <span class="term_command">rpm -q logrotating</span>
package logrotating is not installed
<span class="term_say"># 注意到,系统会去找是否有安装后面接的软件名称。注意,不必要加上版本喔!
# 至于显示的结果,一看就知道有没有安装啦!</span>
<span class="term_hd">范例二:列出上题当中,属于该软件所提供的所有目录与文件:</span>
[root@study ~]# <span class="term_command">rpm -ql logrotate</span>
/etc/cron.daily/logrotate
/etc/logrotate.conf
<span class="term_say">....(以下省略)....</span>
<span class="term_say"># 可以看出该软件到底提供了多少的文件与目录,也可以追踪软件的数据。</span>
<span class="term_hd">范例三:列出 logrotate 这个软件的相关说明数据:</span>
[root@study ~]# <span class="term_command">rpm -qi logrotate</span>
Name : logrotate <span class="term_note"># 软件名称</span>
Version : 3.8.6 <span class="term_note"># 软件的版本</span>
Release : 4.el7 <span class="term_note"># 发布的版本</span>
Architecture: x86_64 <span class="term_note"># 编译时所针对的硬件等级</span>
Install Date: Mon 04 May 2015 05:52:36 PM CST <span class="term_note"># 这个软件安装到本系统的时间</span>
Group : System Environment/Base <span class="term_note"># 软件是放再哪一个软件群组中</span>
Size : 102451 <span class="term_note"># 软件的大小</span>
License : GPL+ <span class="term_note"># 发布的授权方式</span>
Signature : RSA/SHA256, Fri 04 Jul 2014 11:34:56 AM CST, Key ID 24c6a8a7f4a80eb5
Source RPM : logrotate-3.8.6-4.el7.src.rpm <span class="term_note"># 这就是 SRPM 的文件名</span>
Build Date : Tue 10 Jun 2014 05:58:02 AM CST <span class="term_note"># 软件编译打包的时间</span>
Build Host : worker1.bsys.centos.org <span class="term_note"># 在哪一部主机上面编译的</span>
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org>
Vendor : CentOS
URL : https://fedorahosted.org/logrotate/
Summary : Rotates, compresses, removes and mails system log files
Description : <span class="term_note"># 这个是详细的描述!</span>
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files. Logrotate
allows for the automatic rotation compression, removal and mailing of
log files. Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size. Normally,
logrotate runs as a daily cron job.
Install the logrotate package if you need a utility to deal with the
log files on your system.
<span class="term_say"># 列出该软件的 information (信息),里面的信息可多着呢,包括了软件名称、
# 版本、开发商、SRPM文件名称、打包次数、简单说明信息、软件打包者、
# 安装日期等等!如果想要详细的知道该软件的数据,用这个参数来了解一下</span>
<span class="term_hd">范例四:分别仅找出 logrotate 的设置档与说明档</span>
[root@study ~]# <span class="term_command">rpm -qc logrotate</span>
[root@study ~]# <span class="term_command">rpm -qd logrotate</span>
<span class="term_hd">范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?</span>
[root@study ~]# <span class="term_command">rpm -qR logrotate</span>
/bin/sh
config(logrotate) = 3.8.6-4.el7
coreutils >= 5.92
<span class="term_say">....(以下省略)....
# 由这里看起来,呵呵~还需要很多文件的支持才行喔!</span>
<span class="term_hd">范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?</span>
[root@study ~]# <span class="term_command">rpm -qf /bin/sh</span>
bash-4.2.46-12.el7.x86_64
<span class="term_say"># 这个参数后面接的可是『文件』呐!不像前面都是接软件喔!
# 这个功能在查找系统的某个文件属于哪一个软件所有的。</span>
<span class="term_hd">范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何?</span>
[root@study ~]# <span class="term_command">rpm -qpR filename.i386.rpm</span>
<span class="term_say"># 加上 -qpR ,找出该文件需求的数据!</span>
</pre></td></tr></tbody></table>
<p>常见的查找就是这些了!要特别说明的是,在查找本机上面的 RPM 软件相关信息时,
不需要加上版本的名称,只要加上软件名称即可!因为他会由 /var/lib/rpm 这个数据库里面去查找,
所以我们可以不需要加上版本名称。但是查找某个 RPM 文件就不同了,我们必须要列出整个文件的完整文件名才行~
这一点朋友们常常会搞错。底下我们就来做几个简单的练习吧!</p>
<table class="exam" style="width: 90%"><tbody><tr><td>
例题:<ol>
<li>我想要知道我的系统当中,以 c 开头的软件有几个,如何实做?</li>
<li>我的 WWW 服务器为 Apache ,我知道他使用的 RPM 软件文件名为 httpd 。现在,我想要知道这个软件的所有设置档放置在何处,可以怎么作?</li>
<li>承上题,如果查出来的设置文件已经被我改过,但是我忘记了曾经修改过哪些地方,所以想要直接重新安装一次该软件,该如何作?</li>
<li>如果我误砍了某个重要文件,例如 /etc/crontab,偏偏不晓得他属于哪一个软件,该怎么办?</li>
</ol>
答:<ol class="text_import2" style="font-family: '细明体'">
<li>rpm -qa | grep ^c | wc -l</li>
<li>rpm -qc httpd</li>
<li>假设该软件在网络上的网址为:<br>http://web.site.name/path/httpd-x.x.xx.i386.rpm<br>
则我可以这样做:<br>
rpm -ivh http://web.site.name/path/httpd-x.x.xx.i386.rpm --replacepkgs</li>
<li>虽然已经没有这个文件了,不过没有关系,因为 RPM 有记录在 /var/lib/rpm 当中的数据库啊!所以直接下达:<br>
rpm -qf /etc/crontab<br>
就可以知道是那个软件啰!重新安装一次该软件即可!</li>
</ol>
</td></tr></tbody></table><br>
<br></div><br>
<a id="rpmmanager_verify"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.5 RPM 验证与数字签章 (Verify/signature)</h2>
<p>验证 (Verify) 的功能主要在于提供系统管理员一个有用的管理机制!作用的方式是『<span class="text_import2">使用
/var/lib/rpm 底下的数据库内容来比对目前 Linux
系统的环境下的所有软件文件</span> 』也就是说,当你有数据不小心遗失,
或者是因为你误杀了某个软件的文件,或者是不小心不知道修改到某一个软件的文件内容,
就用这个简单的方法来验证一下原本的文件系统吧!好让你了解这一阵子到底是修改到哪些文件数据了!验证的方式很简单:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -Va</span>
[root@study ~]# <span class="term_command">rpm -V 已安装的软件名称</span>
[root@study ~]# <span class="term_command">rpm -Vp 某个 RPM 文件的文件名</span>
[root@study ~]# <span class="term_command">rpm -Vf 在系统上面的某个文件</span>
<span class="term_say">选项与参数:
-V :后面加的是软件名称,若该软件所含的文件被更动过,才会列出来;
-Va :列出目前系统上面所有可能被更动过的文件;
-Vp :后面加的是文件名称,列出该软件内可能被更动过的文件;
-Vf :列出某个文件是否被更动过~</span>
<span class="term_hd">范例一:列出你的 Linux 内的 logrotate 这个软件是否被更动过?</span>
[root@study ~]# <span class="term_command">rpm -V logrotate</span>
<span class="term_say"># 如果没有出现任何消息,恭喜你,该软件所提供的文件没有被更动过。
# 如果有出现任何消息,才是有出现状况啊!</span>
<span class="term_hd">范例二:查找一下,你的 /etc/crontab 是否有被更动过?</span>
[root@study ~]# <span class="term_command">rpm -Vf /etc/crontab</span>
.......T. c /etc/crontab
<span class="term_say"># 瞧!因为有被更动过,所以会列出被更动过的信息类型!</span>
</pre></td></tr></tbody></table>
<p>好了,那么我怎么知道到底我的文件被更动过的内容是什么?例如上面的范例二。呵呵!简单的说明一下吧!
例如,我们检查一下 logrotate 这个软件:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -ql logrotate</span>
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.8.6
/usr/share/doc/logrotate-3.8.6/CHANGES
/usr/share/doc/logrotate-3.8.6/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
<span class="term_say"># 呵呵!共有 10 个文件啊!请修改 /etc/logrotate.conf 内的 rotate 变成 5</span>
[root@study ~]# <span class="term_command">rpm -V logrotate</span>
..5....T. c /etc/logrotate.conf
</pre></td></tr></tbody></table>
<p>你会发现在文件名之前有个 c ,然后就是一堆奇怪的文本了。那个 c 代表的是 configuration ,
就是设置档的意思。至于最前面的几个信息是:</p>
<ul class="text_import2" style="font-family:'细明体'">
<li>S :(file Size differs) 文件的容量大小是否被改变</li>
<li>M :(Mode differs) 文件的类型或文件的属性 (rwx) 是否被改变?如是否可运行等参数已被改变</li>
<li>5 :(MD5 sum differs) MD5 这一种指纹码的内容已经不同</li>
<li>D :(Device major/minor number mis-match) 设备的主/次代码已经改变</li>
<li>L :(readLink(2) path mis-match) Link 路径已被改变</li>
<li>U :(User ownership differs) 文件的所属人已被改变</li>
<li>G :(Group ownership differs) 文件的所属群组已被改变</li>
<li>T :(mTime differs) 文件的创建时间已被改变</li>
<li>P :(caPabilities differ) 功能已经被改变</li>
</ul>
<p>所以,如果当一个设置档所有的信息都被更动过,那么他的显示就会是:</p>
<table class="term"><tbody><tr><td class="term"><pre>SM5DLUGTP c filename
</pre></td></tr></tbody></table>
<p>至于那个 c 代表的是『 Config file 』的意思,也就是文件的类型,文件类型有底下这几类:</p>
<ul class="text_import2" style="font-family:'细明体'">
<li>c :设置档 (config file)</li>
<li>d :文档数据档 (documentation)</li>
<li>g :鬼文件~通常是该文件不被某个软件所包含,较少发生!(ghost file)</li>
<li>l :授权文件 (license file)</li>
<li>r :读我文件 (read me)</li>
</ul>
<p>经过验证的功能,你就可以知道那个文件被更动过。那么如果该文件的变更是『预期中的』,
那么就没有什么大问题,但是如果该文件是『非预期的』,那么是否被入侵了呢?呵呵!得注意注意啰!
一般来说,设置档 (configure) 被更动过是很正常的,万一你的 binary program 被更动过呢?
那就得要特别特别小心啊!</p>
<fieldset class="vbirdface"><legend style="font-family: serif; font-size:12pt; color: darkblue;">Tips</legend><img src="./vbird_files/vbird_face.gif" alt="鸟哥的图标" title="鸟哥的图标" style="float: right;"> 虽说家丑不可外扬,不过有件事情还是跟大家分享一下的好。鸟哥之前的主机曾经由于安装一套软件,导致被攻击成为跳板。
会发现的原因是系统中只要出现 *.patch 的扩展名时,使用 ls -l 就是显示不出来该文件名 (该文件名确实存在)。
找了好久,用了好多任务具都找不出问题,最终利用 rpm -Va 找出来,原来好多 binary program 被更动过,连 init
都被恶搞!此时,赶紧重新安装 Linux 并移除那套软件,之后就比较正常了。所以说,这个 rpm -Va 是个好功能喔!
</fieldset><br>
<ul class="toplist"><li>数字签章 (digital signature)</li></ul>
<p>谈完了软件的验证后,不知道你有没有发现一个问题,那就是,验证只能验证软件内的信息与 /var/lib/rpm/
里面的数据库信息而已,如果该软件文件所提供的数据本身就有问题,那你使用验证的手段也无法确定该软件的正确性啊!
那如何解决呢?在 Tarball 与文件的验证方面,我们可以使用前一章谈到的 md5 指纹码来检查,
不过,连指纹码也可能会被窜改的嘛!那怎办?没关系,我们可以透过数字签章来检验软件的来源的!</p>
<p>就像你自己的签名一样,我们的软件开发商原厂所推出的软件也会有一个厂商自己的签章系统!
只是这个签章被数字化了而已。厂商可以数字签章系统产生一个专属于该软件的签章,并将该签章的公钥 (public key) 发布。
当你要安装一个 RPM 文件时:</p>
<ol class="text_import2">
<li>首先你必须要先安装原厂发布的公钥文件;</li>
<li>实际安装原厂的 RPM 软件时, rpm 指令会去读取 RPM 文件的签章信息,与本机系统内的签章信息比对,</li>
<li>若签章相同则予以安装,若找不到相关的签章信息时,则给予警告并且停止安装喔。</li>
</ol>
<p>我们 CentOS 使用的数字签章系统为 GNU 计划的 GnuPG (GNU Privacy Guard, GPG)(<a href="0520rpm_and_srpm.html#ps1">注1</a>)。
GPG 可以透过哈希运算,算出独一无二的专属密钥系统或者是数字签章系统,有兴趣的朋友可以参考文末的延伸阅读,
去了解一下 GPG 加密的机制喔!这里我们仅简单的说明数字签章在 RPM 文件上的应用而已。
而根据上面的说明,我们也会知道首先必须要安装原厂发布的 GPG 数字签章的公钥文件啊!CentOS 的数字签章位于:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">ll /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span>
-rw-r--r--. 1 root root 1690 Apr 1 06:27 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@study ~]# <span class="term_command">cat /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span>
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)
mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
<span class="term_say">....(中间省略)....</span>
-----END PGP PUBLIC KEY BLOCK-----
</pre></td></tr></tbody></table>
<p>从上面的输出,你会知道该数字签章码其实仅是一个乱数而已,这个乱数对于数字签章有意义而已,
我们看不懂啦!那么这个文件如何安装呢?透过底下的方式来安装即可喔!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7</span>
</pre></td></tr></tbody></table>
<p>由于不同版本 GPG 密钥文件放置的位置可能不同,不过文件名大多是以 GPG-KEY 来说明的,
因此你可以简单的使用 locate 或 find 来找寻,如以下的方式来搜索即可:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">locate GPG-KEY</span>
[root@study ~]# <span class="term_command">find /etc -name '*GPG-KEY*'</span>
</pre></td></tr></tbody></table>
<p>那安装完成之后,这个密钥的内容会以什么方式呈现呢?基本上都是使用 pubkey 作为软件的名称的!
那我们先列出密钥软件名称后,再以 -qi 的方式来查找看看该软件的信息为何:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm -qa | grep pubkey</span>
gpg-pubkey-f4a80eb5-53a7ff4b
[root@study ~]# <span class="term_command">rpm -qi gpg-pubkey-f4a80eb5-53a7ff4b</span>
Name : gpg-pubkey
Version : f4a80eb5
Release : 53a7ff4b
Architecture: (none)
Install Date: Fri 04 Sep 2015 11:30:46 AM CST
Group : Public Keys
Size : 0
License : pubkey
Signature : (none)
Source RPM : (none)
Build Date : Mon 23 Jun 2014 06:19:55 PM CST
Build Host : localhost
Relocations : (not relocatable)
Packager : CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>
Summary : gpg(CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>)
Description :
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: rpm-4.11.1 (NSS-3)
<span class="term_say">....(底下省略)....</span>
</pre></td></tr></tbody></table>
<p>重点就是最后面出现的那一串乱码啦!那可是作为数字签章非常重要的一环哩!
如果你忘记加上数字签章,很可能很多原版软件就不能让你安装啰~除非你利用 rpm 时选择略过数字签章的选项。</p>
<br></div><br>
<a id="rpmmanager_rebuild"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.2.6 RPM 反安装与重建数据库 (erase/rebuilddb)</h2>
<p>反安装就是将软件卸载啦!要注意的是,『解安装的过程一定要由最上层往下解除』,以
rp-pppoe 为例,这一个软件主要是依据 ppp 这个软件来安装的,所以当你要解除
ppp 的时候,就必须要先解除 rp-pppoe 才行!否则就会发生结构上的问题啦!这个可以由建筑物来说明,
如果你要拆除五、六楼,那么当然要由六楼拆起,否则先拆的是第五楼时,那么上面的楼层难道会悬空?</p>
<p>移除的选项很简单,就透过 -e 即可移除。不过,很常发生软件属性相依导致无法移除某些软件的问题!
我们以底下的例子来说明:</p>
<table class="term"><tbody><tr><td class="term"><pre><span class="term_hd"># 1. 找出与 pam 有关的软件名称,并尝试移除 pam 这个软件:</span>
[root@study ~]# <span class="term_command">rpm -qa | grep pam</span>
fprintd-pam-0.5.0-4.0.el7_0.x86_64
pam-1.1.8-12.el7.x86_64
gnome-keyring-pam-3.8.2-10.el7.x86_64
pam-devel-1.1.8-12.el7.x86_64
pam_krb5-2.4.8-4.el7.x86_64
[root@study ~]# <span class="term_command">rpm -e pam</span>
error: Failed dependencies: <span class="term_note"><==这里提到的是相依性的问题</span>
libpam.so.0()(64bit) is needed by (installed) systemd-libs-208-20.el7.x86_64
libpam.so.0()(64bit) is needed by (installed) libpwquality-1.2.3-4.el7.x86_64
<span class="term_say">....(以下省略)....</span>
<span class="term_hd"># 2. 若仅移除 pam-devel 这个之前范例安装上的软件呢?</span>
[root@study ~]# <span class="term_command">rpm -e pam-devel</span> <span class="term_note"><==不会出现任何消息!</span>
[root@study ~]# <span class="term_command">rpm -q pam-devel</span>
package pam-devel is not installed
</pre></td></tr></tbody></table>
<p>从范例一我们知道 pam 所提供的函数库是让非常多其他软件使用的,因此你不能移除 pam
,除非将其他相依软件一口气也全部移除!你当然也能加 --nodeps 来强制移除,
不过,如此一来所有会用到 pam 函数库的软件,都将成为无法运作的程序,我想,你的主机也只好准备停机休假了吧!
至于范例二中,由于 pam-devel 是依附于 pam 的开发工具,你可以单独安装与单独移除啦!</p>
<p>由于 RPM 文件常常会安装/移除/升级等,某些动作或许可能会导致 RPM 数据库 /var/lib/rpm/
内的文件破损。果真如此的话,那你该如何是好?别担心,我们可以使用 --rebuilddb 这个选项来重建一下数据库喔!
作法如下:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">rpm --rebuilddb <span class="term_note"><==重建数据库</span></span>
</pre></td></tr></tbody></table>
<br></div>
</div>
<a id="yumclient"></a>
<div class="block1">
<h2>22.3 YUM 在线升级机制</h2>
<p>我们在本章一开始的地方谈到过 <a href="0520rpm_and_srpm.html#intro_solution">yum</a> 这玩意儿,这个 yum 是透过分析 RPM 的标头数据后,
根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件安装或移除与升级的问题。
详细的 yum 服务器与用户端之间的沟通,可以再回到前面的部分查阅一下<a href="0520rpm_and_srpm.html#fig22.1.1">图 22.1.1</a> 的说明。</p>
<p>由于 distribution 必须要先发布软件,然后将软件放置于 yum 服务器上面,以提供用户端来要求安装与升级之用的。
因此我们想要使用 yum 的功能时,必须要先找到适合的 yum server 才行啊!而每个 yum server
可能都会提供许多不同的软件功能,那就是我们之前谈到的『软件库』啦!因此,你必须要前往 yum server
查找到相关的软件库网址后,再继续处理后续的设置事宜。</p>
<p>事实上 CentOS 在发布软件时已经制作出多部映射站台 (mirror site) 提供全世界的软件更新之用。
所以,理论上我们不需要处理任何设置值,只要能够连上 Internet ,就可以使用 yum 啰!底下就让我们来玩玩看吧!</p>
<a id="yumclient_yum"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.3.1 利用 yum 进行查找、安装、升级与移除功能</h2>
<p>yum 的使用真是非常简单,就是透过 yum 这个指令啊!那么这个指令怎么用呢?用法很简单,就让我们来简单的谈谈:</p>
<ul class="toplist"><li>查找功能:yum [list|info|search|provides|whatprovides] 参数</li></ul>
<p>如果想要查找利用 yum 来查找原版 distribution 所提供的软件,或已知某软件的名称,想知道该软件的功能,
可以利用 yum 相关的参数为:</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">yum [option] [查找工作项目] [相关参数]</span>
<span class="term_say">选项与参数:
[option]:主要的选项,包括有:
-y :当 yum 要等待用户输入时,这个选项可以自动提供 yes 的回应;
--installroot=/some/path :将该软件安装在 /some/path 而不使用缺省路径
[查找工作项目] [相关参数]:这方面的参数有:
search :搜索某个软件名称或者是描述 (description) 的重要关键字;
list :列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa;
info :同上,不过有点类似 rpm -qai 的运行结果;
provides:从文件去搜索软件!类似 rpm -qf 的功能!</span>
<span class="term_hd">范例一:搜索磁盘数组 (raid) 相关的软件有哪些?</span>
[root@study ~]# <span class="term_command">yum search raid</span>
Loaded plugins: fastestmirror, langpacks <span class="term_note"># yum 系统自己找出最近的 yum server</span>
Loading mirror speeds from cached hostfile <span class="term_note"># 找出速度最快的那一部 yum server</span>
* base: ftp.twaren.net <span class="term_note"># 底下三个软件库,且来源为该服务器!</span>
* extras: ftp.twaren.net
* updates: ftp.twaren.net
<span class="term_say">....(前面省略)....</span>
dmraid-events-logwatch.x86_64 : dmraid logwatch-based email reporting
dmraid-events.x86_64 : dmevent_tool (Device-mapper event tool) and DSO
iprutils.x86_64 : Utilities for the IBM Power Linux RAID adapters
mdadm.x86_64 : The mdadm program controls Linux md devices (software RAID arrays)
<span class="term_say">....(后面省略)....
# 在冒号 (:) 左边的是软件名称,右边的则是在 RPM 内的 name 设置 (软件名)
# 瞧!上面的结果,这不就是与 RAID 有关的软件吗?如果想了解 mdadm 的软件内容呢?</span>
<span class="term_hd">范例二:找出 mdadm 这个软件的功能为何</span>
[root@study ~]# <span class="term_command">yum info mdadm</span>
Installed Packages <span class="term_note"><==这说明该软件是已经安装的了</span>
Name : mdadm <span class="term_note"><==这个软件的名称</span>
Arch : x86_64 <span class="term_note"><==这个软件的编译架构</span>
Version : 3.3.2 <span class="term_note"><==此软件的版本</span>
Release : 2.el7 <span class="term_note"><==发布的版本</span>
Size : 920 k <span class="term_note"><==此软件的文件总容量</span>
Repo : installed <span class="term_note"><==软件库回报说已安装的</span>
From repo : anaconda
Summary : The mdadm program controls Linux md devices (software RAID arrays)
URL : http://www.kernel.org/pub/linux/utils/raid/mdadm/
License : GPLv2+
Description : The mdadm program is used to create, manage, and monitor Linux MD (software
: RAID) devices. As such, it provides similar functionality to the raidtools
: package. However, mdadm is a single program, and it can perform
: almost all functions without a configuration file, though a configuration
: file can be used to help with some common tasks.
<span class="term_say"># 不要跟我说,上面说些啥?自己找字典翻一翻吧!拜托拜托!</span>
<span class="term_hd">范例三:列出 yum 服务器上面提供的所有软件名称</span>
[root@study ~]# <span class="term_command">yum list</span>
Installed Packages <span class="term_note"><==已安装软件</span>
GConf2.x86_64 3.2.6-8.el7 @anaconda
LibRaw.x86_64 0.14.8-5.el7.20120830git98d925 @base
ModemManager.x86_64 1.1.0-6.git20130913.el7 @anaconda
<span class="term_say">....(中间省略)....</span>
Available Packages <span class="term_note"><==还可以安装的其他软件</span>
389-ds-base.x86_64 1.3.3.1-20.el7_1 updates
389-ds-base-devel.x86_64 1.3.3.1-20.el7_1 updates
389-ds-base-libs.x86_64 1.3.3.1-20.el7_1 updates
<span class="term_say">....(底下省略)....
# 上面提供的意义为:『 软件名称 版本 在那个软件库内 』</span>
<span class="term_hd">范例四:列出目前服务器上可供本机进行升级的软件有哪些?</span>
[root@study ~]# <span class="term_command">yum list updates</span> <span class="term_note"><==一定要是 update<span style="text-decoration: underline">s</span> 喔!</span>
Updated Packages
NetworkManager.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates
NetworkManager-adsl.x86_64 1:1.0.0-16.git20150121.b4ea599c.el7_1 updates
<span class="term_say">....(底下省略)....
# 上面就列出在那个软件库内可以提供升级的软件与版本!</span>
<span class="term_hd">范例五:列出提供 passwd 这个文件的软件有哪些</span>
[root@study ~]# <span class="term_command">yum provides passwd</span>
passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM
Repo : base
passwd-0.79-4.el7.x86_64 : An utility for setting or changing passwords using PAM
Repo : @anaconda
<span class="term_say"># 找到啦!就是上面的这个软件提供了 passwd 这个程序!</span>
</pre></td></tr></tbody></table>
<p>透过上面的查找,你应该大致知道 yum 如何用在查找上面了吧?那么实际来应用一下:</p>
<table class="exam" style="width: 90%"><tbody><tr><td>
例题:<div>
利用 yum 的功能,找出以 pam 为开头的软件名称有哪些?而其中尚未安装的又有哪些?
</div>
答:<div>
可以透过如下的方法来查找:<br>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">yum list pam*</span>
Installed Packages
<span style="text-decoration: underline">pam.x86_64 1.1.8-12.el7 @anaconda</span>
pam_krb5.x86_64 2.4.8-4.el7 @base
Available Packages <span class="term_note"><==底下则是『可升级』的或『未安装』的</span>
pam.i686 1.1.8-12.el7_1.1 updates
<span style="text-decoration: underline">pam.x86_64 1.1.8-12.el7_1.1 updates</span>
pam-devel.i686 1.1.8-12.el7_1.1 updates
pam-devel.x86_64 1.1.8-12.el7_1.1 updates
pam_krb5.i686 2.4.8-4.el7 base
pam_pkcs11.i686 0.6.2-18.el7 base
pam_pkcs11.x86_64 0.6.2-18.el7 base
</pre></td></tr></tbody></table>
如上所示,所以可升级者有 pam 这两个软件,完全没有安装的则是 pam-devel 等其他几个软件啰!
</div>
</td></tr></tbody></table>
<ul class="toplist"><li>安装/升级功能:yum [install|update] 软件</li></ul>
<p>既然可以查找,那么安装与升级呢?很简单啦!就利用 install 与 update 这两项工作来处理即可喔!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">yum [option] [安装与升级的工作项目] [相关参数]</span>
<span class="term_say">选项与参数:
install :后面接要安装的软件!
update :后面接要升级的软件,若要整个系统都升级,就直接 update 即可</span>
<span class="term_hd">范例一:将前一个练习找到的未安装的 pam-devel 安装起来</span>
[root@study ~]# <span class="term_command">yum install pam-devel</span>
Loaded plugins: fastestmirror, langpacks <span class="term_note"># 首先的 5 行在找出最快的 yum server</span>
Loading mirror speeds from cached hostfile
* base: ftp.twaren.net
* extras: ftp.twaren.net
* updates: ftp.twaren.net
Resolving Dependencies <span class="term_note"># 接下来先处理『属性相依』的软件问题</span>
--> Running transaction check
---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be installed
--> Processing Dependency: pam(x86-64) = 1.1.8-12.el7_1.1 for package: pam-devel-
1.1.8-12.el7_1.1.x86_64
--> Running transaction check
---> Package pam.x86_64 0:1.1.8-12.el7 will be updated
---> Package pam.x86_64 0:1.1.8-12.el7_1.1 will be an update
--> Finished Dependency Resolution
Dependencies Resolved
<span class="term_say"># 由上面的检查发现到 pam 这个软件也需要同步升级,这样才能够安装新版 pam-devel 喔!
# 至于底下则是一个总结的表格显示!</span>
==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Installing:
pam-devel x86_64 1.1.8-12.el7_1.1 updates 183 k
Updating for dependencies:
pam x86_64 1.1.8-12.el7_1.1 updates 714 k
Transaction Summary
==========================================================================================
Install 1 Package <span class="term_note"># 要安装的是一个软件</span>
Upgrade ( 1 Dependent package) <span class="term_note"># 因为相依属性问题,需要额外加装一个软件!</span>
Total size: 897 k
Total download size: 183 k <span class="term_note"># 总共需要下载的容量!</span>
Is this ok [y/d/N]: <span class="term_command">y</span> <span class="term_note"># 你得要自己决定是否要下载与安装!当然是 y 啊!</span>
Downloading packages: <span class="term_note"># 开始下载啰!</span>
warning: /var/cache/yum/x86_64/7/updates/packages/pam-devel-1.1.8-12.el7_1.1.x86_64.rpm:
Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for pam-devel-1.1.8-12.el7_1.1.x86_64.rpm is not installed
pam-devel-1.1.8-12.el7_1.1.x86_64.rpm | 183 kB 00:00:00
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : "CentOS-7 Key (CentOS 7 Official Signing Key) <[email protected]>"
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-1.1503.el7.centos.2.8.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]: <span class="term_command">y</span> <span class="term_note"># 只有在第一次安装才会出现这个项目『确定要安装数字签章』才能继续!</span>
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Updating : pam-1.1.8-12.el7_1.1.x86_64 1/3
Installing : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3
Cleanup : pam-1.1.8-12.el7.x86_64 3/3
Verifying : pam-1.1.8-12.el7_1.1.x86_64 1/3
Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 2/3
Verifying : pam-1.1.8-12.el7.x86_64 3/3
Installed:
pam-devel.x86_64 0:1.1.8-12.el7_1.1
Dependency Updated:
pam.x86_64 0:1.1.8-12.el7_1.1
Complete!
</pre></td></tr></tbody></table>
<p>有没有很高兴啊!你不必知道软件在哪里,你不必手动下载软件,你也不必拿出原版光盘出来 mount
之后查找再安装!全部不需要,只要有了 yum 这个家伙,你的安装、升级再也不是什么难事!
而且还能主动的进行软件的属性相依处理流程,如上所示,一口气帮我们处理好了所有事情!
是不是很过瘾啊!而且整个动作完全免费!够酷吧!</p>
<ul class="toplist"><li>移除功能:yum [remove] 软件</li></ul>
<p>那能不能用 yum 移除软件呢?将刚刚的软件移除看看,会出现啥状况啊?</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">yum remove pam-devel</span>
Loaded plugins: fastestmirror, langpacks
Resolving Dependencies <span class="term_note"><==同样的,先解决属性相依的问题</span>
--> Running transaction check
---> Package pam-devel.x86_64 0:1.1.8-12.el7_1.1 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
==========================================================================================
Package Arch Version Repository Size
==========================================================================================
Removing:
pam-devel x86_64 1.1.8-12.el7_1.1 @updates 528 k
Transaction Summary
==========================================================================================
Remove 1 Package <span class="term_note"># 还好!没有相依属性的问题,仅移除一个软件!</span>
Installed size: 528 k
Is this ok [y/N]: <span class="term_command">y</span>
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Erasing : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1
Verifying : pam-devel-1.1.8-12.el7_1.1.x86_64 1/1
Removed:
pam-devel.x86_64 0:1.1.8-12.el7_1.1
Complete!
</pre></td></tr></tbody></table>
<p>连移除也这么简单!看来,似乎不需要 rpm 这个指令也能够快乐的安装所有的软件了!
虽然是如此,但是 yum 毕竟是架构在 rpm 上面所发展起来的,所以,鸟哥认为你还是得需要了解 rpm
才行!不要学了 yum 之后就将 rpm 的功能忘记了呢!切记切记!</p>
<br></div><br>
<a id="yumclient_config"></a>
<div class="block2"><div class="gototop"><a href="0520rpm_and_srpm.html#top">Top</a></div>
<h2>22.3.2 yum 的设置档</h2>
<p>虽然 yum 是你的主机能够连接上 Internet 就可以直接使用的,不过,由于 CentOS 的映射站台可能会选错,
举例来说,我们在台湾,但是 CentOS 的映射站台却选择到了大陆北京或者是日本去,有没有可能发生啊!
有啊!鸟哥教学方面就常常发生这样的问题,要知道,我们连接到大陆或日本的速度是非常慢的呢!那怎办?
当然就是手动的修改一下 yum 的设置档就好啰!</p>
<p>在台湾,CentOS 的映射站台主要有高速网络中心与义守大学,鸟哥近来比较偏好高速网络中心,
似乎更新的速度比较快,而且连接台湾学术网络也非常快速哩!因此,鸟哥底下建议台湾的朋友使用高速网络中心的
ftp 主机资源来作为 yum 服务器来源喔!不过因为鸟哥也在昆大服务,昆大目前也加入了 CentOS 的映射站,
如果在昆山或台南地区,也能够选择昆大的 FTP 喔!目前高速网络中心与昆大对于 CentOS 所提供的相关网址如下:</p>
<ul>
<li><a href="http://ftp.twaren.net/Linux/CentOS/7/" target="_blank">http://ftp.twaren.net/Linux/CentOS/7/</a></li>
<li><a href="http://ftp.ksu.edu.tw/FTP/CentOS/7/" target="_blank">http://ftp.ksu.edu.tw/FTP/CentOS/7/</a></li>
</ul>
<p>如果你连接到上述的网址后,就会发现里面有一堆链接,那些链接就是这个 yum 服务器所提供的软件库了!
所以高速网络中心也提供了 centosplus, cloud, extras, fasttrack, os, updates 等软件库,最好认的软件库就是
os (系统缺省的软件) 与 updates (软件升级版本) 啰!由于鸟哥在我的测试用主机是利用 x86_64 的版本,
因此那个 os 再点进去就会得到如下的可提供安装的网址:</p>
<ul><li><a href="http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/" target="_blank">http://ftp.ksu.edu.tw/FTP/CentOS/7/os/x86_64/</a></li></ul>
<p>为什么在上述的网址内呢?有什么特色!<span class="text_import2">最重要的特色就是那个『 repodata
』的目录!该目录就是分析 RPM 软件后所产生的软件属性相依数据放置处!</span>因此,当你要找软件库所在网址时,
最重要的就是该网址底下一定要有个名为 repodata 的目录存在!那就是软件库的网址了!
其他的软件库正确网址,就请各位看倌自行寻找一下喔!现在让我们修改设置档吧!</p>
<table class="term"><tbody><tr><td class="term"><pre>[root@study ~]# <span class="term_command">vim /etc/yum.repos.d/CentOS-Base.repo</span>
[base]