1. 尝试基于gcc命令说明 c语言编译过程。
# 编写hello.c脚本, 输出 "Hello,world"
[root@localhost ]# cat hello.c
#include <stdio.h>
int main(void)
{
printf("Hello,world\n");
}
# 预处理:对hello.c文件进行预处理,生成hello.i文件
[root@localhost ]# gcc -E hello.c -o hello.i
# 这时候的hello.i文件会多了很多预处理信息内容
[root@localhost ]# wc -l hello.i
720 hello.i
# 编译:对预处理文件进行编译,生成汇编文件
[root@localhost ]# gcc -S hello.i -o hello.s
# 这时候已经将c语言编译成汇编语言
[root@localhost ]# cat hello.s
.file "hello.c"
.text
.section .rodata
.LC0:
.string "Hello,world"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-18)"
.section .note.GNU-stack,"",@progbits
# 汇编:对汇编文件进行编译,生成目标文件hello.o
[root@localhost ]# gcc -c hello.s -o hello.o
# 这时候hello.o是一个二进制文件
[root@localhost ]# file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
# 链接:对目标文件进行连接,生成最终的可执行文件
[root@localhost ]# gcc hello.o -o hello
[root@localhost ]# ls
hello hello.c hello.i hello.o hello.s
[root@localhost ]# ./hello
Hello,world
2. 总结程序包管理器有哪些,以及包中包含什么内容的文件,尝试这些文件如何获取命令获取? yum/dnf/apt
(1)程序包管理器有yum、dnf、apt
(2)软件包种一般包含如下文件:
- 二进制文件
- 库文件
- 配置文件
- 帮助文件
(3)cpio工具可以查看包文件列表
语法:
rpm2cpio 包文件 | cpio -itv 预览包内文件
例子:
[root@localhost ]# rpm2cpio mysql-community-client-8.0.34-1.el8.x86_64.rpm | cpio -itv | head -5
161240 blocks
-rwxr-xr-x 1 root root 7717920 Jun 22 20:36 ./usr/bin/mysql
-rwxr-xr-x 1 root root 6520456 Jun 22 20:36 ./usr/bin/mysql_config_editor
-rwxr-xr-x 1 root root 7492320 Jun 22 20:36 ./usr/bin/mysql_migrate_keyring
-rwxr-xr-x 1 root root 7403624 Jun 22 20:36 ./usr/bin/mysqladmin
-rwxr-xr-x 1 root root 7874248 Jun 22 20:36 ./usr/bin/mysqlbinlog
3. 总结程序包获取途径,以及rpm, yum, apt命令选项示例。
# 示例
# rpm 包获取路径
- 访问centos官网镜像源 http://mirror.centos.org/centos/7
- 用rpm下载对应软件包
rpm -ivh http://mirror.centos.org/centos/7/updates/x86_64/Packages/httpd-2.4.6-97.el7.centos.1.x86_64.rpm
# yum 获取, 只获取,不安装
- yumdownloader http://mirror.centos.org/centos/7/updates/x86_64/Packages/httpd-2.4.6-97.el7.centos.1.x86_64.rpm
# apt 获取
- 访问地址:http://cdimage.ubuntu.com/releases
- apt 获取
[root@localhost ]# apt install https://mirrors.aliyun.com/ubuntu/pool/main/a/apache2/apache2_2.4.57-2ubuntu2_amd64.deb?spm=a2c6h.25603864.0.0.5e4839ce7pKtPr
4. 简要总结yum/dnf工作原理。并搭建私有yum仓库(base, epel源)给另一个虚拟机使用。
(1)工作原理
服务器:yum repolistory(仓库)--> rpm包、元数据(存在repodata目录)
客户端:yum工具-->从repodata拉去元数据-->下载并安装相关包、包依赖、
(2)私有仓库
# base源
# 服务器配置
yum -y install httpd
systemctl enable --now httpd
mkdir -pv /var/www/html/centos/8
mount /dev/sr0 /mnt/
cp -a /mnt/* /var/www/html/centos/8
# 客户端配置
cat /etc/yum.repos.d/local.repo
[BaseOS]
name=BaseOS
baseurl=http://1.1.1.1/centos/8/BaseOS
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
#epel源
# 服务器配置
[root@localhost ]# cat /etc/yum.repos.d/base.repo
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/8/Everything/x86_64/
gpgcheck=0
[root@localhost ]# dnf repolist
[root@localhost ]# dnf reposync --repoid=epel --download-metadata -p /var/www/html
[root@localhost ]# wget -P /var/www/html/epel
[root@localhost ]# systemctl start httpd
# 客户端配置
[root@localhost ]# cat /etc/yum.repos.d/local.repo
[epel]
name=EPEL
baseurl=http://1.1.1.1/8/epel/
gpgkey=http://1.1.1.1/epel/RPM-GPG-KEY-EPEL-8
[root@localhost ]# yum repolist
5. 总结系统安装之后的常用初始化步骤。rocky/ubuntu
# Rocky
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
systemctl disable --now firewalld
yum -y install epel-release
yum install -y bash-completion wget libGL autoconf automake libtool curl make g++ glibc-headers lsof gcc-c++ unzip zip cmake screen net-tools vim lrzsz htop gdb rsync psmisc sshpass
# Ubuntu
- 设置root密码
sudo -i
passwd root
- 允许root登录
grep ^PermitRootLogin /etc/ssh/sshd_config
- 更新软件
apt update
apt upgrade
- 安装基础软件
apt install bash-completion wget libGL autoconf automake libtool curl make g++ glibc-headers lsof gcc-c++ unzip zip cmake screen net-tools vim lrzsz htop gdb rsync psmisc sshpass
6. 解读一键安装httpd脚本,并自行实现一个一键安装脚本,要求
1)基于位置变量传递版本号
2)基于独立函数进行初始化步骤,禁用防火墙,安装开发依赖包。
3)基于独立函数进行下载包,解压包。
4)基于独立函数进行编译,安装包。
5)基于独立函数完成链接包。
6)启动服务,并输出自定义的语句,安装xxx服务
[root@localhost ]# cat httpd_install.sh
#!/bin/bash
# httpd软件依赖
httpd_dep="apr-devel apr-util-devel gcc pcre-devel openssl-devel make redhat-rpm-config autoconf"
httpd_path=/opt/httpd
httpd_sys_path=/etc/httpd
if [ $# -ne 1 ]
then
echo "请输入软件版本号,如 2.4.58"
exit 1
fi
num=$1
# 初始化
base_install(){
sed -i '/^SELINUX=/c SELINUX=disbaled' /etc/selinux/config || echo "Failed to disable firewalld"
systemctl disable --now firewalld || echo "Failed to disable firewalld"
yum -y install $(eval echo $httpd_dep) || echo "Failed to install softwwares"
}
# 下载解压
wget_unzip(){
wget -c http://archive.apache.org/dist/httpd/httpd-${num}.tar.gz
gzip -d httpd-${num}.tar.gz
tar xvf httpd-${num}.tar
}
# 编译安装
make_install(){
cd httpd-${num}
./configure --prefix=${httpd_path} --sysconfdir=${httpd_sys_path} --enable-ssl
make || echo "Failed to make"
make install || echo "Failed to make install"
}
# 链接
link_http(){
echo "PATH=${httpd_path}/bin:$PATH" > /etc/profile.d/httpd.sh
source /etc/profile.d/httpd.sh
}
# httpd启动配置
httpd_start(){
sed -i '/#ServerName/c ServerName www.example.com:80' ${httpd_sys_path}/httpd.conf
apachectl start && echo "安装httpd-${num}服务成功" || echo "安装httpd-${num}服务失败"
}
# 主函数
start_main(){
base_install
# wget_unzip
make_install
link_http
httpd_start
}
# 启动
start_main
7. 总结开放系统互联OSI模型,每层作用及对应的协议。
OSI模型分七层: 对应作用 对应协议
7 应用层 针对特定应用的协议 电子邮件协议SMTP、远程登录协议telnet、文件传输ftp协议
6 表示层 设备固有数据格式和网络标准数据格式的转换 ASCII、EBCDIC、Unicode、JPEG、GIF等
5 会话层 为会话实体间建立连接 RPC,SQL,NFS,NetBIOS,names,AppleTalk
4 传输层 提供了主机应用程序进程之间的端到端的服务 TCP/UDP
3 网络层 提供数据通信 IP协议、地址解析协议
2 数据链路层 是向该层用户提供透明的和可靠的数据传送基本服务 异步协议、同步协议
1 物理层 数据端设备提供传送数据通路、传输数据 DSL、usb
8. 调整动态端口范围为20000-60000
[root@localhost ]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
[root@localhost ]# echo 20000 60000 > /proc/sys/net/ipv4/ip_local_port_range
[root@localhost ]# cat /proc/sys/net/ipv4/ip_local_port_range
20000 60000
9. 总结TCP包头结构,TCP三次握手,4次挥手。
TCP包头结构由源端口、目的端口、序号、确认号、数据偏移、保留、URG、ACK、PSH、RST、SYN、FIN、窗口、校验和、紧急指针、选项、填充组成。
TCP三次握手
第一次握手:建立连接时,客户端发送syn包(seq=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户端的SYN(ack=j+1),同时自己也发送一个SYN包(seq=k),即SYN+ACK包,此时服务器进入SYN_RECV状态。
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
TCP四次握手
第一步,当主机A的应用程序通知TCP数据已经发送完毕时,TCP向主机B发送一个带有FIN附加标记的报文段(FIN表示英文finish)。
第二步,主机B收到这个FIN报文段之后,并不立即用FIN报文段回复主机A,而是先向主机A发送一个确认序号ACK,同时通知自己相应的应用程序:对方要求关闭连接(先发送ACK的目的是为了防止在这段时间内,对方重传FIN报文段)。
第三步,主机B的应用程序告诉TCP:我要彻底的关闭连接,TCP向主机A送一个FIN报文段。
第四步,主机A收到这个FIN报文段后,向主机B发送一个ACK表示连接彻底释放。
10.总结主机到主机的包传递过程。
1. 数据封装:发送方将要传输的数据划分为较小的数据块,称为数据包。每个数据包通常包含数据本身以及一些元数据,如源地址、目标地址、序列号等。
2. 路由选择:发送方通过路由选择算法确定数据包的下一跳路径。路由选择算法可以基于不同的策略,如最短路径、最快路径等。
3. 数据包传输:发送方根据路由选择的结果将数据包发送到下一跳的网络节点。这个过程通常涉及网络层和数据链路层的协议,例如IP协议和以太网协议。
4. 中转与转发:数据包在网络中的每个中间节点(路由器、交换机等)都会接收、处理和转发数据包。中间节点负责根据目标地址决定下一跳的路径,并进行转发。
5. 到达目标主机:经过多次中转后,数据包最终到达目标主机。目标主机接收数据包,并根据数据包的目标地址进行处理。
6. 解封装:目标主机根据协议栈的顺序逐层解封装数据包。这意味着目标主机会逐层剥去数据包的封装,直到获得原始的数据。
7. 数据处理:目标主机接收到数据后,根据应用层协议解析数据,并进行相应的处理。这可能包括数据的存储、显示、响应等操作。
总的来说,一个数据包的完整传输过程涉及数据封装、路由选择、数据包传输、中转与转发、到达目标主机、解封装和数据处理等步骤。这个过程是网络通信中的基本流程,确保数据能够从发送方传输到目标主机并得到正确处理。
11. 总结IP地址 A, B, C, D 类,并解析IP地址的组成
A类: A类IP地址就由1字节的网络地址和3字节主机地址组成
网络数:126=2^7
主机数:2^24-2=16777214
默认子网掩码:255.0.0.0
私网地址:10.0.0.0
B类: B类IP地址就由2字节的网络地址和2字节主机地址组成
网络数:2^14=16384
主机数:2^16-2=65534
默认子网掩码:255.255.0.0
私网地址:172.16.0.0-172.31.0.0
C类: C类IP地址就由3字节的网络地址和1字节主机地址组成
网络数:2^21=2097152
主机数:2^8-2=254
默认子网掩码:255.255.255.0
私网地址:192.168.0.0-192.168.255.0
D类: D类IP地址在历史上被叫做多播地址(multicast address),即组播地址
组(多)播
12. 通过网络配置命令,让主机可以上网。 ip, netmask, gateway, dns,主机名。相关命令总结,最终可以通过这些配置让你的主机上网。
[root@localhost ]# nmcli con mod eth0 ip4v.addresses "192.168.1.10/24" \
ipv4.gateway "192.168.1.1" ipv4.dns "8.8.8.8" ipv4.method manual
[root@localhost ]# nmcli con add con-name eth0 ifname eth0 type ethernet autoconnect yes
[root@localhost ]# nmcli con up eth0
13. 解析/etc/sysconfig/network-scripts/ifcfg-eth0配置格式。
[root@localhost ]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=dhcp # 激活此设备时使用的地址配置协议,常用的有dhcp、static、none
DEVICE=eth0 # 设备名
HWADDR=00:16:3c:51:9a:9e # MAC地址 #
NM_CONTROLLED=yes # 网卡是否接受NM控制(NM--NetworkManager)
ONBOOT=yes # 在系统引导时是否激活此设备
TYPE=Ethernet # 接口类型
USERCTL=no # 普通用户是否可控制此设备
14. 基于配置文件或命令完成bond0配置
[root@localhost ]# nmcli con add type bond con-name mybond0 ifname bond0 mode active-backup \
ipv4.method manual ipv4.addresses 10.0.0.100/24
[root@localhost ]# nmcli con add type bond-slave ifname ens7 master bond0
[root@localhost ]# nmcli con add type bond-slave ifname ens3 master bond0
[root@localhost ]# nmcli con up bond-slave-ent0
[root@localhost ]# nmcli con up bond-slave-eth1
[root@localhost ]# nmcli con up mybond0
15. 通过ifconfig命令结果找到ip地址.
[root@localhost ]# ifconfig eth0 | awk 'NR==2{print $2}'
16. 使用脚本判断你主机所在网络内在线的主机IP有哪些? ping通则在线。
[root@localhost ]# cat ping.sh
#!/bin/bash
for i in $(seq 1 254)
do
for j in $i
do
{
ip=192.168.0.$j
ping -c1 -W1 $ip &> /dev/null && echo "$ip is up" || ( echo "$ip is unreachable" ; exit )
}&
done
done
wait
17. 使用while read line和/etc/passwd,计算用户id总和。
[root@localhost ]# cat uids.sh
sum=0
awk -F: '{print $3}' /etc/passwd | while read line
do
let sum+=line
echo $sum
done | tail -1