RHEL6 インストール画面で固定 IP アドレスを設定すると、ifcfg-* には NETMASK の代わりに PREFIX という項目が記入される。名前から NETMASK の代替であることは分かるし、実際にそう動く。しかし、もし PREFIX と NETMASK の両方が設定され、その内容が矛盾していたらどうなるのか。
似た関係に NETMASK / NETWORK / BROADCAST があるが、これは公式ドキュメントに記載がある。
- BROADCAST=address
- where address is the broadcast address. This directive is deprecated, as the value is calculated automatically with ipcalc.
- NETMASK=mask
- where mask is the netmask value.
- NETWORK=address
- where address is the network address. This directive is deprecated, as the value is calculated automatically with ipcalc.
曰く、「NETWORK と BROADCAST は非推奨です」と。しかし、PREFIX については何処にも記述が見当たらない。試しに grep -i prefix /etc/sysconfig/network-scripts/* してみると、この辺りの処理を行っている場所は 1 か所しかない。
RHEL6.4: /etc/sysconfig/network-scripts/network-functions:
expand_config ()
{
local i=0 val
for idx in '' {0..255} ; do
ipaddr[$i]=$(eval echo '$'IPADDR$idx)
if [ -z "${ipaddr[$i]}" ]; then
[ "$idx" ] && [ $idx -gt 2 ] && break
continue
fi
prefix[$i]=$(eval echo '$'PREFIX$idx)
netmask[$i]=$(eval echo '$'NETMASK$idx)
broadcast[$i]=$(eval echo '$'BROADCAST$idx)
arpcheck[$i]=$(eval echo '$'ARPCHECK$idx)
if [ "${prefix[$i]}x" != "x" ]; then
val=$(/bin/ipcalc --netmask "${ipaddr[$i]}/${prefix[$i]}")
netmask[$i]=${val##NETMASK=}
fi
if [ "${netmask[$i]}x" = "x" ]; then
val=$(/bin/ipcalc --netmask "${ipaddr[$i]}")
netmask[$i]=${val##NETMASK=}
fi
if [ "${prefix[$i]}x" = "x" ]; then
val=$(/bin/ipcalc --prefix ${ipaddr[$i]} ${netmask[$i]})
prefix[$i]=${val##PREFIX=}
fi
if [ "${broadcast[$i]}x" = "x" ]; then
val=$(/bin/ipcalc --broadcast ${ipaddr[$i]} ${netmask[$i]})
broadcast[$i]=${val##BROADCAST=}
fi
if [ "${arpcheck[$i]}x" != "x" ]; then
arpcheck[$i]=${arpcheck[$i]##ARPCHECK=}
arpcheck[$i]=${arpcheck[$i],,*}
fi
i=$((i+1))
done
if [ -z "${NETWORK}" ]; then
eval $(/bin/ipcalc --network ${ipaddr[0]} ${netmask[0]})
fi
}
これによると、
- PREFIX が設定されていれば、PREFIX から NETMASK が計算される。
- NETMASK が未設定(空)であれば、IPADDR から NETMASK が計算(推測)される。
- PREFIX が未設定(空)であれば、IPADDR / NETMASK から PREFIX が計算される。
つまり、PREFIX は NETMASK より強い。ついでに言うと、公式ドキュメント通り BROADCAST と NETWORK はどちらも IPADDR / NETMASK から自動計算されるが、それは値が未設定(空)である場合に限られる。
念のため RHEL5 でも確認しておくと、
RHEL5.9: /etc/sysconfig/network-scripts/network-functions:
expand_config ()
{
if [ -z "${NETMASK}" ]; then
eval `/bin/ipcalc --netmask ${IPADDR}`
fi
if [ -z "${PREFIX}" ]; then
eval `/bin/ipcalc --prefix ${IPADDR} ${NETMASK}`
fi
if [ -z "${BROADCAST}" ]; then
eval `/bin/ipcalc --broadcast ${IPADDR} ${NETMASK}`
fi
if [ -z "${NETWORK}" ]; then
eval `/bin/ipcalc --network ${IPADDR} ${NETMASK}`
fi
}
- NETMASK が未設定(空)であれば、IPADDR から NETMASK が計算(推測)される。
- PREFIX が未設定(空)であれば、IPADDR / NETMASK から PREFIX が計算される。
これだけではどちらが強いのか分からないが、合わせて expand_config の呼び出し元(/etc/sysconfig/network-scripts/ifup-eth)を見ると、実際に使われるのは PREFIX の方だと分かる。
よって RHEL5 でも、PREFIX は NETMASK より強い。RHEL4 以前は使ってないので知らない。
そもそも何故こんなことを気にするかというと、現在の Webmin (1.620)が PREFIX に対応してないっぽいから。Webmin は NETMASK を設定するが、PREFIX には一切関与しない(消しもしない)。よって PREFIX と NETMASK の両方が ifcfg-* に記述される状況が生まれてしまう。もし Webmin でネットワーク設定を行うなら、事前に全ての PREFIX を NETMASK に変換しておいた方が良い。でないと、いつか痛い目を見る可能性がある。
2014-06-19 追記
今更だが、Webmin 1.630 にて PREFIX 対応が行われた。
0 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。