基础知识
软件运行和编译
ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cygwin API:Application Programming Interface POSIX:Portable OS
- 程序源代码 --> 预处理 --> 编译 --> 汇编 --> 链接 静态编译:.a 动态编译:.so
- 注意:linux中大多用源码而不用编译好的二进制可执行文件,是因为源码编译可以定制自己想要的功能模块,同时可以在不同的操作系统上进行编译,在不同的操作系统上运行。因此大多用源码,而不用特定的编译好的二进制文件。
静态和动态链接
链接主要作用是把各个模块之间相互引用的部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接
- 静态链接 把程序对应的依赖库复制一份到包 libxxx.a 嵌入程序包 升级难,需重新编译 占用较多空间,迁移容易 -动态链接 只把依赖加做一个动态链接 libxxx.so 连接指向 占用较少空间,升级方便
开发语言
- 系统级开发 C C++
- 应用级开发 java Python go php perl delphi ruby
包和包管理器
- 最初只有.tar.gz的打包的源码文件,用户必须编译每个他想在GNU/Linux上运行的软件
- 用户们急需系统提供一种方法来管理这些安装在机器上的软件,当Debian诞生时,这样一个管理工具也就应运而生,它被命名为dpkg。从而著名的“package”概念第一次出现在GNU/Linux系统中,稍后Red Hat才开发自己的“rpm” 包管理系统
- 注意:包里面是已经编译好的二进制文件以及其他相关文件,因此不同的系统不同
- 包的组成: 二进制文件、库文件、配置文件、帮助文件
- 程序包管理器: debian: deb文件, dpkg包管理器 redhat: rpm文件, rpm包管理器 rpm:Redhat Package Manager RPM Package Manager
附加复习命令:统计centos自带光盘内的rpm包的个数,以及它采用的cpu架构和各架构包的数量
统计数量:(注意ls后面不能加引号,find后面必须加引号)
16:04[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# ls "*.rpm" |wc -l
ls: cannot access *.rpm: No such file or directory
0
16:04[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# ls *.rpm |wc -l
10019
16:04[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# find -name "*.rpm" |wc -l
10019
统计CPU架构种类和采用这种CPU架构的包的数量:
16:10[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# ls *.rpm |sed -r "s/^.*\.(.*)\.rpm$/\1/" |sort |uniq -c
2258 i686
3122 noarch
4639 x86_64
或者用grep:
16:15[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# find -name "*.rpm" |egrep -o "[^.]+\.rpm$"|cut -d. -f1|sort|uniq -c
2258 i686
3122 noarch
4639 x86_64
还有比较轻松的方法:(用rev两次颠倒)
16:18[root@centos7 /run/media/root/CentOS 7 x86_64/Packages]# ls *.rpm | rev |cut -d. -f2 |rev |sort|uniq -c
2258 i686
3122 noarch
4639 x86_64
- 注意,ls 查询中的通配符*不能显示.开头的文件(隐藏文件和当前目录.),但是find -name 中的通配符*, 可以查询.开头的隐藏文件,可以通过查看find的man帮助也可得知,里面有介绍。
包命名
- 源代码: name-VERSION.tar.gz|bz2|xz VERSION: major.minor.release
- rpm包命名方式: name-VERSION-release.arch.rpm 例:bash-4.2.46-19.el7.x86_64.rpm VERSION: major.minor.release release:release.OS 常见的arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64 powerpc: ppc 跟平台无关:noarch
包命名和工具
- 包:分类和拆包 Application-VERSION-ARCH.rpm: 主包 Application-devel-VERSION-ARCH.rpm 开发子包 Application-utils-VERSION-ARHC.rpm 其它子包 Application-libs-VERSION-ARHC.rpm 其它子包
- 包之间:可能存在依赖关系,甚至循环依赖
- 解决依赖包管理工具: yum:rpm包管理器的前端工具 apt:deb包管理器前端工具 zypper:suse上的rpm前端管理工具 dnf:Fedora 18+ rpm包管理器前端管理工具(centos8)
库文件
- 查看二进制程序所依赖的库文件 ldd /PATH/TO/BINARY_FILE 例如ldd /bin/cat
- 管理及查看本机装载的库文件 ldconfig 加载配置文件中指定的库文件 /sbin/ldconfig –p 显示本机已经缓存的所有可用库文件名及文件路径
- 映射关系 配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf 缓存文件:/etc/ld.so.cache
附加linux光盘修复初级步骤
- 如果是在虚拟机中,启动时按esc按键,进入光盘引导启动,它会加载一个光盘内的linux系统,如果是物理机,用F12等按键进入bios进行光盘引导
- 启动后选择救援模式,然后继续(按1键continue),然后它会提示系统挂载到了/mnt/sysimage ,也就是说原来的linux系统的根目录/ 现在就是/mnt/sysimage这个目录了。如果想要更改它,把当前的根目录(光盘引导启动的小linux系统的根目录)和原来损坏的linux根目录挂载在一起,可以用chroot /mnt/sysimage命令。(change root 即为修改根命令。)
- 然后进行其他救援操作即可
包管理器
- 程序包管理器: 功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作
- 包文件组成 (每个包独有) RPM包内的文件 RPM的元数据,如名称,版本,依赖性,描述等 安装或卸载时运行的脚本 - 数据库(公共):/var/lib/rpm
- 可用ll /var/lib/rpm 查看 程序包名称及版本 依赖关系 功能说明 文件类型,属性信息,权限等等 包安装后生成的各文件路径及校验码信息
当包安装的时候,会把包内的文件按照它的路径自动拷贝到系统中,然后会生成数据库文件,把包里面文件初始安装的各种信息(上面写的那些)
- 注意,这个数据库很重要,如果被破坏,系统就无法判断哪些包安装了,哪些包没有安装,不知道关于装的包的任何信息。不能用rpm -q命令查询包的信息,也也无法卸载掉现在已经装的包等等各种操作都无法进行。
- 它可以用来对包进行校对工作
程序包的来源
-
管理程序包的方式: 使用包管理器:rpm 使用前端工具:yum, dnf
-
获取程序包的途径: (1) 系统发版的光盘或官方的服务器 CentOS镜像: https://www.centos.org/download/ http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com (2) 项目官方站点 (3) 第三方组织: Fedora-EPEL: Extra Packages for Enterprise Linux Rpmforge:RHEL推荐,包很全,建议使用它作为一个yum库(阿里云里面就有) 搜索引擎:(不能判定是否安全,慎用) http://pkgs.org http://rpmfind.net http://rpm.pbone.net https://sourceforge.net/ (4) 自己制作
-
注意:第三方包建议要检查其合法性 来源合法性,程序包的完整性
-
如果公司中制作yum库,最好把包全部下载下来放在自己内网服务器提供下载避免网速影响,同时yum库一定要多个。同时可把自己的光盘当做第一个本地yum库避免网络问题。
挂载光盘可用mount /dev/sr0 /mnt 命令,不过会在开机后消失,可以用 /misc/cd来挂载光盘
- 如果一直不访问 /misc/cd 它会消失掉,它是个万能自动挂载目录
- 需要先安装 rpm -ivh autofs(或者yum install autofs) ,然后启动功能(下次开机可启动) systemctl enable autufs , 然后立即启动此功能 systemctl start autofs
rpm包管理
CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE… -v: verbose -vv: -h: 以#显示程序包管理执行进度 rpm -ivh PACKAGE_FILE ...
- 注意在脚本里安装只需要-i即可。
安装的选项 rpm -i之后再跟这些选项
[install-options]
--test: 测试安装,但不真正执行安装,即dry run模式 --nodeps:忽略依赖关系 --replacepkgs | replacefiles --nosignature: 不检查来源合法性 --nodigest:不检查包完整性 --noscripts:不执行程序包脚本 %pre: 安装前脚本 --nopre %post: 安装后脚本 --nopost %preun: 卸载前脚本 --nopreun %postun: 卸载后脚本 --nopostun
rpm包升级
rpm {-U|--upgrade} [install-options] PACKAGE_FILE...
rpm {-F|--freshen} [install-options] PACKAGE_FILE...
upgrade:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则“安装” freshen:安装有旧版程序包,则“升级”,如果不存在旧版程序包,则不执行升级操作 rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降级 --force: 强制安装(这个更常用,常常替代--replacepkgs)
升级需要注意:
(1) 不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核,开机时可以选择载入哪个内核 (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本配置文件重命名(FILENAME.rpmnew)后保留
包查询
rpm {-q|--query} [select-options] [query-options]
- 注意包查询只需要写包名即可,不需要写全部路径
[select-options]
-a:所有包 -f:查看指定的文件由哪个程序包安装生成 -p rpmfile:针对尚未安装的程序包文件做查询操作 --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供 --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖 rpm2cpio 包文件|cpio –itv 预览包内文件 rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
[query-options]
--changelog:查询rpm包的changelog -c:查询程序(包)的配置文件 -d:查询程序(包)的(帮助等)文档 -i:information ,查看包的本身的各种信息 -l:查看指定的程序包安装后生成的所有文件 --scripts:程序包自带的脚本 --provides:列出指定程序包所提供的CAPABILITY -R:查询指定的程序包所依赖的CAPABILITY
常用查询用法:
-qi PACKAGE -qf FILE(要写详细路径) -qc PACKAGE(配置文件) -ql PACKAGE -qd PACKAGE (文档) -qpi PACKAGE_FILE -qpl PACKAGE_FILE, ... -qa
包卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
- 注意后面也只需要写包名即可 当包卸载时,对应的配置文件不会删除, 以FILENAME.rpmsave形式保留
包校验
rpm {-V|--verify} [select-options] [verify-options]
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
- 校验就是查询包与新装的时候数据库(/var/lib/rpm)记录的数据的差别
包来源的合法性验证及完整性验证
完整性验证:SHA256 来源合法性验证:RSA
公钥加密
对称加密:加密、解密使用同一密钥 非对称加密:密钥是成对儿的 public key: 公钥,公开所有人 secret key: 私钥, 不能公开
导入所需要公钥
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 :导入公钥信息,类似安装rpm包 CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7; 可以用cat 打开查看 rpm -K checksig rpmfile(要写完整路径的rpm包) :检查包的完整性和签名 rpm -qa “gpg-pubkey*” :通配符模糊查询导入之后的公钥包名字,然后再用rpm -qi gpg-pubkey###(全名)查看其中内容。 rpm -e 可以删除到入之后的公钥包(和删除包一样只写包名即可)
- 导入公钥之后再装包就不会显示warning警报了
rpm数据库
数据库重建:
/var/lib/rpm
rpm {--initdb|--rebuilddb}
initdb: 初始化 如果事先不存在数据库,则新建之 否则,不执行任何操作 rebuilddb:重建已安装的包头的数据库索引目录 -- 注意重建数据库基本上很少用到,因为都是空文件没有必要,每次包安装或者其他操作的时候自动就建立并更新了数据库
更多注意点:
- 注意脚本中安装只需要- i即可
- 只有安装需要写全包的路径,查询卸载都只需要写包名
- rpm -q查询包不知道名字的情况下可用rpm -qa |grep "regex" 或者直接rpm -qa “glob" 进行模糊查找,注意前面是正则表达式,后面是通配符,(都是包含查询,除了find之外的查询全部都是包含的模糊查询)
- 安装时-i后选项replacepkgs命令用于只删除了包中部分文件的时候重装时的选项命令(覆盖安装的意思,也可以用--force强制安装);replacefiles命令则是为了避免两个不同的包生成同一个相同的文件路径和文件名的情况下无法安装时使用,强制覆盖文件安装。 注意也可以用 "rpm2cpio 包 |cpio id 缺失的文件" 只解包解出来这个缺失的文件,然后cp到目录里,不过这个方法可能会更改cp出来的文件的权限,因此不建议这样操作
- 默认安装包时候会安装脚本,如果为了避免安全风险可以--noscripts
- 注意包的升级会把旧版本的包给删除,因此升级要慎重.基本上不要升级,直接重新装系统和软件。
- 而关于系统linux内核,因为内核的名字每个都不相同,linux支持多内核共存,不会相互覆盖,用--force强制安装内核rpm包即可,装好后可在boot目录下查看安装后的内核。
- 装新内核的目的就是为了用一些新的软件功能,有时候还是有必要装的。卸载的时候注意用rpm -e kernel 会提示有多个内核,因此要写全内核名。
- 而包和软件的名字都是相同的,因此再次安装的时候不能两个共存,会覆盖,所以不可能存在两个相同的软件不同的版本。
- 内核装好后开机的时候可以选择将哪个内核载入内存中,注意内核开机载入内存中之后,硬盘上的内核文件即在当前shell下不再需要了,可以删除,但是下次便无法开机了
- rpm的安装也可以用网络路径,只要把路径写上即可,后面直接跟上网络的路径全名
- 用"rpm -qi 软件(包)名"" 的方式可查询包的各种详细信息和介绍,但是前提是这个包已经安装了。如果没有安装的包无法查询,但是可以用"rpm -qpi 软件(包)全路径名" 的方式查询它的信息,注意多了一个p选项,(p它表示后面必须跟上文件名,而不是包名,ql同理)
- 没装的情况下也可用"rpm -qpl 包全路径名" 查询里面包含的所有文件,
- 反向查询已经安装好的系统磁盘上的文件来自于哪个包(上面第8项的查询都是查询包名,不论是安装还是未安装的)则用 "rpm -qf 安装好的文件名全路径" ,来查询它来自于那一个包。
18:25[root@centos7 ~]# rpm -qf /bin/cat
coreutils-8.22-23.el7.x86_64
18:26[root@centos7 ~]# rpm -qi coreutils
查看包的详细信息
- 同时注意,即使删掉了安装过的某个包里的文件(二进制,文本,帮助等等),同样可以用 "rpm -qf 误删掉的文件的全路径" 来查询,原因就是因为 /var/lib/rpm 里面的数据库记录的信息。
- 3个capability ,两个是一对,一个可全查:
- -q --whatprovides 后面跟文件或者二进制程序等,查询哪个包提供了这个文件或者程序
- -q --provides 后面跟包,显示包提供了那些能力
- -q --whatrequires 后面既可以跟文件或者二进制等,也可以跟包,查询其他的哪些包需要这个文件或者这个包。 还有一个-qR ,后面跟包,查询这个包依赖哪些文件和capability
- rpm -K 包的详细路径 ,检验包,倒入公钥后再装包就不会warning报警了。
yum(centos7)
CentOS: yum, dnf
- YUM: Yellowdog Update Modifier,rpm的前端程序,可解决软件包相关依赖性,可在多个库之间定位软件包,up2date的替代工具
- yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据 文件(放置于特定目录repodata下) 文件服务器共享支持: http:// https:// ftp:// file://
详细介绍和注意点
- yum实现功能需要服务器端和客户端架构,需要先搭建一个yum服务器端,其主要内容就是yum的仓库。
- yum仓库主要分两大部分,一个是rpm包,一个是rpm包的元数据metadata(包含了rpm包之间的依赖性关系,版本等等各种信息,还可以对rpm包进行分组)
- 当需要yum服务的时候需要把当前机器配置为客户端。客户端可以与服务器端在同一主机上,也可不在同一主机上。不在同一主机则需要网络共享服务跨网络实现。就是上面写的那三种共享协议方式,本地路径的话就是file://.
- repodata文件夹就是存放着rpm包的元数据的部分。如果当前文件夹有repodata文件夹,则可知当前文件夹的路径就是yum仓库的路径。
- 不论是网络,还是本地,需要yum服务的话,都需要在客户端进行配置,指定yum服务器的仓库路径(仓库路径就是包含着repodata文件夹的它的这个所在目录的路径,注意centos的版本别弄错了)。
- 配置好之后使用yum安装时只需要记住包的名字即可,它会读取配置文件,自动按照所写路径搜索repodata元数据信息,查询要安装的的包信息,仓库是否拥有这个包,它的依赖性等等。
- 注意,这个查询的过程yum会先把服务器端的repodata元数据(文件夹)信息全部下载到本地缓存中并保留下来。
- 如果找到这个包,以及它的依赖性的所有包,它就会去yum仓库下载所有所需的rpm包到本地缓存,然后进行安装。安装完之后会把这些rpm安装包再自动删除。
- 注意,rpm安装包安装后会删除,但是查询的时候的元数据包并不会删除,仍然会保留在本地存储上,等下次再进行安装时直接搜索本地保存的这个元数据信息即可直接去yum仓库下载rpm包进行安装。
yum配置文件
yum客户端配置文件:
/etc/yum.conf:为所有仓库提供公共配置 /etc/yum.repos.d/*.repo:为仓库的指向提供配置
仓库指向的定义:
[repositoryID] name=Some name for this repository baseurl=url://path/to/repository/ enabled={1|0} gpgcheck={1|0} gpgkey=URL enablegroups={1|0} failovermethod={roundrobin|priority} roundrobin:意为随机挑选,默认值 priority:按顺序访问 cost= 默认为1000 ,费用越低,优先级越高
yum仓库
yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号 $arch: 平台,i386,i486,i586,x86_64等 $basearch:基础平台;i386, x86_64 $YUM0-$YUM9:自定义变量
示例:
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i386
yum源
阿里云repo文件 http://mirrors.aliyun.com/repo/ CentOS系统的yum源 阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/ 清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/ EPEL的yum源 阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64 阿里巴巴开源软件 https://opsx.alibaba.com/
- /etc/yum.conf 里面的各行解释(注意路径信息并不在yum.conf里面):
[main]
cachedir=/var/cache/yum/$basearch/$releasever :下载的元数据的缓存路径信息
keepcache=0 :下载后安装包是否要删除,0删除 1不删除(注意是安装包,并不是元数据,元数据不会删除)
debuglevel=2 :调试信息
logfile=/var/log/yum.log :yum的日志信息,安装了哪些包,卸载了哪些包等信息
exactarch=1
obsoletes=1
gpgcheck=1 :是否需要检查数字签名,1检查,0不检查,如果不导入key,所有的安装都通不过检查导致安装会失败:要么导入key,要么设置为0
plugins=1 :支持插件等
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release
中间内容省略...
# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d
- 最关键的路径信息在上面的最后一行的/etc/yum.repos.d文件夹里,用.repo结尾
- centos初始安装的时候已经配置过部分.repo文件,指向yum仓库了,不过大多在美洲速度较慢,最好自己配置。(可新建一个文件夹,将初始的这些repo文件备份进去以备以后使用)
- 必须配置的内容的每一行解释:
[aliyunbase] :仓库ID(不是数字),可以写自己准备的名字,用以区分各个仓库,比如base
name=aliyun yum repertory
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/ : $releasever 代表版本号 比如7 ,$basearch代表操作系统架构 比如x86_64 ,这两个变量可以在这里使用,以便可以配置多台机器
gpgcheck=1 : 签名检查,1检查0不检查 ,可以用rpm导入key,或者不检查;更方便的方法是下一行写上对应yum库的网络路径
gpgkey=https://mirrors.aliyun.com/centos/7/os/x86_64/RPM-GPG-KEY-CentOS-7 :同上可以用那两个变量,这里为了方便对比不用了(如果上一行不检查的话则这一行可以不用)
enabled=1 :默认值就为1,不写这一行就是启用此yum源仓库,0禁用此仓库
- 可以配置多个yum仓库,可以在同一个repo文件里继续按照上面相同的格式来写,也可以再重新配置一个repo文件,比如再配置一个功能包更多的epel yum库:
[aliyunepelbase]
name=aliyun epel yum repertory
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-7
enabled=1
- 配置完毕第一次安装的时候会导入key,以后再安装就不会再提示导入key了.
- 注意配置yum源在企业中最好使用自己配置的内网服务器,不然网络带宽会浪费,并且网络状况会影响它
- 个人电脑配置yum源可以网络,但虚拟机最好还是需要有一个自己光盘配置的yum源,注意光盘yum源的路径中要加上双引号不然中间的空格会影响:
[rombase]
name=cdrom yum repertory
baseurl=file:///run/media/root/CentOS\ 7\ x86_64/ :注意中间有空格,两边需加上引号
#baseurl=file:///misc/cd
gpgcheck=1
gpgkey=file:///run/media/root/CentOS\ 7\ x86_64/RPM-GPG-KEY-CentOS-7
#gpgkey=file:///misc/cd/RPM-GPG-KEY-CentOS-7
enabled=1
- 注意:修改了yum源之后,因为第一次使用安装时会下载yum仓库元数据信息到缓存空间中并且会一直保留,(就是/etc/yum.conf第一行的文件夹内),**因此修改yum配置之后最好用yum clean all命令(也可以用rm命令清空这个文件夹)清除一下缓存,下次让它重新再次下载缓存更新。**可以直接再用yum repolist命令,然后它就会自动下载可以使用的yum源的元数据信息并缓存进去。
yum命令
yum命令的用法:
yum [options] [command] [package ...]
显示仓库列表(即所有配置好的yum库的源,只显示不被禁用目前可使用的):
yum repolist [all|enabled|disabled]
显示程序包:
yum list yum list [all | glob_exp1] [glob_exp2] [...] yum list {available|installed|updates} [glob_exp1] [...]
- yum list |less :可以看装好的和未装的包,@开头表示已装的包,anaconda表示装机光盘装的包
安装程序包:
yum install package1 [package2] [...]
- 安装时可以后面跟上-y ,不需要每次交互式输入了 yum reinstall package1 [package2] [...] (重新安装)
升级程序包:
yum update [package1] [package2] [...] yum downgrade package1 [package2] [...] (降级)
检查可用升级:
yum check-update
卸载程序包:
yum remove | erase package1 [package2] [...]
查看程序包information:
yum info [...]
- 这个命令类似于rpm =qi 和 rpm -qpi 的合体,不管装没装都可以用这个命令来查看
查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] [...]
清理本地缓存:
清除/var/cache/yum/$basearch/$releasever缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins |all ]
构建缓存:
yum makecache
- 这个命令基本不用,清除缓存之后,可以直接用yum repolist即可便可自动构建缓存
搜索:yum search string1 [string2] [...]
以指定的关键字搜索程序包名及summary信息
查看指定包所依赖的capabilities:
yum deplist package1 [package2] [...]
查看yum事务历史:
yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats] yum history yum history info 6 :查看历史中第6个编号的详细信息 yum history undo 6 :删除掉第6个编号所装的所有包,包括依赖性的 yum history redo 6:重做
日志 :/var/log/yum.log
安装及升级本地程序包:
yum localinstall rpmfile1 [rpmfile2] [...] (用install替代) yum localupdate rpmfile1 [rpmfile2] [...] (用update替代)
包组管理的相关命令:
yum groupinstall group1 [group2] [...] yum groupupdate group1 [group2] [...] yum grouplist [hidden] [groupwildcard] [...] yum groupremove group1 [group2] [...] yum groupinfo group1 [...]
yum的命令行选项:
--nogpgcheck:禁止进行gpg check -y: 自动回答为“yes” -q:静默模式 --disablerepo=repoidglob:临时禁用此处指定的repo --enablerepo=repoidglob:临时启用此处指定的repo --noplugins:禁用所有插件
配置系统光盘作为yum仓库
- 系统安装光盘作为本地yum仓库: (1) 挂载光盘至某目录,例如/mnt/cdrom mount /dev/cdrom /mnt/cdrom (2) 创建配置文件 [CentOS7] name= baseurl= gpgcheck= enabled=
创建yum仓库:
createrepo [options] < directory>
- 注意:direcroty即为保存着许多rpm包的目录文件夹
更多注意点:
- 一些可零碎知识点再次总结 :
- yum install autofs ,然后启动功能 systemctl enable autufs , 然后立即启动此功能 systemctl start autofs (systemctl disable 和systemctl stop 也是另外对应的命令,(注意只有centos7上才有这些命令,6上面没有)
- 企业中不可能总是用网络上的yum源,因此要配置自己内网的yum源。对此需要用ftp,http或者https共享协议服务来进行设置。先在这里简单介绍如何配置一个httpd的共享yum源。
- 首先需要安装httpd包(提前配置一个本地光盘yum源或者网络yum源然后对它进行安装,注意阿里云的centos网络yum源其实就是官方的光盘,和cd里面的内容一模一样)yum install httpd -y
- 然后用rpm -qi httpd 和rpm -ql httpd 查看一下包内信息(养成装包必看的习惯,还有-qc -qd甚至可以装包之前就用rpm -qip 包的绝对路径 和 -qpl 包的绝对路径来查看先),或者直接用 yum info 包 来查看(注意yum只是rpm的前端处理,仍然需要利用rpm来进行安装,如果rpm被删除或者破坏,yum则无法使用)
- 如果一个软件包是一个服务包,centos7里需要注意找两个主要文件,一个主要配置文件在/etc/httpd(包名)/conf/httpd(包名).conf ,有一个服务文件在/usr/lib/systemd/system/httpd(包名).service
- 然后启动对应的服务文件,systemctl (enable 和 start) httpd.service ,可以用 systemctl status httpd.service来查看服务状态(再次说明这些启动命令是centos7上独有的,6上没有),启动之后便可以输入当前IP地址访问了
- 因为没有任何配置,浏览器上会显示错误,因此要在文件夹/var/www/html(这个文件夹就相当于建好的符合http协议的当前主机IP地址根目录)下面创建文件index.html,则里面的内容就会显示在输入的IP地址(当前主机地址)上了
- 同时在里面创建目录,然后把yum源库拷贝进去即可访问了。如果不想拷贝,可以直接把光盘挂载到此目录上:mount /dev/sr0 /var/www/html/yumrepertory(自己创建的文件夹名字),当然这种挂载机器重启会丢失,因此需要写入文件。
- 目前可能有部分默认安全设置会影响这些服务,比如防火墙firewalld.service和selinux, 我们可以简单一点直接关闭它:
- 关闭防火墙
centos7:
systemctl disable firewalld(.service)
systemctl stop firewalld(.service)
centos6(和7相互对应): chkconfig iptables off service iptables stop - 关闭selinux vim /etc/selinux/config SELINUX=enforcing 改为disabled 或者 sed -r -i "s/^(SELINUX=).*/\1disabled/" /etc/selinux/config 注意之后必须重新启动reboot ,才能关掉selinux,getenforce可以查看selinux 是否真的关闭
- 复习命令,增加硬件(光盘或者硬盘)之后,无需重启检测的方法(在这里用于挂载centos6的http网络共享yum源):
echo '- - -' > //sys/class/scsi_host/host0/scan
echo '- - -' > //sys/class/scsi_host/host1/scan
echo '- - -' > //sys/class/scsi_host/host2/scan
- 搭建好之后,本机路径可以写 http"//var/www/html/等等,无需走网络路径。同时还有其他写法,如例子中的两行对齐等号的写法,或者把路径写在文件里,然后用引用文件的方式写入路径。
[cdrombase]
name=cdrom yum repertory
baseurl="file:///run/media/root/CentOS 7 x86_64/"
"file:///misc/cd"
"file:///var/www/html/yumrepertory/"
"http://192.168.36.102/yumrepertory/"
gpgcheck=1
gpgkey="file:///run/media/root/CentOS 7 x86_64/RPM-GPG-KEY-CentOS-7"
enabled=1
或者用文件的方式,不用baseurl:
mirrorlist=file:///data/yumlist.txt
其中yumlist.txt中每一行写的都是yum源的路径,也就是baseurl=后面的内容
- 注意,yum remove 包名 ,这个命令不会卸载包名所依赖的其他包,即使装它的时候顺便装的依赖性的包也不会卸载。因此用 yum history命令查看历史,然后用 yum history undo #(编号) 来取消编号对应的操作,这样就会全部卸载掉包和它所依赖的包。当然也可以用yum history redo # 重做yum历史中命令编号#, 这些历史默认存在/var/log/yum.log中,可以用cat /etc/yum.conf查看日志信息的存储地方。查看历史中做了什么操作,用yum history info #的命令来查看对应编号进行过什么操作。
- 一些相关命令
- iptables -vnL 查看防火墙策略
- yum remove libvirt-daemon 卸载虚拟网络服务的包,这样会让ipconfig中的vir开头的虚拟化网卡卸载掉。
- yum的安装有依赖性,卸载也有依赖性。卸载不能卸载掉被卸载的包所依赖的包,但是会卸载掉依赖于被卸载的包的其他包.
- yum源可以有多个,一个源失败了可以再用其它的源。
- yum执行的时候不能多个用户同时使用,因此必须等待其他的用户停用yum之后才可。yum repolist all 可以查看启用的和非启用的所有源,如果不加all只显示启用的。
- yum list 后面可以跟模糊搜索通配符,和rpm -qa 类似,但yum的好处是所有装好的未装的都会显示。同样 yum list 后面也可单独显示装好的,未装的等等选项。
- yum search 或者 yum provides 后面可以跟包名,也可以跟文件,它会列出相关的信息(可以用来rpm -ivh安装的时候查询依赖性文件,或者用search命令查询包)
- 注意,yum安装失败的主要两个原因:
- yum源配置的路径无法连通
- yum源配置环境信息更改后没有yum clean all命令清除缓存(元数据等信息)
- yum的升级目录源也可以配置用来升级,但最好不要升级,直接重新安转即可。(阿里源里就有yum升级包)。同时yum源里面还有个extra源,虽然不多,但是有些功能需要它,因此最好也给配置上这个yum源(阿里源上就有)
- 这个额外源里面有个包 epel-release ,可以用来自动配置epel源,装上它就会自动创建一个epel.repo文件,不过路径是国外的。
- 注意yum功能是rpm的前端,依赖于rpm功能, 如果用 rpm -e rpm --nodeps命令卸载掉rpm(--force只能安装时用),则yum也无法使用了。
- 假如真的卸载掉了rpm功能,则用光盘模式,重新装上rpm功能
- 不过装的时候注意路径的问题,因为rpm包的路径默认会装到根目录下,但救援模式下根并不是真正的系统根,因此命令后面要指定根路径命令。
rpm -ivh /run/install/repo/Packages/rpm-4###.rpm --root=/mnt/sysimage/
注意前面的rpm包的路径可用df命令查看光盘在救援模式下挂载哪里了,后面的就是原先真正系统的根。
注意不能用chroot /mnt/sysimage 命令,因为切换根就相当于切换到原先系统内,它仍然没有rpm命令。(退出chroot命令用exit)
- yum grouplist :可用环境组和可用普通包组,可以选择安装。 yum groupinfo 包组名:查看包组详细信息,注意包组名要加双引号,避免有空格问题(包组名大小写不敏感,但是包名大小写敏感,需要注意区分)。当用这个命令查看包组时,里面的包前面的符号:
- 如果什么都没有,表明包虽然已经装上了,但并不是随着包组安装的时候装上的,而是自己装的或者随着系统安装的时候装的
- 等号表示这个包是随着包组安装的时候装上的
- 加号和减号表示包没有装,加号表示包虽然没有装,但是包组升级的时候它会自动装上,减号表示就算包组升级,它也不会被安装,只能自己去刻意安装它。
- yum grouplist 或者yum groupinstall 后面用tab键补全,会看到更多的包的信息。
- 如果只有rpm包,没有yum源的元数据,则可以用 createrepo 后面跟存放包的文件夹即可创建
DNF (DaNdiFied)
DNF 介绍:新一代的RPM软件包管理器。 DNF 发行日期是2015年5月11日,DNF 包管理器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18发行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等
安装所需软件包,依赖epel源
wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-conf-0.6.4- 2.sdl7.noarch.rpm wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64//dnf-0.6.4- 2.sdl7.noarch.rpm wget http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/python-dnf- 0.6.4-2.sdl7.noarch.rpm 还有两个可在yum源中找到: libcomps-0.1.8-3.el7.x86_64.rpm python2-libcomps-0.1.8-3.el7.x86_64.rpm yum install python-dnf-0.6.4-2.sdl7.noarch.rpm dnf-0.6.4-2.sdl7.noarch.rpm dnf-conf- 0.6.4-2.sdl7.noarch.rpm
- 注意安装前需要的包可以在阿里镜像extra中找到,需要配置yum源,:
[aliyunextra]
name=aliyun yum extra repertory
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
enabled=1
如果配置了extra还有epel源 ,以及光盘os源,直接就可以用yum dnf的方式来安装dnf。
- 注意:make -j #(CPU数量) 加快编译速度。
配置文件:/etc/dnf/dnf.conf
仓库文件:/etc/yum.repos.d/ *.repo
日志: /var/log/dnf.rpm.log
- 注意wget命令会自动网络下载后面所跟的网址文件,安装dnf包的时候需要用yum安装相关的依赖包,同时注意需要开启epel源。
DNF 使用
帮助:man dnf nf 用法:与yum一致 dnf [options] <\command> [<\arguments>...] dnf --version dnf repolist dnf clean all dnf makecache dnf list installed dnf list available dnf search nano dnf history dnf history undo 1
程序包编译
程序包编译安装:
Application-VERSION-release.src.rpm --> 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装 源代码-->预处理-->编译-->汇编-->链接-->执行
源代码组织格式:
多文件:文件中的代码之间,很可能存在跨文件依赖关系 C、 C++:make 项目管理器 configure脚本 --> Makefile.in --> Makefile java: maven
编译安装
C语言源代码编译安装三步骤:
- /configure (1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的 指定以及Makefile.in文件生成Makefile (2) 检查依赖到的外部环境,如依赖的软件包
- make 根据Makefile文件,构建应用程序
- make install 复制文件到相应路径
开发工具:
autoconf: 生成configure脚本 automake:生成Makefile.in
注意:安装前查看INSTALL,README两个文件
开源程序源代码的获取:
官方自建站点: apache.org (ASF:Apache Software Foundation) mariadb.org ... 代码托管: SourceForge.net Github.com code.google.com
c/c++编译器: gcc (GNU C Complier)
例子:直接用gcc hello.c -o hello(默认生成a.out名字) , 然后执行hello即可
编译C源代码:
准备:提供开发工具及开发环境
开发工具:make, gcc等 开发环境:开发库,头文件 glibc:标准库
实现:通过“包组”提供开发组件
Development Tools Server Platform Development
生产实践:(基于最小化安装的系统)
yum install gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree screen lsof tcpdump wget ntpdate net-tools iotop bc zip unzip nfs-utils
第一步:configure脚本
选项:指定安装位置、指定启用的特性
--help: 获取其支持使用的选项 选项分类: 安装路径设定: --prefix=/PATH:指定默认安装位置,默认为/usr/local/ --sysconfdir=/PATH:配置文件安装位置 System types:支持交叉编译
-
Optional Features: 可选特性 --disable-FEATURE --enable-FEATURE[=ARG]
-
Optional Packages: 可选包 --with-PACKAGE[=ARG] 依赖包 --without-PACKAGE 禁用依赖关系
-
注意:通常被编译操作依赖的程序包,需要安装此程序包的“开发”组件,其包名一般类似于name-devel-VERSION.即出现需要依赖的包的时候,用yum install 包-devel 来安装
第二步:make
- 注意如果上一步有问题或者这一步有问题,先用yum搜索缺失的文件或者devel包,安装好之后再进行编译。如果失败,可以重新删除掉包解压后的目录重新从第一步开始执行,或者用make clean 命令清除一下构建的程序文件。这两个方法都尝试一下直到成功。同时注意,只有yum搜索包和文件的命令可以搜索到,dnf不行(看来dnf功能还是有待完善,同时dnf默认忽略cd的yum源)
第三步:make install
编译安装注意点:
- 安装路径需要更改,删除等操作的时候比较方便(因为无法用yum等命令删除,因此需要手动删除,编译安装放在一个文件夹内则方便删除)命令为:./configure --prefix=/data/app/name ,(还可更详细的路径查看帮助文档./configure --help),用configure脚本利用makefile.in制作makefile文件,里面包含了各种信息,就比如上面的安装路径,还有启用不启用什么命令等等。
- 交叉编译就是编译的和运行的不是同一台主机,当前主机编译,另一台主机运行
- configure中出现缺失的包的时候,一般后面要加上 '包名-devel',代表着开发相关的包。
- httpd最新版的编译安装脚本查看脚本部分,注意可以把脚本直接放在内网网络路径上然后其他机器直接引用安装即可。 -** 脚本共享到内网上之后的安装命令是 curl http://ip地址/httpdinstall.sh(自己命名的sh文件) | bash** ,安装下载的最新版安装包也可以放到自己的内网网址上,然后写入脚本(或者直接外网上下载,不过如果外网不连通的情况下会失效,因此放在内网最好)
- 注意用echo (单引号)'PATH=#####:$PATH' > /etc/profile.d/newfilename.sh , 来添加自己编译的软件的二进制文件目录时 ,重定向要重定向到新的文件里面。
重要:
开机之后profile.d中的sh的执行顺序应该是按照文件名的字符排序来执行。也就是按照ls查看文件目录的时候的默认排序执行(ls -1从上到下)。因此,最好还是不要把PATH写在多个文件里面,最好只写一个文件里