Centos 5.3 tar 및 rpm에서는 항상 분할 오류가 발생합니다. strace에서 이유를 알 수 있습니까?

Centos 5.3 tar 및 rpm에서는 항상 분할 오류가 발생합니다. strace에서 이유를 알 수 있습니까?

(업데이트: 현재 tar는 시스템에 알려진 변경 사항 없이 세그폴트 없이 작동합니다. 하지만 "rm" 명령은 이제 세그폴트가 발생합니다. 아아! 어쩌면 ESXi로 인해 발생한 것일 수도 있고 하드웨어 때문일 수도 있습니다.)

VMWare ESXi에서 실행되는 Centos 5.3 시스템이 있습니다. 꽤 오랫동안 별 문제 없이 잘 돌아가고 있습니다. 그러나 최근에는 tar 명령과 rpm 명령을 실행할 때 분할 오류가 발생한다는 사실을 발견했습니다.

그래서 나는 strace를 사용해 보았고(누군가가 온라인에서 이것을 제안한 것을 발견했습니다) 아래는 strace를 사용할 때 얻은 것입니다. 시스템을 복구하는 방법과 앞으로 이런 일이 발생하지 않도록 방지할 수 있는 방법을 알고 싶습니다.

미리 감사드립니다!

출력:

[root@wagon init.d]# strace -f rpm
execve("/bin/rpm", ["rpm"], [/* 20 변수 */]) = 0
brk(0) = 0x9e98000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (해당 파일이나 디렉터리가 없음)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=51424, ...}) = 0
mmap2(NULL, 51424, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7f79000
닫기(3) = 0
open("/usr/lib/librpm-4.4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360\ 257\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=378528, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f78000
mmap2(NULL, 588416, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xd43000
mmap2(0xd9d000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x59) = 0xd9d000
mmap2(0xda1000, 203392, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xda1000
닫기(3) = 0
open("/usr/lib/librpmdb-4.4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\307\ 1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1134540, ...}) = 0
mmap2(NULL, 1139296, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x627000
mmap2(0x739000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x111) = 0x739000
mmap2(0x73d000, 608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x73d000
닫기(3) = 0
open("/lib/libselinux.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0005\ 0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=91892, ...}) = 0
mmap2(NULL, 97112, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xc25000
mmap2(0xc3b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15) = 0xc3b000
닫기(3) = 0
open("/usr/lib/librpmio-4.4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\276 \0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=396276, ...}) = 0
mmap2(NULL, 540192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb64000
mmap2(0xbc3000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5e) = 0xbc3000
mmap2(0xbc6000, 138784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xbc6000
닫기(3) = 0
open("/usr/lib/libpopt.so.0", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260\ 20\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=29008, ...}) = 0
mmap2(NULL, 31856, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7c5000
mmap2(0x7cc000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6) = 0x7cc000
닫기(3) = 0
open("/usr/lib/libsqlite3.so.0", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340= \327\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=385180, ...}) = 0
mmap2(0xd6a000, 387072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x110000
mmap2(0x16d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5c) = 0x16d000
닫기(3) = 0
open("/usr/lib/libelf.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\35\ 0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=87508, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f77000
mmap2(NULL, 90296, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x9cf000
mmap2(0x9e4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14) = 0x9e4000
닫기(3) = 0
오픈("/lib/libm.so.6", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0204\ 0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=206380, ...}) = 0
mmap2(NULL, 155760, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x16f000
mmap2(0x194000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24) = 0x194000
닫기(3) = 0
open("/usr/lib/libz.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\300\ 245\303\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=75028, ...}) = 0
mmap2(0xc39000, 76400, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x196000
mmap2(0x1a8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x11) = 0x1a8000
닫기(3) = 0
open("/usr/lib/libnss3.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\0mr\ 0054\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1306252, ...}) = 0
mmap2(0x5714000, 1310584, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x5714000
mmap2(0x584e000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x139) = 0x584e000
닫기(3) = 0
open("/usr/lib/libplds4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\312\ 205\0054\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=11460, ...}) = 0
mmap2(0x585c000, 8672, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x585c000
mmap2(0x585e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2) = 0x585e000
닫기(3) = 0
open("/usr/lib/libplc4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360m\ 205\0054\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=15556, ...}) = 0
mmap2(0x5856000, 12744, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x5856000
mmap2(0x5859000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3) = 0x5859000
닫기(3) = 0
open("/usr/lib/libnspr4.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\227\ 206\0054\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=228028, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f76000
mmap2(0x5861000, 232928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x5861000
mmap2(0x5897000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x36) = 0x5897000
mmap2(0x5898000, 7648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x5898000
닫기(3) = 0
open("/lib/libdl.so.2", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0P\n\ 0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=14644, ...}) = 0
mmap2(NULL, 12408, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2a7000
mmap2(0x2a9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1) = 0x2a9000
닫기(3) = 0
open("/lib/librt.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\200\ 30\0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=42048, ...}) = 0
mmap2(NULL, 33324, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7d0000
mmap2(0x7d7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6) = 0x7d7000
닫기(3) = 0
open("/lib/libpthread.so.0", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000H\0\ 0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=123596, ...}) = 0
mmap2(NULL, 90592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x1a9000
mmap2(0x1bc000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x12) = 0x1bc000
mmap2(0x1be000, 4576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x1be000
닫기(3) = 0
open("/usr/lib/libbz2.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240\ 17\364\0034\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=71852, ...}) = 0
mmap2(0x3f40000, 69128, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3f40000
mmap2(0x3f50000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10) = 0x3f50000
닫기(3) = 0
오픈("/lib/libc.so.6", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320_\ 1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1603392, ...}) = 0
mmap2(NULL, 1324452, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2ab000
mmap2(0x3e9000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x13e) = 0x3e9000
mmap2(0x3ec000, 9636, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x3ec000
닫기(3) = 0
open("/lib/libsepol.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\340\ 256\306\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=242880, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f75000
mmap2(0xc68000, 286624, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xc68000
mmap2(0xca3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3a) = 0xca3000
mmap2(0xca4000, 40864, ​​PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xca4000
닫기(3) = 0
open("/lib/libgcc_s.so.1", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0`\26 \0\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=44992, ...}) = 0
mmap2(NULL, 48036, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x435000
mmap2(0x440000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xa) = 0x440000
닫기(3) = 0
open("/usr/lib/libnssutil3.so", O_RDONLY) = 3
읽기(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\20\ 350o\0054\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=96764, ...}) = 0
mmap2(0x56fa000, 98028, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x56fa000
mmap2(0x570f000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14) = 0x570f000
닫기(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f74000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f73000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb7f736d0, 제한:1048575, seg_32bit:1, 내용:0, read_exec_only:0, 제한_in_pages:1, seg_not_present:0, 사용 가능:1}) = 0
mprotect(0x3e9000, 8192, PROT_READ) = 0
mprotect(0x1bc000, 4096, PROT_READ) = 0
mprotect(0x7d7000, 4096, PROT_READ) = 0
mprotect(0x2a9000, 4096, PROT_READ) = 0
mprotect(0x194000, 4096, PROT_READ) = 0
mprotect(0xff9000, 4096, PROT_READ) = 0
문맵(0xb7f79000, 51424) = 0
set_tid_address(0xb7f73718) = 5604
set_robust_list(0xb7f73720, 0xc) = 0
futex(0xbf9763c4, FUTEX_WAKE_PRIVATE, 1) = 0
rt_sigaction(SIGRTMIN, {0x1ad3d0, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x1ad2e0, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM_INFINITY}) = 0
uname({sys="Linux", node="wagon.localdomain", ...}) = 0
액세스("/etc/selinux/", F_OK) = 0
brk(0) = 0x9e98000
brk(0x9eb9000) = 0x9eb9000
open("/etc/selinux/config", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=511, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f85000
read(3, "# 이 파일은 o 상태를 제어합니다."..., 4096) = 511
읽기(3, "", 4096) = 0
닫기(3) = 0
문맵(0xb7f85000, 4096) = 0
open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f85000
read(3, "rootfs / rootfs rw 0 0\n/dev/root"..., 4096) = 587
읽기(3, "", 4096) = 0
닫기(3) = 0
문맵(0xb7f85000, 4096) = 0
--- SIGSEGV(분할 오류) @ 0 (0) ---
+++ SIGSEGV에 의해 사망 ​​+++
[root@wagon init.d]#

답변1

많은 조사 없이도 일부 프로그램이 세그폴트를 시작한 다음 다른 프로그램이 실패하기 시작하는 동안 올바르게 작동하기 시작했다는 설명에 따르면 메모리 모듈이 불량하거나 사전 링크가 끊어졌습니다.

먼저 모든 가상 머신을 중지하고 호스트를 재부팅한 후 메모리 테스트를 실행합니다. ESXi 외부에서 이 작업을 수행해야 합니다. 메모리 결함이 발견되면 그것이 문제입니다. 하드웨어를 교체하십시오.

메모리 결함이 발견되지 않은 경우 해당 아키텍처에 대해 CentOS에서 사용 가능한 최신 커널을 실행하고 있는지 확인하십시오.

호스트와 서버를 다시 부팅하고 서버를 단일 사용자 모드로 부팅하고(grub 커널 매개변수에 "single" 전달) 다음을 실행합니다.

prelink -avf

사전 연결이 완료되면 서버를 재부팅해야 합니다. 부팅을 재개 할 수도 있지만 telinit u && init 3모든 바이너리가 새 메모리 매핑으로 다시 로드되도록 하려면 재부팅하는 것이 좋습니다.

답변2

이것은 추측이지만, se-linix를 끄고 작동하는지 확인해 보십시오.

segfault가 아니어야 하는데, tar가 생각지 못했던 se-linux 때문에 열리지 못하는 파일이 있을 수도 있습니다.

그렇지 않으면 tar용 소스 rpm을 설치하고 디버깅으로 빌드한 다음 디버거에서 실행하여 이유를 확인해야 합니다.

답변3

좋아요, 생각만큼 복잡하지는 않습니다. 서버가 손상되었고 천재 해커가 루트 키트 설치를 망쳤습니다. 따라서 그 영향은 바이너리 세그폴트였습니다. 또 다른 영향은 서버의 예상치 못한 네트워크 트래픽이었습니다. 응답해주신 모든 분들께 감사드립니다!

답변4

좋아요, 정말 재미있을 것 같네요.

첫째, 동일한 최신 상자 두 개가 있습니까(그 중 하나는 세그폴트가 아님)?

그렇다면 세그먼트 오류가 발생한 바이너리의 md5sum을 확인하여 동일한지 확인하세요.

다음으로, 실패한 바이너리에서 ldd를 실행한 다음 라이브러리에서 md5sum을 실행하여 서로 다른지 확인합니다.

이제 라이브러리가 동일하다고 가정하면 컴퓨터 환경이나 구성과 같은 다른 문제가 있을 수 있지만 추적을 통해 어떤 정보가 나오는지 살펴보겠습니다.

strace를 인용하면 끝 부분에 다음이 있습니다.

 open("/proc/mounts", O_RDONLY|O_LARGEFILE) = 3
 fstat64(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7f85000
 read(3, "rootfs / rootfs rw 0 0\n/dev/root"..., 4096) = 587
 read(3, "", 4096)                       = 0
 close(3)                                = 0
 munmap(0xb7f85000, 4096)                = 0

다음 줄은 segfault 메시지입니다.

내 CentOS 5.3 시스템(rpm 버전 4.4.2.3)에서 내 rpm은 즉시 다음을 수행합니다.

open("/usr/lib/locale/locale-archive", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=56458752, ...}) = 0
mmap(NULL, 56458752, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b36f9d01000
close(3)                                = 0

따라서 문제는 /proc/mounts를 읽은 후 메모리를 닫거나 /usr/lib/locale/locale-archive를 여는 데 있다고 생각합니다. munmap()이 0을 반환했기 때문에 로케일 트리를 확인했습니다.

덧붙여서, 구성에서 로케일을 제외하면 다음 블록 광산이 실행됩니다.

 open("/usr/lib/rpm/rpmpopt-4.4.2.3", O_RDONLY) = 3
 lseek(3, 0, SEEK_END)                   = 23100
 lseek(3, 0, SEEK_SET)                   = 0
 read(3, "#/*! \\page config_rpmpopt Defaul"..., 23100) = 23100
 close(3)        

행운을 빌며 찾은 내용을 알려주세요.

관련 정보