Linux基础复习第八天
1.什么是RAID,有几种类型,其原理是什么
RAID(Redundant Array of Independent Disks,独立磁盘冗余阵列)是一种通过将多个物理磁盘组合成一个逻辑存储单元,以提升存储性能、数据可靠性或兼顾两者的技术。
其核心目标是通过数据分条、镜像和校验等技术,实现更高的读写速度、更大的存储容量以及更强的数据容错能力。
-
RAID 的常见类型及原理
RAID 根据数据分布和冗余策略划分为多个级别(Level),以下是常见的 RAID 类型及其工作原理:
-
RAID 0(条带化,Striping)
原理:
- 将数据分割为块(如 64KB),并均匀分布到所有磁盘上(即“条带化”)。
- 读写操作并行执行,利用多个磁盘的带宽提升性能。
特点:
- 无冗余:任一磁盘故障会导致数据丢失。
- 容量:总容量为所有磁盘容量之和(无冗余损耗)。
- 性能:读写速度显著提升(理论为单盘的 N 倍,N 为磁盘数量)。
适用场景:
- 高性能需求(如视频编辑、科学计算),但对数据安全性要求较低。
-
RAID 1(镜像,Mirroring)
原理:
- 数据完全复制到两个或多个磁盘(镜像)。
- 读取时可从任意磁盘读取(提升读取速度),写入时需同步更新所有镜像盘。
特点:
- 冗余:支持单盘故障(数据从镜像盘恢复)。
- 容量:总容量为单盘容量(50% 冗余损耗)。
- 性能:读取速度提升(并行读取),写入速度与单盘相同。
适用场景:
- 高数据安全性需求(如数据库、关键业务系统)。
-
RAID 5(带分布式奇偶校验的条带化)
原理:
- 数据分条存储,同时计算奇偶校验信息(通过 XOR 运算)并分散存储到所有磁盘。
- 奇偶校验用于数据恢复(支持单盘故障)。
特点:
- 冗余:支持单盘故障(通过奇偶校验重建数据)。
- 容量:总容量为 (N-1)/N(N 为磁盘数量,1 块盘用于校验)。
- 性能:读取速度快(并行读取),写入速度中等(需计算奇偶校验)。
适用场景:
- 平衡性能与成本的场景(如文件服务器、Web 服务器)。
-
RAID 6(双奇偶校验的条带化)
原理:
- 在 RAID 5 的基础上增加第二组奇偶校验(P+Q 或 DP 算法),支持双盘故障。
特点:
- 冗余:支持双盘故障(更高的容错性)。
- 容量:总容量为 (N-2)/N(N 为磁盘数量,2 块盘用于校验)。
- 性能:读取速度快,写入速度较 RAID 5 更低(需计算双校验)。
适用场景:
- 大容量存储和高容错需求(如医疗影像存储、长期归档)。
-
RAID 10(镜像+条带化,RAID 1+0)
原理:
- 先将磁盘分为若干组 RAID 1(镜像),再将这些组以 RAID 0(条带化)组合。
特点:
- 冗余:每组镜像支持单盘故障(整体支持多盘故障)。
- 容量:总容量为 50%(镜像损耗)。
- 性能:读写速度接近 RAID 0(高性能),同时具备 RAID 1 的冗余。
适用场景:
- 高性能与高可靠性的场景(如数据库主节点、虚拟化平台)。
-
RAID 50(RAID 5+0)
原理:
- 先将磁盘分为多个 RAID 5 阵列,再将这些阵列以 RAID 0(条带化)组合。
特点:
- 冗余:每个 RAID 5 阵列支持单盘故障。
- 容量:总容量为 (N×(N-1))/M(M 为 RAID 5 组数)。
- 性能:读写速度高,适合大规模数据存储。
适用场景:
- 超大规模数据中心和云存储。
-
2.什么是防火墙,Linux下有哪些防火墙
防火墙(Firewall)是一种网络安全系统,用于监控和控制进出网络的数据流量。它通过预定义的安全规则(如允许或拒绝特定IP地址、端口、协议等)来保护内部网络免受外部威胁(如未经授权的访问、恶意攻击、数据泄露等)。
防火墙的核心功能包括:
- 访问控制:基于规则允许或拒绝流量(如源地址、目的地址、端口、协议等)。
- 网络地址转换(NAT):隐藏内部网络的真实IP地址。
- 状态检测:跟踪连接状态(如TCP三次握手),防止伪造流量。
- 应用层过滤:深度检测应用层协议(如HTTP、FTP),拦截恶意内容。
- 日志记录与监控:记录流量行为,便于分析和审计。
-
Linux 系统中常见的防火墙工具有以下几种:
-
iptables
(静态防火墙)简介:
iptables
是 Linux 内核中基于 Netfilter 的包过滤工具,工作在网络层(OSI 模型第三层)。- 通过定义链式规则(Chain)和表(Table)来控制数据包的流入、流出和转发行为。
特点:
- 静态规则:修改规则后需重新加载,可能中断现有连接。
- 仅处理互联网流量:无法直接过滤内网到内网的流量。
- 命令行配置:规则通过命令行设置,需手动编写。
- 默认允许所有流量:需通过拒绝规则进行限制。
常用命令示例:
# 查看当前规则 sudo iptables -L -n -v # 禁止某个IP访问 sudo iptables -A INPUT -s 192.168.1.100 -j DROP # 允许特定IP访问80端口 sudo iptables -A INPUT -s 192.168.1.100 -p tcp --dport 80 -j ACCEPT # 保存规则(需配合iptables-save) sudo iptables-save > /etc/iptables/rules.v4
适用场景:
- 需要精细控制网络流量的静态规则场景。
- 传统服务器或对性能要求较高的环境。
-
firewalld
(动态防火墙)简介:
firewalld
是 CentOS/RHEL 7+ 和 Fedora 等系统默认的动态防火墙工具,基于iptables
但提供了更高级的接口。- 引入了 区域(Zone) 的概念,将网络接口或源地址分配到不同区域,每个区域对应不同的安全策略。
特点:
- 动态规则:支持运行时修改规则,无需重启服务,不影响现有连接。
- 支持内网流量过滤:可以过滤内网到内网的流量。
- 图形化和命令行配置:支持
firewall-cmd
命令和firewall-config
图形工具。 - 默认拒绝所有流量:需通过允许规则放行。
常用命令示例:
# 查看防火墙状态 sudo systemctl status firewalld # 启动/停止防火墙 sudo systemctl start/stop firewalld # 设置默认区域 sudo firewall-cmd --set-default-zone=public # 添加端口开放(运行时生效) sudo firewall-cmd --add-port=80/tcp # 添加永久规则(需重启生效) sudo firewall-cmd --permanent --add-port=80/tcp # 刷新规则 sudo firewall-cmd --reload
适用场景:
- 动态管理规则的场景(如云服务器、频繁变更的网络环境)。
- 需要灵活划分区域(如家庭网络、公共网络)的环境。
-
nftables
(新一代防火墙工具)- 简介:
nftables
是iptables
的替代方案,旨在简化规则管理并提高性能。- 提供统一的表(Table)和链(Chain)管理,支持更复杂的匹配条件。
- 特点:
- 兼容性:逐步取代
iptables
,但部分旧系统仍需依赖iptables
。 - 性能优化:减少内核与用户空间的交互,提升处理效率。
- 语法简化:规则语法更简洁,支持批量操作。
- 兼容性:逐步取代
- 适用场景:
- 新部署的 Linux 系统(如 Ubuntu 22.04+、CentOS Stream 9)。
- 需要高性能和复杂规则管理的场景。
- 简介:
-
ipset
(IP集合管理工具)简介:
ipset
是一个辅助工具,用于管理 IP 地址、端口或 MAC 地址的集合。- 可与
iptables
或firewalld
结合使用,动态更新黑名单或白名单。
特点:
- 高效匹配:通过哈希表快速查找 IP 或端口集合。
- 动态更新:无需重启防火墙即可更新规则。
- 支持多种集合类型:如 IP 地址、端口范围、MAC 地址等。
常用命令示例:
# 创建IP集合 sudo ipset create blacklist hash:ip # 添加IP到集合 sudo ipset add blacklist 192.168.1.100 # 在iptables中引用集合 sudo iptables -A INPUT -m set --match-set blacklist src -j DROP
适用场景:
- 动态维护大规模 IP 黑名单(如 DDoS 攻击防护)。
- 需要频繁更新规则的场景。
-
3.如何清空iptables中的所有规则
要清空 iptables
中的所有规则,需要执行多个命令来确保所有链、表和自定义规则都被清除。以下是详细的操作步骤:
-
清空默认表(filter 表)的规则
# 清空所有链中的规则(INPUT、OUTPUT、FORWARD) sudo iptables -F # 删除所有用户自定义的链 sudo iptables -X # 重置所有链的计数器(包和字节计数) sudo iptables -Z
-
清空 NAT 表(nat 表)的规则
# 清空 nat 表中的所有规则 sudo iptables -t nat -F # 删除 nat 表中的用户自定义链 sudo iptables -t nat -X # 重置 nat 表的计数器 sudo iptables -t nat -Z
-
清空 Mangle 表的规则
# 清空 mangle 表中的所有规则 sudo iptables -t mangle -F # 删除 mangle 表中的用户自定义链 sudo iptables -t mangle -X # 重置 mangle 表的计数器 sudo iptables -t mangle -Z
-
验证规则是否已清空
# 查看当前规则,确认是否为空 sudo iptables -L -n -v sudo iptables -t nat -L -n -v sudo iptables -t mangle -L -n -v
4.添加一个规则,禁止所有地址访问服务器的80端口,测试是否生效
-
步骤 1:添加规则禁止所有地址访问 80 端口
# 添加规则:禁止所有 IP 访问 80 端口(TCP 协议) sudo iptables -A INPUT -p tcp --dport 80 -j DROP
命令解释:
sudo
:以管理员权限运行命令。iptables
:Linux 防火墙工具。-A INPUT
:将规则添加到INPUT
链(处理进入服务器的流量)的末尾。-p tcp
:指定协议为 TCP(HTTP 使用 TCP 协议)。--dport 80
:目标端口为 80(HTTP 服务端口)。-j DROP
:对匹配的流量执行DROP
动作(丢弃数据包,不返回任何响应)。
-
步骤 2:验证规则是否生效
-
方法 1:查看规则列表
# 查看当前的 iptables 规则 sudo iptables -L -n -v
预期输出: 在
INPUT
链中会看到类似以下规则:DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
命令解释:
-L
:列出规则。-n
:以数字形式显示 IP 地址和端口(避免解析主机名和服务名)。-v
:显示详细信息(如数据包和字节计数)。
-
方法 2:测试访问
-
本地测试(如果服务器上运行了 Web 服务):
# 尝试访问本地 80 端口 curl http://127.0.0.1
预期结果:
如果规则生效,会返回超时或错误(如Connection refused
)。 -
远程测试(从其他机器访问):
# 替换 <服务器IP> 为你的服务器 IP curl http://<服务器IP>
预期结果:
如果规则生效,会返回超时或错误。
-
-
-
步骤 3:保存规则(防止重启后失效)
根据你的 Linux 发行版选择以下命令:
-
CentOS/RHEL:
sudo service iptables save
-
Ubuntu/Debian:
sudo apt-get install iptables-persistent # 安装持久化工具(如未安装) sudo iptables-save > /etc/iptables/rules.v4
命令解释:
iptables-save
:将当前规则保存到文件。/etc/iptables/rules.v4
:Ubuntu/Debian 的规则保存路径。service iptables save
:CentOS/RHEL 的保存方式(直接写入配置文件)。
-
-
步骤 4:临时恢复规则(可选)
如果测试后需要临时恢复访问,可以删除规则:
# 删除刚刚添加的规则(需先通过 `iptables -L --line-numbers` 查看规则编号) sudo iptables -D INPUT <规则编号>
命令解释:
-D INPUT
:从INPUT
链中删除规则。<规则编号>
:通过iptables -L --line-numbers
查看规则在链中的行号。
5.iptables规则是按顺序全部执行还是匹配到就结束
iptables 的规则执行遵循 “匹配即停止”(Match and Stop) 的原则。具体规则如下:
-
规则匹配顺序
-
从上到下 依次匹配规则。
-
如果数据包 匹配到某条规则,则立即执行该规则的动作为止,不再检查后续规则。
-
如果 没有匹配任何规则,则执行该链的 默认策略(默认策略由
-P
设置,如ACCEPT
或DROP
)。
-
-
动作对执行流程的影响
不同的动作(-j
目标)会影响是否继续处理后续规则:
动作 | 行为 |
---|---|
ACCEPT | 允许数据包通过,终止当前链的处理,后续规则不再检查。 |
DROP | 直接丢弃数据包,终止当前链的处理,后续规则不再检查。 |
REJECT | 拒绝数据包并返回响应(如 TCP RST),终止当前链的处理。 |
LOG/ULOG | 记录日志,继续检查后续规则。 |
RETURN | 结束当前自定义链的处理,返回到调用链继续检查后续规则(仅限用户自定义链)。 |
REDIRECT/MASQUERADE | 修改数据包并继续处理后续规则(如 NAT 规则)。 |
-
示例说明
-
场景 1:匹配即停止
# 规则 1:允许 192.168.1.0/24 网段访问 80 端口 sudo iptables -A INPUT -p tcp --dport 80 -s 192.168.1.0/24 -j ACCEPT # 规则 2:禁止所有其他地址访问 80 端口 sudo iptables -A INPUT -p tcp --dport 80 -j DROP
-
匹配顺序:
-
如果数据包来自
192.168.1.0/24
,匹配规则 1,执行ACCEPT
,直接放行,不再检查规则 2。 -
如果数据包来自其他地址,匹配规则 2,执行
DROP
,直接丢弃。
-
-
场景 2:LOG 后继续匹配
# 规则 1:记录所有访问 80 端口的流量日志 sudo iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "HTTP Access: " # 规则 2:禁止所有访问 80 端口 sudo iptables -A INPUT -p tcp --dport 80 -j DROP
-
匹配顺序:
- 所有访问 80 端口的数据包都会先记录日志(
LOG
),继续检查后续规则。 - 最终匹配规则 2,执行
DROP
。
- 所有访问 80 端口的数据包都会先记录日志(
-
-
注意事项
-
规则顺序至关重要
- 如果规则 2(DROP)在规则 1(ACCEPT)之前,所有 80 端口流量都会被
DROP
,规则 1 的ACCEPT
永远不会生效。 - 解决方案:使用
-I
插入规则到指定位置,或调整规则顺序。
- 如果规则 2(DROP)在规则 1(ACCEPT)之前,所有 80 端口流量都会被
-
默认策略的兜底作用
- 如果没有规则匹配,则执行链的默认策略(如
INPUT
链默认是ACCEPT
或DROP
)。 - 建议:设置严格默认策略(如
DROP
),再通过规则放行特定流量。
- 如果没有规则匹配,则执行链的默认策略(如
-
LOG 的调试用途
- 使用
LOG
动作可以记录匹配到的流量,帮助排查规则是否生效。 - 日志通常记录在
/var/log/messages
或系统日志服务中。
- 使用
-
6.如果要拒绝所有地址访问,但是允许指定的地址访问,那么拒绝的规则应该放在第几条
在 iptables 中,如果需要实现 “拒绝所有地址访问,但允许特定 IP 地址访问” 的规则,拒绝所有 的规则必须放在 允许特定 IP 的规则 之后。否则,允许规则永远不会生效,因为 iptables 是 “匹配即停止” 的机制。
7.如何调整iptables规则的顺序
-
查看当前规则及顺序
使用
--line-numbers
参数查看规则的 编号(num),这是调整顺序的前提。# 查看 INPUT 链的规则(带行号) sudo iptables -L INPUT --line-numbers
示例输出:
num target prot opt source destination 1 ACCEPT tcp -- 192.168.1.100 anywhere tcp dpt:80 2 DROP tcp -- anywhere anywhere tcp dpt:80
-
调整规则顺序的常用方法
-
删除旧规则
根据规则的编号删除不需要的规则:# 删除 INPUT 链的第 2 条规则(DROP 规则) sudo iptables -D INPUT 2
-
插入新规则到指定位置
使用-I
参数将规则插入到链的 指定位置(例如第 1 行):# 在 INPUT 链的第 1 位置插入 DROP 规则 sudo iptables -I INPUT 1 -p tcp --dport 80 -j DROP
-
验证调整后的顺序:
sudo iptables -L INPUT --line-numbers
-
-
常用操作命令总结
操作 命令 查看规则及行号 sudo iptables -L <链名> --line-numbers
删除规则 sudo iptables -D <链名> <行号>
或sudo iptables -D <链名> <匹配条件>
插入规则到顶部 sudo iptables -I <链名> 1 <规则内容>
插入规则到指定位置 sudo iptables -I <链名> <行号> <规则内容>
追加规则到末尾 sudo iptables -A <链名> <规则内容>
-
示例:调整规则顺序的完整流程
假设当前规则如下:
1 ACCEPT tcp dpt:80 2 DROP tcp dpt:80
目标:将
DROP
规则移到ACCEPT
之后。步骤:
-
删除
DROP
规则(第 2 条):sudo iptables -D INPUT 2
-
在
ACCEPT
规则(第 1 条)之后插入DROP
规则:sudo iptables -I INPUT 2 -p tcp --dport 80 -j DROP
-
验证调整后的规则顺序:
sudo iptables -L INPUT --line-numbers
-
-
注意事项
-
避免锁自己在外面
- 如果调整的是 SSH 规则(如
dport 22
),确保ACCEPT
规则在DROP
之前。 - 建议在本地终端操作,或提前配置好允许 SSH 的规则。
- 如果调整的是 SSH 规则(如
-
保存规则
调整后需保存规则,防止重启后失效:-
CentOS/RHEL:
sudo service iptables save
-
Ubuntu/Debian:
sudo apt install iptables-persistent sudo netfilter-persistent save
-
-
测试规则
使用telnet
、curl
或nmap
测试端口是否生效:telnet <服务器IP> 80 curl http://<服务器IP>:80
-
8.如何单独删除某条iptables规则
-
方法 1:按规则编号删除
-
查看规则及行号
使用--line-numbers
参数查看规则列表和对应的行号:sudo iptables -L <链名> --line-numbers
例如,查看
INPUT
链的规则:sudo iptables -L INPUT --line-numbers
示例输出:
num target prot opt source destination 1 ACCEPT tcp -- 192.168.1.100 anywhere tcp dpt:80 2 DROP tcp -- anywhere anywhere tcp dpt:80
-
删除指定行号的规则
使用-D
参数删除指定链中的规则,格式为:sudo iptables -D <链名> <规则行号>
例如,删除
INPUT
链的第 2 条规则:sudo iptables -D INPUT 2
-
-
方法 2:按规则内容删除
-
列出所有规则
查看规则的具体内容(无需行号):sudo iptables -S <链名>
例如,查看
INPUT
链的规则:sudo iptables -S INPUT
示例输出:
-A INPUT -p tcp -s 192.168.1.100 --dport 80 -j ACCEPT -A INPUT -p tcp --dport 80 -j DROP
-
复制并修改规则
将需要删除的规则复制出来,并将-A
(添加)替换为-D
(删除)。
例如,删除INPUT
链中允许192.168.1.100
访问 80 端口的规则:sudo iptables -D INPUT -p tcp -s 192.168.1.100 --dport 80 -j ACCEPT
-
9.准备2台虚拟机,A和B,在A机器上生成密钥,并配置让A可以使用密钥免密登录到B机器
-
步骤 1:在 A 机器上生成 SSH 密钥对
-
生成密钥对
在 A 机器上执行以下命令,生成 RSA 类型的密钥对(默认保存在~/.ssh/
目录下):ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa
:指定密钥类型为 RSA。-b 4096
:指定密钥长度为 4096 位(更安全)。-C "your_email@example.com"
:添加注释(可选)。
-
按提示操作
- 系统会提示你输入保存密钥的路径(默认为
~/.ssh/id_rsa
),直接按回车即可。 - 然后会提示输入密码短语(passphrase),如果希望免密码登录,直接按回车留空。
- 系统会提示你输入保存密钥的路径(默认为
-
生成结果
- 私钥文件:
~/.ssh/id_rsa
(需严格保护)。 - 公钥文件:
~/.ssh/id_rsa.pub
(需复制到 B 机器)。
- 私钥文件:
-
-
步骤 2:将 A 的公钥复制到 B 机器
-
使用
ssh-copy-id
工具(推荐)-
在 A 机器上执行以下命令:
ssh-copy-id user@B机器的IP地址
user
:B 机器上的用户名(如root
或普通用户)。示例:
ssh-copy-id ymyw@192.168.163.141
-
验证操作
- 系统会提示输入 B 机器的用户密码(用于验证身份)。
- 如果成功,公钥会被自动追加到 B 机器的
~/.ssh/authorized_keys
文件中。
-
-
-
步骤 3:配置 B 机器的 SSH 服务
-
检查 SSH 配置文件
在 B 机器上编辑/etc/ssh/sshd_config
,确保以下配置项已启用:PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes # 如果需要保留密码登录,可保留为 yes
-
如果修改了配置文件,重启 SSH 服务:
sudo systemctl restart sshd
-
-
检查权限
在 B 机器上执行以下命令,确保权限正确:# 用户家目录权限 chmod 700 ~/ # .ssh 目录权限 chmod 700 ~/.ssh # authorized_keys 文件权限 chmod 600 ~/.ssh/authorized_keys
-
-
步骤 4:从 A 机器测试免密登录
-
尝试登录 B 机器
在 A 机器上执行:ssh user@B机器的IP地址
- 如果配置成功,将无需输入密码即可登录。
-
常见问题排查
-
权限错误:确保 B 机器的
.ssh
目录和authorized_keys
文件权限正确。 -
SSH 配置问题:检查 B 机器的
/etc/ssh/sshd_config
是否启用PubkeyAuthentication
。 -
日志查看:在 B 机器上查看日志以排查问题:
sudo tail -f /var/log/auth.log
-
-
-
步骤 5(可选):禁用 B 机器的密码登录(增强安全性)
-
修改 B 机器的 SSH 配置在
/etc/ssh/sshd_config
中设置:PasswordAuthentication no
-
重启 SSH 服务
sudo systemctl restart sshd
-
10.如何从A机器上复制一个文件或目录到B机器
-
方法 1:使用
scp
命令scp
(Secure Copy)是基于 SSH 的安全文件传输工具,适合在已配置 SSH 的 Linux 机器之间传输文件。1. 复制单个文件
sudo scp /path/to/source/file user@B机器的IP地址:/path/to/destination/
-
示例:
sudo scp /opt/mydir/200MB_file ymyw@192.168.163.141:/opt
将 A 机器上的200MB_file复制到 B 机器的/opt/目录。
-
注意事项:
要确保B及其上的文件夹有相应的写入权限:
sudo chmod 777 /opt
2. 复制整个目录
# 添加 -r 参数(递归复制): sudo scp -r /path/to/source/directory/ user@B机器的IP地址:/path/to/destination/
-
示例:
sudo scp -r /opt/mydir/ ymyw@192.168.163.141:/opt/
将 A 机器上的
mydir
目录及其内容复制到 B 机器的/opt/
目录。
3. 启用压缩传输(大文件推荐)
# 添加 -C 参数以压缩数据(减少传输时间): scp -r -C /path/to/source user@B机器的IP地址:/path/to/destination/
4. 指定非默认 SSH 端口
如果 B 机器的 SSH 端口不是默认的 22,使用
-P
参数指定端口:scp -P 2222 /path/to/file user@B机器的IP地址:/path/to/destination/
-
-
方法 2:使用
rsync
命令rsync
是更强大的文件同步工具,支持增量传输和断点续传,适合大文件或频繁同步场景。1. 基本用法
rsync -avz /path/to/source/ user@B机器的IP地址:/path/to/destination/
-
参数说明:
-a
:归档模式(保留权限、时间戳等)。-v
:详细输出。-z
:压缩传输。
-
示例:
sudo rsync -avz /opt/mydir ymyw@192.168.163.141:/opt
2. 删除目标目录多余文件(保持完全同步)
添加
--delete
参数:sudo rsync -avz --delete /path/to/source/ user@B机器的IP地址:/path/to/destination/
3. 指定非默认 SSH 端口
sudo rsync -avz -e "ssh -p 2222" /path/to/source/ user@B机器的IP地址:/path/to/destination/
-
11.如何使用sync同步A机器上的目录到B机器
输入以下命令:
sudo rsync -avz /opt/mydir ymyw@192.168.163.141:/opt
# 输出:
ymyw@192.168.163.141's password:
sending incremental file list
mydir/
mydir/200MB_file
mydir/lost+found/
sent 6,591 bytes received 47 bytes 1,021.23 bytes/sec
total size is 209,715,200 speedup is 31,593.13
接着去B机器上查看对应目录是否完整即可。
12.如何设置同步时,保持目录一致,比如A机器原始目录中删除了文件同时也会删除B机器同步目录中的对应文件
-
使用
rsync
的--delete
参数命令格式
rsync -av --delete /path/to/source/ user@remote:/path/to/destination/
--delete
:删除目标目录中源目录没有的文件。
-
注意事项
-
测试运行(Dry Run)
在首次使用时,建议先通过
--dry-run
参数模拟操作,确认无误后再执行:rsync -avn --delete /opt/mydir/ ymyw@192.168.163.141:/opt/sync_dir/
-n
或--dry-run
:仅显示操作,不实际执行。
-
定时同步(可选)
通过
cron
设置定时任务,定期同步目录:# 编辑 crontab crontab -e # 添加以下内容(每小时同步一次) 0 * * * * rsync -av --delete /opt/mydir/ ymyw@192.168.163.141:/opt/sync_dir/
-
13.如何设置同步时,A机器原始目录中删除文件,但是B机器同步目录中会保留文件
rsync
默认不会删除目标目录中的文件,除非你显式指定 --delete
参数。因此,只需 移除 --delete
参数 即可满足需求。
14.每隔几秒创建一个以当前时间命名的文件,比如20250623110833.txt
-
方法 1:使用 Python 脚本(推荐)
-
编写 Python 脚本
import time from datetime import datetime # 设置间隔时间(单位:秒) interval = 5 # 每隔 5 秒创建一个文件 while True: # 获取当前时间戳(格式:YYYYMMDDHHMMSS) timestamp = datetime.now().strftime("%Y%m%d%H%M%S") # 创建文件并写入内容(可选) filename = f"{timestamp}.txt" with open(filename, 'w') as f: f.write(f"This file was created at {timestamp}\n") print(f"Created file: {filename}") # 等待指定时间 time.sleep(interval)
-
运行脚本
在终端中直接运行:
python3 your_script.py
-
后台运行(可选)
使用nohup或screen让脚本在后台运行:
nohup python3 your_script.py > /dev/null 2>&1 &
-
-
方法 2:使用 Linux 定时任务(crontab)
-
编写 Shell 脚本
创建一个
.sh
文件(如create_files.sh
),内容如下:#!/bin/bash # 获取当前时间戳 timestamp=$(date "+%Y%m%d%H%M%S") # 创建文件并写入内容 echo "This file was created at $timestamp" > "$timestamp.txt" # 输出日志(可选) echo "Created file: $timestamp.txt"
-
设置定时任务
-
赋予脚本可执行权限:
chmod +x create_files.sh
-
编辑 crontab:
crontab -e
-
添加定时任务(例如每隔 5 秒执行一次):
* * * * * /path/to/create_files.sh
- 注意:
crontab
最小间隔为 1 分钟。若需要更短的间隔(如 5 秒),需结合其他工具(如watch
或 Python 脚本)。
- 注意:
-
-
15.将一个目录打包,生成一个以当前时间命名的压缩包,比如将/etc目录打包为etc_20250623110833.tgz
-
方法 1:使用 Shell 命令(推荐)
tar -czvf etc_$(date "+%Y%m%d%H%M%S").tar.gz /etc
解释:
-
tar
命令参数:-
-c
:创建新的归档文件。 -
-z
:通过gzip
压缩。 -
-v
:显示压缩过程(可选)。 -
-f
:指定生成的文件名。
-
-
date "+%Y%m%d%H%M%S"
:- 生成当前时间戳,格式为
YYYYMMDDHHMMSS
(例如20250716142319
)。
- 生成当前时间戳,格式为
-
文件名拼接:
etc_
是固定前缀,后接时间戳和.tar.gz
后缀。
示例输出:
假设当前时间是
2025-07-16 14:26:48
,生成的压缩包为:etc_20250716142648.tar.gz
-
-
方法 2:使用 Shell 脚本(可扩展性更强)
#!/bin/bash # 设置源目录和目标路径 SOURCE_DIR="/etc" OUTPUT_DIR="/backup" # 可选:指定输出目录 # 生成时间戳 TIMESTAMP=$(date "+%Y%m%d%H%M%S") # 构造压缩包文件名 OUTPUT_FILE="${OUTPUT_DIR}/etc_${TIMESTAMP}.tar.gz" # 执行压缩 tar -czvf "$OUTPUT_FILE" "$SOURCE_DIR"
运行脚本:
-
将脚本保存为
backup_etc.sh
。 -
赋予执行权限:
chmod +x backup_etc.sh
-
运行脚本:
./backup_etc.sh
-
-
注意事项
-
权限问题:
/etc是系统目录,普通用户可能没有权限读取所有文件。需要使用sudo提权:
sudo tar -czvf etc_$(date "+%Y%m%d%H%M%S").tar.gz /etc
-
路径定制:
- 修改
SOURCE_DIR
和OUTPUT_DIR
可适配其他目录和输出路径。
- 修改
-
定时任务(可选):
-
如果需要定期备份,可通过crontab设置定时任务:
crontab -e # 添加以下内容(每天凌晨 2 点执行) 0 2 * * * /path/to/backup_etc.sh
-
-
-
验证压缩包
-
查看压缩包内容:
tar -tzvf etc_20250716142319.tar.gz
-
解压测试:
tar -xzvf etc_20250716142319.tar.gz
-
16.如何查看进程的当前工作目录
首先用ps-f
查看在运行进程的PID
:
-
方法一:使用
pwdx
命令pwdx
是 Linux 中最简单的工具,用于显示指定进程的当前工作目录。# 语法:pwdx <PID> # 示例:查看进程 ID 为 1410 的进程的当前工作目录 pwdx 1410
输出示例:
1410: /home/longlijisi
-
方法二:通过
/proc
文件系统Linux 的
/proc
文件系统提供了每个进程的详细信息,包括工作目录。# 查看进程 ID 为 1410 的进程的工作目录 ls -l /proc/1410/cwd
输出示例:
lrwxrwxrwx 1 longlijisi longlijisi 0 Jul 16 14:33 /proc/1410/cwd -> /home/longlijisi
-
方法三:使用
ps
命令ps
命令可以结合pwd
或args
字段查看进程的工作目录。# 查看进程 ID 为 1234 的进程的工作目录 ps -p 1234 -o comm,cmd,cwd
输出示例:
CMD CMDLINE CWD python /usr/bin/python /home/user/script.py /home/user/project
-
方法四:使用
lsof
命令lsof
可以列出进程打开的文件和目录信息。# 查看进程 ID 为 1234 的进程的当前工作目录 lsof -p 1234 | grep cwd
输出示例:
bash 1410 longlijisi cwd DIR 8,2 4096 2359298 /home/longlijisi
-
方法五:使用
readlink
命令结合
/proc/<PID>/cwd
使用readlink
获取实际路径。# 查看进程 ID 为 1410 的进程的工作目录 readlink -f /proc/1410/cwd
输出示例:
/home/longlijisi
17.如何查看某个端口被哪个进程占用
-
查看端口使用情况
-
方法一:使用
ss
命令(推荐)# 查看所有监听中的 TCP/UDP 端口及进程信息 sudo ss -tulnp
输出示例:
-
参数说明:
-t
:TCP 端口。-u
:UDP 端口。-l
:仅显示监听状态(LISTEN)的端口。-n
:以数字形式显示地址和端口。-p
:显示进程信息(需root
权限)。
-
方法二:使用
netstat
命令(旧版工具)# 查看所有监听中的 TCP/UDP 端口及进程信息 sudo netstat -tulnp
输出示例:
-
方法三:使用
lsof
命令# 查看特定端口的占用情况(例如 68) sudo lsof -i :68 # 输出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd-n 894 systemd-network 17u IPv4 52570 0t0 UDP longlijisi:bootpc
-
-
查看某个端口被哪个进程占用
-
方法一:结合
ss
或netstat
过滤端口# 查看 8080 端口的占用情况 sudo ss -tulnp | grep :8080 # 或 sudo netstat -tulnp | grep :8080
-
方法二:使用
lsof
直接定位# 查看 8080 端口的占用进程 sudo lsof -i :8080
-
方法三:使用
fuser
命令# 查看 8080 端口的占用进程 ID (PID) sudo fuser 8080/tcp
-
方法四:通过
ps
或systemctl
查看服务如果进程是由
systemd
管理的服务:# 通过 PID 查看服务名称 systemctl status <PID> # 或直接显示进程名 ps -p <PID> -o comm=
-
18.如何查看某个文件被哪个进程占用
-
查看进程的使用情况
-
方法一:使用
ps
命令# 查看所有进程的资源占用 ps aux
- 关键字段:
%CPU
:CPU 使用率。%MEM
:内存使用率。COMMAND
:进程名称。
- 关键字段:
-
方法二:使用
top
或htop
# 实时动态查看进程资源占用(按内存排序) top # 按内存排序:按 `Shift + M` # 按 CPU 排序:按 `Shift + P`
-
推荐使用
htop
(需安装):sudo apt install htop # Debian/Ubuntu sudo yum install htop # CentOS/RHEL htop
-
-
-
查看某个文件被哪个进程占用
-
方法一:使用
lsof
命令# 查看特定文件被哪个进程占用(需 root 权限) sudo lsof <文件路径>
-
示例:
sudo lsof /var/log/syslog
-
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 922 syslog 7w REG 8,2 1692352 1969673 /var/log/syslog
-
-
方法二:递归查看目录中的文件占用
# 查看指定目录中被占用的文件 sudo lsof +D <目录路径>
-
方法三:使用
fuser
命令# 查看占用文件的进程 ID (PID) sudo fuser <文件路径>
-
19.lsof有哪些功能
lsof
(List Open Files)是一个功能强大的命令行工具,主要用于查看系统中当前被打开的文件及其关联的进程信息。在 Linux 系统中,"一切皆文件"的理念使得 lsof
能够帮助用户分析文件、网络连接、设备、管道等资源的使用情况。
以下是 lsof
的主要功能和用法总结:
-
查看系统中所有打开的文件
-
功能:列出当前所有进程打开的文件(包括普通文件、目录、设备、网络连接等)。
-
命令:
lsof
-
特点:
- 输出包含进程名称(
COMMAND
)、进程 ID(PID
)、用户(USER
)、文件描述符(FD
)、文件类型(TYPE
)、文件路径(NAME
)等信息。 - 默认需要 root 权限 或使用
sudo
。
- 输出包含进程名称(
-
-
根据文件名查找占用该文件的进程
-
功能:定位某个文件被哪些进程占用。
-
命令:
lsof <文件路径>
-
示例:
lsof /var/log/syslog # 输出: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 1234 root 12w REG 8,1 1234 123456 /var/log/syslog
-
-
根据进程名/进程 ID 查看其打开的文件
-
功能:查看某个进程(或进程名)打开了哪些文件。
-
命令:
# 根据进程名 lsof -c <进程名> # 根据进程 ID lsof -p <PID>
-
示例:
lsof -c nginx # 查看所有 nginx 进程打开的文件 lsof -p 1234 # 查看 PID 为 1234 的进程打开的文件
-
-
查看网络连接及占用端口的进程
-
功能:列出所有网络连接(TCP/UDP)或特定端口的占用情况。
-
命令:
# 查看所有网络连接 lsof -i # 查看特定端口 lsof -i :<端口号>
-
示例:
lsof -i :8080 # 查看 8080 端口的占用情况 lsof -i TCP:80 # 查看 TCP 80 端口的连接
-
-
查找被删除但仍被占用的文件(僵尸文件)
-
功能:定位已删除但仍在被进程占用的文件(这些文件会占用磁盘空间)。
-
命令:
lsof | grep deleted
-
示例输出:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 1234 user 10r REG 0,19 123456 78901 /tmp/example.txt (deleted)
-
-
递归查看目录下被打开的文件
-
功能:查找某个目录及其子目录中被打开的文件。
-
命令:
# 非递归 lsof +d <目录路径> # 递归 lsof +D <目录路径>
-
示例:
lsof +D /var/log # 查看 /var/log 目录下所有被打开的文件
-
-
按用户过滤打开的文件
-
功能:查看某个用户打开的所有文件。
-
命令:
lsof -u <用户名>
-
示例:
lsof -u root # 查看 root 用户打开的文
-
-
组合筛选条件
-
功能:通过
-a
参数组合多个筛选条件。 -
示例:
lsof -u root -i :80 # 查看 root 用户打开的 80 端口连接
-
-
输出指定列信息
-
功能:自定义输出字段,减少冗余信息。
-
命令:
lsof -F [字段] # 例如 -F pnc (输出 PID、进程名、命令)
-
字段说明:
p
:进程 ID(PID)n
:进程名(COMMAND)c
:命令名f
:文件路径d
:文件描述符(FD)
-
-
查看设备文件:
lsof /dev/sda1 # 查看挂载在 /dev/sda1 上的文件
-
查看内存映射文件:
lsof -m # 查看内存映射的文件
-
查看 Unix 域套接字:
lsof -U # 查看 Unix 域套接字
20./proc目录有什么作用
在 Linux 系统中,/proc
目录是一个 虚拟文件系统(procfs),它动态地将系统内核和进程的状态信息以文件的形式呈现给用户。
虽然 /proc
看起来像一个普通目录,但它实际上 不占用磁盘空间,而是运行时由内核动态生成的,用于提供系统和进程的实时信息。
-
核心作用
(1)提供系统和进程的实时信息
- 系统状态:包括 CPU、内存、磁盘、网络等硬件和资源的使用情况。
- 进程信息:每个运行中的进程在
/proc
下都有一个以其 PID(进程 ID)命名的子目录,包含该进程的详细状态、资源占用、打开的文件、环境变量等。
(2)内核参数的动态调整
-
通过/proc/sys目录,用户可以读取或修改内核参数(需谨慎操作,部分参数仅允许 root 用户修改)。
-
示例:
# 查看网络参数 cat /proc/sys/net/ipv4/ip_local_port_range # 修改参数(需 root 权限) echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
-
(3)调试和监控工具的底层支持
- 工具如
ps
、top
、htop
、lsof
等都依赖/proc
提供的数据。 - 系统日志工具(如
dmesg
)和硬件监控工具(如lspci
)也通过/proc
获取信息。
-
主要功能分类
(1)进程信息(/proc/[PID])
每个运行中的进程在
/proc
中对应一个以 PID 命名的子目录(如/proc/1234
),包含以下关键文件:/proc/[PID]/status
:进程的详细状态(如状态、父进程 ID、内存占用等)。/proc/[PID]/cmdline
:进程启动时的命令行参数。/proc/[PID]/environ
:进程的环境变量(以空字符分隔)。/proc/[PID]/fd
:进程打开的文件描述符(如/proc/[PID]/fd/0
表示标准输入)。/proc/[PID]/maps
:进程的内存映射信息(如共享库、堆栈地址)。/proc/[PID]/exe
:指向进程可执行文件的符号链接。
(2)系统全局信息
/proc/cpuinfo
:CPU 的详细信息(型号、核心数、频率、缓存等)。/proc/meminfo
:内存使用情况(总内存、空闲内存、缓存等)。/proc/version
:内核版本和编译信息。/proc/loadavg
:系统负载(1 分钟、5 分钟、15 分钟的平均负载)。/proc/interrupts
:中断请求(IRQ)的统计信息。/proc/ioports
:I/O 端口的分配情况。/proc/uptime
:系统运行时间(开机时长)。/proc/partitions
:磁盘分区信息。/proc/net/dev
:网络接口的流量统计(发送/接收数据包数)。
(3)设备和硬件信息
/proc/driver
:驱动程序的状态。/proc/ide
:IDE 设备信息。/proc/scsi
:SCSI 设备信息。/proc/bus
:总线信息(如 PCI、USB)。/proc/pci
:PCI 设备列表。
(4)内核和系统配置
/proc/config.gz
:内核编译时的配置文件(如果启用CONFIG_IKCONFIG
)。/proc/sys
:内核参数(如网络、内存、文件系统等)。/proc/kcore
:系统物理内存的映像(核心文件格式,仅用于调试)。
-
使用场景
(1)监控系统资源
-
查看 CPU 使用率:
cat /proc/stat
-
查看内存使用情况:
cat /proc/meminfo
(2)调试进程问题
-
查看某个进程的内存映射:
cat /proc/1234/maps
-
查看进程打开的文件:
ls /proc/1234/fd
(3)网络诊断
-
查看网络接口流量:
cat /proc/net/dev
-
查看 TCP 连接状态:
cat /proc/net/tcp
(4)硬件信息查询
-
查看 CPU 信息:
cat /proc/cpuinfo
-
查看磁盘分区:
cat /proc/partitions
-
-
注意事项
- 动态性:
/proc
中的文件是动态生成的,实时反映系统状态。例如,当一个进程结束时,其对应的/proc/[PID]
目录会立即消失。
- 权限限制:
- 某些敏感文件(如
/proc/kcore
、/proc/sys
下的参数)需要 root 权限才能访问或修改。
- 某些敏感文件(如
- 不可修改性:
- 大多数文件是只读的,直接修改可能导致系统不稳定。例如,
/proc/meminfo
是只读的,不能通过写入文件来修改内存参数。
- 大多数文件是只读的,直接修改可能导致系统不稳定。例如,
- 僵尸进程:
- 如果一个进程成为僵尸进程(Zombie),其
/proc/[PID]
目录可能会被删除,但进程信息仍保留在系统中,直到父进程调用wait()
。
- 如果一个进程成为僵尸进程(Zombie),其
- 动态性:
21.apt如何卸载软件包,如何查找软件包,如何安装指定版本的软件包,如何锁定软件包版本(不会自动升级)
-
卸载软件包
(1)基本卸载
-
命令:
sudo apt remove <软件包名称>
-
作用:卸载指定软件包,但保留配置文件。
-
示例:
sudo apt remove nginx
(2)彻底卸载(删除配置文件)
-
命令:
sudo apt purge <软件包名称>
-
作用:卸载软件包并删除其配置文件。
-
示例:
sudo apt purge nginx
(3)清理无用依赖
-
命令:
sudo apt autoremove
-
作用:删除因依赖关系自动安装但已不再需要的软件包。
-
-
查找软件包
(1)搜索软件包
-
命令:
apt search <关键词>
-
作用:根据名称或描述搜索软件包。
-
示例:
apt search netstat
(2)查看软件包详细信息
-
命令:
apt show <软件包名称>
-
作用:显示软件包的详细信息(版本、依赖、描述等)。
-
示例:
apt show nginx
(3)列出已安装的软件包
-
命令:
apt list --installed
-
作用:列出当前系统中所有已安装的软件包。
-
示例:
apt list --installed | grep firefox
-
-
安装指定版本的软件包
步骤 1:查看可用版本
-
命令:
apt-cache policy <软件包名称>
-
作用:列出软件包的所有可用版本及来源。
-
示例:
apt-cache policy nginx
输出示例:
nginx: Installed: (none) Candidate: 1.18.0-0ubuntu1 Version table: 1.18.0-0ubuntu1 500 500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages 1.17.10-0ubuntu1 500 500 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
步骤 2:安装指定版本
-
命令:
sudo apt install <软件包名称>=<版本号>
-
注意:版本号必须与
apt-cache policy
中列出的版本完全一致。 -
示例:
sudo apt install nginx=1.17.10-0ubuntu1
-
-
锁定软件包版本(防止自动升级)
(1)锁定版本
-
命令:
sudo apt-mark hold <软件包名称>
-
作用:标记软件包为“锁定”,防止其在系统升级时被自动更新。
-
示例:
sudo apt-mark hold nginx
(2)查看锁定状态
-
命令:
apt-mark showhold
-
作用:列出当前被锁定的软件包。
(3)解除锁定
-
命令:
sudo apt-mark unhold <软件包名称>
-
作用:取消软件包的锁定状态,允许其正常升级。
-
示例:
sudo apt-mark unhold nginx
sudo apt autoremove
- **作用**:删除因依赖关系自动安装但已不再需要的软件包。
-
-
查找软件包
(1)搜索软件包
-
命令:
apt search <关键词>
-
作用:根据名称或描述搜索软件包。
-
示例:
apt search netstat
(2)查看软件包详细信息
-
命令:
apt show <软件包名称>
-
作用:显示软件包的详细信息(版本、依赖、描述等)。
-
示例:
apt show nginx
(3)列出已安装的软件包
-
命令:
apt list --installed
-
作用:列出当前系统中所有已安装的软件包。
-
示例:
apt list --installed | grep firefox
-
-
安装指定版本的软件包
步骤 1:查看可用版本
-
命令:
apt-cache policy <软件包名称>
-
作用:列出软件包的所有可用版本及来源。
-
示例:
apt-cache policy nginx
输出示例:
nginx: Installed: (none) Candidate: 1.18.0-0ubuntu1 Version table: 1.18.0-0ubuntu1 500 500 http://archive.ubuntu.com/ubuntu focal/main amd64 Packages 1.17.10-0ubuntu1 500 500 http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages
步骤 2:安装指定版本
-
命令:
sudo apt install <软件包名称>=<版本号>
-
注意:版本号必须与
apt-cache policy
中列出的版本完全一致。 -
示例:
sudo apt install nginx=1.17.10-0ubuntu1
-
-
锁定软件包版本(防止自动升级)
(1)锁定版本
-
命令:
sudo apt-mark hold <软件包名称>
-
作用:标记软件包为“锁定”,防止其在系统升级时被自动更新。
-
示例:
sudo apt-mark hold nginx
(2)查看锁定状态
-
命令:
apt-mark showhold
-
作用:列出当前被锁定的软件包。
(3)解除锁定
-
命令:
sudo apt-mark unhold <软件包名称>
-
作用:取消软件包的锁定状态,允许其正常升级。
-
示例:
sudo apt-mark unhold nginx
-