这是一份专门为新手小白准备的 Linux 运维速查手册。只要跟着敲一遍命令,你就能看懂服务器的磁盘、内存、目录占用,还会清理日志、挂载磁盘、扩容,甚至自己写一个带日期的数据库自动备份脚本。

登录服务器后,先摸清家底。
# 系统内核版本uname -a# 发行版信息cat /etc/os-release# 或lsb_release -a# CPU 信息lscpu# 只看型号和核心数cat /proc/cpuinfo | grep "model name" | head -1nproc # 查看逻辑 CPU 数量# 内存总量free -h# 磁盘与挂载概览lsblkdf -hT
这些命令不会改动任何配置,放心敲。
df 最常用,能告诉你每个挂载点的总大小、已用、可用、使用率。
df -h
-h : 人类可读的格式(G、M、K)
输出示例:
Filesystem Size Used Avail Use% Mounted on/dev/vda1 40G 12G 26G 32% //dev/vdb1 100G 60G 40G 60% /data
注意:Use% 达到 100% 时需要清理或扩容。
加 -T 还能看到文件系统类型(ext4、xfs 等):
df -hT
查看 inode 使用(小文件过多可能耗尽 inode,导致磁盘有空间却写不进去):
df -i
lsblk
以树形结构列出所有块设备(磁盘、分区):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTvda 252:0 0 40G 0 disk└─vda1 252:1 0 40G 0 part /vdb 252:16 0 100G 0 disk└─vdb1 252:17 0 100G 0 part /data
如果某块磁盘没有 MOUNTPOINT,说明它虽然连上了,但还没挂载使用。
更详细的分区 UUID 和文件系统:
lsblk -f
查看当前所有挂载点及挂载参数:
mount | column -t
查看系统启动时自动挂载的配置(修改前一定要备份):
cat /etc/fstab
每一行格式:
设备/UUID 挂载点 文件系统类型 挂载选项 0 0
du(disk usage)用来统计文件/目录占用多少磁盘空间。
查看 当前目录下每个子目录的大小(最常用):
du -sh *
-s : 只显示总计(summary)-h : 人类可读* : 当前目录下所有文件和目录查看 指定文件夹的总大小:
du -sh /var/log
输出:
1.2G /var/log
如果想看该目录下第一层子目录的各自大小:
du -sh /var/log/*
从根目录开始,用 --max-depth 控制层级,并排序:
du -h --max-depth=1 / 2>/dev/null | sort -hr | head -20
--max-depth=1 : 只统计第一层子目录2>/dev/null : 忽略无权限的错误信息sort -hr : 按人类可读的数字倒序排列(h 支持 1K、200M 这样的单位排序)head -20 : 只看前 20 大这样一下子就能看出是 /var、/home 还是 /opt 占用巨大。
更现代的工具:ncdu
如果可以联网安装,ncdu 提供交互式界面,直接进入目录浏览,按大小排序:
# 安装(Ubuntu/Debian)sudo apt install ncdu# CentOS/RHELsudo yum install ncdu # 可能需要 EPEL# 使用ncdu /
有时候你会遇到诡异现象:df 显示磁盘快满了,但 du 统计出来的目录大小总和远小于已用空间。这通常是因为 删除了文件,但进程还在写,导致磁盘空间没有真正释放。
lsof 查找这些“幽灵”文件:lsof | grep deleted
或者更精确:
lsof -nP | grep '(deleted)'
输出会显示进程名、PID 和文件路径。重启对应进程即可释放空间。
此外,du 默认统计的是 文件实际占用磁盘块大小(通常比文件大小稍大)。如果想看文件本身的尺寸(apparent size),使用:
du -sh --apparent-size /var/log
日常排查空间不用太纠结这个,知道 du 按块统计即可。
free -h
输出:
total used free shared buff/cache available
Mem: 3.8G 1.2G 800M 100M 1.8G 2.3G
Swap: 2.0G 0B 2.0G
available 才是应用程序真正还能用的内存,包含了可回收的 buffer/cache。Swap 使用了很大比例,说明内存不太够。动态监控:
top# 或更美观的htop # 需安装
按 q 退出。
在 top 中可以看到各个进程 CPU 占用,按 1 显示每个核心负载。
查看 CPU 基本信息:
lscpu
查看系统负载(最近1、5、15分钟平均负载):
uptime
一般来说负载不超过 CPU 核心数就算正常。
磁盘挂载和卸载是运维中出现频率最高的操作之一。下面以一个独立的新磁盘为例,走完“识别设备 → 分区格式化 → 临时挂载 → 永久挂载 → 验证 → 卸载 → 故障排查”的完整闭环。
加装硬盘后(或云平台挂载云盘后),让系统重新扫描(物理机可重启,云服务器一般自动识别):
# 查看所有块设备lsblk# 查看内核识别到的磁盘信息sudo fdisk -l# 持续监控磁盘事件(拔插测试时常用)dmesg | tail -20
如果磁盘已识别但未显示容量,可能需要重新扫描 SCSI 总线:
# 扫描所有 SCSI 主机(云服务器适用)for host in /sys/class/scsi_host/*; do echo "- - -" | sudo tee $host/scan; done
再次 lsblk 就能看到新盘(例如 /dev/vdc)。
如果磁盘已有分区且不需要重新分区,可跳过此步。
# 使用 fdisk 对 /dev/vdc 进行分区sudo fdisk /dev/vdc# 交互步骤:# n → 新建分区# p → 主分区(回车默认编号1)# 回车 → 默认起始扇区# 回车 → 默认结束扇区(使用全部空间)# w → 保存并退出
验证分区:
lsblk /dev/vdc# 应出现 /dev/vdc1
# 格式化为 ext4(最通用)sudo mkfs.ext4 /dev/vdc1# 或 xfs(CentOS 7+ 默认)sudo mkfs.xfs /dev/vdc1
注意:格式化会清空磁盘上所有数据,请三思而行。
检查文件系统类型:
lsblk -f /dev/vdc1# 或sudo blkid /dev/vdc1
# 创建挂载点sudo mkdir -p /mnt/mydata# 临时挂载sudo mount /dev/vdc1 /mnt/mydata# 验证挂载结果df -hT /mnt/mydata
先获取分区的 UUID(通用唯一标识,比设备名更稳定):
sudo blkid /dev/vdc1# 输出示例:# /dev/vdc1: UUID="a1b2c3d4-..." TYPE="ext4"
备份 fstab,然后编辑:
sudo cp /etc/fstab /etc/fstab.bak.$(date +%Y%m%d)sudo vim /etc/fstab
在文件末尾添加一行:
UUID=a1b2c3d4-... /mnt/mydata ext4 defaults 0 2
字段含义:
UUID=...:设备标识(也可用 /dev/vdc1,但 UUID 更可靠)/mnt/mydata:挂载点ext4:文件系统类型defaults:挂载选项(rw, suid, dev, exec, auto, nouser, async)0:dump 备份标记(0 表示不备份)2:fsck 检查顺序(0 不检查,1 根分区,2 其他分区)测试 fstab 配置是否无误(不会真正重启):
sudo mount -a
若无错误信息,则说明配置正确,重启后会自动挂载。
# 查看当前所有挂载点及参数mount | grep /mnt/mydata# 查看某个挂载点的文件系统类型与空间df -hT /mnt/mydata# 用 findmnt 查看树形挂载关系(推荐)findmnt /mnt/mydata
# 卸载挂载点sudo umount /mnt/mydata# 如果提示“target is busy”,说明有进程在使用该目录# 查找占用进程sudo lsof /mnt/mydata# 或sudo fuser -m /mnt/mydata# 强制结束占用进程后卸载(谨慎)sudo fuser -km /mnt/mydatasudo umount /mnt/mydata# 如果仍然无法卸载,尝试懒卸载(立即断开文件系统,使用结束后彻底卸载)sudo umount -l /mnt/mydata
卸载后,如果不再需要自动挂载,记得从 /etc/fstab 中删除或注释掉对应行。
# 查看某个设备是否挂载mount | grep /dev/vdc1# 查看所有 ext4 类型的分区df -t ext4 -h# 查看挂载失败的日志dmesg | tail -30# 模拟 fstab 挂载并显示详细过程sudo mount -av
任何扩容操作前,请先备份重要数据!如果不确定,联系云服务商或专业运维。
阿里云、腾讯云、AWS 等支持在线扩容云盘。
大致流程:
在控制台对云盘进行扩容(例如从 40G 调到 100G)。
登录服务器,让系统识别新容量:
# 查看磁盘和分区容量是否已变大lsblk
扩展分区(如果用了分区表)和文件系统。
# ext4 文件系统sudo resize2fs /dev/vdb# xfs 文件系统sudo xfs_growfs /data # 注意:xfs_growfs 后面跟挂载点
# 安装 growpart(通常已内置)sudo growpart /dev/vdb 1 # 扩展第一个分区# 然后 resize 文件系统sudo resize2fs /dev/vdb1
如果磁盘直接作为文件系统(没有分区,如 /dev/vdb),直接扩展文件系统:
如果磁盘有分区(如 /dev/vdb1),可能需要先扩展分区。推荐使用 growpart:
验证:
df -h /data
LVM 的好处是可以在线扩容,无需重启。
基本命令速览:
# 查看卷组和逻辑卷sudo vgdisplaysudo lvdisplay# 1. 创建物理卷(新磁盘 /dev/vdc)sudo pvcreate /dev/vdc# 2. 加入卷组(假设卷组名叫 vg_data)sudo vgextend vg_data /dev/vdc# 3. 扩展逻辑卷(假设 LV 路径 /dev/vg_data/lv_data,增加 10G)sudo lvextend -L +10G /dev/vg_data/lv_data# 4. 扩展文件系统# ext4:sudo resize2fs /dev/vg_data/lv_data# xfs:sudo xfs_growfs /data # /data 是挂载点
每一步操作前后都可以用 df -h、lsblk、vgs、lvs 查看变化。
# 在 /var/log 下找大于 100M 的文件find /var/log -type f -size +100M -exec ls -lh {} ;不要直接 rm 掉还在被写入的日志文件(可能导致进程无法写入,需重启服务)。
最安全的方法是清空内容,但保留 inode:
# 方式1:重定向空内容sudo > /var/log/syslog# 方式2:truncate 截断sudo truncate -s 0 /var/log/syslog# 方式3:使用 tee(配合 /dev/null)sudo tee /var/log/syslog < /dev/null
这三个效果相同,文件大小变为 0,服务依旧可以正常写入。
很多系统日志都已配置了 logrotate,它会自动切割、压缩、删除旧日志。
配置文件:
/etc/logrotate.conf/etc/logrotate.d/ 目录下例如查看 nginx 日志的轮转配置:
cat /etc/logrotate.d/nginx
对于自定义的应用日志,可以自己添加配置,例如 /etc/logrotate.d/myapp:
/var/log/myapp/*.log { daily rotate 7 compress missingok notifempty copytruncate}daily : 每天轮转rotate 7 : 保留 7 份compress : 压缩旧日志copytruncate : 复制并清空,避免服务中断测试配置是否生效:
sudo logrotate -d /etc/logrotate.conf # 调试模式,不做实际操作sudo logrotate -f /etc/logrotate.conf # 强制执行一次
如果 journald 日志占满 /var/log/journal,可以用以下方式清理:
# 查看占用大小journalctl --disk-usage# 只保留最近 2 天日志sudo journalctl --vacuum-time=2d# 只保留 500M 大小sudo journalctl --vacuum-size=500M# 保留最近 1000 条sudo journalctl --vacuum-lines=1000
生产环境中最常用的两种场景:Windows 上用 mysqldump 的批处理,以及 Linux 上通用的 Shell 脚本。以下模板直接指定数据库参数,备份时会自动在指定目录下创建当天日期文件夹,所有备份文件按日期归档,简洁可靠。
适用环境:Windows Server,已安装 MySQL 客户端工具且 mysqldump 可在命令行直接执行。
backup_mysql.bat
@echo offchcp 65001 >nulsetlocal enabledelayedexpansionREM ========== 配置区域(按实际修改) ==========set DB_USER=rootset DB_PASS=your_passwordset DB_HOST=localhostset DB_PORT=3306set BACKUP_ROOT=D:backupmysqlREM ========== 自动日期目录 ==========set DATE_DIR=%date:~0,4%-%date:~5,2%-%date:~8,2%set BACKUP_PATH=%BACKUP_ROOT%%DATE_DIR%if not exist "%BACKUP_PATH%" mkdir "%BACKUP_PATH%"REM 需要备份的数据库,空格分隔set DATABASES=db1 db2 db3REM 日志文件set LOGFILE=%BACKUP_PATH%backup.logecho [%date% %time%] 备份开始 >> "%LOGFILE%"for %%d in (%DATABASES%) do ( set OUT_FILE=%BACKUP_PATH%%%d_%DATE_DIR%.sql.gz echo 正在备份 %%d ... mysqldump -u%DB_USER% -p%DB_PASS% -h%DB_HOST% -P%DB_PORT% --single-transaction --routines --triggers %%d | gzip > "!OUT_FILE!" if errorlevel 1 ( echo [%date% %time%] %%d 备份失败! >> "%LOGFILE%" ) else ( echo [%date% %time%] %%d 备份成功 → !OUT_FILE! >> "%LOGFILE%" ))REM 清理7天前备份文件夹forfiles /p "%BACKUP_ROOT%" /d -7 /c "cmd /c if @isdir==TRUE rd /s /q @file" 2>nulecho [%date% %time%] 清理7天前旧备份完成 >> "%LOGFILE%"echo [%date% %time%] 备份结束 >> "%LOGFILE%"
使用说明:
backup_mysql.bat。gzip 工具(可用 GnuWin32 或 7-Zip 替换)。如果不想压缩,可将 | gzip 及 .gz 后缀去掉,输出纯 SQL 文件。mysql_backup.sh
#!/bin/bash# ========== 配置区域 ==========DB_USER="root"DB_PASS="your_password"DB_HOST="localhost"DB_PORT="3306"BACKUP_ROOT="/data/backup/mysql"# 空格分隔的数据库列表DATABASES="db1 db2 db3"KEEP_DAYS=7# ========== 自动日期目录 ==========DATE_DIR=$(date +%Y-%m-%d)BACKUP_PATH="$BACKUP_ROOT/$DATE_DIR"mkdir -p "$BACKUP_PATH"# 日志LOG_FILE="$BACKUP_PATH/backup.log"echo "[$(date '+%F %T')] 备份开始" >> "$LOG_FILE"for db in $DATABASES; do OUT_FILE="$BACKUP_PATH/${db}_${DATE_DIR}.sql.gz" echo "正在备份 $db ..." if mysqldump -u"$DB_USER" -p"$DB_PASS" -h"$DB_HOST" -P"$DB_PORT" --single-transaction --routines --triggers "$db" | gzip > "$OUT_FILE"; then echo "[$(date '+%F %T')] $db 备份成功 → $OUT_FILE" >> "$LOG_FILE" else echo "[$(date '+%F %T')] $db 备份失败!" >> "$LOG_FILE" fidone# 清理旧备份find "$BACKUP_ROOT" -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} ;echo "[$(date '+%F %T')] 清理 ${KEEP_DAYS} 天前目录完成" >> "$LOG_FILE"echo "[$(date '+%F %T')] 备份结束" >> "$LOG_FILE"使用说明:
将脚本保存为 /opt/scripts/mysql_backup.sh。
修改配置区域的数据库连接信息与数据库列表。
赋予执行权限:chmod +x /opt/scripts/mysql_backup.sh
加入 crontab 定时执行:
crontab -e# 添加一行,每天凌晨2点执行0 2 * * * /opt/scripts/mysql_backup.sh
两个模板的特点:
如果需要备份所有数据库(排除系统库),只需将 DATABASES 变量的赋值逻辑改为动态获取,但通用模板为了简洁可靠,建议显式列出需要备份的库名。
df -h、free -h、uptime,看看服务器是否健康。du --max-depth 配合 sort 定位大目录,用 lsof 查 deleted 文件。logrotate 实现自动清理,避免手动 rm。/etc/fstab。mysql < xxx.sql 做一次模拟恢复)。掌握这些命令和脚本,你已经具备了服务器日常运维的“救命”能力。遇到问题别慌,先看占用、查日志、确认备份,再动手操作。
以上就是Linux服务器运维常用命令速查大全的详细内容,更多关于Linux常用命令的资料请关注本站其它相关文章!
您可能感兴趣的文章: