`hostname`は私が設定したホスト名をどこに保存しますか?


15

これは非常に不可解です。hostnameコマンドがどこからホスト名を保存し、読み取るかを知っていますか?

/ etc / hostnameであると思いましたが、使用しているこのLinuxシステムにはそのようなファイルはありません。私はstraceを使用してそれがどこにあるかを見つけようとしましたが、読み取り呼び出しはこの情報を返しませんでした:

$ 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

次に、この情報を返したシステムコールがunameであることに気付きました。

uname({sys="Linux", node="server-name", ...}) = 0

/ etc /の再帰的なgrepは何も返しません:

grep "server-name" -r /etc 

unameはこの情報をどこに保存しますか?ただ記憶に?


1
使用しているLinuxディストリビューションは何ですか?
アミールjj 14年

回答:


9

この関連するU&L Q&A:unameはどこから情報を取得しますか?。ホスト名などの情報は、システムの実行中、Linuxカーネル内のデータ構造内に保持されます。システムのブート中に、この情報は、通常はディストリビューション固有のさまざまなメカニズムによって再取得できます。

man 2 unameマニュアルページを見ると、そこにデータ構造が記載されています:

           struct utsname {
               char sysname[];    /* Operating system name (e.g., "Linux") */
               char nodename[];   /* Name within "some implementation-defined
                                     network" */
               char release[];    /* Operating system release (e.g., "2.6.28") */
               char version[];    /* Operating system version */
               char machine[];    /* Hardware identifier */
           #ifdef _GNU_SOURCE
               char domainname[]; /* NIS or YP domain name */
           #endif
           };

その構造の2番目の要素はnodename[]、ホスト名がLinuxカーネル内に保存される1つの場所です。

/ proc

を見ると/proc/sys/kernel/hostname、ホスト名もここに公開されています。これは仮想ロケーション/procですが、ホスト名にアクセスするための代替方法を提供します。システムのドメイン名もここにあります/proc/sys/kernel/domainname

注:興味深いことに、これらの値はUTS名前空間固有です。

$ sudo hostname
oldhost
$ sudo unshare --uts /bin/bash
$ sudo echo newhost > /proc/sys/kernel/hostname 
$ hostname
newhost
$ exit
$ hostname
oldhost

ホスト名の操作

Systemdを使用するシステムでは、cliツールhostnamectlを使用してホスト名を取得/設定できます。これにより、再起動の間に永続的に変更されます。

$ sudo hostnamectl set-hostname --static somehostname

また、次の方法で値を調べることもできますsysctl

$ sudo sysctl -a | grep kernel.hostname
kernel.hostname = myhostname

Fedoraリリースの場合、このask.fedoraproject.orgのQ&Aは、「ホスト名を正しく設定する -Amazon EC2でのFedora 20」というタイトルのトピックをかなり網羅しています


1
えー hostnamectlは、単にシステムコールを呼び出します。再起動後も持続するように、syscallはどのように情報を保存しますか?OPでなくても、それが私の質問です。
オテウス

6

このhostnameコマンドは、カーネルメモリ以外の名前を保存しません。

ブート時にシステムがその名前を決定する方法は、システムの構成方法によって異なります。オプションの範囲は、ファイルからの名前の読み取りから、DNSまたは/ etc / hostsを使用した適切なネットワークインターフェイスの起動後の名前の設定までです。


2
決して/etc/hosts(DNSルックアップ用-ホスト名をそこから読み取るシステムは非常に間違っています)...おそらく/etc/hostname(完全修飾名を含む)またはめったに/etc/sysconfig/networkHOSTNAME=...シェルコマンドを含む可能性があります)。Amazon EC2インスタンスでは、変更が必要な場合もあり/etc/cloud/cloud.cfgます...
David Tonhofer 14年

4

hostname(1)これは、sethostname(3)システムコールの単なるフロントエンドであり、基本的には、ホスト名をカーネルが格納することを期待する場所に書き込みます。

Unixの一般的な哲学に従って、変更を永続的にしたい場合は、自分で変更を保存する必要があります。ただし、正確な場所は初期化システムに大きく依存します。たとえば、OpenBSDのinitは/etc/myname(中にnetstart)ホスト名を読み取ります。

これはすべて、システムのマンページまたはサポートドキュメントで説明する必要があります。


2

長い間* nix sysadminとして、直接RTFMリファレンスなしで、明白なことを述べます::)

   hostnamectl may be used to query and change the system hostname and
   related settings.

   This tool distinguishes three different hostnames: the high-level
   "pretty" hostname which might include all kinds of special characters
   (e.g. "Lennart's Laptop"), the static hostname which is used to
   initialize the kernel hostname at boot (e.g. "lennarts-laptop"), and
   the transient hostname which is a fallback value received from network
   configuration. If a static hostname is set, and is valid (something
   other than localhost), then the transient hostname is not used.

   Note that the pretty hostname has little restrictions on the characters
   used, while the static and transient hostnames are limited to the
   usually accepted characters of Internet domain names.

   The static hostname is stored in /etc/hostname, see hostname(5) for
   more information. The pretty hostname, chassis type, and icon name are
   stored in /etc/machine-info, see machine-info(5).

これは、ほとんどの「Linux」ディストリビューションに当てはまります。

--mem


1

実行時に、ここですでに他の人が答えたように、メモリに保存されます。

再起動後も生き残るためには、Linuxディストリビューション固有のファイルに保存する必要があります。私のFedora 20では/ etc / hostnameです

ほとんどの場合、/ etcに保存されます。などで実際のホスト名を検索してみてください

grep -r `hostname` /etc

このask.fedoraproject.org Qには、hostnamectletcなどを使用してF20でホスト名を設定/取得できるすべての方法があります。ask.fedoraproject.org/en/question/37413/
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.