เหตุใดการเปลี่ยนแปลงใน / etc / hosts จึงมีผลทันที


18

การเปลี่ยนแปลง/etc/hostsไฟล์ดูเหมือนจะมีผลทันที ฉันอยากรู้เกี่ยวกับการใช้งาน เวทมนตร์อะไรที่ใช้เพื่อให้บรรลุคุณสมบัตินี้

  1. ถาม Ubuntu: หลังจากแก้ไข / etc / hosts ต้องรีสตาร์ทบริการใด
  2. การสนับสนุน NetApp: การทำงานของไฟล์ / etc / hosts

5
โดยทั่วไปแล้วไฟล์โฮสต์นั้นมีขนาดเล็กมากและไม่ค่อยสูงเกินสองสามกิโลไบต์ มีแนวโน้มน้อยกว่าไลบรารีที่คอมไพล์ที่ใช้อ่านไฟล์ ไฟล์ที่ใช้เป็นประจำขนาดเล็กมักจะอยู่ในหน่วยความจำแคช ดังนั้นแม้ว่าไฟล์จะถูกอ่านสำหรับทุกคำขอค่าใช้จ่ายในการทำเช่นนั้นจะน้อยที่สุด (เช่น: เร็วมาก)
Philip Couling

2
ความสัมพันธ์unix.stackexchange.com/questions/388875//ไปยังความคิดเห็นของ Philip :)
Jeff Schaller

คำตอบ:


27

เวทมนต์กำลังเปิด/etc/hostsไฟล์และอ่านมัน:

strace -e trace=file wget -O /dev/null http://www.google.com http://www.facebook.com http://unix.stackexchange.com 2>&1 | grep hosts
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 5
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4

getaddrinfo(3)ฟังก์ชั่นซึ่งเป็นเพียงชื่ออินเตอร์เฟซการแก้ไขมาตรฐานก็จะเปิดและอ่าน/etc/hostsในแต่ละครั้งจะเรียกว่าเพื่อแก้ไขชื่อโฮสต์

แอปพลิเคชั่นที่มีความซับซ้อนมากขึ้นซึ่งไม่ได้ใช้มาตรฐานgetaddrinfo(3)แต่ยังคงมีการเพิ่ม/etc/hostsการผสมผสาน (เช่นdnsmasqเซิร์ฟเวอร์ DNS) อาจใช้inotify(7)เพื่อตรวจสอบการเปลี่ยนแปลง/etc/hostsไฟล์และอ่านใหม่หากจำเป็นเท่านั้น

เบราว์เซอร์และแอปพลิเคชั่นอื่น ๆ จะไม่ทำเช่นนั้น พวกเขาจะเปิดและอ่าน/etc/hostsแต่ละครั้งที่พวกเขาต้องการแก้ไขชื่อโฮสต์แม้ว่าพวกเขาจะไม่ได้ใช้ตัวแก้ไขของ libc โดยตรง แต่กำลังจำลองงานของมันด้วยวิธีอื่น


1
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับสิ่งที่ตัวอย่างทำโปรด? สิ่งที่ฉันสนใจคือวิธีการเปลี่ยนแปลงที่เกิดขึ้นทันทีในการเรียกใช้รหัส (ควรเป็นส่วนหนึ่งของเครือข่ายในระบบปฏิบัติการใช่ไหม)
rudwna

7
@rudwna: เขาหมายถึง: "ทุกครั้งที่ต้องการค้นหาชื่อโฮสต์ตัวแก้ไข (ส่วนหนึ่งของไลบรารี C) กำลังเปิด / etc / hosts และอ่านมันดังนั้นหากเนื้อหาไฟล์เปลี่ยนระหว่างการอ่านการอ่านครั้งต่อไปจะใช้ เนื้อหาใหม่ "
dirkt

3
@rudwna ยังเกี่ยวกับ "การเรียกใช้รหัส" เหตุผลที่คุณเห็นการเปลี่ยนแปลงในทันทีคือว่าโปรแกรมมาตรฐานจำนวนมากไม่ได้แคชที่อยู่ แน่นอนว่ามีโปรแกรมที่จะไม่เห็นการเปลี่ยนแปลงใน / etc / hosts ทันทีและจะต้องเริ่มใหม่ มันขึ้นอยู่กับใครก็ตามที่เขียนรหัส ไม่มีอะไรวิเศษเกี่ยวกับ / etc / hosts
SamYonnou

9

ชื่อความละเอียดในหมู่สิ่งอื่น ๆ /etc/nsswitch.confที่มีการจัดการโดย นี่คือข้อความที่ตัดตอนมา:

passwd:     files sss
shadow:     files sss
group:      files sss
hosts:      files dns myhostname
(...) 

จดบันทึกhostsบรรทัด มันบอกว่า: "เมื่อแก้ไขชื่อโฮสต์ให้อ่าน/etc/hostsไฟล์ก่อนเพื่อค้นหาชื่อโฮสต์หากไม่พบจากนั้นเรียกใช้แบบสอบถาม DNS หากไม่พบจากนั้นลองใช้ชื่อโฮสต์ของระบบที่ตั้งค่าไว้ในเครื่อง"

ดังนั้นนี่คือเหตุผลที่รวดเร็ว โปรดทราบว่ามันไม่ได้ขึ้นอยู่กับบริการเครือข่ายบนเครื่องดังนั้นจึงไม่มีบริการให้รีสตาร์ทหรือโหลดซ้ำ


1
แต่มันอาจจะใช้แคช (พูด, แยกและหน่วยความจำในหลัก) /etc/hostsรุ่นของแฟ้ม เหตุใดจึงไม่ใช้รุ่นแคช
ปีเตอร์มอร์เทนเซ่น

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