Команда 'ip address' не показывает IP-адрес в rc.local в Linux

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. или наоборот ), что вступает в игру для хостов, имеющих несколько адресов одного или нескольких семейств адресов.

0
17.09.2021, 07:43
2 ответа

, если я не ошибаюсь, /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.

0
17.09.2021, 07:57

Определение по умолчанию для запущенной службы 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:вызывает добавление службы в процесс обычной загрузки.

0
17.09.2021, 13:32

Теги

Похожие вопросы