WSL

📦 安装与初始化

# 安装 WSL(默认 Ubuntu)
wsl --install

# 安装指定发行版
wsl --install -d Ubuntu-24.04
wsl --install -d Debian
wsl --install -d kali-linux

# 查看可安装的发行版
wsl --list --online
wsl -l -o

# 更新 WSL 本体
wsl --update
wsl --update --pre-release             # 预发布版本
wsl --update rollback                  # 回滚更新

# 查看 WSL 版本信息
wsl --version
wsl --status

🖥️ 发行版管理

# 查看已安装发行版
wsl --list
wsl -l
wsl --list --verbose                   # 含版本和状态
wsl -l -v

# 设置默认发行版
wsl --set-default Ubuntu-24.04
wsl -s Ubuntu-24.04

# 切换发行版的 WSL 版本
wsl --set-version Ubuntu-24.04 2       # 升级到 WSL2
wsl --set-version Ubuntu-24.04 1       # 降级到 WSL1

# 设置新装发行版的默认版本
wsl --set-default-version 2

# 注销(删除)发行版
wsl --unregister Ubuntu-24.04          # 数据会丢失!

# 重命名发行版(通过导入导出实现)
wsl --export Ubuntu-24.04 ubuntu.tar
wsl --import MyUbuntu D:\WSL\MyUbuntu ubuntu.tar
wsl --unregister Ubuntu-24.04

▶️ 启动与关闭

# 启动
wsl                                    # 启动默认发行版
wsl -d Ubuntu-24.04                    # 启动指定发行版
wsl -d Ubuntu-24.04 -u root            # 以 root 启动
wsl -d Ubuntu-24.04 --cd ~             # 从家目录启动
wsl -d Ubuntu-24.04 --cd /mnt/c/Users  # 从指定目录启动
wsl ~ -d Ubuntu-24.04                  # 简写:从家目录启动

# 在 WSL 中执行单条命令(执行完退出)
wsl -d Ubuntu-24.04 -- ls -la
wsl -d Ubuntu-24.04 -- python3 script.py
wsl -- echo "hello from WSL"

# 关闭
wsl --terminate Ubuntu-24.04           # 关闭指定发行版
wsl -t Ubuntu-24.04                    # 简写
wsl --shutdown                         # 关闭所有 WSL 实例和虚拟机

📦 导入与导出(备份 / 迁移)

# 导出发行版为 tar 文件
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar.gz  # 压缩格式(WSL 2.0+)

# 导入发行版
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu D:\backup\ubuntu.tar
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu ubuntu.tar --version 2  # 指定版本

# 导入 VHD 磁盘镜像
wsl --import-in-place Ubuntu-24.04 D:\WSL\ubuntu.vhdx

# 迁移到其他盘(常用!默认装在C盘)
wsl --export Ubuntu-24.04 D:\backup\ubuntu.tar
wsl --unregister Ubuntu-24.04
wsl --import Ubuntu-24.04 D:\WSL\Ubuntu D:\backup\ubuntu.tar --version 2

# 导入后修复默认用户(否则会变成 root)
# 在 WSL 内执行:
ubuntu2404 config --default-user 你的用户名

📁 文件路径互访

# 在 WSL 中访问 Windows 文件
/mnt/c/                                # C 盘根目录
/mnt/d/                                # D 盘根目录
cd /mnt/c/Users/你的用户名/Desktop
cd /mnt/d/Projects

# 在 Windows 资源管理器中访问 WSL 文件
\\wsl$\Ubuntu-24.04\                   # 地址栏输入
\\wsl$\Ubuntu-24.04\home\用户名
\\wsl.localhost\Ubuntu-24.04\          # 新版 Windows 写法

# 在 WSL 中打开 Windows 应用
explorer.exe .                         # 用资源管理器打开当前目录
explorer.exe /mnt/c/Users             # 打开指定目录
notepad.exe 文件名                     # 用记事本打开
code .                                 # 用 VS Code 打开(需安装)
cmd.exe /c start .                     # 另一种打开方式

# 在 Windows PowerShell 中运行 Linux 命令
wsl ls -la
wsl -e bash -c "cat /etc/os-release"
wsl pwd

# 路径转换
wslpath -w /home/user/file             # Linux 路径 → Windows 路径
wslpath -u 'C:\Users\user'            # Windows 路径 → Linux 路径
wslpath -a 相对路径                    # 转为绝对路径

🌐 网络配置

# 查看 WSL 的 IP(WSL 内执行)
ip addr show eth0
hostname -I

# 查看 Windows 主机 IP(WSL 内执行)
cat /etc/resolv.conf | grep nameserver
ip route | grep default | awk '{print $3}'

# 从 WSL 访问 Windows 上的服务
# 使用 Windows 主机 IP(上面查到的)即可
curl http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):8080

# 从 Windows 访问 WSL 中的服务(WSL2)
# 直接用 localhost 即可(WSL2 会自动转发)
http://localhost:8080

# WSL2 端口转发到局域网(PowerShell 管理员)
netsh interface portproxy add v4tov4 `
  listenport=8080 listenaddress=0.0.0.0 `
  connectport=8080 connectaddress=127.0.0.1

# 查看端口转发规则
netsh interface portproxy show all

# 删除端口转发
netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=0.0.0.0

⚙️ .wslconfig 全局配置

位置:C:\Users\你的用户名\.wslconfig

[wsl2]
# 资源限制
memory=8GB                             # 内存上限(默认物理内存的50%)
processors=4                           # CPU 核心数
swap=2GB                               # 交换空间大小
swapFile=D:\\WSL\\swap.vhdx           # 自定义 swap 文件位置

# 网络
networkingMode=mirrored                # 镜像网络(Win11 推荐)
dnsTunneling=true                      # DNS 隧道(配合镜像网络)
firewall=true                          # WSL 防火墙
autoProxy=true                         # 自动继承 Windows 代理

# 性能
pageReporting=true                     # 释放未使用内存给 Windows
vmIdleTimeout=60000                    # 空闲多少毫秒后关闭虚拟机

# 其他
guiApplications=true                   # 启用 GUI 应用(WSLg)
debugConsole=false
nestedVirtualization=true             # 嵌套虚拟化

[experimental]
autoMemoryReclaim=gradual              # 自动回收内存(gradual/dropcache)
sparseVhd=true                         # 自动压缩 VHD 减少占用

⚙️ wsl.conf 发行版配置

位置:WSL 内 /etc/wsl.conf

[boot]
systemd=true                           # 启用 systemd(强烈推荐)
command="service docker start"         # 启动时执行命令

[automount]
enabled=true                           # 自动挂载 Windows 盘
root=/mnt/                             # 挂载根路径
options="metadata,umask=22,fmask=11"  # 挂载选项(修复权限问题)
mountFsTab=true                        # 挂载 /etc/fstab

[network]
hostname=myWSL                         # 自定义主机名
generateResolvConf=true                # 自动生成 DNS 配置

[user]
default=你的用户名                      # 默认登录用户

[interop]
enabled=true                           # 允许运行 Windows 程序
appendWindowsPath=true                 # PATH 中包含 Windows 路径

🎮 GPU 与 CUDA 支持

# 前提:Windows 上安装 NVIDIA 驱动(WSL 内不需要装驱动)

# 验证 GPU 是否识别(WSL 内)
nvidia-smi

# 安装 CUDA Toolkit(WSL 内,可选)
# 推荐直接用 pip 安装 PyTorch,无需单独装 CUDA
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128

# 验证
python3 -c "import torch; print(torch.cuda.is_available())"

# Docker + GPU(WSL 内)
docker run --gpus all nvidia/cuda:12.0-base nvidia-smi

🖼️ GUI 应用(WSLg)

# Windows 11 / 较新的 Windows 10 已内置 WSLg
# 无需额外配置,直接运行 Linux GUI 程序

# 安装并运行 GUI 应用示例
sudo apt install gedit -y && gedit     # 文本编辑器
sudo apt install nautilus -y && nautilus  # 文件管理器
sudo apt install x11-apps -y && xclock   # 测试 GUI 是否正常

# 查看 WSLg 版本
wsl --version | grep WSLg

# 如果 GUI 不显示,检查 DISPLAY 变量
echo $DISPLAY
export DISPLAY=:0                      # 手动设置(一般不需要)

🔄 与 Windows 互操作

# WSL 内调用 Windows 命令
explorer.exe .
notepad.exe
powershell.exe -Command "Get-Date"
cmd.exe /c dir
wslview URL                            # 用默认浏览器打开(需安装 wslu)

# 安装 wslu 工具集(增强互操作)
sudo apt install wslu -y
wslview https://google.com             # 打开浏览器
wslvar USERPROFILE                     # 获取 Windows 环境变量
wslsys                                 # 查看系统信息

# PowerShell 中操作 WSL
wsl -d Ubuntu-24.04 -- apt update      # 执行命令
wsl --export Ubuntu-24.04 backup.tar  # 备份
(wsl -d Ubuntu-24.04 -- cat /etc/os-release)  # 获取输出

# 共享 SSH 密钥(Windows → WSL)
cp /mnt/c/Users/用户名/.ssh/id_ed25519 ~/.ssh/
chmod 600 ~/.ssh/id_ed25519

🧹 维护与清理

# 收缩 VHD 虚拟磁盘(释放 Windows 磁盘空间)
# 先在 WSL 内清理
sudo apt clean && sudo apt autoremove -y
docker system prune -af               # 清理 Docker

# 关闭 WSL 后在 PowerShell(管理员)执行
wsl --shutdown
diskpart
# diskpart 内:
select vdisk file="C:\Users\用户名\AppData\Local\Packages\...\ext4.vhdx"
attach vdisk readonly
compact vdisk
detach vdisk
exit

# 或使用 WSL 自带命令(较新版本)
wsl --manage Ubuntu-24.04 --set-sparse true   # 开启稀疏 VHD(自动收缩)

# 查看 VHD 文件位置
# 通常在:
# C:\Users\用户名\AppData\Local\Packages\CanonicalGroupLimited...\LocalState\ext4.vhdx

# 重置发行版(慎用!数据会清空)
wsl --unregister Ubuntu-24.04
wsl --install -d Ubuntu-24.04

🚀 常用开发场景

# 用 VS Code 打开 WSL 项目(WSL 内执行)
code .                                 # 需安装 VS Code + Remote WSL 插件

# 设置 Windows Terminal 默认打开 WSL
# 在 Windows Terminal 设置中,将默认配置改为 Ubuntu

# 代理设置(如果 Windows 用了代理)
# 在 .wslconfig 中开启 autoProxy=true
# 或手动设置(WSL 内)
export http_proxy=http://$(ip route | grep default | awk '{print $3}'):7890
export https_proxy=$http_proxy
export all_proxy=socks5://$(ip route | grep default | awk '{print $3}'):7890

# 让代理永久生效
echo 'export http_proxy=http://$(ip route | grep default | awk '"'"'{print $3}'"'"'):7890' >> ~/.bashrc
echo 'export https_proxy=$http_proxy' >> ~/.bashrc
source ~/.bashrc

# 固定 WSL2 的 IP(hosts 方式)
# 在 PowerShell 中获取 WSL IP 并写入 hosts
wsl hostname -I | ForEach-Object { Add-Content C:\Windows\System32\drivers\etc\hosts "$_ wsl.local" }

Ubuntu

📦 软件包管理

# 更新
sudo apt update                        # 更新包列表
sudo apt upgrade -y                    # 升级所有包
sudo apt full-upgrade -y               # 升级(含依赖变更)
sudo apt update && sudo apt upgrade -y # 一步完成

# 安装 / 卸载
sudo apt install 包名
sudo apt install 包名 -y               # 自动确认
sudo apt install 包名=版本号            # 安装指定版本
sudo apt reinstall 包名                # 重新安装
sudo apt remove 包名                   # 卸载(保留配置)
sudo apt purge 包名                    # 卸载(删配置)
sudo apt autoremove -y                 # 删除不再需要的依赖

# 查询
apt search 关键词
apt show 包名                          # 查看包详情
apt list --installed                   # 已安装的包
apt list --upgradable                  # 可升级的包
dpkg -l                                # 所有已安装包
dpkg -l | grep 包名                    # 查找指定包
dpkg -L 包名                           # 查看包安装的文件
which 命令名                           # 查找命令路径
whereis 命令名                         # 查找命令及相关文件

# 清理
sudo apt clean                         # 清理下载缓存
sudo apt autoclean                     # 清理旧版本缓存
sudo apt autoremove --purge -y         # 彻底清理无用包

📁 文件与目录

# 查看
ls                                     # 列出文件
ls -l                                  # 详细列表
ls -la                                 # 含隐藏文件
ls -lh                                 # 人性化大小
ls -lt                                 # 按时间排序
ls -lS                                 # 按大小排序
ls -R                                  # 递归列出
tree                                   # 树状结构(需安装)
tree -L 2                              # 只显示2层

# 切换目录
cd /路径
cd ~                                   # 家目录
cd -                                   # 上次目录
cd ..                                  # 上一级
pwd                                    # 显示当前路径

# 创建
mkdir 目录名
mkdir -p a/b/c                         # 递归创建
touch 文件名                           # 创建空文件
touch -t 202401011200 文件名           # 指定时间戳

# 复制
cp 源 目标
cp -r 源目录 目标目录                  # 递归复制
cp -p 源 目标                          # 保留权限和时间戳
cp -a 源 目标                          # 完整归档复制
cp -u 源 目标                          # 只复制更新的文件
cp -v 源 目标                          # 显示进度

# 移动 / 重命名
mv 源 目标
mv -i 源 目标                          # 覆盖前确认
mv -n 源 目标                          # 不覆盖已有文件
mv -v 源 目标                          # 显示操作

# 删除
rm 文件名
rm -r 目录名                           # 递归删除
rm -f 文件名                           # 强制删除
rm -rf 目录名                          # 强制递归删除(慎用!)
rm -i 文件名                           # 删除前确认

# 链接
ln -s 源 软链接名                      # 创建软链接
ln 源 硬链接名                         # 创建硬链接
readlink -f 软链接                     # 查看链接指向

🔍 文件查找与搜索

# find 查找文件
find / -name "文件名"                  # 全盘查找
find . -name "*.py"                   # 当前目录找 py 文件
find . -type f                        # 只找文件
find . -type d                        # 只找目录
find . -size +100M                    # 大于100MB
find . -size -1k                      # 小于1KB
find . -mtime -7                      # 7天内修改
find . -newer 参考文件                 # 比某文件新
find . -name "*.log" -delete          # 找到并删除
find . -name "*.py" -exec wc -l {} \; # 找到并执行命令
find . -perm 755                      # 按权限查找
find . -user 用户名                    # 按用户查找

# grep 搜索内容
grep "关键词" 文件名
grep -r "关键词" 目录                  # 递归搜索
grep -i "关键词" 文件                  # 忽略大小写
grep -n "关键词" 文件                  # 显示行号
grep -v "关键词" 文件                  # 反向匹配(不含)
grep -l "关键词" *.txt                 # 只显示文件名
grep -c "关键词" 文件                  # 统计匹配行数
grep -A 3 "关键词" 文件                # 显示匹配后3行
grep -B 3 "关键词" 文件                # 显示匹配前3行
grep -E "正则表达式" 文件              # 扩展正则
grep --include="*.py" -r "关键词" .   # 只搜索指定类型

# locate(更快,基于索引)
sudo updatedb                          # 更新索引
locate 文件名
locate -i 文件名                       # 忽略大小写

📄 文件查看与编辑

# 查看内容
cat 文件名                             # 全部输出
cat -n 文件名                          # 显示行号
cat -A 文件名                          # 显示特殊字符
less 文件名                            # 分页查看(q退出)
more 文件名                            # 分页查看
head 文件名                            # 前10行
head -n 20 文件名                      # 前20行
tail 文件名                            # 后10行
tail -n 20 文件名                      # 后20行
tail -f 文件名                         # 实时追踪(看日志)
tail -f -n 100 文件名                  # 实时追踪后100行

# 文件比较
diff 文件1 文件2
diff -u 文件1 文件2                    # unified 格式
diff -r 目录1 目录2                    # 比较目录

# 文本处理
wc 文件名                              # 统计行/字/字节
wc -l 文件名                           # 只统计行数
wc -w 文件名                           # 只统计字数
sort 文件名                            # 排序
sort -r 文件名                         # 逆序
sort -n 文件名                         # 按数值排序
sort -k 2 文件名                       # 按第2列排序
sort -u 文件名                         # 排序并去重
uniq 文件名                            # 去除连续重复行
uniq -c 文件名                         # 统计重复次数
cut -d ',' -f 1 文件名                 # 按分隔符取列
awk '{print $1}' 文件名                # 取第1列
sed 's/旧/新/g' 文件名                 # 替换内容
sed -i 's/旧/新/g' 文件名             # 原地替换
tr 'a-z' 'A-Z' < 文件名               # 转换大小写

# 编辑器
nano 文件名                            # 新手友好
  # Ctrl+O 保存  Ctrl+X 退出  Ctrl+K 剪切行

vim 文件名
  # i 插入  Esc 退出编辑  :wq 保存退出  :q! 强制退出
  # dd 删除行  yy 复制行  p 粘贴  /关键词 搜索

🔐 权限管理

# chmod 修改权限
chmod 755 文件名                       # rwxr-xr-x
chmod 644 文件名                       # rw-r--r--
chmod +x 文件名                        # 添加执行权限
chmod -x 文件名                        # 移除执行权限
chmod -R 755 目录                      # 递归修改
chmod u+x 文件名                       # 只给所有者加执行
chmod go-w 文件名                      # 组和其他人移除写权限

# chown 修改所有者
chown 用户名 文件名
chown 用户名:组名 文件名
chown -R 用户名:组名 目录              # 递归修改
chgrp 组名 文件名                      # 只改组

# 查看权限
ls -l 文件名
stat 文件名                            # 详细权限和时间信息
getfacl 文件名                         # ACL 权限

# sudo 相关
sudo 命令                              # 以管理员执行
sudo -i                                # 切换到 root shell
sudo -u 用户名 命令                    # 以指定用户执行
sudo -l                                # 查看当前用户 sudo 权限
visudo                                 # 安全编辑 sudoers

👤 用户与组管理

# 用户操作
sudo adduser 用户名                    # 创建用户(交互式)
sudo useradd -m -s /bin/bash 用户名   # 创建用户(非交互式)
sudo userdel 用户名                    # 删除用户
sudo userdel -r 用户名                 # 删除用户及家目录
sudo usermod -aG sudo 用户名           # 加入 sudo 组
sudo usermod -aG docker 用户名         # 加入 docker 组
sudo usermod -l 新名 旧名              # 改用户名
sudo usermod -d /新路径 用户名         # 改家目录
sudo usermod -s /bin/zsh 用户名        # 改默认 shell

# 密码
passwd                                 # 修改当前用户密码
sudo passwd 用户名                     # 修改指定用户密码
sudo passwd -l 用户名                  # 锁定账户
sudo passwd -u 用户名                  # 解锁账户

# 组操作
sudo groupadd 组名
sudo groupdel 组名
sudo gpasswd -a 用户名 组名            # 加入组
sudo gpasswd -d 用户名 组名            # 移出组
groups 用户名                          # 查看用户所属组

# 查看
whoami                                 # 当前用户
id                                     # 当前用户 UID/GID
id 用户名                              # 指定用户信息
who                                    # 登录用户
w                                      # 登录用户及活动
last                                   # 登录历史
cat /etc/passwd                        # 所有用户
cat /etc/group                         # 所有组

# 切换
su 用户名                              # 切换用户
su - 用户名                            # 切换并加载环境

⚙️ 进程管理

# 查看进程
ps aux                                 # 所有进程详情
ps aux | grep 进程名                   # 查找指定进程
ps -ef                                 # 完整格式
pstree                                 # 树状显示
pgrep 进程名                           # 查找进程 PID
pgrep -u 用户名                        # 指定用户的进程

# 实时监控
top
top -u 用户名                          # 指定用户
top -p PID                             # 指定进程
htop                                   # 更好用(需安装)

# 结束进程
kill PID
kill -9 PID                            # 强制结束(SIGKILL)
kill -15 PID                           # 优雅结束(SIGTERM)
killall 进程名                         # 按名称结束
killall -9 进程名
pkill 进程名                           # 按名称结束(支持正则)
pkill -u 用户名                        # 结束指定用户进程

# 后台与任务
命令 &                                 # 后台运行
Ctrl + Z                               # 挂起当前进程
jobs                                   # 查看后台任务
fg %1                                  # 调回前台
bg %1                                  # 后台继续运行
disown %1                              # 从 jobs 中移除(不挂断)
nohup 命令 &                           # 断开 SSH 后继续运行
nohup 命令 > output.log 2>&1 &        # 同时记录日志

# 进程优先级
nice -n 10 命令                        # 以低优先级启动
renice -n 5 -p PID                     # 修改运行中进程优先级

💻 系统信息

# 系统版本
uname -a                               # 内核信息
uname -r                               # 内核版本
lsb_release -a                         # 发行版信息
cat /etc/os-release

# CPU
lscpu                                  # CPU 详细信息
nproc                                  # CPU 核心数
cat /proc/cpuinfo

# 内存
free -h                                # 内存使用
vmstat                                 # 虚拟内存统计
vmstat -s                              # 内存统计摘要
cat /proc/meminfo

# GPU
nvidia-smi                             # GPU 状态(需驱动)
nvidia-smi -l 1                        # 每秒刷新
nvidia-smi --query-gpu=name,memory.used,memory.free --format=csv

# 运行时间 / 负载
uptime
uptime -p                              # 人性化显示
w                                      # 负载 + 登录用户

# 硬件
lshw                                   # 所有硬件信息
lshw -short                            # 简要
lspci                                  # PCI 设备(显卡/网卡)
lspci -v                               # 详细
lsusb                                  # USB 设备
dmidecode -t memory                    # 内存硬件信息

💾 磁盘与存储

# 使用情况
df -h                                  # 各分区使用率
df -hT                                 # 含文件系统类型
df -i                                  # inode 使用情况
du -sh 目录名                          # 目录总大小
du -sh *                               # 当前目录各项大小
du -sh * | sort -rh                    # 按大小排序
du -ah --max-depth=1 目录              # 限制深度

# 分区信息
lsblk                                  # 块设备列表
lsblk -f                               # 含文件系统信息
sudo fdisk -l                          # 分区详情
sudo blkid                             # 设备 UUID

# 挂载
sudo mount /dev/sdb1 /mnt/disk
sudo mount -t ntfs /dev/sdb1 /mnt      # 指定文件系统
sudo umount /mnt/disk
sudo umount -l /mnt/disk               # 强制卸载(懒卸载)
cat /etc/fstab                         # 开机自动挂载配置

# 磁盘健康
sudo smartctl -a /dev/sda              # SMART 信息(需安装)
sudo badblocks -v /dev/sdb             # 坏块检测

🌐 网络

# IP 与接口
ip addr                                # 查看所有接口 IP
ip addr show eth0                      # 指定接口
hostname -I                            # 只显示 IP
ip link show                           # 网络接口状态
ip link set eth0 up/down              # 启用/禁用接口

# 路由
ip route                               # 路由表
ip route add default via 192.168.1.1  # 添加默认路由

# 连通性测试
ping google.com
ping -c 4 google.com                   # 只 ping 4次
ping -i 0.5 google.com                 # 间隔0.5秒
traceroute google.com                  # 路由追踪
mtr google.com                         # 实时路由追踪

# 端口与连接
ss -tulnp                              # 监听端口
ss -tulnp | grep :80                   # 查找指定端口
ss -antp                               # 所有 TCP 连接
netstat -tulnp                         # 同上(需装 net-tools)
lsof -i :8080                          # 占用端口的进程
lsof -i -n -P                          # 所有网络连接

# 下载
wget URL
wget -O 文件名 URL                     # 保存为指定文件名
wget -c URL                            # 断点续传
wget -b URL                            # 后台下载
curl -O URL                            # 下载文件
curl -L URL                            # 跟随重定向
curl -u 用户:密码 URL                  # 带认证
curl -X POST -d '{}' URL              # POST 请求
curl -H "Content-Type: application/json" URL

# SSH
ssh 用户@IP
ssh -p 2222 用户@IP                    # 指定端口
ssh -i 密钥文件 用户@IP                # 指定密钥
ssh -L 本地端口:目标IP:目标端口 用户@跳板机  # 本地端口转发

# SCP 传输
scp 文件 用户@IP:/路径                 # 上传
scp 用户@IP:/路径 本地                 # 下载
scp -r 目录 用户@IP:/路径             # 递归上传
scp -P 2222 文件 用户@IP:/路径        # 指定端口

# DNS
cat /etc/resolv.conf                   # DNS 配置
nslookup 域名                          # DNS 查询
dig 域名                               # 详细 DNS 查询
dig +short 域名                        # 只显示 IP

# 防火墙(ufw)
sudo ufw status                        # 查看状态
sudo ufw status verbose                # 详细状态
sudo ufw enable / disable
sudo ufw allow 22                      # 开放端口
sudo ufw allow 80/tcp
sudo ufw deny 3306
sudo ufw allow from 192.168.1.0/24    # 允许指定网段
sudo ufw delete allow 80               # 删除规则
sudo ufw reset                         # 重置所有规则

🔧 服务管理(systemd)

# 服务操作
sudo systemctl start 服务名
sudo systemctl stop 服务名
sudo systemctl restart 服务名
sudo systemctl reload 服务名           # 重新加载配置(不重启)
sudo systemctl status 服务名

# 开机自启
sudo systemctl enable 服务名
sudo systemctl disable 服务名
sudo systemctl enable --now 服务名    # 启用并立即启动
sudo systemctl is-enabled 服务名      # 查看是否自启

# 查看服务
systemctl list-units --type=service
systemctl list-units --type=service --state=running  # 运行中
systemctl list-unit-files --type=service             # 所有服务文件

# 日志(journalctl)
journalctl -u 服务名                   # 指定服务日志
journalctl -u 服务名 -f               # 实时追踪
journalctl -u 服务名 -n 100           # 最后100行
journalctl -b                          # 本次启动日志
journalctl -b -1                       # 上次启动日志
journalctl --since "1 hour ago"
journalctl -p err                      # 只看错误
journalctl -xe                         # 详细错误日志

🗜️ 压缩与解压

# tar.gz
tar -czvf 压缩包.tar.gz 目录/文件     # 压缩
tar -xzvf 压缩包.tar.gz               # 解压到当前目录
tar -xzvf 压缩包.tar.gz -C /路径      # 解压到指定目录
tar -tzvf 压缩包.tar.gz               # 查看内容(不解压)

# tar.xz(压缩率更高)
tar -cJvf 压缩包.tar.xz 目录
tar -xJvf 压缩包.tar.xz

# tar.bz2
tar -cjvf 压缩包.tar.bz2 目录
tar -xjvf 压缩包.tar.bz2

# zip
zip -r 压缩包.zip 目录
zip -r 压缩包.zip 目录 -x "*.pyc"    # 排除文件
unzip 压缩包.zip
unzip 压缩包.zip -d /路径             # 解压到指定目录
unzip -l 压缩包.zip                   # 查看内容

# gzip(单文件)
gzip 文件名                           # 压缩(原文件消失)
gzip -k 文件名                        # 保留原文件
gunzip 文件名.gz

🌍 环境变量

# 查看
env                                    # 所有环境变量
printenv PATH                          # 指定变量
echo $PATH
echo $HOME
echo $USER
echo $SHELL

# 临时设置(当前会话有效)
export 变量名=值
export PATH=$PATH:/新路径

# 永久设置
# 当前用户
echo 'export PATH=$PATH:/新路径' >> ~/.bashrc
echo 'export PATH=$PATH:/新路径' >> ~/.profile
source ~/.bashrc                       # 立即生效

# 所有用户
sudo nano /etc/environment             # 系统级
sudo nano /etc/profile.d/myenv.sh     # 脚本方式

# 取消变量
unset 变量名

⏰ 定时任务

# crontab
crontab -e                             # 编辑当前用户定时任务
crontab -l                             # 查看当前用户任务
crontab -r                             # 删除所有任务
sudo crontab -u 用户名 -e             # 编辑指定用户

# 格式:分 时 日 月 周 命令
# *  *  *  *  *  命令
# 0  2  *  *  *  每天凌晨2点
# */5 * * * *    每5分钟
# 0  9  *  *  1  每周一9点

# 系统定时任务目录
/etc/cron.daily/                       # 每天执行
/etc/cron.weekly/                      # 每周执行
/etc/cron.monthly/                     # 每月执行

🖥️ 终端多窗口(tmux / screen)

# tmux(推荐)
tmux                                   # 启动
tmux new -s 会话名                     # 创建命名会话
tmux ls                                # 列出会话
tmux attach -t 会话名                  # 重新连接
tmux kill-session -t 会话名            # 删除会话

# tmux 快捷键(前缀键 Ctrl+B)
Ctrl+B c                               # 新建窗口
Ctrl+B n / p                           # 下/上一个窗口
Ctrl+B %                               # 左右分屏
Ctrl+B "                               # 上下分屏
Ctrl+B 方向键                          # 切换面板
Ctrl+B d                               # 分离会话(后台保留)
Ctrl+B [                               # 进入滚动模式(q退出)

# screen
screen                                 # 启动
screen -S 会话名                       # 创建命名会话
screen -ls                             # 列出会话
screen -r 会话名                       # 重新连接
Ctrl+A d                               # 分离会话

🔑 SSH 密钥管理

# 生成密钥对
ssh-keygen -t ed25519 -C "备注"       # 推荐(ed25519)
ssh-keygen -t rsa -b 4096 -C "备注"   # RSA 4096

# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户@IP
ssh-copy-id -p 2222 用户@IP

# 配置文件(~/.ssh/config)
Host myserver
    HostName 192.168.1.100
    User ubuntu
    Port 2222
    IdentityFile ~/.ssh/id_ed25519
# 之后直接 ssh myserver 即可

# SSH Agent
eval "$(ssh-agent -s)"                 # 启动 agent
ssh-add ~/.ssh/id_ed25519              # 添加密钥
ssh-add -l                             # 查看已加载密钥

📊 系统日志

# 主要日志文件
/var/log/syslog                        # 系统日志
/var/log/auth.log                      # 认证日志(登录/sudo)
/var/log/kern.log                      # 内核日志
/var/log/dpkg.log                      # 包安装日志
/var/log/apt/history.log               # apt 操作历史
/var/log/nginx/                        # Nginx 日志
/var/log/mysql/                        # MySQL 日志

# 查看日志
sudo tail -f /var/log/syslog
sudo grep "error" /var/log/syslog
sudo journalctl -xe                    # 系统错误日志
sudo dmesg                             # 内核环形缓冲区
sudo dmesg | tail -50
sudo dmesg | grep -i error

Docker

🖥️ 容器生命周期

# 创建并启动
docker run -it --rm --name 容器名 镜像名 bash
  -i / -t / -it          # 交互式终端
  -d                     # 后台运行
  --rm                   # 退出后自动删除
  --name 容器名           # 指定名称
  --restart unless-stopped  # 重启策略(no/always/on-failure/unless-stopped)
  --entrypoint bash      # 覆盖默认入口

# 启动 / 停止 / 重启
docker start 容器名
docker stop 容器名
docker stop -t 30 容器名  # 等待30秒后强制停止
docker restart 容器名
docker kill 容器名         # 强制停止
docker kill -s SIGTERM 容器名  # 发送指定信号

# 暂停 / 恢复
docker pause 容器名
docker unpause 容器名

# 删除
docker rm 容器名
docker rm -f 容器名        # 强制删除运行中的容器
docker rm -v 容器名        # 同时删除关联匿名卷
docker container prune -f  # 清理所有停止的容器

🔍 容器查看与监控

# 列出容器
docker ps                  # 运行中
docker ps -a               # 所有
docker ps -q               # 只显示 ID
docker ps -s               # 显示占用大小
docker ps --filter status=exited     # 按状态过滤
docker ps --filter name=myapp        # 按名称过滤
docker ps --filter ancestor=nginx    # 按镜像过滤
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"  # 自定义格式

# 日志
docker logs 容器名
docker logs -f 容器名              # 实时追踪
docker logs -t 容器名              # 显示时间戳
docker logs --tail 100 容器名      # 最后100行
docker logs --since 30m 容器名     # 最近30分钟
docker logs --since 2024-01-01 --until 2024-01-02 容器名

# 资源监控
docker stats                       # 所有容器实时资源
docker stats 容器名                 # 指定容器
docker stats --no-stream           # 只显示一次(不刷新)
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

# 详细信息
docker inspect 容器名
docker inspect -f '{{.State.Status}}' 容器名           # 运行状态
docker inspect -f '{{.NetworkSettings.IPAddress}}' 容器名  # IP地址
docker inspect -f '{{json .HostConfig.Binds}}' 容器名  # 挂载信息
docker inspect -f '{{json .Config.Env}}' 容器名        # 环境变量

# 进程 / 变更
docker top 容器名                  # 查看容器内进程
docker diff 容器名                 # 查看文件系统变更

⚙️ 容器交互与操作

# 进入运行中的容器
docker exec -it 容器名 bash
docker exec -it -u root 容器名 bash      # 以 root 进入
docker exec -w /workspace 容器名 bash   # 指定工作目录
docker exec -e DEBUG=1 容器名 python app.py  # 传入环境变量
docker exec -d 容器名 命令               # 后台执行

# 文件传输
docker cp 本地文件 容器名:/容器路径       # 宿主机 → 容器
docker cp 容器名:/容器路径 本地路径       # 容器 → 宿主机
docker cp -a 容器名:/logs/ ./backup/    # 保留权限和时间戳

# 提交容器为镜像(快照)
docker commit 容器名 新镜像名:tag
docker commit -m "说明" -a "作者" 容器名 镜像名:tag

🗂️ 资源限制

docker run \
  --memory=4g              # 内存上限
  --memory-swap=8g         # 内存+swap 总上限
  --cpus=2                 # CPU 核数
  --cpu-shares=512         # CPU 相对权重(默认1024)
  --shm-size=2g            # 共享内存(PyTorch 多进程必备)
  --ulimit nofile=65535    # 文件描述符限制
  镜像名

🖼️ 镜像管理

# 拉取
docker pull ubuntu:22.04
docker pull --platform linux/arm64 镜像名  # 指定平台
docker pull -a 镜像名                      # 拉取所有 tag

# 查看
docker images
docker images -a                           # 含中间层
docker images -q                           # 只显示 ID
docker images --filter dangling=true       # 悬空镜像
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

# 删除
docker rmi 镜像名:tag
docker rmi -f 镜像名                       # 强制删除
docker image prune                         # 删除悬空镜像
docker image prune -a -f                   # 删除所有未使用镜像

# 标签
docker tag 源镜像:tag 新镜像名:tag

# 详情
docker inspect 镜像名
docker history 镜像名                      # 查看镜像层历史
docker history --no-trunc 镜像名           # 完整显示

🔨 镜像构建

docker build -t 镜像名:tag .
  -f Dockerfile路径          # 指定 Dockerfile
  --no-cache                 # 不使用缓存
  --pull                     # 始终拉取最新基础镜像
  --build-arg KEY=VALUE      # 传入构建参数
  --target 阶段名             # 多阶段构建指定目标
  --platform linux/amd64     # 跨架构构建
  --progress plain           # 显示详细日志
  --squash                   # 合并所有层(减小体积)
  --label key=value          # 添加镜像标签
  -q                         # 安静模式

# 常用组合
docker build -t myapp:v1 .
docker build -t myapp:v1 -f docker/Dockerfile --no-cache .
docker build --target builder --build-arg ENV=prod -t myapp .

📦 镜像导入导出

# 镜像存档(含完整历史层,用于迁移)
docker save -o 镜像.tar 镜像名:tag
docker save 镜像名 | gzip > 镜像.tar.gz   # 压缩保存
docker load -i 镜像.tar
docker load < 镜像.tar.gz

# 容器文件系统导出(不含历史层,体积更小)
docker export -o 容器快照.tar 容器名
docker import 容器快照.tar 新镜像名:tag
docker import -c "CMD bash" 容器快照.tar 新镜像名  # 指定启动命令

🌐 网络管理

# 运行时网络设置
docker run \
  --network bridge          # 指定网络
  --network host            # 使用宿主机网络
  -p 8080:80                # 端口映射
  -p 127.0.0.1:8080:80     # 绑定本地 IP
  -P                        # 随机映射所有暴露端口
  --hostname myhost         # 设置 hostname
  --ip 172.18.0.10          # 指定容器 IP
  --add-host db:1.2.3.4    # 添加 hosts 记录
  --dns 8.8.8.8             # 指定 DNS
  镜像名

# 网络管理
docker network ls
docker network create 网络名
docker network create -d bridge 网络名
docker network create --subnet 172.20.0.0/16 --gateway 172.20.0.1 网络名
docker network inspect 网络名
docker network connect --ip 172.20.0.10 网络名 容器名
docker network connect --alias db 网络名 容器名   # 添加别名
docker network disconnect 网络名 容器名
docker network rm 网络名
docker network prune -f    # 清理未使用网络

💾 数据卷管理

# 运行时挂载
docker run \
  -v /宿主机路径:/容器路径         # bind mount
  -v 卷名:/容器路径               # named volume
  -v /容器路径                    # 匿名 volume
  --mount type=bind,source=$(pwd),target=/app  # 显式写法
  --volumes-from 其他容器名        # 共享其他容器的卷
  镜像名

# 卷管理
docker volume create 卷名
docker volume create -d local 卷名
docker volume ls
docker volume ls -f dangling=true   # 未挂载的卷
docker volume inspect 卷名
docker volume rm 卷名
docker volume prune -f              # 清理未使用卷

🔑 权限与用户

docker run \
  -u 用户名                  # 指定运行用户
  -u 1000:1000              # UID:GID
  --privileged              # 特权模式(慎用)
  --cap-add SYS_PTRACE      # 添加 capability
  --cap-drop ALL            # 删除所有 capability
  --security-opt no-new-privileges  # 禁止提权
  --read-only               # 只读文件系统
  镜像名

🎮 GPU 支持

# 安装 nvidia-container-toolkit 后
docker run \
  --gpus all                      # 使用所有 GPU
  --gpus 1                        # 使用1块 GPU
  --gpus '"device=0,1"'           # 指定编号
  --gpus '"device=GPU-uuid"'      # 指定 UUID
  --shm-size=2g                   # 共享内存(多进程训练必备)
  镜像名

# 验证
docker run --gpus all nvidia/cuda:12.0-base nvidia-smi

🐙 Docker Compose

# 启动
docker compose up -d
docker compose up --build                 # 重新构建后启动
docker compose up --force-recreate        # 强制重建容器
docker compose up --scale web=3           # 扩容
docker compose up 服务名                  # 只启动指定服务
docker compose -f docker-compose.prod.yml up -d  # 指定文件
docker compose -p 项目名 up -d            # 指定项目名

# 停止
docker compose down
docker compose down -v                    # 同时删除 volume
docker compose down --rmi all            # 同时删除镜像
docker compose down --remove-orphans     # 删除孤立容器

# 查看
docker compose ps
docker compose ps -a
docker compose logs -f
docker compose logs -f --tail=50 服务名
docker compose top                        # 查看进程
docker compose config                     # 验证配置

# 操作
docker compose exec -it 服务名 bash
docker compose exec -u root 服务名 bash
docker compose restart 服务名
docker compose pull 服务名
docker compose build --no-cache 服务名

🏭 镜像仓库

# 登录 / 登出
docker login
docker login registry.example.com -u 用户名
docker logout

# 推送 / 拉取
docker push 镜像名:tag
docker push -a 镜像名          # 推送所有 tag
docker pull 镜像名:tag

# 搜索
docker search nginx
docker search --filter stars=100 nginx   # 按星数过滤
docker search --limit 5 nginx

🧹 系统清理

# 查看占用
docker system df              # 汇总
docker system df -v           # 详细

# 清理(由小到大)
docker container prune -f     # 停止的容器
docker image prune -f         # 悬空镜像
docker image prune -a -f      # 所有未使用镜像
docker volume prune -f        # 未使用卷
docker network prune -f       # 未使用网络
docker system prune -a --volumes -f  # 全部清理(慎用)

# 按条件清理
docker image prune --filter "until=24h"         # 24小时前的镜像
docker container prune --filter "until=24h"
docker image prune --filter "label=env=dev"

更多推荐