第三次作业

3

尝试基于gcc命令说明 c语言编译过程

源代码:

[root@hecs-34400 data]# cat hello.c 
#include <stdio.h>

int main()
{
    printf("Hello, World!\n");
    return 0;
}
# 1 预处理,根据源文件将程序中的各个部分组合成一个整体,并生成一个.i文件,预处理的作用是宏替换、头文件包含、条件编译等。
[root@hecs-34400 data]# gcc -E hello.c -o hello.i
# 2 编译,编译器会把.i文件转换成会变代码,生成一个.s文件,编译的作用是将高级语言转化为汇编语言
[root@hecs-34400 data]# gcc -S hello.i -o hello.s
[root@hecs-34400 data]# ls
hello.c  hello.i  hello.s
# 3 汇编,这步的目的是将.s文件转换成机器码,生成一个.o文件,汇编器的作用是将汇编语言转化为机器语言
[root@hecs-34400 data]# gcc -c hello.s -o hello.o
[root@hecs-34400 data]# ls
hello.c  hello.i  hello.o  hello.s
# 4 链接,将多个.o文件组合成一个可执行文件,其中包括代码、数据以及各种链接信息。链接器的作用是将各个模块组合在一起,生成可执行文件
[root@hecs-34400 data]# gcc hello.o -o hello
[root@hecs-34400 data]# ls
hello  hello.c  hello.i  hello.o  hello.s
[root@hecs-34400 data]# ./hello 
Hello, World!

总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何通过命令获取?

程序包管理器有如下几种:

apt:debian,ubuntu中使用

yum:centos,rhel,rocky中使用

pacman:arch linux中使用

zypper:suse中使用

yum的rpm包中包含的内容:

  1. 二进制程序文件(Binary files):这些文件是已经编译好的可执行文件,可以直接运行在操作系统上。在Debian和Ubuntu的软件包中,这些文件通常被安装在/usr/bin, /usr/sbin, /usr/lib, /usr/share等目录下。
  2. 头文件(Header files):这些文件包含了函数和变量的声明,可以被其他程序引用和使用。在Debian和Ubuntu的软件包中,这些文件通常被安装在/usr/include目录下。
  3. 库文件(Library files):这些文件包含了一些常用的函数和变量,可以被其他程序引用和使用。在Debian和Ubuntu的软件包中,这些文件通常被安装在/usr/lib目录下。
  4. 配置文件(Configuration files):这些文件包含了一些程序的配置信息,可以被修改以适应用户的需要。在Debian和Ubuntu的软件包中,这些文件通常被安装在/etc目录下。
  5. 文档文件(Documentation files):这些文件包含了程序的使用文档、帮助信息等。在Debian和Ubuntu的软件包中,这些文件通常被安装在/usr/share/doc目录下。
  6. 示例文件(Example files):这些文件包含了一些示例程序和示例配置文件,可以帮助用户更好地了解和使用程序。在Debian和Ubuntu的软件包中,这些文件通常被安装在/usr/share/examples目录下。
    总之,apt软件包中包含了软件的所有文件和依赖项,可以通过apt-get命令进行下载、安装和管理。

示例:

# 解压rpm包
[root@localhost rpm]# rpm2cpio ksh-20120801-142.el7.x86_64.rpm | cpio -div
./bin/ksh93
./bin/rksh
./etc/binfmt.d/kshcomp.conf
./etc/kshrc
./etc/skel/.kshrc
./usr/bin/shcomp
./usr/share/doc/ksh-20120801
./usr/share/doc/ksh-20120801/COMPATIBILITY
./usr/share/doc/ksh-20120801/RELEASE
./usr/share/doc/ksh-20120801/TYPES
./usr/share/man/man1/ksh93.1.gz
6421 blocks

[root@localhost rpm]# ll ./*
-r--r--r--. 1 root root 905572 May  6 15:10 ./ksh-20120801-142.el7.x86_64.rpm

./bin:
total 1484
-rwxr-xr-x. 1 root root 1518984 May  6 15:11 ksh93
lrwxrwxrwx. 1 root root      10 May  6 15:11 rksh -> /bin/ksh93

./etc:
total 4
drwxr-xr-x. 2 root root   26 May  6 15:11 binfmt.d
-rw-r--r--. 1 root root 1128 May  6 15:11 kshrc
drwxr-xr-x. 2 root root   20 May  6 15:11 skel

./usr:
total 0
drwxr-xr-x. 2 root root 20 May  6 15:11 bin
drwxr-xr-x. 4 root root 28 May  6 15:11 share

[root@localhost ~]# which ksh
/usr/bin/ksh
[root@localhost ~]# ll /usr/bin/ksh
lrwxrwxrwx. 1 root root 21 May  6 15:14 /usr/bin/ksh -> /etc/alternatives/ksh
[root@localhost ~]# ll /etc/alternatives/ksh
lrwxrwxrwx. 1 root root 10 May  6 15:14 /etc/alternatives/ksh -> /bin/ksh93
--------------------------------------------------------------------------------
[root@localhost ~]# which rksh
/usr/bin/rksh
[root@localhost ~]# ll /usr/bin/rksh 
lrwxrwxrwx. 1 root root 10 May  6 15:14 /usr/bin/rksh -> /bin/ksh93

# 从上可以看出,安装后的ksh和rksh,都是链接到/bin/ksh93的

总结程序包获取途径,以及rpm, yum, apt命令选项示例

rpm包的获取方式:

1,从网站上获取,比如一些常用的rpm包网站 https://rpmfind.net/

2,从系统的镜像文件中获取,但是镜像文件中的rpm包都是版本比较低的包

3,从rpm包的官网下载源代码,然后编译

缺点:不能对依赖包进行处理

yum:

1,使用系统镜像配置本地yum源

2,使用各种开源镜像站的源

3,在其它机器使用yum download将所有依赖包下载下来

优点:开源镜像站多,能够自动处理依赖

rpm命令示例:

rpm命令解释:
-q:查询,通常和以下命令合用
-i:info,查询信息
-l:list,查询文件列表
-V:查询包的哪些文件被修改过
-c:config 查看配置文件
-a:all 显示所有的已安装的包
-f:file 显示文件所属的包
# 查看包信息
[root@localhost ~]# rpm -qi openssh
Name        : openssh
Version     : 8.0p1
Release     : 13.0.1.an8
Architecture: x86_64
Install Date: 2023年01月13日 星期五 17时41分15秒
Group       : Applications/Internet
Size        : 1918217
License     : BSD
Signature   : RSA/SHA256, 2022年05月11日 星期三 13时17分09秒, Key ID 619140084873f7c5
Source RPM  : openssh-8.0p1-13.0.1.an8.src.rpm
Build Date  : 2022年04月24日 星期日 17时14分09秒
Build Host  : anolis-build-02.openanolis.cn
Relocations : (not relocatable)
Packager    : OpenAnolis Community
Vendor      : OpenAnolis Community
URL         : http://www.openssh.com/portable.html
Summary     : An open source implementation of SSH protocol version 2
Description : ...

# 查看软件包提供的文件
[root@localhost ~]# rpm -ql openssh
/etc/ssh
/etc/ssh/moduli
/usr/bin/ssh-keygen
/usr/lib/.build-id
/usr/lib/.build-id/13
/usr/lib/.build-id/13/796a013df940e6b810d1cad5c163d5e82a9944
/usr/lib/.build-id/6b
...

# 查看某个软件的哪些文件被修改过
[root@localhost ~]# rpm -V setup
.M....G..  g /var/log/lastlog

# 查看配置文件
[root@localhost ~]# rpm -qc openssh-clients
/etc/ssh/ssh_config
/etc/ssh/ssh_config.d/05-redhat.conf

# 查看所有已经安装的包,并从中筛选出想查找的包
[root@localhost ~]# rpm -qa
swtpm-0.7.0-1.20211109gitb79fd91.module+an8.6.0+10755+cbf458a5.x86_64
lame-libs-3.100-6.0.1.an8.x86_64
libvirt-daemon-driver-storage-rbd-8.0.0-5.module+an8.6.0+10755+cbf458a5.x86_64
fontconfig-2.13.1-4.an8.x86_64
blktrace-1.2.0-10.el8.x86_64
...

[root@localhost ~]# rpm -qa | grep openssh
openssh-askpass-8.0p1-13.0.1.an8.x86_64
openssh-clients-8.0p1-13.0.1.an8.x86_64
openssh-8.0p1-13.0.1.an8.x86_64
openssh-server-8.0p1-13.0.1.an8.x86_64

# 查询某个文件来自哪个包
[root@localhost ~]# rpm -qf /etc/passwd
setup-2.12.2-6.0.1.an8.noarch
[root@localhost ~]# rpm -qf /etc/issue
anolis-release-8.6-2.an8.x86_64

yum命令示例

# yum中的变量,在配置yum源的时候,可以在yum的repo文件中直接使用
$releasever : 当前OS的发行主版本号
$arch: cpu架构,如: aarch64,x86_64等
$basearch: 系统基础平台,如x86_64
$contentdir: 表示目录,如 centos-8,centos-7
$YUM0-$YUM9:自定义变量

# 查看软件包信息
[root@localhost ~]# yum info openssh
上次元数据过期检查:1 day, 19:24:05 前,执行于 2023年05月10日 星期三 17时28分16秒。
已安装的软件包
名称         : openssh
版本         : 8.0p1
发布         : 13.0.1.an8
架构         : x86_64
大小         : 1.8 M
源           : openssh-8.0p1-13.0.1.an8.src.rpm
仓库         : @System
来自仓库     : anaconda
概况         : An open source implementation of SSH protocol version 2
URL          : http://www.openssh.com/portable.html
协议         : BSD
描述         : SSH (Secure SHell) is a program for logging into and executing
             : commands on a remote machine. SSH is intended to replace rlogin and
             : rsh, and to provide secure encrypted communications between two
             : untrusted hosts over an insecure network. X11 connections and
             : arbitrary TCP/IP ports can also be forwarded over the secure channel.
             : 
             : OpenSSH is OpenBSD's version of the last free version of SSH, bringing
             : it up to date in terms of security and features.
             : 
             : This package includes the core files necessary for both the OpenSSH
             : client and server. To make this package useful, you should also
             : install openssh-clients, openssh-server, or both.
和rpm -qi openssh类似

# 查找包,会显示精确匹配和模糊匹配结果
[root@localhost ~]# yum search mysql
上次元数据过期检查:1 day, 19:25:03 前,执行于 2023年05月10日 星期三 17时28分16秒。
======================================================= 名称 和 概况 匹配:mysql ========================================================
mysql.x86_64 : MySQL client programs and shared libraries
apr-util-mysql.x86_64 : APR utility library MySQL DBD driver
dovecot-mysql.x86_64 : MySQL back end for dovecot
freeradius-mysql.x86_64 : MySQL support for freeradius
mysql-common.x86_64 : The shared files required for MySQL server and client
=========================================================== 概况 匹配:mysql ============================================================
mariadb-devel.x86_64 : Files for development of MariaDB/MySQL applications
mariadb-java-client.noarch : Connects applications developed in Java to MariaDB and MySQL databases
mariadb-server-utils.x86_64 : Non-essential server utilities for MariaDB/MySQL applications

# 查找某个命令或者某个文件来自哪个包,未安装的也能查找,使用yum的数据库中查询的
[root@localhost ~]# yum provides /usr/bin/ls
上次元数据过期检查:1 day, 19:26:28 前,执行于 2023年05月10日 星期三 17时28分16秒。
coreutils-8.30-12.an8.x86_64 : A set of basic GNU tools commonly used in shell scripts
仓库        :@System
匹配来源:
文件名    :/usr/bin/ls

coreutils-8.30-12.an8.x86_64 : A set of basic GNU tools commonly used in shell scripts
仓库        :BaseOS
匹配来源:
文件名    :/usr/bin/ls

coreutils-single-8.30-12.an8.x86_64 : coreutils multicall binary
仓库        :BaseOS
匹配来源:
文件名    :/usr/bin/ls

[root@localhost ~]# yum provides /etc/my.cnf
上次元数据过期检查:1 day, 19:26:36 前,执行于 2023年05月10日 星期三 17时28分16秒。
mariadb-connector-c-config-3.2.6-1.an8.noarch : Configuration files for packages that use /etc/my.cnf as a configuration file
仓库        :AppStream
匹配来源:
文件名    :/etc/my.cnf

# 下载依赖包,用于离线安装
[root@localhost tmp]# yum install -y nginx --downloadonly --downloaddir=/tmp/test
[root@localhost test]# ls
nginx-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm
nginx-all-modules-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.noarch.rpm
nginx-filesystem-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.noarch.rpm
nginx-mod-http-image-filter-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm
nginx-mod-http-perl-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm
nginx-mod-http-xslt-filter-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm
nginx-mod-mail-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm
nginx-mod-stream-1.14.1-9.0.2.module+an8.7.0+10880+b751b443.x86_64.rpm

[root@localhost test]# yum install -y /tmp/test/*.rpm

# 取消安装
[root@localhost ~]# yum remove -y nginx

软件包组:

# 查看所有的软件包组
[root@localhost ~]# yum grouplist
上次元数据过期检查:1 day, 23:46:29 前,执行于 2023年05月10日 星期三 17时28分16秒。
可用环境组:
   服务器
   最小安装
   虚拟化主机
   定制操作系统
已安装的环境组:
   带 GUI 的服务器
已安装组:
   容器管理
   无头系统管理
可用组:
   .NET 核心开发
   RPM 开发工具
   开发工具
   图形管理工具
   传统 UNIX 兼容性
   网络服务器
   科学记数法支持
   安全性工具
   智能卡支持
   系统工具
   
# 查看软件包组的信息
[root@localhost ~]# yum groupinfo 开发工具
上次元数据过期检查:1 day, 23:47:45 前,执行于 2023年05月10日 星期三 17时28分16秒。

组:开发工具
 描述:基本开发环境。
 必要的软件包:
   autoconf
   automake
   binutils
   bison
   flex
   gcc
   gcc-c++
   ...

# 安装软件包组
[root@localhost ~]# yum groupinstall 系统工具
上次元数据过期检查:1 day, 23:48:41 前,执行于 2023年05月10日 星期三 17时28分16秒。
依赖关系解决。
=========================================================================================================================================
 软件包                                    架构                    版本                                 仓库                        大小
=========================================================================================================================================
升级:
 chrony                                    x86_64                  4.2-1.0.1.an8                        BaseOS                     331 k
 
# 删除软件包组
[root@localhost ~]# yum groupremove 系统工具
依赖关系解决。
=========================================================================================================================================
 软件包                                    架构                    版本                                仓库                         大小
=========================================================================================================================================
移除:
 NetworkManager-libreswan                  x86_64                  1.2.10-4.el8                        @AppStream                  345 k

简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用

yum目录组成

/etc/yum.repos.d/ : 存储yum的配置文件,指明如何找到yum源服务器端

/var/cache/yum/:该目录下存储yum的缓存文件,包括软件包、元数据等

/var/lib/yum/:该目录下存储yum的状态信息和数据库文件,包括已安装软件包的信息、yum源的元数据等

/etc/yum/pluginconf.d/:该目录下存储yum插件的配置文件,如fastestmirror、versionlock等插件

/usr/share/yum-plugins/:该目录下存储yum插件的脚本文件,如protectbase、downloadonly等插件

/var/log/yum.log:该文件记录了yum的操作日志,包括安装、更新和删除等操作

/var/lib/rpm/:该目录下存储rpm包的数据库文件,yum会通过该数据库文件来确定已经安装的软件包的信息

yum从源服务器的repodata文件夹下获取repomd.xml文件,这个文件中定义了以下的文件位置:

primary.xml.gz 记录了软件仓库中所有软件包的详细信息,包括软件包的名称、版本、依赖关系、文件列表等

primary.sqlite.xz 记录的内容和primary.xml.gz一样,只是一个是数据库一个xml格式

filelists.xml.gz 记录了软件仓库中所有软件包的详细文件列表信息,包括软件包中的每个文件所在的路径、文件名、大小、时间戳、权限等信息

filelists.sqlite.xz

other.xml.gz 记录了软件仓库中所有软件包的其他元数据信息,主要包括软件包的详细描述、许可证、依赖关系、补丁等信息

other.sqlite.xz

comps-BaseOS.x86_64.xml 记录了包含软件包组的列表,控制软件包group安装

comps-BaseOS.x86_64.xml.xz

updateinfo.xml.gz 记录了软件仓库中所有可用的软件包更新信息,包括安全更新、错误修复、功能增强等类型的更新

上述文件的路径

上述文件就是yum能自动解决依赖关系的关键

从0搭建自己的yum服务器

# 创建一个存放所有rpm包的文件夹
[root@localhost mnt]# mkdir mypackages
[root@localhost mnt]# cp -a /mnt/cdrom/Packages/* ./mypackages/

# 创建yum服务器文件
[root@localhost mnt]# createrepo /mnt/mypackages/
Spawning worker 0 with 5230 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@localhost mnt]# cd mypackages/repodata/
[root@localhost repodata]# ls
1002d48182ee92c1f32550b8e6fa36f75a72e3b2b9d5711ab7d959c7120257cf-filelists.sqlite.bz2
387655ee6cd86bedabc6a951f8efb2c26edd926dbe8856571dc750c528d5a837-other.xml.gz
3da94fd52faea9a39956bccb868a5db5d674fbe98f01321d96ee0c97ea2798fd-other.sqlite.bz2
524b7194974da73d681614b5550c4b854fa1bc2dbd476365067c025b2faf0110-filelists.xml.gz
645cbb2fe5b850f7f2860cf464e16b30436c3b830011164d35ff1213f3d0ab12-primary.sqlite.bz2
d35139e83dd8206947cedcaefe8e2aa847ad57ddfc43459422b4d1784d63f4de-primary.xml.gz
repomd.xml

# 解释每个文件的意义
# 先将所有文件拷贝到另一个文件夹下,然后解压打开
[root@localhost repodata]# cp -a ./*  /tmp/duzy/
[root@localhost repodata]# cd /tmp/duzy/
[root@localhost duzy]# ls
1002d48182ee92c1f32550b8e6fa36f75a72e3b2b9d5711ab7d959c7120257cf-filelists.sqlite.bz2
387655ee6cd86bedabc6a951f8efb2c26edd926dbe8856571dc750c528d5a837-other.xml.gz
3da94fd52faea9a39956bccb868a5db5d674fbe98f01321d96ee0c97ea2798fd-other.sqlite.bz2
524b7194974da73d681614b5550c4b854fa1bc2dbd476365067c025b2faf0110-filelists.xml.gz
645cbb2fe5b850f7f2860cf464e16b30436c3b830011164d35ff1213f3d0ab12-primary.sqlite.bz2
d35139e83dd8206947cedcaefe8e2aa847ad57ddfc43459422b4d1784d63f4de-primary.xml.gz
repomd.xml

# filelists.xml.gz中存储着每一个包中包含的所有文件,这些文件都会安装到系统中
[root@localhost duzy]# zcat 524b7194974da73d681614b5550c4b854fa1bc2dbd476365067c025b2faf0110-filelists.xml.gz | less
<package pkgid="e7740953ec62a37a4222ae8fca055502d0477f640930ec0c03d6464f9ae0f500" name="httpd" arch="x86_64">
  <version epoch="0" ver="2.4.6" rel="95.el7"/>
  <file>/etc/httpd/conf.d/README</file>
  <file>/etc/httpd/conf.d/autoindex.conf</file>
  <file>/etc/httpd/conf.d/userdir.conf</file>
  <file>/etc/httpd/conf.d/welcome.conf</file>
  <file>/etc/httpd/conf.modules.d/00-base.conf</file>
  <file>/etc/httpd/conf.modules.d/00-dav.conf</file>
  <file>/etc/httpd/conf.modules.d/00-lua.conf</file>
  <file>/etc/httpd/conf.modules.d/00-mpm.conf</file>
  <file>/etc/httpd/conf.modules.d/00-proxy.conf</file>
  <file>/etc/httpd/conf.modules.d/00-systemd.conf</file>
  <file>/etc/httpd/conf.modules.d/01-cgi.conf</file>
  <file>/etc/httpd/conf/httpd.conf</file>
  ...
  
 # primary.xml.gz记录着包的详细信息,比如,架构、版本、checksum、官网、提供了哪些工具、依赖(重要)等
 [root@localhost duzy]# zcat d35139e83dd8206947cedcaefe8e2aa847ad57ddfc43459422b4d1784d63f4de-primary.xml.gz | less
   <name>httpd</name>
  <arch>x86_64</arch>
  <version epoch="0" ver="2.4.6" rel="95.el7"/>
  <checksum type="sha256" pkgid="YES">e7740953ec62a37a4222ae8fca055502d0477f640930ec0c03d6464f9ae0f500</checksum>
  <summary>Apache HTTP Server</summary>
  <description>The Apache HTTP Server is a powerful, efficient, and extensible
web server.</description>
  <packager>Red Hat, Inc. &lt;http://bugzilla.redhat.com/bugzilla&gt;</packager>
  <url>http://httpd.apache.org/</url>
  <time file="1589303658" build="1587478848"/>
  <size package="1246040" installed="3891571" archive="3957644"/>
  <location href="httpd-2.4.6-95.el7.x86_64.rpm"/>
  <format>
    <rpm:license>ASL 2.0</rpm:license>
    <rpm:vendor>Red Hat, Inc.</rpm:vendor>
    <rpm:group>System Environment/Daemons</rpm:group>
    <rpm:buildhost>x86-vm-26.build.eng.bos.redhat.com</rpm:buildhost>
    <rpm:sourcerpm>httpd-2.4.6-95.el7.src.rpm</rpm:sourcerpm>
    <rpm:header-range start="1384" end="86584"/>
    <rpm:provides>
      <rpm:entry name="httpd" flags="EQ" epoch="0" ver="2.4.6" rel="95.el7"/>
      <rpm:entry name="httpd(x86-64)" flags="EQ" epoch="0" ver="2.4.6" rel="95.el7"/>
      <rpm:entry name="httpd-mmn" flags="EQ" epoch="0" ver="20120211"/>
      <rpm:entry name="httpd-mmn" flags="EQ" epoch="0" ver="20120211" rel="x86-64"/>
      <rpm:entry name="httpd-mmn" flags="EQ" epoch="0" ver="20120211x8664"/>
      <rpm:entry name="httpd-suexec" flags="EQ" epoch="0" ver="2.4.6" rel="95.el7"/>
      <rpm:entry name="mod_dav" flags="EQ" epoch="0" ver="2.4.6" rel="95.el7"/>
      <rpm:entry name="webserver"/>
    </rpm:provides>
    <rpm:requires>
      <rpm:entry name="/bin/sh"/>
      <rpm:entry name="/bin/sh" pre="1"/>
      <rpm:entry name="/etc/mime.types"/>
      <rpm:entry name="/usr/sbin/groupadd" pre="1"/>
      <rpm:entry name="/usr/sbin/useradd" pre="1"/>
      <rpm:entry name="httpd-tools" flags="EQ" epoch="0" ver="2.4.6" rel="95.el7"/>
      <rpm:entry name="libapr-1.so.0()(64bit)"/>
      <rpm:entry name="libaprutil-1.so.0()(64bit)"/>
      <rpm:entry name="libc.so.6(GLIBC_2.14)(64bit)"/>

# repomd.xml中包含着其它文件所在位置,server就是通过这个文件找到其它文件的
[root@localhost duzy]# cat repomd.xml 
<?xml version="1.0" encoding="UTF-8"?>
<repomd xmlns="http://linux.duke.edu/metadata/repo" xmlns:rpm="http://linux.duke.edu/metadata/rpm">
 <revision>1684127822</revision>
<data type="filelists">
  <checksum type="sha256">524b7194974da73d681614b5550c4b854fa1bc2dbd476365067c025b2faf0110</checksum>
  <open-checksum type="sha256">665279abcbabf3ab334ed09f37eeb7fa700e4831d7925f7b320f64c93d67f671</open-checksum>
  <location href="repodata/524b7194974da73d681614b5550c4b854fa1bc2dbd476365067c025b2faf0110-filelists.xml.gz"/>
  <timestamp>1684127836</timestamp>
  <size>3106936</size>
  <open-size>40369407</open-size>
</data>
<data type="primary">
  <checksum type="sha256">d35139e83dd8206947cedcaefe8e2aa847ad57ddfc43459422b4d1784d63f4de</checksum>
  <open-checksum type="sha256">9da7bd226cfe8a470750406502dc8c6c55fc90e597957c7ef31f9d301d2902fe</open-checksum>
  <location href="repodata/d35139e83dd8206947cedcaefe8e2aa847ad57ddfc43459422b4d1784d63f4de-primary.xml.gz"/>
  <timestamp>1684127836</timestamp>
  <size>2084584</size>
  <open-size>18309855</open-size>
</data>
<data type="primary_db">
  <checksum type="sha256">645cbb2fe5b850f7f2860cf464e16b30436c3b830011164d35ff1213f3d0ab12</checksum>
  <open-checksum type="sha256">c7e3e15141075ff64c90e64c9ac711876c92945c76b897f0c88cacf96f1ed8a7</open-checksum>
  <location href="repodata/645cbb2fe5b850f7f2860cf464e16b30436c3b830011164d35ff1213f3d0ab12-primary.sqlite.bz2"/>
  <timestamp>1684127841</timestamp>
  <database_version>10</database_version>
  <size>4493151</size>
  <open-size>21881856</open-size>
</data>
<data type="other_db">
  <checksum type="sha256">3da94fd52faea9a39956bccb868a5db5d674fbe98f01321d96ee0c97ea2798fd</checksum>
  <open-checksum type="sha256">9e8fef82b39288418ab5615b2938fdd04c13e629e1d011d77f5f0abd9c88c298</open-checksum>
  <location href="repodata/3da94fd52faea9a39956bccb868a5db5d674fbe98f01321d96ee0c97ea2798fd-other.sqlite.bz2"/>
  <timestamp>1684127837</timestamp>
  <database_version>10</database_version>
  <size>1653069</size>
  <open-size>9740288</open-size>
</data>
<data type="other">
  <checksum type="sha256">387655ee6cd86bedabc6a951f8efb2c26edd926dbe8856571dc750c528d5a837</checksum>
  <open-checksum type="sha256">a13f452cff6b49b880b06671ba0bc0dc3b2543095a54526e140926c544641645</open-checksum>
  <location href="repodata/387655ee6cd86bedabc6a951f8efb2c26edd926dbe8856571dc750c528d5a837-other.xml.gz"/>
  <timestamp>1684127836</timestamp>
  <size>1124177</size>
  <open-size>10515301</open-size>
</data>
<data type="filelists_db">
  <checksum type="sha256">1002d48182ee92c1f32550b8e6fa36f75a72e3b2b9d5711ab7d959c7120257cf</checksum>
  <open-checksum type="sha256">a45b756389414b2c0c5528b9fbe8ca42809bd886a8472fd1db61ce312b9251ef</open-checksum>
  <location href="repodata/1002d48182ee92c1f32550b8e6fa36f75a72e3b2b9d5711ab7d959c7120257cf-filelists.sqlite.bz2"/>
  <timestamp>1684127839</timestamp>
  <database_version>10</database_version>
  <size>3612623</size>
  <open-size>20854784</open-size>
</data>
</repomd>

# other.xml.gz文件中记录着作者,版本详情,变更,漏洞修复等信息

# 然后就可以配置yum源配置文件了
[root@localhost yum.repos.d]# cat mylocal.repo 
[mylocal]
name=mylocal
baseurl=file:///mnt/mypackages
gpgcheck=0
enabled=1
# 安装httpd试试水
[root@localhost yum.repos.d]# yum install httpd
Loaded plugins: langpacks
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-95.el7 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-95.el7 for package: httpd-2.4.6-95.el7.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-95.el7.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-95.el7.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-95.el7.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-7.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package httpd-tools.x86_64 0:2.4.6-95.el7 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved
...

就可以了

总结系统安装之后的常用初始化步骤。rocky/ubuntu

1,配置ip,路由
2,配置yum源以及安装必要的包
3,配置firewalld
4,创建必要的用户以及禁止ssh的root登录
5,关闭selinux
6,设置密码过期时间
7,设置密码复杂度

自行实现一个一键安装脚本

[root@localhost data]# cat httpd.sh 
#!/bin/bash
version=$1
install_path=/usr/local/httpd
version=$1
srcfile=httpd-$version
url=https://dlcdn.apache.org/httpd/$srcfile.tar.gz
#dir=`mktemp -d /tmp/httpXXX`
dir=/tmp/httpPsH
install_dir=/usr/local/httpd
cpus=`grep -c  processor /proc/cpuinfo`

init(){
   echo "install independent package"
   yum -y install gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2
   echo "end install"
}

disabled_selinux(){
   sed -i "/^SELINUX=/c SELINUX=disabled" /etc/selinux/config
   setenforce 0
}

disabled_firewalld(){
   systemctl stop firewalld &> /dev/null
   systemctl disable firewalld &> /dev/null
}
download_httpd(){
   echo "tmp dir: $dir"
   echo "Begin Download httpd"
   wget -N -P $dir $url --no-check-certificate &> /dev/null
   if [ $? -eq 0 ];then
      echo "download ok"
   else
      echo "download error"
      exit 1
   fi
   echo "End Download httpd"
}
depress_file(){
   echo "Begin depress $dir/$srcfile.tar.gz"
   tar -xvzf $dir/$srcfile.tar.gz -C $dir &> /dev/null
   echo "End depress"
}
install(){
   echo "Begin compile src code"
   cd $dir/$srcfile
   ./configure --prefix=$install_dir --enable-ssl --with-ssl=/usr/local/openssl --disable-statusi &> /dev/null
   make -j $cpus && make install &> /dev/null
   ln -s $install_dir/bin/apachectl /usr/local/bin/ &> null
   apachectl start && echo "install OK"
}



main(){
   init
   disabled_selinux
   disabled_firewalld
   download_httpd
   depress_file
   install
}

main

总结OSI模型,总结每层的作用以及协议

  1. 物理层(Physical Layer):负责传输比特流,即将数据转化为物理信号在网络媒介上传输。包括电气特性、物理特性、传输介质类型和连接器类型等规范。
  2. 数据链路层(Data Link Layer):负责将数据组成帧,在物理层提供的连接上传输数据。包括帧的开始和结束标志、差错检测等规范。
  3. 网络层(Network Layer):负责对数据进行路由选择,决定数据从源节点传输到目标节点所经过的路线。包括IP协议、ICMP协议等规范。
  4. 传输层(Transport Layer):负责数据的可靠传输,包括流控制、差错检测和纠正、传输协议等规范。例如TCP(Transmission Control Protocol)协议、UDP(User Datagram Protocol)协议等。
  5. 会话层(Session Layer):负责建立、管理和终止会话(Session),使不同设备之间的应用程序能够进行通信。包括会话协议、数据同步等规范。
  6. 表示层(Presentation Layer):负责将数据转换为应用程序能够识别和处理的格式。例如,将Unicode编码的字符转换为ASCII码的字符。
  7. 应用层(Application Layer):提供网络服务和应用程序与用户之间的接口,包括电子邮件、文件传输、网页浏览等应用。例如HTTP(HyperText Transfer Protocol)协议、FTP(File Transfer Protocol)协议等。

调整动态端口范围为20000-60000

# 修改配置文件
[root@hecs-34400 ~]# vi /etc/sysctl.conf
net.ipv4.ip_local_port_range = 20000 60000
# 使配置文件生效
[root@hecs-34400 ~]# sysctl -p
# 查看系统当前配置
[root@hecs-34400 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
20000	60000

总结TCP包头结构,TCP三次握手,4次挥手

# 三次握手
发送方和接收方的信息都要有去有回,也就是说必须有发送和回话
当客户端发送建立连接申请,这是客户端的发送信息
当服务器端回复同意建立连接,这既是客户端的回信,也是服务器端的发送
然后客户端再回复服务器端,这就是服务器端的回信
至此,客户端的信息都是有去有回,服务器端的信息也是有去有回,又因为服务器的发送和客户端的回信是一个信息,所以是三次握手

# 四次挥手
同理,所有的断开连接的信息也必须是有去有回的
客户端发送断开连接信息,这是发送
服务器端首先同意断开,回复客户端;但是注意,服务器的回复同意并不代表服务器开始断开,因为很有可能客户端断开,但服务器端的信息还未处理完,此时,客户端的信息有去有回。
当服务器端处理完信息,发送断开连接信息,这是服务器的发送
客户端之前就已经断开了,此刻自然回复同意断开,这是回复服务器端,此时,服务器的断开信息才有去有回
总共四次挥手完成

总结主机到主机的包传递过程

发送端:
1,应用层将数据按照不同的协议(http,ftp,smtp等)打包发送给传输层,并指定ip和端口
2,传输层将应用层发送的数据按照最大数据段长分段,并为每个数据段加上传输层的数据包头,传输层报头,然后将每段发送给网络层
3,网络接收到传输层的数据段,将每段按照最大数据报长分割开,并加上网络层的报头,发送给链路层
4,链路层将网络层的数据包分割成帧,根据目标mac地址进行转发

中间的路由器:
1,接收到链路层的数据报,根据ip将整个数据报转发到指定的端口,前往下一个节点

接收端:
1,链路层接收到数据包,查看mac地址,是自己的就接收,然后整个成完整的数据报,解下包头,发送给网络层
2,网络层接收到数据报,查看ip地址,是自己的就接收,整合成完整的数据包,解下网络层包头,将数据发送给传输层
3,传输层接收到数据包,解下运输层包头,发送到对应端口
4,应用层应用从对应端口接收到数据,根据协议解读数据,显示给用户

总结IP地址 A, B, C, D 类,并解析IP地址的组成

IP地址是网络中用于标识设备的一种地址,常用的IP地址有A、B、C、D四类,它们的特点和组成如下:

1. A类地址:

A类地址是最常用的IP地址类型,范围从1.0.0.0到126.0.0.0,其中第一个字节的地址范围是1到126。A类地址中第一个字节用于网络地址,后三个字节用于主机地址。A类地址中的默认子网掩码是255.0.0.0,可以支持大量的主机连接。

2. B类地址:

B类地址的范围从128.0.0.0到191.255.255.255,其中第一个字节的地址范围是128到191。B类地址中前两个字节用于网络地址,后两个字节用于主机地址。B类地址中的默认子网掩码是255.255.0.0,可以支持中等规模的网络连接。

3. C类地址:

C类地址的范围从192.0.0.0到223.255.255.255,其中第一个字节的地址范围是192到223。C类地址中前三个字节用于网络地址,后一个字节用于主机地址。C类地址中的默认子网掩码是255.255.255.0,可以支持小规模的网络连接。

4. D类地址:

D类地址是用于多播的地址,范围从224.0.0.0到239.255.255.255,其中第一个字节的地址范围是224到239。D类地址中前四个字节用于标识多播组地址,不用于标识特定的网络或主机。

IP地址一般由四个字节组成,每个字节表示为一个十进制数,在IPv4中每个字节的取值范围是0到255。四个字节之间用“.”分隔。例如,IP地址192.168.0.1就是一个C类地址,其中前三个字节表示网络地址,最后一个字节表示主机地址。IP地址的组成和分类有助于进行网络规划和管理,同时也为不同规模的网络提供了不同的地址空间。

201.222.200.111/18计算主机数?子网掩码?说明计算方法。

子网掩码是18,表示前18位是网络字段
201.222.200.111转为二进制数为:
11001001.11011110.11001000.01101111
网络段是前18位,客户端范围即:
11001001 11011110 11 => 201.222.11000000 000000-201.222.11111111.11111111
网络段是:
201.222.192.0/18
子网范围是:
201.222.192.1/18-201.222.255.254/18
主机数是后14位:
16383-2=16381个主机数

当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?

10.0.1.1的二进制是:00001010.00000000.00000001.00000001
网段是:10.0.0.0/16
10.0.2.2的二进制是:00001010.00000000.00000010.00000010
网段是:10.0.2.0/24

当A给B发送消息时:
A用自己的子网掩码去对B的IP求网段,得到:10.0.0.0/16;在同一个网段,可以通信
当B给A发送消息时:
B用自己的掩码去对A的ip求网段,得到   :10.0.1.0/24;不在一个网段,不能通信

所以A给B发信息,B可以收到
但是B给A发信息,A收不到

如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。

10.0.0.0转为二进制是:
00001010.00000000.00000000.00000000
子网掩码是8,表示前8位是网络位,后面24位是主机位,由于要划分位32个子网,需要从主机位借5位,网络位达到13位,主机位是19位
所以子网范围:
(00001010.00000)(000.00000000) -> (00001010.11111)(000.00000000)
10.0.0.0/13 -> 10.248.0.0/13
掩码是:255.248.0.0
各个子网的主机数是:
每个子网的主机位都是19位:
0000000000000000000-1111111111111111111
0-524287
除去不可用的2个主机,一共524285个主机数

解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式

TYPE=Ethernet                      # 类型,以太网
NAME=eth0                          # connection名称
DEVICE=eth0                        # 网卡名称
BOOTPROTO=static/dhcp              # IP获取方式,设置为静态或DHCP
IPADDR=192.168.1.100               # IP地址
NETMASK=255.255.255.0              # 子网掩码
GATEWAY=192.168.1.1                # 网关地址
DNS1=8.8.8.8                        # DNS服务器1
DNS2=8.8.4.4                        # DNS服务器2
ONBOOT=yes                         # 开机自启动
USERCTL=yes                        # 用户控制

基于配置文件或命令完成bond0配置

# 创建bond0配置文件
[root@localhost ~]# nmcli connection add type bond con-name bond0 ifname bond0 mode active-backup ipv4.method manual ipv4.addresses 192.168.75.200/24 ipv4.gateway 192.168.75.2 ipv4.dns 8.8.4.4

# 将两个网卡接入bond0
[root@localhost ~]# nmcli connection add type bond-slave ifname ens160 master bond0
[root@localhost ~]# nmcli connection add type bond-slave ifname ens224 master bond0

# 查看配置文件
[root@localhost ~]# nmcli connection show
NAME               UUID                                  TYPE      DEVICE 
ens160             f5a25af5-45db-4971-921b-515681adc9e0  ethernet  ens160 
ens224-tmp         d6f55800-54c1-4a1f-ba9a-fd47f269c21d  ethernet  ens224 
bond0              c6aabf14-62c9-4adb-82e3-32b93f3b4bd1  bond      bond0  
virbr0             137677e9-ec3d-4657-99e8-10fd69f0388b  bridge    virbr0 
bond-slave-ens160  3e841ea8-887a-48b5-91b9-ee320d9d859b  ethernet  --     
bond-slave-ens224  51aa2f97-ce2d-4ac0-b173-c2dac52fe390  ethernet  --     
test               b8946c02-09d8-426e-8a2f-ffd9d4be94e4  ethernet  --

# 启动bond0需要先启动slave,再启动bond0配置,注意,此时可能会断网
[root@localhost ~]# nmcli connection up bond-slave-ens224
[root@localhost ~]# nmcli connection up bond-slave-ens160
[root@localhost ~]# nmcli connection up bond0

# 查看bond0是否生效
[root@localhost ~]# ip a
2: ens160: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:68:1b:3e brd ff:ff:ff:ff:ff:ff
3: ens224: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc mq master bond0 state UP group default qlen 1000
    link/ether 00:0c:29:68:1b:3e brd ff:ff:ff:ff:ff:ff
5: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:68:1b:3e brd ff:ff:ff:ff:ff:ff
    inet 192.168.75.200/24 brd 192.168.75.255 scope global noprefixroute bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::1c93:6971:8d2d:3b0c/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

# 查看内核中生效的bond0配置
[root@localhost ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: ens224
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens224
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:68:1b:3e
Slave queue ID: 0

Slave Interface: ens160
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:68:1b:34
Slave queue ID: 0

使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。

[root@localhost data]# cat alivecheck.sh 
#!/bin/bash

net=192.168.75.

for i in {1..254};do
   {
   ip=$net$i
   ping -c 3 -w 3 $ip &> /dev/null
   if [ $? -eq 0 ];then
      echo $ip is ok
   else
      echo $ip is not ok
   fi
   }&
done
wait

当在ping的时候,设置超时时间要宽裕一点,不然本来是通的机器,因为超时时间太短,导致有的回包没接收到,导致$?=1

使用while read line和/etc/passwd,计算用户id总和

[root@localhost data]# cat countallid.sh 
#!/bin/bash

file=/etc/passwd
all=0
while read line;do
   id=`echo $line | awk -F":" '{print $3}'`
   let all+=id
done < $file
echo $all	

[root@localhost data]# awk -F":" -v all=0 '{all+=$3}END{print all}' /etc/passwd
13203330
posted @ 2023-05-18 10:37  NewBird001  阅读(128)  评论(0)    收藏  举报