現在 Linux では、3つの異なる DHCP クライアントプログラムがあります。 dhcpcd, pump と dhclient です。この mini-HOWTO では、 主に dhcpcd を取り扱います。
お使いのディストリビューションによっては、 DHCP クライアントデーモンをダウンロードする必要があるかもしれません。 ソースからコンパイルしたいのであれば、 必要なパッケージは dhcpcd と呼ばれるもので、現在の最新版は 1.3.18 です。 Sergei Viznyuk <sergei@phystech.com> がメンテナンスしており、 今日では多くのディストリビューションでバイナリパッケージが収録されています。
dhcpcd のソースは次の場所からダウンロードできます。
ダウンロードしたら、以下の指示に従ってください。 どちらのリンクからも同じものが入手可能なはずです。
最新版の DHCPcd は metalab のミラーから、あるいは以下から ダウンロードできます。
ftp://ftp.phystech.com/pub/ (Primary site)
ftp://ftp.kobe-u.ac.jp/pub/PC-UNIX/Linux/network/dhcp/ (Primary site in Japan)
最新版の dhcpcd.tar.gz をダウンロードしましょう。
展開します。
tar -zxvf dhcpcd-1.3.18pl1.tar.gz
ディレクトリに入って dhcpcd を make します。
cd dhcpcd-1.3.18pl1
make
インストールします (以下のコマンドは root で実行する必要があります)
make install
/etc/dhcpc というディレクトリができます。 DHCPcd はここに DHCP 情報を保存します。 dhcpcd は /usr/sbin にコピーされます。
ブート時に DHCP を利用してシステムの初期化を行うには、 以下のように入力します。
cd /etc/rc.d
mv rc.inet1 rc.inet1.OLD
古いネットワーク初期化スクリプトを rc.inet1.OLD にリネームします。ここで新しい rc.inet1 スクリプトを作成する必要があります。 以下のコードで OK でしょう。
#!/bin/sh # # rc.inet1 This shell script boots up the base INET system. HOSTNAME=`cat /etc/HOSTNAME` #This is probably not necessary but I #will leave it in anyways # Attach the loopback device. /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo # IF YOU HAVE AN ETHERNET CONNECTION, use these lines below to configure the # eth0 interface. If you're only using loopback or SLIP, don't include the # rest of the lines in this file. /usr/sbin/dhcpcd |
保存してコンピュータを再起動しましょう。
終わったら最終設定に進みましょう。
RedHat 6.0+ における DHCPcd の設定はとても簡単です。 まず control-panel コマンドでコントロールパネルを起動します。
"Network Configuration" を選びます。
Click on Interfaces
Add をクリックします。
Ethernet を選びます。
Edit Ethernet/Bus Interface から "Activate interface at boot time" を選び、"Interface configuration protocol" として "DHCP" を選びます。
RedHat 6.x では、上記の dhcpcd ではなく、pump が 標準の DHCP クライアントとして同梱されていることに気をつけてください。CD-ROM には dhcpcd の rpm も含まれているので、pump でうまくいかなかったら dhcpcd で試してみましょう。dhcpcd を (例えば rpm -i dhcpcd-1.3.17pl2-1.i386.rpm のように) インストールしたら、 修正が必要になります。
Alexander Stevenson <alexander.stevenson@home.com> による追加情報を以下に示します。
DHCPcd では全くうまくいきませんでした。結局役に立ったのは Mandrake 6.0 同梱の (たぶん RedHat にもあると思う) "pump" でした。 私が使ったコマンドを以下に示します。
pump -i eth0 -h hostname
"hostname" は何でも構いませんでしたが、 とにかくこれがないとサーバは反応を示しませんでした。
それから、/sbin/ifup スクリプトに変更を加え、設定を反映させました。標準のバージョンでは -h オプションがなかったので、うまく動きませんでした。
基本的に、linuxconf を使っているのであれば、 アダプタの設定を "DHCP" にしても動かない場合には、 /sbin/ifup のスクリプトの pump の行に "-h hostname" というオプションを追加してみるといいのではないでしょうか。私はスクリプトを次のように修正しました。
... if [ -n "$PUMP" ]; then echo -n "Determining IP information for $DEVICE..." if /sbin/pump -i $DEVICE -h hostname; then echo " done." else echo " failed." exit 1 fi else ...
もう一つの、よりエレガントにホスト名を設定する方法が Aad van der Klaauw から寄せられました。以下に示します。
いま自宅のゲートウェイシステムを設定しているんですが、 MAC アドレスをセットして '-h hostname' を有効にする必要がありました。 そのために、スクリプトを「変更せずに」、設定ファイルを使うことにしました。 /etc/sysconfig/network-scripts/ifcfg-eth0 に、次のような記述を加えました。
DEVICE="eth0" MACADDR="00:11:22:33:44:55" DHCP_HOSTNAME="trigger_for_terayon"こちらならアップグレードしても設定が残りますし、 私の知る限りでは「見通しの良い」方法です。
これで終わりです。マシンをリブートするか、 /sbin/ifup eth0 をコマンドラインで実行してください。
RedHat 5.0+ における DHCPcd の設定はとても簡単です。 まず control-panel コマンドでコントロールパネルを起動します。
"Network Configuration" を選びます。
Click on Interfaces
Add をクリックします。
Ethernet を選びます。
Edit Ethernet/Bus Interface から "Activate interface at boot time" を選び、"Interface configuration protocol" として "DHCP" を選びます。
終わったら最終設定に進みましょう。
DHCPcd は RedHat の標準ディストリビューションに RPM として入っています。 ディストリビューション CD-ROM の RPMS ディレクトリにあるでしょう。 以下からダウンロードしてもいいでしょう。
ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm
次のコマンドでインストールしましょう: rpm -i dhcpcd-0.6-2.i386.rpm
あるいは自分の好きなバージョンを取ってきて、Slackware の 部分で説明したやり方でコンパイルしてもかまいません。
以下の情報は nothing <nothing@cc.gatech.edu> から寄せられました。
静的な IP アドレスと名前を /etc/resolv.conf から取り除きました。 しかし search 行と二つの nameserver 行は残しました (なぜか私の dhcpcd は /etc/dhcpc/resolv.conf を生成してくれないので、 静的な /etc/resolv.conf を使わなければなりませんでした)。
/etc/sysconfig/network からは HOSTNAME, GATEWAY のエントリを 削除しました。その他のエントリ (NETWORKING, DOMAINNAME, GATEWAYDEV) はそのまま残しました。
/etc/sysconfig/network-scripts/ifcfg-eth0 からは IPADDR, NETMASK, NETWORK, BROADCAST のエントリを削除しました。 DEVICE と ONBOOT はそのまま残しました。 BOOTPROTO 行は BOOTPROTO=dhcp と変更しました。
ファイルをセーブし、コンピュータをリブートしましょう。
終わったら最終設定に進みましょう。
DHCPcd の deb パッケージは以下にあります。dhcpcd で始まるものを入手しましょう。
http://ftp.debian.org/debian/dists/slink/main/binary-i386/net/
あるいは Slackware のように自分でインストールしてもいいでしょう。
deb パッケージを展開するには以下のコマンドを入力します。 dpkg -i /where/ever/your/debian/packages/are/dhcpcd*deb
DHCPcd 用の設定は特に必要ないようです。理由を以下に示します。
debian パッケージはだいたいそうですが、dhcpcd パッケージも スタートアップスクリプトを /etc/init.d/package_name に インストールし (ここでは /etc/init.d/dhcpcd です)、 そして /etc/rc?.d/ ディレクトリに、必要なリンクを配置してくれます。 | ||
--Heiko Schlittermann <heiko@os.inf.tu-dresden.de> による。 |
したがって /etc/rc?.d/ ディレクトリの内容がブート時に実行されます。
インストールしてからコンピュータを再起動しない場合は、 次のコマンドによって手動でデーモンを起動してみてください。 /etc/init.d/dhcpcd start
終わったら最終設定に進みましょう。
以下の内容は R. Shapiro によるものです。
"1999" (R5) リリースで、Linuxppc は、ほぼ完全に RedHat 6 互換となりました。ただし一つ警告があります(下を見てください)。 それ以外の点については、 RedHat 6.x および Mandrake 6.x での説明と同じことがあてはまります。
残っている問題は、Redhat 6 が標準の DHCP クライアントとして使っている pump が、Linuxppc では安定して動作しない、というものです。 この問題に対処するには、Sergei Viznyuk のページから最新版の dhcpcd を入手してインストールし、/sbin/ifup を編集して pump の代わりに dhcpcd を使うようにする必要があります。
if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then PUMP=true fi if [ -n "$PUMP" ]; then |
とある部分を、
if [ "$BOOTPROTO" = bootp ]; then echo " done." else echo " failed." exit 1 fi elif [ "$BOOTPROTO" = dhcp ]; then echo -n "Determining IP information for $DEVICE..." if /sbin/dhcpcd -d $DEVICE ; then if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then /etc/dhcpc/dhcpcd-${DEVICE}.exe fi |
と書き換えてください。ifdown にもこれに 対応する修正が必要です。
if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then .... fi |
とある部分を
if [ "$BOOTPROTO" = bootp ]; then fi if [ "$BOOTPROTO" = dhcp ]; then if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then kill `cat /var/run/dhcpcd-${DEVICE}.pid` rm -f /var/run/dhcpcd-${DEVICE}.pid fi fi |
と書き換えます。
ppc で動く dhcpcd の rpm は Linuxppc 1999 に同梱されています。 もう少し新しい rpm が、 ftp://ftp.linuxppc.org/ の contrib ディレクトリにあります。Linuxppc 1999 でコンパイルできるソースは ftp://ftp.phystech.com/pub/dhcpcd-1.3.17-pl9.tar.gz から入手可能です。
マシンを再起動したら、ネットワークインターフェースは 設定済みになっているはずです。ifconfig コマンドを実行しましょう。
以下のような表示が出るはずです。
lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:302 errors:0 dropped:0 overruns:0 frame:0 TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0 eth0 Link encap:Ethernet HWaddr 00:20:AF:EE:05:45 inet addr:24.128.53.102 Bcast:24.128.53.255 Mask:255.255.254.0 ^^^^^^^^^^^^^^^^^^^^^^^ UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24783 errors:1 dropped:1 overruns:0 frame:1 TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96 Interrupt:10 Base address:0x300 |
inet addr のあとに通常の番号が出ていれば OK です。 0.0.0.0 が出てもがっかりしないでください、これは dhcpcd が IP アドレスを取得する前の一時的な状態です。数分経っても 0.0.0.0 のままでしたら、 トラブルシューティング をチェックしてください。 DHCPcd はデーモンですから、マシンの電源が入っている限り居座り続けます。 DHCPcd は 3 時間おきに DHCP サーバに接続し、新たな IP アドレスを 貸し出してもらおうとします。メッセージはすべて syslog に 保存されます (Slackware 系なら /var/adm/syslog, Redhat/OpenLinux なら /var/log/syslog です)。
最後にもう一つ。ネームサーバを指定しなければなりません。 これには二つのやり方があります。一つはプロバイダに、使ってもかまわない ネームサーバのアドレスを教えてもらい、それを /etc/resolv.conf に書く方法、もう一つは DHCPcd に DHCP サーバから リストを取得させ、/etc/dhcpc に resolv.conf を作成させる方法です。
私は DHCPcd の resolv.conf を使うことにしました。 やり方を以下に示します。
古い /etc/resolv.conf を、 次のコマンドを実行してバックアップします。 mv /etc/resolv.conf /etc/resolv.conf.OLD
/etc/dhcpcディレクトリがなければ、次のコマンドを実行して作ります。 mkdir /etc/dhcpc
/etc/dhcpc/resolv.conf から /etc/resolv.confへのリンクを 作ります。 ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf
上記でうまくいかない場合は以下を試してください ( <nothing@cc.gatech.edu> の指摘を受けて修正しました。また Henrik Stoerner からも改善提案を いただきました)。
この最終ステップを行わなければならなかったのは、 私の dhcpcd が /etc/dhcpc/resolv.conf を作成しなかったからでした。私は /etc/sysconfig/network-scripts/ifup に以下の修正を行いました (非常に情けないハックですが、私のところではうまく動いています)。
elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE} echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^ echo "failed." exit 1 |
これを以下のように変更しました。
elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^^^ echo "failed." exit 1 |
Note: 注意すべきは if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; の部分の ! (エクスクラメーション) です。
さあ、では席に戻って楽しみましょう :-)
以下のステップは本来不要ですが、役に立つ人もいるでしょう。
ネットワーク接続を時々しか必要としないなら、 dhcpcd をコマンドラインから起動する事もできます (root 権限が必要です)。以下を実行します。 /usr/sbin/dhcpcd
ネットワークを切断するときには以下を実行します。 /usr/sbin/dhcpcd -k
これまで述べてきたステップを正しくたどってもネットワークアクセスが できない場合には、いくつかの理由が考えられます。
ブートアップのプロセスで、 Linux はネットワークカードを プローブして以下のような行を出力するはずです。
eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov |
このようなメッセージが現れない場合は、あなたの Linux システムでは Ethernet カードが認識されていません。一般的な Ethernet カード (NE2000 クローンなど) を使っている場合は、カード設定用の DOS ユーティリティの入ったディスクがあるはずです。 Linux がカードを認識するまで、IRQ を変えていってみましょう (IRQ 9, 10, 12 などなら通常は良いはずです)。
dhcpcd を、dhcpcd -r とタイプして実行してみましょう。
ifconfig を用いてネットワークインターフェースが正しく設定されたか チェックしてみましょう (設定のプロセスには数秒かかります。 最初は Inet.addr=0.0.0.0 と言ってきます)。
これで解決したら、ブートアップスクリプトにも "-r" フラグを 加えましょう。つまり /sbin/dhcpcd のかわりに /sbin/dhcpcd -r のようにしましょう。
例えば RedHat なら、 /etc/sysconfig/network-scripts/ifup スクリプトを編集して以下のようにしましょう。
IFNAME=$[ {DEVICE} \ "/sbin/dhcpcd -r -c /etc/"- etc etc. |
おそらく RedHat をお使いで、説明を注意深くたどって来ませんでしたね :-)。 if 文の ! (エクスクラメーション) が抜けているのでしょう。 ここに戻って修正方法をチェックすること。
gated (ゲートウェイデーモン) が Linux マシンのルーティングを 壊してしまい、このような問題を引き起こすことがあるそうです。 gated が起動していないかどうかを、次のコマンドで確認してください。 ps -auxww | grep gate
あった場合は RedHat の RPM マネージャで削除するか、 /etc/rc.d/ のエントリを削除しましょう。
ネットワークカードの 10BaseT ポート (電話プラグみたいなやつです) が使われる設定になっているかを確認する必要があります。 調べるのに一番いい方法は、カードのどのコネクタが使われるように なっているのかをブートアップ時に確認することです。 以下のような表示があるはずです。
eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. ^^^^^^^^^^^^ 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov |
ラップトップ型のユーザから、このような問題が PCMCIA ユーティリティ (特に ifport) のせいで生じるという報告をもらっています。 これがコネクタのタイプを 10Base2 (同軸ケーブル) に設定して しまうのです。 10BaseT になっていることを確認してください。 そうなっていなければカードを再設定してコンピュータを再起動してくださ い。
システムによってはリクエストの一部にホストの名前を含めなければ ならない場合があります。 dhcpcd でこれを行うには dhcpcd -h foohost とします。必要となるホスト名は、そのネットワークでのあ なたのアカウント名と一致することが多いでしょう。
多くの場合、ケーブルモデムは、ネットワークカードの Ethernet アドレスを 記憶してしまいます。その場合、新しいコンピュータを接続したり ネットワークカードを交換したときには何とかしてケーブルモデムに 新しいコンピュータとカードを教えてやらなければなりません。 通常はコンピュータの電源を入れたままモデムの電源を一度切って 入れ直せばいいはずです。だめな場合はテクニカルサポートに電話して、 コンピュータのネットワークカードを交換した旨を伝えてください。
ファイアウォールのルール (ipfwadm rule) によって、 DHCP が設定情報を流すポート 67/68 がふさがれているのかもしれません。 ファイアウォールのルールを注意して調べてください。
MediaOne は DHCP に付加すべきでない情報を加えてしまっています。 おそらくこれはもう問題ではないのでしょうが、うまくいかない場合は これらを確認してみてください。もし幸運 (不運?) にも同じマシンに Windows NT が載っている場合は、イベントビューアを起動すると 以下のような警告が出ているはずです。
DHCP received an unknown option 067 of length 005. The raw option data is given below. 0000: 62 61 73 69 63 basic |
訳注: 訳者は NT を使っていませんので、 日本語版のメッセージはわかりません(^_^;
これが原因だった場合は ftp://vanbuer.ddns.org/pub/ に行ってバイナリをダウンロードするか、 ソースを入手して入れ替えてください。
dhcpcd を使っても Linux で接続を確立できない場合は、 ISC dhclient を試してみるといいかもしれません。dhclient は、 ISC 由来の DHCP 配布 (クライアント・サーバ両方を同梱しています) に含まれます。 入手方法やコンパイル方法については ここを読んでください。 成功したら、この章に戻ってクライアントを設定してください。
Note: 次の情報は、dhclient の作者の一人、 Ted Lemon <mellon@isc.org> から寄せられました。
DHCP client の現在のバージョンでは、 dhclient.conf は必要ありません。 dhclient を、次のコマンドで起動するだけです。 /sbin/dhclient
このコマンドを実行すると、全てのブロードキャストインターフェースが設定されます。これでうまく動かなかったり、 特定のインターフェースだけを使いたいのなら、次のような設定を /etc/dhclient.conf に記述してください。
interface "eth0" { send dhcp-client-identifier 1:xx:xx:xx:xx:xx:xx; send dhcp-lease-time 86400; } |
この例では、イーサネットインターフェースは eth0 を使うものと仮定しています。 他のものを使うときは、記述もそれに合わせてください。 xx:xx:xx:xx:xx の部分も、お使いのイーサネットアドレスに合わせてください。 この dhclient.conf を使うと、Win 95 のクライアントの挙動に近いものになります。