[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:52080] ホスト名を安全に変更させるには



佐藤と申します。

同型のPC20台にlennyとWindows(XP)をインストールしようとしています。
一度インストールした環境をg4u(ghost4unix)でイメージングし、書き込むこ
とで対応させようとしています。


やりたいこと: テンプレートイメージに含まれていたホスト名を、そのマシン
              持つべきホスト名に(自動的に)置換させたい

本当は自動インストールでも使えばいいのでしょうが、Windows込みのためそ
うもいかないという事情があります。なにか妙案があれば教えていただきたい
です。

現状でやってることはというと、

* サンプルマシンを用意し、XPとlennyを入れる
* XPのプロダクトIDはVL版のため同一で使えることから、sysprepにてあらか
  じめ記入している
  * XPの場合、コンピュータ名はminiinst内で聞いてくるので、
    再起動後にそことEULAだけ確認させればOK
* lenny側はそのまま使うとssh(openssh-server)の鍵まで同一になるため、
  イメージング前に削除し、起動の際に再生成するように
  openss-server.postinstの該当部分を切り出してrc.d内に放りこむようにし
  てみてます
* eth0のMACアドレスは当然全員違うので、
  /etc/udev/rules.d/70-persistent-net.rulesファイルを空のファイルに置
  き換えておく(起動時に動いたudevで調整してくれるから)
* XP側のsysprep前と、サンプル機を落とす直前には、空き領域をゼロで埋め
  るようにしておく(こうすることでg4uのイメージを縮小化できる)
  # XP側は cipher /W:C:を使って途中でストップ
  
といったことをしています。

実際これでイメージングして、g4uで別端末に書き戻したマシンは正常に機能
しているように見えたのですが、lenny側のホスト名がテンプレートのままに
なっているということに気付きました。

強引に/etc以下にあるテンプレートホスト名のところをsedでも使ってかきか
えることは可能なんでしょうが、どこまでホスト名が入っているかというとこ
ろで不安が残ります。

ホスト名自体は、DHCPによる固定IPアドレスの逆引きから取得できる設定になっ
ているので、再起動後に

LC_ALL=C
LANG=C
export LC_ALL LANG
newhost=$(host $(/sbin/ifconfig |grep 10.0.0 | \
                 awk '{print $2}' | cut -d: -f2) | \
          awk '{print $5}' | sed -e 's;\.$;;')
shorthost=$(echo $newhost | cut -d. -f1)
domain=$(echo $newhost | cut -d. -f2-)

という具合に、かなりきたない処理ですが一応取得できてます(10.0.0は反則
な気もします)。

debconfの持つ設定ファイル(/var/cache/debconf/config.dat)内でホスト名の
ところをひたすら書き換えてから
 # dpkg-reconfigure -a -pcritical
とかすればそれなりに対応するものが書き換えられそうですが、全パッケージ
を調整してしまうため時間がかかってしまいます。

ちなみに作業は自動化できるように、/etc/sysprepディレクトリを作り、make
一発で一通りできるようにしてみてます。

--- Makefile
all: aptclean resetssh resetnet resethost diskclean

aptclean:
        aptitude clean

diskclean:
        # 各マウントポイントを検出し、未使用領域に巨大な0x00のみのファ
	イルを作成、最後に消しておく
        for part in $$(mount | grep ^/ | cut -d' ' -f3); do \
         pushd $$part && dd if=/dev/zero of=.largefile bs=4096k; \
         rm -f .largefile; popd; \
        done
        # スワップも同様に処理(処理後にmkswapしておく)
        for part in $$(grep '^/.* swap' /etc/fstab |\
                        cut -d' ' -f1); do \
         swapoff $$part && dd if=/dev/zero of=$$part bs=4096k; \
         mkswap $$part; \
        done

resetssh:
        # check-sshkey: sshの各鍵を再生成するスクリプト
        rm -vf /etc/ssh/*key*
        cp -vf check-sshkey /etc/init.d
        /usr/sbin/update-rc.d check-sshkey start 15 2 3 4 5 .

resetnet:
        # udev/rules.d/70-persistent-net.rulesを空にして
        # おいたファイルをコピーする(eth0→eth1になるのを予防)
        cp -vf 70-persistent-net.rules /etc/udev/rules.d

resethostname:
        # ToDo: ホスト名を各部変更したい
        # 再起動後に実施させるべきスクリプトを
        # 置いて、起動時にrc.d以下で実行させるよう
        # スケジューリングすること(see resetssh)


以上、妙案をお持ちの方よろしかったらご教示ください。
よろしくお願いいたします。

-- 
佐藤 大輔/densuke@xxxxxxx
follow me! -> http://twitter.com/densuke