我的新 VPS 运行的是 Debian 5.0(bash 3.2.29),似乎缺少一些命令。例如,命令ps
不在这里,也不在这里ls
(但 dir 可以工作)。是缺少包还是出了什么问题?
:~# type ps
ps is hashed (/bin/ps)
:~# ps
-bash: /bin/ps: No such file or directory
:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
:~# /bin/ps
-bash: /bin/ps: No such file or directory
编辑:来自评论的更多信息:
- 它是 64 位的
- 不知道有关实际安装的任何细节。
- 这是一个运行 virtuozzo 和 plesk 的虚拟机
- readelf 显示
/bin/ps
和/bin/ls
都是 32 位。但没有 32 位/lib/ld-linux-so.2
。这是怎么回事?安装错误还是什么?
为了完成起见:
# file /bin/ps
/bin/ps: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.0.0, stripped
# file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
dynamically linked (uses shared libs), for GNU/Linux 2.0.0, stripped
# uname -mrvs
Linux 2.6.18-028stab069.6 #1 SMP Wed May 26 18:10:06 MSD 2010 x86_64
# readelf -l /bin/ps
Elf file type is EXEC (Executable file)
Entry point 0x8049040
There are 6 program headers, starting at offset 52
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
PHDR 0x000034 0x08048034 0x08048034 0x000c0 0x000c0 R E 0x4
INTERP 0x0000f4 0x080480f4 0x080480f4 0x00013 0x00013 R 0x1
[Requesting program interpreter: /lib/ld-linux.so.2]
LOAD 0x000000 0x08048000 0x08048000 0x071fa 0x071fa R E 0x1000
LOAD 0x007200 0x08050200 0x08050200 0x005a0 0x01e5c RW 0x1000
DYNAMIC 0x0076f8 0x080506f8 0x080506f8 0x000a8 0x000a8 RW 0x4
NOTE 0x000108 0x08048108 0x08048108 0x00020 0x00020 R 0x4
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp .note.ABI-tag .hash .dynsym .dynstr
.gnu.version .gnu.version_r .rel.got .rel.bss .rel.plt
.init .plt .text .fini .rodata
03 .data .got .dynamic .bss
04 .dynamic
05 .note.ABI-tag
解决方案
服务提供商重新安装了系统。这肯定是出了什么问题。内存消耗也从大约 750MB 下降到了 120MB。答案1
当exec*
返回时-ENOENT
,表示二进制文件丢失或解释器丢失。
显然,/bin/ps
存在,否则它就不会在 shell 中被哈希化。但它所依赖的动态链接器可能不存在于您的系统中。如果安装了 GNU binutils,您可以轻松确定是否是这种情况。
$ readelf -l /bin/ps … 插值 0x0000000000000270 0x000000000400270 0x0000000000400270 0x000000000000001c 0x000000000000001c R 1 [请求程序解释器:/lib64/ld-linux-x86-64.so.2] …
/lib64/ld-linux-x86-64.so.2
存在于我的 Debian Squeeze/Sid 混合测试机上。
一种可能是你以某种方式安装了 32 位软件包,但没有安装必要的 32 位库。例如,如果我尝试在 64 位系统上运行 32 位二进制文件,
# 在另一个系统上进行 32 位开发 $ echo'int main(){}'> 32bit.c $ cc -m32 -o 32位 32位.c # 在没有 32 位库的 64 位系统上 $./32位 -bash:./32bit:没有此文件或目录 $ readelf -l 32位 … 插值 0x000154 0x08048154 0x08048154 0x00013 0x00013 R 0x1 [请求程序解释器:/lib/ld-linux.so.2] … $ ls /lib/ld-linux.so.2 ls:无法访问/lib/ld-linux.so.2:没有此文件或目录
另一种可能性是,你尝试在未安装 LSB 基础库的系统上运行 LSB 二进制文件,例如以下场景https://stackoverflow.com/questions/1562071,或者尝试在仅支持 µClibc 的系统上使用基于 Glibc 的软件包,或者其他多种类似情况。
我确实要问——这个系统是如何安装的?默认情况下,这一切都不是真的,必须有人去捣乱。