操作系统
strace命令
strace
是一个用于跟踪系统调用和信号的工具,它可以帮助你诊断程序的行为或调试程序。-p
选项用于附加到一个正在运行的进程上,并实时显示它的系统调用。
解释命令:
strace -p 871
strace
:调用strace
工具。-p 871
:指定进程ID(PID)为 871 的进程。strace
会附加到这个进程,并跟踪它的系统调用。
使用场景:
实时跟踪系统调用:你可以看到进程 871 进行的每个系统调用,这有助于了解程序在做什么。
调试和排错:如果某个进程表现异常,比如挂起、资源消耗过高等,通过
strace
可以查看它在调用哪些系统调用,以便分析问题的根本原因。
注意事项:
权限:如果目标进程由另一个用户(比如 root)启动,可能需要相应的权限(例如通过
sudo
)来使用strace
。性能影响:
strace
会对被跟踪的进程产生一定的性能开销,尤其是在处理大量系统调用时,所以应在必要时使用。
运行该命令后,你会看到进程871的系统调用输出,直到你停止 strace
(通常通过 Ctrl+C
)。
top命令解释
我们可以用上面这张图,把这些值挨个解释一下。
假设一个用户程序开始运行了,那么就对应着第一个"us"框,"us"是"user"的缩写,代表 Linux 的用户态 CPU Usage。普通用户程序代码中,只要不是调用系统调用(System Call),这些代码的指令消耗的 CPU 就都属于"us"。
当这个用户程序代码中调用了系统调用,比如说 read() 去读取一个文件,这时候这个用户进程就会从用户态切换到内核态。
内核态 read() 系统调用在读到真正 disk 上的文件前,就会进行一些文件系统层的操作。那么这些代码指令的消耗就属于"sy",这里就对应上面图里的第二个框。"sy"是 "system"的缩写,代表内核态 CPU 使用。
接下来,这个 read() 系统调用会向 Linux 的 Block Layer 发出一个 I/O Request,触发一个真正的磁盘读取操作。
这时候,这个进程一般会被置为 TASK_UNINTERRUPTIBLE。而 Linux 会把这段时间标示成"wa",对应图中的第三个框。"wa"是"iowait"的缩写,代表等待 I/O 的时间,这里的 I/O 是指 Disk I/O。
紧接着,当磁盘返回数据时,进程在内核态拿到数据,这里仍旧是内核态的 CPU 使用中的"sy",也就是图中的第四个框。
然后,进程再从内核态切换回用户态,在用户态得到文件数据,这里进程又回到用户态的 CPU 使用,"us",对应图中第五个框。
好,这里我们假设一下,这个用户进程在读取数据之后,没事可做就休眠了。并且我们可以进一步假设,这时在这个 CPU 上也没有其他需要运行的进程了,那么系统就会进入"id"这个步骤,也就是第六个框。"id"是"idle"的缩写,代表系统处于空闲状态。
如果这时这台机器在网络收到一个网络数据包,网卡就会发出一个中断(interrupt)。相应地,CPU 会响应中断,然后进入中断服务程序。
这时,CPU 就会进入"hi",也就是第七个框。"hi"是"hardware irq"的缩写,代表 CPU 处理硬中断的开销。由于我们的中断服务处理需要关闭中断,所以这个硬中断的时间不能太长。
但是,发生中断后的工作是必须要完成的,如果这些工作比较耗时那怎么办呢?Linux 中有一个软中断的概念(softirq),它可以完成这些耗时比较长的工作。
你可以这样理解这个软中断,从网卡收到数据包的大部分工作,都是通过软中断来处理的。那么,CPU 就会进入到第八个框,"si"。这里"si"是"softirq"的缩写,代表 CPU 处理软中断的开销。
这里你要注意,无论是"hi"还是"si",它们的 CPU 时间都不会计入进程的 CPU 时间。这是因为本身它们在处理的时候就不属于任何一个进程。
好了,通过这个场景假设,我们介绍了大部分的 Linux CPU 使用。
不过,我们还剩两个类型的 CPU 使用没讲到,我想给你做个补充,一次性带你做个全面了解。这样以后你解决相关问题时,就不会再犹豫,这些值到底影不影响 CPU Cgroup 中的限制了。下面我给你具体讲一下。
一个是"ni",是"nice"的缩写,这里表示如果进程的 nice 值是正值(1-19),代表优先级比较低的进程运行时所占用的 CPU。
另外一个是"st","st"是"steal"的缩写,是在虚拟机里用的一个 CPU 使用类型,表示有多少时间是被同一个宿主机上的其他虚拟机抢走的。
扩容磁盘
要将 nvme0n1p1
的空间扩展到 /dev/mapper/centos-root
,你需要执行以下步骤。这包括删除 nvme0n1p1
分区,重新分配空间,并将其添加到现有的 LVM 逻辑卷中。
1. 卸载并删除 nvme0n1p1
分区
首先,你需要确保 nvme0n1p1
上没有重要数据,并且它未被挂载。如果已经挂载,请先卸载:
sudo umount /dev/nvme0n1p1
然后,使用 fdisk
删除 nvme0n1p1
分区:
sudo fdisk /dev/nvme0n1
进入 fdisk
命令行后:
- 输入
d
选择删除分区,然后输入分区号1
删除nvme0n1p1
。 - 输入
w
写入更改并退出fdisk
。
2. 创建新的分区并标记为 LVM
在释放 nvme0n1p1
的空间后,你需要重新创建一个新的分区,覆盖以前的分区空间,并将其类型设置为 Linux LVM
。
仍然使用 fdisk
来创建新分区:
sudo fdisk /dev/nvme0n1
进入 fdisk
命令行后:
- 输入
n
创建一个新的分区。 - 使用默认的开始和结束扇区,覆盖以前的
nvme0n1p1
分区空间。 - 输入
t
设置新分区的类型为8e
(Linux LVM)。 - 输入
w
写入更改并退出fdisk
。
3. 将新分区添加到 LVM 物理卷
新分区创建并标记为 LVM 后,将其添加到 LVM 的物理卷中:
sudo pvcreate /dev/nvme0n1p1
sudo vgextend centos /dev/nvme0n1p1
4. 扩展逻辑卷 centos-root
现在,你可以将新的空间分配给逻辑卷 centos-root
:
sudo lvextend -l +100%FREE /dev/mapper/centos-root
5. 扩展 XFS
文件系统
最后,使用 xfs_growfs
来扩展文件系统,使其利用新增的空间:
sudo xfs_growfs /dev/mapper/centos-root
6. 验证扩展结果
扩展完成后,使用 df -h /
来检查根文件系统的大小:
df -h /
这个命令将显示根文件系统的更新后的容量,确认 nvme0n1p1
的空间已经成功分配给 /dev/mapper/centos-root
。
wsl 启用systemd
解决Ubantu 报错:System has not been booted with systemd as init system (PID 1). Can‘t operate.
若要启用 systemd,请使用sudo管理员权限在文本编辑器中打开文件wsl.conf,并将以下行添加到/etc/wsl.conf
[boot]
systemd=true
然后,需要使用 PowerShell 关闭 WSL 分发 wsl.exe --shutdown 版来重启 WSL 实例。分发重启后,系统应运行。可以使用以下命令进行确认:systemctl list-unit-files --type=service这将显示服务的状态。
WSL2迁移至其他目录
1) 停止正在运行的wsl
wsl --shutdown
2)将需要迁移的Linux,进行导出
wsl --export Ubuntu-20.04 D:/ubuntu22.04.tar
3)导出完成之后,将原有的Linux卸载
wsl --unregister Ubuntu-20.04
4) 然后将导出的文件放到需要保存的地方,进行导入即可
wsl --import Ubuntu-20.04 D:\ubuntu\ D:/ubuntu/ubuntu22.04.tar --version 2