host
, nslookup
и dig
— все утилиты DNS. :они выполняют DNS-запросы и, следовательно, обходят обычное разрешение имен, предоставляемое OS/libc, посредством обычных вызовов gethostbyname()
и getaddrinfo()
.
Обратите внимание, что они по-прежнему используют /etc/resolv.conf
себя в качестве своего рода начальной загрузки :, чтобы узнать, с каким сервером связаться, если вы его не предоставите (, и в большинстве случаев всегда предпочтительнее указывать, какой сервер имен вы запрашиваете с помощью этих инструменты, как и обычное устранение неполадок DNS, часто начинается с запроса авторитетных серверов имен, а затем только рекурсивных, которые хранятся в/etc/resolv.conf
).
ping
почти не подходит для любого вида устранения неполадок, но в отношении потребностей в разрешении имен он использует стандартные инструменты, предоставляемые OS/libc, которые определяют, как происходит разрешение имен, если это с DNS, локальный файл, LDAP, NIS, mDNS или любой другой источник информации. Это роль /etc/nsswitch.conf
. И, следовательно, вы увидите, как он открывает файлы:
# strace -e open ping -c 1 www.example.com
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libcap.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 4
open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 4
open("/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 4
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 4
PING www.example.com (93.184.216.34) 56(84) bytes of data.
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 4
64 bytes from 93.184.216.34: icmp_seq=1 ttl=57 time=1.00 ms
--- www.example.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.003/1.003/1.003/0.000 ms
+++ exited with 0 +++
getent
— это общая утилита для запроса информации из источников данных, перечисленных в /etc/nsswitch.conf
. Итак, у вас есть «базы данных» ahosts
и hosts
, с которыми вы можете использовать getent
. Вызов будет или не будет использовать DNS, в зависимости от содержимого /etc/nsswitch.conf
и содержимого /etc/hosts
, если files
указан в качестве источника для этих баз данных.
# strace -e open getent ahostsv4 www.example.com
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/UTF-8/LC_CTYPE", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/host.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/hosts", O_RDONLY|O_CLOEXEC) = 3
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libnss_dns.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libresolv.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/resolv.conf", O_RDONLY|O_CLOEXEC) = 3
93.184.216.34 STREAM www.example.com
93.184.216.34 DGRAM
93.184.216.34 RAW
+++ exited with 0 +++
Вы даже можете сделать вывод, что он сначала проверяет /etc/hosts
, потому что он сначала открывает libnss_files
, и с этой конфигурацией, поскольку запись не найдена, он возвращается к DNS благодаря libnss_dns
.
PS :также обратите внимание, что /etc/gai.conf
может использоваться, когда именно OS/libc обрабатывает разрешение имен, поскольку она определяет порядок IP-адресов (и, как правило, если IPv6 предпочтительнее IPv4. или наоборот ), что вступает в игру для хостов, имеющих несколько адресов одного или нескольких семейств адресов.
, если я не ошибаюсь, /etc/rc.local
устарел. если вам нужно запустить команду после загрузки, используйте cron со специальным тегом @reboot
.
Создайте новый файл в /etc/cron.d/
и добавьте новую строку с
@reboot ip address >> /home/user/log.boot 2>&1
При следующей загрузке cron запустится ip address >> /home/user/log.boot 2>&1
.
Определение по умолчанию для запущенной службы systemd /etc/rc.d/rc.local
(, которая символически связана с /etc/rc.local
в RHEL/CentOS/UEL 8 ), — это :
[Unit]
Description=/etc/rc.d/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.d/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
Обратите внимание, что указана единственная зависимость порядка After=network.target
. Это не имеет большого значения :в основном, это может быть выполнено, как только NetworkManager.service
и rsyslog.service
будут запущены. Поэтому на практике он часто работает параллельно, пока NetworkManager работает над запуском сетевых интерфейсов, что слишком рано для вашей конкретной цели.
Это был бы хороший пример написания минимального собственного сервиса systemd.
Во-первых, systemd ExecStart=
не является командной строкой оболочки :и не поддерживает перенаправление. Итак, создайте минимальный сценарий оболочки для вашей команды, например. /usr/local/bin/log-boot-ip.sh
и пометить его как исполняемый(chmod +x /usr/local/bin/log-boot-ip.sh
):
#!/bin/sh
ip address >> /home/user/log.boot 2>&1
Тогда напишем минимальный/etc/systemd/system/log-boot-ip.service
:
[Unit]
Description=log IP address(es) at each boot
ConditionFileIsExecutable=/usr/local/bin/log-boot-ip.sh
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/log-boot-ip.sh
[Install]
WantedBy=multi-user.target
Как всегда, после добавления или изменения systemd
определений службы запустите systemctl daemon-reload
после установки log-boot-ip.service
на место.
Description
:просто человек -читаемое краткое описание
ConditionFileIsExecutable
:безвредно пропустит эту службу, если наш скрипт не является исполняемым
Wants
иAfter
:так вы настраиваете службу для запуска после активации сетевых интерфейсов, см. man systemd.special
.
Type=oneshot
:потому что скрипт завершится, ничего не оставив запущенным. Без этого systemd предположил бы Type=simple
и предположил бы, что завершение сценария означает, что он потерпел неудачу.
RemainAfterExit=true
:заставляет systemd «запоминать», что эта служба уже выполнялась один раз, и показывать ее как «активную», даже если скрипт завершился.
ExecStart
:указывает фактическую команду/скрипт для запуска.
WantedBy=multi-user.target
:вызывает добавление службы в процесс обычной загрузки.