在项目中同学难免要在Linux系统下编译源代码,一定会对命令行编译时遇到层出不穷的编译错误头痛不及,很难理解为何Linux系统会用如此变态的编译安装方式呢?
特别对于现在习惯了应用商店一键安装的同学来说,编译源代码简直就是恐怖的令人发指。其实这一点这正是Linux的魅力所在,本文是编译入门,所以不展开说,但简单来讲就是:Windows系统以及手机应用商店是面向终端用户,所以安装程序必须简单。不能够给普通用户设门槛,对于商业世界,每个用户都是¥;而Linux是面向程序员,采用瑞士军刀的复用思维,一个开源程序模块写好了全世界用,但是想把用这些程序模块拼凑起来一起用可不容易。
既然是编译安装入门,其实网络上可参考的资料文档并不少,这里我们主要是串联起来一个学习思路,如何编译安装,如何理解编译过程,如何处理编译中遇到的问题。然后配合相关实验更好掌握。
- ./configure -prefix=/usr/local/mysql -without-debug
- -without-bench -enable-thread-safe-client -enable-assembler
- -enable-profiling -with-mysqld-ldflags=-all-static -
- with-client-ldflags=-all-static -with-charset=latin1 -
- with-extra-charset=utf8,gbk -with-innodb -with-csv-storage
- -engine -with-federated-storage-engine -with-mysqld-user=mysql
- -without-embedded-server -with-server-suffix=-community
- -with-unix-socket-path=/usr/local/mysql/sock/mysql.sock &&
- make && make install
在安装MySQL时,源码安装与rpm安装相较,其特点如下:
我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码。
根据不同的软件平台环境调整相关的编译参数(源码安装不仅适用于rhel/centos,其他系统像FreeBSD、Solaris、Ubuntu等一样适用)。
可针对特定的应用场景选择需要什么组件或不需要什么组件。
同一台主机上可以安装多个MySQL(rpm安装则仅能安装一个MySQL)。
根据需要存储的数据内容选择只安装需要的字符集。
理论上源码静态编译方式安装效率会高一点,但到底比rpm方式高多少得看具体情况,一般在5%左右。
某次在线上环境工作,我用yum卸载一个软件包时遇到了极其危险的情况,这里也跟大家分享一下:当时,yum remove自动卸载了许多这个软件包自身依赖的系统包,导致系统崩溃了,SSH不能登录,并且SCP及RSYNC也都不能用了,幸亏FTP命令还能用, 所以数据很快被FTP传到其他服务器上了,但系统已经彻底崩溃,只有重装了。如果是源码安装的软件包就没有这种危险,需要卸载时只需要删除软件包安装的目 录即可。
综上所述,源码安装的好处如下:
最大的好处就是可以自行调整编译参数,最大化地定制安装结果。
源码安装可以选择最新的软件包,而Linux系统(包括FreeBSD)自带的软件包一般都是最稳定的版本,但不能保证是最新的。
相对而言,源码安装的性能是最优异的。
源码包安装的软件卸载时极为方便和简单,更重要的是,它比较安全,尤其是对线上的生产环境而言。
迁徙也比较方便,如果不涉及系统库文件,复制到另一台机器上也可以使用。
一般来说首先要下载安装包,后缀名是 .tar.gz 结尾的用 tar 命令解压出一个源代码目录,进入源代码目录之后执行下面源码三部曲即可:
- ./configure
- make
- make install
也可以写成这样更酷的单行方式:
./configure && make && make install
当然源码编译安装前,可以计算MD5校验和,并与官方提供的值相比较,判断是否一致:

第一步:./configure
(1) 是用来检查环境变量及配置编译选项的;
(2) 通过选项传递参数,指定安装路径、启用特性等;执行时会参考用户的指定以及Makefile.in文 件生成Makefile;
(3) 检查依赖到的外部环境,如依赖的软件包;
第二步:make
make 根据Makefile文件,会检测依赖的环境,将源代码编译成二进制文件,构建应用程序。
第三步:make install
make install则会将make编译出来的文件安装到指定位置(或默认位置)。
1)第一步详解:configure实际上是一个脚本,官方一般都会提供一个脚本给你,就是源码给你下载完它会把在打包文件的根目录下,你解包以后,你会看到一个configure脚本,这个脚本是官方给你的,你不用去像之前说的gcc一步一步编译了,这个脚本,它有两个主要功能,第一,这个脚本,它后面允许你添加安装时候它们一些信息,比如说,你将来编译安装完了以后,你希望把这个软件安装在哪。
源码编译的好处就是:你将来在configure这个脚本执行的时候,你可以指定将来装到哪。那装在哪带来的好处就是,你装一个路径,指定一个文件夹,你可把所有这个相关的文件放在一个文件夹里面。这个好处就在于将来想删的话,很简单,你把这个文件夹一删,全没了。
而yum安装的时候,哪些不同类型的文件一般它是按一定类别分别放在不同文件夹里,你手工删是删不干净的有可能,你要么用rm或者yum的remove这种命令来删。而用编译安装,它的安装路径是可以指定的,所以我们只要知道它的安装路径,就可以用rm把他删了。所以这样的话,安装路径是很灵活的,你希望装在哪,你可以自己定义,而我们可以把源码编译的过程想象成私人定制。
而rpm的这种方式因为别人替你编译完了的,所以这个编译的过程,你控制不了,那这时候可能会产生一个问题:
比如nginx,假设它有100个功能,实际上我们并不是100个功能都需要,那么我们在编译的时候,假设我们要30个,我们就可以定义30个。但是,如果你用的是yum安装,那没得选,人家选几个你用几个,比方说,人家编译的时候,选了60个,实际上你只需要30个,那多出来的,就白白编译了,浪费了。反而你需要的东西还可能恰恰没有。而我们自己编译,那就是想用几个,可以人为定义,我想用30个,我选30个就行了。
第一步很关键:第一步就是指定安装路径以及启用的功能,假设nginx有100个功能,你要启用30个,你要在这儿一个一个指,所以configure写都时候,这个代码会比较长一些。因为你要把30个特性一个一个写上。
当然执行这个命令的时候,它顺便还会做一件事:它还会检查你的编译过程所依赖的文件是否都存在,因为我们在编译安装的时候,它的这个每个特性,可能是依赖某个包的,你如果缺一些包,它就会报错。所以有时候你执行这个命令报错,那就说明你缺一些文件,你把这些文件的包,你给它装上就行了。
这步完成之后,他会在你的源码路径下生成一个Makefile文件,这是它的目标,这个Makefile文件就记录了你的安装路径和特性,所以这个脚本的功能就是生成一个Makefile文件。
当然有些小软件,太过简单,简单到这个脚本根本没提供,他直接就给你提供了一个Makefile文件,所以如果在这种情况下,那你就不用执行configrue了,因为configure的目标就是为了生成Makefile文件,当然你还可能不想用它的默认路径,你可以直接打开Makefile改改就行。
2)第二步:执行make的时候,它会自动地调用Makefile文件里面定义的这些信息,然后进行编译,这个过程是自动的。这个make命令,它会调用Makefile文件,来检查你的依赖环境,并且编译成二进制。但是编译生成二进制以后,它并不会安装。
3)第三步:make install 就是把你生成的二进制文件按照第一步指定的路径把那些文件复制到第一步指定的路径下,那就完成了最终安装。
这些都是典型的使用 GNU 的 AUTOCONF 和 AUTOMAKE 产生的程序的安装步骤。
./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有 CC 或 GCC,并不是需要 CC 或 GCC,它是个 shell 脚本。
make 是用来编译的,它从 Makefile 中读取指令,然后编译。
make install 是用来安装的,它也从 Makefile 中读取指令,安装到指定的位置。
AUTOMAKE 和 AUTOCONF 是非常有用的用来发布 C 程序的东西。
这一步一般用来生成 Makefile,为下一步的编译做准备。
configure是一个shell脚本,它可以自动设定源程序以符合各种不同平台上Unix系统的特性,并且根据系统叁数及环境产生合适的Makefile文件或是C的头文件(header file),让源程序可以很方便地在这些不同的平台上被编译连接。
查看configure命令的各个选项解析:
./configure --help
参数介绍:
-
- [root@web ffmpeg]# ./configure --help
- Usage: configure [options]
- Options: [defaults in brackets after descriptions]
-
- Standard options: 基本选项参数
- --help 显示此帮助信息|print this message
- --log[=FILE|yes|no] 记录测试并输出到config.err文件|log tests and output to FILE [config.err]
- --prefix=PREFIX 安装程序到指定目录(默认/usr/local)|install in PREFIX [/usr/local]
- --libdir=DIR 安装库到指定目录(默认prefix/lib)|install libs in DIR [PREFIX/lib]
- --shlibdir=DIR 指定共享库路径(默认prefix/lib)|install shared libs in DIR [PREFIX/lib]
- --incdir=DIR 指定includes路径(默认prefix/include/ffmpeg)|install includes in DIR[PREFIX/include/ffmpeg]
- --mandir=DIR 指定man page路径(默认prefix/man)install man page in DIR [PREFIX/man]
- --enable-mp3lame 启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]
- --enable-libogg 启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]
- --enable-vorbis 启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]
- --enable-faad 启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]
- --enable-faadbin 启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]
- --enable-faac 启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]
- --enable-libgsm 启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]
- --enable-xvid 启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]
- --enable-x264 启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]
- --enable-mingw32 启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile
- --enable-mingwce 启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile
- --enable-a52 启用A52支持(默认关闭)enable GPLed A52 support [default=no]
- --enable-a52bin 启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]
- --enable-dts 启用DTS支持(默认关闭)enable GPLed DTS support [default=no]
- --enable-pp 启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]
- --enable-static 构建静态库(默认启用)build static libraries [default=yes]
- --disable-static 禁止构建静态库(默认关闭)do not build static libraries [default=no]
- --enable-shared 构建共享库(默认关闭)build shared libraries [default=no]
- --disable-shared 禁止构建共享库(默认启用)do not build shared libraries [default=yes]
- --enable-amr_nb 启用amr_nb float音频编解码器|enable amr_nb float audio codec
- --enable-amr_nb-fixed 启用fixed amr_nb codec | use fixed point for amr-nb codec
- --enable-amr_wb 启用amr_wb float音频编解码器|enable amr_wb float audio codec
- --enable-amr_if2 启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec
- --enable-sunmlib 启用Sun medialib(默认关闭) | use Sun medialib [default=no]
- --enable-pthreads 启用pthreads(多线程)(默认关闭)use pthreads [default=no]
- --enable-dc1394 启用libdc1394、libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]
- --enable-swscaler 启用计数器支持?(默认关闭)software scaler support [default=no]
- --enable-avisynth 允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth script files [default=no]
- --enable-gpl 允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no]
-
- Advanced options (experts only): 高级选项参数(供专业人员使用)
- --source-path=PATH 源码的路径(当前为/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
- --cross-prefix=PREFIX 为编译工具指定路径 | use PREFIX for compilation tools []
- --cross-compile 假定使用了交叉编译 | assume a cross-compiler is used
- --cc=CC 指定使用何种C编译器(默认gcc)use C compiler CC [gcc]
- --make=MAKE 使用特定的make | use specified make [make]
- --extra-cflags=ECFLAGS 添加ECFLAGS到CFLAGS | add ECFLAGS to CFLAGS []
- --extra-ldflags=ELDFLAGS 添加ELDFLAGS到LDFLAGS(默认-Wl,--as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,--as-needed]
- --extra-libs=ELIBS 添加ELIBS | add ELIBS []
- --build-suffix=SUFFIX 为专用程序添加后缀 | suffix for application specific build []
- --arch=ARCH 选择机器架构(默认x86)select architecture [x86]
- --cpu=CPU 选用最低的cpu(影响指令的选择,可以在老CPU上出错) | selects the minimum cpu required (affects instruction selection, may crash on older CPUs)
- --powerpc-perf-enable 启用PPC上面的性能报告(需要启用PMC)enable performance report on PPC
- (requires enabling PMC)
- --disable-mmx 禁用MMX | disable MMX usage
- --disable-armv5te 禁用armv5te | disable armv5te usage
- --disable-iwmmxt 禁用iwmmxt | disable iwmmxt usage
- --disable-altivec 禁用AltiVec | disable AltiVec usage
- --disable-audio-oss 禁用OSS音频支持(默认启用)disable OSS audio support [default=no]
- --disable-audio-beos 禁用BeOS音频支持(默认启用)disable BeOS audio support [default=no]
- --disable-v4l 禁用video4linux提取(默认启用)disable video4linux grabbing [default=no]
- --disable-v4l2 禁用video4linux2提取(默认启用)disable video4linux2 grabbing [default=no]
- --disable-bktr 禁用bktr视频提取(默认启用)disable bktr video grabbing [default=no]
- --disable-dv1394 禁用DV1394提取(默认启用)disable DV1394 grabbing [default=no]
- --disable-network 禁用网络支持(默认支持)disable network support [default=no]
- --disable-ipv6 禁用ipv6支持(默认支持)disable ipv6 support [default=no]
- --disable-zlib 禁用zlib(默认支持)disable zlib [default=no]
- --disable-simple_idct 禁用simple IDCT例程(默认启用)disable simple IDCT routines [default=no]
- --disable-vhook 禁用video hooking支持 | disable video hooking support
- --enable-gprof enable profiling with gprof [no]
- --disable-debug 禁用调试符号 | disable debugging symbols
- --disable-opts 禁用编译器最优化 | disable compiler optimizations
- --disable-mpegaudio-hp 启用更快的解码MPEG音频(但精确度较低)(默认禁用)faster (but less accurate) MPEG audio decoding [default=no]
- --disable-protocols 禁用 I/O 协议支持(默认启用)disable I/O protocols support [default=no]
- --disable-ffserver 禁用生成ffserver | disable ffserver build
- --disable-ffplay 禁用生成ffplay | disable ffplay build
- --enable-small 启用优化文件尺寸大小(牺牲速度)optimize for size instead of speed
- --enable-memalign-hack 启用模拟内存排列,由内存调试器干涉? | emulate memalign, interferes with memory debuggers
- --disable-strip 禁用剥离可执行程序和共享库 | disable stripping of executables and shared libraries
- --disable-encoder=NAME 禁用XX编码器 | disables encoder NAME
- --enable-encoder=NAME 启用XX编码器 | enables encoder NAME
- --disable-decoder=NAME 禁用XX解码器 | disables decoder NAME
- --enable-decoder=NAME 启用XX解码器 | enables decoder NAME
- --disable-encoders 禁用所有编码器 | disables all encoders
- --disable-decoders 禁用所有解码器 | disables all decoders
- --disable-muxer=NAME 禁用XX混音器 | disables muxer NAME
- --enable-muxer=NAME 启用XX混音器 | enables muxer NAME
- --disable-muxers 禁用所有混音器 | disables all muxers
- --disable-demuxer=NAME 禁用XX解轨器 | disables demuxer NAME
- --enable-demuxer=NAME 启用XX解轨器 | enables demuxer NAME
- --disable-demuxers 禁用所有解轨器 | disables all demuxers
- --enable-parser=NAME 启用XX剖析器 | enables parser NAME
- --disable-parser=NAME 禁用XX剖析器 | disables parser NAME
- --disable-parsers 禁用所有剖析器 | disables all parsers
具体说明,请参考:
configure -h 参数详解_williamwang2013的博客-CSDN博客
你可以通过在 configure 后加上参数来对安装进行控制,比如代码:
./configure --prefix=/your_dir --enable--xxx --disable-xxx
上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的 /usr/local/share)。
默认配置(可执行文件放在/usr /local/bin,库文件默认放在/usr/local/lib,配置文件默认放在/usr/local/etc,其它的资源文件放在/usr /local/share)。
同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 --with、--enable、--without、--disable 等等参数对编译加以控制。
卸载用法:
使用–prefix选项的另一个好处是方便卸载软件或移植软件;当某个安装的软件不再需要时,只须简单的删除该安装目录,就可以把软件卸载得干干净净;而移植软件只需拷贝整个目录到另外一个机器即可(相同的操作系统下)。
如果没有配置–prefix选项,源码包也没有提供make uninstall,则可以通过以下方式可以完整卸载:
找一个临时目录重新安装一遍,如:
$ ./configure --prefix=/tmp/to_remove && make install
然后遍历/tmp/to_remove的文件,删除对应安装位置的文件即可(因为/tmp/to_remove里的目录结构就是没有配置–prefix选项时的目录结构)。
root权限问题:
在服务器上操作,如果没有root(管理员)权限,那么运行./configure会报错(默认路径/usr的访问需要root),可以通过–prefix将默认路径修改到当前用户可以操作的路径下(比如说在本用户的主目录新建一个usr目录,并设置 --prefix=~/usr),即可解决无root权限的编译问题。
有些软件需要先运行 make check 或 make test 来进行一些测试。
这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些 perl 或 python 编写的软件需要调用 perl 或 python 来进行编译)。
如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。
make 是 Linux 开发套件里面自动化编译的一个控制程序,他通过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些需要的程序进行编译的程序。一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。
make命令详解:
make all:产生我们设定的目标,即此范例中的可执行文件。只打make也可以,此时会开始编译原始码,然后连结,并且产生可执行文件。
make install:将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。
make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。
make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。
make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。
make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译。
这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)
4、常见问题及解答(Q&A):
Q1: 安装原码程序时,都要执行三步:
- ./configure
- make
- make install
他们是什么意思呀?configure 要用到 gcc 或 cc。但 make 时,需要什么?
A1:这些都是典型的使用 GNU 的 AUTOCONF 和 AUTOMAKE 产生的程序的安装步骤。./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有 CC 或 GCC,并不是需要 CC 或 GCC,它是个 shell 脚本。make 是用来编译的,它从 Makefile 中读取指令,然后编译。make install 是用来安装的,它也从 Makefile 中读取指令,安装到指定的位置。
Q2:cc 和 gcc 又是什么?我在用./configure 时,它老说我没有 cc,无法进行安装,怎么才能有 cc?
A2:CC 是 gcc 的连接,gcc 是编译器,你安装的时候大概是没有选择开发工具。你自己到光盘上找一下 gcc* 吧。装上就行了。或者 yum -y groupinstall "Development Tools" 自动安装基本开发工具。
CC 是 makefile 里用来定义编译器的,是为了方便代码移植而设定,因为不同的平台可能用到不同的编译器
- for exampe:
- x86 gcc
- mips64 gcc-mips64
当我们把 x86 下的 code 移植到 mips64 时,只要将 makefile 里 CC=gcc 改成 CC=gcc-mips64 而不需要将所有出现 gcc 的地方都改成 gcc-mips64。
5、Linux CC 与 Linux GCC 的区别概括介绍:
从名字上看,老的 unix 系统的 CC 程序叫做 C Compiler。但 GCC 这个名字按 GNU 的说法叫做 Gnu Compiler Collection。因为 gcc 包含很多编译器 (C, C++, Objective-C, Ada, Fortran,and Java)。所以它们是不一样的,一个是一个古老的 C 编译器,一个是编译器的 GNU 的编译器的集合 (Gcc 里的 C 编译器比 CC 强大太多了,所以你没必要用 CC)。当你调用 gcc 时不一定是调用的 C/C++ 编译器,是 gcc 根据文件扩展名自动识别并调用对应的编译器,具体可查阅 $man gcc。
你是下载不到 CC 的,原因是:CC 来自于昂贵的 Unix 系统,CC 是商业软件,要想用你需要打电话,写订单,而不是打开你的 Browser 去 download。
linux 下的 cc 是 gcc 的符号链接,可以通过 $ls –l /usr/bin/cc 来简单察看。而编译时看到的控制台输出 CC 则是一个指向 gcc 的变量,该变量是 make 程序的内建变量,就算你在 Makefile 中没有 CC= ,该变量也会存在,并默认指向 gcc。cc 的符号链接和变量存在的意义在于源码的移植性,可以方便的用 GCC 来编译老的用 cc 编译的 unix 软件,甚至连 Makefile 都不要改。而且也便于 linux 程序在 unix 下编译。
近几年的一个新情况是越来越多的 unix 用户,据我所知像 solaris,bsd 用户也不太使用 CC 了,人们都一定要装一个 gcc,用它来编译 C/C++ 程序。原因显而易见,gcc 足够强大,健壮。支持估计目前为止只有它支持的 ISO c/c++ 新特性。当然你最好不要使用 night 版本的 gcc。
Q3:make 和 make install 中的 mark 是系统自带的命令还是可执行程序文件?make install 中,是不是可以认为 install 是 mark 的参数???
A3:install 不是 make 的参数,而是在 makefile(Makefile)中有如:install: 的语句。如果用 make install,那么就执行 install: 后面的语句。
Q4:./config 是 linux 自带的吗?我一 make ,老提示我找不到核心类库。
A4:你去把 linux 的内核模块安装好就行了,在 linux 的第二张盘里软件的安装方法不是一成不变的,具体的步骤看随 tarball 提供的 INSTALL 或者 README
Q5:Makefile 是什么东东?有什么用?怎么用?
A5:makefile 是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接 ----- 但是不是所有的文件都需要重新编译,makefile 能够纪录文件的信息,决定在链接的时候需要重新编译哪些文件!
在 unix 系统下,makefile 是与 make 命令配合使用的。
有了这个 Makefile 文件,不论我们什么时候修改了源程序当中的什么文件,我们只要执行 make 命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其它的文件它连理都不想去理的。
make工具简介
1、源程序的基本结构
- --------------------
- |#include
|--->头文件 - |using namespace std;|--->编译指令
- --------------------
- -----------------------------------
- |int main() |
- |{ |
- | cout << "Hi, Chase07!" << endl; |--->主函数的定义
- | return 0; |
- |} |
- -----------------------------------
2、源代码到可执行程序流程

可执行程序(指令)跟编译平台(OS)有关。
3、源代码的拆分
4、使用Make工具

Makefile文件示例:

1. 任务名写在顶行,完成任务的所有步骤必须从另一行开始,且必须用Tab键缩进(一个步骤占用一行)。
2. clean的冒号右边是空白,说明完成clean任务无需任何条件。

1. 方法1只会执行makefile中的一个任务。
2. make的默认文件名是makefile,文件名可以自定义,但一般约定俗成命名为makefile。
5、自己编写Makefile文件
包含声明的头文件:

包含定义的源文件:

包含主函数的源文件:

makefile文件中的内容:
- # JB Li @ 20171017
- all: TestMain
-
- TestMain: FuncAdd.h FuncAdd.cpp TestMain.cpp
- gcc -o TestMain FuncAdd.h FuncAdd.cpp TestMain.cpp
- clean:
- @rm TestMain
使用make来编译源代码:

完成任务的命令前面若含有‘@’符号,在执行该命令将不打印出提示信息。
cmake就是一个与make同级别的编译工具,只不过它依靠的不是Makefile作为编译规则,而是根据CMakeLists.txt来编译的。
CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,通过编写CMakeLists.txt,可以控制生成的Makefile,从而控制编译过程。
CMake自动生成的Makefile不仅可以通过make命令构建项目生成目标文件,还支持安装(make install)、测试安装的程序是否能正确执行(make test,或者ctest)、生成当前平台的安装包(make package)、生成源码包(make package_source)、产生Dashboard显示数据并上传等高级功能,只要在CMakeLists.txt中简单配置,就可以完成很多复杂的功能,包括写测试用例。
如果有嵌套目录,子目录下可以有自己的CMakeLists.txt:

a) 编写CmakeLists.txt
b) 执行命令"cmake PATH"或者"ccmake PATH"生成 Makefile ( PATH 是 CMakeLists.txt 所在的目录 )。
- [root@localhost mariadb-10.0.34]# cmake . -LH # "."表示编译当前目录,打印参数选项
- cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql/ -DMYSQL_DATADIR=/usr/local/mysql/data/ -DEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_DEBUG=0 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_USER=mysql
上述参数:
- -DCMAKE_INSTALL_PREFIX= /usr/local/mysql 准备安装到哪里
- -DEFAULT_CHARSET=utf8 默认的字符集
- -DMYSQL_TCP_PORT=3306 数据库的监听端口
- -DMYSQL_UNIX_ADDR=/tmp/mysql.sock 本机连回数据库的unix socket
- -DWITH_DEBUG=0 关闭debug模式
- -DWITH_INNOBASE_STORAGE_ENGINE=1 打开innodb引擎
将源码编译成可供Linux运行的二进制文件一共需要两步:
1. 使用gcc编译器将源码编译成目标文件;
2. 再次使用gcc编译器将目标文件链接成二进制文件;
整个编译过程被浓缩在Makefile文件中( 告诉make命令需要怎么去编译和链接程序),当执行make命令时,make会去当前目录中寻找Makefile文件,并根据该文件中的要求完成整个编译过程。
而Makefile文件由configure命令产生。当执行configure命令时,configure会根据当前系统环境动态生成一个适合本系统的Makefile文件,供make命令使用。
Linux源码安装步骤:
gcc本身是编译工具,那编译gcc的工具是什么?所以需要事先通过yum或rpm安装好之前版本的gcc。
1、安装编译依赖
yum install -y gcc gcc-c++ glibc-static gcc bzip2 wget tmux
2、下载源码包
- wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.2.0/gcc-9.2.0.tar.gz
- tar -xzf gcc-9.2.0.tar.gz
- cd gcc-9.2.0
3、下载依赖,从国外下载,网上不行可以改成国内源,依次事先安装好GMP MPFR、MPC。
修改文件中的base_url行:
- ./contrib/download_prerequisites
- # gmp-6.1.0.tar.bz2: OK
- # mpfr-3.1.4.tar.bz2: OK
- # mpc-1.0.3.tar.gz: OK
- #isl-0.18.tar.bz2: OK
- # All prerequisites downloaded successfully.
4、开始编译,8core大概30min左右
- ./configure --prefix=/usr/local/gcc --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib
- make -j `nproc`
- make install
5、设置环境变量path
- echo "export PATH=/usr/local/gcc/bin:$PATH" >> /etc/profile.d/gcc.sh
- source /etc/profile.d/gcc.sh
6、头文件配置
ln -sv /usr/local/gcc/include/ /usr/include/gcc
7、库文件配置
- echo "/usr/local/gcc/lib64" >> /etc/ld.so.conf.d/gcc.conf
- ldconfig -v
- ldconfig -p |grep gcc
8、验证
- # gcc -v
- 使用内建 specs。
- COLLECT_GCC=gcc
- COLLECT_LTO_WRAPPER=/usr/local/gcc/libexec/gcc/x86_64-pc-linux-gnu/9.2.0/lto-wrapper
- 目标:x86_64-pc-linux-gnu
- 配置为:./configure --prefix=/usr/local/gcc --enable-bootstrap --enable-checking=release --enable-languages=c,c++ --disable-multilib
- 线程模型:posix
- gcc 版本 9.2.0 (GCC)
注:如果不想卸载原先的gcc,想同时使用新的gcc和旧的gcc
创建软连接
- cd /usr/bin
- rm gcc
- rm g++
- ln -s /usr/local/gcc-9.1.1/bin/g++ g++
- ln -s /usr/local/gcc-9.2.0/bin/gcc gcc
生成一个PATH变量指向它:
- [root@centos8 ~ 741]#echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
怎么还是旧的?那是因为,我们曾经执行过旧的,这个目的呢,因为它被缓存下来了,可以用hash查看。缓存下来,它这个路径记得就是旧tree的,我们可以清除掉缓存:


1、由于该软件包是由C/C++编译,需要先下载gcc编译器与e2fsprogs,后者为ext2文件系统工具集,使用yum安装即可,支持C/C++语言编译器和make工具:

- yum -y install gcc make
- rpm -q gcc
- rpm -q make
如果记不得安装哪个包,可以用*通配符:
![]()
2、编译

3、生成install安装文件,使用make来执行:


1、准备编译环境
[root@localhost opt]# yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel openssl openssl-devel -y
2、获取nginx源代码
[root@localhost opt]# wget http://nginx.org/download/nginx-1.2.9.tar.gz
3、解压缩nginx源代码
[root@localhost opt]# tar -zxvf nginx-1.2.9.tar.gz
4、进入源码目录
[root@localhost opt]# cd nginx-1.2.9
5、开始编译
[root@localhost nginx-1.2.9]# ./configure --prefix=/opt/nginx112/ --with-http_ssl_module --with-http_stub_status_module
6.执行make指令,调用gcc等编译工具,make install开始安装
[root@localhost nginx-1.2.9]# make && make install
7.安装后启动nginx软件,找到二进制程序,以绝对路径执行
[root@localhost opt]# /opt/nginx112/sbin/nginx
8.检查环境变量,需要手动配置nginx的PATH路径,否则必须绝对路径才能找到
- vim /etc/profile.d/nginx.sh
- export PATH=/opt/ngx112/sbin:$PATH2
. /etc/profile.d/nginx.sh
9、退出会话
[root@localhost ~]# logout
10、重新登录机器logout检查环境变量
- [root@linux ngx112]# cat /etc/profile.d/nginx.sh
- export PATH=/opt/ngx112/sbin:$PATH
11、修改系统语言(中英文)
- export LC_ALL=en_US.UTF-8
- export LC_ALL=zh_CN.UTF-8
12、启动nginx,可以访问页面
1、下载mysql并解压
- [root@001 ~]# wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.19.tar.gz
- [root@001 ~]# tar xf mysql-5.7.19.tar.gz -C /usr/local/src
- [root@001 ~]# cd !$
- [root@001 src]# cd mysql-5.7.19/
2、安装相关编译工具
[root@001 mysql-5.7.19]# yum -y install wget gcc-c++ ncurses-devel cmake
3、新建用户
[root@001 ~]# useradd -s /sbin/nologin -M mysql
4、创建相关目录
- [root@001 ~]# mkdir /usr/local/mysql
- [root@001 ~]# mkdir /mysqldata
5、编译安装
- root@001 mysql-5.7.19]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mysqldata/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost
- [root@001 mysql-5.7.19]# make -j 4 && make install
6、设置权限并初始化MySQL
- [root@001 mysql-5.7.19]# chown -R mysql.mysql /usr/local/mysql/
- [root@001 mysql-5.7.19]# cd /usr/local/mysql/bin/
- [root@001 bin]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/mysqldata #生成一个随机密码(注意保存登录时用)
- 2017-09-07T23:06:19.559512Z 1 [Note] A temporary password is generated for root@localhost: fwhYu/eIz6yX #记录下来
7、修改配置文件
- [root@001 bin]# vim /etc/my.cnf #修改如下内容
- [mysqld]
- basedir =/usr/local/mysql
- datadir=/mysqldata/
- port = 3306
- socket=/tmp/mysql.sock
- user=mysql
- [client]
- socket=/tmp/mysql.sock
8、配置mysql服务开机自动启动
- [root@001 bin]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
- [root@001 bin]# ldconfig
- [root@001 bin]# chmod 755 /etc/init.d/mysqld #增加执行权限
- [root@001 bin]# chkconfig --add mysqld
- [root@001 bin]# chkconfig --level 345 mysqld on #设置MySQL在345等级自动启动
9、设置环境变量
- [root@001 bin]# echo "PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh
- [root@001 bin]# source /etc/profile
10、启动并登陆修改密码
- [root@001 bin]# service mysqld start
- [root@001 bin]# mysql -uroot -pfwhYu/eIz6yX #之前记录下来的密码
- mysql> set password = '123456';
- Query OK, 0 rows affected (0.00 sec)
- mysql> quit
- Bye #退出并重新登陆
- [root@001 bin]# mysql -uroot -p123456
Mysql CMAKE编译参数详解:
- -DCMAKE_INSTALL_PREFIX= #指向mysql安装目录
- -DINSTALL_SBINDIR=sbin #指向可执行文件目录(prefix/sbin)
- -DMYSQL_DATADIR=/var/lib/mysql #指向mysql数据文件目录(/var/lib/mysql)
- -DSYSCONFDIR=/etc/mysql #指向mysql配置文件目录(/etc/mysql)
- -DINSTALL_PLUGINDIR=lib/mysql/plugin #指向插件目录(prefix/lib/mysql/plugin)
- -DINSTALL_MANDIR=share/man #指向man文档目录(prefix/share/man)
- -DINSTALL_SHAREDIR=share #指向aclocal/mysql.m4安装目录(prefix/share)
- -DINSTALL_LIBDIR=lib/mysql #指向对象代码库目录(prefix/lib/mysql)
- -DINSTALL_INCLUDEDIR=include/mysql #指向头文件目录(prefix/include/mysql)
- -DINSTALL_INFODIR=share/info #指向info文档存放目录(prefix/share/info)
- prefix官方推荐设为/usr
- Storage Engine相关
- 类型csv,myisam,myisammrg,heap,innobase,archive,blackhole
- 若想启用某个引擎的支持:-DWITH_
_STORAGE_ENGINE=1 - 如:
- -DWITH_INNOBASE_STORAGE_ENGINE=1
- -DWITH_ARCHIVE_STORAGE_ENGINE=1
- -DWITH_BLACKHOLE_STORAGE_ENGINE=1
- 若想禁用某个引擎的支持:-DWITHOUT_
_STORAGE_ENGINE=1 - 如:
- -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1
- -DWITHOUT_FEDERATED_STORAGE_ENGINE=1
- -DWITHOUT_PARTITION_STORAGE_ENGINE=1
- Library相关
- -DWITH_READLINE=1 #启用readline库支持(提供可编辑的命令行)
- -DWITH_SSL=system #启用ssl库支持(安全套接层)
- -DWITH_ZLIB=system #启用libz库支持(zib、gzib相关)
- -DWTIH_LIBWRAP=0 #禁用libwrap库(实现了通用TCP包装的功能,为网络服务守护进程使用)
- -DMYSQL_TCP_PORT=3306 #指定TCP端口为3306
- -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock #指定mysql.sock路径
- -DENABLED_LOCAL_INFILE=1 #启用本地数据导入支持
- -DEXTRA_CHARSETS=all #启用额外的字符集类型(默认为all)
- -DDEFAULT_CHARSET=utf8 #指定默认的字符集为utf8
- -DDEFAULT_COLLATION=utf8_general_ci #设定默认排序规则(utf8_general_ci快速/utf8_unicode_ci准确)
- -DWITH_EMBEDDED_SERVER=1 #编译嵌入式服务器支持
- -DMYSQL_USER=mysql #指定mysql用户(默认为mysql)
- -DWITH_DEBUG=0 禁用debug #(默认为禁用)
- -DENABLE_PROFILING=0 #禁用Profiling分析(默认为开启)
- -DWITH_COMMENT='string' #一个关于编译环境的描述性注释
开发工具:
autoconf:生成configure脚本
automake:生成Makefile.in
通过"Development Tools"、"Server Platform Development" 等开发组件
前提:提供开发工具及开发环境
开发工具:make, gcc等
开发环境:开发库,头文件
glibc:标准库
第一步:编写configure脚本
configure脚本选项:指定安装位置、指定启用的特性:
- --help: 获取其支持使用的选项
-
- 选项分类:
- 安装路径设定:
- --prefix=/PATH/TO/SOMEWHERE: 指定默认安装位置;默认为/usr/local/
- --sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
-
- System types:
-
- Optional Features: 可选特性
- --disable-FEATURE
- --enable-FEATURE[=ARG]
-
- Optional Packages: 可选包
- --with-PACKAGE[=ARG]
- --without-PACKAGE
第二步:导出二进制程序目录至PATH环境变量中
- vim /etc/profile.d/NAME.sh
- export PATH=/PATH/TO/BIN:$PATH
第三步:导出库文件路径
添加新的库文件所在目录至此文件中:
vim /etc/ld.so.conf.d/NAME.conf
让系统重新生成缓存:
ldconfig [-v]
第四步:导出头文件
基于链接的方式实现:
ln -sv
第五步:帮助手册
- vim /etc/man.config文件
- 添加一个MANPATH
Linux安装中遇到的问题可以说千奇百怪,有N个Linux发行版本,有M个要编译的软件版本,遇到的问题就能变成至少 M * N 个。为了解决这些复杂问题,大概的思路如下:
1、收集安装记录文档
应当收集好自己机器的环境版本 uname -a, 以及安装记录文档(含命令);
留存安装记录文档至少有两个好处:
2、从错误日志着手
configure 还是 make 还是 make install 不同阶段解决的思路不一样。Google上搜索一下, 变换一下关键词,排名前五的参考意义很大,第二页就不要看了。 别用度娘,别用度娘,别用度娘,重要的事情说三遍,执迷不悟想找莆田系医院就算了。什么,用不了谷歌,想把技术学好,这点困难解决不了您还怎么读研究生. 校园网里试试 ipv6 google 看看~3、configure 错误
configure 错误通常和库依赖有关系, 简单粗暴的方法解决不了,那您就只能来一般粗暴的方法了。
configure --disable-xxx 把对应的库屏蔽掉。不知道 disable名称是什么? 别傻乎乎的试, 把所有参数输出到 configure --help > cofig.out 某个文件里就能看到了, 所有的 enable-xxx 都是可以 disable-xxx 的。apt-get 补齐了就能通过。apt-get 包的版本不够新,自己去官网下载新版本的库编译安装呗,回顾‘一、如何编译安装’一般粗暴的方法解决不了,恭喜你,你是必须跳出 Linux 小白的境界啊。 configure 是用什么语言写的,需要研究一下bash 入门。打开 configure 文件,看看对应错误日志到底出现在哪一行。为什么过不去呢? 了解bash语法, echo 调试一下,有时就找到问题了。
安装完库之后,执行几个命令譬如 ldconfig等等也有作用,自行谷歌吧。
4、Make 错误
make错误通常和缺少库,或是对应库的目录设置有关。看看最后一条make命令。如果有了Makefile的基础,在研究下 gcc, g++等相关编译参数,把最后一条命令粘贴到命令行中,修订后执行一下,有时改变一下库指向就能执行编译通过了。
如果相关库或是命令修订后已经能正确编译执行的话, 这时你大概清楚错误的库指向发生何处,一般可以用下面几种方法解决
PKG_CONFIG_PATHln -sf 你的库路径 make使用的库路径mv 旧命令 旧命令+版本号Makefile(不推荐)5、Make install
这步错误就少多了,有时是权限的问题 sudo make install 就好
对应实验
nginx,加上几个模块,这是 internet 上使用最多的 http 服务器。vlc6、补充
对应命令 --version 或是 -v 试一下; 或是 apt-get version 库名称对应命令 --help--help,configure, Makfile代码吧,有时比你在搜索引擎上反复搜来搜去还节省时间,慢就是快。由于在linux中安装应用程序需要源码包编译安装,对于非专业人员而言难度太大,因而出现一种将源码编译好的二进制程序、库文件、配置文件、帮助文件等打包成一个或多个特定格式的程序包,而管理这类包的工具之一,则称为rpm。
rpm 是 reahat package manage,最开始由redhat公司在其rhel系统上提供的程序包管理器。但是由于rpm的使用十分的方便,因此现在rpm是rpm is package manager,成为linux中通用的程序包管理器之一。
首先我们先了解一下,此类程序包的命令方法.直接上实例更加明显:
php-5.4.16-21.el7.x86_64.rpm
格式为:
- name-VERSION-rpm_release.os.arch.rpm
- name:程序的名称,php
- VERSION:程序源码包的版本号,5.4.16
- rpm_release:rpm的发行号,21
- os:操作系统版本,el7
- arch:编译此包的cpu架构,x86_64
注:arch中有noarch,其表示此包可在任何架构平台上安装。
对于用户而言,程序能够运行则足够,但是对于某些需要在此程序上进行二次开发,或者添加额外组件的专业人员,那该怎么办呢?
因此rpm有一个拆包的机制,将一个程序分为主包跟其子包来管理,一般用户只需要安装主程序就能稳定使用,专业人员根据自己需求去安装其它子包。以下来看看哪些是子包:
- openssl-1.0.1e-34.el7.x86_64
- openssl-devel-1.0.1e-34.el7.x86_64
- openssl-libs-1.0.1e-34.el7.x86_64
子包格式为:
application-function-VERSION-rpm_release.os.arch.rpm
function: 该程序的某功能组件。
常见的有:
- libs-->库文件
- utils-->工具程序
- devel-->开发组件
优点
为了更好的管理程序包的安装,卸载,更新和查询等操作,rpm提供:
1.rpm包的组成文件列表(每个rpm包所必有的)
2.rpm包安装或卸载时的脚本信息
3.公共数据库保存:
1)程序包的名称和版本
2)依赖关系
3)功能说明
4)安装生成的各文件的文件路径及校验码信息
5)等信息
缺点
1 rpm包都是在特定环境定制的,因此对安装环境有所要求。
2 在linux中,各程序之间的依赖关系由作者所设计,但由于程序包多种多样,其依赖关系则非常的复杂,如果安装一个应用程序,它会需要很多其它程序,才能正常运行起来,在安装中很常见,因此这在rpm中是个弊端。
rpm安装在默认位置:
| RPM默认安装路径 | |
| /etc/ | 配置文件安装目录 |
| /usr/bin/ | 可执行命令安装路径 |
| /usr/lib/ | 程序所用的函数库保存位置 |
| /usr/share/doc/ | 基本软件使用手册保存位置 |
| /usr/share/man | 帮助文件保存位置 |
RPM包安装的服务可以使用服务管理命令(service)来管理,例如RPM包安装的apache的启动方法是:
- /etc/rc.d/init.d/httpd start
- service httpd start
而源码包安装的服务不可以服务命令管理,因为没有安装到默认路径,所有只能使用绝对路径进行管理:
/usr/local/apache2/bin/apachectl start
rpm作用有:安装,卸载,更新,查询,校验常用功能。
rpm包管理器:
rpm [options] PACKAGE_FILE ...
基本选项:
- --version:显示RPM版本号
- -v:显示操作过程详细信息
- -vv:显示更加详细的信息
- -h:以“#”号显示安装的进度(50个hash符号)
安装格式:
- rpm {-i|--install} [install-options] PACKAGE_FILE ...
-
- -i:安装
- -h:hash,以#表示安装进度
- --force:强制安装
- --nodeps:不检查包的依赖关系
- --test:不安装,简单的检查和报告可能的冲突
- --replacepkgs:覆盖安装
RPM包依赖关系:
被依赖的软件包需要先安装 ;
同时指定多个.rpm包文件进行安装;
即:先装A,才能装B,才能装C ……
安装rpm包,时会因依赖关系而无法安装,若想忽略依赖关系安装,则需使用--nodeps:
- ]# rpm -ivh httpd-2.2.15-53.el6.centos.x86_64.rpm
- error: Failed dependencies:
- apr-util-ldap is needed by httpd-2.2.15-53.el6.centos.x86_64
- httpd-tools = 2.2.15-53.el6.centos is needed by httpd-2.2.15-53.el6.centos.x86_64
- libdb-4.7.so()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
- libpcre.so.0()(64bit) is needed by httpd-2.2.15-53.el6.centos.x86_64
忽略依赖关系并安装:
- ]# rpm -ivh --nodeps httpd-2.2.15-53.el6.centos.x86_64.rpm
- Preparing...
- Updating / installing... ################################# [100%]
- 1:httpd-2.2.15-53.el6.centos ################################# [100%]
-nodeps就是安装时不检查依赖关系,比如你这个rpm需要A,但是你没装A,这样你的包就装不上,用了--nodeps你就能装上了。
--force就是强制安装,比如你装过这个rpm的版本1,如果你想装这个rpm的版本2,就需要用--force强制安装。
- rpm -ivh httpd-* --nodeps --force
- rpm -ivh apr-* --nodeps --force
卸载格式:
- rpm {-e|--erase} {ERASE OPTIONS} PACKAGE_NAME ...
- -e:卸载
- --nodeps:不检查包的依赖关系
- --test:测试卸载,跟-vv连用
- --allmatches:删除此包所有的版本
卸载有依赖关系的多个软件时:
依赖其他程序的软件包需要先卸载;
同时指定多个软件名进行卸载;
注:如果程序包的配置文件被修改过,卸载时,此文件通常不会被删除,而是被重命名(加后缀.rpmsave) 后留存。
还需要注意卸载时,不要加.rpm后缀,因为安装完成之后,就不是以rpm结尾的包。
建议:尽量不要卸载程序,只要不启用就可以,以免由依赖关系所引起不必要的麻烦。
更新格式:
- rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
- -U:升级或安装(升级某个rpm软件,若原本未装,则进行安装 {-U|–upgrade})
- -F:升级(更新某个rpm软件,若原本未装,则放弃安装 {-F|–freshen})
- --oldpackage:降级到旧版本
- --force:有冲突时强制升级
- --nodeps:不检查包的依赖关系
- --test:不安装,简单的检查和报告可能的冲突
注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核;同样不要对python进行升级。
(2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供。
1、旧版本httpd升级为新版本httpd:
- ]# rpm -Uvh --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm
- Preparing... ################################# [100%]
- Updating / installing...
- 1:httpd-2.2.15-55.el6.centos.2 ################################# [ 50%]
- Cleaning up / removing...
- 2:httpd-2.2.15-53.el6.centos ################################# [100%]
2、新版本降级到旧版本:
- ]# rpm -Uvh --nodeps --oldpackage httpd-2.2.15-53.el6.centos.x86_64.rpm
- Preparing... ################################# [100%]
- Updating / installing...
- 1:httpd-2.2.15-53.el6.centos ################################# [ 50%]
- Cleaning up / removing...
- 2:httpd-2.2.15-55.el6.centos.2 ################################# [100%]
查询格式:
- rpm {-q|--query} [select-options] [query-options] [PACKAGE_FILE ...]
- -q:是否安装指定的程序包
- select-options
- -a:查看所有已经安装的包
- -f:查看某个文件自己的安装包,/path/to/file
- -p:查看没有安装的包
-
- query-option
- --changelog:查看程序包的变化信息
- -i,--info:查看包的详细信息
- -c:查看包的配置文件
- -l:查看包安装的文件列表
- -d:查看包安装的帮助文件列表
- --dump:查看包文件列表元数据的详细信息
- --provides:查看包的capabilities
- --requires:查看包所依赖的capabilities
- --scripts:查看包安装或卸载时执行的脚本
此类脚本有四种:
- preinstall:安装过程开始之前执行的脚本
- postinstall:安装过程完成之后执行的脚本
- preuninstall:卸载开始之前执行的脚本
- postuninstall:卸载之后执行的脚本
- Capabilities:即该包能够提供的能力(例如:httpd能提供web server的能力)
查看httpd是否已经安装:
- rpm -q httpd
- httpd-2.2.15-55.el6.centos.2.x86_64
查看系统上所有以安装的rpm包:
- ]# rpm -qa
- gcc-4.8.2-16.el7.x86_64
- policycoreutils-2.2.5-11.el7.x86_64
- cairomm-1.10.0-8.el7.x86_64
- ...
查看安装/usr/sbin/httpd的rpm包:
- ]# rpm -qf /usr/sbin/httpd
- httpd-2.2.15-55.el6.centos.2.x86_64
查看尚未安装的包:
- ]# rpm -qp httpd-2.2.15-53.el6.centos.x86_64.rpm
- httpd-2.2.15-53.el6.centos.x86_64
查看httpd包的版本修改日志:
- ]# rpm -q --changelog httpd
- * Fri Nov 18 2016 Johnny Hughes
@centos.org> - 2.2.15-54.2 - - Roll in CentOS Branding
查看httpd包所安装的所有文件清单:
- ]# rpm -ql httpd
- /etc/httpd/conf.d/welcome.conf
- /etc/httpd/conf/httpd.conf
- /etc/httpd/conf/magic
- /etc/logrotate.d/httpd
- ...
查看httpd包的详细信息:
- ]# rpm -qi httpd
- Name : httpd
- Version : 2.2.15
- Release : 55.el6.centos.2
- Architecture: x86_64
- ...
- The Apache HTTP Server is a powerful, efficient, and extensible web server.
查看httpd包提供的capabilities:
- config(httpd) = 2.2.15-55.el6.centos.2
- httpd-mmn = 20051115
- httpd-suexec = 2.2.15-55.el6.centos.2
- mod_actions.so()(64bit)
- ...
- webserver
- httpd = 2.2.15-55.el6.centos.2
- httpd(x86-64) = 2.2.15-55.el6.centos.2
查询httpd包所依赖的capabilities:
- ]# rpm -q --requires httpd
- /bin/bash
- /bin/sh
- ...
- rtld(GNU_HASH)
- system-logos >= 7.92.1-1
- rpmlib(PayloadIsXz) <= 5.2-1
查询httpd包安装及卸载时所执行的脚本:
- ]# rpm -q --scripts httpd
- preinstall scriptlet (using /bin/sh):
- # Add the "apache" user
- getent group apache >/dev/null || groupadd -g 48 -r apache
- ...
- preuninstall scriptlet (using /bin/sh):
- if [ $1 = 0 ]; then
- ...
- /sbin/service httpd condrestart >/dev/null 2>&1 || :
查询已安装rpm包:
- rpm -qpi /mnt/Packages/dhcp-
- rpm -qpl zip-3.0-1.el6.x86_64.rpm
技巧使用:
一般当安装出现缺少某库时,可以使用-qf来查询此库由哪个程序包所提供,进而解决。例如当安装时出现缺少,liblogin.so.2库时:
- # find / -name "liblogin.so.2"|xargs rpm -qf
- cyrus-sasl-plain-2.1.23-13.el6_3.1.x86_64
-
命令组合总结:
- -qa:查看系统中已安装的所有RPM软件包列表,常跟|grep连用!
- 这里写图片描述
- -qi:查看指定软件的详细信息
- -ql:查询指定软件包所安装的目录、文件列表 (安装到哪了)
- -qc:仅显示指定软件包安装的配置文件
- -qd:仅显示指定软件包安装的文档文件
- -qf 查询文件/目录属于哪个RPM软件:
查询未安装的RPM包文件:
- -qpi:通过.rpm包文件查看该软件的详细信息,后面接完整包名。
- -qpl:查看.rpm安装包内所包含的目录、文件列表(将安装到哪)
- -qpc:查看.rpm安装包内包含的配置文件列表
- -qpd:查看.rpm安装包内包含的文档文件列表
校验格式:
- rpm {-V|--verify} [select-options] [verify-options]
- -V:检查包安装之后生成的文件是否发生了改变
- 如果没有输出结果,则当有结果输出时,则根据下面查询对应原因:
- 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
- S:文件大小改变
- M:文件权限和类型发生改变
- 5:MD5这一种指纹码内容改变
- D:设备主/次号改变
- L:Link路径改变
- U:文件所属人改变
- G:文件所属组改变
- T:文件修改时间改变
- p:文件的Capabilities发生改变
在httpd所安装的文件中添加一个数:
echo 1 >> /etc/httpd/conf/httpd.conf
大小改变,MD5码改变,文件修改时间改变 :
- # rpm -V --nodeps httpd
- S.5....T. c /etc/httpd/conf/httpd.conf
包来源合法性验证和完整性验证。
获取并导入信任的包制造者的公匙,对于CentOS发行版其命令:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-#
导入公匙之后时,会进行自动验证其完整性。也可手动验证:
rpm {-K|--checksig} PACKAGE_FILE...
数据库重建:
rpm的数据库路径:
/var/lib/rpm/
查询通过此数据库进行。
centos 6 获取帮助:
man rpm
centos 7 获取帮助:
- man rpmdb
-
- rpm {--initdb|--rebuilddb}[--dbpath DIRECTORY] [--root DIRECTORY]
- --initdb:初始化数据库;当前系统中无数据库时,创建一个新的数据库;
- --rebuildb:通过读取当前系统已安装的包,重新构建一个数据库;
- --dbpath DIRECTORY:指定数据库安装路径
- --root DIRECTORY:指明所在根目录
在/tmp/rpm下创建一个数据库:
- # rpm --initdb --dbpath /tmp/rpm
- # ls /tmp/rpm
- __db.001 __db.002 __db.003 __db.004 Packages
故障原因:
1) 非正常关机、误删除运行中的程序文件;
2) RPM数据文件被误写或删除;
当数据库损坏时,进入/tmp/rpm目录下,执行以下命令:
- rpm --rebuilddb
- rpm --initdb
场景软件包封装类型:

有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译生成二进制RPM包后,才能进行安装。
源代码 --> 预处理 --> 编译(gcc) --> 汇编 --> 链接 --> 执行。
这类软件包有多种安装方法,以redhat为例说明如下:
注意:
如果没有rpmbuild可以从系统安装光盘的Package中找到 rpm-build-version-packTimes.os.arch.rpm包安装。
rpm -ivh rpm-build-version-packTimes.os.arch.rpm。
方法一:
- rpm -i your-package.src.rpm
- cd /usr/src/redhat/SPECS
- rpmbuild -bp your-package.specs //一个和你的软件包同名的specs文件
- cd /usr/src/redhat/BUILD/your-package/ //一个和你的软件包同名的目录
- ./configure //这一步和编译普通的源码软件一样,可以加上参数
- make
- make install
方法二:
- rpm -i you-package.src.rpm
- cd /usr/src/redhat/SPECS //前两步和方法一相同
- rpmbuild -bb your-package.specs //一个和你的软件包同名的specs文件
这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等) 在这个目录下,有一个新的rpm包,这个是编译好的二进制文件。执行:
rpm -i new-package.rpm
即可安装完成。
rpm安装方式:
rpm -ivh *.rmp
有时候在尝试了上面两种方法后发现未能生成/usr/src/redhat/SPECS中的对应文件,可以再尝试第三种方法。
方法三:
直接解包成源码。
- rpm2cpio packName.src.rpm | cpio -id //把packName.src.rpm解包,会生成一个.tar.gz或者.tar.bz2的压缩包,那个就是源码
- tar -jxvf packName.tar.bz(2) //解压缩源码包
- cd packName
- ./configure 这一步和编译普通的源码软件一样,可以加上参数
- make
- make install
Yumdownloader是一款简单,但是却十分有用的命令行工具,它可以一次性下载任何 RPM 软件包及其所有依赖包。
yum install yum-utils
yumdownloader httpd
- yumdownloader --resolve --destdir=/root/mypackages/httpd
-
- yumdownloader sos-3.2-35.el7.centos.3.noarch.rpm --resolve --destdir=/root/桌面/
Ctrl+F搜索即可。
- www.rpmfind.net
- rpm.pbone.net
- http://mirror.centos.org/centos/7/os/x86_64/Packages/
- https://pkgs.org/
- https://rpmfusion.org/
- http://www.rpmfind.net/
- http://rpm.pbone.net/index.php3/stat/2/simple/2
- https://pkgs.org/download/libcurl.so.4()(64bit)
- http://rpmfind.net/linux/rpm2html/search.php?query=php
- http://files.directadmin.com/services/
安装时先卸载mariadb和已安装的mysql:
- rpm –qa | grep maria
- rpm –qa | grep –i mysql
使用命令:rpm -qa|grep -i mysql查看是否安装过mysql,如果安装过需要先卸载掉:

停止mysql服务,删除之前安装的mysql。
删除命令:rpm -e MySQL-server-5.6.10-1.rhel5.x86_64。
如果提示依赖包错误,则使用以下命令进行删除:
rpm -e MySQL-server-5.6.10-1.rhel5.x86_64 --nodeps
查找之前安装的mysql的目录、并且删除之前安装的mysql的文件。
查找命令find / -name mysql:

查找完后,删除对应的mysql目录。
删除命令:

删除mysql目录后,在删除etc下的my.cnf 文件。
使用如下命名:
rm -rf /etc/my.cnf
安装mysql5.7
登录MySQL官网下载mysql,下载地址 https://dev.mysql.com/downloads/mysql/ 这里使用的是rpm包安装,下载对应的社区版rpm包,注意的是需要登录甲骨文才能下载,不能只下载mysql-server服务器,因为有依赖关系,得下载下面五个包:

切换的root用户下,进入 /usr/local下,代码 cd /usr/local:

创建mysql文件夹 代码 mkdir mysql:

mysql5.7 rpm安装顺序,common→libs→client→server→devel:
安装顺序:
- rpm -ivh mysql-community-common-5.7.18-1.el7.x86_64.rpm
- rpm -ivh mysql-community-libs-5.7.18-1.el7.x86_64.rpm
- rpm -ivh mysql-community-client-5.7.18-1.el7.x86_64.rpm
- rpm -ivh imysql-community-server-5.7.18-1.el7.x86_64.rpm
- rpm -ivh mysql-community-devel-5.7.18-1.el7.x86_64.rpm
mysql安装完毕后,是不会自动启动的,但是第一次启动后,以后开机都是自启的,没有第一次启动之前,也是没有密码的。
当你第一次启动MySQL服务器的时候,mysql自己就会自己做很多事情,其中之一重要的就是初始密码,A superuseraccount 'root'@'localhost' is created. Apassword for the superuser is set and stored in the error log file. 当你安装后没有启动 MySQL之前, 你执行 vim /var/log/mysql.log你会发现该文件是空的或是新文件,现在就来启动mysql吧。
![]()
启动之后密码就初始化好了,查看密码代码,进入 /var/log/ 目录下可以直接 vim mysqld.log 查看 或者直接 vim /var/log/mysqld.log 查看 ps 是 mysqld.log 不是mysql.log 退出vim,先按Esc键,然后按shift+q键,最后输入q!即可。

登录代码 mysql -u root -p 回车就让你输入密码,输入密码的时候仔细点,密码比较乱。
- 1、修改MySQL的登录设置:
- # vi /etc/my.cnf
- 在[mysqld]的段中加上一句:skip-grant-tables
- 例如:
- [mysqld]
- datadir=/var/lib/mysql
- socket=/var/lib/mysql/mysql.sock
- skip-name-resolve
-
- 2、重新启动mysqld
- # service mysqld restart
-
- 3、将MySQL的登录设置修改回来
- # vi /etc/my.cnf
- 将刚才在[mysqld]的段中加上的skip-grant-tables删除
- 保存并且退出vi。
-
- 4、重新启动mysqld
- # service mysqld restart
-
- 5、创建新用户
- grant all privileges on *.* to root@'%' identified by '123456';
修改密码:
代码 set password for 'root'@'localhost'='newpasswd' newpasswd就是你设置的新密码,密码必须要符合要求,八位及以上,需要大小写、数字和特殊字符。
mysql5.7初始化密码报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before:
- #首先,修改validate_password_policy参数的值
-
- mysql> set global validate_password_policy=0;
- Query OK, 0 rows affected (0.00 sec)
-
- validate_password_length(密码长度)参数默认为8,我们修改为1
-
- mysql> set global validate_password_length=1;
- Query OK, 0 rows affected (0.00 sec)
-
- #完成之后再次执行修改密码语句即可成功
- mysql> set password = password("Szfore_68638");
- Or
- mysql> alter user 'root'@'localhost' identified by '123456';
- Query OK, 0 rows affected (0.00 sec)
-
- mysql> flush privileges ;
- Query OK, 0 rows affected (0.01 sec)
开启远程连接,允许远程连接数据库:
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Szfore_68638' WITH GRANT OPTION;
将mysqld服务加入开机自启动项:
- 将{mysql}/ support-files/mysql.server 拷贝为/etc/init.d/mysql并设置运行权限,这样就可以使用service mysql命令启动/停止服务,
- 否则就只能使用{mysql}/bin/mysqld_safe &命令来启动服务
- 还需要把mysql.server中basedir的相关路径,改为自定义的路径,默认路径是/usr/local/mysql
-
- [root@iZ2ze6adlpez0hj58u529qZ bin]# cd /usr/local/mysql/support-files
- [root@iZ2ze6adlpez0hj58u529qZ support-files]# cp mysql.server /etc/init.d/mysql
- cp: overwrite ‘/etc/init.d/mysql’?
-
- [root@iZ2ze6adlpez0hj58u529qZ support-files]# chmod +x /etc/init.d/mysql
-
- 将mysql注册为开机启动
-
- [root@iZ2ze6adlpez0hj58u529qZ support-files]# chkconfig --add mysql
-
- 查看是否成功
-
- [root@iZ2ze6adlpez0hj58u529qZ support-files]# chkconfig --list mysql
- Note: This output shows SysV services only and does not include native
- systemd services. SysV configuration data might be overridden by native
- systemd configuration.
配置mysql的配置文件my.cnf
- [root@localhost src]# vi /etc/my.cnf
- 在[mysqld]下面配置几行
- lower_case_table_names=1 #配置表名不区分大小写 1:不区分大小写 0:区分大小写 这行必须配置 默认表名是区分大小写的,不利于开发
- character-set-server=utf8 #设置为默认编码为utf8
- init_connect='SET NAMES utf8'
- max_connections=1024 #设置最大连接数
-
- 重启mysql 重启配置才能生效
- [root@localhost src]# service mysqld restart
- rpm -q samba //查询程序是否安装
- rpm -ivh /media/cdrom/RedHat/RPMS/samba-3.0.10-1.4E.i386.rpm #按路径安装并显示进度
- rpm -ivh --relocate /=/opt/gaim gaim-1.3.0-1.fc4.i386.rpm #指定安装目录
- rpm -ivh --test gaim-1.3.0-1.fc4.i386.rpm #用来检查依赖关系;并不是真正的安装;
- rpm -Uvh --oldpackage gaim-1.3.0-1.fc4.i386.rpm #新版本降级为旧版本
- rpm -qa | grep httpd #[搜索指定rpm包是否安装]--all搜索*httpd*
- rpm -ql httpd #[搜索rpm包]--list所有文件安装目录
- rpm -qpl httpd #列出RPM软件包内的文件信息[Query Package list];
- rpm -qpi Linux-1.4-6.i368.rpm #[查看rpm包]--query--package--install package信息
- rpm -qf Linux-1.4-6.i368.rpm #查找指定文件属于哪个RPM软件包[Query File];
- rpm -qpf Linux-1.4-6.i368.rpm #[查看rpm包]--file
- rpm -qpR file.rpm #[查看包]依赖关系
- rpm -Va #校验所有的RPM软件包,查找丢失的文件[View Lost];
- rpm2cpio file.rpm |cpio -div #[抽出文件]
- rpm -ivh file.rpm #[安装新的rpm]--install--verbose--hash
- rpm -ivhhttp://mirrors.kernel.org/fedora/core/4/i386/os/Fedora/RPMS/gaim-1.3.0-1.fc4.i386.rpm
- rpm -Uvh file.rpm #[升级一个rpm]--upgrade
- rpm -e file.rpm #[删除一个rpm包]--erase
1. 如何不安装但是获取rpm包中的文件?
使用工具rpm2cpio和cpio
- rpm2cpio xxx.rpm | cpio -vi
- rpm2cpio xxx.rpm | cpio -idmv
- rpm2cpio xxx.rpm | cpio --extract --make-directories
参数i和extract相同,表示提取文件。v表示指示执行进程。
d和make-directory相同,表示根据包中文件原来的路径建立目录。
m表示保持文件的更新时间。
2. 如何查看与rpm包相关的文件和其他信息?
下面所有的例子都假设使用软件包mysql-3.23.54a-11
1.我的系统中安装了那些rpm软件包
rpm -qa 讲列出所有安装过的包
如果要查找所有安装过的包含某个字符串sql的软件包
rpm -qa |grep sql
3. 如何获得某个软件包的文件全名?
rpm -q mysql 可以获得系统中安装的mysql软件包全名,从中可以获得
当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11
4. 一个rpm包中的文件安装到那里去了?
rpm -ql 包名
注意这里的是不包括.rpm后缀的软件包的名称
也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm。
如果只是想知道可执行程序放到那里去了,也可以用which,比如
which mysql
5. 一个rpm包中包含那些文件?
一个没有安装过的软件包,使用rpm -qlp ****.rpm
一个已经安装过的软件包,还可以使用rpm -ql ****.rpm
6. 如何获取关于一个软件包的版本,用途等相关信息?
一个没有安装过的软件包,使用rpm -qip ****.rpm
一个已经安装过的软件包,还可以使用rpm -qi ****.rpm
7. 某个程序是哪个软件包安装的,或者哪个软件包包含这个程序?
rpm -qf `which 程序名` 返回软件包的全名
rpm -qif `which 程序名` 返回软件包的有关信息
rpm -qlf `which 程序名` 返回软件包的文件列表
注意,这里不是引号,而是`,就是键盘左上角的那个键。
也可以使用rpm -qilf,同时输出软件包信息和文件列表
8. 某个文件是哪个软件包安装的,或者哪个软件包包含这个文件?
注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以
用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。
首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:
- # whereis ftptop
- ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
- # rpm -qf /usr/bin/ftptop
- proftpd-1.2.8-1
- # rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
- proftpd-1.2.8-1
获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如:
i 表示info,获得软件包的信息;
l 表示list,获得文件列表;
a 表示all,在所有包中执行查询;
f 表示file,根据文件进行相关的查询;
p 表示package,根据软件包进行查询
需要的查询条件可以使用grep产生,或者从"` `"中的命令行产生
9. 什么是rpm?
rpm 即RedHat Package Management,是RedHat的发明之一
10. 为什么需要rpm?
在一个操作系统下,需要安装实现各种功能的软件包。这些软件包一般都有各自的
程序,但是同时也有错综复杂的依赖关系。同时还需要解决软件包的版本,以及安装,
配置,卸载的自动化问题。为了解决这些问题,RedHat针对自己的系统提出了一个
较好的办法来管理成千上百的软件。这就是RPM管理系统。在系统中安装了rpm管理系统
以后,只要是符合rpm文件标准的打包的程序都可以方便的安装,升级,卸载
11. 是不是所有的linux都使用rpm ?
任何系统都需要包管理系统,因此很多linux都使用rpm系统。但rpm系统是为RH专门
但是TL,Mandrake等系统也都使用rpm。由于rpm的源程序可以在别的系统上进行编译,
所以有可能在别的系统上也使用rpm
除了rpm,其他一些系统也有自己的软件包管理程序,例如debian的deb包,
slakware也都有自己的包管理系统
12. rpm包的文件名为什么那么长?
rpm包的文件名中包含了这个软件包的版本信息,操作系统信息,硬件要求等等。
比如mypackage-1.1-2TL.i386.rpm,其中mypackage是在系统中登记的软件包的名字
1.1是软件的版本号,2是发行号,TL表示用于TL操作系统,还可能是RH等。i386表示
用于intel x86平台,还可能是sparc等。
13. 软件包文件名中的i386,i686是什么意思?
rpm软件包的文件名中,不仅包含了软件名称,版本信息,还包括了适用的硬件架构
的信息。
i386指这个软件包适用于intel 80386以上的x86架构的计算机(AI32)
i686指这个软件包适用于intel 80686以上(奔腾pro以上)的x86架构的计算机(IA32)
noarch指这个软件包于硬件架构无关,可以通用。
i686软件包的程序通常针对CPU进行了优化,所以,向后兼容比较用以,i386的包在
x86机器上都可以用。向前一般不兼容。不过现在的计算机,奔腾pro以下的CPU已经很少
用,通常配置的机器都可以使用i686软件包
14. 不同操作系统发行的rpm包可否混用?
对于已经编译成二进制的rpm包,由于操作系统环境不同,一般不能混用。
对于以src.rpm发行的软件包,由于需要安装时进行本地编译,所以通常可以在不同
系统下安装。
15. 使用rpm时遇到的一些特殊问题
Q 我用rpm -e **.rpm无法删除rpm包
A 包名不要包括rpm,
rpm -e 包名,可以包含版本号等信息,但是不可以有后缀.rpm
Q 在MS的系统下有没有读RPM文件的工具?
A wincmd with rpm plugins.....
Q 是否可以通过ftp安装安装升级rpm包?
A 可以。rpm -ivh ftp://xxxxxxxx/PATH2SomeRPM
Q rpm安装时已有的包版本过高怎么办?
A 有时由于安装的软件包太老,而系统中相关的软件包版本比较新,所以可能需要安装的包依赖的一些文件会找不到。这时有两种解决办法:
第一是在系统文件中找到和需要的文件功能相同或相似的文件,做一个符号链接到 需要的目录下。
第二是下载安装新版本的软件包。
yum 是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器。
yum 的理念是使用一个中心仓库(repository)管理一部分甚至一个distribution 的应用程序相互关系,根据计算出来的软件依赖关系进行相关的升级、安装、删除等等操作,减少了Linux 用户一直头痛的dependencies 的问题。
这一点上,yum 和apt 相同。apt 原为debian 的deb 类型软件管理所使用,但是现在也能用到RedHat 门下的rpm 了。
1)可以同时配置多个资源库(Repository)
2)简洁的配置文件(/etc/yum.conf)
3)自动解决增加或删除rpm包时遇到的倚赖性问题
4)使用方便
5)保持与RPM数据库的一致性
1、发行商将编译好软件放放在yum服务器内,该服务器内存放了许多的rpm包,以及这些包所依赖其他软件包所生产的依赖关系列表、每一个软件包安装所生产的文件列表、所有软件包安装生产的文件列表和RPM包分组信息(每一个组中包含多个RPM包),而存放这些文件和RPM包的位置就叫做仓库或者yum源。
说明:不同的yum源提供的软件包是不同的。
2、当客户端有软件下载需求时,会主动向yum服务器下载清单列表。这些清单列表就是yum仓库中的元数据文件。然后将这些元数据文件缓存在本地的/var/cache/yum/目录下。这样避免每次下载时都需要下载这写元数据文件。
3、然后客户端分析本地缓存目录(/var/cache/yum/)下依赖关系列表和rpm列表文件,并对本地RPM数据库进行对比,这样就可以将没有安装的软件通过yum服务器一次性下载到本地并进行安装。
刚刚说过由于每次下载都需要下载这些元数据文件,因此下载效率比较低,一般情况下,我们将这些文件都是保存到本地缓存中,这样每次下载前,只需要到本地缓存中去分析这些文件即可,就不需要再去下载了。这些文件都是存放在某个仓库中repodata目录下的。
这几个文件分别是:
- primary.xml.gz:该文件保存了所有RPM列表,以及根据分析这些RPM包生成的依赖关系列表。且保存了每个软件包安装生产的文件;
- filelists.xml.gz:该文件保存了所有的RPM包生产的文件列表;
- other.xml.gz:保存的是额外信息,主要保存的RPM的修改日志;
- repomd.xml:记录的是上面三个文件的时间戳和校验和(主要是用来更新这些元数据文件的);
- comps*.xml:存放的是RPM包分组信息;
获取yum仓库中的软件包的方式
之前说过,RPM包是存放在yum仓库中的,那么当客户端发送下载请求时,客户端如何能找到yum仓库呢?
这就需要本地客户端提供一个配置文件。
在这个文件中,我们需要指定需要使用何种方法获取yum仓库中的数据。
根据获取的方法不同,可以分为以下两种:
一、当yum仓库在本地目录时
file:///ip/path/to/somefile #注意是三个/
这种方式只能提供自己到本地yum仓库中下载数据
二、当yum仓库在远处服务器时
- ftp://{ip|domain|path}/path/to/somefile
- http://{ip|domain|path}/path/to/somefile
使用这种方式来获取yum仓库中的数据时,需要将yum仓库以ftp或者http协议的方式共享出去,这样更多的客户端都可以到yum仓库中去下载软件包了。
默认系统安装好后,在/etc/yum.repo.d/这个目录下面有很多文件,都是.repo结尾的,repo文件是yum源(也就是软件仓库)的配置文件,通常一个repo文件定义了一个或者多个软件仓库的细节内容,例如我们将从哪里下载需要安装或者升级的软件包,repo文件中的设置内容将被yum读取和应用!
配置文件:
- /etc/yum.conf # 为所有仓库提供公共配置
- /etc/yum.repos.d/*.repo # 为仓库的指向提供配置
- /var/cache/yum/ # yum缓存地址
- /var/log/yum.log # yum安装卸载的记录文件
yum的配置文件分为2部分
全局配置文件和分段配置文件,全局配置文件对所有仓库生效。
全局配置文件为/etc/yum.conf ,该配置文件的主要内容为:
- [main] //中括号内的为仓库的名字,须唯一
- cachedir=/var/cache/yum //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/cache/yum
- keepcache=0 //安装完成后是否保留软件包,0为不保留(默认为0),1为保留
- debuglevel=2 //Debug 信息输出等级,范围为0-10,缺省为2
- logfile=/var/log/yum.log //yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。
- pkgpolicy=newest //包的策略。一共有两个选项,newest 和last,这个作用是如果你设置了多个repository,而同一软件在不同的repository 中同时存在,yum 应该安装哪一个,如果是newest,则yum 会安装最新的那个版本。如果是last,则yum 会将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装。一般都是选newest。
- distroverpkg=redhat-release //指定一个软件包,yum 会根据这个包判断你的发行版本,默认是redhat-release,也可以是安装的任何针对自己发行版的rpm 包。
- tolerant=1 //有1和0两个选项,表示yum 是否容忍命令行发生与软件包有关的错误,比如你要安装1,2,3三个包,而其中3此前已经安装了,如果你设为1,则yum 不会出现错误信息。默认是0。
- exactarch=1 //有1和0两个选项,设置为1,则yum 只会安装和系统架构匹配的软件包,例如,yum 不会将i686的软件包安装在适合i386的系统中。默认为1。
- retries=6 //网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6.
- obsoletes=1 //这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。
- plugins=1 //是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。
- bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum
- # Note: yum-RHN-plugin doesn't honor this.
- metadata_expire=1h //本地缓存目录的缓存时间为1h
- installonly_limit = 5
- # PUT YOUR REPOS HERE OR IN separate files named file.repo
- # in /etc/yum.repos.d
- //上面这两句话的意思是在/etc/yum.repos.d/目录下,所有后缀为.repo文件都会作为配置文件的组成部分。
-
-
- # 除了上述之外,还有一些可以添加的选项,如:
- exclude=selinux* // 排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安装了诸如美化包,中文补丁的朋友特别有用。
- gpgcheck=1 // 1表示启用,0表示不启用,分别代表是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的。这个选项如果设置在[main]部分,则对每个repository 都有效。默认值为0。
注:yum默认情况下安装软件时是不会保留安装包的,如果要保留,需要修改/etc目录下的yum.conf配置文件,将默认配置项keepcache改为1,此时在使用yum安装软件后,会对安装包进行缓存,缓存的安装包会留存在配置项cachedir所指定的目录中。
注意的如果执行了:
yum clean all
命令,此时会删除这些缓存的安装包。
分段配置文件是/etc/yum.repos.d/*.repo,这个配置文件其实就是定义每一个yum仓库的,因此该配置文件只对指定仓库生效。
该配置文件和全局配置文件大致相同,主要内容为:
- [rhel-debuginfo] //仓库名称,同一系统上的repo文件中该字段不能重名
- name=Red Hat Enterprise Linux $releasever - $basearch - Debug //描述仓库的含义
- baseurl= ftp://ftp.redhat.com/pub/redhat/linux/enterprise/$releasever/en/os/$basearch/Debuginfo/
-
- #baseurl这一行定义的是获取yum仓库数据的方式
-
- enabled=1 //是否启用该yum仓库,1为启动,0为不启用
- gpgcheck=1 //是否进行数字签名,检查软件包的来源合法性
- gpgkey= file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release #这一行定义的是数字签名公钥文件所在的位置
yum源可以分为2种:网络源和本地源。
网络源(ftp:// 、http://)的好处是软件包更新较快,但是容易受网络带宽的影响。
本地源(file://)用的是已经下载好的软件包,不用受网络影响,但包更新可能不够及时。
阿里云网络源地址:centos-7-os-x86_64-Packages安装包下载_开源镜像站-阿里云
网易163网络源地址:欢迎访问网易开源镜像站
CentOS网络源地址:Index of /centos/
Redhat7替换yum源
方法一:
1、卸载系统yum
- #1,查看原有yum包
- rpm -qa|gerp yum
-
- #2,卸载yum包
- rpm -qa|grep yum|xargs rpm -e --nodeps
- rpm -qa|grep yum
-
- #3,下载网易yum包
- mkdir /tmp/pkg && cd /tmp/pkg
- wget http://mirrors.163.com/centos/7.5.1804/os/x86_64/Packages/yum-3.4.3-158.el7.centos.noarch.rpm
- wget http://mirrors.163.com/centos/7.5.1804/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
- wget http://mirrors.163.com/centos/7.5.1804/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-45.el7.noarch.rpm
-
- Or
- 下载阿里云yum包
- wget http://mirrors.aliyun.com/centos/7.2.1511/os/x86_64/Packages/yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
- wget http://mirrors.aliyun.com/centos/7.2.1511/os/x86_64/Packages/yum-3.4.3-132.el7.centos.0.1.noarch.rpm
- wget http://mirrors.aliyun.com/centos/7.2.1511/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
-
-
- #4,安装下载好的rpm包
- rpm -ivh yum-*
- rpm -qa|grep yum
2、用wget下载repo文件
- cd /etc/yum.repos.d/
- wget http://mirrors.aliyun.com/repo/Centos-7.repo
- Or
- curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
如果wget命令不生效,说明还没有安装wget工具
yum -y install wget
回车进行安装。
当前目录是/etc/yum.repos.d/,刚刚下载的Centos-7.repo也在这个目录上
3、备份系统原来的repo文件
mv CentOs-Base.repo CentOs-Base.repo.bak
即是重命名 CentOs-Base.repo -> CentOs-Base.repo.bak
4、替换系统原理的repo文件
mv Centos-7.repo CentOs-Base.repo
即是重命名 Centos-7.repo -> CentOs-Base.repo
5、执行yum源更新命令
- yum clean all
- yum makecache
- yum update
- yum repolist all
依次执行上述命令即配置完毕。
方法二:
用命令生成yum配置文件,此方法是redhat7版本新加入的命令。
yum -y install yum-utils
1、生成yum配置文件
[root@localhost yum.repos.d]# yum-config-manager –add-repo ‘http://mirrors.163.com/centos/7/os/x86_64/’
2、修改新生成的配置文件
- [root@localhost yum.repos.d]# vim mirrors.163.com_centos_7_os_x86_64_.repo
-
- [mirrors.163.com_centos_7_os_x86_64_]
- name=added from: http://mirrors.163.com/centos/7/os/x86_64/
- baseurl=http://mirrors.163.com/centos/7/os/x86_64/
- enabled=1
- gpgkey=http://mirrors.163.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7
如果不加上gpgkey,安装的时候会报错。

启用某个仓库:
不要的在yum文件中增加enabled=0。
- yum-config-manager --enable 仓库名
- yum-config-manager --disable mysql55-community
- yum repolist enabled | grep mysql
Redhat6替换yum源
1、卸载系统的yum
- rpm -qa | grep yum | xargs rpm -e --nodeps
- rpm -qa | grep python-urlgrabber | xargs rpm -e --nodeps
检查是否已经卸载完成:
- rpm -qa | grep yum
- rpm -qa | grep python-urlgrabber
2、下载yum以及相关软件包
- wget http://vault.centos.org/6.8/os/x86_64/Packages/yum-3.2.27-14.el6.centos.noarch.rpm
- wget http://vault.centos.org/6.8/os/x86_64/Packages/yum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm
- wget http://vault.centos.org/6.8/os/x86_64/Packages/yum-plugin-fastestmirror-1.1.26-11.el6.noarch.rpm
- wget http://vault.centos.org/6.8/os/x86_64/Packages/Python-iniparse-0.3.1-2.1.el6.noarch.rpm
- wget http://vault.centos.org/6.8/os/x86_64/Packages/python-urlgrabber-3.9.1-11.el6.noarch.rpm
3、安装yum
- rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
- rpm -ivh python-urlgrabber-3.9.1-11.el6.noarch.rpm
- rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
- rpm -ivh yum-3.2.29-81.el6.centos.noarch.rpm rpm -ivh
- rpm -ivh yum-plugin-fastestmirror-1.1.30-41.el6.noarch.rpm
4、下载yum公钥导入证书
- wget http://vault.centos.org/6.8/os/x86_64/RPM-GPG-KEY-CentOS-6
- rpm --import RPM-GPG-KEY-CentOS-6
5、下载CentOS-Base.repo文件到/etc/yum.repos.d中
wget http://mirrors.163.com/.help/CentOS6-Base-163.repo -O /etc/yum.repos.d/CentOS6-Base.repo
6、把其中的$releasever全部替换成6.8
- :s/$releasever/6.8/g
- Or
- sed -i 's/\$releasever/6.8/g' /etc/yum.repos.d/CentOS6-Base.repo
7、更新yum
- yum clean all
- yum makecache
- yum update -y
Redhat5替换yum源
CentOS 5 在2017-03-31日已经结束支持,不再提供维护更新,所以包括阿里云镜像站的文件可能都是过时或已经有部分文件缺失。
在CentOS 5里使用 vault.centos.org 作为yum源。
官网地址:Index of /
1、下载yum的rpm安装包
wget http://vault.centos.org/5.5/os/x86_64/CentOS/yum-3.2.22-26.el5.centos.noarch.rpm
2、确定没有安装yum的rpm包
rpm -qa | grep yum
3、安装下载的包
- # rpm -ivh yum-3.2.22-26.el5.centos.noarch.rpm
- warning: yum-3.2.22-26.el5.centos.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- error: Failed dependencies:
- yum-fastestmirror is needed by yum-3.2.22-26.el5.centos.noarch
- yum-metadata-parser >= 1.1.0 is needed by yum-3.2.22-26.el5.centos.noarch
报出缺少的依赖的包。
4、下载安装依赖
- http://vault.centos.org/5.5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm
- http://vault.centos.org/5.5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
- rpm -ivh yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
- error: Failed dependencies:
- libxml2.so.2()(64bit) is needed by yum-metadata-parser-1.1.2-3.el5.centos.x86_64
报出缺少的依赖的包。
http://vault.centos.org/5.5/os/x86_64/CentOS/libxml2-2.6.26-2.1.2.8.x86_64.rpm
- # rpm -ivh yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
- warning: yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- Preparing... ########################################### [100%]
- 1:yum-metadata-parser ########################################### [100%]
-
- # rpm -ivh libxml2-2.6.26-2.1.2.8.x86_64.rpm
- warning: libxml2-2.6.26-2.1.2.8.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- Preparing... ########################################### [100%]
- package libxml2-2.6.26-2.1.2.8.x86_64 is already installed
检验一下yum包的依赖情况:
- # rpm -ivh yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm
- warning: yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- error: Failed dependencies:
- yum >= 3.0 is needed by yum-fastestmirror-1.1.16-14.el5.centos.1.noarch
-
- # rpm -ivh yum-3.2.22-26.el5.centos.noarch.rpm
- warning: yum-3.2.22-26.el5.centos.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- error: Failed dependencies:
- yum >= 3.0 is needed by yum-3.2.22-26.el5.centos.noarch
两个一起安装解决:
- # rpm -ivh yum-3.2.22-26.el5.centos.noarch.rpm yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm
- warning: yum-3.2.22-26.el5.centos.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
- Preparing... ########################################### [100%]
- 1:yum-fastestmirror ########################################### [ 50%]
- 2:yum ########################################### [100%]
5、只保留/etc/yum.repos.d/CentOS-Base.repo 其它文件 要么删除要么改后缀。
编辑文件 /etc/yum.repos.d/CentOS-Base.repo ,将其中的 mirrors.aliyun.com/centos/$releasever 替换成相应历史源站地址和版本号,如 vault.centos.org/5.11:
- [base]
- name=CentOS-$releasever - Base
- failovermethod=priority
- baseurl=http://vault.centos.org/5.11/os/$basearch/
- gpgcheck=1
- gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-5
- http://mirrors.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-5
- #released updates
- [updates]
- name=CentOS-$releasever - Updates
- failovermethod=priority
- baseurl=http://vault.centos.org/5.11/updates/$basearch/
- http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
- gpgcheck=1
- gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-5
- http://mirrors.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-5
- #additional packages that may be useful
- [extras]
- name=CentOS-$releasever - Extras
- failovermethod=priority
- baseurl=http://vault.centos.org/5.11/extras/$basearch/
- http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
- gpgcheck=1
- gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-5
- http://mirrors.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-5
- #additional packages that extend functionality of existing packages
- [centosplus]
- name=CentOS-$releasever - Plus
- failovermethod=priority
- baseurl=http://vault.centos.org/5.11/centosplus/$basearch/
- http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
- gpgcheck=1
- enabled=0
- gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-5
- http://mirrors.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-5
- #contrib - packages by Centos Users
- [contrib]
- name=CentOS-$releasever - Contrib
- failovermethod=priority
- baseurl=http://vault.centos.org/5.11/contrib/$basearch/
- http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
- gpgcheck=1
- enabled=0
- gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-5
- http://mirrors.aliyuncs.com/centos/RPM-GPG-KEY-CentOS-5
6、导入key
- wget https://mirrors.tuna.tsinghua.edu.cn/centos-vault/RPM-GPG-KEY-CentOS-5
- rpm --import RPM-GPG-KEY-CentOS-5
7、更新和启用新的yum源
yum clean all && yum makecache
确定系统架构及版本:
- [root@fgr conf]# cat /etc/redhat-release
- CentOS Linux release 7.6.1810 (Core)
- [root@fgr conf]# uname -r
- 3.10.0-957.12.2.el7.x86_64
- [root@fgr conf]# uname -a
- Linux fgr.first 3.10.0-957.12.2.el7.x86_64 #1 SMP Tue May 14 21:24:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
查看当前系统已经有了哪些源:
- [root@fgr conf]# yum repolist
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- * base: centos.ustc.edu.cn
- * extras: centos.ustc.edu.cn
- * updates: centos.ustc.edu.cn
- 源标识 源名称 状态
- base/7/x86_64 CentOS-7 - Base 10,019
- epel-apache-maven/7/x86_64 maven from apache foundation. 4
- extras/7/x86_64 CentOS-7 - Extras 413
- google-chrome google-chrome 3
- updates/7/x86_64 CentOS-7 - Updates 1,945
- repolist: 12,384
安装EPEL源
- [root@fgr conf]# yum install epel-release
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- * base: centos.ustc.edu.cn
- * extras: centos.ustc.edu.cn
- * updates: centos.ustc.edu.cn
- 正在解决依赖关系
- --> 正在检查事务
- ---> 软件包 epel-release.noarch.0.7-11 将被 安装
- --> 解决依赖关系完成
-
- 依赖关系解决
-
- ================================================================================
- Package 架构 版本 源 大小
- ================================================================================
- 正在安装:
- epel-release noarch 7-11 extras 15 k
-
- 事务概要
- ================================================================================
- 安装 1 软件包
-
- 总下载量:15 k
- 安装大小:24 k
- Is this ok [y/d/N]: y
- Downloading packages:
- epel-release-7-11.noarch.rpm | 15 kB 00:00
- Running transaction check
- Running transaction test
- Transaction test succeeded
- Running transaction
- 正在安装 : epel-release-7-11.noarch 1/1
- 验证中 : epel-release-7-11.noarch 1/1
-
- 已安装:
- epel-release.noarch 0:7-11
-
- 完毕!
手动更新源:
- [root@fgr conf]# yum makecache
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- epel/x86_64/metalink | 6.5 kB 00:00
- * base: centos.ustc.edu.cn
- * epel: mirrors.aliyun.com
- * extras: centos.ustc.edu.cn
- * updates: centos.ustc.edu.cn
- base | 3.6 kB 00:00
- epel | 4.7 kB 00:00
- epel-apache-maven | 3.3 kB 00:00
- extras | 3.4 kB 00:00
- google-chrome | 1.3 kB 00:00
- updates | 3.4 kB 00:00
- (1/15): epel/x86_64/group_gz | 88 kB 00:00
- (2/15): epel/x86_64/prestodelta | 420 B 00:00
- (3/15): epel/x86_64/updateinfo | 1.0 MB 00:00
- (4/15): epel/x86_64/other_db | 3.2 MB 00:01
- (5/15): epel/x86_64/filelists_db | 11 MB 00:02
- (6/15): epel-apache-maven/7/x86_64/prestodelta | 78 B 00:04
- (7/15): extras/7/x86_64/prestodelta | 62 kB 00:00
- (8/15): extras/7/x86_64/other_db | 126 kB 00:00
- (9/15): extras/7/x86_64/filelists_db | 243 kB 00:00
- (10/15): google-chrome/other | 369 B 00:00
- (11/15): updates/7/x86_64/filelists_db | 3.7 MB 00:00
- (12/15): google-chrome/filelists | 1.7 kB 00:03
- (13/15): epel-apache-maven/7/x86_64/other_db | 2.5 kB 00:05
- epel-apache-maven/7/x86_64/fil FAILED
- http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-7/x86_64/repodata/7a6c906282caaf29683c51338d259e0f990a929cef942ba7517c9a60503c9cf5-filelists.sqlite.bz2: [Errno 12] Timeout on https://repos.fedorapeople.org/repos/dchen/apache-maven/epel-7/x86_64/repodata/7a6c906282caaf29683c51338d259e0f990a929cef942ba7517c9a60503c9cf5-filelists.sqlite.bz2: (28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
- 正在尝试其它镜像。
- (14/15): epel-apache-maven/7/x86_64/filelists_db | 4.7 kB 00:02
- (15/15): epel/x86_64/primary_db | 6.7 MB 01:17
- google-chrome 3/3
- google-chrome 3/3
- 元数据缓存已建立
再次查看源,可以看到epel已经安装成功:
- [root@fgr conf]# yum repolist
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- * base: centos.ustc.edu.cn
- * epel: mirrors.aliyun.com
- * extras: centos.ustc.edu.cn
- * updates: centos.ustc.edu.cn
- 源标识 源名称 状态
- base/7/x86_64 CentOS-7 - Base 10,019
- epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,195
- epel-apache-maven/7/x86_64 maven from apache foundation. 4
- extras/7/x86_64 CentOS-7 - Extras 413
- google-chrome google-chrome 3
- updates/7/x86_64 CentOS-7 - Updates 1,945
- repolist: 25,579
推荐两个源epel源和repoforge源
epel源:https://fedoraproject.org/wiki/EPEL点开一直往下拉,就能找到需要的yum源,有5的版本到7的版本
优点:软件更新非常快。东西非常的多,都非常的新
特点:更新非常慢。
repoforge源: http://repoforge.org/use/
优点:东西多
这两个源软件非常多,软件更新非常快,比如我们要安装一些非常新的软件,在这里面都可以找到。
下载RPM
下载地址:
https://centos.pkgs.org/7/repoforge-x86_64/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm.html
安装:
- # 进到下载路径,每个人的路径应该不同
- [root@fgr conf]# cd /home/fgr/下载
- [root@fgr 下载]# ll
- 总用量 783168
- -rw-rw-r--. 1 fgr fgr 9699102 5月 17 18:20 apache-tomcat-8.5.41.tar.gz
- -rw-rw-r--. 1 fgr fgr 58409570 5月 17 17:50 google-chrome-stable_current_x86_64.rpm
- -rw-rw-r--. 1 fgr fgr 700598701 5月 17 18:29 ideaIU-2019.1.2.tar.gz
- -rw-r--r--. 1 fgr fgr 0 5月 17 16:13 jdk-8u211-linux-x64.rpm
- -rw-------. 1 fgr fgr 19562035 5月 17 16:40 jdk-8u211-linux-x64.rpm.part
- -rw-rw-r--. 1 fgr fgr 12520 5月 19 14:01 rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm
- -rw-rw-r--. 1 fgr fgr 13672413 5月 17 23:47 sublime_text_3_build_3207_x64.tar.bz2
- #安装
- [root@fgr 下载]# rpm -Uvh rpmforge-release*rpm
- 警告:rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm: 头V3 DSA/SHA1 Signature, 密钥 ID 6b8d79e6: NOKEY
- 准备中... ################################# [100%]
- 正在升级/安装...
- 1:rpmforge-release-0.5.3-1.el7.rf ################################# [100%]
手动更新,查看源:
- [root@fgr 下载]# yum makecache
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- epel/x86_64/metalink | 7.2 kB 00:00
- * base: centos.ustc.edu.cn
- * epel: mirrors.aliyun.com
- * extras: centos.ustc.edu.cn
- * rpmforge: mirrors.tuna.tsinghua.edu.cn
- * updates: centos.ustc.edu.cn
- base | 3.6 kB 00:00
- epel-apache-maven | 3.3 kB 00:00
- extras | 3.4 kB 00:00
- google-chrome | 1.3 kB 00:00
- rpmforge | 1.9 kB 00:00
- updates | 3.4 kB 00:00
- (1/2): rpmforge/other_db | 34 kB 00:00
- (2/2): rpmforge/filelists_db | 96 kB 00:00
- 元数据缓存已建立
- [root@fgr 下载]# yum repolist
- 已加载插件:fastestmirror, langpacks
- Loading mirror speeds from cached hostfile
- * base: centos.ustc.edu.cn
- * epel: mirrors.aliyun.com
- * extras: centos.ustc.edu.cn
- * rpmforge: mirrors.tuna.tsinghua.edu.cn
- * updates: centos.ustc.edu.cn
- 源标识 源名称 状态
- base/7/x86_64 CentOS-7 - Base 10,019
- epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 13,195
- epel-apache-maven/7/x86_64 maven from apache foundation. 4
- extras/7/x86_64 CentOS-7 - Extras 413
- google-chrome google-chrome 3
- rpmforge RHEL 7 - RPMforge.net - dag 245
- updates/7/x86_64 CentOS-7 - Updates 1,945
- repolist: 25,824
使用createrepo命令可以将某个目录配置为yum仓库。不过需要实现安装createrepo软件包。
其中-g FILENAME选项可以用来指定包组定义文件。
手动配置yum仓库的步骤:
1、首先使用rpm -q createrepo命令来查看该软件包是否已安装
2、如果该软件包没有安装,使用yum install createrepo命令来安装该软件包
3、使用createrepo directory将某个目录常见成仓库
4、创建仓库成功后,会生成一个repodata目录,该目录下存放着仓库的元数据文件
5、在/etc/yum.repo.d/目录下创建一个后缀为.repo的文件
6、配置.repo这个文件即可。
使用createrepo搭建本地仓库
注意以下操作是在连接互联网服务器上完成的。
安装createrepo:
yum install -y createrepo
将下载软件包的目录制作为yum源:
createrepo /data/repo/
命令执行后,会在该目录下创建一个repodata目录,如下图:

制作本地yum源
1、拷贝createrepo制作的本地仓库
将第三步制作的yum源库,即连接互联网服务器的/data/repo目录下的内容,打包后,拷贝上传到内网服务器/data/repo目录下,解压。注意以下操作是在内网服务器上完成的。
2、修改/etc/yum.repos.d下的配置文件,将源指向自己。
1)进入/etc/yum.repos.d
cd /etc/yum.repos.d/
2)备份所有配置文件
rename .repo .repo.bak *
3)生成repo
第一种:编辑本机配置文件
vi CentOS-Local.repo
内容如下:
- [base]
- name=CentOS-Local
- baseurl=file:///data/repo
- gpgcheck=0
- enabled=1 #很重要,1为启用。
或:
- ls /etc/yum.repos.d/
- cat > /etc/yum.repos.d/CentOS-Local.repo <<EOF
- [base]
- name=CentOS-Local
- baseurl=file:///data/repo
- enabled=1
- gpgcheck=0
- EOF
-
- yum clean all
- yum list
第二种:创建快捷配置文件
- $ yum-config-manager --add http://192.168.4.254/rh7dvd ftp://192.168.4.254/rh7dvd file///mnt
- $ echo "gpgcheck=0" > >
第三种:写脚本
- #!/binbash
- rm -rf /etc/yum.repos.d/*
- echo"[rhel]
- Name=rhel linux
- Baseurl=http://xxxxx
- Gpgcheck=0
- Enabled=1 " > /etc/yum.repos.d/rh7.dvd
- $ yum clean all && yum repolist
3、列出可用的YUM源
- yum clean all
- yum makecache
- yum repolist
此时本地yum源制作完成,即可使用yum命令安装仓库中存在的软件了。
制作内网yum源
1、安装httpd服务
yum install -y httpd
2、启动httpd服务
service httpd start
使用浏览器访问http://xxx.xxx.xxx.xxx:80(如果访问不通,检查防火墙是否开启了80端口或关闭防火墙),检查是否正常启动。
3、将YUM源仓库拷贝到httpd(Apache Server)中
cp -r /data/repo/ /var/www/html/CentOS-7
此时其他的服务器即可通过网络访问这个内网中的YUM源了。
可通过浏览器查看软件安装包情况,输入http://xxx.xxx.xxx.xxx/CentOS-7回车,如下图:

4、其它服务器访问内网yum源
注意:以下操作是在想要访问内网yum源的服务器上进行的配置。
1)备份/etc/yum.repos.d下的所有配置文件。
- cd /etc/yum.repos.d/
- rename .repo .repo.bak *
2)编辑本机配置文件指向内网yum源。
vi CentOS-Local.repo
内容如下:
- [base]
- name=CentOS-Local
- baseurl=http://192.168.52.168/CentOS-7 #内网
- gpgcheck=0
- enabled=1 #很重要,1才启用
3) 列出可用YUM源
- yum clean all
- yum makecache
- yum repolist
5、加入依赖包到内网yum源
在内网yum源服务器上安装createrepo:
yum install -y createrepo
将rmp包拷贝到/var/www/html/CentOS-7目录下,执行:
createrepo /var/www/html/CentOS-7
语法:
yum [option] [COMMAND][package_name...]
option:
- -y:自动回答为yes
- -nogpgcheck:不进行数字签名检查 gpc check
- -q:静默模式;
- --disablerepo=repoidglob:临时禁用此处指定的repo;
- --enablerepo=repoidglob:临时启用此处指定的repo;
- --noplugins:禁用所有插件
COMMAND:
- list:列出yum仓库上面所有的软件包和版本,list命令支持glob,即通配符。还可以接的子命令有:
- all:列出yum仓库上面所有的软件包和版本,类似于rpm -qa
- available:列出仓库中但未安装的软件包
- installed:列出仓库中已经安装的软件包
- updates:列出仓库中可以升级的软件包
- search KEYWORD:根据关键字搜寻某个软件包,只要包含KEYWORD的软件包都会显示出来
- install:安装某个软件包
- update:升级某个软件包
- update-to:将某个软件包升级为指定的版本
- reinstall:重新安装某个软件包
- check-update:检查哪些可用于升级的软件包
- localinstall:安装本地的RPM包
- remove|erase:卸载某个软件
- info:查看某个软件包的信息;类似于rpm -qi
- provides|whatprovides:查看指定的文件是由哪个软件包生成的
- makecache:生产元数据缓存文件。
- clean:清理缓存
- package_name:清理缓存目录下的软件包
- headers:清理缓存目录下的headers
- all:清理缓存目录下所有文件和RPM包
- metadata:清理元数据文件
- repolist:显示repo列表及其简要信息
- all:显示所有的yum仓库
- enabled:显示启用的yum仓库,默认是该选项
- disabled:显示禁用的yum仓库
yum的软件群组功能
语法格式:
yum [群组功能] [软件群组]
群组功能包括:
- grouplist:列出所有的可使用软件群组
- groupinfo:后面接group_name,查看该群组包含的所有软件
- groupinstall:安装这个群组中所有的软件
- groupremove:删除某个软件群组
- groupupdate:更新某个软件群组中的所有软件
安装KDE套件:
[root@zcwyou ~]# yum groupinstall "KDE (K Desktop Environment)"
安装声音和视频套件:
[root@zcwyou ~]# yum groupinstall "Sound and Video"
安装开发套件:
[root@zcwyou ~]# yum groupinstall "Development Tools"
列出所有可更新的软件清单:
[root@zcwyou ~]# yum check-update
yum使用
通过yum安装检测最快镜像的插件,自动搜索最快镜像插件:
yum install yum-fastestmirror
安装yum图形窗口插件:
yum install yumex
查看可能批量安装的列表:
yum grouplist
安装:
- yum install //全部安装
- yum install package1 //安装指定的安装包package1
- yum localinstall rpmfile1 [rpmfile2] [...] //本地安装软件包
- yum reinstall package1 //重新安装软件包
- yum groupinsall group1 //安装程序组group1
如果想自动确认安装,加-y:
yum -y install xxx
下载的rpm包到/data/repo目录:
- yum install ${软件} --downloadonly --downloaddir=${指定目录}
- yum install httpd --downloadonly --downloaddir=/data/repo
更新和升级:
- yum update //全部更新
- yum localupdate rpmfile1 [rpmfile2] [...] //本地升级软件包
- yum upgrade //更新系统以及内核
- yum update package1 //更新指定程序包package1
- yum check-update //检查可更新的程序
- yum upgrade package1 //升级指定程序包package1
- yum groupupdate group1 //升级程序组group1
- yum downgrade package //package降级安装
查找和显示:
- yum info package1 //显示安装包信息package1
- yum info updates //列出所有可更新的软件包信息
- yum list //显示所有已经安装和可以安装的程序包
- yum list all // 显示所有软件包
- yum list all|grep httpd //搜索所有含httpd的软件包
- yum groupinfo group1 //显示程序组group1信息
- yum search string //根据关键字string查找安装包
- yum deplist httpd //列出一个包所有依赖的包
- yum list available //显示所有可用的软件包
- yum list installed //列出所有已安装的软件包
- yum list updates //显示有更新的软件包
- yum provides //文件路径/软件提供的命令
- yum provides */syslinux //文件路径
- eg: yum list | grep python-u
- python-urlgrabber.noarch 3.10-8.el7 @anaconda
- python-urllib3.noarch 1.10.2-5.el7 development
- python-urwid.x86_64 1.1.1-3.el7 development

删除程序:
- yum remove | erase package1 //删除程序包package1
- yum erase httpd //卸载软件包和依赖环境
- yum groupremove group1 //删除程序组group1
- yum deplist package1 //查看程序package1依赖情况
缓存:
- yum check-update //检查可用的升级
- yum clean all //清理yum所有的缓存
- yum make cache //建立yum缓存
- yum clean packages //清除缓存目录下的软件包
- yum clean headers //清除缓存目录下的 headers
- yum clean oldheaders //清除缓存目录下旧的 headers
- yum clean, yum clean all (= yum clean packages; yum clean oldheaders) //清除缓存目录下的软件包及旧的headers
- Another app is currently holding the yum lock; waiting for it to exit…
- The other application is: PackageKit
- Memory : 40 M RSS (698 MB VSZ)
- Started: Wed Jul 15 13:59:01 2015 - 06:29 ago
- State : Sleeping, pid: 2305
可以通过执行rm -rf /var/run/yum.pid 来强行解除锁定,然后你的yum就可以运行了:
- $ rm -f /var/lib/rpm/__db.00* //删除rpm数据文件
- 或者删除
- $ rm -f /var/lib/rpm/__db.*
- $ rpm --rebuileddb //从新rpm数据文件
- $ yum clean all && yum update
1、检测系统是否已经安装过mysql或其依赖,若已装过要先将其删除,否则第4步使用yum安装时会报错:
- yum list installed | grep mysql
- mysql-libs.i686 5.1.71-1.el6 @anaconda-CentOS-201311271240.i386/6.5
- yum -y remove mysql-libs.i686
2、从mysql的官网下载mysql57-community-release-el6-5.noarch.rpm(注意这里的el6-5即适配RHEL6.5的版本,如果下载了其它版本后面的安装过程中可能会报错):
wget dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
3、安装第一步下载的rpm文件:
yum install mysql-community-release-el6-5.noarch.rpm
4、安装成功后,我们可以看到/etc/yum.repos.d/目录下增加了以下两个文件:
- ls /etc/yum.repos.d
- mysql-community-source.repo
- mysql-community.repo
5、查看mysql57的安装源是否可用,如不可用请自行修改配置文件(/etc/yum.repos.d/mysql-community.repo)使mysql57下面的enable=1:
若有mysql其它版本的安装源可用,也请自行修改配置文件使其enable=0。
- yum repolist enabled | grep mysql
- mysql-connectors-community MySQL Connectors Community 13
- mysql-tools-community MySQL Tools Community 18
- mysql57-community-dmr MySQL 5.7 Community Server Development Milesto 65
6、使用yum安装mysql:
yum install mysql-community-server
7、启动mysql服务:
service mysqld start
8、修改密码
查看root密码:
- grep "password" /var/log/mysqld.log
- 2016-08-10T15:03:02.210317Z 1 [Note] A temporary password is generated for root@localhost: AYB(&-3Cz-rW
现在必须立刻修改密码,不然会报错:
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
修改密码(如果在此步报错ERROR 1819,请向下翻查看原因及解决方法):
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');
9、查看mysqld是否开机自启动,并设置为开机自启动:
- chkconfig --list | grep mysqld
- chkconfig mysqld on
10、修改字符集为UTF-8:
- vim /etc/my.cnf
-
- [mysqld]
- character-set-server=utf8
-
- [client]
- default-character-set=utf8
-
- service mysqld restart
查看修改结果:
- mysql> show variables like "%character%";
- +--------------------------+----------------------------+
- | Variable_name | Value |
- +--------------------------+----------------------------+
- | character_set_client | utf8 |
- | character_set_connection | utf8 |
- | character_set_database | utf8 |
- | character_set_filesystem | binary |
- | character_set_results | utf8 |
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- | character_sets_dir | /usr/share/mysql/charsets/ |
- +--------------------------+----------------------------+
- 8 rows in set (0.00 sec)
注:在修改密码步骤,若设置的密码为简单密码,可能会出现如下错误:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
这一错误其实与validate_password_policy值的设置有关:

validate_password_policy值默认为1,即MEDIUM,所以刚开始设置的密码必须符合长度要求,且必须含有数字,小写或大写字母,特殊字符。
如果我们只是做为测试用而不需要如此复杂的密码,使用如下方式修改validate_password_policy值:
- mysql> set global validate_password_policy=0;
- Query OK, 0 rows affected (0.00 sec)
这样,对密码要求就只有长度了,而密码的最小长度由validate_password_length值决定
validate_password_length参数默认为8,它有最小值的限制,最小值为:
validate_password_number_count+ validate_password_special_char_count+ (2 * validate_password_mixed_case_count)
其中,validate_password_number_count指定了密码中数字的长度,validate_password_special_char_count指定了密码中特殊字符的长度,validate_password_mixed_case_count指定了密码中大小字母的长度。这些参数的默认值均为1,所以validate_password_length最小值为4,如果显性指定validate_password_length的值小于4,尽管不会报错,但validate_password_length的值将设为4
设置validate_password_length的值:
- mysql> set global validate_password_length=4;
- Query OK, 0 rows affected (0.00 sec)
如果修改了validate_password_number_count,validate_password_special_char_count,validate_password_mixed_case_count中任何一个值,则validate_password_length将进行动态修改。