github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/docs/translations/zh_CN/syz_testbed.md (about)

     1  > [!WARNING]
     2  >
     3  > **请注意,这是社区驱动的官方 syzkaller 文档翻译。当前文档的最新版本(英文版)可在 [docs/syz_testbed.md](/docs/syz_testbed.md) 中找到。**
     4  
     5  # syz-testbed
     6  
     7  syz-testbed 是一个用于简化对不同 syzkaller 版本(或配置)进行性能对比评估的流程的工具。该工具会自动检出 syzkaller 仓库、构建它们、运行 syz-manager,并收集/汇总其结果。
     8  
     9  ## 配置 syz-testbed
    10  
    11  syz-testbed 需要一个 JSON 配置文件。示例:
    12  
    13  ```json
    14  {
    15    "workdir": "/tmp/syz-testbed-workdir/",
    16    "corpus": "/tmp/corpus.db",
    17    "target": "syz-manager",
    18    "max_instances": 5,
    19    "run_time": "24h",
    20    "http": "0.0.0.0:50000",
    21    "checkouts": [
    22      {
    23        "name": "first",
    24        "repo": "https://github.com/google/syzkaller.git",
    25      },
    26      {
    27        "name": "second",
    28        "repo": "https://github.com/google/syzkaller.git",
    29        "branch": "some-dev-branch",
    30      }
    31    ],
    32    "manager_config": {
    33  	  "target": "linux/amd64",
    34  	  "kernel_obj": "/tmp/linux-stable",
    35  	  "image": "/tmp/kernel-image/trixie.img",
    36  	  "sshkey": "/tmp/kernel-image/trixie.id_rsa",
    37  	  "procs": 8,
    38  	  "type": "qemu",
    39  	  "vm": {
    40            "count": 2,
    41            "kernel": "/tmp/linux-stable/arch/x86/boot/bzImage",
    42            "cpu": 2,
    43            "mem": 2048
    44  	  }
    45    }
    46  }
    47  ```
    48  
    49  给定上述配置文件,syz-testbed 将执行以下操作:
    50  1. 将 https://github.com/google/syzkaller.git 的 master 分支检出到 `/tmp/syz-testbed-workdir/checkouts/first/` 并进行构建。
    51  2. 将 https://github.com/google/syzkaller.git 的 `some-dev-branch` 分支检出到 `/tmp/syz-testbed-workdir/checkouts/second/` 并进行构建。
    52  3. 启动 3 个 `first` 实例和 2 个 `second` 实例(因为 `max_instances = 5`)。
    53  
    54  目录结构如下:
    55  ```
    56  /tmp/syz-testbed-workdir/
    57  └── checkouts
    58      ├── first
    59      │   ├── run-first-0
    60      │   │   ├── log.txt
    61      │   │   ├── manager.cfg
    62      │   │   └── workdir
    63      │   ├── run-first-1
    64      │   │   ├── log.txt
    65      │   │   ├── manager.cfg
    66      │   │   └── workdir
    67      │   └── run-first-4
    68      │   │   ├── log.txt
    69      │   │   ├── manager.cfg
    70      │   │   └── workdir
    71      └── second
    72          ├── run-second-2
    73          │   ├── log.txt
    74          │   ├── manager.cfg
    75          │   └── workdir
    76          └── run-second-3
    77              ├── log.txt
    78              ├── manager.cfg
    79              └── workdir
    80  ```
    81  4. 在 24 小时后(因为 `run_hours` 为 24),停止这 5 个实例。
    82  5. 创建并运行 2 个 `first` 实例和 3 个 `second` 实例。
    83  6. 不断重复上述步骤。
    84  
    85  该工具在收到 SIGINT(例如 Ctrl+C)或 SIGTERM 信号后会停止。此外,如果任意一个实例由于错误退出,也会导致整个实验停止。
    86  
    87  ## Web 界面
    88  
    89  该工具带有一个简单的 Web 界面,用于展示实验的当前信息(活动与已完成实例数量、距离实例停止的剩余时间等)以及从各个 syz-manager 收集到的最新统计数据。
    90  
    91  如果 `benchmp` 参数指向 `syz-benchcmp` 可执行文件,则 Web 界面还可以生成随时间或执行次数变化的各项参数图表。
    92  
    93  要启用该界面,请将 `http` 参数设置为 syz-testbed 绑定的 IP 地址与端口。例如 `"http": "0.0.0.0:50000"`。
    94  
    95  ## 统计
    96  
    97  syz-testbed 提供两种统计“视图”:
    98  1. `complete` —— 仅包含已完成实例的数据(即运行满 `run_hours` 的实例)。
    99  2. `all` —— 还包括当前正在运行的实例的数据。来自已完成实例的统计会回退(对齐)到与活动实例当前运行时长一致的时间点。
   100  
   101  因此,统计数据的布局如下:
   102  
   103  ```bash
   104  $ tree -L 2 /tmp/syz-testbed-workdir/
   105  /tmp/syz-testbed-workdir/
   106  ├── stats_all
   107  │   ├── benches
   108  │   │   ├── avg_first.txt
   109  │   │   ├── avg_second.txt
   110  │   ├── bugs.csv
   111  │   ├── checkout_stats.csv
   112  │   └── instance_stats.csv
   113  ├── stats_completed
   114  │   ├── benches
   115  │   │   ├── avg_first.txt
   116  │   │   ├── avg_second.txt
   117  │   ├── bugs.csv
   118  │   ├── checkout_stats.csv
   119  │   └── instance_stats.csv
   120  └── testbed.csv
   121  ```
   122  
   123  1. `bugs.csv` 包含所有运行实例发现的所有 bug。若某个 checkout 启动了多个实例(即 `count` > 1),syz-testbed 会对它们发现的 bug 取并集。其目的在于尽可能收集该 syzkaller 版本可以发现的全部 bug。
   124  2. 各个 syz-manager 生成的统计会写入 `instance_stats.csv`。同时,这些数据还会在属于同一 checkout 的实例之间取平均,并保存到 `checkout_stats.csv`。
   125  3. 将属于同一 checkout 的所有 syz-manager 的 bench 文件(参见 `tools/syz-benchcmp`)进行平均,并保存到对应的 `benches` 目录中的文件里。
   126  
   127  统计数据每 90 秒更新一次。
   128  
   129  ## 运行 syz-testbed
   130  
   131  首先,检出 syzkaller 的最新版本:
   132  
   133  ```bash
   134  $ git clone https://github.com/google/syzkaller.git
   135  ```
   136  
   137  然后构建 syz-testbed:
   138  
   139  ```bash
   140  $ cd syzkaller/tools/syz-testbed/
   141  $ go build
   142  ```
   143  
   144  编写并保存配置文件(例如保存到 `config.json`文件中)。随后,可以使用以下命令运行 syz-testbed:
   145  
   146  ```bash
   147  $ ./syz-testbed -config config.json
   148  ```
   149  
   150  停止 syz-testbed 进程会同时停止所有 syzkaller 实例。
   151  
   152  ## 测试 syz-repro
   153  
   154  syz-testbed 也可用于测试 syzkaller 的 bug 复现能力。为此,请在 syz-testbed 的配置文件中将 `target` 属性设置为 `syz-repro`。
   155  
   156  还可以指定崩溃日志文件的来源。来源要么是一个文件夹(其中的文件将按崩溃日志处理),要么是一个 syzkaller 的 workdir。`input_logs` 必须指向崩溃日志所在的文件夹——syz-testbed 会遍历该目录并将其中的每个文件作为输入;否则必须使用 `input_workdir`。
   157  
   158  例如:
   159  ```json
   160    "repro_config": {
   161      "input_workdir": "/tmp/some-syzkaller-workdir",
   162      "crashes_per_bug": 2,
   163      "skip_bugs": ["SYZFAIL", "no output", "corrupted", "lost connection"]
   164    },
   165  ```
   166  
   167  在这种情况下,syz-testbed 会遍历该 syzkaller 发现的所有 bug,跳过匹配 "SYZFAIL"、"no output"、"corrupted" 或 "lost connection" 的条目,然后为每个剩余的 bug 随机选取 2 份崩溃日志进行后续处理。
   168  
   169  syz-testbed 会检出并编译指定的 syzkaller 实例,并在选取的每份崩溃日志上持续执行其 syz-repro,直到工具被停止。