当前位置: 首页 > news >正文

Linux小课堂: 系统硬件资源管理与设备操作指南

硬件资源查看命令


1 ) 用户与系统状态监控

  • w命令
    • 查看当前登录用户及来源主机(FROM字段显示远端主机IP)
    • 在桥接网络模式下,虚拟机可分配独立IP
    • 示例输出:
      USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT 
      root     pts/0    192.168.0.101   10:30    1:00   0.05s  0.01s -bash
      
    • 示例:服务器192.168.0.106的登录用户root,来源IP192.168.0.101(客户端主机地址)
  • top命令:动态显示进程资源占用,关键字段包括:
    • CPU%:CPU实时使用百分比
    • MEM:内存总量(如1G
      • total:总内存(如1GB)
      • free:可用内存
      • used:已用内存
      • buff/cache:缓冲区与缓存占用
    • 内存计算:used = total - free - buffers - cache
    • FREE/USED:可用/已用内存
    • BUFFER/CACHE:内核缓冲区与页缓存
    • SWAP:磁盘空间虚拟化的应急内存,物理内存不足时启用

2 )存储空间分析

  • du -h:查看目录大小(如/root目录76MB
  • df命令:
    • df:默认以KB为单位显示文件系统磁盘空间
    • df -h(推荐):人性化显示单位(GB/MB)
       $ df -h Filesystem      Size  Used Avail Use% Mounted on/dev/sda1       8.0G  2.1G  6.0G  26% /
      
  • 关键字段:
    • Filesystem:设备路径(如/dev/sda1
    • Size/Used/Avail:总容量/已用/可用空间
    • Use%:使用百分比(如26%
    • Mounted on:挂载点(如根分区/
  • df 从文件系统元数据读取,du 计算文件实际物理块占用

3 )内存专用工具

  • free:静态输出内存信息(数据来源/proc/meminfo),参数:

    • free -m:以MB为单位(如总内存990MB
    • free -g:以GB为单位(小数自动舍入)
    $ free -m total  used  free  shared  buff/cache  available
    Mem:           990   287   102       8          600         701 
    Swap:         1023    15  1008 
    

    数据来源:直接读取/proc/meminfo虚拟文件

字段解析:

  • total:物理内存总量

  • sharedtmpfs临时文件系统占用

  • buff/cache:缓冲区 buffer +页缓存总和 page cache

  • available:实际可用内存(含可释放缓存)

  • 参数说明:

    • -b/-k/-m/-g:指定字节/KB/MB/GB单位

4 )系统与硬件信息

  • uname -a:输出内核版本(如3.10.0-957.el7.x86_64
    • 输出示例:Linux localhost 3.10.0-957.el7.x86_64 x86_64 GNU/Linux
  • cat /proc/cpuinfo:查看CPU型号、核心数、频率(如Intel Core i5 @2.9GHz
    • /proc虚拟文件系统
    • processor:逻辑处理器编号
    • model name:型号(如Intel Core i5)
    • cpu MHz:主频(如2.9GHz)
  • 内存详情:cat /proc/meminfo(与free命令同源)
  • hostname:显示主机名(如localhost.localdomain),信息存储于 /etc/hosts

磁盘分区与文件系统


1 )磁盘分区查看

$ fdisk -l /dev/sda 
Device     Boot Start   End Sectors Size Type 
/dev/sda1  *     2048 2099199 2097152   1G Linux filesystem 
/dev/sda2      2099200 8388607 6289408   3G Linux LVM 

2 )分区核心概念

硬盘物理空间 → 分区划分(主/扩展/逻辑) → 格式化文件系统 → 挂载使用 
分区类型特性说明编号规则限制
主分区 (Primary)直接存储数据,上限4个(MBR) 或128+(GPT模式)1-4MBR 最多 4 个
扩展分区 (Extended)容器分区,指针容器,不可直接存数据1-4每个硬盘仅 1 个
逻辑分区 (Logical)在扩展分区内创建,数量无限制从5开始无数量限制(GPT 模式)

3 )文件系统对比

类型WindowsLinux特性
传统FAT32EXT2非日志型,恢复困难
日志型NTFSEXT4/XFS断电快速恢复,CentOS 7默认XFS
最大容量16EBXFS(18EB)1EB = 1,152,921,504,606,846,976字节

说明

系统适用场景最大容量日志功能
EXT4Linux 默认1 EB支持
XFSCentOS 7+ 默认18 EB高性能恢复
NTFSWindows 系统16 EB(理论)支持
Swap虚拟内存交换分区无独立文件系统

4 ) 硬盘类型对比

类型原理优势劣势
HDD磁碟片+机械磁头读写容量大、成本低速度慢、噪音大、怕震动
SSDNAND闪存芯片速度快、抗震性强价格高、寿命有限

还有一种:SSHD(混合硬盘):HDD与SSD结合体

5 ) 设备命名规则

  • 设备路径:/dev/[sdX][Y]

    • X:磁盘序号(a=第一块, b=第二块)
    • Y:分区编号(1=主分区, 5=逻辑分区)
  • 设备类型标识:

    • 字符设备(c):键盘、串口(如 /dev/tty1
    • 块设备(b):硬盘、U盘(如 /dev/sda

示例:

  • /dev/sda:第一块SATA/SCSI硬盘
  • /dev/sdb2:第二块硬盘的第二个主分区

分区逻辑:

  • MBR模式:最多4个主分区(需扩展分区容纳逻辑分区)
  • GPT模式:支持128+主分区,无扩展分区需求
  • 示例:单硬盘安装Windows+Linux时,需划分独立分区

设备挂载与卸载


1 ) 永久挂载配置

编辑/etc/fstab文件,按格式添加设备:

设备路径/UID   挂载点   文件系统  权限选项  备份标记  自检顺序 
/dev/sdb1      /data    xfs       defaults   0         0 
UUID=xxxx...  /swap    swap      defaults   0         0 

字段顺序:设备文件 → 挂载点 → 文件系统类型 → 权限选项 → 备份 → 自检

2 ) 命令操作

  • 挂载:mount /dev/sdb1 /mnt/newdisk 前面是设备,后面是目录

  • 卸载:umount /mnt/newdiskumount /dev/sdb1 这里卸载设备或目录均可

  • 交换分区:

    mkswap /dev/sdb2    # 格式化swap分区 
    swapon /dev/sdb2    # 启用swap 
    

硬盘添加与分区实战


1 ) 虚拟机添加硬盘

  1. 关闭系统:poweroff
  2. VirtualBox:设置 → 存储 → 添加新硬盘(动态分配)
  3. 启动系统:识别新设备(如/dev/sdb

2 ) 分区与格式化

fdisk /dev/sdb      # 进入交互工具 
n → p → 1[Enter] # 创建主分区 
+2G                 # 分配2GB空间 
w                   # 保存退出 
partprobe           # 更新分区表 
mkfs.xfs /dev/sdb1  # 格式化为XFS 

3 ) 交换分区扩展

fdisk /dev/sdb 
n → p → 2[Enter] → +3G  # 创建3GB分区 
t → 282                 # 类型改为swap 
mkswap /dev/sdb2           # 创建交换分区
swapon /dev/sdb2           # 启用交换分区 
free -m                    # 验证swap扩容 

4 )使用dd备份分区

dd if=/dev/sda1 of=/backup.img bs=4M  # 备份sda1至镜像文件 

创建稀疏文件

dd if=/dev/zero of=sparsefile bs=1M seek=1024 count=0  # 创建1GB空洞文件 

关键参数:bs(块大小)、count(块数)、seek(跳过快数)

NestJS监控磁盘空间示例


1 )方案1

获取磁盘信息

import { exec } from 'child_process';
import { Injectable } from '@nestjs/common';@Injectable()
export class DiskService {async getDiskUsage(): Promise<string> {return new Promise((resolve, reject) => {exec('df -h', (error, stdout) => {if (error) reject(`Error: ${error.message}`);resolve(stdout);});});}
}

代码说明:

  • 通过child_process执行df -h命令
  • 封装为NestJS服务供控制器调用
  • 返回格式化的磁盘使用数据

实现Linux进程监控API

import { Controller, Get } from '@nestjs/common';  
import { execSync } from 'child_process';  @Controller('process')  
export class ProcessController {  @Get('stats')  getProcessStats(): string {  // 使用Linux命令获取进程资源占用  const cpuUsage = execSync("top -bn1 | grep 'Cpu(s)' | awk '{print $2}'").toString();  const memoryUsage = execSync("free -m | grep 'Mem' | awk '{print $3}'").toString();  return `CPU占用: ${cpuUsage}%, 内存使用: ${memoryUsage}MB`;  }  
}  

代码说明:通过execSync调用Shell命令,封装为RESTful API供前端监控系统调用

2 )方案2

磁盘挂载与卸载

// NestJS挂载逻辑示例 (src/storage/mount.service.ts)
import { execSync } from 'child_process';export class MountService {static mountDevice(device: string, mountPoint: string): void {try {execSync(`mkdir -p ${mountPoint}`);execSync(`mount ${device} ${mountPoint}`);console.log(`[SUCCESS] ${device} mounted to ${mountPoint}`);} catch (error) {throw new Error(`Mount failed: ${error.stderr.toString()}`);}}static unmount(mountPoint: string): void {try {execSync(`umount ${mountPoint}`);console.log(`[SUCCESS] ${mountPoint} unmounted`);} catch (error) {throw new Error(`Unmount failed: ${error.stderr.toString()}`);}}
}// 调用示例 
MountService.mountDevice('/dev/sdb1', '/mnt/newdisk');

交换分区管理

// 交换分区操作服务 (src/storage/swap.service.ts)
export class SwapService {static activateSwap(device: string): void {try {execSync(`mkswap ${device}`);execSync(`swapon ${device}`);console.log(`[SUCCESS] Swap activated: ${device}`);} catch (error) {throw new Error(`Swap activation failed: ${error.stderr.toString()}`);}}static persistSwapInFstab(device: string): void {const fstabEntry = `${device} swap swap defaults 0 0`;try {execSync(`echo '${fstabEntry}' >> /etc/fstab`);console.log(`[SUCCESS] Added to /etc/fstab: ${device}`);} catch (error) {throw new Error(`fstab update failed: ${error.stderr.toString()}`);}}
}

分区信息获取接口

// 分区信息API接口 (src/storage/storage.controller.ts)
import { Controller, Get } from '@nestjs/common';
import { readFileSync } from 'fs';@Controller('storage')
export class StorageController {@Get('partitions')getPartitions() {const data = readFileSync('/proc/partitions', 'utf8');return data .split('\n').slice(2).map(line => {const [major, minor, blocks, name] = line.trim().split(/\s+/);return { major, minor, blocks, name };});}
}

3 ) 方案3

自动化脚本示例(磁盘监控):

import { execSync } from 'child_process';
import { Controller, Get } from '@nestjs/common';@Controller('disk')
export class DiskController {@Get('usage')getDiskUsage() {const output = execSync('df -h').toString();return { status: 'success', data: output };}@Get('add-partition')addPartition() {// 模拟分区操作(实际需sudo权限)execSync('echo "n\np\n1\n\n+2G\nw" | fdisk /dev/sdb');execSync('mkfs.xfs /dev/sdb1');execSync('mkdir -p /newfs && mount /dev/sdb1 /newfs');return { status: 'partition_created' };}
}

4 ) 方案4

import { Controller, Get } from '@nestjs/common';
import { execSync } from 'child_process';@Controller('system')
export class SystemController {@Get('memory')getMemoryInfo() {const output = execSync('free -m').toString();return { memory: this.parseFreeOutput(output) };}private parseFreeOutput(output: string) {const lines = output.trim().split('\n');const memLine = lines[1].split(/\s+/).filter(Boolean);return {total: parseInt(memLine[1]),used: parseInt(memLine[2]),free: parseInt(memLine[3]),swap: parseInt(lines[2].split(/\s+/)[2])};}@Get('disks')getDiskInfo() {const output = execSync('df -h').toString();const lines = output.trim().split('\n').slice(1);return lines.map(line => {const [filesystem, size, used, avail, usePct, mountedOn] = line.split(/\s+/);return { filesystem, size, used, avail, usePct, mountedOn };});}
}

功能说明:

  • /system/memory:返回内存和 Swap 使用统计(MB)
  • /system/disks:返回挂载点磁盘空间信息(人类可读格式)

5 ) 方案5

import { Controller, Get } from '@nestjs/common';
import { execSync } from 'child_process';
import { readFileSync } from 'fs';@Controller('disk')
export class DiskController {@Get('usage')getDiskUsage() {// 调用df命令获取磁盘数据const dfOutput = execSync('df -h').toString();return { data: dfOutput };}@Get('memory')getMemoryInfo() {// 直接读取/proc/meminfoconst memInfo = readFileSync('/proc/meminfo', 'utf-8');const totalMem = memInfo.match(/MemTotal:\s+(\d+)/)?.[1];return { totalMemoryKB: parseInt(totalMem) };}@Get('block-devices')listBlockDevices() {// 解析lsblk输出 const devices = execSync('lsblk -J').toString();return JSON.parse(devices);}
}

代码说明:

使用execSync执行df/lsblk命令获取结构化数据
直接读取/proc/meminfo避免依赖外部工具
lsblk -J输出JSON格式便于程序解析

要点总结

  1. 资源查看:w/top实时监控,free/df专注内存磁盘,/proc目录提供原始数据
  2. 设备命名:sdX为磁盘,sdXY为分区,内核按检测顺序分配字母
  3. 分区逻辑:主分区直接存储,逻辑分区依赖扩展分区突破4分区限制
  4. 性能对比:SSD随机读写快,HDD顺序访问优,XFS适合大容量存储
  5. 挂载铁律:设备必须格式化→挂载点需为空目录→配置/etc/fstab实现永久生效

关键运维结论

  1. 硬件设备分类

    • 字符设备(/dev/tty*):以字节流传输(键盘、串口),属性标识 c
    • 块设备(/dev/sd*):以固定块存取(硬盘),属性标识 b
  2. 设备命名规则:

    • sd*:SCSI/SATA/USB设备(如sda第一硬盘,sdb1第二硬盘第一分区)
    • hd*:遗留IDE设备(逐步淘汰)
  3. 性能优先原则:

    • SSD替换HDD:消除机械寻道延迟,IOPS提升10-100倍
    • XFS作为默认文件系统:支持18EB存储与快速故障恢复
  4. 内存优化策略:

    • Swap分区大小 = 物理内存×1.5(如16GB内存配24GB Swap)
    • 通过/proc/sys/vm/swappiness调整交换倾向(0-100值越低越少用Swap)

所有操作涉及磁盘分区时,必须提前备份数据
fdiskmkfs等命令直接操作物理存储,误操作可能导致数据不可逆丢失

本文全面梳理了 Linux 硬件资源监控(CPU、内存、磁盘)、设备管理(分区、文件系统、挂载)及高级操作(dd 备份、Swap 配置)

http://www.dtcms.com/a/544520.html

相关文章:

  • ROS2核心概念之代码示例一
  • 工厂考勤系统选型参考:如何选出最合适的方案
  • 【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
  • Linux错误(7)接口处于Down状态不通告IPv6地址变更事件
  • 开发避坑指南(67):Maven引入iText7-core依赖失败解决方案
  • 北京南站地图建设公司简介怎么写
  • 镇江网站建设平台江苏企业展厅设计公司
  • 用JetBrains Rider开发C#应用程序指南
  • 快速创建Word箱单(2/2)
  • LangChain4j学习11:模型上下文协议 (MCP)
  • mysql线上主从集群设置
  • RK3568 11.0编译报错ld.lld: error: undefined symbol: rtkbt_cts_info
  • 南京大学LLM开发基础(四)MoE, LoRA, 数的精度 + MLP层实验
  • 机器学习-回归分析概述
  • 企业建设网站的主要作用网站seo搜索引擎优化怎么做
  • 微信小程序可以做电影网站吗安网多少钱
  • 计算机专业做网站的开题报告门户建设开源软件
  • js基础:08、构造函数(共享方法)、原型(prototype)、原型对象、(修改原型)toString方法、垃圾回收
  • 如何通过机器学习(如K-means、SVM、决策树)与深度学习(如CNN、LSTM)模型,进行全球气候变化驱动因素的数据分析与趋势预测
  • Docker篇6-项目app.py和flask_app.service配置和映射到docker中
  • 从零开始搭建 flask 博客(1)实验
  • 深入解析 Rust 解构模式:元组、结构体与枚举的精准拆解
  • 从零开始搭建 flask 博客实验(2)
  • 筑牢智算“地基”:华为以RAS理念重塑AIDC建设新模式
  • 跨网段耦合器助汽车零部件线实现PLC与MES跨网段互联
  • C#程序实现将Teradata的存储过程转换为Azure Synapse Dedicated SQL pool的存储过程
  • 小型购物网站模板设计网站页面教案
  • 免费购物网站淘宝建设网站首页
  • 成绩发布工具使用方法,附成绩分析教程
  • sward零基础学习:安装与配置