CentOS와 데비안의 이름 확인 차이


13

초마다 InetAddress.getByName ( "example.com") 호출을 반복하는 작은 Java 프로그램이 있습니다. 'strace -f'를 사용하여 CentOS 6.4 상자에서 실행할 때 /etc/resolv.conf가 열리고 한 번 읽은 것을 볼 수 있습니다.

$ grep /etc/resolv.conf strace.out
[pid 24810] open("/etc/resolv.conf", O_RDONLY) = 6

데비안 7에서 실행하면 /etc/resolv.conf가 반복적으로 열리거나 stat ()가 나타납니다.

$ grep  /etc/resolv.conf strace.out
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] open("/etc/resolv.conf", O_RDONLY) = 10
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0
[pid 41821] stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=92, ...}) = 0

두 시스템 모두 /etc/nsswitch.conf가

호스트 : 파일 DNS

어느 시스템에서도 이름 캐싱 데몬이 실행되고 있지 않습니다.

두 시스템에서 동일한 버전의 Oracle HotSot Java JVM을 사용하여 Java 차이점을 배제했습니다.

CentOS 6.4 상자에는 glibc 2.12가 설치되어 있습니다. 데비안 7 박스에는 glibc 2.13이 설치되어 있습니다.

/etc/resolv.conf 열기 및 읽기와 관련하여 두 운영 체제 간의 다른 동작을 설명하는 것은 무엇입니까?


풀 트레이스에 페이스트 빈을 넣을 수 있습니까?
Danila Ladner

답변:


10

RedHat glibc 개발자는 소프트웨어의 일부 버그를 버그로 간주하지 않습니다. 이러한 버그 중 하나는 변경 후 resolv.conf를 다시 읽는 것입니다. glibc는 응용 프로그램의 책임을 고려하므로 각 응용 프로그램마다이를위한 고유 한 논리를 만들어야합니다.

이것은 절대적으로 본질이기 때문에 eglibc 개발자들은이 문제를 해결했습니다. 따라서 비 eglibc 시스템에서는 응용 프로그램에 nss_dns를 다시 초기화하기위한 자체 논리가 있어야합니다. 그렇지 않으면 resolv.conf 변경 후 다시 시작해야합니다. eglibc 시스템 (데비안과 데비안 기반)에서는 버그가 적은 libc를 얻습니다.

resolv.conf를 변경하고 오래된 DNS 서버를 사용 중지 한 다음 1200+ mysql 서버를 다시 시작한 후 어려운 방법을 발견했습니다. 말할 것도없이, 이것은 재미 있지 않습니다.


이것이 왜 "절대적으로 bonkers"로 간주됩니까? 그리고 glibc가 왜 이런 식으로 했습니까?
Michael Hampton

1
glibc를 수정하는 대신 모든 응용 프로그램에 부담을주게됩니다. 왜 그렇습니까? 모르겠어요 나는 Dreppers의 마음을 읽을 수 없으며, 거기에서 무슨 일이 일어나고 있는지 잘 모르겠습니다 ...
Dennis Kaarsemaker

1
문제는 : glibc가 실제로 깨져 있는지 확실하지 않습니다. /etc/resolv.conf모든 DNS 조회에서 왜 다시 읽어야합니까? 실제로 자주 변경 될 것으로 예상됩니까? 이제 행동이 문서화되지 않았다면 이해할 수있었습니다.
Michael Hampton

1
모든 조회에서 다시 읽지는 않지만 다음과 같이 손상 될 수도 있습니다. nss 및 작동 방식에 대해 anythong을 알고 있습니다. 그것은 어떻게 bonker가 아닌가?
Dennis Kaarsemaker

1
버그 동작은 "예상되는 동작"가 있기 때문에 데니스, 오른쪽 EL6에 상가가 의도적으로 파손되어 - access.redhat.com/site/solutions/541163
suprjami

4

C 라이브러리 버전뿐만 아니라 CentOS는 GNU C 라이브러리 ( glibc)를 사용하는 반면 데비안은 Embedded GLIBC ( eglibc)를 사용하므로 이름 검색 시스템 호출의 실제 구현은 완전히 다릅니다.

아마도이 두 배포판 사이의 다른 시스템 호출 동작을 설명 할 것입니다.

나는로 InetAddress.getByName번역 한다고 가정 getaddrinfo()합니다. 관련 C 라이브러리 구현 및 버전에서 각 syscall의 소스를 읽는 것으로 시작할 수 있습니다.

사용중인 실제 패키지 버전에서 소스를 읽으십시오. EL 6.4의 패키지는 원래 업스트림 버전에 비해 2 년 이상 개선되었습니다. 데비안 패키지에서도 마찬가지입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.