1、主分区、扩展分区和逻辑分区
主分区(Primary Partition)
主分区就是包含操作系统启动所必需的文件和数据的硬盘分区,要在硬盘上安装操作系统,则该硬盘必须要有一个主分区,而且其分区的数量可以是1~3个。主分区可以直接被操作系统识别和使用,通常用于安装引导程序或系统文件。
扩展分区(Extended Partition)
扩展分区是为了突破主分区数量限制而设计的特殊分区类型。一块硬盘只能有一个扩展分区,它不能直接存储数据,而是作为逻辑分区的容器。扩展分区本身不占用分区号(如sda1、sda2),但会占用一个主分区名额(即最多3个主分区+1个扩展分区)。
逻辑分区(Logical Partition)
逻辑分区必须建立在扩展分区内部,数量理论上无限制(实际受系统或工具约束)。逻辑分区的编号从5开始(如sda5、sda6),即使主分区未占满1-4的编号。逻辑分区用于存储数据或安装非引导操作系统。
关键区别
- 数量限制:主分区≤4,扩展分区≤1,逻辑分区无硬性限制。
- 功能:主分区和逻辑分区可直接存储数据,扩展分区仅为逻辑分区提供空间。
- 引导能力:大多数系统需从主分区引导,逻辑分区通常不能作为启动分区。
查询分区信息的命令
lsblk
列出所有块设备信息,包括磁盘和分区。默认显示树状结构,清晰展示磁盘、分区及挂载点关系。常用选项:
-f:显示文件系统类型-o:自定义输出列(如NAME,FSTYPE,SIZE,MOUNTPOINT)
示例:
bash
lsblk -f
fdisk -l
查看磁盘分区表及分区详细信息,需 root 权限。输出包含分区起始扇区、大小、类型等。适用于传统 MBR 分区表。
示例:
bash
sudo fdisk -l
df -h
显示已挂载分区的磁盘空间使用情况(人类可读格式)。输出包含文件系统、总大小、已用空间及挂载点。
示例:
bash
df -h
cat /proc/partitions
直接读取内核提供的分区信息,内容简洁但缺少细节。输出包含主设备号、次设备号、块数和分区名。
示例:
bash
cat /proc/partitions
2、swap交换分区
swap分区是Linux系统中的虚拟内存空间,当物理内存(RAM)不足时,系统会将部分内存数据临时存储到swap分区,避免因内存耗尽导致程序崩溃。它适用于内存有限的场景,但频繁使用swap会降低性能(因磁盘速度远慢于内存)。
创建swap分区的方法
方法1:使用独立分区
-
通过
fdisk或gdisk工具创建一个新分区,类型设置为Linux swap(代码82)。 -
格式化分区为swap:
bashmkswap /dev/sdXN # 替换为实际分区设备名 -
启用swap:
bashswapon /dev/sdXN
方法2:使用swap文件
-
生成指定大小的文件(如1GB):
bashdd if=/dev/zero of=/swapfile bs=1M count=1024 -
设置权限并格式化:
bashchmod 600 /swapfile mkswap /swapfile -
启用swap文件:
bashswapon /swapfile
永久生效配置
编辑/etc/fstab文件,添加以下行(以swap文件为例):
plaintext
/swapfile none swap sw 0 0
调整swap使用倾向
修改/proc/sys/vm/swappiness值(范围0-100,默认60)。数值越高,系统越倾向于使用swap:
bash
echo 10 > /proc/sys/vm/swappiness # 临时生效
永久生效需在/etc/sysctl.conf中添加:
plaintext
vm.swappiness=10
查看swap状态
bash
free -h # 查看内存和swap使用情况
swapon --show # 显示当前启用的swap设备
删除swap分区或文件
-
禁用swap:
bashswapoff /dev/sdXN # 或 swapoff /swapfile -
删除文件或分区,并移除
/etc/fstab中的对应条目。
注意:生产环境中建议根据实际内存负载调整swap大小,通常为RAM的1-2倍(内存较大时可减少比例)。
3、分区格式
Linux 系统支持多种分区格式,每种格式适用于不同场景。以下是常见的分区格式及其特点:
ext4
- 特点:ext4 是 Linux 默认的文件系统,具有日志功能,支持大文件和大容量存储。
- 适用场景 :适合大多数 Linux 系统分区,如根目录
/和/home。 - 优势:稳定性高,兼容性好,支持文件系统加密和快照。
XFS
- 特点:高性能日志文件系统,特别适合处理大文件和高并发读写。
- 适用场景:适用于需要高性能的场景,如数据库存储或大规模文件服务器。
- 优势:支持动态扩展,延迟低,适合企业级应用。
Btrfs
- 特点:支持写时复制(CoW)、快照、压缩和 RAID 功能。
- 适用场景:适合需要高级功能的用户,如数据快照或存储池管理。
- 优势:支持子卷管理,数据完整性高,适合长期存储。
swap
- 特点:交换分区用于虚拟内存,当物理内存不足时使用磁盘空间作为扩展。
- 适用场景:必须为 Linux 系统分配,尤其是在内存有限的机器上。
- 优势:防止系统因内存不足而崩溃,提升多任务处理能力。
FAT32/NTFS
- 特点:Windows 兼容文件系统,FAT32 支持小文件,NTFS 支持大文件。
- 适用场景:用于与 Windows 系统共享数据的分区。
- 优势:跨平台兼容性好,适合移动存储设备。
分区工具推荐
- fdisk:命令行工具,适合手动分区。
- GParted:图形化工具,操作直观。
- parted:支持 GPT 分区表,适合大容量磁盘。
分区建议
- 根分区
/:建议使用 ext4 或 XFS,容量至少 20GB。 - /home 分区:建议单独分区,格式为 ext4 或 Btrfs。
- swap 分区:容量通常为物理内存的 1-2 倍,但不超过 8GB。
通过合理选择分区格式和工具,可以优化 Linux 系统的性能和稳定性。
4、Linux 常用命令
文件和目录操作
ls:列出目录内容。
-l 显示详细信息,-a 显示隐藏文件。
cd:切换目录。
cd ~ 返回家目录,cd .. 返回上级目录。
pwd:显示当前工作目录路径。
mkdir:创建目录。
mkdir -p dir1/dir2 递归创建多级目录。
rm:删除文件或目录。
-r 递归删除目录,-f 强制删除。
cp:复制文件或目录。
-r 复制目录,-i 交互式确认覆盖。
mv:移动或重命名文件/目录。
touch:创建空文件或更新文件时间戳。
文件查看和编辑
cat:显示文件内容。
-n 显示行号。
less 或 more:分页查看文件内容。
head:显示文件开头部分。
head -n 10 file 显示前10行。
tail:显示文件末尾部分。
tail -f file 实时追踪文件更新。
vim 或 nano:文本编辑器。
权限管理
chmod:修改文件权限。
chmod 755 file 设置权限为 rwxr-xr-x。
chown:修改文件所有者。
chown user:group file。
chgrp:修改文件所属组。
系统信息
uname -a:显示系统信息(内核版本等)。
df -h:查看磁盘空间使用情况。
du -sh dir:查看目录占用空间。
free -h:查看内存使用情况。
top 或 htop:实时监控系统资源。
进程管理
ps:查看进程状态。
ps aux 显示所有进程。
kill:终止进程。
kill -9 PID 强制终止。
systemctl:管理系统服务。
systemctl start/stop/restart service。
网络操作
ifconfig 或 ip addr:查看网络接口信息。
ping:测试网络连通性。
netstat 或 ss:查看网络连接状态。
wget 或 curl:下载文件。
scp:远程复制文件。
scp file user@host:/path。
压缩和解压
tar:打包或解压文件。
tar -czvf archive.tar.gz dir 压缩,tar -xzvf archive.tar.gz 解压。
zip 和 unzip:处理 .zip 文件。
用户管理
useradd 和 userdel:添加/删除用户。
passwd:修改用户密码。
su 或 sudo:切换用户或提权执行命令。
查找和过滤
find:查找文件。
find /path -name "*.txt"。
grep:文本搜索。
grep "pattern" file。
awk 和 sed:高级文本处理工具。
其他实用命令
history:查看命令历史记录。
alias:创建命令别名。
crontab -e:编辑定时任务。
ln -s source link:创建软链接。
date:显示或设置系统时间。
shutdown:关机或重启。
shutdown -h now 立即关机,shutdown -r now 立即重启。
5、状态查询命令
系统状态监控
top 或 htop:实时查看系统资源占用情况(CPU、内存、进程等)。htop 提供更友好的交互界面。
vmstat 1:每秒输出一次系统性能数据(进程、内存、交换区、IO、CPU等)。
free -h:查看内存和交换分区使用情况,-h 参数以人类可读格式显示。
df -h:显示磁盘空间使用情况,-h 参数以 GB/MB 为单位。
iostat -x 1:监控磁盘 I/O 和 CPU 使用情况,-x 显示扩展统计信息。
进程与服务排查
ps aux 或 ps -ef:列出所有进程的详细信息,包括 PID、CPU/内存占用等。
pstree -p:以树状结构显示进程关系,-p 显示 PID。
systemctl status <服务名>:查看系统服务的运行状态和日志。
journalctl -u <服务名>:查看指定服务的 systemd 日志,支持 -f 实时跟踪。
网络问题诊断
ping <IP或域名>:测试网络连通性和延迟。
traceroute <IP或域名>:追踪数据包路径,排查网络延迟或中断问题。
netstat -tulnp 或 ss -tulnp:查看监听的端口及对应进程,-p 显示进程信息。
tcpdump -i eth0 port 80:抓取指定网卡和端口的网络数据包,需 root 权限。
iftop 或 nethogs:实时监控网络流量,nethogs 可按进程排序。
日志分析
tail -f /var/log/syslog:实时跟踪系统日志(Ubuntu/Debian)。
tail -f /var/log/messages:实时跟踪系统日志(RHEL/CentOS)。
grep "error" /var/log/nginx/error.log:在日志中筛选关键字。
dmesg | grep -i error:查看内核日志中的错误信息。
性能分析工具
strace -p <PID>:跟踪进程的系统调用,排查卡死或异常。
perf top:实时显示系统性能热点(需安装 perf 工具)。
sar -u 1 3:查看 CPU 使用率历史数据(需安装 sysstat)。
lsof -i :80:列出占用 80 端口的文件和进程信息。
硬件信息
lscpu:查看 CPU 架构和核心数。
lsblk:列出块设备(磁盘、分区)信息。
lspci -v:查看 PCI 设备详细信息(如显卡、网卡)。
dmidecode:获取 BIOS 和硬件主板信息(需 root 权限)。
6、使用 Valgrind 和 pstack 进行调试
Valgrind 是一个用于内存调试、内存泄漏检测和性能分析的工具,而 pstack 是一个用于打印正在运行的进程的堆栈跟踪的工具。结合使用这两个工具可以帮助开发者更高效地定位和解决问题。
Valgrind 的基本用法
Valgrind 主要用于检测内存泄漏、非法内存访问等问题。以下是常见的使用方法:
valgrind --leak-check=full --show-leak-kinds=all ./your_program
--leak-check=full 选项会显示详细的泄漏信息,--show-leak-kinds=all 会展示所有类型的内存泄漏。
pstack 的基本用法
pstack 可以打印正在运行的进程的堆栈信息,适用于调试多线程程序或分析程序卡死的情况。使用方式如下:
pstack <pid>
其中 <pid> 是目标进程的进程 ID。
结合 Valgrind 和 pstack 进行调试
当程序在 Valgrind 下运行时出现问题时,可以通过 pstack 获取当前堆栈信息,进一步分析问题所在。
启动程序时使用 Valgrind:
valgrind --tool=memcheck ./your_program
在程序运行过程中,使用 ps 命令查找进程 ID:
ps aux | grep your_program
获取到进程 ID 后,使用 pstack 打印堆栈信息:
pstack <pid>
示例场景
假设程序在 Valgrind 下运行时出现段错误(Segmentation Fault),可以通过以下步骤定位问题:
- 使用 Valgrind 运行程序,记录错误信息。
- 在程序崩溃时,使用 pstack 获取堆栈信息。
- 结合 Valgrind 的输出和 pstack 的堆栈信息,分析问题根源。
注意事项
- Valgrind 会显著降低程序运行速度,不适合用于性能测试。
- pstack 需要目标进程处于运行状态,如果程序已经崩溃退出,则无法使用。
- 在某些系统上,pstack 可能需要安装额外的调试工具包(如
gdb)。
通过合理使用 Valgrind 和 pstack,可以更高效地定位和解决程序中的内存问题和性能问题。
7、Shell脚本基础语法规范
Shell脚本通常以.sh为扩展名,但扩展名并非强制要求。脚本文件需要具备可执行权限才能运行。语法规范包括清晰的代码结构、适当的缩进以及一致的命名规则。
脚本文件格式
脚本文件通常以解释器声明开头,后跟脚本内容。文件格式应保持简洁,避免冗余代码。建议使用UTF-8编码以确保兼容性。
首行解释器声明(#!/bin/bash)
首行声明指定脚本使用的解释器路径。例如:
bash
#!/bin/bash
这一行称为shebang,告诉系统使用/bin/bash来执行脚本。其他常见解释器包括#!/bin/sh或#!/usr/bin/env bash。
变量定义
变量定义时无需声明类型,直接赋值即可。变量名区分大小写,建议使用大写字母表示常量或环境变量。
自定义变量:
bash
VAR_NAME="value"
系统环境变量:
bash
echo $PATH
只读变量:
bash
readonly VAR_NAME="value"
变量调用
调用变量时使用$符号:
bash
echo $VAR_NAME
或使用花括号明确变量边界:
bash
echo ${VAR_NAME}
字符串处理
字符串拼接:
bash
STR1="Hello"
STR2="World"
RESULT="$STR1 $STR2"
字符串长度:
bash
echo ${#STR1}
子字符串提取:
bash
echo ${STR1:1:3}
注释规范
单行注释以#开头:
bash
# This is a comment
多行注释可通过<<实现:
bash
<<COMMENT
This is a
multi-line comment
COMMENT
脚本运行权限与执行方式
赋予脚本可执行权限:
bash
chmod +x script.sh
执行脚本:
bash
./script.sh
或通过解释器直接运行:
bash
bash script.sh
if-else 条件判断
适用于根据条件执行不同分支的自动化任务。基础语法如下:
python
if condition1:
# 条件1成立时执行
elif condition2:
# 条件2成立时执行
else:
# 其他情况执行
示例:根据文件类型执行不同操作
python
file_type = "csv"
if file_type == "csv":
process_csv()
elif file_type == "json":
process_json()
else:
print("Unsupported format")
多条件判断
通过逻辑运算符(and/or/not)组合多个条件。
python
if temperature > 30 and humidity < 70:
start_cooling()
elif temperature < 10 or is_winter:
start_heating()
for 循环遍历
适用于批量处理列表、字典等可迭代对象。
python
for item in iterable:
# 对每个item执行操作
示例:批量重命名文件
python
files = ["file1.txt", "file2.log"]
for filename in files:
new_name = filename.replace(".", "_backup.")
rename_file(filename, new_name)
while 条件循环
在满足条件时重复执行,需注意避免无限循环。
python
while condition:
# 条件为True时持续执行
示例:监控进程直到完成
python
while not process_completed():
time.sleep(5)
check_status()
脚本传参
通过 sys.argv 或 argparse 模块接收外部参数,增强脚本灵活性。
基础传参示例:
python
import sys
script_name = sys.argv[0] # 脚本名
first_arg = sys.argv[1] # 第一个参数
进阶示例(argparse):
python
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--input", help="Input file path")
args = parser.parse_args()
print(f"Processing {args.input}")
自动化任务逻辑设计
- 输入处理:通过传参或配置文件获取输入。
- 核心逻辑:结合条件判断与循环实现批量操作。
- 异常处理 :使用
try-except捕获运行时错误。
python
try:
for task in task_list:
execute_task(task)
except Exception as e:
log_error(e)
8、crontab定时任务原理
crontab是Linux/Unix系统中基于时间的任务调度工具,通过守护进程crond实现。其原理是周期性读取配置文件(用户级/var/spool/cron/或系统级/etc/crontab),检查任务时间条件是否匹配当前时间,匹配则执行对应命令。
配置格式(分/时/日/月/周)
基本格式为:
* * * * * command_to_execute
字段含义及取值范围:
- 分钟(0-59)
- 小时(0-23)
- 日(1-31)
- 月(1-12)
- 周(0-7,0和7均代表周日)
特殊符号说明:
*:任意值,:分隔多个值(如1,3,5)-:范围(如1-5)/:间隔频率(如*/2表示每2单位)
常用定时场景配置
-
每天凌晨3点执行备份脚本
0 3 * * * /path/to/backup.sh
-
每5分钟检查一次服务状态
*/5 * * * * /path/to/check_service.sh
-
每周一上午8点发送报告
0 8 * * 1 /path/to/send_report.sh
任务启停与日志排查
- 启停命令:
- 编辑任务:
crontab -e - 列出任务:
crontab -l - 删除任务:
crontab -r
- 编辑任务:
- 日志路径:
- 系统日志:
/var/log/cron(CentOS/RHEL)或/var/log/syslog(Ubuntu) - 查看执行记录:
grep CRON /var/log/syslog
- 系统日志:
9、Linux开机自启基础原理
开机自启通过初始化系统实现(如systemd或SysVinit)。流程分为:
- 内核加载完成后启动
init进程(PID=1)。 init读取配置文件(如/etc/inittab或/etc/systemd/system),按运行级别(runlevel)或目标(target)启动服务。
局部自启脚本与系统服务自启差异
-
局部自启脚本
- 位置:
/etc/rc.local(需可执行权限) - 特点:简单但缺乏依赖管理,适合临时任务。
- 位置:
-
系统服务自启
- 位置:
/etc/systemd/system/或/usr/lib/systemd/system/ - 特点:支持依赖关系、状态监控,通过
systemctl enable service_name启用。
- 位置:
日志体系基础
Linux日志主要存储在/var/log/目录,关键日志文件:
- 系统日志:
/var/log/messages(CentOS)或/var/log/syslog(Ubuntu) - 认证日志:
/var/log/auth.log - 应用日志:如
/var/log/nginx/error.log
常用日志操作命令
tail实时刷新查看日志
bash
tail -f /var/log/syslog # -f参数实时跟踪文件变化
head查看日志头部
bash
head -n 20 /var/log/nginx/access.log # 显示前20行
grep过滤错误日志
bash
grep -i "error" /var/log/syslog # -i忽略大小写
grep -A 3 -B 2 "critical" /var/log/app.log # 显示匹配行前后内容