首页 > 解决方案 > 如何在 WSL2 上正确安装 perf 命令

问题描述

我在 WSL2 ubuntu 中的机器上编译 perf 时遇到问题。

Ubuntu是从微软商店下载的,内核版本是4.19.128-microsoft-standard

我已经在 stackoverflow 上关注了这个答案,而且https://blog.haoxp.xyz/posts/wsl2-perf/

运行 make 时出现以下错误:

mv: cannot stat 'util/.env.o.tmp': No such file or directory
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:97: util/env.o] Error 1
make[4]: *** Waiting for unfinished jobs....
  LD       bench/perf-in.o
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: util] Error 2
make[2]: *** [Makefile.perf:633: libperf-in.o] Error 2
make[2]: *** Waiting for unfinished jobs....
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `end'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `start'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `runtime'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:145: bench/perf-in.o] Error 1
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: bench] Error 2
make[3]: *** Waiting for unfinished jobs....
  LD       tests/perf-in.o
ld: tests/bp_account.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/tests/bp_account.c:25: multiple definition of `the_var'; tests/bp_signal.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/tests/bp_signal.c:37: first defined here
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:145: tests/perf-in.o] Error 1
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: tests] Error 2
make[2]: *** [Makefile.perf:507: perf-in.o] Error 2
make[1]: *** [Makefile.perf:206: sub-make] Error 2
make: *** [Makefile:70: all] Error 2

谁能帮我弄清楚我做错了什么?

标签: cubuntuwindows-subsystem-for-linuxperfwsl-2

解决方案


简短的回答 - 尝试克隆 repo 并在您的 WSL 主目录(在 ext4 文件系统下)而不是 C: 驱动器下构建。

(更多)更长的答案-您可能遇到两个单独的问题,源位于 C: 驱动器上(并通过 访问它/mnt/c):

首先,权限问题。甚至使用自动挂载选项在 WSL2 中git clone对我来说也失败了。我猜你是用 Windows git 而不是 Linux git 来检查的?/mnt/c/mnt/c

您可以使用类似sudo mount -t drvfs C: /mnt/src -o uid=1000,gid=1000(请参阅此答案)重新安装驱动器以更正权限。我能够做到这一点,但后来我注意到以下...

即使在修复权限之后,我仍然面临下一个问题 - NTFS 驱动器上的 WSL 区分大小写支持。Linuxgit clone警告我有关重复的目录。我相信这就是为什么您会收到“多重定义”警告的原因-该源树包含一些重复的目录名称,这些名称仅在大小写上有所不同。Windows git 正在正确处理该问题,但我的猜测是构建失败,因为它没有解析正确的目录。我还没有尝试过,但是在目录上设置区分大小写的命令在那个 MS doc 中。

但即便如此,如果您解决了这些问题(并且您可能可以),我仍然建议避免使用/mnt/cWSL2(以及任何其他 NTFS 驱动器)。由于 NTFS 在 WSL2 下的性能不佳(比在 WSL1 下差很多,差很多),任何繁重的文件操作都将完全停止。例如,git clone那个 repo 只花了几秒钟,/home/myusername/src但大约 10 分钟(!!!)/mnt/c。这是 WSL2 的一个已知问题。

当我想对 NTFS 驱动器运行 Linux 命令时,我仍然保留 WSL1。例如,s3cmd将我的照片同步/备份到 S3 兼容存储。我将 WSL2 用于其他一切,但我坚持使用 ext4 文件系统,那里的性能比 WSL1更好。


推荐阅读