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,指定事件