Day08_linux指令补充
是 Linux 系统中一款强大的调试和诊断工具,用于跟踪进程与内核之间的系统调用(system call)和信号传递。是 Linux/Unix 系统中一款强大的二进制文件分析工具,主要用于查看目标文件(object file)、可执行文件、共享库等二进制文件的内部结构和信息。是 Linux 系统中用于查看内核环形缓冲区(kernel ring buffer)内容的命令,主要用于显示系统启动信息和内
信息查看
`ls`/`ll` 当前目录下的文件查看 `tree` 查看目录结构 `file` 文件类型等信息查看 `stat` 文件元数据查看 `id` 查看当前用户信息 `who`/`w` 当前登录的用户信息 `ps` 查看当前系统进程 `ipcs` 查看IPC进程间通信机制信息 `top`进程监控 `df` 查看磁盘分区情况 `ls /dev/sd*` `ip a` 查看网络信息 `ifconfig` 需要安装 `sudo apt install net-tools` `which` 查看可执行文件的完整路径
内核相关
dd-数据烧录
dd是 Linux/Unix 系统中一个功能强大的命令行工具,主要用于数据转换和复制。它可以在文件、设备(如硬盘、U盘)、管道之间直接读写数据,支持按指定块大小和数量进行操作,常用于备份、克隆、创建启动盘等场景。基本语法
dd if=输入文件/设备 of=输出文件/设备 [选项]
if:指定输入源(input file),可以是普通文件、设备文件(如/dev/sda)或管道of:指定输出目标(output file),同上常用选项
bs=<字节数>:设置块大小(block size),如bs=4M表示每块4兆字节count=<块数>:指定复制的块数量,与bs结合控制总数据量(总大小=bs×count)skip=<块数>:从输入源跳过指定块数后开始读取seek=<块数>:在输出目标跳过指定块数后开始写入status=progress:显示复制进度(部分版本支持)conv=<转换参数>:数据转换选项,如conv=fsync强制写入磁盘,conv=noerror忽略错误实用示例
创建启动盘(将ISO镜像写入U盘)
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress(注意:
/dev/sdb需替换为实际U盘设备名,操作前确保数据已备份)备份磁盘分区
sudo dd if=/dev/sda1 of=partition_backup.img bs=1G status=progress(将
/dev/sda1分区完整备份为镜像文件)从备份恢复分区
sudo dd if=partition_backup.img of=/dev/sda1 bs=1G status=progress创建指定大小的空文件(如1GB测试文件)
dd if=/dev/zero of=testfile bs=1G count=1(
/dev/zero是特殊设备,会生成无限的空字节)克隆整个硬盘到另一个硬盘
sudo dd if=/dev/sda of=/dev/sdb bs=4M status=progress(需确保目标硬盘容量不小于源硬盘)
擦除磁盘数据(用随机数据覆盖)
sudo dd if=/dev/urandom of=/dev/sdb bs=1M status=progress(
/dev/urandom生成随机数据,用于彻底清除数据)注意事项
dd操作具有危险性,若of指定错误(如误写系统盘)可能导致数据丢失,务必仔细核对设备名- 执行涉及磁盘的操作通常需要 root 权限(
sudo)- 大文件复制时,合理设置
bs大小可提高效率(一般建议 4M~64M)- 中断操作可使用
Ctrl+C,但可能导致目标文件/设备不完整- 部分老旧系统的
dd不支持status=progress,可通过watch -n 1 pkill -USR1 dd查看进度
dd被称为"磁盘毁灭者"(disk destroyer),因其强大的直接读写能力,使用时需格外谨慎,但同时也是系统管理和数据处理中不可或缺的工具。
lsmod-内核模块状态查看
`lsmod` 是 Linux 系统中用于显示当前已加载内核模块状态的命令。 它的作用是列出所有已加载到内核中的模块及其相关信息,包括: - 模块名称(Module) - 模块大小(Size) - 正在使用该模块的进程数或其他模块数(Used by)
insmod -手动加载模块
insmod是 Linux 系统中用于手动加载内核模块(kernel module)的命令。它可以将编译好的内核模块(通常是.ko格式的文件)加载到运行中的内核中,从而为系统添加新功能或驱动支持。insmod /path/to/module.ko特点说明
- 需要管理员权限:加载内核模块会影响系统内核,因此必须使用
root用户或通过sudo执行- 需指定完整路径:与
modprobe不同,insmod必须提供模块文件的完整路径- 不自动处理依赖:如果要加载的模块依赖于其他模块,需要手动先加载依赖模块
- 模块格式:通常加载的是
.ko(Kernel Object)格式的编译好的模块文件
dmesg -查看内核启动信息
dmesg是 Linux 系统中用于查看内核环形缓冲区(kernel ring buffer)内容的命令,主要用于显示系统启动信息和内核运行过程中产生的各种消息。主要功能
- 显示系统启动时的硬件检测信息
- 展示内核模块加载 / 卸载的记录
- 显示设备驱动相关的错误和警告
- 记录系统运行中的重要事件(如磁盘挂载、网络接口状态变化等)
常用选项
c:显示缓冲区内容后清空缓冲区w:持续监控并显示新的内核消息(类似实时日志)T:将时间戳转换为人类可读的本地时间格式L:使用彩色输出区分不同级别的消息H:以人类可读的格式显示(自动处理单位转换)
strace-进程调试和诊断工具
strace是 Linux 系统中一款强大的调试和诊断工具,用于跟踪进程与内核之间的系统调用(system call)和信号传递。它能记录进程执行的每一个系统调用、传递的参数、返回值以及接收的信号,帮助开发者理解程序的底层行为。基本用法
strace [选项] 命令/程序名常用选项
跟踪指定进程
strace -p 1234 # 跟踪PID为1234的进程输出到文件
strace -o output.txt ./myprogram # 将跟踪结果保存到文件统计系统调用次数
strace -c ./myprogram # 执行后显示各系统调用的统计信息(次数、耗时等)跟踪特定系统调用
strace -e open,read ./myprogram # 只跟踪open和read系统调用 strace -e trace=file ./myprogram # 跟踪所有与文件操作相关的系统调用显示时间信息
strace -t ./myprogram # 每条记录前显示时间(精确到秒) strace -tt ./myprogram # 精确到微秒 strace -T ./myprogram # 显示每个系统调用的耗时跟踪子进程
strace -f ./myprogram # 跟踪主进程及其创建的所有子进程实用示例
查看程序打开了哪些文件:
strace -e open,openat,close ./myprogram分析程序的网络相关系统调用:
strace -e socket,connect,sendto,recvfrom ./network_app调试程序为何卡住(查看最后执行的系统调用):
strace -p 1234 # attach到卡住的进程,观察是否在等待某个系统调用返回统计程序的系统调用开销:
strace -c ./myprogram # 执行后会显示各系统调用的调用次数、耗时占比等应用场景
- 诊断程序异常(如崩溃、卡顿、权限问题)
- 分析程序的资源使用(文件、网络、内存等)
- 理解程序的执行流程(尤其对没有源码的程序)
- 调试系统调用相关的错误(如
Permission denied原因)注意事项
- 跟踪进程会增加其运行开销,可能影响性能敏感程序的行为
- 普通用户只能跟踪自己拥有的进程,跟踪系统进程需要 root 权限
- 输出内容可能非常庞大,建议结合过滤选项(
e)或输出到文件分析- 对于多线程程序,可使用
f选项跟踪所有线程
strace是排查程序底层问题的利器,尤其在没有源代码或需要分析程序与系统交互细节时非常有用。通过分析其输出,可以深入了解程序的行为模式和潜在问题。
taskset-查询进程 CPU 亲和性
taskset是 Linux 系统中用于设置或查询进程进程的 CPU 亲和性(CPU affinity)的命令工具。CPU 亲和性允许将进程绑定到特定的 CPU 核心上运行,从而优化系统性能,尤其适用于多核心处理器环境。基本功能
- 查看进程当前绑定的 CPU 核心
- 将进程绑定到一个或多个特定的 CPU 核心
- 启动新进程时指定其运行的 CPU 核心
常用语法
# 查看进程的CPU亲和性 taskset -p <进程PID> # 设置已有进程的CPU亲和性 taskset -p <CPU掩码> <进程PID> # 启动新进程并指定CPU亲和性 taskset <CPU掩码> <命令/程序>CPU 掩码说明
CPU 亲和性通过掩码(mask) 表示,每个 bit 代表一个 CPU 核心(从 0 开始计数):
0x1(二进制0001):绑定到 CPU 00x2(二进制0010):绑定到 CPU 10x3(二进制0011):绑定到 CPU 0 和 CPU 10xf(二进制1111):绑定到 CPU 0~3也可以用
-c选项直接指定核心编号(更直观):
taskset -c 0,1 <命令>:绑定到 CPU 0 和 1taskset -c 2-4 <命令>:绑定到 CPU 2、3、4实用示例
查看进程的 CPU 亲和性:
taskset -p 1234 # 查看PID为1234的进程绑定的CPU核心将进程绑定到 CPU 0:
sudo taskset -p 0x1 1234 # 用掩码方式 # 或 sudo taskset -pc 0 1234 # 用-c选项更直观将进程绑定到 CPU 1 和 2:
sudo taskset -pc 1,2 1234启动程序时绑定到 CPU 3:
taskset -c 3 ./myprogram应用场景
- 性能优化:将关键进程绑定到独立 CPU 核心,避免与其他进程争夺资源
- 实时系统:确保实时进程在固定 CPU 上运行,减少调度延迟
- 多核调试:分析程序在特定核心上的运行行为
- 负载均衡:手动分配进程到不同核心,避免单一核心过载
注意事项
- 修改进程的 CPU 亲和性通常需要 root 权限(
sudo)- 绑定过多进程到同一核心可能导致性能下降,需合理分配
- 对于多线程程序,可结合
pthread_setaffinity_np函数在代码中设置线程亲和性
taskset是多核系统性能调优的实用工具,通过合理设置 CPU 亲和性,可以显著提升关键应用的响应速度和稳定性。
objdump -二进制文件分析
objdump是 Linux/Unix 系统中一款强大的二进制文件分析工具,主要用于查看目标文件(object file)、可执行文件、共享库等二进制文件的内部结构和信息。它常被用于底层开发、调试和逆向工程分析。核心功能
- 查看二进制文件的汇编代码(反汇编)
- 分析文件的段(section)和节头(header)信息
- 显示符号表(函数名、变量等)
- 查看重定位表、动态链接信息等
常用选项及示例
反汇编可执行代码(最常用)
objdump -d /bin/ls # 对ls命令的可执行段进行反汇编反汇编并显示源代码(需编译时带 - g 调试信息)
objdump -S -g my_program # 混合显示源代码和汇编代码查看符号表
objdump -t a.out # 显示可执行文件的符号表 objdump -T /lib64/libc.so.6 # 显示共享库的动态符号表查看段头信息
objdump -h a.out # 显示各段的大小、偏移量等信息显示全部头部信息
objdump -x a.out # 显示文件的所有头部信息(综合信息)查看动态链接信息
objdump -p /usr/bin/python3 # 显示动态库依赖等信息以 Intel 格式反汇编(默认是 AT&T 格式)
objdump -d -M intel my_program # 生成Intel风格的汇编代码
nm二进制分析指令
Linux 系统中一个用于分析二进制文件(如可执行文件、目标文件
.o、静态库.a、动态库.so等)的命令行工具,其核心功能是列出文件中的符号表(symbol table)信息二进制文件中的 “符号” 指的是代码或数据的标识,包括:
- 函数名(如
main、printf)- 全局变量名(如
g_var)- 静态变量名(文件内可见的变量)
- 外部引用的符号(如调用其他库中的函数)等。
nm命令通过解析二进制文件的符号表,展示这些符号的地址、类型、名称等信息,常用于调试、分析程序链接问题或逆向工程。
mknod创建特殊文件
mknod是 Linux 系统中用于创建特殊文件(设备文件)的命令,主要用于创建字符设备文件和块设备文件,这些文件通常位于/dev目录下,用于与硬件设备进行交互。基本语法
mknod [选项] 文件名 类型 [主设备号 次设备号]主要参数说明
- 类型:指定设备文件的类型
b:块设备文件(如硬盘、U 盘等,以块为单位读写)c或u:字符设备文件(如键盘、鼠标、串口等,以字符为单位读写)- 主设备号和次设备号:
- 主设备号:标识设备类型(如硬盘通常是 8)
- 次设备号:标识同一类型中的具体设备
- 常用选项:
m:指定创建文件的权限(类似chmod的权限表示法)
网络相关
netstat-查看网络状态
netstat是 Linux/Unix 系统中用于查看网络状态的命令行工具,可显示网络连接、路由表、接口统计、伪装连接和多播成员等信息。它是网络调试和监控的常用工具。基本用法
netstat [选项]常用选项及功能
显示所有连接
netstat -a # 显示所有活跃的网络连接和监听端口显示 TCP 连接
netstat -t # 仅显示TCP协议的连接显示 UDP 连接
netstat -u # 仅显示UDP协议的连接显示监听状态的端口
netstat -l # 只显示处于监听状态的端口显示进程 ID 和程序名
netstat -p # 显示每个连接对应的进程ID和程序名称(需要root权限)以数字形式显示地址和端口
netstat -n # 不进行DNS解析,直接显示IP地址和端口号,速度更快显示路由表
netstat -r # 显示内核路由表,类似route命令显示网络接口统计信息
netstat -i # 显示各网络接口的收发数据包统计实用组合示例
查看所有监听端口及对应的进程:
sudo netstat -tulpn #(t-TCP, u-UDP, l- 监听,p- 进程,n- 数字形式)查看当前所有 TCP 连接:
netstat -tan查看特定端口的连接情况(例如 80 端口):
netstat -tuln | grep :80注意事项
- 在部分 Linux 发行版中,
netstat已被ss命令替代(ss性能更好,推荐优先使用)- 完整的选项说明可通过
man netstat查看- 某些选项(如
p)需要 root 权限才能显示完整信息
netstat适合快速了解系统的网络连接状态、排查端口占用问题或分析网络流量走向。
tcpdump-数据包捕获和分析工具
tcpdump是 Linux/Unix 系统中一款强大的网络数据包捕获和分析工具,常用于网络故障排查、流量分析和协议调试。它能够实时捕获网络接口上的数据包,并以人类可读的格式展示其内容。基本用法
tcpdump [选项] [过滤条件]常用选项
指定网络接口
tcpdump -i eth0 # 捕获eth0接口的数据包 tcpdump -i any # 捕获所有接口的数据包显示详细信息
tcpdump -v # 详细输出 tcpdump -vv # 更详细输出 tcpdump -vvv # 最详细输出保存捕获的数据包
tcpdump -w capture.pcap # 将数据包保存到文件(可用于Wireshark分析)读取保存的数据包文件
tcpdump -r capture.pcap # 从文件中读取并分析数据包限制捕获数量
tcpdump -c 100 # 只捕获100个数据包不进行域名解析
tcpdump -n # 显示IP地址而非域名 tcpdump -nn # 显示IP地址和端口号(不解析服务名)常用过滤条件示例
按协议过滤
tcpdump tcp # 只捕获TCP数据包 tcpdump udp # 只捕获UDP数据包 tcpdump icmp # 只捕获ICMP数据包(如ping)按IP地址过滤
tcpdump host 192.168.1.1 # 捕获与该IP相关的所有数据包 tcpdump src 192.168.1.1 # 捕获源IP为该地址的数据包 tcpdump dst 192.168.1.1 # 捕获目标IP为该地址的数据包按端口过滤
tcpdump port 80 # 捕获80端口的数据包(HTTP) tcpdump port 443 # 捕获443端口的数据包(HTTPS) tcpdump src port 22 # 捕获源端口为22的数据包(SSH)组合条件过滤
tcpdump tcp port 80 and host 192.168.1.1 # 捕获TCP协议、80端口且与该IP相关的数据包 tcpdump not port 22 # 捕获非22端口的数据包捕获特定网络的数据包
tcpdump net 192.168.1.0/24 # 捕获该网段内的所有数据包实用场景
- 诊断网络连接问题(如丢包、延迟)
- 分析应用程序的网络交互
- 检测异常流量或网络攻击
- 学习和理解网络协议工作原理
注意事项
- 通常需要 root 权限才能执行(
sudo tcpdump)- 大量数据包捕获可能影响系统性能
- 复杂过滤规则可提高分析效率,减少无关数据
- 保存的
.pcap文件可导入 Wireshark 进行可视化分析
tcpdump的过滤语法非常强大,支持多种逻辑组合和协议字段筛选,通过man tcpdump可查看完整的过滤规则说明。
更多推荐


所有评论(0)