由来がはっきりしないWindowsの“謎”仕様──Windowsの雑学(諸説あります)その知識、ホントに正しい? Windowsにまつわる都市伝説(133)(3/3 ページ)

» 2019年04月09日 05時00分 公開
[山市良テクニカルライター]
前のページへ 1|2|3       

[謎その3]hostsファイルがあんな深くにあるのは、UNIXソケットをまねたから?

 IP(IPv4)アドレスとホスト名の対応を静的に記述するファイルは何かと問われて、「/etc/hosts」(エトセ・ホスツ)と答える人は、古くからのUNIX/Linuxユーザー、あるいは昔UNIXを扱ったことがある人に違いありません。

 「C:\Windows\System32\drivers\etc\hosts」や「%SystemRoot%(または%Windir%、%Windir%は「ドライブ:\Windows」)\System32\drivers\etc\hosts」と答える人は、Windowsしか扱ったことがないものの、TCP/IPネットワークについて決して無知ではない人だと思います(画面7)。しかし、“ホスト名って何? 指名していいの?”なんて言っているあなた、ちょっと飲み過ぎなんじゃないですか(冗談です)。

画面7 画面7 TCP/IPのhostsファイルといえば、UNIX/Linuxでは「/etc/hosts」のこと(画面上)。Windowsのhostsファイルは「%SystemRoot%\System32\drivers\etc\hosts」にある(画面下)

 UNIX/Linuxの「/etc」ディレクトリにある「hosts」「networks」「protocols」「services」は、いずれもTCP/IPネットワークの主要な定義ファイルであり、TCP/IPの教科書的な書籍には必ず登場します。「networks」はネットワーク名の定義(最近は使用しない)、「protocols」はIP層のプロトコルとプロトコル番号の対応(ICMP、TCP、UDPなど)、「services」はアプリケーションごとのTCP/UDPポート番号の対応(FTP、HTTPなど)を定義するものです。

 Windowsは当初、TCP/IPネットワーク用のソフトウェアを標準搭載していませんでした。TCP/IPスタックを標準搭載するようになったのはWindows 95からです(日本では発売されなかったWindows for Workgroups 3.11が最初という説もあります)。

 TCP/IPはもともと、ソケット(BSD Socket)APIとしてUNIXに実装された、UNIX標準のネットワーク機能でした。DOSやWindows 3.1でTCP/IPを使ってUNIX(FTPサーバやTelnetサーバなど)と通信するには、通常、OSとは別にサードベンダーからTCP/IPスタックとアプリケーションを購入する必要がありました。

 筆者がよく扱っていたのは「Novell LAN WorkPlace」や「NETMANAGE Chameleon TCP/IP」だったと思いますが、各ベンダーがTCP/IPの機能を独自にWindows向けに実装したため、定義ファイルの場所がそれぞれ違っていました。

 Microsoftも当時、NetBEUI、NetBIOS、TCP/IPに対応した「LAN Manager」を販売していましたが、LAN Managerのhostsファイルは確か「ドライブ:\LANMAN.DOS\ETC\HOSTS」のような場所にあったと記憶しています。

 MicrosoftはUNIXのソケットAPIを「WinSock(Windows Sockets)API」としてWindows向けに実装し、Windows 95に標準搭載しました。このとき、hostsファイルなどのTCP/IP定義ファイルはそのまま採用されたのですが(ただし、「protocols」についてはファイル名「protocol」に)、ファイルシステムが異なるため、当然のことながら配置場所をどうするのか問題になったのでしょう。

 ネットワーク機能はドライバが大きく関係するので、「drivers」ディレクトリからの相対パスとして「\drivers\etc\hosts」に決まったのではと簡単に想像してしまいそうです。

 しかし、Windows 95からのWindows 9x系のWindowsは、「%Windir%\hosts」に配置していました。つまり、WinSock APIが初めて実装されたときからの場所ではなかったのです。現在の「%SystemRoot%\System32\drivers\etc\hosts」の場所になったのは、TCP/IPを標準搭載したWindows NTからのNT系Windowsからだと思います(Windows NT/2000の「%Windir%」および「%SystemRoot%」は「ドライブ名:\WINNT」、Windows XP/Server 2003以降は「ドライブ名:\Windows」)。

 Windows 9x系のWindowsでは、%Windir%ディレクトリにシステムファイルだけでなく、定義ファイル(INIファイル)なども配置していました。8bit/16bitドライバは「%Windir%\System\Drivers」、32bitドライバは「%Windir%\System32\drivers」が標準的な場所だったと記憶しています。

 NT系Windowsは完全に32bit OSになり、「%SystemRoot%\System32」にシステムファイルを配置するようになりました。現在は64bit OSが主流になりつつありますが、64bit OSでは64bitドライバが「%SystemRoot%\System32\drivers」ディレクトリ内に配置されています(64bit OSでは「%SystemRoot%\sysWOW64\drivers」に32bitドライバが配置されます)。

 Windows NTの開発中、「%SystemRoot%\System32\drivers」ディレクトリを起点として場所を検討し、「\etc\hosts」に決めたのは、当時としては自然なことだったのかもしれません。今となっては、なぜこんな深い場所にあるんだと思ってしまいますし、特に若い人は不思議に思うかもしれません。

筆者紹介

山市 良(やまいち りょう)

岩手県花巻市在住。Microsoft MVP:Cloud and Datacenter Management(2018/7/1)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

「Windows 7」サポート終了 対策ナビ

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。