github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/docs/translations/zh_CN/linux/setup_linux-host_qemu-vm_arm64-kernel.md (about)

     1  > [!WARNING]
     2  >
     3  > **请注意,这是社区驱动的官方 syzkaller 文档翻译。当前文档的最新版本(英文版)可在 [docs/linux/setup_linux-host_qemu-vm_arm64-kernel.md](/docs/linux/setup_linux-host_qemu-vm_arm64-kernel.md) 中找到。**
     4  
     5  # 设置:Linux 主机,QEMU 虚拟机,arm64 内核
     6  
     7  这份文档将详细说明如何设置 Syzkaller 实例,以便对你选择的任何 ARM64 Linux 内核进行模糊测试。
     8  
     9  ## 创建一个磁盘映像
    10  
    11  我们将使用 buildroot 来创建磁盘映像。
    12  你可以从 [这里](https://buildroot.uclibc.org/download.html) 获取 buildroot。
    13  解压压缩包,并在其中执行 `make menuconfig`,
    14  选择以下选项。
    15  
    16      Target options
    17  	    Target Architecture - Aarch64 (little endian)
    18      Toolchain type
    19  	    External toolchain - Linaro AArch64
    20      System Configuration
    21      [*] Enable root login with password
    22              ( ) Root password = set your password using this option
    23      [*] Run a getty (login prompt) after boot  --->
    24  	    TTY port - ttyAMA0
    25      Target packages
    26  	    [*]   Show packages that are also provided by busybox
    27  	    Networking applications
    28  	        [*] dhcpcd
    29  	        [*] iproute2
    30  	        [*] openssh
    31      Filesystem images
    32  	    [*] ext2/3/4 root filesystem
    33  	        ext2/3/4 variant - ext3
    34  	        exact size in blocks - 6000000
    35  	    [*] tar the root filesystem
    36  
    37  运行 `make`。编译完成后,确认 `output/images/rootfs.ext3` 文件是否存在。
    38  
    39  如果在 x86 上运行 arm64 qemu 时遇到 ssh 启动时间非常慢的问题,很可能是熵不足的问题,可以通过安装 `haveged` 来 “解决” 这个问题。你可以在 buildroot 的 `menuconfig` 中找到该选项:
    40  
    41  ```
    42      Target packages
    43  	    Miscellaneous
    44  	        [*] haveged
    45  ```
    46  
    47  ## 从 Linaro 获取 ARM64 工具链
    48  
    49  你需要一个支持 gcc 插件的 ARM64 内核。
    50  如果没有,请从 Linaro 获取 ARM64 工具链。
    51  从 [这里](https://releases.linaro.org/components/toolchain/binaries/6.1-2016.08/aarch64-linux-gnu/) 获取 `gcc-linaro-6.1.1-2016.08-x86_64_aarch64-linux-gnu.tar.xz`。
    52  解压缩并将其 `bin/` 添加到你的 `PATH` 中。
    53  如果你的电脑上已经安装了其他 ARM64 工具链,请确保新下载的工具链被优先使用。
    54  
    55  ## 编译内核
    56  
    57  获取你想要进行模糊测试的 Linux 内核版本的源代码,并执行以下操作。
    58  
    59      $ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make defconfig
    60      $ vim .config
    61  
    62  更改以下选项:
    63  ```
    64      CONFIG_KCOV=y
    65      CONFIG_KASAN=y
    66      CONFIG_DEBUG_INFO=y
    67      CONFIG_CMDLINE="console=ttyAMA0"
    68      CONFIG_KCOV_INSTRUMENT_ALL=y
    69      CONFIG_DEBUG_FS=y
    70      CONFIG_NET_9P=y
    71      CONFIG_NET_9P_VIRTIO=y
    72      CONFIG_CROSS_COMPILE="aarch64-linux-gnu-"
    73  ```
    74  ```
    75      $ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- make -j40
    76  ```
    77  
    78  如果编译成功,应该会有一个 `arch/arm64/boot/Image` 文件。
    79  
    80  ## 获取用于 ARM64 的 QEMU
    81  
    82  从 git 或最新发布的源代码中获取 QEMU 源代码。
    83  
    84      $ ./configure
    85      $ make -j40
    86  
    87  如果编译成功,应该会有一个 `aarch64-softmmu/qemu-system-aarch64` 二进制文件。
    88  
    89  ## 手动启动
    90  
    91  按照以下步骤启动内核。
    92  
    93      $ /path/to/aarch64-softmmu/qemu-system-aarch64 \
    94        -machine virt \
    95        -cpu cortex-a57 \
    96        -nographic -smp 1 \
    97        -hda /path/to/rootfs.ext3 \
    98        -kernel /path/to/arch/arm64/boot/Image \
    99        -append "console=ttyAMA0 root=/dev/vda oops=panic panic_on_warn=1 panic=-1 ftrace_dump_on_oops=orig_cpu debug earlyprintk=serial slub_debug=UZ" \
   100        -m 2048 \
   101        -net user,hostfwd=tcp::10023-:22 -net nic
   102  
   103  此时,你应该能够看到一个登录提示符。
   104  
   105  ## 设置 QEMU 磁盘
   106  
   107  现在我们已经有了一个 shell,接着我们向现有的初始化脚本添加几行代码,这样每次 Syzkaller 启动虚拟机时都会执行这些脚本。
   108  
   109  在 /etc/init.d/S50sshd 的顶部添加以下行:
   110  
   111      ifconfig eth0 up
   112      dhcpcd
   113      mount -t debugfs none /sys/kernel/debug
   114      chmod 777 /sys/kernel/debug/kcov
   115  
   116  将该行注释掉
   117  
   118      /usr/bin/ssh-keygen -A
   119  
   120  
   121  接下来我们要设置 ssh。在本地生成一个 ssh 密钥对,然后将公钥复制到 `/` 目录下的 `/authorized_keys` 文件中。在生成密钥时,请不要设置密码。
   122  
   123  打开 `/etc/ssh/sshd_config` 文件,并按照下面所示修改以下行。
   124  
   125      PermitRootLogin yes
   126      PubkeyAuthentication yes
   127      AuthorizedKeysFile      /authorized_keys
   128      PasswordAuthentication yes
   129  
   130  重新启动计算机,并确保你可以从主机 ssh 连接到虚拟机。
   131  
   132      $ ssh -i /path/to/id_rsa root@localhost -p 10023
   133  
   134  ## 编译 syzkaller
   135  
   136  按照 [这里](/docs/linux/setup.md#go-and-syzkaller) 的描述编译 Syzkaller,目标为 `arm64`。
   137  
   138  ```
   139  CC=gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-g++
   140  make TARGETARCH=arm64
   141  ```
   142  
   143  
   144  ## 修改你的配置文件并启动 Syzkaller
   145  
   146  以下是一个示例配置文件,包含了所需的选项。根据你的需求进行修改。
   147  
   148  ```
   149  {
   150      "name": "QEMU-aarch64",
   151      "target": "linux/arm64",
   152      "http": ":56700",
   153      "workdir": "/path/to/a/dir/to/store/syzkaller/corpus",
   154      "kernel_obj": "/path/to/linux/build/dir",
   155      "syzkaller": "/path/to/syzkaller/arm64/",
   156      "image": "/path/to/rootfs.ext3",
   157      "sshkey": "/path/to/id_rsa",
   158      "procs": 8,
   159      "type": "qemu",
   160      "vm": {
   161          "count": 1,
   162          "qemu": "/path/to/qemu-system-aarch64",
   163          "cmdline": "console=ttyAMA0 root=/dev/vda",
   164          "kernel": "/path/to/Image",
   165          "cpu": 2,
   166          "mem": 2048
   167      }
   168  }
   169  ```
   170  
   171  此时,你应该能够访问 `localhost:56700` 并查看模糊测试的结果。
   172  
   173  如果在 `syz-manager` 启动后遇到问题,请考虑使用 `-debug` 标志运行它。
   174  还可以查看 [此页面](/docs/troubleshooting.md) 获取故障排除提示。