การจำแนกชื่อที่แตกต่างระหว่าง CentOS และ Debian


13

ฉันมีโปรแกรม Java ขนาดเล็กที่เรียกใช้ InetAddress.getByName ("example.com") ทุกวินาที เมื่อฉันเรียกใช้บนกล่อง CentOS 6.4 โดยใช้ 'strace -f' ฉันเห็นว่า /etc/resolv.conf เปิดขึ้นและอ่านครั้งเดียว:

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

เมื่อฉันเรียกใช้บน Debian 7 ฉันเห็นว่า /etc/resolv.conf เปิดซ้ำ ๆ หรือ stat () 'd:

$ 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

ทั้งสองระบบไม่มี daemon การแคชชื่อกำลังทำงาน

ฉันใช้ Oracle HotSot Java JVM เวอร์ชันเดียวกันกับทั้งสองเครื่องเพื่อแยกแยะความแตกต่างของ Java

กล่อง CentOS 6.4 ติดตั้ง glibc 2.12 กล่อง Debian 7 ติดตั้ง glibc 2.13

สิ่งที่บัญชีสำหรับพฤติกรรมที่แตกต่างระหว่างสองระบบปฏิบัติการที่เกี่ยวข้องกับการเปิดและอ่าน /etc/resolv.conf?


คุณช่วยกรุณา pastebin ร่องรอยเต็มได้ไหม
Danila Ladner

คำตอบ:


10

นักพัฒนา glhc RedHat พิจารณาข้อบกพร่องบางอย่างในซอฟต์แวร์ของพวกเขาไม่ให้เป็นข้อบกพร่อง หนึ่งในข้อบกพร่องเหล่านี้คือการอ่าน resolv.conf อีกครั้งหลังจากเปลี่ยน glibc พิจารณาแล้วว่าความรับผิดชอบของแอปพลิเคชั่นดังนั้นแต่ละแอพพลิเคชั่นจะต้องสร้างตรรกะของตัวเองสำหรับสิ่งนี้

เนื่องจากนี่เป็นเงินจริงผู้พัฒนา eglibc ได้แก้ไขปัญหานี้แล้ว ดังนั้นในระบบที่ไม่ใช่ eglibc แอปพลิเคชันของคุณจะต้องมีตรรกะของตัวเองสำหรับการเริ่มต้นใหม่ nss_dns มิฉะนั้นจะต้องเริ่มต้นใหม่หลังจากการเปลี่ยนแปลง resolv.conf สำหรับระบบ eglibc (Debian และสิ่งต่าง ๆ ที่ใช้ Debian) คุณจะได้รับ buggy ที่น้อยลง

เราพบว่าวิธีนี้ยากหลังจากเปลี่ยน resolv.conf ถอนการติดตั้งเซิร์ฟเวอร์ DNS เก่าแล้วต้องรีสตาร์ทเซิร์ฟเวอร์ 1200+ mysql ไม่จำเป็นต้องบอกว่ามันไม่สนุก


ทำไมเรื่องนี้จึงถือว่าเป็น และทำไม glibc ถึงทำแบบนี้?
Michael Hampton

1
เพราะแทนที่จะแก้ไข glibc พวกเขาวางภาระในทุก ๆ แอปพลิเคชันนั่น ... ทำไมพวกเขาถึงทำอย่างนั้น? ฉันไม่รู้ ฉันไม่สามารถอ่านใจ Dreppers และผมไม่แน่ใจว่าผมต้องการที่จะรู้ว่าสิ่งที่เกิดขึ้นในมี ...
เดนนิส Kaarsemaker

1
มันคือ: ฉันไม่แน่ใจว่า glibc นั้นแตกหักจริง ๆ ทำไมต้อง/etc/resolv.confอ่านใหม่ทุกครั้งที่ค้นหา DNS คาดว่าจะเปลี่ยนแปลงบ่อยครั้งหรือไม่ ตอนนี้ถ้าพฤติกรรมนั้นไม่มีเอกสารฉันก็สามารถเข้าใจได้ ...
Michael Hampton

1
มันไม่ได้อ่านซ้ำทุกครั้งที่ค้นหาซึ่งจะถูกทำลายเช่นกัน :) พฤติกรรมนั้นไม่มีเอกสารและต่อต้านจริงๆ: glibc รับผิดชอบในการเริ่มต้นไลบรารี nss_dns แต่ต่อมาทำให้แอปพลิเคชันรับผิดชอบในการเริ่มต้นใหม่แม้ว่าแอปพลิเคชันเหล่านั้นจะไม่ รู้อะไรเกี่ยวกับ nss และวิธีการทำงาน นั่นเป็นวิธีที่ไม่ bonkers?
Dennis Kaarsemaker

1
เดนนิสถูกต้องไกใน EL6 ถูกทำลายอย่างตั้งใจเพราะพฤติกรรมรถม้ากลายเป็น "พฤติกรรมที่คาดหวัง" - access.redhat.com/site/solutions/541163
suprjami

4

ไม่เพียง แต่เป็นเวอร์ชัน C ไลบรารีที่แตกต่างกัน แต่ CentOS ใช้ไลบรารี GNU C ( glibc) ในขณะที่ Debian ใช้ Embedded GLIBC ( eglibc) ดังนั้นการใช้งานจริงของการเรียกชื่อระบบค้นหาจะแตกต่างอย่างสิ้นเชิง

นั่นอาจเป็นสาเหตุของพฤติกรรมการโทรของระบบที่แตกต่างกันระหว่างการแจกแจงสองแบบนี้

ผมถือว่าแปลเป็นInetAddress.getByName getaddrinfo()คุณสามารถเริ่มต้นด้วยการอ่านแหล่งที่มาของแต่ละ syscall ในการนำ C library ไปใช้และเวอร์ชันที่เกี่ยวข้อง

ตรวจสอบให้แน่ใจว่าคุณอ่านแหล่งข้อมูลจากเวอร์ชันแพคเกจจริงที่คุณใช้งานอยู่ แพ็คเกจใน EL 6.4 มีการปรับปรุงมากกว่า 2 ปีเมื่อเทียบกับรุ่นอัปสตรีมดั้งเดิมของพวกเขา ฉันถือว่ามันเหมือนกันกับแพคเกจ Debian

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.