[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