ビルドや、リリース時の記事作成で使用するツール類を置いています。
リスト5.1: tools/make_os5_fs.sh
1: #!/bin/bash
2:
3: block_size=4096
4:
5: # make control block
6: echo $# | awk '{printf "%c", $1}'
7: dd if=/dev/zero count=$((block_size - 1)) bs=1
8:
9: # make data block(s)
10: while [ -n "$1" ]; do
11: # make header
12: name=$(basename $1)
13: echo -n $name
14: dd if=/dev/zero count=$((32 - ${#name})) bs=1
15: header_size=48
16: data_size=$(stat -c '%s' $1)
17: block_num=$((((header_size + data_size) / block_size) + 1))
18: echo $block_num | awk '{printf "%c", $1}'
19: dd if=/dev/zero count=15 bs=1
20:
21: # make data
22: dd if=$1
23: data_size_1st_block=$((block_size - header_size))
24: if [ $data_size -le $data_size_1st_block ]; then
25: dd if=/dev/zero count=$((data_size_1st_block - data_size)) bs=1
26: else
27: cnt=$((block_size - ((header_size + data_size) % block_size)))
28: dd if=/dev/zero count=$cnt bs=1
29: fi
30:
31: shift
32: done
ユーザーランドのファイルシステムを生成するシェルスクリプトです。ファイルシステム(kernel/fs.c)で説明した通りにファイルシステムを生成します。
リスト5.2: tools/cap.sh
1: #!/bin/sh
2:
3: work_dir=cap_$(date '+%Y%m%d%H%M%S')
4:
5: mkdir ${work_dir}
6:
7: qemu-system-i386 -fda fd.img &
8:
9: sleep 1
10: echo "convert -loop 0 -delay 15 ${work_dir}/cap_*.gif anime.gif"
11:
12: window_id=$(xwininfo -name QEMU | grep 'Window id' | cut -d' ' -f4)
13:
14: i=0
15: while :; do
16: import -window ${window_id} "${work_dir}/$(printf 'cap_%04d.gif' $i)"
17: i=$((i + 1))
18: sleep 0.1
19: done
ブログ記事に掲載しているGIFアニメを生成するシェルスクリプトです。
cap.shを実行するとQEMUが立ち上がり、cap_年月日時分秒という名前のディレクトリへ0.1秒毎にスクリーンショットを保存していきます。スクリプトの実行終了後、cap.sh実行時に表示されるconvertコマンドを実行することでGIFアニメ"anime.gif"を生成します。