web-dev-qa-db-ja.com

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

これはかなり不可解です。 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 syscallを実行したことに気付きました。

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

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

grep "server-name" -r /etc 

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

15
Peter Krumins

nameはどこから情報を取得するのですか? というタイトルの関連するU&L Q&Aをご覧ください。ホスト名などの情報は、システムの実行中、Linuxカーネル内のデータ構造内に保持されます。システムの起動中に、通常はディストリビューション固有のさまざまなメカニズムを使用して、この情報を再取得できます。

man 2 unameのmanページを見ると、そこに記載されているデータ構造があります。

           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

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

$ 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 2

9
slm

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

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

6
Kyle Jones

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

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

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

4

長い間* nix sysadminとして、直接RTFM reference::)なしで明白なことを述べます。

   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

2
mem

実行時には、他のユーザーがすでにここで回答したとおりにメモリに保存されます。

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

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

grep -r `hostname` /etc
1