FIELD MANUAL / 命令速查
忘了命令,来这里查。
按任务找命令,先核对平台与风险。复制只复制文本,不会连接设备,也不会执行命令。
示例中的路径、服务名和 PID 必须替换并复核。查询命令也可能输出敏感信息或发出网络请求;不要把结果未经脱敏贴到公开网站。Linux、macOS 与 DSM 的命令选项不完全相同。
80 条命令
看清工作区与暂存区
git status --short --branch在仓库内查看分支和路径状态。
- 怎样判断结果
- “ M”为未暂存,“M ”为已暂存,“MM”为两处都有改动,“??”为未跟踪。
- 容易踩的坑
- 空状态不展示被忽略文件;合并冲突时状态码需按冲突语义解释。
查看尚未暂存的补丁
git diff -- src/demo.ts从仓库根目录比较示例文件的工作区与暂存区。
- 怎样判断结果
- 显示尚未暂存的增删;无差异时不输出补丁。
- 容易踩的坑
- 不包含已暂存部分,也不展示未跟踪文件正文。
检查下一次提交的内容
git diff --cached -- src/demo.ts比较暂存区与 HEAD。
- 怎样判断结果
- 输出将被纳入提交的该文件差异。
- 容易踩的坑
- 若暂存后继续编辑,这里不会显示后续未暂存编辑。
检查已暂存补丁空白问题
git diff --cached --check检查暂存差异中的空白错误和冲突标记。
- 怎样判断结果
- 通过通常无输出;发现问题时报告路径与行号并非零退出。
- 容易踩的坑
- 不能验证业务逻辑、类型或所有冲突处理正确性。
按块暂存已跟踪文件
git add -p -- src/demo.ts交互选择属于本次修复的块。
- 怎样判断结果
- y 接受、n 跳过、q 退出;结束后查看 cached diff。
- 容易踩的坑
- s 不一定能拆分每个块;未跟踪新文件应先独立检查。
取消暂存但保留内容
git restore --staged -- src/demo.ts从 HEAD 恢复该路径的暂存状态。
- 怎样判断结果
- 暂存补丁消失,编辑仍在工作区。
- 容易踩的坑
- 需要已有 HEAD;不要误加 --worktree,那会扩大覆盖范围。
保存临时现场
git stash push -u -m "before-demo-investigation"保存已跟踪修改及未跟踪文件,并清理被收纳内容。
- 怎样判断结果
- 出现保存说明,随后用 stash list 和 status 核对。
- 容易踩的坑
- 不包含忽略文件和子模块内部现场;重要文件先另有副本。
检查待恢复的现场
git stash show --stat --include-untracked 'stash@{0}'显示最新 stash 的文件统计,实际恢复前核对条目说明。
- 怎样判断结果
- 列出本次保存涉及的路径及行数统计。
- 容易踩的坑
- 编号随 stash 新增而变化;统计不是完整正文审查。Git 2.32 前的 show 不支持此 --include-untracked 选项。
恢复现场并保留 stash
git stash apply 'stash@{0}'在确认条目和当前分支后恢复;建议先保证工作区干净。
- 怎样判断结果
- 修改回到工作区,stash 条目仍保留。
- 容易踩的坑
- 可能冲突,普通 apply 不保证恢复暂存分层;不要反复应用。
反向处理最后一个普通提交
git revert HEAD仅在工作区干净、已用 git show 确认 HEAD 正是目标普通提交时使用。
- 怎样判断结果
- 产生抵消改动的新提交,或停在冲突处理阶段。
- 容易踩的坑
- 合并提交不能照搬;冲突解决后 continue,放弃序列用 abort,先另存冲突编辑。
核对实际 Node 执行路径
node -p "JSON.stringify({version:process.version,execPath:process.execPath,platform:process.platform,arch:process.arch})"输出当前进程版本、文件路径、操作系统和架构。
- 怎样判断结果
- 例如平台 darwin、linux 或 win32,架构可能是 arm64 或 x64。
- 容易踩的坑
- 这里是当前 shell 的 Node;项目脚本若启用独立运行时还需核对其实际环境。
查看直接依赖版本
pnpm list vue vite typescript vue-tsc --depth 0在实际应用包目录查看已安装直接依赖。
- 怎样判断结果
- 显示包名和实际安装版本。
- 容易踩的坑
- 没列出不等于整个工作区没有;确认目录和依赖层级。
追踪 Vite 的引入链
pnpm why vite查找当前包为何依赖 Vite。
- 怎样判断结果
- 显示直接或间接引入关系。
- 容易踩的坑
- 依赖多版本不自动构成错误,要结合实际加载位置。
按锁文件安装依赖
pnpm install --frozen-lockfile先确认清单、锁文件与 pnpm 主版本匹配;写入依赖目录但不更新锁文件。
- 怎样判断结果
- 一致时安装完成;缺少或过期锁文件时失败。
- 容易踩的坑
- 会下载、写缓存并可能运行允许脚本;工作区安装可影响多个包。
检查应用单文件组件类型
pnpm exec vue-tsc --noEmit -p tsconfig.app.json前提是本地已安装 vue-tsc 且此配置包含目标源码。
- 怎样判断结果
- 无类型错误时零退出;错误输出带路径和诊断编号。
- 容易踩的坑
- 不输出 JS 不等于不写缓存;根配置仅 references 时应走项目既有 build 类型检查流程。
固定本地开发入口
pnpm exec vite --host 127.0.0.1 --port 5173 --strictPort用已安装 Vite 启动回环服务,端口冲突直接失败。
- 怎样判断结果
- 显示本地地址,或明确报端口被占。
- 容易踩的坑
- 会写缓存;绕过项目 dev 脚本附加逻辑,先确认可直接调用。Ctrl+C 停止,不用于生产。
按 staging 模式生成产物
pnpm exec vite build --mode staging使用 staging 模式配置构建;先核对 outDir 是可再生目录。
- 怎样判断结果
- 生成静态产物,成功零退出。
- 容易踩的坑
- 可能清空输出目录;不自动执行项目额外类型检查。模式名不是 NODE_ENV。
本机验收构建产物
pnpm exec vite preview --host 127.0.0.1 --port 4173 --strictPort先完成构建,再用同一配置启动预览。
- 怎样判断结果
- 在本地地址看到已生成页面;Ctrl+C 结束。
- 容易踩的坑
- 不构建源码,不提供正式生产服务,也不能证明真实托管路由正确。
带来源检查本地健康接口
curl -i --max-time 10 'http://127.0.0.1:8080/health' -H 'Origin: http://127.0.0.1:5173'前提是自行控制的本机只读健康服务已启动;输出响应头与正文。
- 怎样判断结果
- 观察 HTTP 状态及允许来源头;连接拒绝说明没有连上此服务。
- 容易踩的坑
- curl 不执行浏览器 CORS 检查;成功仍需回浏览器验证。
模拟本地 GET 预检
curl -i --max-time 10 -X OPTIONS 'http://127.0.0.1:8080/health' -H 'Origin: http://127.0.0.1:5173' -H 'Access-Control-Request-Method: GET' -H 'Access-Control-Request-Headers: X-Demo-Trace'模拟带 X-Demo-Trace 头的跨源 GET 许可检查,只发送 OPTIONS。
- 怎样判断结果
- 核对允许来源、GET 方法与 X-Demo-Trace 头;204 本身不证明允许配置完整。
- 容易踩的坑
- 不会自动发送实际 GET;实际响应也需正确 CORS 头,API 必须是受控测试服务。
确认当前 Docker 上下文
docker context show用途:操作前确认当前 context 名称;无附加参数,不改变上下文。
- 怎样判断结果
- 返回 default、desktop-linux 或自定义名称,应与你计划的引擎相符。
- 容易踩的坑
- 名称本身不证明机器身份;DOCKER_HOST、DOCKER_CONTEXT 或命令行参数可能影响实际连接,应结合 docker version 核对,不随手切换生产目标。
同时查看客户端与引擎版本
docker version用途:核对 API 和引擎连接;无附加参数,分别显示 Client 与 Server。
- 怎样判断结果
- 两部分都能读取;Server 的版本与平台才是部署判断依据。
- 容易踩的坑
- docker --version 只反映客户端。只有 Client 或连接报错时先处理引擎连接,不能据此判断仓库不可达。
检查 Compose 插件能力
docker compose version用途:读取 Compose 插件版本;无附加参数,配合具体子命令 --help 判断选项。
- 怎样判断结果
- 显示 Compose 版本;支持本文语法后才继续。
- 容易踩的坑
- 本文使用 Compose v2 风格的 docker compose 命令。DSM 的套件版本不等于插件版本;若命令不存在,不要自动换成旧二进制运行新版配置。
只验证配置不展开秘密
docker compose -p bloglab -f compose.yaml config -q在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:解析并校验配置;-q 只验证不渲染完整配置。
- 怎样判断结果
- 退出码零且通常没有输出;非零时按报错定位缩进、缺失变量或非法字段。
- 容易踩的坑
- 不验证业务就绪或端口空闲。错误文本也需脱敏;不要改用 config --environment 排错后公开输出。
确认服务名
docker compose -p bloglab -f compose.yaml config --services在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:列出最终模型中的服务键;--services 仅输出服务名。
- 怎样判断结果
- 应包含 web;真实多服务项目会逐行出现其他服务。
- 容易踩的坑
- 服务名不是容器名。选错 -f 或项目目录可能得到另一套服务清单;此命令不证明容器已经创建。
查看包括已退出容器的状态
docker compose -p bloglab -f compose.yaml ps -a在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:查看运行与停止状态;-a 包含未运行容器。
- 怎样判断结果
- 查看 State/Status、服务和端口;退出或重复重启需结合日志排查。
- 容易踩的坑
- running 不代表业务健康,无 healthcheck 时不能推断就绪。空结果可能是项目名不一致,不能立即创建新项目覆盖判断。
按时间窗口读取服务日志
docker compose -p bloglab -f compose.yaml logs --since 15m --tail 200 --timestamps web在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:定位最近错误;--since 限定十五分钟,--tail 限制每容器行数,--timestamps 附时间。
- 怎样判断结果
- 按报错发生时间检查权限、连接、初始化和退出信息。
- 容易踩的坑
- 日志可能含秘密或业务数据,分享前脱敏;文件日志未必出现在这里。多副本会输出各自日志,不是全项目只取两百行。
查容器端口实际发布到哪里
docker compose -p bloglab -f compose.yaml port web 80在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:查询 web 的容器端口 80 对应的宿主入口。
- 怎样判断结果
- 示例应返回 127.0.0.1:18080;按地址确认是本机回环还是网络接口。
- 容易踩的坑
- NAS 回环不是笔记本 localhost;未发布或容器尚未创建可能无结果。旧 Engine 的回环隔离差异仍需检查。
仅检查挂载类型与读写标志
docker inspect --format '{{range .Mounts}}{{println .Type .Name .Destination .RW}}{{end}}' CONTAINER_ID用途:定位持久化挂载;先用 docker ps -a 取得并替换 CONTAINER_ID。--format 仅输出挂载必要字段。
- 怎样判断结果
- volume 的 Name 对应实际卷名,Destination 是容器目录,RW=false 表示该容器只读。
- 容易踩的坑
- 绑定挂载 Name 可能为空。本命令不打印 Env;不要用全量 inspect 分享配置,也不要把容器内目录当宿主机路径。
读取退出码与 OOM 标记
docker inspect --format 'status={{.State.Status}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}}' CONTAINER_ID用途:区分退出状态与内存终止线索;CONTAINER_ID 替换为已确认容器 ID,--format 只取三项状态。
- 怎样判断结果
- 看 status、exit 和 oom;oom=true 表示该状态记录中出现 OOM 终止。
- 容易踩的坑
- 非零退出需结合应用日志,137 不能单独证明 OOM。状态是当前可见记录,不是完整历史。
记录运行容器镜像身份
docker inspect --format 'ref={{.Config.Image}} image_id={{.Image}}' CONTAINER_ID用途:升级前后核对运行内容;替换 CONTAINER_ID,ref 是创建时引用,image_id 是所用镜像 ID。
- 怎样判断结果
- 记录引用和 sha256 镜像 ID;升级后核对是否符合目标。
- 容易踩的坑
- 仓库浮动标签可能已改变,Config.Image 相同不保证镜像内容相同;不要把本地 image ID 当远端清单摘要。
查询本地镜像仓库摘要
docker image inspect --format '{{json .RepoDigests}}' IMAGE_ID用途:记录可追溯仓库摘要;IMAGE_ID 替换为已确认的本地镜像 ID,--format 限定 RepoDigests。
- 怎样判断结果
- 返回仓库@sha256 引用数组;可用于部署记录。
- 容易踩的坑
- 本地构建或导入镜像可能没有 RepoDigests。空值时需要其他可信发布记录,不伪造摘要;跨平台摘要层次须辨清。
按名称筛查目标卷
docker volume ls --filter name=bloglab_site用途:确认示例卷存在;--filter name 缩小名称范围,不挂载或修改卷。
- 怎样判断结果
- 从输出核对精确名称 bloglab_site 和驱动。
- 容易踩的坑
- 可能匹配多个相似名字;列表存在不代表内容正确。拼错名称后运行挂载命令可能意外创建空卷,应先精确核对。
找出引用同一卷的容器
docker ps -a --filter volume=bloglab_site --format 'table {{.ID}}\t{{.Names}}\t{{.Status}}'用途:备份前检查卷使用者;-a 包含停止容器,volume 过滤引用,--format 限制输出列。
- 怎样判断结果
- 列出各容器及状态;核对是否存在其他写入者。
- 容易踩的坑
- 引用不代表正在写入;空结果也不能证明外部进程绝不访问该存储。数据库一致性仍由应用备份流程保证。
查看 Docker 分类磁盘用量
docker system df用途:镜像下载前或磁盘报警时分类查询;无附加参数。
- 怎样判断结果
- 查看 Images、Containers、Local Volumes 和 Build Cache 的用量及可回收估计。
- 容易踩的坑
- 可回收不是可以无损删除;也不是宿主机剩余空间。禁止据此直接 prune --volumes 或 down -v。
读取一次容器资源快照
docker stats --no-stream CONTAINER_ID用途:观察 CPU、内存及 I/O 指标;替换 CONTAINER_ID,--no-stream 输出一次后退出。
- 怎样判断结果
- 看内存使用与限制、CPU 和 I/O,必要时与同时间业务表现比较。
- 容易踩的坑
- 快照不能证明长期瓶颈或 OOM 原因;Mac 数值属于虚拟化引擎环境,不能等同整机全部内存。
只下载服务目标镜像
docker compose -p bloglab -f compose.yaml pull web在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:提前准备镜像;web 限定服务,联网下载并改变本地镜像缓存。
- 怎样判断结果
- 显示下载进度或已存在,成功退出表示该次拉取完成。
- 容易踩的坑
- 不会升级正在运行的容器。配置若要求 WEB_IMAGE,先设置已核实引用;失败时不要加忽略失败参数继续发布。
独立拉取指定版本镜像
docker pull docker.io/library/nginx:1.28.0-alpine用途:最小复现下载问题或准备示例镜像;显式仓库路径和标签避免省略标签默认选择。
- 怎样判断结果
- 正常时出现层状态及摘要,失败时按 DNS、TLS、认证、限流或平台信息分类。
- 容易踩的坑
- 联网并占磁盘;该历史标签只演示语法,不代表最新安全版本。成功下载不代表服务已更新或可运行。
查询远端支持的平台
docker buildx imagetools inspect docker.io/library/nginx:1.28.0-alpine用途:核对清单中可运行的平台;需要可用 Buildx,此命令联网查询元数据。
- 怎样判断结果
- 查看清单及 Platform 字段,确认所需 linux/arm64 或 linux/amd64。
- 容易踩的坑
- 只查询远端元数据,仍会产生网络访问。附属证明条目可能是 unknown/unknown;插件缺失不是镜像缺失。
通过官方流程登录 Docker Hub
docker login用途:为可信 Docker Hub 配置认证;无主机参数时使用默认 Hub 流程,按提示完成设备码等验证。
- 怎样判断结果
- 官方认证流程完成并提示登录成功,之后单独重试目标镜像。
- 容易踩的坑
- 联网并改变本地凭据存储;不读取或分享 config.json、口令或 token。登录不保证私有仓库权限,也不保证解决所有 429。
应用已经准备好的单服务配置
docker compose -p bloglab -f compose.yaml up -d --no-deps --no-build --pull never web在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:重建发生镜像或配置变化的 web;-d 后台,--no-deps 不连带依赖,--no-build 不构建,--pull never 不拉取。
- 怎样判断结果
- 成功后需检查 ps、镜像 ID、日志及关键业务路径;挂载命名卷被复用。
- 容易踩的坑
- 可能替换运行容器并中断服务,标 danger。先有备份及本地目标镜像,且依赖无需同步改变;旧插件先查帮助,参数不支持就停止。
在维护窗口停止静态服务
docker compose -p bloglab -f compose.yaml stop -t 30 web在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:停止现有 web;-t 30 给出退出等待秒数,不删除容器或卷。
- 怎样判断结果
- 后续 ps -a 应显示服务已停止,日志应符合正常关闭预期。
- 容易踩的坑
- 会中断业务,超时可能强制终止。停止 web 不保证数据库或其他容器停写,不能据此直接打包活动数据库卷。
恢复已停止的现有服务
docker compose -p bloglab -f compose.yaml start web在已核对的 bloglab 项目根目录执行,compose.yaml 须包含 web 服务;-p 固定项目名,-f 指定配置文件。用途:启动已经创建而停止的 web;不带重建参数。
- 怎样判断结果
- 服务进入运行状态,随后检查日志及访问路径。
- 容易踩的坑
- 会改变运行状态并触发应用启动行为。不会应用新镜像或替代迁移;不存在容器时不能用 start 完成首次部署。
把已停写静态卷归档到本地目录
docker run --rm --pull=never --network none \
--mount type=volume,src=bloglab_site,dst=/source,readonly \
--mount "type=bind,src=$PWD/backups,dst=/backup" \
alpine:3.22 sh -c 'test ! -e /backup/site-20260908.tar.gz && tar -czf /backup/site-20260908.tar.gz -C /source .'用途:备份静态站点文件。前提:精确核对源卷存在、全部写入者已停、项目根目录有 backups、已下载 alpine:3.22,终端路径与引擎宿主路径对应。--rm 删除临时容器,readonly 保护源卷,--pull=never 禁止临时拉取,--network none 禁用容器联网。
- 怎样判断结果
- 退出码零后检查归档存在和 tar 清单,再恢复到新卷验证内容;无输出本身不证明备份可靠。
- 容易踩的坑
- 会创建容器并写归档,标 write。同名归档存在就失败,重复演练需换文件名;不用于直接打包运行中数据库。远程 context 下本地 $PWD 不是远程目录。
按文件名缩小查找范围
find ./personal-lab -xdev -type f -name '*.log' -print-xdev 不跨文件系统,-type f 只选普通文件,单引号保护通配符;只在自己的实验目录查询。
- 怎样判断结果
- 示意:./personal-lab/logs/app.log;空输出仅表示范围内没有匹配。
- 容易踩的坑
- 权限拒绝时结果不完整,先核对路径和目录访问权;文件名可含换行,输出不能直接交给 xargs 或当作可靠记录边界。
核对权限与属主
stat -c '%A %a %U:%G %n' -- ./personal-lab/config.txt-c 指定格式,依次显示符号权限、八进制权限、属主属组和名称;-- 结束选项。
- 怎样判断结果
- 示意:-rw------- 600 lab:lab ./personal-lab/config.txt。
- 容易踩的坑
- 文件不存在先核对路径;属主解析可能显示数字。macOS stat 参数不同,ACL 与安全模块还可能额外限制访问。
仅收紧一个私人文件的权限
chmod u=rw,go= -- ./personal-lab/config.txt将属主设为读写并移除组与其他用户权限,仅适用于确实只供本人使用的普通文件;事先确认不是符号链接并记录旧权限。
- 怎样判断结果
- 成功通常无输出,再用 stat 核对为 600;相关共享服务可能因此无法读取。
- 容易踩的坑
- 失败先查属主与只读挂载,不能通过 sudo 或递归放权绕过;恢复需按之前记录的准确权限操作。
解包前审阅归档目录
tar --list --verbose --file=./personal-backup.tar--list 只列成员,--verbose 显示类型和链接目标,--file 指定可信归档;先核对来源。
- 怎样判断结果
- 示意:成员包含 photos/sample.jpg;不是已经解包,也不证明内容可信。
- 容易踩的坑
- 格式错误或意外绝对路径、上级路径、链接时停止;列清单也会读取归档并消耗资源,不解析未知恶意大包。
在独立目录创建个人归档
archive_dir=$(mktemp -d ./archive.XXXXXX) && tar --create --file="$archive_dir/personal.tar" --directory=./personal-lab .mktemp 创建独立目录;--create 创建归档,--directory 使成员使用相对路径,归档放在源目录外避免自包含。
- 怎样判断结果
- 成功通常无输出;终端变量 archive_dir 指向新目录,随后列出其中 personal.tar 验证。
- 容易踩的坑
- 创建目录失败则 && 阻止后续;文件读取中发生变化时应保留原始错误并重做一致性备份,不能把半成品当成功。
向新目录安全试解包
restore_dir=$(mktemp -d ./restore.XXXXXX) && tar --extract --file=./personal-backup.tar --directory="$restore_dir" --no-same-owner --no-same-permissions --keep-old-files仅对已审阅可信归档使用;新目录隔离恢复,拒绝覆盖同名文件,不恢复归档所有者,权限受当前 umask 限制;普通用户执行。
- 怎样判断结果
- 成功通常无输出;检查 restore_dir 中的文件并抽样打开。
- 容易踩的坑
- 失败不重试覆盖;不加 -P,不用 root。此命令不是恶意归档沙箱,磁盘不足或异常链接需停止并检查。
查看指定进程的内存与状态
cat /proc/12345/status12345 是示例 PID,必须换成已确认属于自己服务的 PID;State、VmRSS、VmSwap、Threads 分别帮助查看状态、常驻内存、交换和线程。
- 怎样判断结果
- 示意:State: S (sleeping)、VmRSS: 32768 kB;睡眠不代表故障。
- 容易踩的坑
- 不存在可能进程已退出;权限拒绝可能来自 hidepid 或命名空间。PID 会重用,不能用旧记录决定终止进程。
查看系统内存快照
cat /proc/meminfo重点阅读 MemAvailable、MemFree、Cached、SwapFree;这些字段是内核统计,不是某个容器独享的内存额度。
- 怎样判断结果
- 示意:MemAvailable: 2048000 kB;只是采样时估计的可用内存。
- 容易踩的坑
- 字段因内核版本不同而变化;无 /proc 时先确认环境。不能把 MemFree 小直接判定为泄漏,也不能据此清缓存。
定位进程所在 cgroup
cat /proc/12345/cgroup以自己的实际 PID 替换 12345;cgroup v2 中 0:: 后面是进程分组路径,可继续按实际挂载布局核对 memory.current、memory.max、memory.events。
- 怎样判断结果
- 示意:0::/user.slice/example.scope;v1 可有多行控制器路径。
- 容易踩的坑
- 容器中路径可能以 / 为根而隐藏宿主层级;不存在或权限拒绝时回到运行环境界面,不能猜路径写入控制文件。
读取 systemd 服务状态
systemctl --no-pager status personal-app.servicestatus 显示服务当前状态、主进程及最近日志,--no-pager 避免交互分页;服务名是待替换的个人示例。
- 怎样判断结果
- 示意:active (running) 或 failed;非零退出也可能只表示服务未运行。
- 容易踩的坑
- Unit not found 先核对真实单元名;总线连接失败先确认是否在容器中,不能直接安装或启动 systemd。
按服务和时间收集日志
journalctl --no-pager -u personal-app.service --since '30 minutes ago' -n 200-u 过滤单元,--since 限定时间,-n 限制最多末尾 200 条;日志可能包含路径、请求信息,分享前脱敏。
- 怎样判断结果
- 示意:显示这段时间内该单元的日志;没有条目不等于没有错误。
- 容易踩的坑
- 权限不足、时区误差、日志未进 journal 或已轮转都可能导致空结果;先确认日志去向,不立即提权导出全机日志。
查看本次启动内核告警
journalctl --no-pager -k -b -p warning -n 100-k 选内核,-b 选本次启动,-p warning 包含 warning 及更严重级别,-n 限制条数。
- 怎样判断结果
- 示意:可能看到 I/O 或内存相关告警;具体文字依驱动和内核而异。
- 容易踩的坑
- 受日志权限与保存策略影响;空输出不能排除 OOM 或硬件故障。出现 I/O 错误先保护数据,不反复重启测试。
检查 TCP 监听地址与端口
ss -ltnp-l 监听,-t TCP,-n 数字地址端口,-p 显示可见进程;只查询当前网络命名空间。
- 怎样判断结果
- 示意:127.0.0.1:3000 只绑定回环;0.0.0.0:3000 是 IPv4 全地址监听。
- 容易踩的坑
- 进程列缺失可能权限不足;监听不等于防火墙放行。容器与宿主需分别判断,不据此自动开放端口。
查看系统解析链路
resolvectl status显示全局与各网络链路的 DNS 配置及域路由,帮助辨认 VPN 分流;不更改 DNS。
- 怎样判断结果
- 示意:Link 下显示 DNS Servers 与 DNS Domain;真实地址不要公开。
- 容易踩的坑
- 服务未运行或命令不存在时应使用发行版网络界面,不修改 resolv.conf;浏览器 DoH 可能另走解析路径。
通过系统解析器查询名称
resolvectl query example.comquery 发起示例公网域名查询,显示地址及解析途径;使用时只替换为自己有权诊断的名称。
- 怎样判断结果
- 示意:返回一个或多个 IPv4/IPv6 地址;DNS 查询会产生网络流量。
- 容易踩的坑
- 超时先看链路 DNS 与路由;不存在名称和连接超时是不同分支,不用公共 DNS 测公司内部名称。
分辨 HTTP 响应与连接失败
curl --head --connect-timeout 5 --max-time 15 https://example.com/--head 请求响应头,两个超时分别限制连接阶段与整个请求;保留默认 TLS 验证。
- 怎样判断结果
- 示意:HTTP/2 200 或 301;curl 退出 0 本身不保证 HTTP 状态成功。
- 容易踩的坑
- 405 可能服务器不支持 HEAD;证书错误检查时间、域名和证书链,不能用 -k 掩盖;会记录访问日志。
测量单次 HTTP 请求阶段
curl --silent --show-error --output /dev/null --connect-timeout 5 --max-time 15 --write-out 'code=%{http_code} dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} first=%{time_starttransfer} total=%{time_total}\n' https://example.com/发送 GET 并丢弃响应体;计时单位秒,大多是从请求开始累计的节点时间,不能相加。
- 怎样判断结果
- 示意:code=200 dns=0.010 connect=0.030 tls=0.080 first=0.120 total=0.125;仅演示格式。
- 容易踩的坑
- 请求失败可能 code=000;连接复用、代理和缓存改变计时含义,先核对环境,再做有限次数对照。
不连接主机查看 SSH 有效配置
ssh -G -F /dev/null -o HostName=example.com -o User=labuser -o Port=22 personal-lab-G 展开配置后退出,-F /dev/null 避开个人配置和其中的 Match exec;显式给示例主机用户端口,不发起 SSH 登录。
- 怎样判断结果
- 示意:hostname example.com、user labuser、port 22;用于理解配置优先级。
- 容易踩的坑
- 不证明目标可连通或账号有效;若改为个人配置,先审阅 Match exec、ProxyCommand 等,不能盲目视作无副作用。
查看指定路径所在文件系统容量
df -hT -- ./personal-lab-h 易读容量,-T 显示文件系统类型;明确路径以避免误看另一块盘。
- 怎样判断结果
- 示意:Use% 82%、Avail 20G;是文件系统视角,不是目录大小。
- 容易踩的坑
- 不存在先核对挂载;容量还有配额、保留空间等限制。远程挂载可能阻塞,不能由百分比直接决定删除。
检查 inode 是否耗尽
df -i -- ./personal-lab-i 切换为 inode 使用统计,适合大量小文件导致创建失败的场景。
- 怎样判断结果
- 示意:IUse% 100% 而容量仍空闲,提示 inode 可能耗尽。
- 容易踩的坑
- 部分文件系统动态分配 inode 或显示特殊值,不能照搬 ext4 结论;确认文件系统类型与实际报错。
逐层定位目录占用
du -x -h --max-depth=1 -- ./personal-lab-x 限制同一文件系统,-h 易读单位,--max-depth=1 只显示到第一层的汇总;遍历仍会读更深层目录。
- 怎样判断结果
- 示意:6.0G ./personal-lab/cache;是分配空间估算,硬链接默认避免重复统计。
- 容易踩的坑
- 权限拒绝会低估;大量目录会产生 I/O。macOS 不支持此 GNU 长选项;不要扫描 DSM 系统根目录。
预演复制目录内容
rsync -anvi -- ./personal-lab/ ./backup-preview/-a 归档模式、-n 不实际传输、-v 明细、-i 逐项变化;源尾斜杠表示复制内容,目标也以目录形式明确。
- 怎样判断结果
- 示意:>f+++++++++ notes.txt 表示计划新增文件;不是已经备份成功。
- 容易踩的坑
- 路径写反会反转意图;无输出未必全面一致。-a 不包含 ACL、扩展属性和硬链接的全部保留,需要另核验。
将个人目录复制到新目标
backup_dir=$(mktemp -d ./backup.XXXXXX) && rsync -avi -- ./personal-lab/ "$backup_dir/"创建唯一的新目标目录再复制,-a 尽力保留基本元数据,-v/-i 显示变化;先执行对应 dry-run 并确认源目录。
- 怎样判断结果
- 示意:出现文件清单,退出 0 表示本次 rsync 完成;还需内容与恢复验收。
- 容易踩的坑
- 空间不足或部分文件传输失败时保留目标待检查;没有 --delete。不同文件系统可能无法保留属主或权限。
计算恢复文件的 SHA-256
sha256sum -- ./personal-lab/sample.txt ./restored/sample.txt分别计算两个文件内容摘要,人工比较前面的 64 位十六进制值;文件名不同不影响摘要。
- 怎样判断结果
- 示意:两行摘要相同才支持这两个文件字节内容一致;本文不提供虚构校验值。
- 容易踩的坑
- 读取失败不能跳过;摘要不比较权限、ACL 或来源可信度。文件持续变化时应先冻结测试样本。
识别 Mac 外接旧盘
diskutil list external physical只列外接物理磁盘与分区,辅助核对容量和连接关系;不会初始化磁盘。
- 怎样判断结果
- 示意:/dev/diskN (external, physical);N 是示意,不能复制到写盘命令。
- 容易踩的坑
- 未发现设备先看线缆、供电和磁盘工具;设备号重插可变,不能作为长期身份。输出含卷名需脱敏。
查看 Mac 上已挂载的旧盘卷
diskutil info /Volumes/ArchiveTestArchiveTest 是预先在 Finder 确认的本地外接卷;读取文件系统、容量、只读状态及设备关联。
- 怎样判断结果
- 示意:File System Personality 与 Volume Read-Only;字段依版本和格式不同。
- 容易踩的坑
- 路径不存在先查 Finder;SMB 共享不是本地块设备,不套用此命令。USB 桥显示不支持 SMART 不代表健康。
验收从 NAS 恢复到 Mac 的文件
shasum -a 256 ./personal-sample/photo.jpg ./restore-check/photo.jpg-a 256 指定 SHA-256,比较两个本地样本的摘要;无需 NAS 管理权限。
- 怎样判断结果
- 示意:两行 64 位摘要相同,表示所读内容一致。
- 容易踩的坑
- 找不到文件检查导出位置;不能证明整库、权限或未来介质可靠。请只用个人无敏感样本。
估计 Mac 个人备份源大小
du -sk ./personal-sample-s 汇总,-k 以 1024 字节单位估计分配空间;用于容量预算,不代表逻辑大小或压缩后备份大小。
- 怎样判断结果
- 示意:10240 ./personal-sample,约 10 MiB 分配空间。
- 容易踩的坑
- 权限拒绝、占位云文件会使估算不完整;大目录查询会读元数据,不能只按此数值承诺保留天数。
比较个人样本与普通备份目录
rsync -rnic -- ./personal-sample/ ./restore-check/-r 递归、-n dry-run、-i 显示变化、-c 依据内容校验比较;尾斜杠比较源的内容,不写目标。
- 怎样判断结果
- 示意:>f 表示源文件相对目标需要更新;无输出仅说明源侧选中文件无需更新。
- 容易踩的坑
- 没有 --delete,因此不报告目标多出的文件;-c 会完整读取内容。不得对运行中的备份仓库做目录级比较。
准备独立恢复验收目录
mktemp -d ./restore-check.XXXXXX-d 新建唯一目录;用输出路径作为 Hyper Backup Explorer 导出目的地,避免覆盖现有文件。
- 怎样判断结果
- 示意:./restore-check.A1b2C3;实际名称随机生成,需在后续步骤使用实际路径。
- 容易踩的坑
- 创建失败检查当前目录写权限和空间;不要改到系统目录或沿用已含资料的恢复目录。
逐字节比较两个恢复样本
cmp -s ./personal-sample/notes.txt ./restore-check/notes.txt
compare_status=$?
printf 'cmp_exit=%s\n' "$compare_status"-s 不显示文件内容,立即记录退出码;只读取两个指定的普通文件。
- 怎样判断结果
- 示意:cmp_exit=0 表示相同,1 表示不同,大于 1 表示读取等错误。
- 容易踩的坑
- 执行别的命令后再读 $? 会丢失结果;相同不包括权限或扩展属性。路径中的样本须已恢复到对应位置。
核对恢复文件大小与权限
stat -f '%N | bytes=%z | mode=%Sp | uid=%u gid=%g' ./restore-check/notes.txt-f 为 BSD/macOS 格式,显示名称、字节数、权限、数字身份;便于与恢复前私人记录对照。
- 怎样判断结果
- 示意:bytes=128 | mode=-rw-------;仅展示格式,不是已测结果。
- 容易踩的坑
- 不能使用 GNU 的 -c;不同机器 UID 可不同,Mac 导出元数据也不能代替 DSM 原生权限恢复验收。
核对 Time Machine 已配置目的地
tmutil destinationinfo列出备份目的地名称、类型和可能的 URL;仅查看配置,不触发备份。
- 怎样判断结果
- 示意:Kind: Network;有目的地不代表最近备份完成。
- 容易踩的坑
- 可能暴露用户名、服务器和唯一 ID,分享前删除;无目的地时在系统设置中重新检查已授权配置。
查询个人文件是否被排除
tmutil isexcluded ./personal-sample/notes.txtisexcluded 查询给定个人路径的 Time Machine 排除状态,不修改排除规则。
- 怎样判断结果
- 示意:[Included] 表示未被排除,[Excluded] 表示被排除;未排除不证明已入备份。
- 容易踩的坑
- 先确认路径存在,再在 Time Machine 选项核对;权限限制时先用系统界面,不直接扩大终端授权。
列出本地 Time Machine 快照
tmutil listlocalsnapshots /列出指定卷的本地 Time Machine 快照名称;不创建、不删除快照。
- 怎样判断结果
- 示意:com.apple.TimeMachine.日期.local;只说明本地存在恢复点。
- 容易踩的坑
- 空列表可能没有可见快照;本地快照不代表 NAS 备份成功,不依据列表批量清除 APFS 快照。
没有匹配的命令。试试其他关键词,或把方向与风险改为“全部”。