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:物理内存总量 -
shared:tmpfs临时文件系统占用 -
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-4 | MBR 最多 4 个 |
| 扩展分区 (Extended) | 容器分区,指针容器,不可直接存数据 | 1-4 | 每个硬盘仅 1 个 |
| 逻辑分区 (Logical) | 在扩展分区内创建,数量无限制 | 从5开始 | 无数量限制(GPT 模式) |
3 )文件系统对比
| 类型 | Windows | Linux | 特性 |
|---|---|---|---|
| 传统 | FAT32 | EXT2 | 非日志型,恢复困难 |
| 日志型 | NTFS | EXT4/XFS | 断电快速恢复,CentOS 7默认XFS |
| 最大容量 | 16EB | XFS(18EB) | 1EB = 1,152,921,504,606,846,976字节 |
说明
| 系统 | 适用场景 | 最大容量 | 日志功能 |
|---|---|---|---|
| EXT4 | Linux 默认 | 1 EB | 支持 |
| XFS | CentOS 7+ 默认 | 18 EB | 高性能恢复 |
| NTFS | Windows 系统 | 16 EB(理论) | 支持 |
| Swap | 虚拟内存交换分区 | 无独立文件系统 | 无 |
4 ) 硬盘类型对比
| 类型 | 原理 | 优势 | 劣势 |
|---|---|---|---|
| HDD | 磁碟片+机械磁头读写 | 容量大、成本低 | 速度慢、噪音大、怕震动 |
| SSD | NAND闪存芯片 | 速度快、抗震性强 | 价格高、寿命有限 |
还有一种:SSHD(混合硬盘):HDD与SSD结合体
5 ) 设备命名规则
-
设备路径:
/dev/[sdX][Y]X:磁盘序号(a=第一块,b=第二块)Y:分区编号(1=主分区,5=逻辑分区)
-
设备类型标识:
- 字符设备(c):键盘、串口(如
/dev/tty1) - 块设备(b):硬盘、U盘(如
/dev/sda)
- 字符设备(c):键盘、串口(如
示例:
/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/newdisk或umount /dev/sdb1这里卸载设备或目录均可 -
交换分区:
mkswap /dev/sdb2 # 格式化swap分区 swapon /dev/sdb2 # 启用swap
硬盘添加与分区实战
1 ) 虚拟机添加硬盘
- 关闭系统:
poweroff - VirtualBox:
设置 → 存储 → 添加新硬盘(动态分配) - 启动系统:识别新设备(如
/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 → 2 → 82 # 类型改为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格式便于程序解析
要点总结
- 资源查看:
w/top实时监控,free/df专注内存磁盘,/proc目录提供原始数据 - 设备命名:
sdX为磁盘,sdXY为分区,内核按检测顺序分配字母 - 分区逻辑:主分区直接存储,逻辑分区依赖扩展分区突破4分区限制
- 性能对比:SSD随机读写快,HDD顺序访问优,XFS适合大容量存储
- 挂载铁律:设备必须格式化→挂载点需为空目录→配置
/etc/fstab实现永久生效
关键运维结论
-
硬件设备分类
- 字符设备(
/dev/tty*):以字节流传输(键盘、串口),属性标识c。 - 块设备(
/dev/sd*):以固定块存取(硬盘),属性标识b。
- 字符设备(
-
设备命名规则:
sd*:SCSI/SATA/USB设备(如sda第一硬盘,sdb1第二硬盘第一分区)hd*:遗留IDE设备(逐步淘汰)
-
性能优先原则:
- SSD替换HDD:消除机械寻道延迟,IOPS提升10-100倍
- XFS作为默认文件系统:支持18EB存储与快速故障恢复
-
内存优化策略:
- Swap分区大小 = 物理内存×1.5(如16GB内存配24GB Swap)
- 通过
/proc/sys/vm/swappiness调整交换倾向(0-100值越低越少用Swap)
所有操作涉及磁盘分区时,必须提前备份数据
fdisk、mkfs等命令直接操作物理存储,误操作可能导致数据不可逆丢失
本文全面梳理了 Linux 硬件资源监控(CPU、内存、磁盘)、设备管理(分区、文件系统、挂载)及高级操作(dd 备份、Swap 配置)
