程序包管理: 源码安装 rpm & yum

程序包管理: 源码安装 rpm & yum

操作系统上的程序都是程序员通过工具开发出来的,程序员直接编写的文本称为源码,计算机只能识别二进制文件,所以程序员编好的源码要能在计算机上运行需编译为二进制文件。

通过源码来安装首先要部署好系统环境,然后将源码编译为二进制文件,然后再将二进制文件及运行该程序的一些配置文件放到指定的目录下,这对于没有编程经验的人来说是很痛苦的一件事。系统厂商为了解决编译所给客户带来的麻烦,在与我们相同的系统环境上完成编译,并将二进制文件,配置文件,程序安装默认路径,程序相关信息打包压缩到一个文件中,发布到网络上或光盘中提供给用户下载,用户只需要将该文件下载下来,用系统厂商提供的安装工具进行安装即可完成软件的部署。对于CentOS系统,给系统厂商给我们提供的编译好的程序是以.rpm结尾的压缩文件,安装工具有rpmyum,两者的关系后文件介绍。

源码安装

在网络上有很多开源程序是通过源码的方式发布的,若此时又没有编译好的压缩包,或者未针对我们使用的系统编译的程序包,那我们只能自己下载源码,自己编译。

我们以一个C语言编写的源码为例演示,程序开发、编译、运行的过程

编译过程如下:
程序源码(hello.c) --预处理--> 预处理程序(hello.i) --编译--> 汇编程序(hello.s) --汇编--> 目标程序--链接--> 可执行文件

首先安装好c语言编译工具gcc,gcc可以将源码一步就编译为可执行文件,但此处为了演示编译的过程,我们按上面的编译过程分步操作。

[root-yum.repos.d] $ yum -y install gcc  

上面是通过yum工具安装gcc编译工具,对于yum安装的方式后文介绍

a. C语言源码
我们用C语言,打印一句经典的话”hello world!”

[root-c] $ cat hello.c 
#include <stdio.h> //声明头文件

int main() //程序入口
{
printf("hello world!\n"); //打印"hello world!"
return 0;
}

b. 预处理
gcc中 -E选项是用来生成预处理程序

[root-c] $ gcc -E hello.c -o hello.i
[root-c] $ ls
hello.c hello.i
--------------------------------------------
[root-c] $ cat hello.i
# 1 "hello.c"
# 1 "<built-in>"

。。。 <=中间省略若干句

extern struct _IO_FILE_plus _IO_2_1_stdin_;
extern struct _IO_FILE_plus _IO_2_1_stdout_;
extern struct _IO_FILE_plus _IO_2_1_stderr_;
# 339 "/usr/include/libio.h" 3 4

# 2 "hello.c" 2

int main()
{
printf("hello world!\n");
return 0;
}

经过预处理,源码中指定的头文件stdio.h内容插入到了源码中

c. 编译
gcc -S选项将程序编译为汇编程序

[root-c] $ gcc -S hello.i -o hello.s

编译为汇编程序,此时仍然是文本文件,只不过为是汇编语法,若对AT&T汇编不了解的童鞋们注意,此处语法是AT&T汇编,而不是Intel汇编,编译后的程序如下

[root-c] $ cat hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "hello world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-11)"
.section .note.GNU-stack,"",@progbits

d. 汇编
此步将汇编语言编译为目标文件,目标文件将是二进制文件而不再是文本文件
gcc -c选项将汇编语言编译为目标二进制文件

[root-c] $ gcc -c hello.s -o hello.o

e. 链接
汇编后的目标二进制文件仍然不能运行,因为该二进制文件需调用系统上的其它二进制库文件才能够运行,所以我们还需通过链接将需要的库文件或库文件路径编译到程序中,才可执行

[root-c] $ gcc hello.o -o hello

#我们可通过ldd查看链接过程中处理了哪些动态链接库的依赖,即运行我们所编的程序需调用下面这些动态链接库
[root-c] $ ldd hello
linux-vdso.so.1 => (0x00007ffc8c9d6000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe0085a7000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe00897c000)

f. 执行
现在就可以执行我们编译好的最终可执行文件hello

[root-c] $ ./hello 
hello world!

如上所示,得到了预期的结果

对于复制的程序,编译的不止一个文件,可能需将多个源码编译为一个或多个可执行文件,然后将这些文件放到规划的目录下。

静态链接 与 动态链接
上面的编译过程最后一步通过链接处理好了可执行文件与所依赖的库文件的关系。此过程链接可分为两种,静态链接和动态链接,区别如下:

  • 静态链接是把库文件直接复制一份编译到目标文件中,好处是静态库丢失了也不影响其运行,但缺点也很明显,可执行文件太大,升级难(库文件变化了,得重新编译)
  • 动态链接是告诉可执行文件动态库的位置在何处,只是把链接编译到目标文件中,这样编译出来的可执行文件小,升级方便。可执行文件运行时才调用动态库。

make
上面我们演示了编译一个极其简单的c源码的过程,实际开发项目中源码数量会成千上万,程序之间还存在依赖关系,一个一个的编译源码是不可能完成的一件任务。GNU make方便的解决了此问题,我们先编写一个Makefile的脚本,将所有编译的过程等规则定义好,然后执行make命令就可以生成可执行文件

Makefile的规则

    [目标] : [前提] <=此行前面无空格
[命令] <=此行前面为一个tab键

实例
下面演示编写一个Makefile文件,然后执行make命令生成最终的可执行文件

  1. 准备工作 : 安装make工具,准备好C语言源码

安装make工具

[root@centos6 c]# yum install -y make

C源码
准备了三个C源码文件,hello.c包含main()函数,即程序入口,print_c和sum_num.c为两个函数,hello.c执行将调用这两个函数,我们的目的是将这三个C源码编译为一个可执行文件hello。

[root@centos6 c]# ls 
hello.c print.c sum_num.c <= 三个C源码

#程序入口源码hello.c,调用两个函数完成工作
[root@centos6 c]# cat hello.c
#include <stdio.h>
int main()
{
int result;

// Call function print()
print();

// Call functon sum_num()
result=sum_num();
printf("sum=%d\n",result);
return 0;
}

#函数print.c 打印一句话
[root@centos6 c]# cat print.c
#include <stdio.h>

void print()
{
printf("hello everyone\n");
}

[root@centos6 c]# cat sum_num.c
#include <stdio.h>

#函数sum_num() 计算1到100的和
int sum_num()
{
int sum=0;
int i;

for(i=1;i<=100;i++)
{
sum=sum+i;
}

return sum;
}

编写 Makefile 文件
要得到可执行文件hello,我们需要对象文件,要的到对象文件,我们需要C源码及相应的头文件,Makefile就是按照这样的顺编写规则的

[root@centos6 c]# cat Makefile 
hello : hello.o print.o sum_num.o
gcc hello.o print.o sum_num.o -o hello
hello.o : hello.c
gcc -c hello.c -o hello.o
print.o : print.c
gcc -c print.c -o print.o
sum_num.o : sum_num.c
gcc -c sum_num.c -o sum_num.o
clean : <=将产生的中间文件删除的规则
rm hello.o print.o sum_num.o

当前目录下执行make命令生成可执行文件
本列子中需将源码,Makefile放在同一个目录下,执行make命令也在该目录下

[root@centos6 c]# ls
hello.c Makefile print.c sum_num.c

[root@centos6 c]# make <= 执行make命令
gcc -c hello.c -o hello.o
gcc -c print.c -o print.o
gcc -c sum_num.c -o sum_num.o
gcc hello.o print.o sum_num.o -o hello

[root@centos6 c]# ls <=生成了可执行文件和中间文件
hello hello.c hello.o Makefile print.c print.o sum_num.c sum_num.o

[root@centos6 c]# make clean <=删除中间文件
rm hello.o print.o sum_num.o
[root@centos6 c]# ls
hello hello.c Makefile print.c sum_num.c

[root@centos6 c]# ./hello 执行生成的可执行文件,得到了预期的结果
hello everyone
sum=5050

实际项目中安装源码
如上所描述,我们只需要编写好Makefile文件,执行make命令就可以将复杂的源码生成可执行文件。但源码过多,依赖过于复杂,编写Makefile文件也是一件痛苦的事。程序员通常使用一些自动化工具automake,autoconf等来完成Makefile文件的编写。

源码开发商通常帮我们解决了上述问题,我们得到一个C源码通常按下面的三个步骤即可完成程序的编译和安装

  • ./configure
    configure脚本通过选项传递参数,所传递的参数有安装路径,启用特性等
    configure通过传递进来的参数,然后根据Makefile.in模板生成Makefile文件
  • make
    make命令根据上一步生成的Makefile文件编译程序
  • make install
    将上一步生成的可执行命令复制到Makefile指定的路径中

限于篇幅,源码安装的实验将另外写一篇博客,请网友们看后文喔!!!

rpm

通过源码安装对没有编程经验的用户是一个极大的挑战,其次编译好的可执行程序也不便于管理。比如安装时若可执行文件放的位置不规范,或者过段时间忘记放到哪里了,这对于升级,卸载,查看该程序的信息都是一件麻烦事。对于CentOS系统提供了编译好的rpm包(包内包含了程序的二进制文件,帮助文档,配置文件、库文件),在本地建立rpm仓库保存软件的安装时间,位置,更新等信息。

rpm包实现的机制是,在本地/var/lib/rpm/目录下建立数据库,记录软件的安装、更新、卸载时间,安装位置,rpm包所包含的脚本,库,二进制文件等信息。程序包的生命周期均可通过数据库进行查询,其中/var/lib/rpm/Packages文件是生成其它数据库文件的模板,删除其它文件后仍可以通过rpm --rebuilddb重建得到其它数据库文件。

安装rpm包

  • rpm {-i | –install} [install-options] PACKAGE_FILE …

常用的 [install-options] 选项

-v, -vv
-h
–test #测试模拟安装,不执行真正的安装
–nodeps #不考虑软件包的依赖关系,强制安装,此种方法可能安装了软件也使用不了
–replacepkgs | –replacefiles #覆盖安装,即使已经安装了也可以再次安装
–nodigist #不检查包的完整性
–noscripts #不执行程序包中的脚本文件

实例1 安装rpm包

# 安装软件
[root@zhubiaook Packages]# rpm -qa tree
[root@zhubiaook Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:tree ########################################### [100%]

# 再次安装时提示软件包已安装
[root@zhubiaook Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm
Preparing... ########################################### [100%]
package tree-1.5.3-3.el6.x86_64 is already installed
# 使用 --replacepkgs | --replacefiles覆盖安装
[root@zhubiaook Packages]# rpm -ivh --replacepkgs tree-1.5.3-3.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:tree ########################################### [100%]

实例2 安装有依赖关系的rpm包

  1. 安装autofs时提示该包依赖于动态库 libhesiod.so.0()(64bit)
[7@root Packages]# rpm -ivh autofs-5.0.7-56.el7.x86_64.rpm 
error: Failed dependencies:
libhesiod.so.0()(64bit) is needed by autofs-1:5.0.7-56.el7.x86_64
  1. 查找动态库libhesiod.so.0()(64bit)文件在哪个程序包中
[root@centos6 Packages]# rpm -qa autofs <=找一台安装了autofs的计算机
autofs-5.0.5-132.el6.x86_64
[root@centos6 Packages]# ldconfig -p | grep libhesiod.so.0 <=搜索动态库libhesiod.so.0的安装位置
libhesiod.so.0 (libc6,x86-64) => /usr/lib64/libhesiod.so.0
[root@centos6 Packages]# rpm -qf /usr/lib64/libhesiod.so.0 <=查看其由哪个rpm包安装得来
hesiod-3.1.0-19.el6.x86_64
  1. 安装包含动态库libhesiod.so.0()(64bit)文件的程序包hesiod-3.1.0-19.el6.x86_64
[7@root Packages]# rpm -ivh hesiod-3.2.1-3.el7.x86_64.rpm 
Preparing... ################################# [100%]
Updating / installing...
1:hesiod-3.2.1-3.el7 ################################# [100%]

  1. 再次安装autofs就能够成功安装
[7@root Packages]# rpm -ivh autofs-5.0.7-56.el7.x86_64.rpm 
Preparing... ################################# [100%]
Updating / installing...
1:autofs-1:5.0.7-56.el7 ################################# [100%]
[7@root Packages]# rpm -qa autofs
autofs-5.0.7-56.el7.x86_64

从上面的例子中可以看出使用rpm包安装有依赖关系的软件时,虽然可以安装提示把依赖包找到并完成安装,但是也极度不方便,特别是遇到依赖关系过多的软件,像这种情况有更好的解决方案,使用yum安装。


升级rpm包

  • rpm {-U | –upgrade} [install-options] PACKAGE_FILE …
  • rpm {-F | –freshen} [install-options] PACKAGE_FILE …

–upgrade #升级或安装软件,若软件存则升级,不存在则安装
–freshen #只升级,若软件存在则升级,不存在则什么都不做

常用选[install-options]选项

-v
-h
–oldpackage 降级程序包
–force 强制安装

实例1 降级安装vsftpd,然后再将其升级安装
我的当前实验系统为CentOS6.9, 先准备CentOS6.9和CentOS6.8的安装光盘,并将其都挂载到系统上

#将CentOS6.8的光盘挂载到/mnt/cd2目录下
[root@centos6 Packages]# echo "- - -" > /sys/class/scsi_hots/host2/scan
[root@centos6 Packages]# mkdir /mnt/cd2
[root@centos6 Packages]# mount /dev/sr1 /mnt/cd2
mount: block device /dev/sr1 is write-protected, mounting read-only

#当前系统为CentOS6.9
[root@centos6 cd2]# cat /etc/centos-release
CentOS release 6.9 (Final)
#查看挂载的光盘的版本为CentOS6.8
[root@centos6 cd2]# head RELEASE-NOTES-en-US.html | grep "CentOS"
<title>CentOS 6.8 Release Notes</title>
Copyright (C) 2003-2016 The CentOS Project<br>

#降级安装vsfptd
[root@centos6 Packages]# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64 <=当前的vsftpd版本为2.2.2-24
[root@centos6 Packages]# rpm -U vsftpd-2.2.2-21.el6.x86_64.rpm <=直接更新2.2.2-21的
package vsftpd-2.2.2-24.el6.x86_64 (which is newer than vsftpd-2.2.2-21.el6.x86_64) is already installed <=提示已经安装了更新的版本
[root@centos6 Packages]# rpm -U --oldpackage vsftpd-2.2.2-21.el6.x86_64.rpm <=加 --oldpackage选项降级安装
[root@centos6 Packages]# rpm -q vsftpd
vsftpd-2.2.2-21.el6.x86_64 <=成功降级的2.2.2-21版本

#升级vsftpd
[root@centos6 Packages]# cd /mnt/cd/Packages/ <=切换目录到CentOS6.9的安装光盘中
[root@centos6 Packages]# ls vsftpd-2.2.2-24.el6.x86_64.rpm <=有更新的版本
vsftpd-2.2.2-24.el6.x86_64.rpm
[root@centos6 Packages]# rpm -F vsftpd-2.2.2-24.el6.x86_64.rpm <=使用-F升级
[root@centos6 Packages]# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64 <=成功升级

实例2 安装两个内核
当前系统环境为CentOS6.9, 我们再挂载一张CentOS6.8的光盘,当前系统中内核的版本为[root@centos6 Packages]# uname -r => 2.6.32-696.el6.x86_64

两张光盘中的内核版本分别如下所示

[root@centos6 Packages]# ls /mnt/cd/Packages/kernel-2.6.32-696.el6.x86_64.rpm 
/mnt/cd/Packages/kernel-2.6.32-696.el6.x86_64.rpm <=CentOS6.9
[root@centos6 Packages]# ls /mnt/cd2/Packages/kernel-2.6.32-642.el6.x86_64.rpm
/mnt/cd2/Packages/kernel-2.6.32-642.el6.x86_64.rpm <=CentOS6.8

我们演示再安装一个2.6.32-642.el6.x86_64的内核,然后将较新的内核卸载,然后将旧内核升级到新版内核

[root@centos6 Packages]# rpm -q kernel
kernel-2.6.32-696.el6.x86_64 <=当前只安装了2.6.32-696的内核
#再安装一个内核
[root@centos6 Packages]# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm --force
Preparing... ########################################### [100%]
1:kernel ########################################### [100%]
[root@centos6 Packages]# rpm -q kernel
kernel-2.6.32-696.el6.x86_64 <=两个内核同时存在
kernel-2.6.32-642.el6.x86_64
#此时重启系统就可以选择任意一个内核进入系统

#将新版内核卸载了
[root@centos6 Packages]# rpm -e kernel-2.6.32-696.el6.x86_64 --nodeps
warning: erase unlink of /lib/modules/2.6.32-696.el6.x86_64/modules.order failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-696.el6.x86_64/modules.networking failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-696.el6.x86_64/modules.modesetting failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-696.el6.x86_64/modules.drm failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-696.el6.x86_64/modules.block failed: No such file or directory
#有警告信息,但仍然能卸载
[root@centos6 Packages]# rpm -q kernel
kernel-2.6.32-642.el6.x86_64

#升级内核
[root@centos6 Packages]# cd /mnt/cd/Packages/
[root@centos6 Packages]# rpm -U kernel-2.6.32-696.el6.x86_64.rpm
warning: erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.order failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.networking failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.modesetting failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.drm failed: No such file or directory
warning: erase unlink of /lib/modules/2.6.32-642.el6.x86_64/modules.block failed: No such file or directory
[root@centos6 Packages]# rpm -q kernel
kernel-2.6.32-696.el6.x86_64

一般情况不要对内核做升级处理,有新内核可以直接安装,系统可以同时存在多个内核

查询rpm包

  • rpm {-q |–query} [select-options] [query-options]

常用选项

-a #查询所有已经安装了得rpm包
-p pacakage_file #对未安装的程序包做查询
-f file #查询命令是由哪个程序包安装而来,指定完整命令路径名
-l pacakge | package_file 列出程序包所包含的文件或安装到系统的位置
-c package | package_file 查询程序包中的配置文件或配置文件安装的位置
–scripts package | package_file 查询程序包中的脚本文件
-i package | package_file 查询程序的详细信息
-d package | package_file 查询程序包中的帮助文档
–whatprovides package 查询程序包是由哪个包文件提供
–whatrequires package 查询那些程序包依赖于本程序包
-R package | packages 查询程序包所依赖的命令,库,文件

常用组合

只要是查询包文件就加上-p选项

实例1 查询vsftpd

#查询是否按照了vsftpd
[root@centos6 Packages]# rpm -q vsftpd
vsftpd-2.2.2-24.el6.x86_64
[root@centos6 Packages]# rpm -qa "vsft*"
vsftpd-2.2.2-24.el6.x86_64

#查询vsftpd的配置文件位置
[root@centos6 Packages]# rpm -qc vsftpd
/etc/logrotate.d/vsftpd
/etc/pam.d/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf

#查询vsftpd中的脚本文件
[root@centos6 Packages]# rpm -q --scripts vsftpd
postinstall scriptlet (using /bin/sh):
/sbin/chkconfig --add vsftpd
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
/sbin/service vsftpd stop > /dev/null 2>&1
/sbin/chkconfig --del vsftpd
fi

#查询帮助文档的位置
[root@centos6 Packages]# rpm -qd vsftpd
/usr/share/doc/vsftpd-2.2.2/AUDIT
/usr/share/doc/vsftpd-2.2.2/BENCHMARKS
/usr/share/doc/vsftpd-2.2.2/BUGS
/usr/share/doc/vsftpd-2.2.2/COPYING

#查询包中的所有文件
[root@centos6 Packages]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.5.3
/usr/share/doc/tree-1.5.3/LICENSE
/usr/share/doc/tree-1.5.3/README
/usr/share/man/man1/tree.1.gz

#查询所依赖的包,库
[root@centos6 Packages]# rpm -qR 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


校验rpm包的完整性

  • rpm -V [select-options] [verify-options] 校验包的合法性
  • rpm -K pakage_file 校验包的完整性
  • rpm –import gpg-key 导入公钥

实例1 导入公钥
可以从本地目录/etc/pki/rpm-gpg/目录里导入
也可以从安装光盘里导入
第三方软件提供商处导入

#从本地目录里导入
[root@centos6 app]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
[root@centos6 app]# rpm -qa "gpg-pubkey"
gpg-pubkey-c105b9de-4e0fd3a3

#从光盘里导入
#[root@centos6 app]# rpm --import /mnt/cd/RPM-GPG-KEY-CentOS-6

yum

源码安装软件,不借助make等工具简直无法完成,使用rpm包安装虽然解决了源码安装的痛苦,但对于有依赖关系的的软件包仍然是一件麻烦事,使用yum安装软件解决了前面的所有麻烦。

  • yum [options] [command] package…

常用选项

install 安装
reinstall 重新安装
list [all | available | installed] 列出所有,可安装或已安装的的软件包
remove | erase 卸载软件
repolist 列出yum仓库
clean all 清空本地所有缓存
upgrade 升级
downgrade 降级
groupinstall 安装包文件
grouplist 列出包文件
groupremove 卸载包文件

但使用yum安装软件之前需要配置好本地仓库指向的yum源的地址,yum配置文件路径

  1. 本地yum仓库提供配置文件位置
    /etc/yum.repos.d/
  2. yum公共配置文件
    /etc/yum.conf
  3. 本地yum缓存位置
    /var/cache/yum/

通过yum安装程序包的流程图如下所示

Alt text

本地客户端与远程仓库之间可以通过以下协议进行数据的传输

  • http
  • https
  • ftp
  • file

实验

实验一 建立yum服务端
a. 通过ftp提供网络传输
b. 服务端yum源中的yum包和repodata由光盘提供

yum服务端:172.18.17.12
本地客户端:172.18.17.20

下面为yum服务端的配置

  1. 关闭防火墙和SElinux

关闭防火墙iptables(CentOS6), firewalld(CentOS7)

CentOS6系统关闭防火墙iptables服务,并禁止启动

# 查看防火墙的开启状态
[root@z10 ~]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
...

#将防火墙关闭
[root@z10 ~]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules:

#确认是否关闭
[root@z10 ~]# service iptables status
iptables: Firewall is not running.

#检查防火墙是否为开机自动启动
[root@z10 ~]# chkconfig --list | grep iptables
iptables 0:off 1:off 2:on 3:on 4:on 5:on 6:off

#禁止开机自动启动
[root@z10 ~]# chkconfig iptables off

#确认是否已禁止
[root@z10 ~]# chkconfig --list | grep iptables
iptables 0:off 1:off 2:off 3:off 4:off 5:off 6:off

CentOS7系统关闭防火墙firewalld服务,并禁止启动

#检查防火墙firewalld状态
[7@root Packages]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Sat 2017-08-05 17:01:27 CST; 58s ago
...

#将防火墙firewalld关闭
[7@root Packages]# systemctl stop firewalld

#确认防火墙firewalld是否已关闭
[7@root Packages]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled) <=开机仍然启动
Active: inactive (dead) since Sat 2017-08-05 17:02:42 CST; 6s ago <=服务已停止
...

#禁止防火墙开机启动
[7@root Packages]# systemctl disable firewalld
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

#确认是否已禁止
[7@root Packages]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled;<=已禁止 vendor preset: enabled)
Active: inactive (dead)

关闭SElinux

#查看SElinux状态
[root@centos6 app]# getenforce
Enforcing

#将其停止
[root@centos6 app]# setenforce 0

#确认是否停止
[root@centos6 app]# getenforce
Permissive

#修改配置文件,禁止开机启动
[root@centos6 app]# vim /etc/selinux/config
[root@centos6 app]# cat /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive <=改为permissive开机禁止启动,enforcing是启动
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
  1. 安装vsftpd服务
    挂载安装光盘,通过rpm安装
#检查光盘未挂载
[root@zhubiaook ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 3.7G 0 rom
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 48.8G 0 part /
├─sda3 8:3 0 4G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 46.2G 0 part /app

#挂载光盘
[root@zhubiaook ~]# mount -t iso9660 /dev/sr0 /mnt/cd/
mount: block device /dev/sr0 is write-protected, mounting read-only

#安装vsftpd
[root@zhubiaook ~]# cd /mnt/cd/Packages/
[root@zhubiaook Packages]# rpm -ivh vsftpd-2.2.2-24.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:vsftpd ########################################### [100%]
[root@zhubiaook Packages]#
  1. 启动vsftpd服务
#检查vsftpd服务状态
[root@zhubiaook Packages]# service vsftpd status
vsftpd is stopped

#启动vsftpd服务
[root@zhubiaook Packages]# service vsftpd start
Starting vsftpd for vsftpd: [ OK ]
[root@zhubiaook Packages]# service vsftpd status
vsftpd (pid 1703) is running...

#开机启动vsftpd
[root@zhubiaook Packages]# chkconfig --list | grep vsftpd
vsftpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@zhubiaook Packages]# chkconfig vsftpd on
[root@zhubiaook Packages]# chkconfig --list | grep vsftpd
vsftpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
  1. 测试客户端是否能够通过ftp访问yum服务端
    在本地客户端执行ftp 172.18.17.12,账户名输入 ftp, 密码为空,直接回车
[7@root mnt]# ftp 172.18.17.12
Connected to 172.18.17.12 (172.18.17.12).
220 (vsFTPd 2.2.2)
Name (172.18.17.12:root): ftp <=账户名输入ftp
331 Please specify the password.
Password: <=密码为空,回车即可
230 Login successful. <=成功登陆
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (172,18,17,12,159,157).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Mar 22 12:14 pub
226 Directory send OK.
quit <=输入quit退出
  1. 准备rpm包
    我们准备yum仓库为CentOS6.9和CentOS7.3提供yum源,将这两张的光盘Pacakages和repodata复制到规划的目录下面

目录结构如下所示

[6@zhubiao ftp]$ pwd
/var/ftp
[6@zhubiao ftp]$ tree centos
centos
├── 6
└── 7

将光盘中的repodata和Pacakages内容复制到相应的目录下, CentOS6.9的复制到/var/ftp/centos/6/ 下,CentOS7.3的复制到/var/ftp/centos/7/下

#挂载光盘
[6@zhubiao 7]$ sudo mount /dev/sr1 /mnt/cd2
[sudo] password for zhubiao:
mount: block device /dev/sr1 is write-protected, mounting read-only

#复制CentOS73.光盘的内容,CentOS6.9的操作一样
[6@zhubiao 7]$ sudo cp -r /mnt/cd2/{repodata,Packages} /var/ftp/centos/7/

#复制完成
[6@zhubiao 7]$ ls
Packages repodata
  1. 配置客户端
    客服端主要配置全局配置文件/etc/yum.conf 和在/etc/yum.repos.d/ 目录下建立本地仓库

建立本地仓库

[7@root yum.repos.d]# cd /etc/yum.repos.d/

#为了避免干扰,将本地仓库中原有的*.repo仓库移到其他目录下备份起来
#新建本地仓库ftp.repo
[7@root yum.repos.d]# vim ftp.repo
[7@root yum.repos.d]# cat ftp.repo
[zhubiao] <=定义yum ID,名字必须是单个单词
name=zhubiao-repo <=描述
baseurl=ftp://172.18.17.12/centos/$releasever/ <=远程仓库路径
gpgcheck=1 <=是否启用rpm包来源的合法性
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever <=公钥路径

清空本地缓存,并测试

#清空本地缓存
[7@root yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: zhubiao
Cleaning up everything
Cleaning up list of fastest mirrors

#查看本地仓库,成功建立
[7@root yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
zhubiao | 3.6 kB 00:00
(1/2): zhubiao/7/group_gz | 155 kB 00:00
(2/2): zhubiao/7/primary_db | 5.6 MB 00:00
Determining fastest mirrors
repo id repo name status
zhubiao/7 zhubiao-repo 9,363
repolist: 9,363

#测试安装autofs
[7@root yum.repos.d]# rpm -q autofs
package autofs is not installed <=未安装
[7@root yum.repos.d]# yum -y install autofs > /dev/null ; rpm -q autofs
autofs-5.0.7-56.el7.x86_64 <=成功安装

实验二 配置服务端yum源

  • 通过http协议提供网络传输服务
  • rpm来自于第三方
  • 通过createrepo创建repodata

实验环境同实验一

  1. 关闭防火墙和SElinux,方法同实验一

  2. 安装httpd服务

[6@zhubiao yum.repos.d]$ sudo yum -y install httpd
  1. 启动httpd服务, 并设置开机自动启动
#启动httpd服务
[6@zhubiao yum.repos.d]$ sudo service httpd start

#设置开机自动启动
[6@zhubiao yum.repos.d]$ sudo chkconfig httpd on
  1. 测试客户端是否能通过http服务访问yum服务端
#先在yum服务端/var/www/html/目录下创建一个简单的主页用于测试
[6@zhubiao html]$ cd /var/www/html/
[6@zhubiao html]$ cat index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>zhubiao|weclome</title>
</head>
<body>
<h1>Weclome to my web home</h1>
<p>
Yesterday's home runs don't win today's games
<p>

</body>
</html>

测试结果如下所示,能在客户端成功访问yum服务端

Alt text

  1. 规划服务端yum源目录
[6@zhubiao html]$ mkdir -p epel/{6,7}
[6@zhubiao html]$ tree
.
├── epel
│ ├── 6
│ └── 7
└── index.html
  1. 将第三方rpm包复制到相应目录下, 此处为了测试,我从光盘里复制了几个rpm包放到/var/www/html/epel/7/目录下
[6@zhubiao html]$ cd /var/www/html/epel/7/
[6@zhubiao 7]$ ls
mysql-connector-java-5.1.25-3.el7.noarch.rpm tree-1.6.0-10.el7.x86_64.rpm
mysql-connector-odbc-5.2.5-6.el7.x86_64.rpm vsftpd-3.0.2-21.el7.x86_64.rpm
  1. 使用createrepo创建repodata
    createrepo 语法:createrepo [options] -o REPODATA RPM_DIR
#先安装createrepo
[6@zhubiao 7]$ sudo yum -y install createrepo

#创建repodata
[6@zhubiao 7]$ createrepo -o /var/www/html/epel/7/ /var/www/html/epel/7/
Spawning worker 0 with 4 pkgs
Workers Finished
Gathering worker results

Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

#查看以建立repodata
[6@zhubiao 7]$ ls
mysql-connector-java-5.1.25-3.el7.noarch.rpm tree-1.6.0-10.el7.x86_64.rpm
mysql-connector-odbc-5.2.5-6.el7.x86_64.rpm vsftpd-3.0.2-21.el7.x86_64.rpm
repodata
  1. 配置客户端并测试
    由于我们是在同一个客户端上做两个实验,为了避免混淆,将实验一种配的客户端ftp.repo禁用
[7@root yum.repos.d]# cat ftp.repo 
[zhubiao]
name=zhubiao-repo
baseurl=ftp://172.18.17.12/centos/$releasever/
enabled=0 <=禁用
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

添加本地仓库http.repo

[7@root yum.repos.d]# cat http.repo 
[http-repo]
name=http-repo
baseurl=http://172.18.17.12/epel/$releasever/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-$releasever

清空本地客户端缓存,并测试

#清空本地客户端缓存
[7@root yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Cleaning repos: http-repo
Cleaning up everything
Cleaning up list of fastest mirrors

#列出本地仓库
[7@root yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, langpacks
http-repo | 2.9 kB 00:00:00
http-repo/7/primary_db | 4.4 kB 00:00:00
Determining fastest mirrors
repo id repo name status
http-repo/7 http-repo 4
repolist: 4

#测试安装vsftpd, 如下测试成功
[7@root yum.repos.d]# rpm -q vsftpd
package vsftpd is not installed
[7@root yum.repos.d]# yum -y install vsftpd &>/dev/null; rpm -q vsftpd
vsftpd-3.0.2-21.el7.x86_64