シンクライアントクローニングスクリプト for FreeBSD

外註さんに気の利いたスクリプトを作成できる技量が期待できるわけもなく。 FreeBSDで設計しているシンクライアントを、シンクライアントどうしで 自己増殖するのに作ったスクリプト。本当は g4u(Ghost for Unix)ためし たかったんだけど、テストする時間がないから適当にやってしまった。

IPアドレスの計算と、末尾の ed の連打は適当に変える必要あり。

mkcl

#!/bin/sh
d_dev=da0
d_room=204
d_bootdev=ad4
NET=172.19.5
HBASE=100
NETIF=fxp0

mydir=`dirname $0`
PROTO=$mydir/label

report() {
  echo $* 2>&1
}

while [ ! $done ]; do
  echo -n "Target device(default: $d_dev): "
  read dev
  DEV=${dev:-$d_dev}

  echo -n "New root device after reboot(default: ad4): "
  read bootdev
  BOOTDEV=${bootdev:-$d_bootdev}
  
  echo -n "Room num. of this host location(default: $d_room): "
  read room
  ROOM=${room:-$d_room}
  
  echo -n "Host's sequential number in the room: "
  read num
  NUM=${num:-0}
  echo -n "Are you happy with this choice(y/n)? "
  read ans
  case "$ans" in
    y|Y)	done=1 ;;
  esac
done

octet=`echo "50*($ROOM - $d_room) + $NUM + $HBASE" | bc -l`
echo octet=$octet
if [ $octet -gt 255 -o $octet -lt 10 ]; then
  echo "Calculated IP address $NET.$octet is invalid"
  exit 2
fi
IPAD=$NET.$octet
report Start cloning $IPAD on $DEV with partition prototype: $PROTO


report "Preparing partitions"
fdisk -B -f - $DEV<<_EOF_
p 1 165 63 8385867
a 1
_EOF_
# boot0cfg -B -b /boot/mbr -s 1 -t 10 ${DEV}
bsdlabel -R ${DEV}s1 $PROTO
bsdlabel -B ${DEV}s1

report "Formatting"
newfs -U /dev/${DEV}s1a
newfs -U /dev/${DEV}s1d

report "Copying"
trap 'umount /mnt/usr; umount /mnt; exit 1' INT TERM
mount /dev/${DEV}s1a /mnt && {
 report Copying / partition
 tar --one-file-system --exclude=./tmp -cf - -C / . | tar xpfC - /mnt 
 mkdir -m 1777 /mnt/tmp
} && \
mount /dev/${DEV}s1d /mnt/usr && {
 report Copying /usr partition
 tar --one-file-system -cf - -C / usr | tar xpfC - /mnt 
} && {
  report Rewrinting startup files
  ed /mnt/etc/rc.conf<<_EOF_
/^ifconfig_${NETIF}=.*
s//ifconfig_${NETIF}="inet $IPAD netmask 255.255.255.0"/
/^hostname=.*
s//hostname="${ROOM}-${NUM}.e.koeki-u.ac.jp"/
wq
_EOF_
  ed /mnt/etc/fstab<<_EOF_
g/dev\/ad.s1/s,,dev/${BOOTDEV}s1,
wq
_EOF_
  ed /mnt/home/ica/start-ica<<_EOF_
/204-01
s//${ROOM}-$NUM/
wq
_EOF_
}

umount /mnt/usr
umount /mnt
trap - INT TERM

labelファイルはこんなdisklabelを用意しておく。

label

# /dev/ad4s1:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:  2094411        0    4.2BSD     2048 16384 28552 
  b:  2097152  2094411      swap                    
  c:  8385489        0    unused        0     0         # "raw" part, don't edit
  d:  4193926  4191563    4.2BSD     2048 16384 28552 

FreeBSD splash screen

検索すればいくらでも出てくるけど。

ファイルは640x480で256色以下のBMPにするよろし。GIMPで作るなら、 640x480のキャンバスに作って、基本は bzip2 で保存しつつ、「よっしゃ」 となったら「可視レイヤの統合」→「画像モード・インデックス(255)」してか ら「別名保存」で「拡張子で判別」にした上で hoge.bmp で保存だ。 分かる人にゃ分かる。

ブートをシリアルコンソールのみにした場合(/boot.cfgに-h)でも ブート中にちゃんとsplash imageが出てくる。よしよし。

使い方の説明をここに書いとくといいね。画像に文字を書くとき GIMPのダイナミックテキスト便利ね。


叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]