방금 임베디드 Linux 시스템에서 깨진 심볼릭 링크를 발견했습니다 /etc/resov.conf
. 특히 그것은 깨진 심볼릭 링크였습니다. 내가 설명할 수 없는 것은 왜 그들 중 일부(많은)가 작동했는지입니다.
코드는 Alpine Linux chroot 내에서 실행됩니다. 데비안 "호스트"에는 최신의 올바른 resolv.conf가 있지만 chroot 환경 내부의 링크가 끊어졌습니다. 나도 찾았어Alpine은 기본적으로 nsswitch.conf와 함께 제공되지 않습니다.. 모든 호스트는 동일한 Alpine Linux chroot 환경을 가지며 호스트 버전 Debian 및 네트워크(물리적 위치)만 다릅니다.
호스트 및 chroot 환경은 /run
/sys
/proc
/dev
공유만 됩니다.
그러나 일부 장치에서는 영구 FQDN을 확인할 수 있습니다. 원래는 이것이 공유 DNS 캐시와 관련이 있을 수 있다고 생각했지만 배제되었습니다. chroot 내부에서:
$ ping unix.stackexchange.com
PING unix.stackexchange.com (151.101.193.69): 56 data bytes
64 bytes from 151.101.193.69: seq=0 ttl=58 time=3.962 ms
이러한 임베디드 장치는 이전에 unix.stackexchange.com을 확인하라는 요청을 받은 적이 없으므로 DNS 캐시에 있어서는 안 됩니다.
현재 "작동하는" 장치와 "깨진" 장치의 차이가 해당 장치가 있는 네트워크나 릴리스 버전의 미묘한 차이인지 조사 중입니다. 자세한 내용을 알아볼 수 있으면 질문을 업데이트하겠습니다.
누구든지 이유를 설명할 수 있나요?일부다음 중 유효한 resolv.conf 없이 FQDN을 확인할 수 있는 장치는 무엇입니까?
chroot에 대한 추가 세부정보
- 그들 모두는 동일한 chroot 이미지를 실행합니다.
- chroot 환경은 "인벤토리"입니다.알파인 미니 루트 파일 시스템python3 을 추가하면 됩니다
apk add
. nsswitch.conf
(앞서 언급) chroot 파일 시스템은 하나도 없고 하나만 있습니다.매우끊어진 링크/etc/resolv.conf
호스트에 대한 추가 세부정보:
- 다양한 호스팅 환경이 있습니다.
- 이 모든 것이 여러 버전에 걸쳐 분산되어 있습니다.데비안은 BeagleBoard.org에서 배포됩니다..
- 호스트 사용흔한네트워크를 구성합니다.
- 나에게 알려지지 않은 이유로 그들은 또한 실행됩니다DHCP 클라이언트, 유통이 진행되는 방식인 것 같습니다.
답변1
/etc/resolve.conf
호스트를 확인하는 데 필요한 구성 요소는 아닙니다. 신뢰할 수 있는 인터페이스는 애플리케이션이 호스트 이름을 확인하기 위해 호출하는 getaddrinfo
(또는 더 이상 사용되지 않는 gethostbyname
) 라이브러리 함수입니다. 시스템 구성에 따라 resolv.conf
상담이 이루어질 수도 있고 이루어지지 않을 수도 있습니다.
예를 들어, DNS 쿼리가 라우팅 되는 경우 systemd-resolved
(에서 그렇게 하도록 구성됨 ) 이는 필요하지 않습니다 . 차례로 어떻게 구성하느냐에 따라/etc/nsswitch.conf
/etc/resolv.conf
systemd-resolved
할 수 있는을 사용 resolv.conf
하거나 그럴 수 있습니다.유지하다 /run/systemd/resolve/resolv.conf
에서 심볼릭 링크를 만들 수 있습니다 /etc/resolv.conf
. 보다체계적 분석맨 페이지.
답변2
Alpine Linux는 더 잘 알려진 것 대신 Busybox 및 uClibc를 사용합니다.glibc. uClibc의 구현에는 특이한 점이 있습니다.주소정보 가져오기()localhost:53
다른 네임서버를 찾을 수 없으면 DNS 요청을 보냅니다 /etc/resolv.conf
.
이는 동일한 chroot 환경에도 불구하고 일부 유닛이 이런 방식으로 실행되는 반면 다른 유닛은 그렇지 않은 이유를 설명합니다.
dnsmasq
일부 호스트에는 설치되어 있고 다른 호스트에는 설치되지 않은 것 같습니다 . 아마도 BeagleBone 개발자의 결정이 바뀌었기 때문일 것입니다.
belo의 추적은 ping -c1 unix.stackexchange.com
Alpine/Busybox/ping이 을(를) 열려고 시도하는 것을 보여주며 /etc/resolv.conf
, 이것이 실패하면 에 요청을 보냅니다 127.0.0.1:53
. 그런 다음 해당 주소로부터 응답을 받습니다.
execve("/bin/ping", ["ping", "-c1", "unix.stackexchange.com"], 0xbec18768 /* 20 vars */) = 0
set_tls(0xb6f215ec) = 0
set_tid_address(0xb6f221a0) = 18047
mprotect(0x536000, 8192, PROT_READ) = 0
getuid32() = 0
getpid() = 18047
open("/etc/hosts", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
read(3, "127.0.0.1\tlocalhost localhost.lo"..., 1024) = 79
read(3, "", 1024) = 0
close(3) = 0
open("/etc/resolv.conf", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = -1 ENOENT (No such file or directory)
clock_gettime(CLOCK_REALTIME, {tv_sec=1595644595, tv_nsec=840201586}) = 0
clock_gettime(CLOCK_REALTIME, {tv_sec=1595644595, tv_nsec=840992292}) = 0
socket(AF_INET, SOCK_DGRAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_IP) = 3
bind(3, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
clock_gettime(CLOCK_REALTIME, {tv_sec=1595644595, tv_nsec=843970581}) = 0
sendto(3, "\247\206\1\0\0\1\0\0\0\0\0\0\4unix\rstackexchange\3"..., 40, MSG_NOSIGNAL, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 40
sendto(3, "\270D\1\0\0\1\0\0\0\0\0\0\4unix\rstackexchange\3"..., 40, MSG_NOSIGNAL, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, 16) = 40
poll([{fd=3, events=POLLIN}], 1, 2500) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "\247\206\201\200\0\1\0\4\0\0\0\0\4unix\rstackexchange\3"..., 512, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 104
recvfrom(3, "\270D\201\200\0\1\0\0\0\1\0\0\4unix\rstackexchange\3"..., 512, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.0.1")}, [16]) = 124
close(3) = 0
ioctl(1, TIOCGWINSZ, {ws_row=38, ws_col=178, ws_xpixel=0, ws_ypixel=0}) = 0
writev(1, [{iov_base="PING unix.stackexchange.com (151"..., iov_len=47}, {iov_base=" data bytes\n", iov_len=12}], 2PING unix.stackexchange.com (151.101.65.69): 56 data bytes
) = 59
socket(AF_INET, SOCK_RAW, IPPROTO_ICMP) = 3
dup2(3, 0) = 0
close(3) = 0
setsockopt(0, SOL_SOCKET, SO_BROADCAST, [1], 4) = 0
setsockopt(0, SOL_SOCKET, SO_RCVBUF, [7280], 4) = 0
rt_sigprocmask(SIG_UNBLOCK, [RT_1 RT_2], NULL, 8) = 0
rt_sigaction(SIGINT, {sa_handler=0x475b3c, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6ec89fc}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
clock_gettime(CLOCK_MONOTONIC, {tv_sec=4280439, tv_nsec=868933133}) = 0
sendto(0, "\10\0Z\r\177F\0\0\5\16\31\236\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 64, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("151.101.65.69")}, 28) = 64
rt_sigaction(SIGALRM, {sa_handler=0x475b3c, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6ec89fc}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
setitimer(ITIMER_REAL, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=10, tv_usec=0}}, {it_interval={tv_sec=0, tv_usec=0}, it_value={tv_sec=0, tv_usec=0}}) = 0
recvfrom(0, "E\0\0T8<\0\0:\1\253\215\227eAE\300\250\3\215\0\0b\r\177F\0\0\5\16\31\236"..., 192, 0, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("151.101.65.69")}, [16]) = 84
clock_gettime(CLOCK_MONOTONIC, {tv_sec=4280439, tv_nsec=879592488}) = 0
writev(1, [{iov_base="64 bytes from 151.101.65.69: seq"..., iov_len=56}, {iov_base="\n", iov_len=1}], 264 bytes from 151.101.65.69: seq=0 ttl=58 time=10.659 ms
) = 57
rt_sigaction(SIGINT, {sa_handler=SIG_IGN, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6ec89fc}, {sa_handler=0x475b3c, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART, sa_restorer=0xb6ec89fc}, 8) = 0
writev(1, [{iov_base="", iov_len=0}, {iov_base="\n", iov_len=1}], 2
) = 1
writev(1, [{iov_base="--- unix.stackexchange.com", iov_len=26}, {iov_base=" ping statistics ---\n", iov_len=21}], 2--- unix.stackexchange.com ping statistics ---
) = 47
writev(1, [{iov_base="1 packets transmitted, 1 packets"..., iov_len=45}, {iov_base=" packet loss\n", iov_len=13}], 21 packets transmitted, 1 packets received, 0% packet loss
) = 58
writev(1, [{iov_base="round-trip min/avg/max = 10.659/"..., iov_len=45}, {iov_base=" ms\n", iov_len=4}], 2round-trip min/avg/max = 10.659/10.659/10.659 ms
) = 49
exit_group(0) = ?
+++ exited with 0 +++