[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:52123] Re: ホスト名を安全に変更させるには
佐藤です。
At Sat, 7 Mar 2009 01:06:05 +0900,
Kenshi Muto wrote:
> うーん、それでも/etc/以下を探してsedが良い気がします。
> 手元で調べた限りでは、Debianパッケージで動的な変化があるとすれば
> /etcか/varになると思いますが、ホスト名関連は/etcにしかない感じです。
>
> > debconfの持つ設定ファイル(/var/cache/debconf/config.dat)内でホスト名の
> > ところをひたすら書き換えてから
> > # dpkg-reconfigure -a -pcritical
> > とかすればそれなりに対応するものが書き換えられそうですが、全パッケージ
> > を調整してしまうため時間がかかってしまいます。
>
> debconfは設定管理ツールなので、設定データベースとして使おうとするのは
> abuseだ、だったはず。
> つまり、debconfの設定においては/etcなどから取得した値が使われるので、
> debconfファイルを書き換えて操作するというのはうまくいかない、or/and
> 誤った使い方 ということになりますね。
ありがとうございました。やはりこの方法がいいみたいですね。
少し悩みましたが、無事に生成できました。
イメージング前にやっておくことの一覧
* aptのキャッシュをきれいにしておく
* sshの鍵を再生成できるように準備しておく(openssh-server.postinstより)
* ホスト名を取得し、書き換える(今回の質問の部分)
* 事前に作成しておいたユーザのホームを再生成する(pam_mkhomedir.soが便利)
* udevが自動生成するネットワークのI/F情報をリセットしておく(eth0がeth1
になったりすることへの対策)
* 未使用領域をゼロで埋めておく(圧縮率向上の策)
以下のスクリプトでホスト名←→テンプレート名の変換を行わせています。
やってることがほとんど同じ(向きが違うだけ)なので、共通部をくくって別の
スクリプトにしたほうが効率いいのですが、そこまではやってません。
=================== ホスト名をテンプレートに戻すスクリプト
#!/bin/sh
THOST=<テンプレートマシンのホスト名>
TDOMAIN=<テンプレートマシンのドメイン名>
MYIP=$(LC_ALL=C LANG=C /sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
FQDN=$(LC_ALL=C LANG=C host -t ptr ${MYIP} | cut -d' ' -f5 | sed -e 's;\.$;;g')
HOST=$(echo $FQDN | cut -d. -f1) # ホスト名
DOMAIN=$(echo $FQDN | cut -d. -f2-) # ドメイン名
RCDIR=/etc/init.d
RCS=sethost
BACKUP=".backup_template"
echo <<EOM >/dev/stderr
***** NOW CHANGING HOSTNAME *****
Please wait a moment...
*******************************************
EOM
find /etc/ -type f |fgrep -v '/etc/sysprep' | \
xargs egrep -l "(${HOST}|${HOST}.${DOMAIN})" | tee /dev/stderr |\
xargs sed -e "s;${HOST}.${DOMAIN};${THOST}.${TDOMAIN};g" \
-e "s;${HOST};${THOST};g" -i
rm -vf $(find /var /etc -name "*${BACKUP}")
#/usr/sbin/update-rc.d -f sethost remove
#echo "rebooting..."
#sleep 5; /sbin/reboot
======================== テンプレートホスト名を固有のホストにする
#!/bin/sh
THOST=<テンプレートホスト名>
TDOMAIN=<テンプレートドメイン名>
while [ "x${MYIP}" = "x" ]; do
echo "getting my IP address..."
MYIP=$(LC_ALL=C LANG=C /sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | cut -d: -f2)
sleep 3 # DHCPのアップが間に合わず失敗することがあるのでループして対応
done
FQDN=$(LC_ALL=C LANG=C host -t ptr ${MYIP} | cut -d' ' -f5 | sed -e 's;\.$;;g')
HOST=$(echo $FQDN | cut -d. -f1)
DOMAIN=$(echo $FQDN | cut -d. -f2-)
RCDIR=/etc/init.d
RCS=sethost
BACKUP=".backup_template"
echo <<EOM >/dev/stderr
***** NOW CHANGING HOSTNAME *****
Please wait a moment...
After this machine restart automatically...
*******************************************
EOM
find /etc |fgrep -v '/etc/sysprep' | \
xargs egrep -l "(${THOST}|${THOST}.${TDOMAIN})" | tee /dev/stderr |\
xargs sed -e "s;${THOST}.${TDOMAIN};${HOST}.${DOMAIN};g" \
-e "s;${THOST};${HOST};g" -i${BACKUP}
#rm -vf $(find /var /etc -name "*${BACKUP}")
#find /var /etc -name "*${BACKUP}"
/usr/sbin/update-rc.d -f sethost remove
echo "rebooting..."
sleep 5; /sbin/reboot
汚いスクリプトで無駄に長くてすいません。
--
佐藤 大輔/densuke@xxxxxxx
follow me! -> http://twitter.com/densuke