🌑linux笔记
type
status
date
slug
summary
tags
category
icon
password
Blocked by
Blocking
AI summary
我的linux学习笔记~
linux目录结构
目录 | 说明 |
/ | 根目录,只能包含目录,不能包含具体文件。 |
/bin | 存放可执行文件。很多命令就对应/bin目录下的某个程序,例如 ls、cp、mkdir。/bin目录对所有用户有效。 |
/dev | 硬件驱动程序。例如声卡、磁盘驱动等,还有如 /dev/null、/dev/console、/dev/zero、/dev/full 等文件。 |
/etc | 主要包含系统配置文件和用户、用户组配置文件。 |
/lib | 主要包含共享库文件,类似于Windows下的DLL;有时也会包含内核相关文件。 |
/boot | 系统启动文件,例如Linux内核、引导程序等。 |
/home | 用户工作目录(主目录),每个用户都会分配一个目录。 |
/mnt | 临时挂载文件系统。这个目录一般是用于存放挂载储存设备的挂载目录的,例如挂载CD-ROM的cdrom目录。 |
/proc | 操作系统运行时,进程(正在运行中的程序)信息及内核信息(比如cpu、硬盘分区、内存信息等)存放在这里。/proc目录伪装的文件系统proc的挂载目录,proc并不是真正的文件系统。 |
/tmp | 临时文件目录,系统重启后不会被保存。 |
/usr | /user目下的文件比较混杂,包含了管理命令、共享文件、库文件等,可以被很多用户使用。 |
/var | 主要包含一些可变长度的文件,会经常对数据进行读写,例如日志文件和打印队列里的文件。 |
/sbin | 和 /bin 类似,主要包含可执行文件,不过一般是系统管理所需要的,不是所有用户都需要。 |
/proc
在Linux系统中,
/proc
是一个虚拟文件系统(pseudo-filesystem),用于访问内核和系统信息。它并不占用实际的磁盘空间,而是直接由内核在内存中动态生成的。/proc
文件系统中的文件和目录提供了系统硬件状态、进程信息、内核配置等信息,允许用户和应用程序以文件的形式查看和操作系统内部的状态。/proc
文件系统的主要用途
- 查看系统信息:
/proc
文件系统中包含了大量系统信息文件,例如:/proc/cpuinfo
:显示CPU的详细信息,包括型号、核心数量、时钟速度等。/proc/meminfo
:显示内存使用情况,包括总内存、可用内存、缓冲区和缓存等。/proc/version
:显示操作系统版本和内核版本的信息。/proc/uptime
:显示系统的运行时间和空闲时间。
- 进程信息:
- 每个正在运行的进程都有一个对应的目录,目录名就是进程的PID(进程ID)。这些目录包含了关于该进程的各种信息,例如:
/proc/<PID>/cmdline
:显示启动该进程时使用的命令行。/proc/<PID>/status
:显示进程的状态信息,包括内存使用、状态、用户ID、组ID等。/proc/<PID>/fd/
:包含进程打开的文件描述符链接,指向实际的文件、socket、管道等。
- 内核和系统配置:
/proc/sys/
目录中包含了一些系统配置参数,可以通过读写这些文件来动态修改内核参数。例如:/proc/sys/net/ipv4/ip_forward
:通过写入1
或0
来启用或禁用IP转发功能。/proc/sys/kernel/hostname
:可以读取或修改系统的主机名。
- 设备信息:
/proc
文件系统也提供了一些设备相关的信息,例如:/proc/devices
:列出系统中已注册的字符设备和块设备。/proc/interrupts
:显示系统中硬件中断的使用情况。/proc/diskstats
:提供关于磁盘I/O操作的统计信息
在Linux系统中,
/proc
是一个虚拟文件系统(pseudo-filesystem),用于访问内核和系统信息。它并不占用实际的磁盘空间,而是直接由内核在内存中动态生成的。/proc
文件系统中的文件和目录提供了系统硬件状态、进程信息、内核配置等信息,允许用户和应用程序以文件的形式查看和操作系统内部的状态。/etc/passswd
在系统登录时,系统会通过读取/etc/passwd文件中包含的用户名及其对应的UID来验证登录的用户身份。现代系统通常通过/etc/shadow来存储密码(/etc/passwd不包含密码字段),/etc/passwd中会将密码字段用”x”占位
/etc/passwd文件每一行都代表一个用户
/proc/uptime
第一个数字表示系统运行时长
第二个数字表示所有cpu的空闲时间累计之和
可以通过这两个数字,监控系统的稳定性和负载压力
/proc/meminfo
记录系统内存的使用情况,是观察系统内存资源的一个重要接口
- MemTotal:物理内存总量(单位:KB)
- MemFree:未使用的空闲内存。
- MemAvailable:可供新应用使用的内存。比 MemFree 更准确,因为它包含了可快速回收的缓存和缓冲区。
- Buffers:用于存储磁盘数据的缓冲区,占用的内存。
- Cached:用于缓存文件的内存量,可以加快文件的访问速度。
- SwapTotal:交换空间(swap)的总量。
- SwapFree:当前未使用的交换空间量。
文件存储结构
文件构成
大部分的Linux文件系统(如ext2、ext3)规定,一个文件由目录项、inode和数据块组成
- 目录项:包括文件名和inode节点号。
- Inode:又称文件索引节点,包含文件的基础信息以及数据块的指针。
- 数据块:包含文件的具体内容。
磁盘小知识
硬盘中最小的存储单元为扇区 (sector),每个sector存储512字节(0.5kB)
文件存取的最小单位是块(block),连续8个sector组装成一个block,既4KB
inode
查看某个文件时,会先从inode表中查出文件属性及数据存放点,再从数据块中读取数据
inode包含文件的元信息,具体来说有以下内容:
- 文件的字节数。
- 文件拥有者的User ID。
- 文件的Group ID。
- 文件的读、写、执行权限。
- 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
- 链接数,即有多少文件名指向这个inode。
- 文件数据block的位置。
除了文件名以外,所有文件信息都存在inode上
可以用stat命令,查看某个文件的inode信息:
权限字符
权限字符串
drwxr-xr-x
可以拆分为四个部分:- 第一个字符 (
d
):表示文件类型。 - -:表示普通文件。
d
:表示目录。l
:表示符号链接(软链接)。c
:表示字符设备文件(例如,终端设备)。b
:表示块设备文件(例如,磁盘)。
- 接下来的九个字符 (
rwxr-xr-x
):表示文件或目录的权限,分为三组,每组三个字符。 - 第一组 (
rwx
):所有者(user)的权限。 - 第二组 (
r-x
):同组用户(group)的权限。 - 第三组 (
r-x
):其他用户(others)的权限。
vim常用快捷键
进程管理
僵尸进程
是什么
- 指一个进程已结束,但他的父进程没有读取该子进程的终止状态,导致进程pid任然保留在系统的进程表中
- 僵尸进程已经结束运行,不会吃系统资源(内存、CPU等),但任然吃一个pid,过多的僵尸进程会导致系统pid被耗尽,从而导致无法创建新的进程
生命周期
- 子进程终止,向父进程发送一个信号,表示自己的任务已完成
- 父进程为读取子进程状态,没有用wait() 或 waitpid()获取子进程的退出状态,子进程变为僵尸进程
- 僵尸进程等待被回收,僵尸进程继续存在于进程表中,直到父进程读取起退出状态
如何解决
- 最理想的是 父进程中应该包含wait ()或waitpid() 的逻辑
- 重启父进程,其子进程也会被杀死,此时僵尸进程资源也会被回收
- 杀死父进程
htop
top
:实时显示系统的总体资源使用情况,包括CPU、内存、任务和进程。按q
退出。
htop
:与top
类似,但界面更友好,功能更强大(需要手动安装)。- CPU指标
- 内存和交换空间
- VIRT(virctual)虚拟内存大小
- RES(resident)常驻内存大小
- SHR(shared)共享内存大小
- SWAP:交换分区情况
- 进程状态
- PID
- USER进程所属用户
- priority优先级
- nice值,值越小,优先级越高
- Sate
- R:running
- S:sleeping
- Z:zombine
- T:stopped
- 系统整体信息
- tasks:显示系统中有多少任务和进程
- load average:显示系统的平均负载值,1min,5min,15min的平均负载
- 负载为 1 表示单核 CPU 在某一时间段内完全忙碌,没有空闲时间。
- 负载大于 1 表示系统中有超过一个进程在等待 CPU 资源,可能导致任务排队,进而影响系统性能。
- 负载小于 1 表示系统中 CPU 资源有空闲,任务能及时处理。
- uptime:心啊是系统启动后的运行时间
系统负载
系统负载数值通常通过三个时间段显示:1 分钟、5 分钟和 15 分钟的平均负载值。
监控和查询进程
- ps
- htop
终止进程
- kil
- killall
调整进程优先级
- nice
监控&调试
- strace
- lsof
管理服务
- systemctl
网络使用情况
nslookup
用于查询DNSss
查看当前所有的tcp连接
查看所有监听的端口
bmon
是一个带有图形化显示的网络带宽监控工具。
lsof(list opened files)
用于列出当前系统中所有打开的文件及其相关的进程
1. 检查哪些进程打开了特定文件
有时候你需要知道哪个进程正在使用某个文件,比如在删除或修改文件时发现“文件正在使用”或“设备繁忙”错误。这时可以使用:
2. 查看某个进程打开的所有文件
可以查看某个特定进程(通过PID或进程名)打开了哪些文件。适用于诊断进程的资源使用情况:
3. 查看特定端口号被哪个进程占用
当某个端口被占用,导致服务无法启动时,可以用
lsof
查看是哪个进程占用了端口:这个命令会列出所有使用端口
80
的进程。4. 显示网络连接和套接字信息
可以使用
lsof
来查看当前系统的网络连接情况,类似于netstat
或ss
命令。比如查看所有TCP连接:当前会话的文件描述符
系统文件描述符不够后,打进来的请求会直接abort,返回错误;不会阻塞等待
mac地址和ip地址的转换
- MAC地址 -> IP地址:通常较为复杂,需要依赖ARP缓存、DHCP服务器、或者网络扫描工具。
- IP地址 -> MAC地址:可以直接使用ARP协议获取。
ip→mac
mac→ip
通过
arp -a
查找在你的机器上列出所有已知的IP地址和它们对应的MAC地址:
你可以手动查找对应的MAC地址。这个方法适用于你已经和目标设备进行过通信,且它在你的ARP缓存中。
使用DHCP服务器日志
如果MAC地址是通过DHCP分配的,可以查看DHCP服务器的日志或管理界面,以找到对应的IP地址。DHCP服务器会记录MAC地址和分配的IP地址对。
使用网络扫描工具
如果你无法通过上述方法找到对应的IP地址,可以使用网络扫描工具,如
nmap
,来扫描网络,找出所有活动设备的IP地址和MAC地址对。例如,使用
nmap
进行局域网扫描:管道操作
假设你有一个日志文件
server.log
,你想查找其中包含 ERROR
的行,并将其中的 localhost
替换为 127.0.0.1
,然后保存到新的文件 errors_fixed.log
中,可以这样操作:这个命令先用
grep
查找包含 ERROR
的行,再用 sed
替换文本,最后将结果重定向到 errors_fixed.log
文件中。tee
在 Linux 中,
tee
命令用于同时读取标准输入并将其内容输出到标准输出和一个或多个文件。这意味着,tee
可以将命令的输出一边显示在终端,一边写入文件。其名字来源于水管“T形接头”的形状,它可以分流数据流到两个方向。基本用法
command
:需要执行的命令。
tee
:接受标准输入并将其写入标准输出和文件。
[选项]
:一些可选参数(如a
)。
[文件...]
:输出内容的目标文件。
常见选项
a
:追加模式,将输出追加到文件末尾,而不是覆盖文件。
i
:忽略中断信号(SIGINT
),通常是用户按Ctrl+C
时发出的信号。
示例
- 将命令输出保存到文件并在终端显示:
这个命令会执行
ls -l
,结果会同时显示在终端并保存到 output.txt
文件中。- 追加模式:
使用
-a
选项时,命令的输出会追加到 output.txt
文件的末尾,而不是覆盖现有内容。- 同时输出到多个文件:
这会将 "Hello, World!" 写入
file1.txt
和 file2.txt
,同时也显示在终端上。- 忽略中断信号:
使用
-i
选项时,如果用户在执行 some_command
时按 Ctrl+C
,tee
会忽略中断信号,继续处理其输出。tee 的实际应用场景
- 实时查看并记录日志:
你可以在查看命令的输出时,利用
tee
命令将它同时记录到日志文件中。
- 记录 sudo 执行的命令:
有时你想记录带有
sudo
的命令输出,这时可以用tee
:
总结
tee
命令非常有用,适用于需要同时查看和保存命令输出的情况。它在数据处理、调试、日志记录等场景下都广泛应用。查看端口占用
快速得知端口是否被占用
- -t表示TCP连接
- -u表示UDP连接
- -l表示显示监听状态的连接
- -n表示以数字形式显示滴哦值和端口号
如果想知道是哪一个进程占用了端口
查看系统的内存和cpu
free查看系统的内存
top实时监控
grep用于文本搜索
sed 用于文本处理
find 搜索文件
find是linux中用于搜索目录树中的文件或目录的命令,ta非常强大,支持基于文件名、类型、大小、权限、修改时间等多种条件进行文件搜索
常用选项
-type
标明文件类型
-name
标明文件名
-size
标明文件大小
-mtime
标明修改时间- +N表示修改时间在N天以前的
- -N表示查找修改时间在N天一内的
- N表示修改时间恰好在N天前的文件
-perm
标明权限
-group
标明文件组
-user
标明特定用户的所有者
常见使用案例
基本使用
执行命令
find
和 -exec
可以一起使用,在查找匹配文件后,执行指定命令其中
{}
表示占位符,\;
用来结束-exec
命令组合条件
find
默认为AND
逻辑,也可以使用 -o
表示OR
逻辑,!
表示逻辑非ps

stat的值有什么
R:Running or Runnable
S:sleeping可中断休眠
D:Uninterruptible sleep 不可中断的休眠,内核级别的操作
T:stopped
Z:zombie
X:dead
I:idle
go中的mutex
自旋 cpu
阻塞
top
这是在 Linux 系统中使用
top
命令输出的进程和系统状态信息。以下是每个部分的解析:第一部分:系统整体信息
- top: 当前运行的是
top
命令。
- 10:05:36: 当前系统时间。
- up 0 min: 系统已经运行的时间,这里显示为刚刚启动(0 分钟)。
- 2 users: 当前有两个用户登录到系统中。
- load average: 系统的负载平均值,分别是最近 1 分钟、5 分钟和 15 分钟的平均负载。负载值代表 CPU 的繁忙程度,通常接近 CPU 核心数的值时系统处于较高负载。
第二部分:任务统计
- Tasks: 系统中总共的进程数,这里是 101 个。
- 2 running: 当前有 2 个进程正在运行。
- 99 sleeping: 当前有 99 个进程处于睡眠状态,等待事件完成。
- 0 stopped: 没有被停止的进程。
- 0 zombie: 没有僵尸进程。
第三部分:CPU 使用率
- %Cpu(s): 各种状态下 CPU 的使用百分比:
- us (user space): 用户空间进程占用的 CPU 时间,这里是 0.6%。
- sy (system space): 内核空间进程占用的 CPU 时间,这里是 1.3%。
- ni (nice): 被调整优先级的用户进程所占 CPU 时间,这里是 0.0%。
- id (idle): CPU 空闲时间,这里是 98.1%。
- wa (I/O wait): 等待 I/O 的 CPU 时间,这里是 0.0%。
- hi (hardware interrupts): 硬件中断占用的 CPU 时间,这里是 0.0%。
- si (software interrupts): 软件中断占用的 CPU 时间,这里是 0.0%。
- st (steal time): 被虚拟机抢占的时间,这里是 0.0%。
第四部分:内存使用情况
- Mem: 系统物理内存状态:
- 952.9 total: 系统总内存为 952.9 MiB。
- 531.4 free: 未使用的空闲内存。
- 234.2 used: 被程序实际使用的内存。
- 265.1 buff/cache: 被内核缓冲和缓存占用的内存,用于提升 I/O 性能。
第五部分:Swap 交换分区使用情况
- Swap: 系统交换分区状态:
- 0.0 total: 没有配置交换分区或交换分区大小为 0。
- 0.0 free: 没有空闲的交换分区空间。
- 0.0 used: 没有使用交换分区。
- 718.7 avail Mem: 可供新进程使用的内存,包括空闲和部分缓存。
第六部分:进程信息
字段解析:
字段 | 含义 |
PID | 进程的唯一标识符(Process ID)。 |
USER | 启动该进程的用户名称。 |
PR | 进程的优先级(Priority)。 |
NI | 进程的 Nice 值,影响优先级。值越低优先级越高。 |
VIRT | 进程使用的虚拟内存大小。 |
RES | 进程使用的常驻内存大小(实际物理内存)。 |
SHR | 进程共享内存的大小。 |
S | 进程状态: |
ㅤ | - R: 运行中(Running)。 |
ㅤ | - S: 睡眠中(Sleeping)。 |
ㅤ | - D: 不可中断的睡眠状态。 |
ㅤ | - Z: 僵尸进程(Zombie)。 |
%CPU | 进程使用的 CPU 时间百分比。 |
%MEM | 进程使用的内存百分比。 |
TIME+ | 进程累计使用的 CPU 时间。 |
COMMAND | 进程的名称或启动命令。 |
tar
特性 | tar 文件 | gz 文件 | tar.gz 文件 |
后缀 | .tar | .gz | .tar.gz |
功能 | 归档多个文件 | 压缩单个文件 | 归档并压缩 |
压缩 | 无 | 有 | 有 |
支持多文件 | 是 | 否 | 是 |
保留目录结构 | 是 | 否 | 是 |
典型工具 | tar | gzip | tar + gzip |
大小 | 等于原始文件总和 | 小于原始文件 | 小于原始文件总和 |
tar 是 Unix/Linux 中的归档工具,用于打包和解压文件。常用选项和功能:
- 主要操作:
- c:创建归档。
- x:提取文件。
- t:列出内容。
- 常用辅助选项:
- f:指定文件名。
- v:显示详细过程。
- z/-j/-J:分别用 gzip、bzip2、xz 压缩或解压。
- C:指定目标目录。
- 示例:
- 将一个目录下的文件打包成一个tar文件(tape achieve):tar -cvf archive.tar dir1
- 将tar压缩为gzip文件:tar -czvf archive.tar.gz dir1
- 将gzip文件解压:tar -xzvf archive.tar.gz
- 查看:tar -tvf archive.tar
- 注意:选项顺序敏感,解压覆盖同名文件需谨慎。
nvdia-smi
nvidia-smi
(NVIDIA System Management Interface)是 NVIDIA 提供的一个命令行工具,用于监控和管理 NVIDIA GPU 设备。通过 nvidia-smi
,你可以查看 GPU 的详细信息、状态、使用情况以及温度等。以下是 nvidia-smi
可以显示的主要信息:1. GPU 基本信息
- GPU 名称:GPU 的型号(如 Tesla V100、GeForce RTX 3090 等)。
- GPU UUID:GPU 的唯一标识符。
- PCI 信息:GPU 的 PCI 总线 ID、设备 ID 和域 ID。
- 显存信息:总显存大小和当前使用情况。
2. GPU 使用情况
- GPU 利用率:GPU 的计算单元使用百分比(0%-100%)。
- 显存使用率:显存的使用百分比。
- 显存总量和已使用量:显存的总大小和当前使用量(以 MB 或 GB 为单位)。
3. 温度和功耗
- GPU 温度:GPU 的当前温度(以摄氏度为单位)。
- 功耗:GPU 的当前功耗(以瓦特为单位)。
- 功耗上限:GPU 的最大功耗限制。
4. 运行中的进程
- 进程 ID(PID):使用 GPU 的进程 ID。
- 进程名称:使用 GPU 的进程名称。
- 显存占用:每个进程占用的显存量。
- GPU 利用率:每个进程的 GPU 利用率。
5. GPU 状态
- 性能状态:GPU 的当前性能状态(P0-P12,P0 为最高性能状态)。
- 风扇速度:GPU 风扇的转速(以百分比为单位)。
- ECC 错误:ECC(Error Correction Code)内存的错误计数。
6. 其他信息
- 驱动版本:NVIDIA 驱动的版本号。
- CUDA 版本:支持的 CUDA 版本。
- 持久模式:GPU 是否处于持久模式(Persistence Mode)。
示例输出
运行
nvidia-smi
后,你会看到类似以下的输出:常用命令选项
- 实时刷新:
nvidia-smi -l <秒数>
,每隔指定秒数刷新一次信息。
- 查看特定 GPU:
nvidia-smi -i <GPU ID>
,查看指定 GPU 的信息。
- 查看进程信息:
nvidia-smi pmon
,显示 GPU 上运行的进程详细信息。
- 查看电源和温度信息:
nvidia-smi -q
,显示 GPU 的详细信息(包括温度、功耗等)。
- 设置持久模式:
nvidia-smi -pm 1
,启用持久模式(Persistence Mode)。
总结
nvidia-smi
是一个强大的工具,可以帮助你监控和管理 NVIDIA GPU 的状态、使用情况和性能。通过它,你可以快速了解 GPU 的健康状况、资源使用情况以及运行中的进程,从而更好地优化和管理 GPU 资源。nvidia-smi
(NVIDIA System Management Interface)是 NVIDIA 提供的一个命令行工具,用于监控和管理 NVIDIA GPU 设备。通过 nvidia-smi
,你可以查看 GPU 的详细信息、状态、使用情况以及温度等。以下是 nvidia-smi
可以显示的主要信息:nice和priority的关系
- nice是用户层面可以调整的数字,范围有限,(-20,+19),可以通过nice命令调整
- priority是内核根据算法计算的实际优先级,直接影响进程的调度顺序
对于普通进程,内核优先级与nice的关系为
对于普通进程,PR的值范围为0~39,其值越小优先级越高
pid为1的进程
在linux中,PID为1的进程是init进程,是整个系统的祖先进程,所有的进程都是由init进程直接或间接派生出来的。
主要功能
- 初始化系统:启动各种系统服务,如网络、守护进程等
- 管理孤儿进程:接管那些父进程退出的子进程
- 管理系统的运行级别:通过配置系统状态(如单用户模式、多用户模式)
systemctl
status
enable
disable
start
stop
进程间通信的方式
管道
文件
- 原理:多个进程读写同一个文件,通过文件内容交换数据
- 特点:简单但效率低
消息队列
信号
- 原理:操作系统想进程发送简单的时间通知,进程根据信号执行与定义操作
- 特点:单向、轻量级、只能传递少量信息(如信号编号),一般用于异常处理或终止进程
信号量
- 原理:一种计数器机制,用于进程间的同步和互斥,控制共享资源的访问
- 特点:本身不传递数据,主要用于协调,可以实现锁的功能
共享内存
- 原理:多个进程映射一块内存区域,直接读取其中的数据
- 特点:最快的IPC方式,避免了数据拷贝,但需要额外的同步机制(如信号量)来放置竞争
socket
- 原理:通过socket接口建立通信端点,数据通过流或数据报传输
- 特点:支持双向通信,其中本地进程通信比跨主机通信快,因为不经过协议栈
总结
- 简单传输:用管道或文件。
- 高性能:用共享内存 + 信号量。
- 跨主机:用网络套接字。
- 结构化数据:用消息队列。
孤儿进程
父进程回收子进程的过程是什么
父子进程的资源关系
资源继承
进程间通信
资源回收
什么时候变为阻塞状态
- IO
- file
- network
- disk
- mutex
- semaphore
- 父进程wait子进程
PCB中有什么
资源隔离

Prev
全局唯一ID生成方案
Next
Star原则
Loading...