时间同步服务器

一、搭建时间同步服务

实验拓扑

1.1 server端配置

1.安装chrony
root@server:~# apt install -y chrony

2.配置时间同步服务器并开启本地时间同步
root@server:~# cat /etc/chrony/chrony.conf 
#配置时间同步服务器
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst

#指定允许同步的网段
allow 192.168.1.0/24

#互联网无法连接,仍然可以为客户端提供时间同步服务
local stratum 10

3.重启服务
root@server:~# systemctl restart chronyd
root@server:~# systemctl status chronyd

4.检查123/udp是否正常监听
root@server:~# ss -ntlu | grep 123
udp    UNCONN  0       0              0.0.0.0:123          0.0.0.0:* 

1.2 客户端配置

1.安装chrony
root@client1:~# apt install chrony -y
root@client2:~# apt install chrony -y

2.添加192.168.1.172为时间同步服务端
#client1
root@client1:~# cat /etc/chrony/chrony.conf
#添加server端地址
server 192.168.1.172 iburst
root@client1:~# systemctl restart chronyd
root@client1:~# systemctl status  chronyd
#检查时间同步是否成功
root@client1:~# chronyc sources -v
210 Number of sources = 1

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 192.168.1.172                 3   6    17    51    +50us[  +26us] +/-   32ms

#client2
root@client2:~# cat /etc/chrony/chrony.conf
server 192.168.1.172 iburst
root@client2:~# systemctl restart chronyd.service 
root@client2:~# systemctl status chronyd.service
root@client2:~# chronyc sources -v
210 Number of sources = 1
  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* 192.168.1.172                 3   6    17    10  +3537ns[  +15us] +/-   33ms

1.3 常见chrony 配置选项

# 指定 NTP 服务器
server pool.ntp.org iburst

# 指定备用 NTP 服务器
server 0.debian.pool.ntp.org iburst

# 如果可能的话,保持系统时钟的频率
makestep 1.0 .01

# 允许本地系统时钟作为时间源
local stratum 10

# 允许客户端查询时间
rtcsync

# 允许客户端进行广播更新
broadcast

# 禁止客户端通过 chronyd 来修改系统时钟
sanity

# 设置日志文件
logdir /var/log/chrony

发表在 第六周作业 | 留下评论

ssh安全服务和sudo配置

一、ssh

1.1 ssh 服务安全加固和优化

安全加固配置
1.禁止root用户直接通过ssh远程登录
   PermitRootLogin no
2.不使用默认的22端口且定时修改ssh端口
   Port 22 #定时修改端口号
3.关闭密码认证使用秘钥认证
  PasswordAuthentication No #关闭密码认证
  PubkeyAuthentication ye   #开启秘钥认证
4.指定可连接的网段
  ListenAddress #监听地址指定允许哪些网段远程进来
5.空闲超时自动注销连接
  ClientAliveInterval 60
  ClientAliveCountMax 0  
6.确保ssh开启日志功能且定期分析日志

优化连接速度设置
1.UseDNS no #相当于网络命令的-n选项.
2.GSSAPIAuthentication no #关闭GSS认证.

1.2 ssh免密认证原理

OpenSSH 免密认证基于公钥加密技术,通过一对非对称加密秘钥来实现以下是基本原理:
1. 首先在客户端生成一对密钥(ssh-keygen)
2. 并将客户端的公钥ssh-copy-id 拷贝到服务端
3. 当客户端再次发送一个连接请求,包括ip、用户名
4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串。
5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

1.3 免密认证实现过程

1.客户端生成秘钥对
root@ssh-client:~# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #回车
Enter passphrase (empty for no passphrase): #回车
Enter same passphrase again: #回车
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xgco6yhGbfnmeFfcNlmz9ZPVdkpdPd0VsHb0JGt9+kw root@ssh-client
The key's randomart image is:
+---[RSA 3072]----+
|             .ooO|
|       .      o**|
|    . . .    oooB|
|  . .o . .  .+ooB|
| . +.   S o o.=oE|
|. .o.  . + = ..*.|
|... .o  . . .   +|
|..  +. .         |
|   ....          |
+----[SHA256]-----+
#查看秘钥文件
root@ssh-client:~# ls .ssh/
authorized_keys  id_rsa  id_rsa.pub

2.分发秘钥至server端
root@ssh-client:~# ssh-copy-id 192.168.1.173
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.1.173 (192.168.1.173)' can't be established.
ECDSA key fingerprint is SHA256:XF2WytrueEY6X/gU0JPDyV/WhgxlhQyN2CmnEk0VL6k.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes #输入yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.1.173's password: #输入server端root密码
Number of key(s) added: 1
Now try logging into the machine, with:   "ssh '192.168.1.173'"
and check to make sure that only the key(s) you wanted were added.
#屏幕反馈尝试"ssh '192.168.1.173'"即为成功分发公钥

在server端查看authorized_keys文件可以看到client的公钥
root@ssh-server:~# cat .ssh/authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCxPihowhM/yX3VkcgN9eVtA+UAtlswtYU9pvX+/9t0YTzZ9xYLg70g3lw/Lk385yxfVxqTXz12mMkk00K7vHb7Lj1D0l3qW9QAVU+5C6caOOW90/bgpL8VCRzEnMEtbWwm7scdjgEuKJvsgsMV+PR5awb765ldKutTTwtdIQOXFIUnpOTyhcry7qs80FZoZzXnUo1Togvt0TYrZ5gt2vipRv7vdn9s2ge0+6K3DAGvGxObcKaJasFYoSjiMTxqI85oACpY8bDx1D+g+I3Lv9HIfNu/vXcX9m86jHYZ5Mr63DtTCm+1fZ6yRl/Xp5F+g5MrpH+KtrphPCgrnHRLbgMS3sJHHerDD9UzRIBFZZRQeQ1gdIZWQDrIkmNkI2aAeRlGxki8rawoQoOQxaKundwDeCV/V33zrRNuC3jYVNzLsiq/1a9tEuzhDyZNxIJtGAMquEUpBLEXJzN0E1SrBI1jRsTdSuhe5Fy0eUDsAVc8fLoEMaRcFcr0zNouYsoFWI8= root@ssh-client
注:基于其他用户分发公钥的命令是ssh-copy-id username@ip 如:ssh-copy-id xiaoming@192.168.1.173

3.ssh登录server
root@ssh-client:~# ssh root@192.168.1.173
Welcome to Ubuntu 20.04.3 LTS (GNU/Linux 5.4.0-81-generic x86_64)
......
Last login: Sun Sep 29 11:29:39 2024 from 192.168.1.115
root@ssh-server:~# exit
logout
Connection to 192.168.1.173 closed.
注:ssh username@ip 该命令不加用户名则默认是root用户

二、sudo

sudo(superuser do)是一个在类 Unix 操作系统(如 Linux 和 macOS)中广泛使用的命令,它允许用户以更高的权限(通常是 root 权限)来执行命令。sudo 的设计目的是为了增强系统的安全性,同时简化系统管理员的任务。

2.1 sudo 简介

#授权文件
/etc/sudoers
/etc/sudoers.d

#授权文件语法检查工具
1.检查语法
visudo -c
2.检查指定配置文件语法
visudo -f /etc/sudoers.d/test

sudo命令简介
-V 显示版本信息等配置信息
-u user 指定代表的用户,默认为root
-l,ll 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号

2.2 授权规则配置

#授权规则格式
用户 登入主机=(代表用户) 命令
user host=(runas) command
说明:
user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令

#别名解释
在 sudoers 文件中,别名(Aliases)是一种定义用户、主机或命令的别名的方法,这样可以使配置更加简洁和易于管理。使用别名可以让你定义一组用户、主机或命令,并在 sudoers 文件的其他地方引用这些别名,从而避免重复定义。
别名的分类
sudoers 文件支持三种类型的别名:

用户别名 (User_Alias):定义一组用户。
主机别名 (Host_Alias):定义一组主机。
命令别名 (Cmnd_Alias):定义一组命令。

1.用户别名
# 定义用户别名
User_Alias MY_USERS = student, admin

# 使用用户别名
MY_USERS ALL=(ALL) NOPASSWD: /sbin/pidof, /sbin/ifconfig

定义用户别名:MY_USERS 包含用户 student 和 admin。
使用用户别名:MY_USERS 中的用户可以在任何主机上无密码执行 /sbin/pidof 和 /sbin/ifconfig 命令。

2.主机别名 (Host_Alias)
主机别名允许你定义一组主机,并为这些主机设置相同的权限。
# 定义主机别名
Host_Alias MY_HOSTS = server1.example.com, server2.example.com

# 使用主机别名
student MY_HOSTS=(root) ALL
定义主机别名:MY_HOSTS 包含主机 server1.example.com 和 server2.example.com。
使用主机别名:用户 student 可以在 MY_HOSTS 中的任何主机上以 root 用户的身份执行任何命令。

3.命令别名 (Cmnd_Alias)
命令别名允许你定义一组命令,并为这些命令设置相同的权限。
# 定义命令别名
Cmnd_Alias MY_CMDS = /sbin/pidof, /sbin/ifconfig, /usr/bin/systemctl restart nginx

# 使用命令别名
admin ALL=(ALL) NOPASSWD: MY_CMDS
定义命令别名:MY_CMDS 包含命令 /sbin/pidof, /sbin/ifconfig 和 /usr/bin/systemctl restart nginx。
使用命令别名:用户 admin 可以在任何主机上无密码执行 MY_CMDS 中的任何命令。

使用别名的注意事项
1.位置:别名定义通常放在 sudoers 文件的顶部,以便在整个文件中引用。
2.语法:别名定义的语法为 Alias_Type Alias_Name = item1, item2, ...。
3.引用:在 sudoers 文件的其他地方引用别名时,直接使用别名名称即可。

完整示例
# 定义用户别名
User_Alias MY_USERS = student, admin

# 定义主机别名
Host_Alias MY_HOSTS = server1.example.com, server2.example.com

# 定义命令别名
Cmnd_Alias MY_CMDS = /sbin/pidof, /sbin/ifconfig, /usr/bin/systemctl restart nginx

# 使用用户别名
MY_USERS ALL=(ALL) NOPASSWD: MY_CMDS

# 使用主机别名
student MY_HOSTS=(root) ALL

# 其他配置
%wheel ALL=(ALL) NOPASSWD: ALL

示例:

1.授予普通用户xiaoming在etc目录创建文件的权限
xiaoming@ubuntu-2004:/etc$ touch test.txt
touch: cannot touch 'test.txt': Permission denied
xiaoming@ubuntu-2004:/etc$ 
xiaoming@ubuntu-2004:/etc$ sudo touch test.txt
[sudo] password for xiaoming: 
xiaoming is not in the sudoers file.  This incident will be reported.
#在未提权之前无法创建文件

#编辑授权文件
root@ubuntu-2004:~# cat /etc/sudoers.d/xiaoming 
xiaoming    ALL=(root) /usr/bin/touch
#修改授权文件权限为0440
root@ubuntu-2004:~# chmod 0440 /etc/sudoers.d/xiaoming
#执行语法检查
root@ubuntu-2004:~# visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/README: parsed OK
/etc/sudoers.d/xiaoming: parsed OK

2.切换到xiaoming账号在etc目录下创建文件 test.txt
root@ubuntu-2004:~# su - xiaoming
xiaoming@ubuntu-2004:~$ cd /etc/
xiaoming@ubuntu-2004:/etc$ sudo touch test.txt
[sudo] password for xiaoming: 输入密码
#检查文件是否存在
xiaoming@ubuntu-2004:/etc$ ls test.txt
test.txt

发表在 每周作业, 第六周作业 | 留下评论

DNS服务

一、原理总结

1.1 DNS域名三级结构

DNS(Domain Name System,域名系统)是一种层次化的命名系统,用于将人类可读的域名转换为计算机可识别的 IP 地址。DNS 域名结构通常被划分为多个层级,最常见的形式是三级结构,但实际中可以有更多的层级。

  • 根域:全球根服务器一共13个节点,10个在美国,荷兰、瑞典、日本各1个
  • 顶级域名
    .com:商业机构
    .org:非营利组织
    .cn:中国
    .uk:英国
  • 二级域名
    example.com:在这里,example 是二级域,.com 是顶级域。
    company.org:在这里,company 是二级域,.org 是顶级域。
    university.edu.cn:在这里,university 是二级域,.edu.cn 是顶级域(.edu 是二级域的一部分,.cn 是顶级域)
  • 三级域名
    subdomain.example.com:在这里,subdomain 是三级域,example 是二级域,.com 是顶级域。
    department.company.org:在这里,department 是三级域,company 是二级域,.org 是顶级域。
    faculty.university.edu.cn:在这里,faculty 是三级域,university 是二级域,.edu.cn 是顶级域

1.2 DNS 工作原理

DNS 的主要功能包括:

  1. 域名解析:将域名转换为 IP 地址。
  2. 负载均衡:通过轮询或其他算法,将流量分散到多个服务器。
  3. 故障转移:当一个服务器不可用时,可以自动切换到备用服务器。
DNS 记录类型:
A 记录:将域名映射到 IPv4 地址。
AAAA 记录:将域名映射到 IPv6 地址。
CNAME 记录:将一个域名映射到另一个域名。
MX 记录:用于电子邮件路由,指定邮件交换服务器。
NS 记录:指定一个域名的权威名称服务器。
PTR 记录:反向解析记录,将 IP 地址映射到域名。
TXT 记录:存储任意文本信息,常用于验证域名所有权或 SPF 记录。

递归查询:当客户端发起解析请求时,DNS服务器必须要给客户端返回一个准确的查询结果,如果本地缓存没有该域名解析信息,DNS会从根服务器开始查找,直到获取正确的地址解析信息,把该信息返还给客户端。

迭代查询:当客户端发起域名解析请求时,DNS服务端并不将地址直接解析给客户端而是将另外一个dns服务器的地址告诉客户端,让客户端到该服务端上查找解析,一直迭代到正确获取地址解析。

1.3 DNS服务器类型,解析答案,正反解析域,资源记录定义。

DNS服务器分为三种:

  1. 主DNS服务器
  2. 从DNS服务器
  3. 缓存DNS服务器

主服务器:负责管理和维护所负责解析的域内解析库的服务器

从服务器:从主服务器上复制(区域传输)解析库副本

  • 序列号:解析库版本号,主服务器解析库变化时,其序列递增
  • 刷新时间间隔:从服务器从主服务器请求同步解析的时间间隔
  • 重试时间间隔:从服务器请求同步失败时,再次尝试时间间隔
  • 过期时长:从服务器联系不到主服务器时,多久后停止服务
  • 通知机制:主服务器解析库发生变化时,会主动通知从服务器

解析形式:

正向:FQDN( Fully Qualified Domain Name) –> IP
反向: IP –> FQDN

解析答案

  • 肯定答案:存在对应的查询结果
  • 否定答案:请求的条目不存在等原因导致无法返回结果
  • 权威答案:直接由存有此查询结果的DNS服务器(权威服务器)返回的答案
  • 非权威答案:由其它非权威服务器返回的查询答案

各种资源记录

A 记录:
用于将域名映射到 IPv4 地址。
例如,www.example.com 的 A 记录可能为 192.168.1.100。
AAAA 记录:
用于将域名映射到 IPv6 地址。
例如,www.example.com 的 AAAA 记录可能为 2001:db8::1。
CNAME 记录:
用于将一个域名映射到另一个域名。
例如,www.example.com 的 CNAME 记录可能为 example.com。
MX 记录:
用于邮件交换,指定邮件服务器的优先级。
例如,example.com 的 MX 记录可能为 mail.example.com。
NS 记录:
用于指定一个域名的权威名称服务器。
例如,example.com 的 NS 记录可能为 ns1.example.com。
PTR 记录:
用于反向解析,将 IP 地址映射到域名。
例如,192.168.1.100 的 PTR 记录可能为 www.example.com。
TXT 记录:
用于存储任意文本信息,常用于验证域名所有权或 SPF 记录。
例如,example.com 的 TXT 记录可能为 v=spf1 mx -all。
SOA 记录:
Start Of Authority,起始授权记录
用于定义一个区域的起始授权记录,包括序列号、刷新时间等信息。
例如,example.com 的 SOA 记录可能为 ns1.example.com. admin.example.com. (2023010101 ; Serial number…)。
SRV 记录:
用于指定服务的位置和优先级。
例如,_smtp._tcp.example.com 的 SRV 记录可能为 10 1 25 _smtp._tcp.mail.example.com。

资源记录定义

name [TTL] IN rr_type value

name:记录的名字,通常是域名的一部分,可以是相对名字(相对于区域的顶级域)或绝对名字(完整域名)。
TTL:记录的生存时间,单位是秒。TTL 值定义了该记录在 DNS 缓存中应保留的时间长度。
IN:标识符,表示该记录属于 Internet 类型(INternet)。尽管现在几乎总是使用 IN,但它仍然是语法的一部分。
rr_type:记录的类型,例如 A、AAAA、CNAME、MX、NS、PTR、TXT、SRV 等。
value:记录的值,根据不同的记录类型,值的内容有所不同

资源定义示例:

1.A记录
www.example.com. 3600 IN A 192.168.1.100
这条记录表示 www.example.com 指向 IP 地址 192.168.1.100,TTL 值为 3600 秒。

2.AAAA记录
www.example.com. 3600 IN AAAA 2001:db8::1
这条记录表示 www.example.com 指向 IPv6 地址 2001:db8::1,TTL 值为 3600 秒

3.CNAME 记录
www.example.com. 3600 IN CNAME example.com.
这条记录表示 www.example.com 是 example.com 的别名,TTL 值为 3600 秒。

4.MX记录
example.com. 3600 IN MX 10 mail.example.com.
这条记录表示 example.com 的邮件交换服务器是 mail.example.com,优先级为 10,TTL 值为 3600 秒

5.NS 记录(名称服务器)
example.com. 3600 IN NS ns1.example.com.
这条记录表示 example.com 的权威名称服务器是 ns1.example.com,TTL 值为 3600 秒。


6.PTR 记录(反向解析)
100.1.168.192.in-addr.arpa. 3600 IN PTR www.example.com.
这条记录表示 IP 地址 192.168.1.100 的反向解析为 www.example.com,TTL 值为 3600 秒。


7.TXT 记录(文本信息)
example.com. 3600 IN TXT "v=spf1 mx -all"
这条记录表示 example.com 的 SPF(Sender Policy Framework)记录为 "v=spf1 mx -all",TTL 值为 3600 秒


8.SRV 记录(服务定位)
_http._tcp.example.com. 3600 IN SRV 0 5 80 server.example.com.
这条记录表示 _http._tcp.example.com 的服务定位为 server.example.com,优先级为 0,权重为 5,端口号为 80,TTL 值为 3600 秒

二、实现DNS递归查询

实验拓图扑如下:

2.1 服务端

#安装相关软件
[root@dns-server ~]#apt update && apt -y install bind9 bind9-utils
#查看相关的配置文件所在目录
#配置 BIND 服务器
[root@dns-server ~]#cat /etc/bind/named.conf.default-zones
......
#添加域
zone "lyon.org" {
	type master;
	file "/etc/bind/db.lyon.org"; #指定数据库文件
};


#语法检查
[root@dns-server ~]#named-checkconf


#设置本地网络递归查询
[root@dns-server ~]#cat /etc/bind/named.conf.options
options {
	directory "/var/cache/bind";

	// If there is a firewall between you and nameservers you want
	// to talk to, you may need to fix the firewall to allow multiple
	// ports to talk.  See http://www.kb.cert.org/vuls/id/800113

	// If your ISP provided one or more IP addresses for stable 
	// nameservers, you probably want to use them as forwarders.  
	// Uncomment the following block, and insert the addresses replacing 
	// the all-0's placeholder.

	// forwarders {
	// 	0.0.0.0;
	// };

	//========================================================================
	// If BIND logs error messages about the root key being expired,
	// you will need to update your keys.  See https://www.isc.org/bind-keys
	//========================================================================
	dnssec-validation auto;

	listen-on-v6 { any; };
        recursion yes;
        allow-recursion { localnets; };
        listen-on { any; };
};
#语法检查
[root@dns-server ~]#named-checkconf /etc/bind/named.conf.options
#重启服务并查看服务是否正常运行
[root@dns-server ~]#systemctl restart named
[root@dns-server ~]#systemctl status named


#创建数据库文件
[root@dns-server ~]#cat /etc/bind/db.lyon.org
$TTL 3D
@       IN      SOA     ns1.lyon.org. hostmaster.lyon.org. (
                                         1         ; serial #版本号,更新数据时版本号也要更新
                                         604800    ; refresh #拉取数据的时间间隔
                                         86400     ; retry #同步数据失败后多长时间再执行同步操作
                                         2419200   ; expire #多次同步失败之后移除从节点的时间
                                         604800 )  ; minimum #用户查询的不存在记录的缓存期

@       IN      NS      ns1.lyon.org. # NS表示本域内谁可做域名解析,可理解为网络中有几个dns服务器
ns1     IN      A       192.168.1.170
lyon.org. IN    A       192.168.1.175
www     IN      A       192.168.1.175
注:
1."@"表示本域名,用于代替默认域名。
2.TTL值可以全局继承,所以在文件开头声明即可
3.ns1.lyon.org.表示权威DNS,只起描述作用。hostmaster.lyon.org.表示管理员邮箱。
4.此文件默认会补全域名,若是在域名字段不加“.”结尾则会默认补全,如:“lyon.org”会默认补全为“lyon.org.lyon.org”,若是加了“.”则原样输出,不会补全

#检查域文件语法
[root@dns-server ~]#named-checkzone "lyon.org" /etc/bind/db.lyon.org
zone lyon.org/IN: loaded serial 1
OK
#端口检查
[root@dns-server ~]#ss -ntlp |grep 53
LISTEN 0      10                        192.168.1.170:53           0.0.0.0:*     users:(("named",pid=152124,fd=33))                                             
LISTEN 0      10                        192.168.1.170:53           0.0.0.0:*     users:(("named",pid=152124,fd=34))                                             
LISTEN 0      10                            127.0.0.1:53           0.0.0.0:*     users:(("named",pid=152124,fd=27))                                             
LISTEN 0      10                            127.0.0.1:53           0.0.0.0:*     users:(("named",pid=152124,fd=28))                                             
LISTEN 0      4096                      127.0.0.53%lo:53           0.0.0.0:*     users:(("systemd-resolve",pid=682,fd=13))                                      
LISTEN 0      5                             127.0.0.1:953          0.0.0.0:*     users:(("named",pid=152124,fd=24))                                             
LISTEN 0      5                             127.0.0.1:953          0.0.0.0:*     users:(("named",pid=152124,fd=43))                                             
LISTEN 0      10                                [::1]:53              [::]:*     users:(("named",pid=152124,fd=38))                                             
LISTEN 0      10                                [::1]:53              [::]:*     users:(("named",pid=152124,fd=37))                                             
LISTEN 0      10       [fe80::5054:ff:fe89:6608]%eth0:53              [::]:*     users:(("named",pid=152124,fd=42))                                             
LISTEN 0      10       [fe80::5054:ff:fe89:6608]%eth0:53              [::]:*     users:(("named",pid=152124,fd=41))                                             
LISTEN 0      5                                 [::1]:953             [::]:*     users:(("named",pid=152124,fd=45))            

2.2 web端

[root@web ~]#hostname -i
192.168.1.175 fe80::5054:ff:fe80:7e2a
[root@web ~]#apt update && apt install -y nginx
#修改首页文件
[root@web html]#cat /var/www/html/index.nginx-debian.html 
hello world!!!
[root@web html]#nginx -t 
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@web html]#nginx -s reload

2.3 配置客户端

[root@dns-client ~]#hostname -i
192.168.1.176 fe80::5054:ff:fe9a:b623
[root@dns-client ~]#cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.176/24]
      gateway4: 192.168.1.1
      nameservers:
              addresses: ["192.168.1.170"] #修改此处把dns服务器指向我们自己搭建的服务器
  version: 2
#重启网络
[root@dns-client ~]#netplan apply 

#测试是否能解析出web端地址
[root@dns-client ~]#dig lyon.org

; <<>> DiG 9.16.1-Ubuntu <<>> lyon.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20975
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;lyon.org.			IN	A

;; ANSWER SECTION:
lyon.org.		6749	IN	A	192.168.1.175 #地址解析正确

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Sep 21 21:33:05 CST 2024
;; MSG SIZE  rcvd: 53
[root@dns-client ~]#host lyon.org
lyon.org has address 192.168.1.175

#分别使用ping命令和curl命令测试
[root@dns-client ~]#ping -c 1 lyon.org
PING lyon.org (192.168.1.175) 56(84) bytes of data.
64 bytes from 192.168.1.175 (192.168.1.175): icmp_seq=1 ttl=64 time=0.615 ms

--- lyon.org ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.615/0.615/0.615/0.000 ms
[root@dns-client ~]#curl lyon.org
hello world!!!
#解析成功

通过抓包命令获取DNS解析过程

#开启抓包
[root@dns-server ~]#tcpdump -i eth0 udp port 53 -nn
#客户端使用host命令解析lyon.org
[root@dns-client ~]#host lyon.org
lyon.org has address 192.168.1.175
#观察报文 可看到完成的请求和响应过程
[root@dns-server ~]#tcpdump -i eth0 udp port 53 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:57:55.140450 IP 192.168.1.176.46761 > 192.168.1.170.53: 62521+ [1au] AAAA? lyon.org. (37)
21:57:55.140666 IP 192.168.1.170.53 > 192.168.1.176.46761: 62521* 0/1/1 (88)
21:57:55.141282 IP 192.168.1.176.54577 > 192.168.1.170.53: 52479+ [1au] MX? lyon.org. (37)
21:57:55.141516 IP 192.168.1.170.53 > 192.168.1.176.54577: 52479* 0/1/1 (88)

三、搭建DNS主从同步

3.1 主节点配置

拓扑图:

1.两个DNS服务器安装bind9和相关工具
root@dns-master:~# apt update && apt install -y bind9 bind9-utils
root@dns-slave:~# apt update && apt install -y bind9 bind9-utils


2.配置主dns服务器
 2.1 添加域
root@dns-master:/etc/bind# cat named.conf.default-zones
......
zone "lyon.org" {
	type master;
	file "/etc/bind/db.lyon.org";
        allow-transfer { 192.168.1.175; }; #允许从节点同步数据
};

#配置文件语法检查
root@dns-master:/etc/bind# named-checkconf


 2.2 修改主配置文件 named.conf.options
root@dns-master:/etc/bind# cat named.conf.options
options {
	directory "/var/cache/bind";
......  #添加以下字段
	dnssec-validation auto;
        recursion yes;
        allow-recursion { localnets; };
        listen-on { any; };
	listen-on-v6 { any; };
};


 2.3 创建数据库文件
root@dns-master:/etc/bind# ls
bind.keys  db.0  db.127  db.255  db.empty  db.local  named.conf  named.conf.default-zones  named.conf.local  named.conf.options  rndc.key  zones.rfc1918

#将自带的文件复制一份以此修改
root@dns-master:/etc/bind# cat /etc/bind/db.lyon.org
;
; BIND data file for local loopback interface
;
$TTL	604800
$TTL	604800
@	IN	SOA	lyon.org. admin.lyon.org (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	lyon.org.
lyon.org.	IN	A	192.168.1.176
www     IN       A      192.168.1.176


#语法检查
root@dns-master:/etc/bind# named-checkzone "lyon.org" /etc/bind/db.lyon.org
zone lyon.org/IN: loaded serial 2
OK

 2.4 重启服务
root@dns-master:/etc/bind# rndc reload
server reload successful

#查看服务状态
root@dns-master:/etc/bind# systemctl status  named

3.2 从节点配置

1.安装bind
root@dns-slave:~# hostname -I
192.168.1.175 
root@dns-slave:~# apt update && apt install -y bind9

2.编辑配置文件
root@dns-slave:~# cat /etc/bind/named.conf.default-zones
......

zone "lyon.org" {
	type slave;
        masters { 192.168.1.171; }; # master节点的IP
	file "/etc/bind/slaves/lyon.org.slave";# 在bind9中从节点的数据文件好像是以临时文件形式存放在默认的缓存目录下的,所以这条字段可以省略。
};

3.修改主配置文件 named.conf.options
root@dns-slave:/etc/bind# cat named.conf.options 
options {
	directory "/var/cache/bind";
......#添加以下选项
	dnssec-validation auto;
        recursion yes;
        allow-recursion { localnets; };
        listen-on { any; };
	listen-on-v6 { any; };
};
#检查语法
root@dns-slave:~# cd /etc/bind/
root@dns-slave:/etc/bind# named-checkconf named.conf.default-zones


4.创建数据库文件存放目录
#若是未指定可以跳过这步
root@dns-slave:~# mkdir -p /etc/bind/slaves
root@dns-slave:~# chown root:bind /etc/bind/slaves
root@dns-slave:~# chmod 775 /etc/bind/slaves

5.重启服务并查看服务状态
root@dns-slave:/etc/bind# rndc reload
server reload successful
root@dns-slave:/etc/bind# systemctl status named

3.3 web端

1.安装nginx
root@web1:~# apt update && apt install -y nginx

2.修改首页文件
root@web1:~# echo 'hello world!!!' > /var/www/html/index.nginx-debian.html
root@web1:~# nginx -s reload

3.访问测试
root@web1:~# curl localhost
hello world!!!

3.4 客户端

1.修改网络配置文件中的DNS服务器地址
root@client:~# cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.170/24]
      gateway4: 192.168.1.1
      nameservers:
              addresses: ["192.168.1.175"] 
  version: 2
注:此处可以把DNS指向主和从节点的DNS服务器,但是此时仅指向了从节点的DNS,若是能在从节点上实现解析则说明从节点能从主节点同步数据。
2.在重新生效网络文件之前先尝试解析
root@client:~# dig lyon.org
......
;; ANSWER SECTION:
lyon.org.		587	IN	A	3.33.130.190
lyon.org.		587	IN	A	15.197.148.33
......
注:lyon.org域名此时还是解析到互联网上的公网地址

3.重新应用网络配置文件
root@client:~# netplan apply

4.再次尝试解析 留意观察解析出来的地址是否是192.168.1.176
root@client:~# dig lyon.org
......
;; ANSWER SECTION:
lyon.org.		604800	IN	A	192.168.1.176
......
root@client:~# host lyon.org
lyon.org has address 192.168.1.176

5.使用curl 命令访问ngixn
root@client:~# curl lyon.org
hello world!!!
访问成功,主从架构的DNS服务器搭建成功。

四、子域授权

DNS 子域授权是指在一个较大的 DNS 域中将一个子域的管理权限委托给另一个 DNS 服务器的过程。当一个顶级域或主域的所有者希望将一部分子域的管理职责交给另一个组织或个人时,就需要进行子域授权。这通常涉及到在父域的 DNS 区域文件中设置 NS(Name Server)记录和 SOA(Start of Authority)记录。

拓扑图:

主域:
ip:192.168.1.171 负责解析 lyon.org >>> 192.168.1.176

子域:
ip:192.168.1.175 负责解析 shop.lyon.org >>> 192.168.177

客户端:
ip:192.168.1.170

4.1 主域

1.安装bind
apt update && apt install -y bind9

2.编辑配置文件
#添加域
root@dns-master:/etc/bind# cat named.conf.default-zones
......

zone "lyon" {
	type master;
	file "/etc/bind/db.lyon.org.zone";
};

#开启递归查询
root@dns-master:/etc/bind# cat named.conf.options
options {
	directory "/var/cache/bind";
...... #添加以下几项
	dnssec-validation auto;
        recursion yes;
        allow-recursion { localnets; };
        listen-on { any; };
	listen-on-v6 { any; };
};

3.编辑数据文件
root@dns-master:/etc/bind# cat db.lyon.org
;
; BIND data file for local loopback interface
;
$TTL	604800
@	IN	SOA	lyon.org. admin.lyon.org. (
 	      2		; Serial
 	604800		; Refresh
   86400		; Retry
  2419200		; Expire
	 604800 )	; Negative Cache TTL
;
@	IN	NS	lyon.org. 
shop    IN      NS      shop.lyon.org. #shop 子域的 NS 记录后面需要加一个点(.)来表示它是 lyon.org 下的一个子域。
shop.lyon.org.  IN      A       192.168.1.175
lyon.org.	IN	A	192.168.1.176
www     IN       A      192.168.1.176

4.语法检查并重新加载配置
named-checkconf
named-checkzone "lyon.org" db.lyon.org
rndc reload

4.2 子域

1.安装bind
apt update && apt install -y bind9

2.编辑配置文件
root@dns02:/etc/bind# cat named.conf.default-zones 
......
zone "shop.lyon.org" {
	type master;
	file "/etc/bind/db.shop.lyon.org";
};
root@dns02:/etc/bind# cat named.conf.options 
options {
	directory "/var/cache/bind";
......#添加以下项
	dnssec-validation auto;
        recursion yes;
        allow-recursion { localnets; };
        listen-on { any; };
	listen-on-v6 { any; };
        allow-transfer { none;};
};

3.编辑数据文件
root@dns02:/etc/bind# cat db.shop.lyon.org 
;
; BIND data file for local loopback interface
;
$TTL	604800
@	IN	SOA	shop.lyon.org. admin.lyon.org. (
			      2		; Serial
			 604800		; Refresh
			  86400		; Retry
			2419200		; Expire
			 604800 )	; Negative Cache TTL
;
@	IN	NS	shop.lyon.org.
shop.lyon.org.	IN	A	192.168.1.177
www	IN	A	192.168.1.177

4.语法检查并重新加载配置
named-checkconf
named-checkzone "shop.lyon.org" db.shop.lyon.org
rndc reload

4.3 配置web

root@web1:~# apt install -y nginx
root@web1:~# cat /var/www/html/index.nginx-debian.html
lyon.org  
192.168.1.176

root@web2:~# apt install -y nginx
root@web2:~# cat /var/www/html/index.nginx-debian.html
shop.lyon.org
192.168.1.177

4.4 客户端访问

1.修改DNS指向主域
root@client:~# cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.1.170/24]
      gateway4: 192.168.1.1
      nameservers:
              addresses: ["192.168.1.171"]
  version: 2
root@client:~# netplan apply

2.尝试解析
#解析lyon.org
root@client:~# dig lyon.org

; <<>> DiG 9.16.1-Ubuntu <<>> lyon.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11843
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;lyon.org.			IN	A

;; ANSWER SECTION:
lyon.org.		604800	IN	A	192.168.1.176

#解析shop.lyon.org
root@client:~# dig shop.lyon.org

; <<>> DiG 9.16.1-Ubuntu <<>> shop.lyon.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52655
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;shop.lyon.org.			IN	A

;; ANSWER SECTION:
shop.lyon.org.		604800	IN	A	192.168.1.177

;; Query time: 991 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sun Sep 22 20:49:40 CST 2024
;; MSG SIZE  rcvd: 58

2.使用curl命令访问
root@client:~# curl lyon.org
lyon.org  
192.168.1.176

root@client:~# curl shop.lyon.org
shop.lyon.org
192.168.1.177

发表在 第五周作业 | 留下评论

AWK原理和用法小结

一、AWK

1.1 原理和常用选项

awk 是一种强大的文本处理工具,它提供了一种编程语言来处理文本文件中的数据。awk 能够对输入的文本数据进行模式匹配和处理,执行复杂的文本操作。

工作原理:

  1. 输入处理awk 从输入文件中读取数据,通常每行数据由空白字符分隔的字段组成。
  2. 模式匹配awk 可以根据指定的模式对输入行进行匹配。模式可以是正则表达式或条件表达式。
  3. 动作执行:当输入行与模式匹配时,awk 执行与该模式相关联的动作,如打印字段、计算总和等。
  4. 内置变量awk 提供了一些内置变量,如 NF(当前行的字段数)、NR(当前处理的记录数,通常是行号)等,用于控制处理流程。
  5. 用户定义变量:用户可以创建自己的变量来存储和操作数据。

命令和选项:

  • -f scriptfile:从指定的脚本文件中读取 awk 程序。
  • -v var=value:在 awk 程序开始之前设置变量的值。
  • -F separator:设置输入字段的分隔符,默认是空格或制表符。
  • -v FS=separator:与 -F 相同,设置输入字段的分隔符。
  • -v OFS=separator:设置输出字段的分隔符,默认与输入字段分隔符相同。
  • -v ORS=separator:设置输出记录的分隔符,默认是换行符。
  • -Fnr:不自动为输入文件的每一行编号。
  • -Fpat:设置使用 pat 作为字段分隔符。

1.2 练习

练习1:打印/etc/passwd的奇数行
[root@web1 ~]#awk 'NR % 2 == 1' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
......

练习2:打印Linux系统的"IP地址,系统版本,CPU核心,内存大小"
[root@web1 ~]#hostname -I
192.168.9.19 172.17.0.1 172.18.0.1
[root@web1 ~]#cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.6 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.6 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
[root@web1 ~]#lscpu
架构:                              x86_64
CPU 运行模式:                      32-bit, 64-bit
字节序:                            Little Endian
Address sizes:                      42 bits physical, 48 bits virtual
CPU:                                2
在线 CPU 列表:                     0,1
每个核的线程数:                    2
每个座的核数:                      1
......
[root@web1 ~]#free -h
              总计         已用        空闲      共享    缓冲/缓存    可用
内存:       1.7Gi       432Mi       114Mi       2.0Mi       1.2Gi       1.1Gi
交换:          0B          0B          0B
#或者使用top命令查看
[root@web1 ~]#cat -n /etc/hosts
     1	127.0.0.1	localhost
     2	
     3	# The following lines are desirable for IPv6 capable hosts
     4	::1	localhost	ip6-localhost	ip6-loopback
     5	ff02::1	ip6-allnodes
     6	ff02::2	ip6-allrouters
     7	127.0.1.1	localhost.vm	localhost
     8	127.0.1.1	hcss-ecs-89f4	hcss-ecs-89f4

练习3:统计某个文件夹下的文件占用的字符数
[root@web1 ~]#find /etc/ -type f -exec cat {} + | wc -m
2270257
#查找etc下的所有文件,并执行cat命令然后统计字符数
发表在 第五周作业 | 留下评论

系统启动流程和Linux内核相关知识

一、rocky启动流程

1. 加载BIOS的硬件信息,获取第一个启动设备
2. 读取第一个启动设备MBR的引导加载程序(grub)的启动信息
3. 加载核心操作系统的核心信息,核心开始解压缩,并尝试驱动所有的硬件设备
4. 核心执行init程序,并获取默认的运行信息
5. init程序执行/etc/rc.d/rc.sysinit文件,重新挂载根文件系统
6. 启动核心的外挂模块
7. init执行运行的各个批处理文件(scripts)
8. init执行/etc/rc.d/rc.local
9. 执行/bin/login程序,等待用户登录
10. 登录之后开始以Shell控制主机

二、grub 工作流程

GRUB(GRand Unified Bootloader)是一个开源的启动加载程序,广泛用于Linux和Unix系统。它支持多操作系统启动,并允许用户在计算机启动时选择不同的操作系统或内核。GRUB的启动流程大致如下:

  1. BIOS/UEFI启动:计算机启动时,BIOS或UEFI进行硬件自检,然后查找启动设备(如硬盘、USB、CD-ROM等)。
  2. 加载GRUB第一阶段(Stage 1):BIOS/UEFI从启动设备的主引导记录(MBR)或EFI分区加载GRUB的第一阶段代码。
  3. 加载GRUB第一阶段1.5(Stage 1.5):如果需要,第一阶段代码会加载1.5阶段的代码,这个阶段包含了文件系统驱动,用于访问存储GRUB第二阶段的文件系统。
  4. 加载GRUB第二阶段(Stage 2):第一阶段或1.5阶段代码加载完整的GRUB第二阶段,它包含了GRUB的用户界面、配置文件解析和内核加载等功能。
  5. 显示GRUB菜单:GRUB显示启动菜单,用户可以选择要启动的操作系统或内核。
  6. 加载内核和initramfs:用户选择操作系统后,GRUB加载选定的内核和初始化内存盘(initrd或initramfs)。
  7. 启动操作系统:GRUB将控制权交给内核,内核开始初始化系统,包括挂载根文件系统、启动用户空间进程等。

GRUB的配置文件通常位于/boot/grub/grub.cfg(GRUB 2)或/boot/grub/menu.lst(GRUB Legacy),包含了启动项的配置信息。在启动过程中,如果遇到问题,可以通过编辑配置文件或使用GRUB命令行接口进行故障排除。

如果在启动过程中遇到GRUB相关的问题,可以通过以下方法进行修复:

  • 使用GRUB命令行接口进行手动引导启动。
  • 使用grub-install命令重新安装GRUB。
  • 通过救援模式或使用安装介质修复GRUB配置文件。

三、内核设计流派

操作系统的内核设计主要分为两大流派:单内核(Monolithic Kernel)和微内核(Microkernel)。这两种设计流派有各自的特点和优势。

  1. 单内核设计
    • 所有功能集成在同一个程序中,例如Linux内核。
    • 因为功能紧密集成,通常具有较高的性能。
    • 由于内核功能集中,可能带来更大的安全风险,因为一个漏洞可能影响整个系统。
    • 例子:Linux虽然采用单内核设计,但引入了模块化机制,允许动态加载和卸载模块,提高了灵活性。
  2. 微内核设计
    • 每种功能使用一个单独的子系统实现,内核只提供最基本的服务,例如进程调度、内存管理等。
    • 由于功能分散,系统的可扩展性和可维护性较好。
    • 通常具有较好的安全性,因为每个服务运行在隔离的环境中。
    • 例子:Windows、Solaris等操作系统采用微内核设计。

Linux内核虽然是基于单内核设计的,但它通过模块化设计借鉴了微内核的优点,提供了高度的灵活性和可扩展性。内核模块(.ko)可以动态加载和卸载,例如文件系统、硬件驱动、网络协议等。此外,Linux内核还包括内核核心、内核模块和辅助文件系统(如initramfs)等组成部分,其中内核核心文件通常位于/boot目录,而内核模块则放置于/lib/modules/VERSION-release/目录下。

内核的主要功能包括进程管理、内存管理、网络管理、驱动程序、文件系统和安全功能。Linux内核的设计和实现对于计算机系统的稳定性和性能至关重要,它通过有效的进程管理、内存管理和文件系统等机制来提高系统的整体性能

四、systemd

4.1 systemd 服务配置文件

systemd 是现代 Linux 系统中初始化系统和服务管理器的常用实现。它允许管理员启动、停止和重启守护进程(服务),还可以控制服务的启动顺序和依赖关系。systemd 服务配置文件通常以 .service 结尾,并且存储在 /etc/systemd/system//lib/systemd/system/ 目录下。

一个基本的 systemd 服务配置文件包含以下部分:

  1. [Unit] 部分
    • Description:服务的简短描述。
    • Documentation:提供关于服务的更多文档的链接。
    • Requires:服务启动前必须启动的其他服务。
    • Wants:建议在启动此服务之前启动的服务,但不是必须的。
    • After:指定服务启动的顺序,此服务将在列出的服务之后启动。
  2. [Service] 部分
    • Type:服务的类型(如 simple、forking、oneshot、dbus、notify)。
    • ExecStart:启动服务时执行的命令或脚本。
    • ExecStop:停止服务时执行的命令或脚本。
    • Restart:服务失败时的重启策略(如 always、on-success、on-failure)。
    • User:运行服务的用户。
    • Group:运行服务的用户组。
    • WorkingDirectory:服务的工作目录。
    • Environment:设置环境变量。
    • PIDFile:服务的进程 ID 文件路径。
  3. [Install] 部分
    • WantedBy:指定默认启动时要启用的服务,通常是 multi-user.target 或 graphical.target
    • Alias:为服务设置别名。
[Unit]
Description=My Custom Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/my-service-start.sh
ExecStop=/usr/local/bin/my-service-stop.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target

4.2 systemd 启动流程

在基于 systemd 的 Linux 系统中,启动流程是一系列有序的初始化步骤,旨在将系统从初始引导状态带到完全运行的用户空间环境。以下是 systemd 启动流程的总结:

  1. BIOS/UEFI 引导
    • 计算机启动时,BIOS/UEFI 执行硬件自检。
    • 然后加载引导加载程序(如 GRUB)。
  2. 内核加载
    • 引导加载程序加载 Linux 内核到内存。
  3. 初始化 RAM 磁盘 (initrd)
    • 如果需要,内核加载 initrd,它包含一些临时文件系统和驱动程序。
  4. 内核初始化
    • 内核进行初始化,包括设置硬件、内存管理、启动内核线程等。
  5. 用户空间初始化
    • 内核启动 systemd 作为第一个用户空间进程(PID 1)。
  6. systemd 启动
    • systemd 读取 /etc/systemd/system 和 /lib/systemd/system 目录下的配置文件。
    • systemd 开始执行 /etc/systemd/system/*.wants/ 和 /lib/systemd/system/*.wants/ 目录中列出的服务。
  7. 目标(Target)单元
    • systemd 根据配置启动目标单元,例如 multi-user.target 或 graphical.target
    • 这些目标单元定义了一组服务和资源,它们共同定义了系统的运行级别。
  8. 服务启动
    • systemd 根据依赖关系和服务单元文件启动必要的服务。
    • 服务可以是简单的后台程序、网络服务、硬件驱动等。
  9. 套件初始化
    • systemd 启动套件初始化服务,如 NetworkManagersshd 等。
  10. 用户登录
    • systemd 启动显示管理器(如果配置了图形目标)或终端服务(如果配置了多用户目标)。
    • 用户可以登录系统。
  11. 启动完成
    • 所有必要的服务都已启动,系统完全运行。

在整个启动过程中,systemd 利用 cgroups(控制组)和 D-Bus 消息总线来管理服务和进程。systemd 的日志可以通过 journalctl 命令查看,这对于调试启动问题非常有用。

值得注意的是,systemd 支持并发启动服务,这可以显著加快启动时间。此外,systemd 提供了强大的依赖管理和服务监控功能,确保系统的稳定性和可靠性。

发表在 Linux基础, 第五周作业 | 留下评论

进程管理

一、解析进程和线程的区别? 解析进程的结构。

进程与线程的区别:

  1. 定义
    • 进程:进程是操作系统进行资源分配和调度的基本单位。它是正在执行的程序的实例,拥有独立的地址空间和系统资源。
    • 线程:线程是进程中的一个实体,是CPU调度和执行的基本单位。线程自身不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源。
  2. 资源拥有
    • 进程拥有独立的内存地址空间,每个进程都有自己独立的代码段、数据段和堆栈。
    • 线程共享进程的内存地址空间,多个线程共享代码段、数据段和堆栈。
  3. 创建开销
    • 创建进程的开销比创建线程大,因为进程需要独立的内存空间和系统资源。
    • 创建线程的开销较小,因为线程共享进程的资源,不需要额外的内存空间。
  4. 通信方式
    • 进程间通信(IPC)需要特定的机制,如管道、信号、消息队列等。
    • 线程间通信可以直接通过读写进程数据段(如全局变量)来实现,因为它们共享相同的内存地址空间。
  5. 独立性
    • 进程间相互独立,一个进程的崩溃不会直接影响到其他进程。
    • 线程间高度依赖,一个线程的崩溃可能会影响到整个进程。
  6. 上下文切换
    • 进程上下文切换开销大,因为涉及到虚拟地址空间的切换。
    • 线程上下文切换开销小,因为它们共享相同的地址空间。

进程的结构:

进程通常由以下几个部分组成:

  1. 进程控制块(PCB):是操作系统管理进程的重要数据结构,包含了进程的基本信息,如进程状态、优先级、程序计数器、寄存器集合、进程ID、内存管理信息等。
  2. 代码段:包含进程执行的指令。
  3. 数据段:包含进程执行时使用的数据,包括全局变量和静态变量。
  4. 堆栈:用于存储局部变量、函数参数、返回地址等信息。
  5. :用于动态内存分配,如使用mallocnew分配的内存。
  6. 文件描述符:进程打开的文件列表,用于文件操作。
  7. 信号处理:进程对信号的响应方式。
  8. 环境变量:进程运行时的环境设置。
  9. 线程列表:如果进程是多线程的,这里会包含所有线程的信息。
  10. 其他资源:如信号量、共享内存等同步和通信机制。

二、结合进程管理命令,说明进程各种状态。

进程的状态
进程在操作系统中的典型状态包括:

  1. 新建(New):进程已被创建,但还没有开始运行。此时,进程的PCB已经建立,但还没有被调度运行。
  2. 就绪(Ready):进程已经准备好运行,等待被调度器分配CPU。它可能因为等待I/O操作或其他资源而进入就绪状态。
  3. 运行(Running):进程正在执行。在单核CPU系统中,同一时刻只有一个进程处于运行状态;在多核系统中,可以有多个进程同时运行。
  4. 等待(Waiting):又称阻塞状态,进程正在等待某个事件的发生,如等待I/O操作完成、等待信号量等。在等待状态下,进程不会占用CPU资源。
  5. 终止(Terminated):进程已经完成其任务或由于某种原因被终止。在终止状态下,操作系统将释放进程所占用的资源。
  6. 挂起(Suspended):进程被暂时挂起,不参与调度。挂起状态可以进一步分为两种:
    • 阻塞挂起(Blocked Suspended):进程在等待某个事件的同时被挂起。
    • 就绪挂起(Ready Suspended):进程在就绪状态下被挂起。

在Linux系统中,可以使用一些命令来查看和管理系统中的进程,这些命令可以帮助我们了解进程的状态:

  • ps:显示当前系统中的进程状态。
    • ps aux:显示所有进程的详细信息。
    • ps -l:显示更详细的进程信息。
  • top:实时显示系统中进程的动态。
    • top:启动top命令,实时显示进程信息。
  • pstree:以树状图的形式显示进程。
    • pstree:显示进程树。
  • pgrep:根据条件查找进程。
    • pgrep <name>:根据进程名查找进程。
  • pkill:根据条件杀死进程。
    • pkill <name>:根据进程名杀死进程。
  • kill:发送信号给进程。
    • kill -9 <pid>:强制杀死进程。
  • nicerenice:调整进程的优先级。
    • nice <command>:以低优先级运行命令。
    • renice <priority> <pid>:调整正在运行的进程的优先级。

三、说明IPC通信和RPC通信实现的方式。

IPC(进程间通信)和RPC(远程过程调用)是两种不同的通信机制,它们允许不同的进程或系统之间进行数据交换和通信。以下是它们各自的实现方式:

IPC通信的实现方式:

  1. 管道(Pipe)
    • 匿名管道:最简单的IPC形式,用于有亲缘关系的进程间的通信。
    • 命名管道(FIFO):允许不相关的进程间的通信。
  2. 消息队列
    • 消息队列允许一个或多个进程向它写入或读取消息。
  3. 信号(Signal)
    • 信号是一种软件中断,用于通知进程某个事件已经发生。
  4. 共享内存
    • 允许多个进程共享一个给定的存储区,是最快的一种IPC。
  5. 信号量(Semaphore)
    • 信号量用于控制多个进程对共享资源的访问。
  6. 套接字(Socket)
    • 套接字是一种通信机制,允许不同主机上的进程进行通信。
  7. 共享文件系统
    • 进程可以通过读写文件系统中的文件来交换信息。
  8. 内存映射文件
    • 通过将文件映射到内存中,多个进程可以共享内存区域。

RPC通信的实现方式:

  1. 客户端-服务器模型
    • RPC通信通常采用客户端-服务器模型,客户端发送请求,服务器处理请求并返回结果。
  2. 远程过程调用协议
    • 定义了RPC通信的协议,包括参数的编码、传输和解码。
  3. 数据序列化
    • 客户端需要将调用参数序列化(如转换成字节流),通过网络发送给服务器。
  4. 网络传输
    • 使用TCP/IP或其他网络协议来传输序列化后的数据。
  5. 服务端处理
    • 服务器接收到请求后,反序列化参数,调用相应的本地过程,并处理请求。
  6. 结果返回
    • 服务器将结果序列化后通过网络发送回客户端。
  7. 客户端接收
    • 客户端接收到结果,反序列化并使用结果。
  8. 动态绑定
    • RPC允许客户端在不知道服务端接口的情况下调用远程过程。
  9. 错误处理
    • RPC机制需要处理网络错误、数据序列化错误等。
  10. 安全机制
    • 包括认证、授权、数据加密等,以确保通信的安全性。

实现示例:

  • IPC示例:在Linux系统中,可以使用shmgetshmat系统调用来创建和访问共享内存。
  • RPC示例:使用gRPC框架,客户端和服务器可以通过protobuf定义服务接口,然后使用gRPC工具生成客户端和服务器端的代码,实现RPC通信。

IPC和RPC都是进程间通信的重要方式,但它们的主要区别在于IPC通常用于同一系统内的不同进程间通信,而RPC则用于不同系统或网络中的进程间通信。

四、总结Linux,前台和后台作业的区别,并说明如何在前台和后台中进行状态转换。

前台作业与后台作业的区别:

  1. 前台作业(Foreground Job)
    • 前台作业与终端直接交互,可以接收用户的输入并显示输出。
    • 终端被前台作业独占,直到作业完成或被暂停。
    • 可以通过Ctrl + C来中断前台作业。
  2. 后台作业(Background Job)
    • 后台作业不与终端直接交互,它们在后台运行,不会阻塞用户在终端进行其他操作。
    • 后台作业的输出通常会被重定向到文件或终端,以避免与其他命令的输出冲突。
    • 可以通过jobs命令查看后台作业的状态。

状态转换:

  1. 从前台转到后台
    • 使用Ctrl + Z可以将当前前台作业挂起到后台,挂起的作业会被暂停。
    • 然后使用bg命令将挂起的作业放到后台继续运行。
  2. 从后台转到前台
    • 使用fg命令可以将后台作业调回到前台运行。
    • 如果有多个后台作业,可以使用fg %job_number来指定将哪个作业调回前台。
  3. 将后台作业暂停
    • 后台作业可以通过kill命令发送SIGSTOP信号来暂停,例如kill -STOP %job_number
  4. 将暂停的后台作业恢复
    • 使用bg命令可以将暂停的后台作业恢复到后台继续运行。

示例:

假设你正在运行一个长时间运行的命令,如top,并且想要将其放到后台运行:

[root@rocky8 ~]#top
top - 16:29:59 up  2:20,  2 users,  load average: 0.00, 0.00, 0.00
Tasks: 151 total,   1 running, 150 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1945.4 total,   1420.2 free,    206.0 used,    319.2 buff/cache
......
在top运行时,按下Ctrl + Z将其挂起:
[1]+  Stopped                 top
[root@rocky8 ~]#
#然后使用bg命令将其放到后台运行
[root@rocky8 ~]#bg
[1]+ top &
#现在top命令在后台运行。如果你想将其调回前台,可以使用fg命令
fg

五、定时任务

实现定时任务,每日凌晨1点,删除指定文件

[root@rocky8 ~]#which rm
alias rm='rm -i'
	/usr/bin/rm
#创建文件
[root@rocky8 ~]#touch test.txt

#编辑计划任务
[root@rocky8 ~]#crontab -e
crontab: installing new crontab
[root@rocky8 ~]#crontab -l
0 1 * * * /usr/bin/rm -rf /root/test.txt >/dev/null 2>&1

实现定时任务每月月初对指定文件进行压缩

#创建任务每月1号对test1.txt文件进行压缩
[root@rocky8 ~]#touch test1.txt

[root@rocky8 ~]#which tar
/usr/bin/tar

#创建计划任务
[root@rocky8 ~]#crontab -e
crontab: installing new crontab
[root@rocky8 ~]#crontab -l
0 0 1 * * /usr/bin/tar -czf /root/test1/txt 
发表在 第四周作业 | 留下评论

shell脚本进阶

一、探测同网段哪些ip正在被使用

[root@rocky8 ~]#cat ping.sh 
#!/bin/bash
#**********************************************************
#Author:                    liangweisong
#QQ:                        965291014@qq.com
#Date:                      2024-08-31
#FileName:                  ping.sh
#URL:                       
#Description:                   The test script
#**********************************************************
NET=10.0.0
#NET为所处网段的前24位十进制地址
for i in  {1..254};do
{
 ping  -c1  -W1 $NET.$i &> /dev/null && echo $NET.$i is up| tee -a ./up_list.txt || echo $NET.$i is down
}&
done
wait
#创建文件
[root@rocky8 ~]#touch up_list.txt
#执行脚本
[root@rocky8 ~]#bash ping.sh
10.0.0.1 is up
10.0.0.2 is up
10.0.0.210 is up
10.0.0.153 is up
10.0.0.3 is down
......
[root@rocky8 ~]#cat up_list.txt
10.0.0.1 is up
10.0.0.2 is up
10.0.0.210 is up
10.0.0.153 is up

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

while 循环的特殊用法,遍历文件或文本的每一行

while read line; do
循环体
done < /PATH/FROM/SOMEFILE
[root@rocky8 ~]#cat wrl.sh
#!/bin/bash
#**********************************************************
#Author:                    liangweisong
#QQ:                        965291014@qq.com
#Date:                      2024-08-31
#FileName:                  wrl.sh
#URL:                       
#Description: 使用while read line和/etc/passwd,计算用户id总和。
#**********************************************************
# 初始化 UID 总和为 0
uid_sum=0

# 逐行读取 /etc/passwd 文件
while IFS=: read -r username password uid gid fullname home_directory shell; do
    # 将 UID 转换为整数并累加到总和中
    uid_sum=$((uid_sum + uid))
done < /etc/passwd

# 打印 UID 总和
echo "The sum of all user IDs is: $uid_sum"
[root@rocky8 ~]#bash wrl.sh
The sum of all user IDs is: 72071

三、总结索引数组和关联数组,字符串处理,高级变量使用及示例。

3.1 索引数组

索引数组是一种基于数字索引的数组。每个元素都有一个唯一的整数索引。

创建索引数组

# 创建一个空数组
indexed_array=()

# 添加元素
indexed_array+=(element1 element2 element3)

# 或者
indexed_array[0]="element1"
indexed_array[1]="element2"
indexed_array[2]="element3"

访问数组元素

# 访问第一个元素
first_element=${indexed_array[0]}

# 访问最后一个元素
last_element=${indexed_array[-1]}

# 遍历数组
for element in "${indexed_array[@]}"; do
    echo "$element"
done

3.2 关联数组

关联数组是一种基于键值对的数组。每个元素都有一个唯一的键(字符串)和对应的值。

创建关联数组

# 创建一个空关联数组
declare -A assoc_array

# 添加元素
assoc_array[key1]="value1"
assoc_array[key2]="value2"
assoc_array[key3]="value3"

访问关联数组元素

# 访问键为 key1 的元素
value1=${assoc_array[key1]}

# 遍历关联数组
for key in "${!assoc_array[@]}"; do
    value=${assoc_array[$key]}
    echo "$key: $value"
done

1.3 字符串处理

字符串拼接

string1="Hello"
string2="World"
full_string="$string1 $string2"

字符串替换

string="Hello World"
new_string="${string//World/Universe}"
echo "$new_string"  # 输出 "Hello Universe"

字符串分割

string="apple,banana,orange"
IFS=',' read -ra fruits <<< "$string"
for fruit in "${fruits[@]}"; do
    echo "$fruit"
done

字符串长度

string="Hello World"
length=${#string}
echo "$length"  # 输出 11

四、求10个随机数的最大值与最小值。

[root@rocky8 ~]#cat random.sh 
#!/bin/bash
#**********************************************************
#Author:                    liangweisong
#QQ:                        965291014@qq.com
#Date:                      2024-08-31
#FileName:                  random.sh
#URL:                       
#Description: 求10个随机数的最大值与最小值。
#**********************************************************
# 初始化最大值和最小值变量
max=-999999
min=999999

# 循环10次来生成10个随机数
for i in {1..10}
do
    # 生成1到100之间的随机数
    num=$(( (RANDOM % 100) + 1 ))

    # 打印生成的随机数
    echo "随机数 $i: $num"

    # 更新最大值和最小值
    if [ "$num" -gt "$max" ]; then
        max="$num"
    fi
    if [ "$num" -lt "$min" ]; then
        min="$num"
    fi
done

# 输出最大值和最小值
echo "最大值: $max"
echo "最小值: $min"
[root@rocky8 ~]#bash random.sh 
随机数 1: 87
随机数 2: 7
随机数 3: 100
随机数 4: 48
随机数 5: 12
随机数 6: 17
随机数 7: 2
随机数 8: 98
随机数 9: 50
随机数 10: 33
最大值: 100
最小值: 2

五、使用递归调用,完成阶乘算法实现。

[root@rocky8 ~]#cat factorial.sh
#!/bin/bash
#**********************************************************
#Author:                    liangweisong
#QQ:                        965291014@qq.com
#Date:                      2024-08-31
#FileName:                  test.sh
#URL:                       
#Description:                   The test script
#**********************************************************
# 阶乘函数
factorial() {
    local n=$1
    # 基本情况
    if [ "$n" -eq 0 ]; then
        echo 1
    else
        # 递归调用
        echo $(( n * $(factorial $((n - 1))) ))
    fi
}

# 测试阶乘函数
number=9
result=$(factorial $number)
echo "$number 的阶乘是 $result"

发表在 第四周作业 | 留下评论

网络基础

一、修改IP地址信息命令

1.1 ip 命令

ip 命令可以临时修改网络环境,主要用法有:查看IP地址、禁用启用网卡、添加IP地址、修改路由表等功能。但是所有的修改操作都是临时生效,若是重启主机,所有的修改将会失效,若是想永久生效ip命令的修改配置,可以把命令写入rc.local文件内,在rc.local文件权限足够的情况下,实现开机自动加载该命令。

[root@rocky8 ~]#find / -name  rc.local
/etc/rc.local
/etc/rc.d/rc.local

ip命令详细用法参考man文档

[root@rocky8 ~]#man ip
......
EXAMPLES
       ip addr
           Shows addresses assigned to all network interfaces.

       ip neigh
           Shows the current neighbour table in kernel.

       ip link set x up
           Bring up interface x.

       ip link set x down
           Bring down interface x.

       ip route
           Show table routes.
......

1.1.1 ip 命令常用用法

1.查看ip地址信息
[root@rocky8 ~]#ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:21:19:21 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.210/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe21:1921/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:21:19:2b brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.210/24 brd 192.168.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe21:192b/64 scope link 
       valid_lft forever preferred_lft forever

2.临时关闭或启用网卡
#关闭网卡
[root@rocky8 ~]#ip link set eth1 down
[root@rocky8 ~]#ip link show|grep eth1
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
#启用网卡
[root@rocky8 ~]#ip link set eth1 up
[root@rocky8 ~]#ip link show |grep eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000

3.添加ip地址
#给eth1网卡添加ip地址:192.168.1.100
[root@rocky8 ~]#ip addr add 192.168.1.100/24 dev eth1
[root@rocky8 ~]#ip a |grep eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.210/24 brd 192.168.1.255 scope global noprefixroute eth1
    inet 192.168.1.100/24 scope global secondary eth1

4.删除添加的ip地址
[root@rocky8 ~]#ip addr del 192.168.1.100/24 dev eth1
[root@rocky8 ~]#ip a |grep eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.210/24 brd 192.168.1.255 scope global noprefixroute eth1

5.设置网关
ip route add default via 192.168.1.1

6.查看和添加路由规则
#查看路由规则
[root@rocky8 ~]#ip route show
#添加规则
[root@rocky8 ~]#ip route add 规则

1.2 nmcli 命令

nmcli(NetworkManager Command Line Interface)是一个命令行工具,用于控制和管理 NetworkManager,后者是 Linux 系统中用于管理网络连接的一个守护进程。nmcli 提供了一个方便的方式来查询、配置和管理网络连接,而无需使用图形界面。和ip命令不同的是nmcli的修改结果是永久生效的。

nmcli命令常用用法:

  1. 列出网络连接:查看系统中存在的网络连接。
  2. 创建新的网络连接:手动配置网络接口。
  3. 修改现有网络连接:更改网络接口的配置。
  4. 删除网络连接:移除不再需要的网络连接。
  5. 启动或停止网络连接:激活或去激活网络连接。
  6. 查询网络状态:获取有关网络连接的信息。
[root@rocky8 ~]#man nmcli
.....
EXAMPLES
       This section presents various examples of nmcli usage. If you want even more, please refer to nmcli-examples(7) manual page.

       nmcli -t -f RUNNING general
           tells you whether NetworkManager is running or not.

       nmcli -t -f STATE general
           shows the overall status of NetworkManager.

       nmcli radio wifi off
           switches Wi-Fi off.

       nmcli connection show
           lists all connections NetworkManager has.

       nmcli -p -m multiline -f all con show
           shows all configured connections in multi-line mode.

       nmcli connection show --active
           lists all currently active connections.

       nmcli -f name,autoconnect c s
           shows all connection profile names and their auto-connect property.
......

1.2.1 nmcli 命令常用用法

1.查看网络连接 网卡和网络配置文件的对应关系
[root@rocky8 ~]#nmcli con show
NAME      UUID                                  TYPE      DEVICE 
con-eth0  5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03  ethernet  eth0   
con-eth1  9c92fad9-6ecb-3e6c-eb4d-8a47c6f50c04  ethernet  eth1

2.修改现有的网络连接信息
#修改网卡eth1的地址为:192.168.1.100/24 网关:192.168.1.1 dns:8.8.8.8 con-eth1为eth1所对应的网卡信息文件
[root@rocky8 ~]#nmcli con modify con-eth1 ipv4.addresses 192.168.1.100/24 ipv4.dns 8.8.8.8 ipv4.gateway 192.168.1.1  
#更新配置信息
[root@rocky8 ~]#nmcli con up con-eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
#查看eth1的ip信息
[root@rocky8 ~]#ip a |grep eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute eth1

3. 给网卡eth1 添加ip地址
#con-name 表示配置信息文件名 ifname后面接应用的网卡名 ipv4.method manual表示为手动配置的ip地址
[root@rocky8 ~]#nmcli con add con-name static ifname eth1 ipv4.addresses 192.168.1.101/24 ipv4.dns 8.8.8.8 ipv4.gateway 192.168.1.1 ipv4.method manual
#激活配置
[root@rocky8 ~]#nmcli con up static

1.3 修改网络配置文件

使用vim修改网络配置文件的形式配置主机的ip的地址对于不同发行版的Linux系统略微有所不同,Debian系列使用的是yaml格式的文件作为网络配置文件,Redhat系列的则不是该文件类型,而且二者的文件路径也有所不同。

1.3.1 Redhat系列

以rocky8为例

#网络配置文件所在路径,该目录下每一个文件对应一个网卡的配置信息
[root@rocky8 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth
ifcfg-eth0  ifcfg-eth1
[root@rocky8 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=con-eth0 #配置文件名字
DEVICE=eth0 #网卡名字
BOOTPROTO=static #获取ip地址的方式,自动获取则改为DHCP模式,手动配置则为static
IPADDR=10.0.0.210 #IP地址
PREFIX=24 #掩码
GATEWAY=10.0.0.2 #网关地址
DNS1=10.0.0.2 #DNS服务器地址,可以配置多个
DNS2=8.8.8.8
DNS3=180.76.76.76
ONBOOT=yes #是否开机启动该网卡
:wq
#保存信息退出vim
#重新载入网络配置信息
[root@rocky8 ~]#nmcli connection reload 
#启用配置信息 留意反馈的信息是否应用成功
[root@rocky8 ~]#nmcli connection up con-eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)

以上的配置项是基础网络配置选项,只要配置正确且符合当前局域网网络要求则可实现主机访问外网,除了以上选项之外还可配置其他的选项以实现对网络的更精细化配置,其他选项如下:

设置说明
TYPE接口类型;常见有的Ethernet, Bridge
NAME此配置文件应用到的设备
DEVICE设备名
HWADDR对应的设备的MAC地址
UUID设备的惟一标识
BOOTPROTO激活此设备时使用的地址配置协议,常用的dhcp, static, none, bootp
IPADDR指明IP地址
NETMASK子网掩码,如:255.255.255.0
PREFIX网络ID的位数, 如:24
GATEWAY默认网关
DNS1第一个DNS服务器地址
DNS2第二个DNS服务器地址
DOMAIN主机不完整时,自动搜索的域名后缀
ONBOOT在系统引导时是否激活此设备
USERCTL普通用户是否可控制此设备
PEERDNS如果BOOTPROTO的值为“dhcp”,YES将允许dhcp server分配的dns服务
器信息直接覆盖至/etc/resolv.conf文件,NO不允许修改resolv.conf
NM_CONTROLLEDNM是NetworkManager的简写,此网卡是否接受NM控制

1.3.2 Debin系列

以ubuntu2004为例说明

#文件地址在/etc/netplan/00-installer-config.yaml 可在一个文件内配置多个网卡地址信息,该文件使用yaml格式文件,需要严格注意缩进
[root@ubuntu2004 ~]#cat /etc/netplan/00-installer-config.yaml 
# This is the network config written by 'subiquity'
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no #不使用DHCP方式获取IPv4格式地址下同
      dhcp6: no
      addresses: [10.0.0.153/24] #eth0的网卡ip地址和掩码
      gateway4: 10.0.0.2 #eth0的网关
      nameservers: #eth0的DNS服务器可配置多个
        addresses: [8.8.8.8]
#以下是eth1网卡的配置信息,配置格式同上
    eth1:
      dhcp4: no
      dhcp6: no
 #     addresses: [192.168.1.153/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8]
:wq
#修改完成保存退出vim

#使配置生效
[root@ubuntu2004 ~]#netplan apply

1.4 确认连通外网

安装在VMware中的虚拟机若想要实现连接互联网,配置ip地址信息之后还要确保配置的IP地址信息符合VMware中的虚拟网卡的要求。如该处定义的vmnet8配置的DHCP网段是10.0.0.x/24虚拟机内配的网段要符合这里的要求。

在VMware中打开网络编辑器

确定该界面的设置和自己配置的网络信息一致,若是不一致可以点击“更改设置”

确定虚拟机配置的虚拟网卡是该网卡

检查网络连通性

[root@ubuntu2004 ~]#ping www.baidu.com
PING baidu.com (110.242.68.66) 56(84) bytes of data.
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=62.2 ms
64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=61.6 ms
......
[root@rocky8 ~]#ping www.baidu.com
PING www.a.shifen.com (183.240.98.198) 56(84) bytes of data.
64 bytes from 183.240.98.198 (183.240.98.198): icmp_seq=1 ttl=128 time=14.4 ms
64 bytes from 183.240.98.198 (183.240.98.198): icmp_seq=2 ttl=128 time=13.10 ms
......

二、bond0配置

以rocky8为例,现有网卡eth0和eth1,创建bond0其ip地址为10.0.0.210/24

编辑bond0配置文件

[root@rocky8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-bond0
NAME=bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=10.0.0.210
PREFIX=24
GATEWAY=10.0.0.2
DNS1=10.0.0.2
DNS2=8.8.8.8
DNS3=180.76.76.76
ONBOOT=yes
TYPE=Bond
BONDING_OPTS="mode=active-backup miimon=100"
#配置信息解释
NAME=bond0:指定 Bonding 接口的名称。
DEVICE=bond0:指定设备名称。
BOOTPROTO=static:使用静态 IP 配置。
IPADDR=10.0.0.210:指定静态 IP 地址。
PREFIX=24:指定子网掩码。
GATEWAY=10.0.0.2:指定默认网关。
DNS1=10.0.0.2:指定首选 DNS 服务器。
DNS2=8.8.8.8:指定备用 DNS 服务器。
DNS3=180.76.76.76:指定第三个 DNS 服务器。
ONBOOT=yes:在启动时激活接口。
TYPE=Bond:指定设备类型为 Bonding。
BONDING_OPTS="mode=active-backup miimon=100":指定 Bonding 模式为主备模式,并设置链路检测间隔为 100 毫秒。

编辑网卡eth0

[root@rocky8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
NAME=con-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

编辑网卡eth1

[root@rocky8 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth1
NAME=con-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes

重新载入配置

[root@rocky8 ~]#nmcli con reload      
[root@rocky8 ~]#nmcli con up bond0 
Connection successfully activated (master waiting for slaves) (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

查看bond0网卡信息

[root@rocky8 ~]#ip a |grep bond0
4: bond0: <NO-CARRIER,BROADCAST,MULTICAST,MASTER,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    inet 10.0.0.210/24 brd 10.0.0.255 scope global noprefixroute bond0

在同局域网另外一个主机ping 测试一下网络连通性

[root@ubuntu2004 ~]#ping 10.0.0.210
PING 10.0.0.210 (10.0.0.210) 56(84) bytes of data.
64 bytes from 10.0.0.210: icmp_seq=1 ttl=64 time=0.383 ms
64 bytes from 10.0.0.210: icmp_seq=2 ttl=64 time=0.432 ms
......

发表在 第四周作业 | 留下评论

磁盘分区总结

一、磁盘术语总结

磁盘结构图

  • head:一个盘面对应一个磁头
  • track:磁盘上的数据存储区域,这些区域通常以同心圆的形式排列。
  • sector: 把磁道按照每512字节细分出扇区,每个磁道上的扇区数量可不同。
  • cylinder: 柱面是硬盘上所有磁头(磁头数等于硬盘的磁头面数)可以同时读写的磁道的集合。每个柱面包含相同数量的磁道,这些磁道在硬盘的每个面上都是对应的。

二、MBR、GPT

2.1 MBR

MBR:Master Boot Record
分区结构图:

在MBR分区中,因为在0磁道0扇区上只留了64bytes空间存储分区表信息,而一个分区的关键信息要占用16个字节来存放,所以每块硬盘只能分四个分区:3个主分区+1个拓展分区,其中拓展分区中可以分出N个逻辑分区。每个分区中最大空间不能超过2T

2.2 GPT分区

GPT:GUID(Globals Unique Identifiers) partition table

GPT分区结构分为4个区域:
GPT头
分区表
GPT分区
备份区域

GPT使用64位寻址空间,不限制分区数量,理论最大分区9.4ZB的存储空间。

三、分区文件系统命令总结

3.1 分区命令

fdisk

#使用fdisk命令对sdb硬盘分区
[root@centos7.9_105 ~]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  20G  0 disk 
#查看硬盘情况
[root@centos7.9_105 ~]# fdisk -l /dev/sdb
....
#查看相关帮助
]# fdisk  /dev/sdb
Command (m for help): m
Help:

  DOS (MBR)
   a   toggle a bootable flag
   b   edit nested BSD disklabel
   c   toggle the dos compatibility flag
  Generic
   d   delete a partition   删除一个分区
   F   list free unpartitioned space
   l   list known partition types  列出当前支持的分区种类
   n   add a new partition  添加一个新分区 相当于图形化里面的新建简单卷
   p   print the partition table 列出当前状态的所有分区
   t   change a partition type   修改分区类型
   v   verify the partition table
   i   print information about a partition
#新建分区 一个5个G的分区
[root@centos7.9_105 ~]# fdisk  /dev/sdb 
......
Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p  #选择分区类型
Partition number (1-4, default 1): 1
First sector (2048-41943039, default 2048): 
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-41943039, default 41943039): +5G #分配分区大小
Partition 1 of type Linux and of size 5 GiB is set

Command (m for help): p  #打印分区情况

Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1f2e77b5

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048    10487807     5242880   83  Linux

Command (m for help): w  #保存并退出
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
#查看分区
[root@centos7.9_105 ~]# lsblk /dev/sdb
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  20G  0 disk 
└─sdb1   8:17   0   5G  0 part 

parted

#prated命令分区和fdisk命令不同,parted命令是非交互式的
#查看分区情况
]# parted -l
....
#创建gpt分区
[root@centos7.9 ~]# parted /dev/sdc mklabel gpt
Information: You may need to update /etc/fstab.

[root@centos7.9 ~]# parted /dev/sdc print
....
Partition Table: gpt

[root@centos7.9 ~]# parted /dev/sdc mkpart primary 1 1001
Information: You may need to update /etc/fstab.

[root@centos7.9 ~]# parted /dev/sdc print
......
Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1001MB  1000MB               primary

[root@centos7.9 ~]# parted /dev/sdc mkpart primary 1002 2000

#删除分区
[root@centos7.9 ~]# parted /dev/sdc rm 2                                  
Information: You may need to update /etc/fstab.

[root@centos7.9 ~]# parted /dev/sdc print                                 
......
Number  Start   End     Size    File system  Name     Flags
 1      1049kB  1001MB  1000MB               primary

mkfs

#mkfs用于将分区格式化为文件系统
[root@centos7.9 ~]# mkfs
mkfs         mkfs.btrfs   mkfs.cramfs  mkfs.ext2    mkfs.ext3    mkfs.ext4    mkfs.minix   mkfs.xfs

#将/dev/sdb1格式化成ext2文件系统
[root@centos7.9 ~]# mkfs.ext2 /dev/sdb1 
mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
......

tune2fs

tune2fs 是一个用于调整 Linux 文件系统参数的命令行工具,特别是针对 ext2、ext3 和 ext4 文件系统。这个工具可以设置或查看文件系统的许多属性,例如块大小、检查间隔、挂载计数等。

以下是一些 tune2fs 的常用选项:

-j:启用或修改日志文件系统(如 ext3 或 ext4)的日志功能。
-c:设置文件系统的最大挂载次数。
-i:设置文件系统的挂载间隔,即两次挂载之间需要等待的时间。
-l:列出文件系统的详细信息。
-o:启用或禁用文件系统的某些特性,如用户配额、文件系统日志等。
-m:设置文件系统的预留空间百分比,用于系统进程和用户。

[root@centos7.9 ~]# tune2fs -l /dev/sdb1
tune2fs 1.42.9 (28-Dec-2013)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          dd770993-4e9c-47a7-8542-6844e62e98b9
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
......

xfs_info

fs_info 可以提供有关文件系统状态、配置和统计信息的详细信息。
以下是一些 xfs_info 的常用功能和输出示例:

文件系统状态:显示文件系统的挂载状态、是否正在使用等信息。
块大小:显示文件系统使用的块大小。
inode 数量:显示文件系统中 inode 的总数和已使用的数量。
空间使用情况:显示文件系统的空间使用情况,包括总空间、已用空间、可用空间等。
挂载选项:显示文件系统挂载时使用的选项。
文件系统特性:显示文件系统支持的特性,如延迟分配、空间预分配等。

[root@centos7.9 ~]# xfs_info /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
......

fsck

fsck 可以检测文件系统中的错误,如损坏的目录结构、丢失的文件、不一致的链接等,并尝试自动修复这些问题。
常用选项
-A:检查所有挂载的文件系统。
-R:从根文件系统开始检查,然后递归地检查所有其他文件系统。
-N:不执行实际的修复操作,只进行模拟检查。
-y:自动回答所有提示,执行修复操作。
-n:不自动回答任何提示,需要用户确认。
-v:详细模式,显示更多信息。
-f 或 --force:强制检查,即使文件系统看起来是干净的。

mount和unmount

mount
格式化之后的分区与本地文件目录挂载,使得分区可以正常使用。
常用选项
-a:挂载 /etc/fstab 中定义的所有文件系统。
-o:后面跟挂载选项,如 ro(只读)、rw(读写)、noexec(不允许执行二进制文件)等。
-t:指定文件系统的类型,如 ext4、xfs、ntfs 等。
-L:通过标签挂载设备。
-U:通过 UUID 挂载设备。
#把前面格式化的分区/dev/sdb1挂载到/nmt/data
[root@centos7.9 ~]# mkdir /mnt/data
[root@centos7.9 ~]# mount /dev/sdb1 /mnt/data/
[root@centos7.9 ~]# df -Th |grep  /mnt
/dev/sdb1               ext2      5.0G   10M  4.7G   1% /mnt/data
注:mount命令只是临时挂载,当服务器重启,挂载将会取消,想要实现永久挂载需要把挂载关系写入/etc/fstab文件中,或者把挂载命令写入rc.local文件中。

unmount
用于解除文件和分区的挂载关系

常用选项
-f:强制卸载文件系统,即使有进程正在使用该文件系统。
-n:卸载时不更新 /etc/mtab 文件(通常在卸载根文件系统时使用)。
-l:懒卸载,即在下次挂载时执行必要的清理工作,而不是立即执行。
-a:卸载所有挂载的文件系统。
#解除/dev/sdb1 /mnt/data/的挂载关系
[root@centos7.9 ~]# umount /dev/sdb1 /mnt/data/

四、raid 相关

RAID(Redundant Array of Independent Disks)是一种将多个硬盘驱动器组合成一个逻辑单元的数据存储虚拟化技术,以提高性能、可靠性或容量。以下是几种常见RAID级别的工作原理、利用率、冗余性、性能和最少硬盘数量的总结:

RAID 0

  • 工作原理:条带化,数据分散存储在两个或多个硬盘上,没有冗余。
  • 利用率:100%,所有硬盘空间都可用于存储数据。
  • 冗余性:没有冗余,单个硬盘故障会导致数据丢失。
  • 性能:读写性能高,因为数据分散在多个硬盘上并行处理。
  • 最少硬盘数量:2个。

RAID 1

  • 工作原理:镜像,数据在两个硬盘上存储两份,完全冗余。
  • 利用率:50%,只有一半的硬盘空间可用于存储数据。
  • 冗余性:高,即使一个硬盘故障,另一个硬盘仍然可以工作。
  • 性能:写入性能较低,因为数据需要同时写入两个硬盘;读取性能较高,可以同时从两个硬盘读取。
  • 最少硬盘数量:2个。

RAID 5

  • 工作原理:带奇偶校验的条带化,数据和奇偶校验信息交错存储在三个或更多的硬盘上。
  • 利用率:(n-1)/n,其中n是硬盘数量,例如,3个硬盘的利用率约为67%。
  • 冗余性:允许单个硬盘故障,奇偶校验信息用于数据恢复。
  • 性能:写入性能较低,因为需要计算奇偶校验;读取性能较高。
  • 最少硬盘数量:3个。

RAID 10 (或称 RAID 1+0)

  • 工作原理:先镜像再条带化,结合了RAID 1和RAID 0的特点。
  • 利用率:50%,因为先进行镜像,再进行条带化。
  • 冗余性:高,每个数据块都有镜像副本。
  • 性能:读写性能都高,因为数据分布在多个硬盘上并行处理。
  • 最少硬盘数量:4个(2个用于镜像,每个镜像包含2个硬盘)。

RAID 01 (或称 RAID 1+0)

  • 工作原理:先条带化再镜像,与RAID 10相反,但性能和特性相似。
  • 利用率:50%,与RAID 10相同。
  • 冗余性:高,与RAID 10相同。
  • 性能:读写性能都高,与RAID 10相同。
  • 最少硬盘数量:4个。

五、lvm

LVM(Logical Volume Manager)是一种在现代操作系统中广泛使用的高级硬盘管理工具,特别是在Linux系统中。LVM 提供了一种灵活的方式来管理磁盘空间,允许用户以逻辑卷的形式动态调整存储空间的大小,而不需要重新格式化或重新分区。

#创建pv
[root@centos7.9 ~]# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created.
#查看pv
[root@centos7.9 ~]# pvs
  PV         VG     Fmt  Attr PSize   PFree  
  /dev/sda2  centos lvm2 a--  <39.00g   4.00m
  /dev/sdc1         lvm2 ---  954.00m 954.00m

[root@centos7.9 ~]# pvdisplay /dev/sdc1
  "/dev/sdc1" is a new physical volume of "954.00 MiB"
  --- NEW Physical volume ---
  PV Name               /dev/sdc1
  VG Name               
  PV Size               954.00 MiB
  Allocatable           NO
  PE Size               0   
  Total PE              0
  Free PE               0
  Allocated PE          0
  PV UUID               x9XHzS-waFV-aWqf-BlMw-WR2v-Z7y2-GiVCu8
#移除pv
[root@centos7.9 ~]# pvremove /dev/sdc1

VG
#创建vg
[root@centos7.9 ~]# vgcreate -s 16M testvg /dev/sdc1
  Volume group "testvg" successfully created
[root@centos7.9 ~]# vgs testvg 
  VG     #PV #LV #SN Attr   VSize   VFree  
  testvg   1   0   0 wz--n- 944.00m 944.00m

#扩展vg
[root@centos7.9 ~]# vgextend testvg /dev/sdb1

  Physical volume "/dev/sdb1" successfully created.
  Volume group "testvg" successfully extended
[root@centos7.9 ~]# vgs testvg 
  VG     #PV #LV #SN Attr   VSize  VFree 
  testvg   2   0   0 wz--n- <5.91g <5.91g

lv
#创建lv
[root@centos7.9 ~]# lvcreate -l 100 -n lv1 testvg
  Logical volume "lv1" created.

[root@centos7.9 ~]# lvcreate -L 100 -n lv2 testvg
  Rounding up size to full physical extent 112.00 MiB
  Logical volume "lv2" created.
[root@centos7.9 ~]# lvcreate -l 10%free -n lv3 testvg
  Logical volume "lv3" created.
#查看lv
[root@centos7.9 ~]# lvs /dev/testvg/lv*
  LV   VG     Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv1  testvg -wi-a-----   1.56g                                                    
  lv2  testvg -wi-a----- 112.00m                                                    
  lv3  testvg -wi-a----- 432.00m        

六、程序包管理器

程序包管理器在不同发行版Linux中有所不同

6.1 Redhat

在centos、rocky等红帽系列Linux系统中使用的包管理器有rpm和yum,rpm不能自动解决安装包之间的依赖关系,yum可以自动解决包之间的依赖关系。

rpm常用用法
1. 安装软件
rpm -i 包名
2.查看包产生那些目录
rmp -ql 包名
3查看是否已安装指定的包
rpm -qa 包名

yum 常用用法
1.安装软件
yum install -y 包名
2.卸载软件 
yum remove 包名
3.查询命令来自哪个安装包
yum provides 命令名
4.列出所有安装包
yum list

6.2 Debian

在Debian系列的Linux中常用的包管理器是dkpg和apt

dpkg常用用法
1.安装文件
dpkg -i 包名
2.查看安装包产生的文件
dpkg -L 包名
3.卸载包
dpkg -r 包名
4.检查包是否安装
dpkg -l | grep 包名
5.检查软件包是否依赖其他包
dpkg -c 包名

apt常用用法
1.更新安装包信息
apt update
2.安装软件
apt install -y 包名
3.卸载软件且删除依赖
apt autoremove 包名

6.3 yum包管理器

yum包管理器是基于C/S的工作模式,分为客户端和服务端,提供下载包的一段为服务端。

示例:搭建私有仓库

服务端:

1.安装一个能提供httP服务的软件nginx或者apache都可以
[root@server ~]# yum -y install httpd
2.设置开机自启
[root@server ~]# systemctl enable --now httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
3.检查80端口是否监听中
[root@server ~]# ss -ntlp |grep 80
LISTEN     0      128         :::80                      :::*                   users:(("httpd",pid=1309,fd=4),("httpd",pid=1308,fd=4),("httpd",pid=1307,fd=4),("httpd",pid=1306,fd=4),("httpd",pid=1305,fd=4),("httpd",pid=1304,fd=4))
4.浏览器访问服务端地址或者添加域名解析访问域名看看访问是否正常
5.从网络上下载包到本地
[root@server ~]# yum install -y dnf-4.0.9.2-1.el7_6.noarch
[root@server ~]# yum install -y python3
dnf reposync --repoid=epel --download-metadata -p /var/www/html/ 
#--repoid=是从哪个仓库下载包 --d..这里是存放包的地址,会自动生成和前面下载包一致的文件夹
#在同步之前可以先使用yum repolist看看有哪些源可以用
#检查是否已下载包
[root@server ~]#cd /var/www/html/
[root@server html]#ls epel/
Packages  repodata
#Packages是安装包存放目录 repodata是元数据目录

浏览器访问界面:

服务端从网络上下载rpm包过程

客户端:

#确保客户端和服务端的网络可达可以先ping一下
[root@client ~]#ping 10.0.0.20
PING 10.0.0.20 (10.0.0.20) 56(84) bytes of data.
64 bytes from 10.0.0.20: icmp_seq=1 ttl=64 time=0.208 ms

#配置源地址
[root@client ~]#cat /etc/yum.repos.d/test.repo
[localrpm]
name=localrpm
baseurl=http://10.0.0.20/epel/ #这里的地址要是服务端的地址
gpgcheck=0
[BaseOS]
name=BaseOS
baseurl=file:///mnt/cdrom/BaseOS/
gpgcheck=0
[AppStream]
name=AppStream
baseurl=file:///mnt/cdrom/AppStream/
gpgcheck=0
#清空缓存
[root@client ~]#yum clean all
0 files removed
[root@client ~]#yum repolist
#查看私有仓库信息
[root@client ~]#yum repoinfo localrpm
localrpm 185 MB/s | 14 MB 00:00
ustc 23 MB/s | 14 MB 00:00
Last metadata expiration check: 0:00:05 ago on Sun 18 Aug 2024 11:25:35 PM CST.
Repo-id : localrpm
Repo-name : localrpm
Repo-status : enabled
Repo-revision : 1723854430
Repo-updated : Sat 17 Aug 2024 08:27:52 AM CST
Repo-pkgs : 10,217
Repo-available-pkgs: 10,213
Repo-size : 19 G
Repo-baseurl : http://10.0.0.20/epel/
Repo-expire : 172,800 second(s) (last: Sun 18 Aug 2024 11:25:29 PM CST)
Repo-filename : /etc/yum.repos.d/test.repo
#私有仓库已经搭建完成,在安装软件时指定仓库即可使用

浏览器访问:http://10.0.0.20/epel可以看到有下面两个目录

发表在 第三周作业 | 标签为 | 留下评论

shell基础

一、变量总结

通用变量

  • 以字母开头,区分大小写,可包含数字和下划线
  • 避免使用保留字段如:if、for
  • 要有实际使用意义

使用方式:$varname 或 $(varname)

环境变量

  • 通常全大写,使用下划线分隔单词,如 PATHHOME

使用方式和普通变量一致,区别在于定义时要使用export命令

位置变量

默认命令为:$1、$2、$3……$n

局部变量

命名规则与普通变量相同,但通常在函数或特定作用域内使用。

使用方式:在 shell 脚本中,使用 local 关键字声明局部变量,确保变量仅在函数内部可见,避免与全局变量冲突。

状态变量

状态变量通常为预定义的自动命名变量,如 $?$$$!

状态变量表示特定的状态信息,如上一个命令的退出状态($?)、当前进程的 PID($$)、最后一个后台进程的 PID($!)等

二、脚本示例

1.通过shell编程完成,30鸡和兔的头,80鸡和兔的脚,分别有几只鸡,几只兔?

[root@rocky8 ~]#cat check.sh 
#!/bin/bash

HEAD=$1
FOOT=$2
RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[HEAD-RABBIT]
echo RABBIT:$RABBIT
echo CHOOK:$CHOOK
[root@rocky8 ~]#bash check.sh 30 80
RABBIT:10
CHOOK:20

2.结合编程的for循环,条件测试,条件组合,完成批量创建100个用户,
1)for遍历1..100
2)先id判断是否存在
3)用户存在则说明存在,用户不存在则添加用户并说明已添加。

[root@rocky8 ~]#cat useradd.sh
#!/bin/bash
user_prefix="user"
for i in {1..100}
do
  username="${user_prefix}${i}"
  if id "$username" &>/dev/null; then
    echo "User $username already exists."
  else
    useradd "$username"
    echo "User $username has been added."
  fi
done

发表在 shell编程, 第二周作业 | 留下评论