LIUNX中程序包管理

LIUNX 中程序包管理

此内容仅为笔记,这一两天给会重新整理补充上操作示例。

 

一、基础

1、程序描述:

    第一种描述: 程序 + 数据

    第二种描述: 算法 + 数据结构

 

2、程序的组成部分:

​     1、二进制程序

​     2、配置文件,可以被查看其内容的文件

​     3、库文件,库文件不能独立执行,只能被调用执行

​     4、帮助文件,可以被查看其内容的文件。

 

  解压 rpm 软件包

    rpm2cpio 包文件 | cpio -id

 

3、程序包管理器描述:

  最早的包管理器应用于 Debian 上,dpkg 为第一个包管理工具。

​   程序的组成文件打包 成一个或者有限几个文件

​       安装

​       卸载

​       查询

       升级

       校验

 

    1> 包组成(每个包都有)

      包内的文件

      元数据,如:包的名称 版本 依赖性 描述等

      可能会有包安装或卸载时运行的脚本

 

    2> 数据库(公共) /var/lib/rpm  自动更新

      程序包名称及版本

      依赖关系

      功能说明

      包安装后生成的各文件路径及校验码信息

 

 

4、各个发行版本的程序包管理器和前端管理工具

    发行版     包管理器   包前端管理工具

​     Debian:   deb     apt-get/apt

​     ubuntu:      deb     apt-get/apt

 

​     RedHat:    rpm     yum/dnf

​     centos:    rpm      yum/dnf

 

 

5、程序编译方式:

​   动态编译:编译时不会把库文件编译进程序,编译好的程序不能独立运行,需要调运库文件,体积小。

​   静态编译:编译时会把需要用到的库文件都编译进程序,编译后程序没有库也可以独立运行,体积大。

 

6、命令存放路径:

    普通命令:/bin     /usr/bin   /usr/local/bin

    管理命令:/sbin      /usr/sbin      /usr/local/sbin

    库文件:   /lib       /lib64      /usr/lib   /usr/lib64   /usr/local/lib   /usr/local/lib64

 

7、命令行展开

    命令行展开优先级

    1、把命令行分成单个命令词

    2、展开别名

    3、展开大括号的声明 {}

    4、展开波浪线声明 ~

    5、命令替换 $() 或··

    6、再次把命令行分成命令词

    7、展开文件通配符

    8、准备 I/O 重定向

    9、运行命令

 

8、ABI 二进制编程接口

    windows:   PE

    LINUX:   ELF

 

    虚拟化技术

      LINUX:    WINE

      windows:      Cygwin

 

 

9、LINUX 中源文件生成执行文件的过程

    预处理:gcc -E hello.c -o hello.i 对 hello.c 文件进行预处理,生成 hello.i 文件

    编译:gcc -S hello.i  -o hello.s 对预处理文件 hello.i 进行编译,生成汇编文件 hello.s

    汇编:gcc -C hello.s -o hello.o 对汇编文件 hello.s 进行编译,生成目标文件 hello.o

    链接:hello.o -o hello 对目标文件 hello.o 文件进行链接,生成可执行文件

      gcc hello.c -o hello2 一步到位,直接生成执行文件

        选项:

          -c 源文件 把源文件编译成目标文件

          -o 新名称 目标文件 1  目标文件 2 把多个目标文件链接成可执行文件,并以新名称命名

          -O 此选项主要用于优化编译

          -l 库文件名 指定编译时需要的库文件,此库文件名不用写开头字母 lib 和结尾字母 so

          -L 库文件路径 路径为目录,指定库文件在什么位置搜索。省略的话默认在 /lib  /lib64 /usr/lib /usrlib64 等位置搜索

          -I 头文件 指定编译时需要用到的头文件

 

10、软件包名

    软件名 - 软件版本号 - 编译版本号 - 适用平台 - 后缀

          适用平台

            noarch 无论任何机型都行

            i386 只要是 x86 平台的架构都支持

            i686 32 位平台

            x86_64 64 位平台

 

    示例: 查看目录内各个平台架构的数量

      ls *.rpm | rev | cut -d . -f2 |rev | sort | uniq -c

练习题:在出现进度条出现的时候按 esc 键,进入光盘,然后进入救援模式 进行恢复 被删除的基础库文件 /lib64/libc.so.6

 

11、杂项

ldconfig 命令

  此命令会更具 /etc/ldconfig 配置文件中记载目录中的库文件加载入缓存中,以提高调用程序的执行速度

  -p 显示已经加载到内存中的库文件

 

autofs 工具可以自动挂在 /misc/cd 目录下

    yum -y install autofs

    systemctl enable --now autofs

 

 

 

二、软件包和包管理器

rpm 命

  此命令主要是通过数据库记录的方式来管理软件的安装、卸载、升级、查询、校验等等。

  rpm 软件的数据包保存在 /var/lib/rpm 目录中,如果此目录中的数据损坏可以通过 rpm --rebuilddb 重建数据库

   

  选项:

    -i --install 安装

    -v 显示详细进度

    -h 显示百分比,一个 #表示 2%

    -q 查询

-qa 列出所有已安装的包的,依赖于 /var/lib/rpm 内的数据库

rpm -qa "*http*" 最好加上双引号,怕出问题。可以直接模糊搜索

 

-qi 查询某个已安装过的安装包的信息

-qpi 查询指定未安装的安装包的信息

 

-ql 查询指定已安装的安装包的安装文件列表

-qpl 查询指定未安装的安装包的要安装文件列表

 

-qf 查询某个命令或文件来自于哪个安装包。很有用

-q --whatprovides /PATH/TO/COMMAND 查询某个命令由哪个安装包所提供

-q --whatrequires 查询指定的安装包被哪个包所依赖

 

-qc 查询指定安装包的配置文件

-qd 查询指定安装包的帮助文档

-q --changelog 查询指定安装包的变更历史

-q --scripts 查询指定安装包的脚本

-q --provides 查询指定安装包的提供了哪些依赖性

安装脚本分为:

安装前 preinstall

安装后 postinstall

卸载前 preuninstalll

卸载后 postuninstalll

 

-U 或 --Update 升级或安装软件包

-F 或 --Freshen 只升级,如果没有不安装

 

-e --erase 卸载,如果卸载的时候别的包,依赖于要下载的包,就卸载不了

 

--root= 指定根目录

--nodeps 忽略依赖性,强行安装卸载

--force 强制安装

--replacepkgs 重装 和 force 差不多,多用于重新安装老版本软件

 

 

包校验

--import 导入密钥

-K  或 --checksig 检查签名

 

-V 查询文件是否有修改

-Va 检查所有安装包,看看哪些包被修改过

S file size differs 文件大小是否被改变

M modediffers 文件的类型或文件属性是否被改变

5 MD5

D device major/minor number 设备的主次代码号是否被修改

L readlink path 软连接指向路径是否被修改

U user ownership 属主是否被修改

G group ownership 属组是否被修改

T mtime differ 文件的 mtime 是否被修改

P

 

c 配置文件  config file

d 文件   documentation

g 鬼文件,通常时该文件不被某个软件所包含,较少发生  ghost file

l 授权文件  license file

r 自述文件  read me

 

 

 

yum 命令

同一台电脑上,只能运行一个 yum。yum 的日志文件是 /var/log/yum.log   centos8:/var/log/dnf.log

命令的选项优先级高于配置文件

-y 不询问,自动安装

-q 或 --quiet 静默安装

 

install 安装

reinsatll 重新安装

remove 卸载

update 升级

history 安装历史

history info # 具体查看安装的几个文件

history undo # 卸载指定第几次操作

history redo # 重新安装指定的第几次操作

list 列表

repolist 仓库列表

search 搜索

deplist 查询依赖关系

info 查看软件信息

repolist [all] 显示 yum 源列表

 

--enablerepo=* 临时启用指定某个源

--disablerepo=* 临时禁用指定某个源

 

--showduplicates 显示重复的源

--noplugins 禁用所有插件

clean all 清理缓存

provides /PATH/TO/COMMAND 查询某个命令是由哪个安装包提供

 

 

--nogpgcheck 禁止检查 gpgcheck,即使配置文件中指定了需要检查,命令行的优先级高于配置文件

 

包组

安装卸载包组在引用包组名的时候需要加上引号

groupinstall 安装包组

groupupdate 包组升级

grouplist 查询包组列表

groupremove 包组卸载

groupinfo 查询包组的信息

 

 

yum 的 repo 配置文件中的变量

    $releasever 当前 OS 的发行版的主版本号  如 6 7 8

    $arch 平台 如:i386  x86_64

    $basearch 基础平台 如:1386 ppc arm

 

 

 

createrepo 命令

    createrepo [options] <directory>

        --basedir path 用户一定输出 repodata 的位置。常用于指向软件包的父目录

 

dpkg 包管理器

-i 安装

dpkg -i package.deb

-r 不完全卸载

dpkg -r  package.deb

-l 已安装包的列表

dpkg -l

-L PACKAGE 列出软件包所包含的文件, 相当于 rpm -ql

-S FILE 查询某个文件属于哪个包, 相当于 rpm -qf

-a 配置所偶没有配置的软件包

-c

 apt 命令

  包前端管理工具,类似 yum 命令。debian 系统的软件包前端管理工具。之前的叫 apt-get

apt install

apt remove

apt purge

apt update

apt upgrade

apt search

apt show

三、仓库

 

仓库一般由包文件、包文件元数据组成。客户端会先下载元数据下载到本地缓存中。

然后校验元数据,看看元数据是否下载有无问题。

根据元数据内信息再到仓库中下载对应的各种包文件和依赖包文件。

最后安装。

 

企业中可以单独新建一个软件仓库服务器。通过网络服务(http https ftp) 共享给局域网内计算机远程安装。

 

本地计算机需要配置仓库客户端

centos 8 中由两个软件仓库 Base 仓库和 AppStream 仓库

 

repodata 元数据存放目录

Packages 软件包存放目录

 

关于仓库路径就是 repodata 所在的父目录的绝对路径就是仓库路径

仓库配置文件必须放在 yum.repo.d 目录下。后缀必须是.repo

 

  仓库元数据存放路径 /var/cache/yum

 

yum.conf(centos7) 配置文件 {

cachedir=/var/cache/yum/$basearch/$releasever

keepcache=0

debuglevel=2

logfile=/var/log/yum.log

exactarch=1

obsoletes=1

gpgcheck=1

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

    }

 

dnf.conf(centso8)配置文件 {

gpgcheck=1 是否安装前检测签名

installonly_limit=3 并发安装

clean_requirements_on_remove=True 安装后清空软件

best=True 如果多个仓库中某个软件由多个版本,默认指定安装最新版本

     }

 

 

repo 配置仓库 {}

[] 中括号内的是仓库 ID,必须项

name=Base 仓库名

mirrorlist= 仓库路径,

baseurl= 仓库路径,建议使用国内

 

gpgcheck=1 校验包签名

enabled=1 是否启用仓库,如果不写,默认是启用的

gpgkey= 签名保存路径

 

 

 

 

创建私有仓库

yum -y install httpd

systemctl enable --now httpd

mkdir /var/www/html/centos/8

mount /dev/sr0 /var/www/html/centos/8

 

用于同步仓库中的软件和元数据

  dnf reposync --repoid=REPOID --download-metadata -p /path centos8

  reposync --repoid=REPOID --download-metadata -p /path centos7

 

  creatrepo /var/www/heml/epel/ 手工创建元数据

    --basedir 指定 repodata 存放位置

 

 

 

四、源码编译安装

./configure 最终目的是生成 Makefile 文件

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

  2、检查依赖到的外部环境,如依赖的软件包

选项:

  --prefix=PATH/TO/SOMEDIR 指定总安装目录

  --sysconfdir=DIR 指定配置文件安装目录

 

备注:

  autoconf 命令,用来生成 configure 脚本。部分软件没有 configure 脚本,需要事先自己手工生成,然后再去执行./configure 等后续编译安装步骤,也可能已经实现提供号了 Makefile 文件

  automake 命令,用于生成 Makfiel.in 模板文件

 make

根据上一步生成的 Makefile 文件,检测依赖环境,进行构建应用程序

执行 make 命令之前一定要进入到解压目录,只有在解压目录才能执行成功 make

make 命令

选项:

-j # 如果软件较大,可以指定多个 CPU 同时工作

备注:

make 命令这一步也会检查环境依赖配置,一般情况下是很顺利,如果这一步检测依赖环境报错,

可能说明上一步 configure 配置处的 Makefile 文件有问题,需要删掉整个文件夹,重新来。要不会出现莫名其妙的问题。

 

make install

复制文件到相应路径

make install 命令会自动创建目录。不用手工创建

 

可以通过 README  INSTALL 文件获取安装帮助

 

开法工具:make gcc

开发环境:开发库(gblic: 标准库) 头文件

 

系统通过修改 /etc/man_db.conf 文件指定新软件帮助文件的路径。以后就能直接使用 man 帮助了

 

 

五、备注

生产环境一般是最小安装,推荐安装软件明细。

gcc

make

gcc-c++

glibc  glibc-devel

pcre pcre-devel 与正则表达式相关的包

openssl openssl-devel 与 openssl 加密相关的包

systemd-devel

zlib-devel 与压缩相关的包

vim

lrzsz 传输文件工具,xshell 给主机传送文件需要依赖此包,它提供了 rz 命令

tree

tmux screen 窗口工具。在断开链接后不会终止

lsof

tcpdump 抓包工具

wget 下载工具

net-tools 网络工具

iotop io 的检测工具

bc bzip2 zip unzip

nfs-utils

man-pages