前两天写了 “Linux: shell 脚本篇”, 其中不涉及运维相关的内容, 因此新写了 “Linux: 运维篇” 作为补充.

磁盘与文件信息

df 命令 (disk free)

df - 查看磁盘分区的空间使用情况

df -h

# 参数说明:
# -h 以人类可读的方式显示 (自动用 KB/MB/GB)
# -T 显示文件系统类型
# -i 查看 inode 使用情况 (避免 inode 用完导致无法写入)

du 命令 (disk usage)

du - 查看目录或文件所占空间

du [选项] [文件/目录]

注意:
du 显示的是磁盘实际占用大小, 可能和 ls -l 显示的文件大小不同, 因为磁盘按块分配空间 (即使文件很小也会占一个块)

常用参数:

参数含义示例
-h以人类可读方式显示 (KB/MB/GB)du -h /var/log
-s只显示总计 (summary), 不递归du -sh /var/log
-a显示目录和文件的大小du -ah /var/log
–max-depth=N限制目录递归深度du -h –max-depth=1 /var
-c显示总计 (最后一行 total)du -ch /var/log

常用组合:

 # 查看 /var 目录占用空间
du -sh /var

# 按大小排序, 找出最大的 3 个目录
du -h --max-depth=1 /var | sort -hr | head -n 3

查询 /var 目录下占用空间最多的10个文件:

find /var -type f -exec du -h {} + | sort -hr | head -n 3
# 解释:  
# -exec du -h {} +
# 对每个文件执行 du -h 计算占用空间, 以人类可读的格式输出

# 用 ls 代替 du 可以快很多 (直接取文件大小, 不统计磁盘块):
find /var -type f -exec ls -lh {} + | sort -k 5 -hr | head -n 3
# 解释:  
# sort -k 5 -rh
# -k 5 是按 ls -lh 输出的第 5 列 (文件大小) 排序

mount 命令

mount 命令用于将一个存储设备 挂载 到 Linux 的目录树中.
挂载点: 挂载点是一个已经存在的目录, 挂载后, 访问这个目录就是访问设备里的文件.

mount [options] [device] [mount_point]

常用参数:

参数作用
-t 指定文件系统类型 (如 ext4, xfs, vfat, ntfs, nfs)
-r只读挂载 (等同于 -o ro)
-w读写挂载 (默认)
-a按 /etc/fstab 配置挂载所有设备

例子:

# 查看当前挂载情况
mount

#  挂载一个 NTFS 分区 (需要 ntfs-3g)
sudo mount -t ntfs-3g /dev/sdc1 /mnt/usb
# /dev/sdc1 是内核为物理磁盘的一个分区分配的设备文件名,来源于系统的硬件检测
# 插入一个硬盘/U 盘后,可以用 lsblk 或 fdisk -l 快速找到它的名字

# 挂载 NFS 共享目录
sudo mount -t nfs 192.168.1.23:/shared /mnt/nfs

# 卸载挂载点
sudo umount /mnt/data
# 或用设备名:
sudo umount /dev/sdc1

stat

stat 命令用于显示文件或目录的详细信息,包括大小、权限、拥有者、创建/修改时间、inode 号等

stat [选项] 文件或目录名

最常用的选项是 -c 自定义输出格式,用类似 %s 的占位符显示指定信息.

例子:

stat t.sh

结果:

  文件:t.sh
  大小:287       	块:8          IO 块:4096   普通文件
设备:fd03h/64771d	Inode:399798      硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/   josie)   Gid:( 1000/   josie)
最近访问:2025-08-12 00:08:45.655705389 +0800
最近更改:2025-08-12 00:08:43.043596780 +0800
最近改动:2025-08-12 00:08:43.045596863 +0800
创建时间:2025-08-12 00:08:43.043596780 +0800

使用 -c 格式化输出:

stat -c "Size: %s bytes, Modified: %y" t.sh
# 结果
# Size: 287 bytes, Modified: 2025-08-12 00:08:43.043596780 +0800

内存

free

free 显示系统的内存使用情况.

free [选项]

常用参数:

参数作用
-h以人类可读格式显示(自动转换为 KB/MB/GB)
-s <秒>每隔指定秒数刷新显示内存信息

例子:

free -h

结果:

              total        used        free      shared  buff/cache   available
Mem:          1.8Gi       1.3Gi       386Mi       2.0Mi       350Mi       560Mi
Swap:         2.0Gi       1.1Gi       907Mi

解释:
total: 总内存大小
used: 已使用的内存(不含缓存和缓冲)
free: 当前未使用的内存
shared: 多个进程共享的内存大小
buff/cache: 用作缓存和缓冲的内存,Linux 会尽量利用空闲内存做缓存提高效率
available: 预计可用内存大小(可以被新程序使用而不会触发交换)

重点说明:

  • Linux 系统会用 空闲内存 做缓存(buff/cache),这部分内存可以在需要时释放给程序使用,所以不应该简单把缓存当成“已用”。
  • available 是一个比较准确反映剩余可用内存的字段。
  • Swap 是虚拟内存,物理内存用尽后系统会把部分内容写入交换区,通常应保持尽量少用 Swap,否则可能说明内存不足。

top/htop

top 命令可以实时监控系统的 CPU、内存、负载以及各个进程的资源占用情况。

# 运行后会进入交互界面, 默认每隔 3 秒刷新一次。按 q 退出
top

输出内容: 上半部分是系统整体状态, 下半部分是进程列表。

上半部分 (系统概况):

top - 21:41:22 up 202 days, 22:02,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 125 total,   2 running, 123 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.8 us,  0.2 sy,  0.0 ni, 98.8 id,  0.0 wa,  0.2 hi,  0.0 si,  0.0 st
MiB Mem :   1871.0 total,    376.8 free,   1274.3 used,    380.2 buff/cache
MiB Swap:   2048.0 total,    895.1 free,   1152.8 used.    596.7 avail Mem

load average: 系统负载 (1 分钟, 5 分钟, 15 分钟)
Tasks: 进程总数和状态
%Cpu(s): CPU 使用率 (us 用户态, sy 内核态, id 空闲, wa 等待 I/O)
Mem/Swap: 内存与交换分区使用情况

下半部分 (进程列表):

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 972744 root      20   0  100688  10724   6616 S   0.7   0.6 170:59.67 AliYunDun
 972766 root      20   0  191960  39200  12624 S   0.7   2.0 392:44.74 AliYunDunMonito

PID: 进程 ID
USER: 所属用户
PR/NI: 优先级/优先级调整值
VIRT/RES/SHR: 虚拟内存/常驻内存/共享内存
%CPU/%MEM: 占用 CPU / 内存百分比
TIME+: 运行时间
COMMAND: 进程名

常用交互操作(在 top 界面中可以按以下键):

  • P 按 CPU 占用排序
  • M 按内存占用排序
  • 1 显示每个 CPU 核心的使用率
  • Shift + H 显示线程
  • f/o 自定义显示字段

常用参数:

top -p 1234       # 只监控 PID 为 1234 的进程
top -u username   # 只显示指定用户的进程

网络与传输

# 网络连通性测试
ping google.com

# 测试远程 80 端口是否开放
telnet example.com 80
# 端口开放的话, 返回结果中包含: Connected to example.com
# 端口没开放的话, 会提示: Connection refused 或 Connection timed out

ssh 和 scp

ssh [参数] 用户名@主机地址 [命令]

如果指定了 命令, 则直接在远程执行该命令, 执行完后退出

常用参数:

参数作用
-p PORT指定端口
-i FILE指定私钥文件
-L本地端口转发
-f后台运行. 可以配合 -L 在后台开 tunnel
-T不分配伪终端. 如果只是在远程执行命令, 不需要交互时 建议开启
-v显示调试信息

例子:

# 登录远程主机(默认端口22)
ssh user@192.168.1.10

# 指定端口登录
ssh -p 2222 user@192.168.1.10

# 使用私钥文件登录
ssh -i ~/.ssh/id_rsa user@192.168.1.10

# 在远程执行命令
ssh user@192.168.1.10 "uptime"

# 端口转发, 把本地 8080 端口的数据转发到远程主机的 80 端口
ssh -L 8080:localhost:80 user@192.168.1.10

配合配置文件使用, 编辑 ~/.ssh/config:

Host myserver
    HostName 192.168.1.10
    User user
    Port 2222
    IdentityFile ~/.ssh/id_rsa

登录时只需要:

ssh myserver
scp [参数] 源文件 目标文件

源文件和目标文件 都可以是:

  • 本地路径(如 /home/user/file.txt)
  • 远程路径(如 user@host:/path/file.txt)

常用参数

参数说明
-r递归复制目录
-P指定远程服务器的 SSH 端口(注意是大写 P)
-C传输时启用压缩,提高速度

例子:

# 从本地复制到远程, 开启压缩加速
scp -P 2222 -C file.txt user@remote:/tmp/

# 从远程复制到本地
scp user@remote:/path/to/remote.txt ./local.txt

# 复制整个目录(加 -r): 把本地的 mydir 目录(及里面的所有文件)复制到远程 /path/to/
scp -r mydir user@remote:/path/to/

注意事项

  • scp 传输时会占用 SSH 带宽,如果传输大文件速度慢,可以考虑 rsync
  • 默认不会提示是否覆盖文件,直接覆盖。

rsync

rsync 是一个非常强大的文件同步和传输工具,它既可以在 本地 同步文件,也可以通过 SSH 在 远程主机之间同步 文件。

rsync 传输速度快的原因:

  1. 增量同步
  • rsync 会先比较源文件和目标文件的差异,只传输 修改过的部分,而不是整个文件。
  • 对比 scp:scp 总是完整传输整个文件,即使只改了一点内容也要全部传。
  1. 智能文件检测
  • rsync 会检测文件大小、时间戳甚至可以按 校验和 (checksum) 判断文件是否变化,避免重复传输。
  1. 支持断点续传
  • 中断后重新传输,只传未完成的部分,不必从头再来。

常用参数

参数说明
-a归档模式,保留权限、时间戳、符号链接等
-v显示详细信息
-z传输时启用压缩
-r递归复制目录
–delete删除目标端多余文件,保持同步
-P显示进度,并支持中断续传
-e “ssh -p 2222”指定远程连接的 SSH 端口

例子:

# 本地文件同步:
rsync -av /src/ /dest/

# 远程文件同步:(-avz 一般是标配)
rsync -avz /local/ user@remote:/remote/

# 从远程同步到本地,并删除目标多余文件
rsync -avz --delete user@remote:/home/user/data/ /home/user/data/  

# 使用自定义 SSH 端口
rsync -avz -e "ssh -p 2222" /home/user/data/ user@remote:/home/user/data/

总结
scp:每次都完整传输文件,适合小文件或临时传输。
rsync:增量传输 + 压缩 + 断点续传,适合大文件、大目录的同步任务。

curl

curl 用于与 URL 交互,支持 HTTP、HTTPS、FTP 等多种协议。

curl [选项] URL

例子:

# 把网页内容输出到终端(默认: 发送 GET 请求)
curl http://example.com
# 保存到文件(-o 文件名)
curl -o index.html http://example.com
# -O:保持远程文件名保存
curl -O http://example.com/index.html

# 发送 POST 请求
curl -X POST -d "username=tom&password=123" http://example.com/login
# -X:指定请求方法 (GET, POST, PUT, DELETE…)
# -d:请求体数据 (表单格式)

# JSON 请求
curl -X POST -H "Content-Type: application/json" \
     -d '{"name":"Tom","age":20}' \
     http://example.com/api/user
#	-H:添加请求头
# -d:请求体数据 (JSON 或其他格式)

# 带 Cookie
curl -b "sessionid=123456" http://example.com
# -b:发送 Cookie
# -c cookie.txt:把服务器返回的 Cookie 保存到文件

文件搜索 find

find 用于在目录树中查找符合条件的文件或目录。支持按文件名、类型、大小、时间、权限多种条件搜索,并可以对搜索出来的文件执行操作。

find [搜索路径] [搜索条件] [操作]

常用搜索条件

条件说明示例
-name按文件名匹配(支持通配符 * ?)-name “*.txt”
-iname忽略大小写匹配文件名-iname “*.jpg”
-type按类型查找:f 文件、d 目录、l 符号链接-type d
-size按文件大小查找:+n 大于 n、-n 小于 n、n 等于 n(单位:c 字节,k KB,M MB,G GB)-size +10M
-mtime按修改时间查找:+n n 天前修改,-n n 天内修改-mtime -7
-atime按访问时间查找-atime +30
-perm按权限查找-perm 644
-user按属主查找-user root

常用操作

操作说明示例
-print打印匹配的路径(默认行为,可省略)find . -name “*.log” -print
-exec对每个匹配文件执行命令find . -name “*.tmp” -exec rm -f {} ;
-delete删除匹配文件或目录find . -name “*.bak” -delete
-ls以类似 ls -l 的方式显示文件信息find /var -type f -ls

例子:

# 按名称查找
find /tmp -name "*.txt"

# 查找最近 7 天修改过的文件
find /tmp -mtime -7

# 查找大于 100MB 的文件
find /tmp -type f -size +100M

# 删除目录下所有 .bak 文件
find /tmp -type f -name "*.bak" -delete

# 查找并执行命令(给当前目录下所有 .sh 文件加可执行权限)
find . -type f -name "*.sh" -exec chmod +x {} \;
# {}  表示 find 找到的每个文件或目录
# \;  表示对每个文件单独执行一次命令
find . -type f -name "*.log" -exec rm -f {} +
# +   表示把所有匹配文件一次性传递给命令执行(效率比 \; 更高)

# 结合管道使用(在日志文件中查找包含 “ERROR” 的行)
find /var/log -type f -name "*.log" | xargs grep "ERROR"

文本搜索 grep

文本搜索工具 grep 用于在文件或标准输入中查找符合模式的行, 支持正则表达式。

grep [选项] '模式' 文件

模式:可以是普通字符串,也可以是正则表达式
文件:要搜索的目标文件,如果不指定文件,则从标准输入读取

常用选项

选项作用
-i忽略大小写匹配
-v反向匹配,即显示不包含模式的行
-r 或 -R递归搜索目录
-n显示匹配行的行号
-c只显示匹配行的数量
-l只显示包含匹配内容的文件名
-w匹配整词,而不是部分匹配
-e指定多个匹配模式
–exclude-dir=DIR搜索时排除子目录 DIR, 支持通配符
–exclude=PATTERN排除匹配模式 PATTERN 的文件, 支持通配符

例子:

# 搜索 /var/log/output.log 中包含 “error” 的行
grep "error" /var/log/output.log

# 显示行号(-n)
grep -n "error" /var/log/output.log

# 反向匹配: 显示不包含 “INFO” 的行
grep -v "INFO" /var/log/output.log

# 在 ~/projects/ 目录及子目录中搜索文件中含 “TODO” 的行
grep -r "TODO" ~/projects/

# 统计匹配行数
grep -c "error" /var/log/output.log

# 多模式匹配: 匹配 “error” 或 “fail”
grep -e "error" -e "fail" /var/log/syslog

# 排除指定目录
grep -r --exclude-dir=logs "ERROR" /home/user/project
# 排除多个目录
grep -r --exclude-dir={logs,tmp} "ERROR" /home/user/project
# 支持通配符
grep -r --exclude-dir=tmp* "ERROR" /home/user/project
# 排除文件
grep -r --exclude="*.log" "ERROR" /home/user/project
grep -r --exclude=={"*.log","*.tmp"} "ERROR" /home/user/project

其他

系统信息:

uname 查看系统类型、内核版本和机器架构

uname -a

结果:

Linux MyJosie 5.10.134-18.al8.x86_64 #1 SMP Fri Dec 13 16:56:53 CST 2024 x86_64 x86_64 x86_64 GNU/Linux

hostnamectl 用于 查看和管理 主机名以及系统信息

hostnamectl

结果:

  Static hostname: MyJosie
        Icon name: computer-vm
          Chassis: vm
      Machine ID: 2a4ed15a10874d3b8ae4c1a79fec2dad
          Boot ID: 5a639c4fbae547fbaddfb220fb00eb3c
  Virtualization: kvm
Operating System: Alibaba Cloud Linux 3.2104 U11 (OpenAnolis Edition)
          Kernel: Linux 5.10.134-18.al8.x86_64
    Architecture: x86-64

• Static hostname:静态主机名
• Icon name:图标名称
• Chassis:机箱类型,例如 vm、desktop、laptop
• Machine ID:系统唯一标识
• Virtualization:虚拟化类型(如 kvm、docker)
• Operating System:操作系统名称
• Kernel:内核版本
• Architecture:硬件架构

Linux 目录结构

Linux 的目录结构遵循 Unix 文件系统层次标准 (Filesystem Hierarchy Standard, FHS),每个目录都有明确的用途

常见目录及用途:

目录作用
/bin基础用户命令,普通用户和单用户模式都可用的可执行程序,如 ls, cp, mv
/sbin系统管理命令,一般由 root 使用,如 ifconfig, reboot
/usr用户程序和共享数据,包含子目录 /usr/bin(普通用户的可执行程序), /usr/sbin, /usr/lib(程序库文件), /usr/lib, /usr/local(本地安装软件)
/lib核心共享库,支持 /bin 和 /sbin 的程序
/lib6464 位系统核心库
/etc系统配置文件,大部分配置文件都在这里,如网络配置、用户管理
/var可变数据,日志、邮件、缓存、数据库文件, /var/log(系统和服务日志)
/tmp临时文件,系统重启会清理
/home用户主目录,每个用户的个人文件和配置
/rootroot 用户的主目录
/opt可选应用程序,第三方软件常安装在这里
/dev设备文件,硬件和虚拟设备接口,如 /dev/sda
/proc内存文件系统,包含系统和进程信息,虚拟文件系统
/sys也是虚拟文件系统,显示内核和设备信息
/boot启动文件,内核、initramfs、GRUB 配置
/mnt临时挂载点,系统管理员自定义挂载使用

文本处理

文本处理: vim, sed, awk
后面另外写一篇吧