1. 尝试基于gcc命令说明 c语言编译过程。
大致步骤为,预处理,编译,汇编,链接
预处理:
会处理以 # 符号开头的预处理指令,例如 #include、#define 等。所有被包含的头文件(例如标准库头文件 stdio.h)都会被插入到源代码中,扩展源文件。宏定义会被展开。比如hello.c变成hello.i后#include没了,替换成一堆c语言代码,此时还是属于c语言代码
编译:
将C源代码翻译成汇编语言,生成一个汇编代码文件,里面有汇编指令如movq
汇编:
汇编器接受汇编代码文件并将其转化为机器码指令。它生成一个目标文件,其中包含了二进制表示的机器码以及一些元数据,此时已经变成二进制文件了
链接:
这个命令会将目标文件与所需的库文件链接在一起,生成可执行文件 hello
2. 总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取?
常见包管理器
有rpm(redhat pachage manager),包后缀rpm
ubuntu下的包管理器是dpkg,包后缀deb
上面两个都不能自动解决依赖,
yum,dnf,是rpm包管理器
apt是dpkg包管理器,最大的优势是可以自动解决依赖关系完成安装
包中包含文件
使用rpm2cpio来查看里面包含啥
程序可执行文件:这是程序包中最关键的文件之一,它是实际运行程序的二进制文件。
配置文件:程序包中可能包含了一些配置文件,这些文件包含了程序的一些配置信息,例如,端口号、数据库连接信息等。
文档文件:为了方便用户使用程序,程序包通常会包含一些用户手册、帮助文档、使用说明等文档文件。
库文件:很多程序需要使用到一些共享库文件,程序包中可能会包含这些库文件,以便于程序能够正确地运行。
图标文件和资源文件:程序包还可能包含一些图标文件和其它资源文件,这些文件可以提高用户体验。
安装脚本:一些程序包可能会包含一些安装脚本,这些脚本可以在程序安装前或安装后执行一些预处理或后续操作。
总之,程序包中的文件类型和数量因程序而异,但通常都包含了一些核心文件(如可执行文件和依赖库文件等)和与程序相关的配置文件和文档信息。
3. 总结程序包获取途径,以及rpm, yum, apt命令选项示例。
获取途径:
官网下载,第三方组织如epel,搜索引擎,自行用源码编译
rpm命令:
安装软件包:rpm -ivh xxx
卸载软件包:rpm -e
查询是否安装:rpm -qa
查看文件属于哪一个包:rpm -qf
yum命令:
安装:yum install
卸载:yum remove
查询:yum list
查询本地是否安装:yum list installed
,列出软件装哪去了:rpm -ql
离线下载包:yum localinstall httpd --downloadonly --downloaddir=/opt
查询文件或者命令来自哪一个包:yum provides mime.types
apt命令:
apt install
apt remove
apt search
apt-file search xxx 类似于yum provides
4. 简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用。
工作原理:
就是调用rpm,自动解决依赖关系
基于c/s结构
yum服务器存放rpm包与相关包的元数据库
yum客户端访问yum服务器进行安装或者查询
yum服务器端先建立一个rpm包的仓库,与之对应的元数据,客户端访问的时候先下载更新repodata,查询有没有包和依赖,有的话就远程拉取rpm包安装。
yum本地仓库
需要工具 reposync(同步软件的) createrepo(建立yum元数据的) 两个
createrepo可以直接下载。reposync没有直接的包,那就使用yum provides reposync搜索这个,发现在yum-until中,那就下载yum-until。
此次选择的仓库是清华大学镜像站的,地址层级需要到有repodata这一层
新建一个磁盘并挂载到/localrepo目录上(记得永久挂载)
输入命令 reposync -p /localrepo 不指定仓库名就是所有仓库都同步。同步完成后。进入/localrepo 输入createrepo。完成yum仓库元数据的创建
安装ftp或者http的软件,这里选择ftp,yum install vsftpd,修改vsftpd配置文件/etc/vsftpd/vsftpd.conf
systemctl restart vsftpd ;systemctl enable vsftpd
找一台客户机进行实验。
客户端yum配置:
yum clean all
yum makecache
yum repolist 查看仓库应该就只有一个叫localyum的仓库了,到此本地仓库搭载完成
5. 总结系统安装之后的常用初始化步骤。rocky/ubuntu
rocky:
修改网卡,关闭防火墙,关闭selinux,配置yum源
ubuntu:
修改网卡,关闭防火墙,关闭selinux,配置yum源,ubuntu开启root远程登录。
可以根据实际需求进行初始化
6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求
1)基于位置变量传递版本号
2)基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包。
3)基于独立函数进行下载包,解压包。
4)基于独立函数进行编译,安装包。
5)基于独立函数完成链接包。
6)启动服务,并输出自定义的语句,安装xxx服务
[root@localhost src]# cat http_install.sh
httpdownload ()
{
wget https://dlcdn.apache.org/httpd/httpd-$1.tar.bz2 -P /usr/local/src/
tar jxvf httpd-$1.tar.bz2 -C /usr/local/src/
}
chushihua ()
{
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
yum install gcc make apr-devel apr-util pcre redhat-rpm-config.noarch -y
}
httpdinstall ()
{
cd /usr/local/src/httpd-$1
./configure --prefix=/usr/local/apache2
make
make install
}
httplink ()
{
ln -s /usr/local/apache2/bin/apachectl /usr/local/bin/
}
httpdownload $1
chushihua
httpdinstall $1
httplink
apachectl start && echo "success install httpd service"
[root@localhost src]#
7. 总结开放系统互联OSI模型,每层作用及对应的协议。
应用层
为用户提供服务,对用户展示的最终界面。
协议:ssh,telnet,http等
表示层
数据提供表示,以什么方式表现出来,比如声音翻译成二进制,电脑才能识别播放出来
比如encode与decode区别,你自己有ascll,utf-8,GBK,这里我处理是统一转换成unicode字符串
加密,对称加密与非对称加密
压缩,tar -zcvf zip等
协议:各种编码协议
会话层
确定是否需要网络传递,比如发一个邮件,这个时候就需要走网络通道。如果你只是保存一个txt文档,这个就不需要走到下一层
协议:rpc
传输层
1.数据分组或者组装,上层流下来的数据进行拆分成数据包
2.提供传输协议的选择,tcp,udp
端口分装
差错校验
协议:tcp,udp,sctp
网络层
ip地址编址
路由选择
静态路由,对设备开销比较小
动态路由,开销大,需要实时运算
协议:ip,icmp,arp
数据链路层
mac地址寻址,同网段
差错校验
协议:ppp,HDLC
物理层
数据实际传输
电气特性定义
协议:以太网协议
8. 调整动态端口范围为20000-60000
[root@localhost src]# echo 20000 60000 > /proc/sys/net/ipv4/ip_local_port_range
[root@localhost src]# cat /proc/sys/net/ipv4/ip_local_port_range
20000 60000
[root@localhost src]#
永久保存需要放在/etc/sysctl.conf中,修改后执行 sysctl -p,
从sys下面开始写,/换成.就是文件中的内核参数写法
9. 总结TCP包头结构,TCP三次握手,4次挥手。
tcp包结构:
由源目端口号,Seq序号,Ack序号,offset偏移量(包切片后的位置偏移),标志位ACK,SYN,FIN,等
三次握手:
整个握手过程可以分为两个阶段,第一次客户端SYN过去,服务端ACK确认回来, 第二次服务端SYN过去,客户端ACK回来。服务端过去的SYN与ACK放一个包里面传了。
第一次握手客户端进入syn—sent,,SYN标志位置为1,seq序列号随机生成。
第二次握手SYN标志位也置1,ACK位置1.确认号ack,是要ACK标志位置1才有效,确认号ack就写上一个接收到的seq号+1,然后自己也新生成一个新的seq号服务端进入syn—rcvd。第三次握手只有ACK置1,ack写上一个接收对面的报文的seq+1,seq写自己上一个发送的报文的seq+1,客户端发出包,进入establishd,服务端收到包,进入establishd
四次挥手
挥手也是一样的,发FIN过去,回一个ACK。 服务端也是发一个FIN,客户端回一个ACK。与挥手的区别就是中间那个服务端的FIN与ACK的无法合成一个包来传输,相当于他先发了一个ACK回应,然后等待自己这边传输结束后再发起FIN,
第二次挥手,只是对前一个的确认,因为自己数据包还没有处理完的,colse—wait到last—ack还有一段时间,所以第二第三次seq并不连续,但是第一个第四个是连续的,说明客户端这边到fin—wait1的时候就已经停止发送数据包了。但是服务器这边还是会发包,第一个来回只是表示了客户端已经结束了,但是服务端这里有些可能还没有发完,所以需要等待这边发送完成后,服务器再发fin包
可以看到,如果按照3次握手来对比,四次挥手就是把中间那一次的fin与ack分开了,因为握手的时候是没有数据传输的,所以可以syn与ack合在一起,挥手是因为服务器可能还在传数据,所以先传一个ack,然后再传一个fin
10. 总结主机到主机的包传递过程。
发送过程:
应用层:数据封装成应用层的数据包,比如http,送往下一层处理
传输层:在应用层的基础上加上传输层的字段,比如tcp的头部(有端口号信息),送往下一层
网络层:加上网络层的字段,ip报头(有ip地址信息),送往下一层
数据链路层,添加数据链路层头部信息(有mac地址信息)
物理层:在物理介质中进行信息传输,如网线,光纤等
接收过程:
与发送的相反,层层解包
11. 总结IP地址 A, B, C, D 类,并解析IP地址的组成
A类地址:以0开头,第一个字节范围从1到126,用于大型网络。其中,0和127是保留地址,不可使用。A类地址的网络号占8位,主机号占24位。
B类地址:以10开头,前两个字节共占用16位,范围从128.0到191.255,用于中等规模的网络。B类地址的网络号占16位,主机号占16位。
C类地址:以110开头,前三个字节共占用24位,范围从192.0.0到223.255.255,用于小型网络。C类地址的网络号占24位,主机号占8位。
D类地址:以1110开头,前四个字节共占用32位,没有主机号和网络号,专门用于组播,ospf组播等。
ip地址组成:
点分十进制,共32位,分为网络位与主机位
12. 201.222.200.111/18计算主机数?子网掩码?说明计算方法。
18位掩码,那主机位数就是14位,2的14次方-2=16382
18位子网掩码:255.255.192.0
13. 当A(10.0.1.1/16)与B(10.0.2.2/24)通信,A如何判断是否在同一个网段?A和B能否通信?
a判断一个网段:a用自己ip与自己掩码与运算,b的ip与自己掩码与运算,结果相同的话就是网络位一致,在一个网段。但是反过来b做运算的时候就不在一个网络了
不能通信
14. 如何将10.0.0.0/8划分32个子网?
32等于2的5次方,向右移5位
每个子网的掩码
11111111.11111000.0.0
主机数
13位掩码,那就19位主机位,2的19次方减2=524286
15. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。
ip a a 10.0.0.1/24 dev eth0
ip link set eth0 up
ip route add default via 10.0.0.254
echo "nameserver 223.5.5.5" > /etc/resolv.conf
一般通过修改网卡配置文件方式来配置网络
16. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。
TYPE:网络接口类型,一般设置为Ethernet
BOOTPROTO:启用的协议类型,可设置为static(静态IP)或dhcp(动态获取IP)或者none
NAME:网络接口名称
DEVICE:网络接口设备名称
ONBOOT:开机是否启用该网络接口,yes表示启用
IPADDR:网络接口IP地址
NETMASK:子网掩码PREFIX:也是子网掩码位数,比如可以直接写24
GATEWAY:默认网关
DNS1:首选DNS服务器
DNS2:备选DNS服务器
对于ipv6的设置暂时可以删除,生产网络很少需要ipv6
17. 基于配置文件或命令完成bond0配置
18. 通过ifconfig命令结果找到ip地址.
19. 使用脚本判断 你主机所在网络内在线的主机IP有哪些? ping通则在线。
[root@localhost ~]# cat ip_on_check.sh
#!/bin/bash
for i in `seq 1 255`
do
ping 192.168.174.$i -w1 &> /dev/null
if [ $? -eq 0 ];then
echo "主机192.168.174.$i在线"
fi
done
[root@localhost ~]#
20. 使用while read line和/etc/passwd,计算用户id总和。
[root@localhost ~]# cat sumid.sh
#!/bin/bash
#awk -F: '{print $3}' /etc/passwd > userid.tmp
IFS=:
sum=0
while read a b id d
do
# echo "id $id"
let "sum +=$id"
done < /etc/passwd
echo "id_sum is $sum"
[root@localhost ~]# sh sumid.sh
id_sum is 195560
[root@localhost ~]#