LINUX.ORG.RU

Systemd и hostname основанный на MAC

 


1

2

Здравствуйте!

Занимаюсь сборкой ОС на базе Debian для бездисковых рабочих станций и загрузкой по сети без корня по NFS.

Есть идея назначать уникальное имя для хостов основанное на mac-адресе. Зачем? Опять же в планах управлять этими хостами через puppet.

Проблема возникает с systemd. В интернете нашел пример:

[Unit]
Description=Start Debian with a different hostname each boot
Wants=network-pre.target
Before=network-pre.target
[Service]
ExecStart=/usr/bin/newhostname
Type=oneshot
[Install]
WantedBy=multi-user.target
#!/usr/bin/env bash
# Description: Generate and set a random hostname on Linux
# Requires: sed, awk
# Usage: set-random-hostname
__set_random_hostname() {
  local new_hostname=$(head -n1 < <(fold -w8 < <(tr -cd 'a-z0-9' < /dev/urandom)))
  # set new hostname
  hostnamectl set-hostname "$new_hostname"
  # set new hostname in /etc/hosts
  sed -i "2 s/^.*$/127.0.1.1       $new_hostname/g" /etc/hosts
}
__set_random_hostname

Все работает отлично и каждый раз у хоста новое динамическое имя. Попытался вставить

cat /sys/class/net/*/address | sed ':a;N;$!ba;s/\(\n\|:\)//g' 

не работает. Подставляет, только localhost.

Запускаю с выводом в файл:

cat /sys/class/net/*/address | sed ':a;N;$!ba;s/\(\n\|:\)//g' > /tmp/firstboot
  ip a >> /tmp/firstboot

В /tmp/firstboot только localhost. Что я только не делал, менял target в Юните результат один.

Подскажите что можно сделать, нужно чтобы сетевые устройства уже были инициализированы, но не подняты.

Есть идея назначать уникальное имя для хостов основанное на mac-адресе.

Так основанное на mac-адресе или рандомное?

anonymous ()

Есть идея назначать уникальное имя для хостов основанное на mac-адресе.

Ну а вообще это обычно через DHCP делается.

anonymous ()

логика примерно такая — при загрузки узнать с какой сетевухи грузился и только её мак адрес брать. потом чудесным башем </sarcasm> превратить его в 00-c1-bl-ah... и уже назначать.
но тебе это не нужно. во первых, а не пофигу ли, какой хостнейм у машины? главное, какой в ДНС, во вторых есть всякие штуки, которые стоит посмотреть, прежде чем городить свою систему.
например уродский foreman, или прекрасный digital rebar

system-root ★★★★★ ()
Ответ на: комментарий от system-root

В том-то и проблема, у меня через systemd и bash никак не получается, такое ощущение, что или прав не хватает или сама сеть еще не поднята.

mcshel ()
Ответ на: комментарий от mcshel

в digital rebar, на который давал ссылку выше, сделано (примерно, я особо не испытываю желание читать скрипты на баше без необходимости) так:
есть provison образ — https://github.com/digitalrebar/sledgehammer
когда машина хочет грузиться с tftp, сервер шлёт её mac в строке параметров загрузки.
init скрипт. смотрит в /proc/cmdline и находит переменную BOOTIF, вот пример

echo "Parsing kernel parameters required for booting"
bootif=$(grep -o 'BOOTIF=[^ ]*' /proc/cmdline)
test -z "$bootif" && fail "Missing required parameter BOOTIF"

bootif=${bootif#*01-}
bootif=${bootif//-/:}

pxedev=""
for dev in /sys/class/net/*; do
    test -f "$dev/address" || continue
    if test "$(cat "$dev/address")" = "$bootif"; then
        pxedev=${dev##*/}
        break
    fi
done
test -z "$pxedev" && fail "Failed to find network device we booted from"
echo "Configuring boot interface"
ip link set "$pxedev" up
udhcpc -R -a -i "$pxedev"
echo "Fetching second-stage initramfs"
поднимается интерфейс, только после того как ты уверен, что это именно тот интерфейс, с которого грузился образ.
чтобы не потерять связь, если второй интерфейс смотрит в другую физическую сеть.
после этого, у тебя есть интерфейс, есть информация о его мак адресе.
осталось всё это внедрить на systemd и всё.
в sledgehammer второй стадией идёт загрузка ещё одного образа ОС поверх overlayfs, там уже может быть systemd.

system-root ★★★★★ ()
Ответ на: комментарий от system-root

Спасибо прояснили, единственное хочу добавить. Что если нужно чтобы в /proc/cmdline появлялся BOOTIF и другие параметры, то при использовании syslinux нужно добавить IPAPPEND 3 в загрузку, иначе в cmdline ничего этого не будет.

mcshel ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.