1

我已经构建并安装了https://github.com/Xilinx-CNS/onload共享库。

然后我正在尝试: onload ping 8.8.8.8

得到这个错误:


    ERROR: ld.so: object 'libonload.so' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored. 
    PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=110 time=29.2 ms

但它适用于sudo onload ping 8.8.8.8

    oo:ping[724989]: netif_tcp_helper_alloc_u: ENODEV. This error can occur if:
     - no Solarflare network interfaces are active/UP, or they are running    packed stream firmware or are disabled, and
     - there are no AF_XDP interfaces registered with sfc_resource Please check your configuration.
     PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=110 time=50.4 ms

有人可以帮助我,我如何在没有 sudo 的情况下实现这个命令?例如,onload nc -l $PORT没有 sudo 可以工作,但 ping 不能。

一些调试信息:

sudo find / -name libonload.so

/usr/lib/x86_64-linux-gnu/libonload.so

cat /etc/ld.so.conf

include /etc/ld.so.conf.d/*.conf

cat /etc/ld.so.conf.d/*.conf

/usr/lib/x86_64-linux-gnu/libfakeroot 
/usr/local/lib 
/usr/local/lib/x86_64-linux-gnu 
/lib/x86_64-linux-gnu  
/usr/lib/x86_64-linux-gnu 
/lib32  
/usr/lib32

sudo ldconfig -v

... 
/usr/lib/x86_64-linux-gnu/libfakeroot:  
    libfakeroot-0.so -> libfakeroot-tcp.so 
/usr/local/lib: 
/lib/x86_64-linux-gnu:
    ...
    libonload_ext.so.2 -> libonload_ext.so.2.0.0 
    libonload.so -> libonload.so
    ...
...

ls -l /usr/lib/x86_64-linux-gnu | grep onload

-rwxr-xr-x  1 root root   9528312 Mar  3 01:17 libonload.so
-rw-r--r--  1 root root    106222 Mar  3 01:17 libonload_ext.a 
lrwxrwxrwx  1 root root        18 Mar  3 01:17 libonload_ext.so -> libonload_ext.so.2 
lrwxrwxrwx  1 root root        22 Mar  3 01:17 libonload_ext.so.2 -> libonload_ext.so.2.0.0
-rwxr-xr-x  1 root root     31344 Mar  3 01:17 libonload_ext.so.2.0.0

ls -l /lib/x86_64-linux-gnu | grep onload

-rwxr-xr-x  1 root root   9528312 Mar  3 01:17 libonload.so
-rw-r--r--  1 root root    106222 Mar  3 01:17 libonload_ext.a 
lrwxrwxrwx  1 root root        18 Mar  3 01:17 libonload_ext.so -> libonload_ext.so.2
lrwxrwxrwx  1 root root        22 Mar  3 01:17 libonload_ext.so.2 -> libonload_ext.so.2.0.0
-rwxr-xr-x  1 root root     31344 Mar  3 01:17 libonload_ext.so.2.0.0

/lib$ ls -l | grep x86_64-linux-gnu

drwxr-xr-x 35 root root  36864 Mar  3 01:17 x86_64-linux-gnu

/usr/lib$ ls -l | grep x86_64-linux-gnu

drwxr-xr-x 35 root root  36864 Mar  3 01:17 x86_64-linux-gnu
4

1 回答 1

0

最可能的原因是ping应用程序使用setuid但未安装 Onload 库。运行ping将有效地将应用程序提升为 root 用户以允许创建原始套接字,但该库将作为普通用户加载,因此无法使用。以 root 用户身份运行可以避免这种情况,因为该库是以 root 用户身份加载的。

我认为 Onload 的 GitHub 版本不支持加载setuidOnload 库,但您可以使用chmod +s <libpath>. 值得指出的ping是,Onload 并没有加速,因为该库只会加速 UDP 和 TCP 套接字和管道,因此您不会从中看到任何好处。

于 2022-03-03T21:57:27.710 回答