To dość zagadkowe. Czy ktoś wie, gdzie hostname
polecenie przechowuje i odczytuje nazwę hosta?
Myślałem, że to / etc / hostname, ale w tym systemie Linux nie ma takiego pliku, którego używam. Próbowałem użyć strace, aby znaleźć lokalizację, ale żadne wywołania odczytu nie zwróciły tych informacji:
$ strace hostname 2>&1 | grep read
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340^\0\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\30\2\0\0\0\0\0"..., 832) = 832
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320\16\0\0\0\0\0\0"..., 832) = 832
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 248
read(3, "", 1024) = 0
Potem zauważyłem, że to nie nazwa połączenia systemowego, które zwróciło tę informację:
uname({sys="Linux", node="server-name", ...}) = 0
Rekurencyjny grep w / etc / nic nie zwraca:
grep "server-name" -r /etc
Gdzie uname przechowuje te informacje? Właśnie w pamięci?
Odpowiedzi:
Spójrz na pokrewne pytania i odpowiedzi dotyczące U&L zatytułowane: Skąd uname pobiera informacje? . Informacje, takie jak nazwa hosta, pozostają w strukturze danych w jądrze Linux, gdy system jest uruchomiony. Podczas uruchamiania systemu informacje te można uzyskać ponownie za pomocą różnych mechanizmów, które zazwyczaj są specyficzne dla dystrybucji.
Jeśli spojrzysz na
man 2 uname
stronę man, wspomniana tam struktura danych:Drugi element tej struktury
nodename[]
to jedno miejsce, w którym nazwa hosta jest przechowywana w jądrze systemu Linux./ proc
Jeśli przyjrzysz się temu
/proc/sys/kernel/hostname
, nazwa hosta również jest widoczna tutaj. Jest to lokalizacja wirtualna/proc
, ale daje alternatywną metodę dostępu do nazwy hosta. Nazwa domeny systemu jest tutaj też/proc/sys/kernel/domainname
.UWAGA: Interesujące są te wartości specyficzne dla przestrzeni nazw UTS .
Przykład
Manipulowanie nazwą hosta
W systemie z Systemd możesz użyć narzędzia cli,
hostnamectl
aby uzyskać / ustawić nazwę hosta. Spowoduje to zmianę na stałe między restartami.Możesz również dowiedzieć się o jego wartości poprzez
sysctl
:W przypadku wydań Fedory niniejsze pytanie ask.fedoraproject.org dość dokładnie omawia ten temat, zatytułowany: Prawidłowe ustawienie nazwy hosta - Fedora 20 na Amazon EC2 .
źródło
hostname
Komenda nie przechowuje nazwę wszędzie, ale pamięć jądra.To, w jaki sposób system decyduje, jak ma nazywać się podczas uruchamiania, zależy od konfiguracji systemu. Dostępne opcje to od odczytu nazwy z pliku, po użycie DNS lub / etc / hosts do ustawienia nazwy po uruchomieniu odpowiedniego interfejsu sieciowego.
źródło
/etc/hosts
(co jest do wyszukiwania DNS - system, który odczytuje z niego swoją nazwę hosta, jest tak źle) ... ale prawdopodobnie/etc/hostname
(zawiera w pełni kwalifikowaną nazwę) lub rzadko/etc/sysconfig/network
(może zawieraćHOSTNAME=...
polecenie powłoki). Na instancji Amazon EC2 może być konieczne zmodyfikowanie/etc/cloud/cloud.cfg
...hostname(1)
jest tylko nakładką nasethostname(3)
wywołanie systemowe, które zasadniczo zapisuje nazwę hosta w miejscu, w którym jądro spodziewa się, że zostanie ono zapisane.Jeśli chcesz, aby zmiana była trwała, zgodnie z ogólną filozofią uniksową musisz ją zapisać sam. Dokładna lokalizacja zależy jednak w dużej mierze od twojego systemu init. Na przykład init OpenBSD odczytuje nazwę hosta z
/etc/myname
(podczasnetstart
).Wszystko to należy opisać na stronach systemowych lub w dokumentacji pomocniczej.
źródło
Jako długi sysadmin * nix podam oczywiste, bez bezpośredniego odniesienia RTFM: :)
Dotyczy to większości dystrybucji Linuksa.
- mem
źródło
W czasie wykonywania jest on przechowywany w pamięci, jak już odpowiedzieli inni tutaj.
Aby przetrwać restart, musi być gdzieś zapisany w pliku, który jest specyficzny dla dystrybucji Linux. Na mojej Fedorze 20 jest to / etc / hostname
Najprawdopodobniej jest przechowywany w / etc. Spróbuj wyszukać rzeczywistą nazwę hosta w itp
źródło
hostnamectl
etc .: ask.fedoraproject.org/en/question/37413/…