HiHuo
首页
博客
手册
工具
关于
首页
博客
手册
工具
关于
  • Linux 系统工具完全指南

    • Linux 系统工具完全指南
    • 高频工具 - 每天使用
    • 中频工具 - 每周使用
    • 低频但重要的工具
    • 开发环境工具
    • 故障排查与诊断

低频但重要的工具

这些工具不是天天用,但关键时刻能救命,提前了解绝对值得


一、容器技术

1.1 Docker

Docker 是什么?

Docker 是一个开源的容器化平台,让你可以将应用及其依赖打包到一个可移植的容器中运行。容器比虚拟机更轻量,启动更快。

安装 Docker

# Ubuntu
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

# 或使用官方脚本
curl -fsSL https://get.docker.com | sh

# 将用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
# 重新登录后生效

镜像管理

# 搜索镜像
docker search nginx

# 拉取镜像
docker pull nginx
docker pull nginx:1.21
docker pull ubuntu:22.04

# 查看本地镜像
docker images
docker image ls

# 删除镜像
docker rmi nginx
docker rmi nginx:1.21
docker image prune          # 删除未使用的镜像
docker image prune -a       # 删除所有未使用的镜像

# 镜像详情
docker inspect nginx

# 镜像历史
docker history nginx

# 保存/加载镜像
docker save nginx > nginx.tar
docker load < nginx.tar

# 构建镜像
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.prod .

容器管理

# 运行容器
docker run nginx                        # 前台运行
docker run -d nginx                     # 后台运行
docker run -d --name mynginx nginx      # 指定名称
docker run -d -p 8080:80 nginx          # 端口映射
docker run -d -p 80:80 -p 443:443 nginx # 多端口映射
docker run -d -P nginx                  # 自动映射端口

# 环境变量
docker run -d -e MYSQL_ROOT_PASSWORD=123456 mysql

# 挂载卷
docker run -d -v /host/path:/container/path nginx
docker run -d -v myvolume:/data nginx   # 命名卷
docker run -d -v $(pwd):/app node       # 当前目录

# 资源限制
docker run -d --memory=512m --cpus=1 nginx

# 查看容器
docker ps                   # 运行中的容器
docker ps -a                # 所有容器
docker ps -q                # 只显示 ID

# 容器操作
docker start container_id
docker stop container_id
docker restart container_id
docker pause container_id
docker unpause container_id

# 删除容器
docker rm container_id
docker rm -f container_id           # 强制删除运行中的
docker container prune              # 删除所有停止的容器

# 查看日志
docker logs container_id
docker logs -f container_id         # 实时跟踪
docker logs --tail 100 container_id # 最后100行
docker logs --since "1h" container_id

# 进入容器
docker exec -it container_id /bin/bash
docker exec -it container_id sh
docker exec container_id ls /app

# 查看容器详情
docker inspect container_id
docker stats                        # 实时资源使用
docker top container_id             # 容器内进程

# 复制文件
docker cp file.txt container_id:/path/
docker cp container_id:/path/file.txt ./

Dockerfile 编写

# 基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY package*.json ./

# 安装依赖
RUN npm ci --only=production

# 复制源码
COPY . .

# 暴露端口
EXPOSE 3000

# 环境变量
ENV NODE_ENV=production

# 启动命令
CMD ["node", "server.js"]

多阶段构建:

# 构建阶段
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

Docker Compose

docker-compose.yml 示例:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://postgres:password@db:5432/mydb
    depends_on:
      - db
      - redis
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:14
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    restart: unless-stopped

volumes:
  postgres_data:
# Docker Compose 命令
docker-compose up                    # 前台启动
docker-compose up -d                 # 后台启动
docker-compose up --build            # 重新构建
docker-compose down                  # 停止并删除
docker-compose down -v               # 同时删除卷
docker-compose ps                    # 查看状态
docker-compose logs                  # 查看日志
docker-compose logs -f web           # 跟踪特定服务
docker-compose exec web bash         # 进入容器
docker-compose restart web           # 重启服务
docker-compose pull                  # 拉取最新镜像

Docker 网络

# 查看网络
docker network ls

# 创建网络
docker network create mynetwork
docker network create --driver bridge mybridge

# 连接容器到网络
docker network connect mynetwork container_id
docker network disconnect mynetwork container_id

# 运行时指定网络
docker run -d --network mynetwork nginx

# 查看网络详情
docker network inspect mynetwork

Docker 卷

# 创建卷
docker volume create myvolume

# 查看卷
docker volume ls
docker volume inspect myvolume

# 删除卷
docker volume rm myvolume
docker volume prune                  # 删除未使用的卷

清理 Docker

# 清理所有未使用的资源
docker system prune
docker system prune -a               # 包括未使用的镜像
docker system prune --volumes        # 包括卷

# 查看磁盘使用
docker system df

1.2 Podman

Podman 是 Docker 的替代品,无需守护进程,更安全:

# 安装
sudo apt install podman

# 命令与 Docker 兼容
podman run -d nginx
podman ps
podman images

# 可以设置别名
alias docker=podman

二、性能分析工具

2.1 strace - 系统调用追踪

strace 可以追踪进程的系统调用,排查程序行为问题:

# 追踪命令
strace ls
strace -o output.txt ls          # 输出到文件

# 追踪运行中的进程
strace -p 1234

# 常用选项
strace -e open ls                # 只追踪 open 调用
strace -e trace=file ls          # 追踪文件相关调用
strace -e trace=network curl ... # 追踪网络调用
strace -e trace=process ./app    # 追踪进程相关
strace -c ls                     # 统计系统调用
strace -T ls                     # 显示每个调用耗时
strace -t ls                     # 显示时间戳
strace -f ./app                  # 追踪子进程

# 追踪类别
# file: 文件操作
# network: 网络操作
# process: 进程操作
# signal: 信号
# ipc: 进程间通信
# memory: 内存映射

实际应用场景

# 1. 查找程序读取的配置文件
strace -e open,openat ./app 2>&1 | grep -E '\.(conf|cfg|ini|yaml|json)'

# 2. 排查程序为什么启动慢
strace -c -f ./app

# 3. 查看程序连接的网络地址
strace -e connect curl https://example.com 2>&1

# 4. 排查文件权限问题
strace -e access,open ./app 2>&1 | grep -i denied

2.2 ltrace - 库函数追踪

ltrace 追踪程序调用的动态库函数:

ltrace ./app
ltrace -c ./app                  # 统计调用
ltrace -e malloc ./app           # 追踪特定函数

2.3 perf - 性能分析

perf 是 Linux 内核提供的性能分析工具:

# 安装
sudo apt install linux-tools-common linux-tools-generic

# CPU 性能分析
sudo perf top                    # 实时 CPU 热点
sudo perf stat ./app             # 执行统计
sudo perf record ./app           # 记录性能数据
sudo perf report                 # 查看报告

# 追踪特定事件
sudo perf record -e cpu-cycles ./app
sudo perf record -g ./app        # 记录调用栈

# 火焰图
sudo perf record -g ./app
sudo perf script > out.perf
# 使用 FlameGraph 工具生成火焰图

2.4 lsof - 列出打开的文件

lsof 显示进程打开的文件、网络连接等:

# 查看所有打开的文件
lsof

# 查看特定进程
lsof -p 1234

# 查看特定用户
lsof -u username

# 查看特定文件
lsof /var/log/syslog

# 查看目录下打开的文件
lsof +D /var/log

# 查看网络连接
lsof -i                          # 所有网络连接
lsof -i :80                      # 特定端口
lsof -i tcp                      # TCP 连接
lsof -i tcp:80                   # TCP 80端口
lsof -i @192.168.1.100           # 特定 IP

# 查看 UNIX 套接字
lsof -U

# 查看特定命令
lsof -c nginx

# 查找被删除但仍占用的文件
lsof | grep deleted

# 组合使用
lsof -u root -i tcp:22           # root 用户的 SSH 连接

2.5 fuser - 查找使用文件的进程

# 查看谁在使用文件
fuser /var/log/syslog

# 查看端口占用
fuser 80/tcp
fuser -v 80/tcp                  # 详细信息

# 杀死占用进程
fuser -k 80/tcp                  # 杀死占用 80 端口的进程
fuser -k /mnt/data               # 杀死占用挂载点的进程

2.6 pmap - 进程内存映射

pmap 1234                        # 查看进程内存映射
pmap -x 1234                     # 扩展信息
pmap -X 1234                     # 更详细

三、安全工具

3.1 fail2ban - 防暴力破解

fail2ban 自动封禁多次失败登录的 IP:

# 安装
sudo apt install fail2ban

# 启动服务
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 查看状态
sudo fail2ban-client status
sudo fail2ban-client status sshd

# 查看封禁的 IP
sudo fail2ban-client status sshd

# 手动封禁/解封
sudo fail2ban-client set sshd banip 192.168.1.100
sudo fail2ban-client set sshd unbanip 192.168.1.100

配置文件 /etc/fail2ban/jail.local:

[DEFAULT]
bantime = 3600          # 封禁1小时
findtime = 600          # 10分钟内
maxretry = 5            # 最多5次失败
ignoreip = 127.0.0.1/8 192.168.1.0/24

[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 86400         # SSH 封禁24小时

3.2 SELinux (CentOS/RHEL)

SELinux 是强制访问控制系统:

# 查看状态
getenforce
sestatus

# 模式切换
sudo setenforce 0                # 临时切换到 Permissive
sudo setenforce 1                # 切换到 Enforcing

# 永久修改
# 编辑 /etc/selinux/config
SELINUX=enforcing               # enforcing/permissive/disabled

# 查看文件上下文
ls -Z /var/www/html

# 修改文件上下文
sudo chcon -t httpd_sys_content_t /var/www/html/index.html
sudo restorecon -v /var/www/html/

# 查看布尔值
getsebool -a
getsebool httpd_can_network_connect

# 修改布尔值
sudo setsebool -P httpd_can_network_connect on

# 查看审计日志
sudo ausearch -m avc -ts recent
sudo audit2why < /var/log/audit/audit.log

3.3 AppArmor (Ubuntu/Debian)

AppArmor 是 Ubuntu 默认的安全模块:

# 查看状态
sudo aa-status
sudo apparmor_status

# 查看配置
ls /etc/apparmor.d/

# 切换模式
sudo aa-complain /etc/apparmor.d/usr.sbin.nginx  # 投诉模式
sudo aa-enforce /etc/apparmor.d/usr.sbin.nginx   # 强制模式

# 禁用配置
sudo aa-disable /etc/apparmor.d/usr.sbin.nginx

# 重新加载
sudo systemctl reload apparmor

3.4 SSH 安全加固

# 编辑 /etc/ssh/sshd_config

# 禁用密码登录
PasswordAuthentication no

# 禁用 root 登录
PermitRootLogin no

# 限制用户
AllowUsers deploy admin

# 更改端口
Port 2222

# 限制登录尝试
MaxAuthTries 3
LoginGraceTime 30

# 禁用空密码
PermitEmptyPasswords no

# 使用协议 2
Protocol 2

3.5 网络安全扫描

# nmap - 端口扫描
nmap localhost                   # 扫描本机
nmap 192.168.1.100              # 扫描特定主机
nmap -sV 192.168.1.100          # 版本检测
nmap -O 192.168.1.100           # 操作系统检测
nmap -p 1-1000 192.168.1.100    # 指定端口范围
nmap -sU 192.168.1.100          # UDP 扫描
nmap 192.168.1.0/24             # 扫描网段

# netcat - 网络调试
nc -zv 192.168.1.100 80         # 测试端口
nc -l 8080                       # 监听端口
nc 192.168.1.100 8080           # 连接端口

四、调试工具

4.1 gdb - GNU 调试器

gdb 是 Linux 下最强大的程序调试器:

# 启动调试
gdb ./program
gdb -p 1234                      # 附加到进程

# 基本命令
(gdb) run                        # 运行程序
(gdb) run arg1 arg2              # 带参数运行
(gdb) break main                 # 在 main 设断点
(gdb) break file.c:20            # 在文件第20行设断点
(gdb) info breakpoints           # 查看断点
(gdb) delete 1                   # 删除断点1
(gdb) continue                   # 继续运行
(gdb) next                       # 单步(不进入函数)
(gdb) step                       # 单步(进入函数)
(gdb) print var                  # 打印变量
(gdb) backtrace                  # 调用栈
(gdb) frame 2                    # 切换栈帧
(gdb) quit                       # 退出

# 分析 core dump
gdb ./program core               # 分析崩溃转储

4.2 valgrind - 内存调试

valgrind 用于检测内存泄漏和错误:

# 内存检查
valgrind ./program
valgrind --leak-check=full ./program
valgrind --leak-check=full --show-leak-kinds=all ./program

# 性能分析
valgrind --tool=callgrind ./program

4.3 tcpdump - 网络抓包

# 基本抓包
sudo tcpdump                     # 抓取所有流量
sudo tcpdump -i eth0             # 指定接口

# 过滤
sudo tcpdump host 192.168.1.100  # 指定主机
sudo tcpdump port 80             # 指定端口
sudo tcpdump src 192.168.1.100   # 源地址
sudo tcpdump dst 192.168.1.100   # 目标地址
sudo tcpdump tcp                 # TCP 流量
sudo tcpdump udp                 # UDP 流量

# 组合过滤
sudo tcpdump host 192.168.1.100 and port 80
sudo tcpdump 'host 192.168.1.100 and (port 80 or port 443)'

# 输出选项
sudo tcpdump -n                  # 不解析域名
sudo tcpdump -nn                 # 不解析域名和端口
sudo tcpdump -v                  # 详细
sudo tcpdump -vv                 # 更详细
sudo tcpdump -c 100              # 抓取100个包
sudo tcpdump -A                  # ASCII 显示
sudo tcpdump -X                  # 十六进制显示

# 保存到文件
sudo tcpdump -w capture.pcap
sudo tcpdump -r capture.pcap     # 读取文件

# HTTP 抓包
sudo tcpdump -i eth0 -A -s 0 'port 80 and tcp'

4.4 wireshark/tshark

# tshark - 命令行 wireshark
sudo tshark -i eth0
sudo tshark -i eth0 -f "port 80"
sudo tshark -r capture.pcap

# 过滤
sudo tshark -i eth0 -Y "http.request"
sudo tshark -i eth0 -Y "tcp.port == 80"

五、配置管理与自动化

5.1 Ansible

Ansible 是无代理的配置管理工具:

# 安装
sudo apt install ansible
# 或
pip install ansible

# 配置主机清单
# /etc/ansible/hosts 或 ./inventory
[webservers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11

[dbservers]
db1 ansible_host=192.168.1.20

[all:vars]
ansible_user=deploy
ansible_ssh_private_key_file=~/.ssh/deploy_key

Ad-hoc 命令

# 测试连接
ansible all -m ping

# 执行命令
ansible webservers -m shell -a "uptime"
ansible all -m shell -a "df -h"

# 复制文件
ansible webservers -m copy -a "src=./app.conf dest=/etc/app/"

# 安装软件
ansible webservers -m apt -a "name=nginx state=present" --become

# 管理服务
ansible webservers -m service -a "name=nginx state=restarted" --become

Playbook

# deploy.yml
---
- name: Deploy web application
  hosts: webservers
  become: yes

  vars:
    app_version: "1.2.0"

  tasks:
    - name: Install nginx
      apt:
        name: nginx
        state: present
        update_cache: yes

    - name: Copy nginx config
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: Restart nginx

    - name: Deploy application
      copy:
        src: "{{ app_version }}/dist/"
        dest: /var/www/html/

    - name: Ensure nginx is running
      service:
        name: nginx
        state: started
        enabled: yes

  handlers:
    - name: Restart nginx
      service:
        name: nginx
        state: restarted
# 运行 Playbook
ansible-playbook deploy.yml
ansible-playbook deploy.yml --check        # 检查模式
ansible-playbook deploy.yml --diff         # 显示差异
ansible-playbook deploy.yml -l webservers  # 限制主机

5.2 Terraform

Terraform 用于基础设施即代码:

# 安装
wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

# 基本命令
terraform init                   # 初始化
terraform plan                   # 预览变更
terraform apply                  # 应用变更
terraform destroy                # 销毁资源
terraform show                   # 显示状态
terraform state list             # 列出资源

示例配置:

# main.tf
provider "aws" {
  region = "us-west-2"
}

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "web-server"
  }
}

六、虚拟化

6.1 KVM/QEMU

# 检查虚拟化支持
egrep -c '(vmx|svm)' /proc/cpuinfo

# 安装
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

# 检查服务
sudo systemctl status libvirtd

# 管理虚拟机(virsh)
virsh list --all                 # 列出所有 VM
virsh start vm-name              # 启动
virsh shutdown vm-name           # 关机
virsh destroy vm-name            # 强制关机
virsh reboot vm-name             # 重启
virsh suspend vm-name            # 暂停
virsh resume vm-name             # 恢复
virsh undefine vm-name           # 删除定义
virsh console vm-name            # 控制台
virsh dominfo vm-name            # VM 信息

# 快照
virsh snapshot-create-as vm-name snapshot1
virsh snapshot-list vm-name
virsh snapshot-revert vm-name snapshot1
virsh snapshot-delete vm-name snapshot1

6.2 Vagrant

Vagrant 用于管理开发环境虚拟机:

# 安装
# 从 https://www.vagrantup.com/downloads 下载

# 基本命令
vagrant init ubuntu/jammy64      # 初始化
vagrant up                       # 启动
vagrant ssh                      # SSH 连接
vagrant halt                     # 关机
vagrant destroy                  # 删除
vagrant status                   # 状态
vagrant reload                   # 重载配置

# 快照
vagrant snapshot save name
vagrant snapshot restore name
vagrant snapshot list

Vagrantfile 示例:

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/jammy64"
  config.vm.hostname = "dev-server"

  config.vm.network "private_network", ip: "192.168.56.10"
  config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx
  SHELL
end

6.3 VirtualBox

# 命令行管理
VBoxManage list vms              # 列出 VM
VBoxManage list runningvms       # 运行中的 VM
VBoxManage startvm "VM Name" --type headless  # 无头启动
VBoxManage controlvm "VM Name" poweroff       # 关机
VBoxManage snapshot "VM Name" take "snapshot1" # 快照

七、其他实用工具

7.1 screen/tmux 进阶

tmux 配置

# ~/.tmux.conf
# 修改前缀键
set -g prefix C-a
unbind C-b

# 鼠标支持
set -g mouse on

# 分屏快捷键
bind | split-window -h
bind - split-window -v

# 窗口编号从1开始
set -g base-index 1
setw -g pane-base-index 1

# 状态栏
set -g status-bg black
set -g status-fg white
set -g status-left '#[fg=green]#S '
set -g status-right '#[fg=yellow]%Y-%m-%d %H:%M'

7.2 jq - JSON 处理

# 安装
sudo apt install jq

# 基本用法
cat data.json | jq .
cat data.json | jq '.name'
cat data.json | jq '.users[0]'
cat data.json | jq '.users | length'
cat data.json | jq '.users[] | .name'
cat data.json | jq '.users | map(.name)'

# 过滤
cat data.json | jq '.users[] | select(.age > 18)'
cat data.json | jq '.users[] | select(.name | contains("John"))'

# 修改
cat data.json | jq '.name = "new name"'
cat data.json | jq '.users += [{"name": "new"}]'

# 紧凑输出
cat data.json | jq -c .

# 原始字符串输出
cat data.json | jq -r '.name'

7.3 yq - YAML 处理

# 安装
sudo wget -qO /usr/local/bin/yq https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64
sudo chmod +x /usr/local/bin/yq

# 基本用法
yq '.name' config.yaml
yq '.services.web.image' docker-compose.yml
yq '.services | keys' docker-compose.yml

# 修改
yq -i '.name = "new"' config.yaml

7.4 expect - 自动化交互

#!/usr/bin/expect

spawn ssh user@host

expect "password:"
send "mypassword\r"

expect "$ "
send "uptime\r"

expect "$ "
send "exit\r"

expect eof

7.5 parallel - 并行执行

# 安装
sudo apt install parallel

# 并行执行命令
cat hosts.txt | parallel ssh {} uptime
ls *.jpg | parallel convert {} -resize 50% small_{}
find . -name "*.log" | parallel gzip

# 指定并发数
parallel -j 4 ...

总结

本章介绍的工具虽然使用频率不高,但在特定场景下非常重要:

  1. Docker/容器:现代应用部署的标准方式
  2. 性能分析工具:排查性能问题的利器
  3. 安全工具:保护服务器安全
  4. 调试工具:定位程序问题
  5. 配置管理:自动化运维的基础
  6. 虚拟化:开发测试环境管理

建议:

  • Docker 是必须掌握的
  • strace 和 tcpdump 排查问题很有用
  • fail2ban 生产服务器一定要装
  • Ansible 自动化运维必备

下一章将介绍开发环境工具,包括编辑器、版本管理、数据库客户端等。

Prev
中频工具 - 每周使用
Next
开发环境工具