操作系统只是一个监控程序它本身并不能完成特定的任务,所以我们需要的各种工能比如说web服务,DHCP,DNS,操作系统都不能独立给予实现,由此我们装完操作系统之后,要想进行生产性的工作,很显然要安装,要提供具有各种不同功能,能完成特定应用,这些都需要应用程序来完成。在linux诞生初期,各应用程序包括我们linux内核的管理都是非常简陋的,因为他们都遵循GPL协定,这些程序都是以源码的形式提供的,这些源码大部分都是C,C++的源代码。那这些源代码很显然是不可能在操作系统上运行起来的,在这种场景之下,我们要想安装操作系统怎么办?通常都是借助于其他主机来编译的。将目标主机的硬盘拆下来,使用gcc用目标的cpu架构为其编译成二进制格式,过程十分的繁琐。如果想要系统能够正常运行的话我们除了一些最最基础的应用程序安装之外,还必须得安装glibc,glibc:GNU标准的C库,linux中所用的应用程序都是调用标准的c库来研发(glibc),没有任何程序员是通过系统调用去研发操作系统的。因此C库很关键一般linux,windows,和unix都会提供c库,在Linux上还会安装一些基本的应用程序,由此我们都应该在宿主机编译完成,然后再放到目标主机的硬盘上,因此像这样繁琐的过程都是发行商来完成的。

       对于现代操作系统来讲我们底层的硬件是不允许应用程序直接访问的,进程是互相隔离运行的,所有对硬件资源的访问我们都要通过系统调用,通过内核来完成,内核将底层各种功能,包括驱动,文件系统,包括进程管理机制,都通过一个系统调用接口向上提供。由于系统调用做的过于底层了,所以我们开发了c库,所以在大多数程序员在开发程序时都是基于标准的c库来完成的.为了操作系统更加方便移植,在早期的unix操作系统之所以使用c语言去写,正是因为对这方面考虑之下.因此我们应用程序为了方便移植,这些c库是不是也要定义一个大家都遵循的规范?这个规范就叫做POSIX(POSIX: Portable Operatin System可移植操作系统,因此只要你这个操作系统遵循POSIX规范,那么无论实在windows研发,还是在linux上研发,或者实在unix上研发,他们在都可以夸平台应用,但夸平台指的是编译前的源代码,即便我们操作系统中的API都遵循POSIX规范,都能互相兼容地调用,(API: 兼容,意味开发接口库兼容,因此,源代码可跨平台),由于windows与linux,unix的二进制应用程序格式的不同,尽管大家的源代码都能够互相地迁移,但是我们在对应的操作系统平台之下给它制作成,编译成二进制格式之后,将无法再次跨平台.unix使用的二进制应用程序与linux也是一样的,如果库完全一样的情况下,unix,linux应用程序能够互相迁移.

       在开发应用程序的时候,都是调用这些标准C库来完成的glibc,库就是所谓的函数,而这些函数都在不同的文件中,它是一个个功能,一个个执行模块.库也必须是编译好的二进制格式.(库:可执行程序,本身不能作为程序执行入口,但可以被调用)如果我们在开发应用程序的时候指定我们需要调用那些库,一旦编译的时候,这个编译的过程,就必须能够执行的操作(包括链接)(程序:预编译、编译、汇编、链接)链接:就是让我们这个应用程序中间创建好符号列表告诉它调用的库在哪,叫什么名字。要到哪个路径下,找哪个库文

件把它们关联起来.由于在开发时调用了相关库的,在编译好了,发现程序又依赖某些库,这时候就必须把库加载内存当中,并作为自己可以访问的一部分,程序才能够运行起来.在程序汇编链接的时候,链接分为两种:静态编译,静态:当他需要哪个库的时候直接将那个库包含进这个可执行程序自身。(应用程序体积会变得非常大因为有些库是公共的谁都需),动态链接:(windows)dll, linux(lib,/usr/lib)so(shared object),就算硬件平台一样,操作系统一样,动态库不一样,编译好的应用程序也不能随意夸计算机.如果我们在自己计算机编译好的应用程序,想到其他主机上去运行,基本前提得把这个应用程序链接到各库同时能够保证在目标主机上能够提供.注意:1、OS平台:应用程序必须为特定平台所支持的版本;一般不能跨越发行商的版本 2、硬件平台:应用程序必须为特定的CPU所支持;


1、软件包的组成部分:

1、二进制程序/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin

假如:安装nginx, /usr/local/nginx/bin 需要在PATH路径中添加nginx可执行二进制程序的路径


2、库:系统默认会去这几个目录找应用程序的库文件:/lib, /usr/lib, /lib64, /usr/lib64, (/usr/local/lib, /usr/local/lib64)注释:这两个默认不会去找   假如:安装nginx, /usr/local/nginx/lib,lib64   /etc/ld.so.conf,   注释:修改应用程序的库文件到此处创建:/etc/ld.so.conf.d/*.conf

ldd命令:

查看应用所依赖的共享库

ldd [options] FILE...

wKiom1MKtbCwv3tNAAB6zSDJP_E728.jpg

0x....):是内存地址


第一行:这是一个所有以动态方式去调用其它库的入口.这个库直接写到程序里面的


第二行:指定了这个程序所调用的库

库的调用:执行时候的调用:是调用你编译好的可执行的二进制程序的共享库(调用ABI)

库的调用:开发时调用:是对你这应用程序库的使用格式的头文件的包含(名称,格式,风格)每个库中所包含文件的名称,参数的文件叫做头文件.    /usr/include (调用API)

3、配置文件/etc 你只要找到程序,程序自身就能够找到配置文件

4、帮助文件

man文件, info文件, README, INSTALL, ChangeLog

man COMMAND

到某路径下查找与命令名同名的通常以.gz结尾的压缩文件的名字

/usr/share/man/

添加帮助文件man的路径

wKioL1MKuLCC9gMWAACP2foZMHo933.jpg

vim  /etc/man.config

总结:/usr/local/nginx/ 二进制程序:bin、sbin 库:lib  头文件:include 帮助文件:man  配置文件:etc/conf  函数名(参数), 头文件

        由于安装一个应用程序需要安装那么多包,不易管理,后来就出现了,linux操作系统哲学思想之一:由众多小程序组成,要完成复杂任务时,组合小程序完成复杂任务.问题:依赖关系:X --> Y,循环依赖:版本依赖:应用程序管理器: 1、数据库:依赖关系:X --> Y(有冗余机制,如果数据库坏了,系统能够根据系统上装的应用程序去创建恢复这个数据库) 软件名和版本  安装生成的各文件路径及校验码  依赖关系  提供功能性说明  2、提供程序组成格式: 文件清单   安装卸载时运行的脚本  

wKiom1MKvzODKKogAAJ6YAhHy1g631.jpg

查看bash的功能说明

源程序程序的组成格式:源代码  name-major.minor.release.tar.gz


2、软件包管理器

Debian: .deb, dpkg   RedHat: .rpm, rpm (RedHat Package Manager)  标准管理管工具 rpm: RPM is Package Manager  包管理器的基本功能:打包(制作程序包) 安装  查询  升级  卸载  校验  数据库管理

依赖关系:X, Y, M,N, l,i,k

前端管理器:自动解决依赖关系,安装还是用rpm. debian apt-get  yum:升级修改工具(基于红帽的二次发行版问世;)

总结:应用的安装方式: 使用包管理器:便捷、易用  包管理器的前端工具: 源代码编译:  简单打包的二进制格式:


3、rpm包的使用:

rpm包命名格式:

源程序:name-version.tar.{gz|bz2|xz}

version: major.minor.release

rpm包:name-version-release.arch.rpm

release:通常包含rpm的制作发行号,还包含适用的OS

bash-4.3.2-2.el6.x86_64.rpm  OS平台: el6: Redhat enterprise linux 6  el5:redhat enterprise linux  CentOS5:Centos enterprise 5 CentOS6 Centos enterprise 5 suse11....

应用程序架构 arch:  x86_64(AMD64 inter) i386, i586, i686(兼容)  ppc(power pc) noarch nginx-1.4.16-5.noarch.rpm

比如,一个源码:有10个功能 大多数用户只用其6个功能,余下的4个呢? 分包:把一个大的程序打包制作成多个包 主包(核心):bash-4.3.2-2.el6.x86_64.rpm 支包:bash-hello-4.3.2-2.el6.x86_64.rpm(依赖于主包)bash-world-4.3.2-2.el6.x86_64.rpm

DNS:bind, bind-devel(开发包,开发库,以及头文件), bind-libs(bind库), bind-utils(客户端工具) bind-chroot(改变目录) 来源合法性验正: 源程序:通过md5或sha1校验码验正; rpm包:发行商提供的合法性是可信的 验正包完整性:校验码 验正来源合法:公钥 获取rpm包的途径: 1、发行商的光盘或站点服务器 以CentOS为例: http://mirrors.163.comhttp://mirrors.sohu.com

2、http://rpmfind.net3、http://rpm.pbone.net注意: 1、发行商,发行光盘中的包,需要升级时,官方释放出升级包;2、Fedora EPEL(众多制作好的rpm包经过发行商验证过的)

rpm包管理:安装 rpm -i, --install  # rpm -i /path/to/rpm_package ... -v:  -vv: -vvv: -h: hash, 以#的个数显示安装进度,一个#表示2%的进度; --test:仅测试,不真正执行安装过程

wKioL1MKx9vguRO3AAB1YbdaX7I622.jpg

如果存在依赖: 解决依赖关系  忽略依赖关系: --nodeps

wKioL1MKyGDTZH_7AAHEFgySCjc325.jpg

重新安装: -ivh --replacepkgs 就算是重新安装依赖关系依然存在

wKioL1MKyPfxAMu0AAChZUqme04782.jpg

重新安装应用程序原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件;

rpm包管理:卸载 rpm -e, --erase   rpm -e package_name 卸载bind,查看命令是否执行成功,linux哲学思想之二没有消息就是莫大的好消息.

wKioL1MKycLjb_80AAA7PlcYPKc022.jpg

如果卸载被其它程序所依赖的包: 1、把依赖者一同卸载;2、忽略依赖关系; --nodeps 3、不再卸载


rpm包管理:查询

查询某单个包是否安装:rpm -q package_name  查询所有已经安装的包:rpm -qa

wKiom1MKyunixO--AABEebSYioo509.jpg

查询包的描述信息:rpm -qi package_name  bash

wKioL1MKy0eBIFLoAAAezuspBFE290.jpg

Name        : bash                         Relocations: (not relocatable)

Version     : 4.1.2                             Vendor: CentOS

Release     : 15.el6_4                      Build Date: Thu 18 Jul 2013 09:21:24 PM CST

Install Date: Wed 12 Feb 2014 09:48:43 AM CST      Build Host: c6b10.bsys.dev.centos.org

Group       : System Environment/Shells     Source RPM: bash-4.1.2-15.el6_4.src.rpm

Size        : 3139291                          License: GPLv3+

Signature   : RSA/SHA1, Thu 18 Jul 2013 09:46:10 PM CST, Key ID 0946fca2c105b9de

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

URL         : http://www.gnu.org/software/bash

Summary     : The GNU Bourne Again shell

Description :

The GNU Bourne Again shell (Bash) is a shell or command language

interpreter that is compatible with the Bourne shell (sh). Bash

incorporates useful features from the Korn shell (ksh) and the C shell

(csh). Most sh scripts can be run by bash without modification.

查询包安装之后在当前系统生成文件列表:rpm -ql package_name 查询bash的生成的文件列表

[root@station43 named]# rpm -ql  bash

/bin/bash                  注释:bash二进制可执行程序通常选项 -x:预执行脚本程序,详细输出脚本的执行过程  -n:检查脚本语法是否出错.

/bin/sh                             注释:bash的二进制程序可执行程序,用户用于交互式的脚本编程

/etc/skel/.bash_logout              注释:用于用户离开shell命令行

/etc/skel/.bash_profile             注释:为交互式登录的用户提供配置 /etc/profile:全局 /etc/profile.d/*.sh:全局~/.bash_profile:个人配置,仅对当前用户有效  功能: 设定环境变量 运行命令或脚本

/etc/skel/.bashrc                   注释/etc/bashrc: 全局 ~/.bashrc: 个人配 功用: 设定本地变量 定义命令别名

/usr/share/info/bash.info.gz        注释:bash的详细信息,以及bash有哪些特性

/usr/share/doc/bash-4.1.2/COPYING   注释:bash的帮助文档

/usr/share/man/man1/compopt.1.gz    注释:man1:指的是用户命令 compopt:命令的man帮助信息

查询某文件是哪个包安装生成的:rpm -qf /path/to/somefile

[root@station43 ~]# rpm -qf /bin/bash

bash-4.1.2-15.el6_4.x86_64

查询包安装后生成的帮助文档:rpm -qd package_name

[root@station43 ~]# rpm -qd bash

/usr/share/doc/bash-4.1.2/COPYING

/usr/share/info/bash.info.gz

/usr/share/man/man1/..1.gz

/usr/share/man/man1/:.1.gz

/usr/share/man/man1/[.1.gz

/usr/share/man/man1/alias.1.gz

/usr/share/man/man1/bash.1.gz

/usr/share/man/man1/bashbug.1.gz

/usr/share/man/man1/bg.1.gz

/usr/share/man/man1/bind.1.gz

/usr/share/man/man1/break.1.gz

/usr/share/man/man1/builtin.1.gz

查询包安装后生成的配置文件:rpm -qc package_name

[root@station43 ~]# rpm -qc bash

/etc/skel/.bash_logout

/etc/skel/.bash_profile

/etc/skel/.bashrc

查询包相关的脚本:rpm -q --scripts package_name

[root@station43 ~]# rpm -q --scripts bash

postinstall scriptlet (using <lua>):

bashfound = false;

shfound = false;

f = io.open("/etc/shells", "r");

if f == nil

then

 f = io.open("/etc/shells", "w");

else

 repeat

   t = f:read();

   if t == "/bin/bash"

   then

     bashfound = true;

   end

   if t == "/bin/sh"

   then

     shfound = true;

   end

 until t == nil;

end

脚本有四类: preinstall: 安装前脚本(安装之前系统的环境检查有没有库呀,glibc,gcc之类的) postinstall: 安装后脚本(比如安装apache,我希望apache安装完成之后能够自动启动) preuninstall: 卸载前脚本(卸载之前先把apache服务stop) postuninstall: 卸载后脚本(卸载了,我们发现有些残余文件还没有清除干净)

查询尚未安装的rpm包文件的相关信息:

查询安装后会生成的文件列表:rpm -qpl /path/to/package_file 首先你当前目录能否找到那个包

[root@station43 Packages]# rpm -qpl bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm

/etc/NetworkManager/dispatcher.d/13-named  

/etc/logrotate.d/named

/etc/named

/etc/named.conf

/etc/named.iscdlv.key

/etc/named.rfc1912.zones

/etc/named.root.key

/etc/portreserve/named

/etc/rc.d/init.d/named

/etc/rndc.conf

/etc/rndc.key

查询其简单描述信息:rpm -qpi /path/to/package_file 注释:这里是所在的目录中有其查询的包

[root@station43 Packages]# rpm -qpi bind-9.8.2-0.17.rc1.el6_4.6.x86_64.rpm

Name        : bind                         Relocations: (not relocatable)

Version     : 9.8.2                             Vendor: CentOS

Release     : 0.17.rc1.el6_4.6              Build Date: Tue 27 Aug 2013 11:55:53 PM CST

Install Date: (not installed)               Build Host: c6b9.bsys.dev.centos.org

Group       : System Environment/Daemons    Source RPM: bind-9.8.2-0.17.rc1.el6_4.6.src.rpm

Size        : 7628134                          License: ISC

Signature   : RSA/SHA1, Wed 28 Aug 2013 01:56:23 AM CST, Key ID 0946fca2c105b9de

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

URL         : http://www.isc.org/products/BIND/

Summary     : The Berkeley Internet Name Domain (BIND) DNS (Domain Name System) server

Description :

BIND (Berkeley Internet Name Domain) is an implementation of the DNS

(Domain Name System) protocols. BIND includes a DNS server (named),

which resolves host names to IP addresses; a resolver library

(routines for applications to use when interfacing with DNS); and

tools for verifying that the DNS server is operating properly.

rpm包之升级: rpm -U: 升级或安装(如果包没有安装就安装,安装过了就升级)  rpm -F:升级 () rpm {-Uvh|-Fvh} /path/to/package_file --nodeps:忽略依赖关系--force: 强行安装(由于环境的原因我们在此就不做示范啦)

注意:不要对内核执行升级操作; 多版本内核可并存,因此,建议执行安装操作;

rpm包管理:校验检查包安装后生成的文件是否被修改过; rpm -V package_name  rpm包管理:检验来源合法性和软件包完整性 包完整性:通过单向加密机制(md5|sha1)

来源合法性:通过公钥加密机制(RSA)

1、[root@station43 Packages]# rpm -V zlib-devel 注释:先检查安装的是否被修改

[root@station43 Packages]# echo $?  

0

然后:rpm -ql 指定包名 查看生成了哪些文件

[root@station43 Packages]# rpm -ql zlib-devel

/usr/include/zconf.h

[root@station43 Packages]# vim + /usr/include/zconf.h      注释:在文件的最后一行更改#new line

[root@station43 Packages]# rpm -V zlib-devel               注释:使用此命令查看信息

S.5....T.    /usr/include/zconf.h                          注释:没有改变使用...代替

      man   rpm

      S file Size differs                                  注释:文件的大小                      

      M Mode differs (includes permissions and file type)   注释:权限

      5 digest (formerly MD5 sum) differs                   注释:完整性,校验码

      D Device major/minor number mismatch                 注释:主设备号以及次设备号

      L readLink(2) path mismatch                          注释:路径不匹配

      U User ownership differs                             注释:属主

      G Group ownership differs                            注释:属组

      T mTime differs                                      注释:修改时间(时间戳)

      P caPabilities differ                                注释:能力,作用


检查:rpm -K /path/to/package_file      注释:由于这个rpm包实在光盘上的所以MD5ok 如果not ok的话就说明没有此rpm包制作者的公钥

wKiom1MK26HCEzyaAABn16ony6M360.jpg

命令:gpg, pgp

导入制作者的公钥,CentOS发行版的公钥在iso文件中;  导入命令:rpm --import /path/to/gpg-key-file

wKiom1MK3QfTrtnzAADW2ZP5vHA192.jpg

rpm --checksig /path/to/package_file   子选项:--nosignature: 不检查来源合法性  --nodigest: 不检查完整性

rpm包管理:数据库重建

数据库:/var/lib/rpm/ 重建: rpm --initdb: 初始化  如果事先不存在一个数据库,则新建之;  rpm --rebuilddb: 重建  直接重建数据库,会覆盖原有的库;

[root@station43 cdrom]# cd /var/lib/rpm/

[root@station43 rpm]# ls -lh

total 58M                                                                       注释:   数据库文件的信息都是分开存放的

-rw-r--r--. 1 root root 5.1M Feb 24 05:12 Basenames                             注释:   每个软件包的基名              

-rw-r--r--. 1 root root  12K Feb 23 12:57 Conflictname                           注释:   所有冲突的软件包

-rw-r--r--  1 root root  24K Feb 24 05:45 __db.001                                 注释:   锁,来实现rpm包输入支撑性的工具

-rw-r--r--  1 root root 224K Feb 24 05:45 __db.002                                注释:   锁,来实现rpm包输入支撑性的工具

-rw-r--r--  1 root root 1.3M Feb 24 05:45 __db.003                                注释:   锁,来实现rpm包输入支撑性的工具

-rw-r--r--  1 root root 736K Feb 24 05:45 __db.004                                 注释:   锁,来实现rpm包输入支撑性的工具

-rw-r--r--. 1 root root 1.4M Feb 24 05:12 Dirnames                                注释:   软件的路径

-rw-r--r--. 1 root root 5.1M Feb 24 05:12 Filedigests                               注释:   系统上所有软件的效验码

-rw-r--r--. 1 root root  24K Feb 24 05:12 Group                                      注释:   软件包组,实现相同功能的软件包 -rw-r--r--. 1 root root  45M Feb 24 05:12 Packages  注释:所有包的完整信息  .............


YUM

自动解决依赖:X --> Y --> Z,


      文件服务器(共享rpm包):通过yum所支持的文件共享机制将各rpm包通过文件服务共享 yum自身的工作机制只不过是查找指定的(元数据文件)文件,根据元数据文件获取rpm包是否有依赖关系,依赖关系是什么?然后去仓库下载repository: 仓库 1、各rpm包; 2、依赖关系、程序包安装后所能够生成文件列表等元数据文件;(yam仓库不仅仅是一个文件服务器,而且还是一个元数据文件服务器)如果用户使用yum命令,首先yum会去查找系统上的可用yum源,然后对指定yum源发起请求(服务器),把那个yum仓库的元数据信息到并缓存到本地以便快速分析,然后根据本地的分析结果,查看当前系统上程序包的依赖关系  ftp, http, nfs, file

yum客户端:

1、配置文件:指定各可用的yum仓库;

2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地;   注释:一般都在/var/cache

3、分析元数据:根据具体操作请求完成元数据分析, 可能包括检查依赖关系、文件列表等信息;

4、执行具体操作:下载文件

客户端配置文件指定对应服务器访问方式:

ftp   ftp://server/path/to/repo

http  http://server/path/to/repo

nfs   nfs://server/nfs_path  

file  file:///path/to/repository


YUM [options] COMMAND


check          Check for problems in the rpmdb

check-update   Check for available package updates

clean          Remove cached data

deplist        List a package's dependencies

distribution-synchronization Synchronize installed packages to the latest available versions

downgrade      downgrade a package

erase          Remove a package or packages from your system

groupinfo      Display details about a package group

groupinstall   Install the packages in a group on your system

grouplist      List available package groups

groupremove    Remove the packages in a group from your system

help           Display a helpful usage message

history        Display, or use, the transaction history

info           Display details about a package or group of packages

install        Install a package or packages on your system

list           List a package or groups of packages

load-transaction load a saved transaction from filename

makecache      Generate the metadata cache

provides       Find what package provides the given value

reinstall      reinstall a package

repolist       Display the configured software repositories

resolvedep     Determine which package provides the given dependency

search         Search package details for the given string

shell          Run an interactive yum shell

update         Update a package or packages on your system

update-minimal Works like update, but goes to the 'newest' package match which fixes a problem that affects your system

updateinfo     Acts on repository update information

upgrade        Update packages taking obsoletes into account

version        Display a version for the machine and/or available repos.


配置文件格式:由两段组成,类似windows的ini配置文件

[main] :主配置段

[repo] :仓库配置段

YUM的主配置文件  /etc/yum.conf

[main]

cachedir=/var/cache/yum/$basearch/$releasever    注释: $basearch $releasever:两个变量,两个宏

keepcache=0                                          注释: 是否缓存yum保存下载过的rpm包 0表示不缓存

debuglevel=2                                          注释: 调试级别        

logfile=/var/log/yum.log                         注释: 日志文件的存放路径

exactarch=1                                             注释: 精确匹配rpm包的版本    

obsoletes=1                                            注释: 对于过期废弃的包我们选择与否

gpgcheck=1                                             注释: 是否检查rpm包的来源合法性,以及完整性    

plugins=1                                                 注释: 是否使用yum的插件(快速镜像列表获取)

bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum

distroverpkg=centos-release


#  This is the default, if you make this bigger yum won't see if the metadata

# is newer on the remote and so you'll "gain" the bandwidth of not having to

# download the new metadata and "pay" for it by yum not having correct

# information.

#  It is esp. important, to have correct metadata, for distributions like

# Fedora which don't keep old packages around. If you don't like this checking

# interupting your command line usage, it's much better to have something

# manually check the metadata once an hour (yum-updatesd will do this).

# metadata_expire=90m


# PUT YOUR REPOS HERE OR IN separate files named file.repo

# in /etc/yum.repos.d


要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中:

/etc/yum.conf

/etc/yum.repos.d/*.repo

配置repo:

[repo_ID]

name=String

baseurl=仓库的访问路径

enabled={1|0}       注释:是否启用仓库

gpgcheck={1|0}      注释: 是否检查rpm包的来源合法性,以及完整性

gpgkey=公钥文件(可以在本地,也可是服务器端路径)

cost=定义此仓库开销,默认为1000

[base]

name=CentOS 6.5 X86_64 relase

baseurl=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/

enabled=1

gpgcheck=1

gpgkey=http://172.16.0.1/cobbler/ks_mirror/centos-6.5-x86_64/RPM-GPG-KEY-CentOS-6


~                                      

yum的各命令:

使用yum安装dhcp

wKioL1MK-OuwQEX7AAAp86kVzSs875.jpg

使用yum命令删除dhcp

wKioL1MK-73Q5khvAAAn8dvUkbM861.jpg

安装之后查看本地是否有缓存元数据信息,yum的信息被缓存到本地

wKiom1MK-YGBnOe1AAChzwbEko0963.jpg


repolist [all|enabled|disabled]: 列出所有可用的yum仓库以及包的个数

wKiom1MK6fSDXYqGAAEUXRIsl9c283.jpg

clean [all|packages|metadata|expire-cache|rpmdb|plugins]: 清理缓存

clean [全部|只清除包|源数据|已经过期的缓存|rpm的数据库|插件]

wKioL1MK-uDx-XVbAACY3MHDDx8816.jpg

wKioL1MK-uDRHK2_AAAaxWtNezc100.jpg

list [all|installed|available]: 列出rpm包

list [全部|已安装|可安装的]    默认是全部

wKiom1MK_VLylIzZAAAgRJmmvqM156.jpg

显示当前系统上所有的指定的yum仓库

wKioL1MK_deAKdnpAADpRZwkN0g195.jpg

info package_name: 列出包的描述信息

wKiom1MK_qfAq7sVAAI7LSKJS0k024.jpg

grouplist: 列出所有包组

wKioL1MK_3zyFRboAAAmHk0k_Fs177.jpg

groupinfo "package_group_name":显示包组信息

wKioL1MK_-6CqJV3AAG1RriY__k893.jpg

三个跟开发相关的包组:       Desktop Platform Development:有图形程序时需安装此组;      Server Platform Development   Development Tools  install package_name ...: 安装指定的程序包 使用-y选项不会提问你是否安装

wKioL1MK-OuwQEX7AAAp86kVzSs875.jpg

reinstall package_name ...: 重新安装指定的程序包

wKioL1MLAKqD5WZwAAApcr97CF8204.jpg

check-update: 检查可升级的包

wKioL1MLAmzwmBPEAAClM468OyQ120.jpg

使用yum update后面什么都不跟,默认它会更新系统上所有的包

wKioL1MLAveQKoA_AAClM468OyQ282.jpg

wKioL1MLArmTXsuDAAAkE9XV5zs271.jpg

update package_name ...: 升级指定的程序包(由于系统上的包都是最新的,所以无法演示)、现在的版本:x-1.2.1, x-1.2.2, x-1.2.3  要升级到指定版本:yum update x-1.2.2 downgrade package_name:降级

erase|remove  package_name ...: remove可能只够就不会提供支持了

wKiom1MLBXzSOCPhAAAgS22YnSo573.jpg

whatprovides|provides /path/to/somefile: 查询某文件是由哪个包安装生成的

wKiom1MLBkCzlowwAAIo_1qly1I805.jpg

groupinstall "group_name":安装指定的包组

wKiom1MLB_GSllA3AATbjUVzUsE878.jpg

groupremove "group_name": 卸载指定的包组

wKiom1MLBt7TbID5AAJMvBZT924021.jpg

安装本地包:install /path/to/package_file  手动禁止检查来源及完整性:yum install /tmp/zsh-2.3.1-2.el6.x86_64.rpm --nogpgcheck

wKiom1MLCUezEGmRAABHJktrrvE674.jpg

提示:如果系统为CentOS 5,常用的开发包组为“Development Tools”和“Development Libraries”   CentOS 6,常用的开发包组为“Development Tools”和“Server Platform Development”

练习:安装相关的包组,确保如下命令可执行

# gcc --version

gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)

Copyright (C) 2010 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

wKioL1MLCwHxto4SAABasWJVnEk663.jpgwKiom1MLC2TTXZKeAAC7aflvcSM539.jpg

yum配置文件中可用的四个宏:

$releasever: 程序的版本,对Yum而言指的是redhat-release版本;只替换为主版本号,如RedHat 6.5,则替换为6; $arch: 系统架构 $basearch: 系统基本架构,如i686,i586等的基本架构为i386; $YUM0-9: 在系统中定义的环境变量,可以在yum中使用;

获取当前系统相应宏替换结果的办法:

# python

Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22)

[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

>>> import yum,pprint

>>> yb = yum.YumBase()

>>> pprint.pprint(yb.conf.yumvar,width=1)

Loaded plugins: fastestmirror, refresh-packagekit

{'arch': 'ia32e',

'basearch': 'x86_64',

'releasever': '6',

'uuid': 'ea249181-2f82-4c40-8c42-d51b3fce319a'}

>>> quit()


[fedora-epel]

name=Fedora Community EPEL

baseurl=http://172.16.0.1/fedora-epel/6/x86_64/

enabled=1

gpgcheck=0


[fedora-epel]

name=Fedora Community EPEL

baseurl=http://172.16.0.1/fedora-epel/$releasever/$basharch/

enabled=1

gpgcheck=0


           repomd.xml:使用来给repodata目录中所有的文件提供元数据信息的,repomd.xml保存了,这个目录下所有文件的效验码MD5码,除了TRANS.TBL.因此我们yum客户端每次在执行yum命令时首先都要去获取repomd.xml中的内容,并查看本地每个文件的MD5码,跟repomd中保存的是否一致.如果不一致的话,yum缓存就失效了,yum会重新下载这些文件.或者下载这些文件中的某一个文件,这是维持缓存始终有效,能够快速,发现这些文件是否改变的信息

primary:主配置文件,或者叫做主元数据文件,主要保存了我们这个操作系统上,每一个软件包的名称信息

filelist:每个程序包所包含的文件列表

other:文件的时间戳,属主属组,每个文件的效验码等...

comps:记录了我们当前yum源上所有的包组信息,组名,所包含各程序的名称,强制安装的各程序,选择安装的各程序,等等...

wKiom1MLERPwL9VpAAItXsmHZ9U756.jpg




   之前我们就说过有file:///也可以构建本地yum仓库ftp, http, nfs, file ),现在我们就来创建一个本地的yum仓库  1.将Centos6.5挂载到/meida/cdrom  2.写yum源的配置文件 3、测试效果

1、wKioL1MLGFbgodpTAABLRZUGHfc278.jpg

2、

wKioL1MLGGvw6iTqAAA5hYgYCqU798.jpg

3、

wKioL1MLGOmSMGQZAACQQChTazk478.jpg

wKioL1MLGTCQ3i_lAADcx0-Rjh0581.jpg


测试实现yum repository的配置:

1、准备文件服务器;使用httpd为例,请事先确保已经安装httpd程序包; 2、在/var/www/html目录,使用一个目录来保存准备制作成为yum仓库的所有rpm包; 3、创建yum仓库

4、启动httpd服务 5、配置使用自建的yum仓库 6、配置好epel的yum源 7、测试使用

2、在/var/www/html目录,使用一个目录来保存准备制作成为yum仓库的所有rpm包;

wKioL1MLDtjC06LBAAFEAFr6ONA953.jpg

wKiom1MLDtngKICPAACiydlibRo880.jpg

wKioL1MLDrXDgghiAAA0ks09dDY253.jpg

createrepo创建yum仓库并生成repodata目录的各个文件

wKiom1MLDtrAFS2pAAAw7PDCfuM211.jpg

在客户端配置指定yum仓库

wKioL1MLDrbDoyyLAABNas4IS9U029.jpg

开启http服务

wKioL1MLFjPRkFdwAABWhF3HxEg666.jpg

测试是否成功

wKioL1MLDrijzhSFAATJ3jtMuiU174.jpg


程序包管理之编译安装:

一、什么是源码包软件;
         顾名思义,源码包就是源代码的可见的软件包,基于Linux和BSD系统的软件最常见;在国内源可见的软件几乎绝迹;大多开源软件都是国外出品;在国内较为出名的开源软件有fcitx;lumaqq;Lumaqq及scim等;但软件的源代码可见并不等于软件是开源的,我们还要以软件的许可为准;比如有些软件是源码可见的,但他约定用户只能按他约定的内容来修改;比如vbb论坛程序;所以一个软件是否是开源软件,得具备两个条件;一是源代码可见;二是要有宽松的许可证书,比如GPL证书等;在GNU Linux或BSD社区中,开发人员在放出软件的二进制软件包的同时,也会为我们提供源代码软件包;

二、源代码有何用

    一个软件的如果有源码,是任何人都能看到他是怎么开发而来的,就像一个瓶子,比如瓶子制作的模具是什么;需要什么材料;具体的用途以及瓶子的详细说明书等等。软件的开放源码就是类似,开发者在给我们软件的同时,也会告诉我们软件是怎么开发出来的;只要我们的水平足够的高,所有的代码都在那里,我们就可以修改和定制软件,以适合我们的需要;如果Windows开放源代码,并以GPL发布,一样是有人能造出来N多的Windows发行版;遗憾的是Windows并不是开源系统;

所以软件的源代码的用处无非是以下两点;
1、软件根据用户的需要加以定制;
2、二次开发;注:要根据软件的许可证书约定为准,开发者许可二次开发才行;

三、怎样安装以源码包打包的软件;
1、源码包的打包格式;

源代码一般以file.tar.gz file.tar.bz2或file.src.rpm 打包;file.tar.gz和file.tar.bz2格式的解包命令如下;

[root@localhost beinan]# tar jxvf file.tar.bz2

[root@localhost beinan]# tar zxvf file.tar.gz

autoconf: configure脚本

检查编译环境是否编译需求,并定义当前程序编译时启用哪个特性或功能,以及安装路径的定义等等;结果:会根据Makefile.in文件生成makefile文件 automake: Makefile.in文件  用于结合configure脚本生成makefile文件 makefile文件是make命令的配置文件,编译安装的步骤:1、拿到源代码,并解压:# tar xf package-version.tar.{gz|bz2|xz} 注意:展开后的目录名通常为package-version 2、切换至源码目录中 # cd package-version  3、执行configure脚本 # ./configure 4、编译 # make 5、安装  # make install

configure脚本的通用功能: 我们需要定义的配置: 1、指定安装路径: --prefix=/usr/local/package_name --exec-prefix=eprefix设置结构依赖的文件的安装位置,若未被配置,则与--prefix选项值一样; --sysconfdir=/etc/package_name 2、指定启用/禁用的特性: --enable-feature: 例如--enable-fpm  --disable-feature: 例如 --disable-socket  3、指定所依赖功能、程序或文件  --with-function:启用某功能 --without-function:禁用某功能 不同的程序,其configure脚本功能不同,要获取帮助: ./configure --help

练习

1、编译安装httpd,并启动之;

wKiom1MRRGHDh4hkAABkhUf5I9w757.jpg

wKiom1MRRGGCeBH-AACDZCPcTQk439.jpg

解决办法

wKioL1MRRDyQvqnEAABGWpGYrQQ569.jpg

wKiom1MRRGKCK0n9AAAxmKxj_sM924.jpg

wKioL1MRRDzw5tSwAAAmHOG5P00864.jpg

wKiom1MRRGKAGXmxAAA4WOef8Pk513.jpg

wKioL1MRRDzzK5BSAAAtNBRscO8250.jpg


wKiom1MRRGOR7vHzAAA_4K4nEiE074.jpg

wKioL1MRRD2SMK6-AAAww61p1iY321.jpg

wKiom1MRRGOzuRxSAAAr2Iz7OJQ325.jpg

[root@localhost apr-util-1.3.12]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config

wKiom1MRRGPjw822AAAt-sOsolw376.jpg


wKioL1MRRD6h1E40AABU-tk9ssA295.jpg

wKiom1MRRGSC9E1NAAAqCdovm6M709.jpg

wKioL1MRRD7QrOMTAAAZvWq4s3g889.jpg

wKiom1MRRGSySiUYAAA0ZciyRBo194.jpg

wKioL1MRRD-hPbawAAAovZxhDv0186.jpg


wKiom1MRRGXz0SFhAABci93Sprs232.jpg

[root@localhost httpd-2.4.6]# ./configure --prefix=/usr/local/apache  --enable-so --enable-mods-shared=most --with-mpm=worker --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre  

wKiom1MRRcKQAC8yAAAqOtrhR-0401.jpg

最后编译时加上:--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre  

如果发现gcc没有装,请先安装GCC  yum -y install gcc

#  --prefix=<Install_Path> 指明编译后的二进制文件安装到<Install_Path>目录,用实际安装路径替换<Install_Path>,如--prefix=/usr/local/apache,如果省略此配置参数,默认安装到/usr/local/apache2目录。

#  --enable-so 指明编译动态加载模块(DSO)支持到httpd二进制文件,此模块使得Apache的各功能模块可以与核心分开编译、运行时动态加载。有了DSO支持,升级和增加模块时只需编译相关的模块即可,不必重新编译整个系统。最新版本的Apache缺省编译此模块到httpd二进制文件,如果你在使用早期版本的apache并且需要DSO支持,可能要明确指出此选项。
#  --enable-mods-shared=<MODULE-LIST> 明确指明要以DSO方式编译的模块,<MODULE-LIST>为空格分隔的模块名列表、all或者most,all表示包含所有模块,most表示包含大部分模块,如--enable-mods-share="rewrite deflate",--enable-mods-share=most,效果等同于多个--enable-<FEATURE>=share
# --with-mpm=<MPM> 先择Apache多路处理模块,<MPM>={beos|event|worker|prefork|mpmt_os2},prefork为Unix系统下默认处理模块,它将运行一个非线程型的、预派生的Web服务器,适合于没有线程安全库,需要避免线程兼容性问题的系统,它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。worker为支持混合的多线程多进程的多路处理模块,由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM,同时,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。如果你的系统是基于线程安全的,那么笔者建议使用worker替代prefork,它将使得你的系统得到实际的性能改善。


2、下面介绍如何把Apache加入到系统服务,用service命令来控制Apache的启动和停止。 ## 这里请注意一下!如果Linux服务器上默认安装了httpd的话(用rpm -qa|grep httpd查看), ## 会有 /etc/init.d/httpd 这个脚本文件的,所以你也可以用以下方法直接生成这个文件来覆盖它 ## 那么下次就可以用 service httpd start 来启动了  ## 如果需要区分开来的话就使用下面的方式
首先以apachectl脚本为模板生成Apache服务控制脚本:
grep -v "#" /usr/local/apache/bin/apachectl  > /etc/init.d/apache
用vi编辑Apache服务控制脚本/etc/init.d/apache:
vi /etc/init.d/apache

在文件最前面插入下面的行,使其支持chkconfig命令:
#!/bin/sh
# chkconfig: 2345 85 15
# description: Apache is a World Wide Web server.

保存后退出vi编辑器,执行下面的命令增加Apache服务控制脚本执行权限:

chmod  +x  /etc/init.d/httpd

执行下面的命令将Apache服务加入到系统服务:
chkconfig --add httpd

执行下面的命令检查Apache服务是否已经生效:
chkconfig --list httpd

命令输出类似下面的结果: apache          0:off 1:off 2:on 3:on 4:on 5:on 6:off

wKioL1MRTZrAIbxgAAAkSzOE6S8937.jpg

wKiom1MRTcCief9lAAAd68WjHWA730.jpg

表明apache服务已经生效,在2、3、4、5运行级别随系统启动而自动启动,以后可以使用service命令控制Apache的启动和停止。

启动Apache服务: service httpd start  停止Apache服务:  service httpd stop  执行下面的命令关闭开机自启动:  chkconfig httpd off  执行下面的命令改变开机自启动的运行级别为3、5: chkconfig --level 35 apache on . Apache的详细配置下回分解.