1、软件包

1.1、源码

  • 用编程语言写出来的源代码,还没有经过编译(转成二进制)

  • 脚本之所以不用编辑,是因为脚本其实只是利用了shell(如bash)这个二进制程序的功能进行一些判断,然后执行的时候,还会呼叫其它已经编译好的二进制程序执行相应的动作。

  • 源码包编译,是依赖与你的编译环境的,也就是说在linux编译的程序不能拿到windows运行

 

1.2、程序包

  • 将编译好的应用程序,以及各种组成文件,打包成一个或几个程序包文件,从而方便安装、卸载、查询、升级和校验等。

 

1.3、程序包管理器

  • rpm:红帽包管理,rhel,centos,fedora,suse

  • dpt:debian包工具,ubuntu

 

2、RPM

  • 红帽光盘里面有很多已经编辑好了的二进制包:rpm

  • rpm包的命名规则:包名-软件版本-系统版本-架构.rpm

 

2.1、挂载光盘

mkdir /mnt/dvd

mount /dev/cdrom /mnt/dvd

 

vim /etc/fstab

/dev/sr0 /mnt/iso iso9660 defaults 0 0

 

#将fstab中还没有挂载的进行挂载

mount -a

 

2.2、查询

rpm包管理工具,有一个数据库,会记录着所有已安装包的信息

 

select选项:

  • -a,查询所有包

  • -f,查看指定文件由哪个程序包生成

  • --whatprovides,查询指定的能力由哪个包所提供

  • --whatrequires,查询指定的能力由哪个包所依赖

 

query选项:

  • --changelog,查询rpm包的changelog

  • -c,查询程序的配置文件

  • -d,查询程序的文档

  • -i,查询程序的信息

  • -l,查询指定程序包安装后生成的文件

  • --scripts,查询程序包自带的脚本

    - %pre,安装前脚本

    − %post,安装后脚本

    − %preun,卸载前脚本

    − %postun,卸载后脚本

  • -R,查询指定程序包所依赖的能力

  • --provides,列出指定程序包所提供的能力

 

#查询vim包是否已安装

#注意,包名称必须完整

rpm -q vim-common

 

#将所有已经安装的包列出来

rpm -qa

 

#查询已经安装了哪些以vim开头的包

rpm -qa vim*

 

#查询一个未安装的rpm包的信息

rpm -qpi /mnt/iso/Packages/samba-4.2.3-10.el7.x86_64.rpm

 

#查找vim相关文件放在哪儿,安装包就是把相关文件放到相应目录

rpm -ql vim-common

 

#查找配置文件 

rpm -qc vim-common 

 

#查找说明文件

rpm -qd vim-common

 

#查看这个文件是哪个包提供的

rpm -qf /etc/vimrc

 

#查看包的信息。信息中如果有el7 这个参数,代表只适应在rhel7的发行版本上;如果有noarch这个参数,表示和平台无关

rqm -qi vim-common

 

#查找这个包的脚本,有些包在安装的时候,会执行一些脚本

rpm -q --scripts openssh-server

 

#查看还没有安装的包的脚本信息

rpm -qp --scripts /mnt/iso/Packages/samba-4.2.3-10.el7.x86_64.rpm

 

#查看依赖关系

rpm -qR vim-enhanced

 

2.3、安装包

rpm -ivh /mnt/iso/Packages/zip-3.0-10.el7.x86_64.rpm

−-i, 安装

−-v,显示安装信息

−-h,以#显示安装过程

 

安装选项:

  • --test,测试安装,但不真正安装

  • --nodeps,忽略依赖关系

  • --replacepkgs,重新安装

  • --nosignature,不检查来源合法性

  • --nodigest,不检查包完整性

  • --noscripts,不执行程序包脚本

 

2.4、升级包

升级包有两种选项:

  • upgrade,如果有安装旧版本包,则升级,否则全新安装

  • freeshen,如果有安装旧版本包,则升级,否则不安装

 

#执行upgrade升级

rpm -Uvh zip-3.0-11.el7.x86_64.rpm

 

#执行freeshen升级

rpm -Fvh zip-3.0-11.el7.x86_64.rpm

 

2.5、降级

  • --oldpackage,用旧版本包替换新版本包

  • --force,强制,比如,升级或降级一个包时,这个包又被其它程序所依赖,默认是不允许对这个包进行升级或降级操作的,此时,可强制执行

 

注意:

1.如果原程序包的配置文件曾被修改,升级时,新版本提供的相同配置文件不会直接覆盖老版本的配置文件,而是将新版本的配置文件重命名(.rpmnew)

 

2.6、卸载包

#卸载zip这个包

rpm -e zip

 

2.7、校验

  • 我们在安装一个包的时候,需要对这个包进行来源合法性和完整性作校验

  • 合法性验证:RSA,非对称加密

  • 完整性验证:SHA256,hash

  • 红帽的rpm包,已经经过他的私钥进行过签名,用户在安装这个包的时候,需要用红帽的公钥去验证。光盘和系统中都有这个key

/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-*

 

#导入key

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-*

 

#重新安装就不会提示没有校验了

rpm -ivh  --replacepkgs samba* 

 

注意:没有导入key之前,安装包的时候,最后会出现一个NOKEY

 

2.8、数据库

  • rpm的数据库,正常情况下,不用我们维护,除非特殊情况,比如,数据库损坏

  • 数据库存放位置:/var/lib/rpm

 

#初始化数据库

#只有不存在数据库时,创建数据库

rpm --initdb

 

#重建数据库

#无论存不存在数据库,重新创建

rpm --rebuilddb

 

3、YUM

rpm包之间有依赖关系,使用rpm工具安装不方便,所以需要一个前端工具,自动解决依赖关系

 

红帽系linux使用的程序包管理工具:

  • yum,当前

  • dnf,RHEL8中使用

 

3.1、yum原理

  • 需要有一个仓库,这个仓库包含两类数据:程序包文件,及元数据文件

  • 元数据文件:仓库中程序包的包名等信息,以及包与包之间的依赖关系。

  • 元数据文件,放在特定的目录repodata下

  • 元数据文件,是通过读取仓库中所有rpm包的信息生成的,每个rpm包都有自己的元数据,比如:包名,依赖关系等

  • yum需要一个配置文件,指明仓库在哪儿

  • yum从仓库中下载元数据文件,并缓存到本地

  • yum安装程序包时,先从元数据文件中,查询仓库中有没有这个包,及依赖关系。

 

更新

  • 如果仓库中的元数据文件发生改变,本地缓存应该更新

  • 在仓库中,元数据文件有一个校验码,本地会定时去查询这个校验码,和本地的比对,如果不一样,就会重新下载元数据文件。

 

多仓库:

  • 如果多个仓库中的程序包版本不一样,安装程序包时,默认会在所有仓库中,查找版本最新的包进行安装

  • 如果多个仓库中的程序包版本一样,可以通过设置每个仓库开销(cost),选项开销最小的那个仓库安装,默认开销一样,随机选一个。

  • 也可以安装一个插件,自动选择最快的yum源:yum-fastestmirror

 

3.2、创建yum仓库

/etc/yum.conf,为所有仓库提供分共配置

/etc/yum.repos.d/*.conf,具体仓库配置

 

  • 手写

在/etc/yum.repos.d/这个目录下新建一个必须以.repo结尾的文件

 

[仓库ID] #注意,如果多仓库,ID不可重复

name=仓库名字

baseurl=包的路径 #package和repodata目录必须在一起,也就说这里要写这两个目录的上一级目录

enabled=1  #是否启用这个仓库,0为不启用

gpgcheck=0  #是否验证,1为验证

gpgkeyfile=文件路径  #如果不验证,就可以不写

enablegroups=1 #是否启用包组功能

failovermethod={roundrobin|priority}  #如果此仓库不可用,默认使用roundrobin,随机选择一个配置的其它的仓库,也可通过优先级指定。

cost=1000 #仓库开销,默认为1000

 

例:

vi /etc/yum.repos.d/test.repo

[rhel7]

name=rhel7

baseurl=file:///tmp/cdrom  #注意:本地路径以file://开头

enabled=1

gpgcheck=0

 

#从仓库中下载元数据文件

#如果status为0,说明没有找到任何程序包。

yum repolist

 

#命令行创建一个repo文件

#这种方式,会少一个参数:gpgcheck=0

yum-config-manager --add-repo=url  --save

 

3.3、安装包

#安装程序包

yum install -y gcc

 

#重新安装

yum reinstall gcc

 

#列出包组

yum grouplist

 

#查看包组信息

yum groupinfo "Development Tools"

 

#安装包组

yum groupinstall -y "Development Tools"

 

3.4、安装图形化和开发工具

CentOS6安装如下包:

yum groupinstall "Desktop"

yum groupinstall "X Window System"

yum groupinstall "Development tools"

startx

 

CentOS7安装如下包:

yum groupinstall "Server with GUI"

yum groupinstall "GNOME Desktop"

yum groupinstall "Development Tools"

startx

 

GNOME和KDE:

  • 在2004年之后,GNOME不仅开始在技术上超越前者,也获得更多商业公司的广泛支持,KDE丧失主导地位,其原因就在于KDE选择在Qt平台的基础上开发,而Qt在版权方面的限制让许多 商业公司望而却步。

  • Qt是一个跨平台的C++图形用户界面库,它是挪威TrollTech公司的产品

  • Qt是一个不遵循GPL的商业软件,这就给KDE上了一道无形的枷锁并带来可能的法律风险

  • 一大批自由程序员对KDE项目的决定深为不满,它们认为利用 非自由软件开发违背了GPL的精神,于是这些GNU的狂热信徒兵分两路:其中一部分人去制作Harmonny,试图重写出一套兼容Qt的替代品,这个项目 虽然技术上相对简单,但却没有获得KDE项目的支持;另一路人马则决定重新开发一套名为“GNOME(GNU Network Object Environment)”的图形环境来替代KDE,一场因为思想分歧引发的GUI之战开始了

  • GNOME选择完全遵循GPL的GTK图形界面库为基础,因此我们也一般将GNOME和KDE两大阵营称为GNOME/GTK和 KDE/Qt。与Qt基于C++语言不同,GTK采用较传统的C语言

 

3.5、更新

#更新所有的包

yum update 

 

#更新内核

yum update kernel

 

#列出所有内核

yum list kernel

 

注意:

  • 更新了内核后,新内核和旧内核共存,新内核默认排在第一个,即0,旧内核为1

  • 系统启动时,默认从0开始读,所以重启就会从新内核启动。

  • 也可直接下载内核rpm文件 ,然后,通过rpm -ivh安装。

 

#降级安装

yum downgrade PACKAGE

 

3.6、卸载包

#卸载gcc

yum remove gcc

 

3.7、yum的其它用法

#从仓库里查找带有这个关键字的包

yum search http

 

#查看一个命令是哪个包提供的

yum provides ping

 

#查看这个包的信息

yum info tartgetcli

 

#清除yum缓存

yum cleanall

 

#创建缓存

yum makecache

 

#查看包的依赖

yum deplist gcc

 

#查看历史事务

yum history

 

3.8、yum插件(扩展)

  • fastestmirror,如果配置了多个源,自动选择最快的yum源

yum install -y yum-plugin-fastestmirror

− 安装之后,生成配置文件/etc/yum/pluginconf.d/fastestmirror.conf。配置文件中的hostfilepath字段,用于定义yum源的配置文件(通常是/var/cache/yum/timedhosts.txt),然后我们就可以将所知道的yum源统统写入这个txt文件

 

  • priorities,如果配置了多个源,都有相同的软件包,安装的时候,到底选择哪个进行安装,为源设置优先级

yum install -y yum-plugin-priorities

 

vim /etc/yum/pluginconf.d/priorities.conf 

[main]

enabled = 1

check_obsoletes = 1

 

vim /etc/yum.repos.d/centos.repo

priority=1

#注:数字越小,优先级越高,用数字1-99表示,共99个级别

 

3.9、创建私有YUM仓库(扩展)

在生产环境中,我们需要搭建一个自定义的yum仓库,怎么办呢?

 

#通过外部yum源,下载所需安装包

#只下载,不安装

yum install -y --downloadonly --downloaddir=/mnt/pkg samba

 

#安装创建repodata文件工具

yum install -y createrepo

 

#创建repodata

#默认会产生一个repomd.xml文件,这个文件是元数据文件的校验码

createrepo /mnt/pkg

 

4、源码安装

源代码--->编译--->链接--->执行

 

  • 如果只有一个源文件时,可以直接用gcc命令去编译它

  • 但是,现代的程序编写,都是合作完成,一个程序,由多个源码文件组成,而且文件中的代码之间,很可能存在跨文件的依赖关系。所以,编译过程也是有顺序的

  • 源文件太多,一个一个编译就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具。但是需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile

  • make工具,根据makefile文件的内容,调用相应的预处理器,进行预处理;然后再调用相应的编译器,进行编译;再调用汇编器,进行汇编;最后调用链接器,进行链接。中间的过程make工具自动完成。

 

4.1、makefile文件怎么生成呢?

  • makefile文件有个模板文件,makefile.in

  • configure脚本,可以接受用户指定的编译参数、程序功能、安装路径等,然后结合模板文件,生成最终的makefile文件。

  • cmake,支持跨平台,通过CmakeLists.txt生成 Makefile, Visual Studio的.sln等。

 

4.2、常用make工具

  • make/gmake,GNU make,Linux系统环境下的make就是GNU Make

  • qmake,QT专用make工具

  • pmake,freeBSD make工具

  • nmake,microsoft make工具

 

4.3、常用编译器

gcc,开源的c、c++程序的编译器

 

4.4、源代码获取

  • 程序官方网站

  • sourceforge

  • github.com

  • code.google.com

 

4.5、cmake、make、gcc区别

  • cmake是一种跨平台编译工具,通过CMakeLists.txt文件,主要用于生成make工具所需的makefile文件。

    注:生成Makefile文件的工具不止有cmake,还有autotools,Qt环境下还有qmake

  • make,根据makefile文件的指示,控制编译过程

  • gcc是编译器,实现源码的编辑

 

4.6、前提

编译C源代码前提:

  • 开发工具:make、gcc等

  • 开发库:glibc,标准库

 

#开发工具包组,已经包含make,gcc等

yum groupinstall -y "Development Tools"

 

源码基本都是压缩文件,需要先解压:

  • tar -zxf 解压.tar.gz结尾的源代码包

  • tar -jxf 解压.tar.bz2结尾的源代码包

 

cd到源码目录

 

4.7、configure

#查看帮助

./connfigure --help

 

安装路径选项:

  • --prefix,指定软件默认安装目录。也就是程序的所有文件都会放到指定的目录。比如,程序要将二进制文件放到bin目录,会在指定目录下再创建一个bin目录,放二进制文件。如果不指定,默认会在/usr/local目录

  • --sysconfdir,指定配置文件安装位置

 

可选包选项:

  • --with-PACKAGE,指定依赖包安装

  • --without-PACKAGE,指定不安装的包

 

可选功能选项:

  • --disable-FEATURE,不安装某一功能

  • --enable-FEATRUE,安装某一功能

注意:程序安装时,会有默认会安装的功能,这些功能,可用disable选择不安装。默认不会安装的功能,可用enable选择安装

 

#configure,通过选项传递参数,指定启用特性、安装路径等。执行时会参考用户的指定以及makefile.in文件生成makefile文件

#configure,还会检查程序所依赖的外部环境。

./configure --prefix=/program/

 

注意:

configure这个脚本,一般程序会自带,但也有些不带,所以需要我们自己创建,需要两个开发工具:

  • autoconf,生成configure脚本

  • automake,生成makefile.in文件

 

4.8、make

#当执行make时,make会在当前目录下搜索makefile文件,并根据makefile文件的内容构建应用程序

make

 

4.9、make install

#执行完装,也就是将文件拷贝到指定目录

make install

 

4.10、安装后的配置

#导出二进制程序目录到PATH环境变量中

vim /etc/profile.d/test.sh

export PATH=/program/bin/:$PATH

 

#导出库文件路径

#添加新的库文件所在目录路径至些文件中

vim /etc/ld.so.conf.d/test.conf

 

#让系统重新生成缓存

ldconfig

  • ldconfig命令的用途主要是在默认搜寻目录/lib和/usr/lib以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表,为了让动态链接库为系统所共享,需运行动态链接库的管理命令ldconfig,此执行程序存放在/sbin目录下。

  • ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令。

 

#导出头文件

#将新的头文件,软链接到默认头文件目录中

ln -s /program/include /usr/include

 

#导出帮助手册

#添加man目录路径至此文件中

vim /etc/man.config

 

4.11、库文件

库文件,分动态链接库和静态链接库

 

静态链接库:

  • 在程序编译的链接阶段,将源文件中用到的库函数与汇编生成的目标文件合并成可执行文件。

  • 优点:程序与库函数再无关系

  • 缺点:程序执行文件可能会比较大;库文件升级,程序就要重新编译

  • linux静态链接库:.a

 

动态链接库:

  • 链接阶段,不会将库函数合并到执行文件,而是在运行过程中动态调用库文件。

  • 优点:动态库可共享使用,节省空间;库升级,程序不需要重新编译

  • 缺点:库文件丢失,程序无法运行

  • windows动态链接库:.DLL

  • LINUX动态链接库:.so

 

#查询一个二进制程序所依赖的库文件

ldd /usr/bin/ls

 

#查询当前已经缓存的库文件名及文件路径

ldconfig -p

 

4.12、头文件

  • 程序在调用库函数时,需要先声明才可以,如果要调用多个函数,就要声明多次,这样,就比较麻烦

  • 头文件,声明函数的一个文件,程序要调用函数时,直接include头文件就可以了,头文件中声明过的函数,就不需要再次声明了。

  • 头文件一般以.h结尾

  • Linux默认头文件全都放在:/usr/include/

 

库文件和头文件区别:

  • 头文件,只是声明函数

  • 库文件,函数可执行代码

  • 一个库文件均有一组头文件与其对应

  • 头文件是文本文件,是可供阅读的;库文件是二进制文件,不可直接阅读。

  • 头文件在编译中使用;库文件在链接中使用。

 

4.13、实例

源码编辑安装inotify-tools,这个工具是用来实时监听文件系统的变化

tar -zxvf inotify-tools-3.13.tar.gz

cd inotify-tools-3.13

.configure --prefix=/program

make

make install

ln -s /program/bin/* /usr/bin

 

inotifywait -mrq -e modify,delete,create /tmp/doc

−-m,监听

−-r,指定一个目录

−-q,打印事件

−-e,指定事件