第三周作业

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

C程序源代码—预处理—编译—汇编—链接

  #分步编译运行:
  #对hello.c进行预处理,生成hello.i文件
   gcc -E hello.c -o hello.i  
  #对预处理文件进行编译,生成汇编文件
   gcc -S hello.i -o hello.s
  #对汇编文件进行编译,生成目标文件
   gcc -C hello.s -o hello.o
  #对目标文件进行链接,生成可执行文件
   gcc hello.o -o hello

   #一步实现编译过程:
   gcc hello.c -o hello

2. 总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取? 
1.主流的程序包管理器
    redhat:rpm文件、rpm包管理器
    debian:deb文件、dpkg包管理器


2.程序包管理器中包含的文件
    二进制文件
    库文件
    配置文件
    帮助文件

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

        3.1.程序包获取途径:

CentOS 镜像:
    https://www.centos.org/download/
    http://mirrors.aliyun.com
    https://mirrors.huaweicloud.com/
    https://mirror.tuna.tsinghua.edu.cn/
    http://mirrors.sohu.com
    http://mirrors.163.com
Ubuntu 镜像:
    http://cdimage.ubuntu.com/releases/
    http://releases.ubuntu.com
第三方组织提供:
    https://fedoraproject.org/wiki/EPEL
    https://mirrors.aliyun.com/epel/
    https://mirrors.cloud.tencent.com/epel/

软件项目官方站点:
    http://yum.mariadb.org/10.4/centos8-amd64/rpms/
    http://repo.mysql.com/yum/mysql-8.0-community/el/8/x86_64/
搜索引擎
    http://pkgs.org
    http://rpmfind.net
    http://rpm.pbone.net
    https://sourceforge.net/
自己制作:
    将源码文件,利用工具,如:rpmbuild,fpm 等工具制作成rpm包文件

        3.2.rpm, yum, apt命令选项示例

RPM命令及常用选项:
    rpm包安装
        rpm -ivh packagefilename //常用组合
            --test               //不真正安装,只是判断下是否能安装
            --nodeps             //不验证软件包依赖
    rpm包升级或降级
        rpm -Uvh packagefilename
        rpm -Fvh packagefilename
            --oldpackage         //更新到软件包的旧版本
            --force              //强制安装
    rpm包查询
        rpm -q
            -qi                   //查看包的版本、包名、版本、安装时间、发行者、功能
            -qf                   //反向查询文件来自哪个包
            -qc                   //列出所有配置文件
            -qd                   //列出所有程序文档
            -ql                   //列出软件包中的文件
    rpm包卸载
        rpm -e


yum常用选项
    yum install                   //安装						
	yum remove                    //卸载							
	yum list                      //查看						
	yum info                      //查看信息							
	yum provides 文件名及路径      //查看用到哪个包					
	yum search                    //搜索								
	yum history                   //查看历史安装
	yum repolist                  //查看仓库列表



apt常用选项
    apt install                 //安装
    apt show                    //显示安装细节
    apt list                    //列出包含条件的包
    apt remove/purge            // 卸载(推荐使用purge卸载,可移除软件包和配置文件)
    apt update                  //刷新存储库索引
    apt upgrade                 //升级所有可升级的软件包
    apt full-upgrade            //在升级软件包时自动处理依赖关系
    apt search                  //搜索应用程序
    apt-cache stats             //查看包相关信息
    dpkg -S filename            //查找存在的文件来自于哪个包


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

yum/dnf工作原理:
    yum服务器上创建yum repository(仓库),在仓库中事先存储了众多rpm包,
    以及包的相关的元数据文件(放置于特定目录repodata下),
    当yum客户端利用yum/dnf工具进行安装包时,
    会自动下载repodata中的元数据,
    查询元数据是否存在相关的包及依赖关系,
    自动从仓库中找到相关的包下载并安装。

        搭建私有yum仓库:

yum源服务器配置:
  1.创建epel源 
    vim /etc/yum.repos.d/test.repo
    
    [epel]
    name=EPEL    #仓库描述
    baseurl=https://mirror.tuna.tsinghua.edu.cn/epel/$releasever/Everything/$basearch 
            https://mirrors.cloud.tencent.com/epel/$releasever/Everything/$basearch
            https://mirrors.huaweicloud.com/epel/$releasever/Everything/$basearch
            https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch    #仓库地址
    gpgcheck=0
    enabled=1

   2.搭建httpd服务器
      yum -y install httpd
      /var/www/html  ------默认共享目录
      systemctl enable httpd --now  设置httpd服务开机自启动
      
   3.下载阿里云epel源到私有yum源服务器共享目录
       dnf reposync --repoid=epel --download-metadata -p /var/www/html
       

        效果展示

        客户端配置

vim /etc/yum.repos.d/test.repo
[epel]
name=EPEL
baseurl=http://192.168.29.100/epel/
gpgcheck=0
enabled=1
5. 总结系统安装之后的常用初始化步骤。rocky/ubuntu
#关闭SELinux 
    sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config


#关闭防火墙
    systemctl disable --now firewalld 

#修改网卡名称
    sed -ri '/GRUB_CMDLINE_LINUX=/s#(.*)"$#\1 ifnames=0"#' /etc/default/grub
    grub2-mkconfig -o /boot/grub2/grub.cfg ;reboot

#最小化安装系统后,建议安装常用软件
yum -y install autofs vim-enhanced tcpdump autofs chrony lrzsz tree telnet ftp lftp redhat-lsb-core bash-completion net-tools postfix wget bzip2 zip unzip xz lsof mlocate man-pages rsync

#配置仓库
系统源,EPEL源

#Ubuntu开启root远程登录功能
    sudo -i
    passwd root
    sed -i '/PermitRootLogin/c PermitRootLogin yes' /etc/ssh/sshd_config
    systemctl restart sshd

6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本
#!/bin/bash
CPUS=`grep -c  processor /proc/cpuinfo`
HTTPD_VERSION=2.4.57
INSTALL_DIR=/apps/httpd
COLOR="echo -e \E[32;1m"
END="\E[0m"

. /etc/os-release

#判断系统是否支持一键安装
if [ $ID = 'rocky' -o $ID = "centos" ];then
        systemctl disable firewalld --now
        yum -y install gcc make apr-devel apr-util-devel openssl-devel pcre-devel redhat-rpm-config bzip2
elif [ $ID = "ubuntu" ];then
        apt update
        apt -y  install  libapr*  libpcre3* libssl-dev make
else
        $COLOR"此系统不支持一键安装"$END
        exit
fi

#切换到压缩包下载目录
cd /usr/local/src
#判断压缩文件是否已存在,存在则显示准备解压,不存在则从官网获取安装
if [ -e httpd-$HTTPD_VERSION.tar.bz2 ];then
        $COLOR"准备解压!"$END
else
        #检查系统是否有wget程序,没有则安装
        rpm -q wget || yum -y install wget
        #从官网下载对应版本,没有则提示下载失败并退出
        wget https://dlcdn.apache.org//httpd/httpd-${HTTPD_VERSION}.tar.bz2  || { $COLOR "下载失败,退出" $END;exit ; }
fi
#解压下载后的压缩包
tar xvf httpd-${HTTPD_VERSION}.tar.bz2
#进入解压后的程序目录
cd httpd-${HTTPD_VERSION}
#通过选择指定安装路径及启用特性,检查依赖环境和依赖包
./configure --prefix=${INSTALL_DIR} --enable-ssl  --disable-status
#调用服务器多个cpu构建应用程序
make -j $CPUS && make install
#通过软连接到变量快速访问程序
ln -s /apps/httpd/bin/apachectl  /usr/local/bin/
#启动程序成功则提示安装成功
apachectl start && $COLOR"安装成功,服务已启动!"$END
$COLOR"请访问:http://`hostname -I`"$END
7. 总结开放系统互联OSI模型,每层作用及对应的协议。
开放系统互联OSI七层:
应用层:application		作用:应用层其功能为“处理”,即通过云计算平台进行信息处理。应用层与最低端的感知层一起,是物联网的显著特征和核心所在,应用层可以对感知层采集数据进行计算、处理和知识挖掘,从而实现对物理世界的实时控制、精确管理和科学决策。
表示层:presentation	    作用:位于会话层与应用层之间,表示层向上对应用层服务,向下接受来自会话层的服务。表示层为在应用过程之间传送的信息提供表示方法的服务,它只关心信息发出的语法和语义。
会话层:session			作用:位于传输层与表示层之间,主要的功能是对话管理,数据流同步和重新同步。主要的工具像QQ,微信。
传输层:transport		作用:传输层位于网络层与会话层之间,传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。传输层在给定的链路上通过流量控制、分段/重组和差错控制来保证数据传输的可靠性。里面有TCP协议,保证传输的稳定安全,UDP协议,保证传输的速度。主要的设备是防火墙。
网络层:network			作用:网络层是OSI参考模型中的第三层,介于传输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向传输层提供最基本的端到端的数据传送服务,网络层进行逻辑地址寻址,实现在不同网络的选择。主要的设备是路由器。
数据链路层:data link	    作用:数据链路层的主要功能就是合成数据块,封装成帧 与其他计算机进行通信的APP应用程序,支持APP应用程序的通信服务,同时通过端口与端口之间连接,进行物理寻址。寻找MAC地址。数据链路层主要设备是交换机。
物理层:physical			作用:物理层用于建立维护断开物理连接,主要是网线,中继器,调制解调器等。

8. 调整动态端口范围为20000-60000
#查看动态端口,客户端随机使用端口范围
[09:35:55 root@lgxtest1 ~]#cat /proc/sys/net/ipv4/ip_local_port_range 
32768	60999
#临时修改端口范围
[11:09:04 root@lgxtest1 ~]#echo 20000 60000 > /proc/sys/net/ipv4/ip_local_port_range
[11:11:54 root@lgxtest1 ~]#cat /proc/sys/net/ipv4/ip_local_port_range 
20000	60000
#修改配置文件永久生效
[11:11:57 root@lgxtest1 ~]#vim /proc/sys/net/ipv4/ip_local_port_range
[11:12:58 root@lgxtest1 ~]#cat /proc/sys/net/ipv4/ip_local_port_range 
20000	60000

9. 总结TCP包头结构,TCP三次握手,4次挥手。
TCP包头结构:
源端口、目标端口:计算机之间进程的通信是通过端口连接的,同一时间一个端口只允许一个进程占用,所以通过源端口和目的端口就可以知道那两个进程通信。源端口、目标端口是用16位表示的,可推算计算机的端口个数为2^16个,即65536
序列号:表示本报文段所发送数据的第一个字节的编号。在TCP连接中所传送的字节流的每一个字节都会按顺序编号。由于序列号由32位表示,所以每232个字节,就会出现序列号回绕,再次从 0 开始
确认号:表示接收方期望收到发送方下一个报文段的第一个字节数据的编号。也就是告诉发送方:我希望你(指发送方)下次发送的数据的第一个字节数据的编号为此确认号
数据偏移:表示TCP报文段的首部长度,共4位,由于TCP首部包含一个长度可变的选项部分,需要指定这个TCP报文段到底有多长。它指出 TCP 报文段的数据起始处距离 TCP 报文段的起始处有多远。该字段的单位是32位(即4个字节为计算单位),4位二进制最大表示15,所以数据偏移也就是TCP首部最大60字节
SYN:同步标志位,用于建立会话连接,同步序列号;
ACK:确认标志位,对已接收的数据包进行确认;
FIN:完成标志位,表示我已经没有数据要发送了,即将关闭连接;
PSH:推送标志位,表示该数据包被对方接收后应立即交给上层应用,而不在缓冲区排队;
RST:重置标志位,用于连接复位、拒绝错误和非法的数据包;
URG:紧急标志位,表示数据包的紧急指针域有效,用来保证连接不被阻断,并督促中间设备尽快处理;
窗口大小:表示现在允许对方发送的数据量,也就是告诉对方,从本报文段的确认号开始允许对方发送的数据量,达到此值,需要ACK确认后才能再继续传送后面数据,由Window size value * Window size scaling factor(此值在三次握手阶段TCP选项Window scale协商得到)得出此值
校验和:提供额外的可靠性
紧急指针:标记紧急数据在数据字段中的位置
10. 总结主机到主机的包传递过程。
网络通信过程:
	路由、ARP、三次握手、数据通信

主机A想给主机B发送数据,必须知道主机B的MAC地址;
如果主机A的ARP表中没有主机B的MAC地址,那么主机A需要获取默认网关的MAC地址,然后通过路由器来获取主机B的MAC地址;
如果主机A的ARP表中没有默认网关的MAC地址,需要通过ARP来获取MAC地址
主机A获取到默认网关的MAC地址之后,将数据封装成帧发送给路由器
如果路由器的ARP表中没有主机B的MAC地址,路由器需要通过ARP来获取主机B的MAC地址
路由器获取到主机B的MAC地址之后,将数据重新封装成帧发送给主机B
主机B发送回复数据给主机A,因为MAC地址已知,不再采用ARP,直接发送。
11. 总结IP地址 A, B, C, D 类,并解析IP地址的组成
IP地址组成:
IP地址由两部分组成:IP地址=网络位+主机位
		-网络位:标识的是internet上的一个子网
		-主机位:标识的子网中的某台主机

网络 ID:标识网络,每个网段分配一个网络ID,处于高位
主机 ID:标识单个主机,由组织分配给各设备,处于低位
IPv4地址格式:点分十进制记法


IP分类:
A类地址:
0 0000000 - 0 1111111.X.Y.Z : 0-127.X.Y.Z
网络ID位是最高8位,主机ID是24位低位
网络数:126=2^7(可变是的网络ID位数)-2
每个网络中的主机数:2^24-2=16777214
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
范例:114.114.114.114,8.8.8.8,1.1.1.1,123.56.174.200,119.29.29.29

B类地址:
10 000000 - 10 111111.X.Y.Z:128-191.X.Y.Z
网络ID位是最高16位,主机ID是16位低位
网络数:2^14=16384
每个网络中的主机数:2^16-2=65534
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
范例:180.76.76.76,172.16.0.1

C类地址:
110 0 0000 - 110 1 1111.X.Y.Z: 192-223.X.Y.Z
网络ID位是最高24位,主机ID是8位低位
网络数:2^21=2097152
每个网络中的主机数:2^8-2=254
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
范例: 223.6.6.6,223.5.5.5

D类地址:
组(多)播,1110 0000 - 1110 1111.X.Y.Z: 224-239.X.Y.Z
E类:保留未使用,240-255

12. 201.222.200.111/18计算主机数?子网掩码?说明计算方法。
#子网掩码
255.255.192.0
#主机数
16382

子网掩码计算过程
255.255.11000000.0
二进制11000000 =十进制192

主机数计算过程
2^(32-18)-2=16382

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

A访问B时:
A与A的子网掩码相与 网络ID:10.0.0.0/16
B与A的子网掩码相与 网络ID:10.0.0.0/16
网络ID相同,A可以访问B

B访问A时:
B与B的子网掩码相与 网络ID:10.0.2.0/24
A与B的子网掩码相与 网络ID:10.0.1.0/24
网络ID不相同,B无法访问A

14. 如何将10.0.0.0/8划分32个子网?求每个子网的掩码,主机数。
划分子网:网络ID向主机ID借位,如果借N位,则划分2^N个子网

10.0.0.0/8
32=2^5网络ID向主机ID借5位
8+5=13
255.11111 000.0.0

每个子网的子网掩码为255.245.0.0 
每个子网主机数为2^(32-13)=524286

15. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。
#修改主机名:
    vim /etc/hostname  修改配置文件永久生效
	hostnamectl set-hostname lgx   修改主机名临时生效
    centos6: 修改主机名
		vim /etc/sysconfig/network
		hostname 主机名 -------临时修改生效不需要重启

#修改网卡名:
	centos6:修改网卡名
		1.永久生效:
		  vim /etc/udev/rules.d/69-persistent.rules 
		2.临时修改:
		  ip link set eth0 down
		  ip link set eth0 name abc
		  ip link set abc up
	centos7以后的修改方法	  
	    修改文件vim /etc/default/grub     + net.ifnames=0
	    执行命令:grub2-mkconfig -o /boot/grub2/grub.cfg
	ubuntu:
		vim /etc/default/grub     + net.ifnames=0
		grub-mkconfig -o /boot/grub/grub.cfg

#修改网络地址:
		vim /etc/sysconfig/network-scripts/ifcfg-eth0
            centos6:reboot  
            centos7:systemctl restart network
			centos8:nmcli connection reload
					nmcli connection up ens160
            ubuntu:
		    	vim /etc/netplan/file.yaml  (严格控制缩进)
		    	netplan apply
        临时修改ip
            ip a add IP地址 dev eth0 label eth0:1

#路由
    临时生效:
    route add -net 访问网络ID gw 网关地址
    ip route add 访问网络ID via 网关地址 dev eth0
    永久生效:
    vim /etc/sysconfig/network-scripts/route-eth0
	    网络ID via 网关地址

16. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。
配置静态IP
[root@lgxtest1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0
  NAME=eth0
  BOOTPROTO=static (none)
  IPADDR=192.168.29.100
  NETMASK=255.255.255.0
  #PREFIX=24  
  GATEWAY=192.168.29.2
  DNS1=192.168.1.1
[root@lgxtest1 ~]# nmcli connection reload   
[root@lgxtest1 ~]# nmcli connection up eth0   #重启网卡


配置动态IP
[root@lgxtest1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0
  NAME=eth0
  BOOTPROTO=dhcp

[root@lgxtest1 ~]# nmcli connection reload   
[root@lgxtest1 ~]# nmcli connection up eth0   #重启网卡

17. 基于配置文件或命令完成bond0配置
    1.添加网卡设备
	2.cd /etc/sysconfig/network-scripts/  创建 ifcfg-bond0  ifcfg-eth0  ifcfg-eth1
	ifcfg-bond0:
		NAME=bond0
		TYPE=bond
		DEVICE=bond0
		BOOTPROTO=none
		IPADDR=192.168.29.230
		PREFIX=24
		BONDING_OPTS="mode=1 miimon=100 "

	ifcfg-eth0、ifcfg-eth1:
		NAME=eth0、1						
		DEVICE=eth0、1
		BOOTPROTO=none
		MASTER=bond0
		SLAVE=yes
		ONBOOT=yes
		
	3.nmcli connection reload
	4.nmcli connection up eth0、1
	5.cat /proc/net/bonding/bond0 查看网卡主备运行情况
		ifconfig -s 查看运行情况
18. 通过ifconfig命令结果找到ip地址.
[16:03:32 root@lgxtest1 ~]#ifconfig|sed -rn '2s@^[^0-9]+([0-9.]+) .*$@\1@p'
192.168.29.100
19.  使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
1:
#!/bin/bash
NET=192.168.29

for i in {1..254};do
        if ping -c1 -W1 $NET.$i &> /dev/null;then
                echo $NET.$i is up | tee -a host.txt
        fi
done


2:
#!/bin/bash
NET=192.168.29

for((i=1;i<=254;i++));do
        if ping -c1 -W1 $NET.$i &> /dev/null;then
                echo $NET.$i is up | tee -a host.txt
        fi
done


20. 使用while read line和/etc/passwd,计算用户id总和。
#!/bin/bash
wc /etc/passwd |cut -d" " -f3| while read stu;do
        echo $stu
done

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值