この章では、ファイルとそれらのファイルを使用するコマンドとの関係について説明します 。コマンドの使用方法については説明していません。
この章では、次の内容について説明します。
次の表に、ネットワーク上で DHCP を管理する際に役立つコマンドを示します。
表 12–1 DHCP で使用されるコマンド
dhcpconfig、dhtadm、pntadm コマンドは、スクリプト中での使用に適しています。 特に、pntadm コマンドは大量の IP アドレスエントリを DHCP ネットワークテーブルに作成するときに便利です。次のサンプルスクリプトでは、バッチモードで pntadm を使って、IP アドレスを作成しています。
#! /usr/bin/ksh
#
# This script utilizes the pntadm batch facility to add client entries
# to a DHCP network table. It assumes that the user has the rights to
# run pntadm to add entries to DHCP network tables.
#
# Based on the nsswitch setting, query the netmasks table for a netmask.
# Accepts one argument, a dotted IP address.
#
get_netmask()
{
MTMP=`getent netmasks ${1} | awk '{ print $2 }'`
if [ ! -z "${MTMP}" ]
then
print - ${MTMP}
fi
}
#
# Based on the network specification, determine whether or not network is
# subnetted or supernetted.
# Given a dotted IP network number, convert it to the default class
# network.(used to detect subnetting). Requires one argument, the
# network number. (e.g. 10.0.0.0) Echos the default network and default
# mask for success, null if error.
#
get_default_class()
{
NN01=${1%%.*}
tmp=${1#*.}
NN02=${tmp%%.*}
tmp=${tmp#*.}
NN03=${tmp%%.*}
tmp=${tmp#*.}
NN04=${tmp%%.*}
RETNET=""
RETMASK=""
typeset -i16 ONE=10#${1%%.*}
typeset -i10 X=$((${ONE}&16#f0))
if [ ${X} -eq 224 ]
then
# Multicast
typeset -i10 TMP=$((${ONE}&16#f0))
RETNET="${TMP}.0.0.0"
RETMASK="240.0.0.0"
fi
typeset -i10 X=$((${ONE}&16#80))
if [ -z "${RETNET}" -a ${X} -eq 0 ]
then
# Class A
RETNET="${NN01}.0.0.0"
RETMASK="255.0.0.0"
fi
typeset -i10 X=$((${ONE}&16#c0))
if [ -z "${RETNET}" -a ${X} -eq 128 ]
then
# Class B
RETNET="${NN01}.${NN02}.0.0"
RETMASK="255.255.0.0"
fi
typeset -i10 X=$((${ONE}&16#e0))
if [ -z "${RETNET}" -a ${X} -eq 192 ]
then
# Class C
RETNET="${NN01}.${NN02}.${NN03}.0"
RETMASK="255.255.255.0"
fi
print - ${RETNET} ${RETMASK}
unset NNO1 NNO2 NNO3 NNO4 RETNET RETMASK X ONE
}
#
# Given a dotted form of an IP address, convert it to its hex equivalent.
#
convert_dotted_to_hex()
{
typeset -i10 one=${1%%.*}
typeset -i16 one=${one}
typeset -Z2 one=${one}
tmp=${1#*.}
typeset -i10 two=${tmp%%.*}
typeset -i16 two=${two}
typeset -Z2 two=${two}
tmp=${tmp#*.}
typeset -i10 three=${tmp%%.*}
typeset -i16 three=${three}
typeset -Z2 three=${three}
tmp=${tmp#*.}
typeset -i10 four=${tmp%%.*}
typeset -i16 four=${four}
typeset -Z2 four=${four}
hex=`print - ${one}${two}${three}${four} | sed -e 's/#/0/g'`
print - 16#${hex}
unset one two three four tmp
}
#
# Generate an IP address given the network address, mask, increment.
#
get_addr()
{
typeset -i16 net=`convert_dotted_to_hex ${1}`
typeset -i16 mask=`convert_dotted_to_hex ${2}`
typeset -i16 incr=10#${3}
# Maximum legal value - invert the mask, add to net.
typeset -i16 mhosts=~${mask}
typeset -i16 maxnet=${net}+${mhosts}
# Add the incr value.
let net=${net}+${incr}
if [ $((${net} < ${maxnet})) -eq 1 ]
then
typeset -i16 a=${net}\&16#ff000000
typeset -i10 a="${a}>>24"
typeset -i16 b=${net}\&16#ff0000
typeset -i10 b="${b}>>16"
typeset -i16 c=${net}\&16#ff00
typeset -i10 c="${c}>>8"
typeset -i10 d=${net}\&16#ff
print - "${a}.${b}.${c}.${d}"
fi
unset net mask incr mhosts maxnet a b c d
}
# Given a network address and client address, return the index.
client_index()
{
typeset -i NNO1=${1%%.*}
tmp=${1#*.}
typeset -i NNO2=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO3=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO4=${tmp%%.*}
typeset -i16 NNF1
let NNF1=${NNO1}
typeset -i16 NNF2
let NNF2=${NNO2}
typeset -i16 NNF3
let NNF3=${NNO3}
typeset -i16 NNF4
let NNF4=${NNO4}
typeset +i16 NNF1
typeset +i16 NNF2
typeset +i16 NNF3
typeset +i16 NNF4
NNF1=${NNF1#16\#}
NNF2=${NNF2#16\#}
NNF3=${NNF3#16\#}
NNF4=${NNF4#16\#}
if [ ${#NNF1} -eq 1 ]
then
NNF1="0${NNF1}"
fi
if [ ${#NNF2} -eq 1 ]
then
NNF2="0${NNF2}"
fi
if [ ${#NNF3} -eq 1 ]
then
NNF3="0${NNF3}"
fi
if [ ${#NNF4} -eq 1 ]
then
NNF4="0${NNF4}"
fi
typeset -i16 NN
let NN=16#${NNF1}${NNF2}${NNF3}${NNF4}
unset NNF1 NNF2 NNF3 NNF4
typeset -i NNO1=${2%%.*}
tmp=${2#*.}
typeset -i NNO2=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO3=${tmp%%.*}
tmp=${tmp#*.}
typeset -i NNO4=${tmp%%.*}
typeset -i16 NNF1
let NNF1=${NNO1}
typeset -i16 NNF2
let NNF2=${NNO2}
typeset -i16 NNF3
let NNF3=${NNO3}
typeset -i16 NNF4
let NNF4=${NNO4}
typeset +i16 NNF1
typeset +i16 NNF2
typeset +i16 NNF3
typeset +i16 NNF4
NNF1=${NNF1#16\#}
NNF2=${NNF2#16\#}
NNF3=${NNF3#16\#}
NNF4=${NNF4#16\#}
if [ ${#NNF1} -eq 1 ]
then
NNF1="0${NNF1}"
fi
if [ ${#NNF2} -eq 1 ]
then
NNF2="0${NNF2}"
fi
if [ ${#NNF3} -eq 1 ]
then
NNF3="0${NNF3}"
fi
if [ ${#NNF4} -eq 1 ]
then
NNF4="0${NNF4}"
fi
typeset -i16 NC
let NC=16#${NNF1}${NNF2}${NNF3}${NNF4}
typeset -i10 ANS
let ANS=${NC}-${NN}
print - $ANS
}
#
# Check usage.
#
if [ "$#" != 3 ]
then
print "This script is used to add client entries to a DHCP network"
print "table by utilizing the pntadm batch facilty.\n"
print "usage: $0 network start_ip entries\n"
print "where: network is the IP address of the network"
print " start_ip is the starting IP address \n"
print " entries is the number of the entries to add\n"
print "example: $0 10.148.174.0 10.148.174.1 254\n"
return
fi
#
# Use input arguments to set script variables.
#
NETWORK=$1
START_IP=$2
typeset -i STRTNUM=`client_index ${NETWORK} ${START_IP}`
let ENDNUM=${STRTNUM}+$3
let ENTRYNUM=${STRTNUM}
BATCHFILE=/tmp/batchfile.$$
MACRO=`uname -n`
#
# Check if mask in netmasks table. First try
# for network address as given, in case VLSM
# is in use.
#
NETMASK=`get_netmask ${NETWORK}`
if [ -z "${NETMASK}" ]
then
get_default_class ${NETWORK} | read DEFNET DEFMASK
# use the default.
if [ "${DEFNET}" != "${NETWORK}" ]
then
# likely subnetted/supernetted.
print - "\n\n###\tWarning\t###\n"
print - "Network ${NETWORK} is netmasked, but no entry was found \n
in the 'netmasks' table; please update the 'netmasks' \n
table in the appropriate nameservice before continuing. \n
(See /etc/nsswitch.conf.) \n">&2
return 1
else
# use the default.
NETMASK="${DEFMASK}"
fi
fi
#
# Create a batch file.
#
print -n "Creating batch file "
while [ ${ENTRYNUM} -lt ${ENDNUM} ]
do
if [ $((${ENTRYNUM}-${STRTNUM}))%50 -eq 0 ]
then
print -n "."
fi
CLIENTIP=`get_addr ${NETWORK} ${NETMASK} ${ENTRYNUM}`
print "pntadm -A ${CLIENTIP} -m ${MACRO} ${NETWORK}">> ${BATCHFILE}
let ENTRYNUM=${ENTRYNUM}+1
done
print " done.\n"
#
# Run pntadm in batch mode and redirect output to a temporary file.
# Progress can be monitored by using the output file.
#
print "Batch processing output redirected to ${BATCHFILE}"
print "Batch processing started."
pntadm -B ${BATCHFILE} -v> /tmp/batch.out 2>&1
print "Batch processing completed."
|
表 12–2 に、Solaris DHCP に関連するファイルを示します。
表 12–2 DHCP デーモンや DHCP コマンドで使用されるファイル|
ファイル/テーブル |
説明 |
|---|---|
|
dhcptab |
オプションとその値の組み合わせからなる DHCP 構成情報のテーブルを表す総称的な用語。構成情報はさらにマクロとしてグループ化される。 dhcptab テーブルの名前と位置は、DHCP 情報の格納にどのデータストアを使用するかによって異なる |
|
DHCP ネットワークテーブル |
IP アドレスをクライアント ID と構成オプションに割り当てる。DHCP ネットワークテーブルの名前は、10.21.32.0 など、ネットワークの IP アドレスに基づいて付けられる。dhcp_network というファイルはありません。DHCP ネットワークテーブルの名前と位置は、DHCP 情報の格納にどのデータストアを使用するかによって異なる |
|
dhcpsvc.conf |
DHCP デーモンの起動オプションと、dhcptab テーブルおよびネットワークテーブルのデータストアリソースおよび場所を格納している。 このファイルは /etc/inet ディレクトリにある |
|
nsswitch.conf |
ネームサービスデータベースの場所と、それらのデータベースをどのような順序で検索してさまざまな情報を入手するかを指定する。nsswitch.conf ファイルは、DHCP サーバーを構成する際に正確な構成情報を入手するために使用される。このファイルは、/etc ディレクトリに存在する |
|
resolv.conf |
DNS リゾルバによって使用される情報が入っている。DHCP サーバーの構成中に、このファイルで、DNS ドメインと DNS サーバーに関する情報が調べられる。このファイルは、/etc ディレクトリに存在する |
| dhcp.interface |
ファイル名 (dhcp.qe0 など) で指定されたクライアントのネットワークインタフェースで DHCP が使用されることを示す。dhcp.interface ファイルには、そのクライアント上で DHCP を起動するための ifconfig interface dhcp start option コマンドにオプションとして渡されるコマンドが含まれていることがある。このファイルは、Solaris DHCP クライアントシステムの /etc ディレクトリにある |
|
interface.dhc |
DHCP から得られた特定のネットワークインタフェースの構成パラメータが入っている。インタフェースの IP アドレスのリースがドロップされると、このクライアントは、/etc/dhcp/interface.dhc にある現在の設定情報をキャッシュする。DHCP が次にこのインタフェースで起動するときに、リースの有効期限内であれば、このクライアントはキャッシュされた情報を使用するように要求する。DHCP サーバーがこの要求を拒否すると、クライアントは標準 DHCP リースネゴシエーション手順を開始する |
|
dhcpagent |
dhcpagent クライアントデーモンのパラメータ値を設定する。このファイルへのパスは /etc/default/dhcpagent。 パラメータの詳細については、このファイル自体、または dhcpagent(1M) のマニュアルページを参照 |
|
DHCP inittab |
データタイプなど、DHCP オプションコードのさまざまな要素を定義するとともに、ニーモニックラベルを割り当てる。ファイル構文については、dhcp_inittab のマニュアルページを参照する クライアント側では、dhcpinfo が /etc/dhcp/inittab ファイル中の情報を人が判読可能な情報として提供する。このファイルは、/etc/dhcp/dhcptags ファイルに代わる。この変更については、DHCP のオプション を参照する。DHCP サーバーシステムでは、DHCP デーモンと管理ツールがこのファイルから DHCP オプション情報を入手する |
従来、DHCP のオプション情報は、サーバーの dhcptab テーブルやクライアントの dhcptags ファイル、それに in.dhcpd や snoop、dhcpinfo、dhcpmgr の内部テーブルなど、Solaris DHCP の複数の場所に格納されてきました。 そのため、Solaris 8 から DHCP 製品には、オプション情報を統合するために /etc/dhcp/inittab ファイルが導入されています。このファイルについての詳細は、dhcp_inittab のマニュアルページを参照してください。
Solaris DHCP クライアントでは、dhcptags ファイルの代わりに DHCP inittab ファイルを使って、DHCP パケットで受信するオプションコードの情報を入手します。DHCP サーバーの in.dhcpd、snoop、dhcpmgr プログラムでもこの inittab ファイルを使用します。
Solaris DHCP を使用するほとんどのサイトでは、この変更による影響はありません。この影響があるのは、Solaris 8 以降へのアップグレードを計画している場合で、かつ新しい DHCP オプションを以前に作成し、/etc/dhcp/dhcptags ファイルを変更済みで、この変更を保持したい場合だけです。アップグレードを行うと、dhcptags ファイルが変更されたために DHCP inittab ファイルを変更する必要があることを示すメッセージがアップグレードログに書き込まれます。
inittab ファイルには dhcptags ファイルよりも多くの情報が含まれ、その構文も異なります。
dhcptags のエントリの例は次の通りです。
33 StaticRt - IPList Static_Routes
33 は DHCP パケットで渡される数値コードです。StaticRt はオプション名であり、IPList は期待されるデータが IP アドレスのリストであることを示しています。Static_Routes はこのオプションを説明する名前です。
inittab ファイルは、これらのオプションを 1 行で表した複数のレコードから構成されています。形式は、dhcptab のシンボルを定義する形式と似ています。 次の表に、inittab の構文について説明します。
表 12–3 DHCP inittab ファイルの構文
inittab のエントリの例は、次の通りです。
StaticRt Standard, 33, IP, 2, 0, sdmi
このエントリは、StaticRt という名前のオプションを記述しています。このオプションは、Standard カテゴリにあり、オプションコード 33 です。データ型が IP、データ単位数が 2 個、指定可能な値の数が無限大 (0) であるため、無限個の IP アドレスの組を指定できることになります。このオプションを利用するのは sdmi: snoop、in.dhcpd、 dhcpmgr、dhcpinfo です。
以前にエントリを dhcptags ファイルに追加している場合は、新しい inittab ファイルに対応するエントリを追加する必要があります。次の例では、dhcptags エントリの例を inittab フォーマットで表す方法を示しています。
ネットワークに接続されたファックスについて、次の dhcptags エントリを追加したと想定してください。
128 FaxMchn - IP Fax_Machine
コード 128 は、サイトカテゴリになければならないことを意味しており、オプション名は FaxMchn、データタイプは IP です。
対応する inittab エントリは次の通りです。
FaxMchn SITE, 128, IP, 1, 1, sdmi
データ単位数が 1、指定可能な値の数が 1 なので、このオプションには 1 つの IP アドレスを指定することを表しています。