FreeSIBE のサイトに繋がらない2009年01月23日 06時06分06秒

ここ数日の間、暫く触っていなかった FreeSIBE がどうなっていたかを見たかったので http://www.freesbie.org/ にアクセスしている。しかし、どうもサイトが止まっているみたいだ。Seamonkey が Network Timeout で失敗する。

ダウンロードの URL は http://www.rrr.de/~riggs/freesbie/ からなので、入手は可能だ。しかし、どうなっているのだろう。

Elimination of pkg_create for the second time on FreeSBIE2008年02月27日 23時04分31秒

FreeSBIE requires lots of disk I/O, first of all. Using tmpfs will help a lot but there are other slow part to it.

Indeed, it is rare that one can create a desirable result with only a single trial. I always run FreeSBIE more than several time to create a final satificing image. For each time, FreeSBIE keeps creating same packages. That is quite waistful of time.

The following patch is to solve that problem. When PKGPATH is supplied to locate where generated .tgz format packages are stored, it will pick up one if exists; otherwise, it creates a new one.


diff -urN conf/freesbie.defaults.conf conf/freesbie.defaults.conf
--- conf/freesbie.defaults.conf 2006-01-04 18:23:10.000000000 -0500
+++ conf/freesbie.defaults.conf 2006-03-28 01:30:09.000000000 -0500
@@ -41,6 +41,9 @@
 # Path of the built image, use absolute path
 IMGPATH=${IMGPATH:-"/usr/obj/FreeSBIE.img"}

+# Path of the pkg , use absolute path
+PKGPATH=${PKGPATH:-"/usr/obj/freesbie-pkgs"}
+
 # Default parameters for the image, use diskinfo(1) to obtain yours
 SECTS=${SECTS:-501760} # Total number of sectors
 SECTT=${SECTT:-32}     # Sectors/track
diff -urN scripts/pkginstall.sh scripts/pkginstall.sh
--- scripts/pkginstall.sh       2005-12-28 10:15:18.000000000 -0500
+++ scripts/pkginstall.sh       2007-08-30 21:01:56.000000000 -0400
@@ -144,6 +144,12 @@
     echo "Copying ${totpkg} packages"
     cd ${CHROOTWD}
     set +e
+    if [ -n "${PKGPATH:-}" ]; then
+       mkdir -p ${PKGPATH}
+       pkgsuffix="tgz"
+    else
+       pkgsuffix="tar"
+    fi
     echo -n "[0"
     count=1
     while read pkg; do
@@ -154,14 +160,25 @@
            echo -n "."
        fi
        count=$((${count} + 1))
+       pkgfile=${pkg}.${pkgsuffix}

-       echo "Running pkg_create -b ${pkg} ${CHROOTWD}/${pkg}.tar" >> ${LOGFILE}
-       pkg_create -b ${pkg} ${CHROOTWD}/${pkg}.tar >> ${LOGFILE} 2>&1
+       if [ -n "${PKGPATH:-}" ]; then
+           if [ ! -f "${PKGPATH}/${pkgfile}" ]; then
+               echo "Running pkg_create -b ${pkg} ${PKGPATH}/${pkgfile}" >> ${LOGFILE}
+               pkg_create -b ${pkg} ${PKGPATH}/${pkgfile} >> ${LOGFILE} 2>&1
+           fi
+           echo "Hard Link ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile}" >> ${LOGFILE}
+           (ln ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile} || \
+           cp ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile} ) >> ${LOGFILE} 2>&1
+       else
+           echo "Running pkg_create -b ${pkg} ${CHROOTWD}/${pkgfile}" >> ${LOGFILE}
+           pkg_create -b ${pkg} ${CHROOTWD}/${pkgfile} >> ${LOGFILE} 2>&1
+       fi

-       echo "Running $pkgaddcmd ${chrootpkgpath}/${pkg}.tar" >> ${LOGFILE}
-       $pkgaddcmd ${chrootpkgpath}/${pkg}.tar >> ${LOGFILE} 2>&1
+       echo "Running $pkgaddcmd ${chrootpkgpath}/${pkgfile}" >> ${LOGFILE}
+       $pkgaddcmd ${chrootpkgpath}/${pkgfile} >> ${LOGFILE} 2>&1

-       rm ${CHROOTWD}/${pkg}.tar
+       rm ${CHROOTWD}/${pkgfile}

     done < $pkgfile
     echo "]"

This patch also modifies FreeSBIE not to compress packages if PKGPATH is not specified. That is it create .tar packages. Because these packages will be deleted almost immediately, it is not much worth compressing them at cost of compressions. There are few circumstances where .tgz is better than .tar package. The optimization is for majorities.

The following is how to add the patch to the port system. Once you copy the file, you have to do "make install".


# fetch http://www.ne.jp/asahi/export/uyota/patches/freesbie2-patch-pkg_create
# mv freesbie2-patch-pkg_create /usr/ports/sysutils/freesbie/files/patch-pkg_create

pkg_create を効率化2007年09月14日 12時24分48秒

FreeSBIE はその主な処理で、大量の IO を発生するので遅い。以前のパッチを使ったり、tmpfs を使えば、随分と早くなるが、まだまだ、改善の余地は沢山ある。

今回は、pkg_create をキャッシュすることによって、二度目以降に何度も作り直すのを回避することによって、高速化を図っている。PKGPATH を指定することによって、パッケージを保存する場所を指定すると、既に作られているパッケージはそこから取ってくる。


diff -urN conf/freesbie.defaults.conf conf/freesbie.defaults.conf
--- conf/freesbie.defaults.conf 2006-01-04 18:23:10.000000000 -0500
+++ conf/freesbie.defaults.conf 2006-03-28 01:30:09.000000000 -0500
@@ -41,6 +41,9 @@
 # Path of the built image, use absolute path
 IMGPATH=${IMGPATH:-"/usr/obj/FreeSBIE.img"}

+# Path of the pkg , use absolute path
+PKGPATH=${PKGPATH:-"/usr/obj/freesbie-pkgs"}
+
 # Default parameters for the image, use diskinfo(1) to obtain yours
 SECTS=${SECTS:-501760} # Total number of sectors
 SECTT=${SECTT:-32}     # Sectors/track
diff -urN scripts/pkginstall.sh scripts/pkginstall.sh
--- scripts/pkginstall.sh       2005-12-28 10:15:18.000000000 -0500
+++ scripts/pkginstall.sh       2007-08-30 21:01:56.000000000 -0400
@@ -144,6 +144,12 @@
     echo "Copying ${totpkg} packages"
     cd ${CHROOTWD}
     set +e
+    if [ -n "${PKGPATH:-}" ]; then
+       mkdir -p ${PKGPATH}
+       pkgsuffix="tgz"
+    else
+       pkgsuffix="tar"
+    fi
     echo -n "[0"
     count=1
     while read pkg; do
@@ -154,14 +160,25 @@
            echo -n "."
        fi
        count=$((${count} + 1))
+       pkgfile=${pkg}.${pkgsuffix}

-       echo "Running pkg_create -b ${pkg} ${CHROOTWD}/${pkg}.tar" >> ${LOGFILE}
-       pkg_create -b ${pkg} ${CHROOTWD}/${pkg}.tar >> ${LOGFILE} 2>&1
+       if [ -n "${PKGPATH:-}" ]; then
+           if [ ! -f "${PKGPATH}/${pkgfile}" ]; then
+               echo "Running pkg_create -b ${pkg} ${PKGPATH}/${pkgfile}" >> ${LOGFILE}
+               pkg_create -b ${pkg} ${PKGPATH}/${pkgfile} >> ${LOGFILE} 2>&1
+           fi
+           echo "Hard Link ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile}" >> ${LOGFILE}
+           (ln ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile} || \
+           cp ${PKGPATH}/${pkgfile} ${CHROOTWD}/${pkgfile} ) >> ${LOGFILE} 2>&1
+       else
+           echo "Running pkg_create -b ${pkg} ${CHROOTWD}/${pkgfile}" >> ${LOGFILE}
+           pkg_create -b ${pkg} ${CHROOTWD}/${pkgfile} >> ${LOGFILE} 2>&1
+       fi

-       echo "Running $pkgaddcmd ${chrootpkgpath}/${pkg}.tar" >> ${LOGFILE}
-       $pkgaddcmd ${chrootpkgpath}/${pkg}.tar >> ${LOGFILE} 2>&1
+       echo "Running $pkgaddcmd ${chrootpkgpath}/${pkgfile}" >> ${LOGFILE}
+       $pkgaddcmd ${chrootpkgpath}/${pkgfile} >> ${LOGFILE} 2>&1

-       rm ${CHROOTWD}/${pkg}.tar
+       rm ${CHROOTWD}/${pkgfile}

     done < $pkgfile
     echo "]"

ほとんどの場合、一度だけ FreeSBIE を動かして、ISO イメージを作り追えることはない。何度か繰り返して、最終版を作るので、何度もパッケージを作り直しても、無駄なだけだ。

このパッチを ports に入れる方法。パッチ自体は一年以上前に作っていたので、バージョン 2 であれば、新しいバージョンでも、古いバージョンのでも動く。


# fetch http://www.ne.jp/asahi/export/uyota/patches/freesbie2-patch-pkg_create
# mv freesbie2-patch-pkg_create /usr/ports/sysutils/freesbie/files/patch-pkg_create

FreeSBIE で必要な容量2007年09月04日 10時14分03秒

FreeSBIE で CD を焼くのに、イメージファイルを作る。package を入れると、それなりの容量が必要になってくるので、その目安として。

FreeSBIE は installworld と installkernel を行なうので、ソースと生成物を置く容量が必要となる。手元では src に 600MB、obj に1.3 GB ほど取られている。もし、一回コンパイルして、二度と変更しないのなら、mkuzip で固めると、80% ぐらいの容量を節約できると思う。

FreeSBIE は CD-ROM を作るのに二つのディレクトリを作る。freesbie-fs と freesbie-clone が作られる。fs の方に、一度全てをインストールしてから、更に CD イメージ生成用に clone にファイルを複製するので、やり方によってはかなりの容量を必要とする。

GEOM_UZIP を使わないと、CD の容量分までしか書き込めない。そのため、freesbie-fs の最大は 700MB となる。freesbie-clone は cpio を使って、ハードリンクを試みるように書かれている。そして、忘れてはならない、CD イメージに同じく、700MB 必要となる。そのため、(1)freesbie-fs と freesbie-clone が同一デバイス上にあると、 合計 1.4GB 分必要になる。(2) もし、異なったデバイス上にあると、2.1GB 分必要になる。

GEOM_UZIP を使っていると、更にディスクを消費する。経験上 /usr は、ほぼ四分の一の大きさまでに圧縮される。また、ほとんどのファイルは /usr 以下に収まる。つまり、700 MB の CD に 3GB に近いファイルが収まる計算になる。これが、freesbie-fs に必要な大きさとなる。その後、freesbie-clone が生成されるが、mkuzip を動かすために、usr の部分に mdconfig でファイルデバイスが割り当てられる。つまり、ここの分はほぼ全部コピーされることになる。その後、生成される uzip ファイルも freesbie-clone 内に配置されるので、必要な量は GEOM_UZIP を使うと一気に増える。(3)GEOM_UZIP を使うと、CD イメージに 700MB。freesbie-fs に約 2.8GB。freesbie-clone/usr に更に、約 2.8GB。/usr を圧縮したファイルが、約 700 MB。合計、最大で 7GB 近い容量が必要となる。作る CD イメージの約十倍近い容量が必要との見方もできるだろう。ただ、この数字はあくまで概算なので、過信しないでほしい。

最近は、ハードディスクも大容量化しているので、ディスクを使うのであれば、問題にはならないだろう。しかし、tmpfs を使うと話が変わる。tmpfs はせいぜい GB 単位しか作れないので、CD にどれだけ詰め込むかによって、tmpfs を使うべきか見極める必要がある。

FreeSBIE 20070710 版に更新2007年09月02日 13時09分32秒

FreeSBIE を 20060202 版から 20070710 版に更新。ports を通して上げた。

上げてみた理由は、7-CURRENT で使おうと思ったら、旧版では動かなかったから。新版では動くかも知れないと期待して上げた。しかし、結果はダメだった。動かない。

正確に言うと、カーネルのコンフィグレーションファイルFREESBIE を書き直さないと動かない。確かに動くには動くのだが、どの設定が FreeSBIE 固有なのだかわからず、手間が掛かる。取り合えず適当にでっちあげた。

20070710 版で最初に気が付いたのは .tmp と .done ファイルを作る場所。個人的には昔の方が便利だった。大体、一度で終わることが無いので、/usr/local/share/freesbie の方が、削除しやすい。

他には、パッチ(日本語版)が適応されていたので、動作は大変早くなっているようだ。

バグもあるし、改善が必要なところも結構多い。

FreeSBIE が起動しない事がある2007年09月01日 13時53分32秒

新品の laptop に 20060202 版の FreeSBIE を使って、 起動しようとすると「failed to create swap_zone.」と出て、起動しない。

なぜだか、わからないが、外付けのハードディスクを繋げておくと起動した。この外付けには NTFS、FAT、と UFS2 のスライスがあり、スワップ用の b パーティションも用意されていた。

古い、既に FreeBSD がインストールされている laptop では問題なく、この FreeSBIE の CD が起動する。FreeBSD のインストールディスクは新しい laptop でも問題なく起動する。

となると、FreeSBIE の問題か、FreeSBIE を作った環境の問題か。

sysutils/freesbie: 四十万倍の高速化 対 二倍の高速化2006年05月07日 11時00分48秒

以前にも紹介したが、FreeSBIE 2は既存のシステムを有効に利用している。Makefile と少しのスクリプトを組み合わせることで、柔軟なシステムをつくっている。

まあ、それでも改良の余地はある。img.sh とclonefs.sh は md-device を作るために、dd を使う。実は、seek を使うことにより、余計なディスクへの書き込みを減らすことが出来る。UFS は sparse file を実装しているので、途中は一気にスッ飛ばして、最後のブロックを書き込めばいい。


diff -urN freesbie2.org/scripts/clonefs.sh freesbie2/scripts/clonefs.sh
--- freesbie2.org/scripts/clonefs.sh    Tue Jan 10 18:30:07 2006
+++ freesbie2/scripts/clonefs.sh        Thu May  4 02:28:41 2006
@@ -35,7 +35,7 @@
     # Find the total dir size and initialize the vnode
     DIRSIZE=$(($(du -kd 0 | cut -f 1)))
     FSSIZE=$(($DIRSIZE + ($DIRSIZE/5)))
-    dd if=/dev/zero of=${UFSFILE} bs=1k count=${FSSIZE} >> ${LOGFILE} 2>&1
+    dd if=/dev/zero of=${UFSFILE} bs=1k count=1 seek=$((${FSSIZE} - 1)) >> ${LOGFILE} 2>&1

     DEVICE=/dev/$(mdconfig -a -t vnode -f ${UFSFILE})
     newfs -o space ${DEVICE} >> ${LOGFILE} 2>&1
diff -urN freesbie2.org/scripts/img.sh freesbie2/scripts/img.sh
--- freesbie2.org/scripts/img.sh        Wed Nov 16 19:21:42 2005
+++ freesbie2/scripts/img.sh    Thu May  4 02:31:41 2006
@@ -33,7 +33,7 @@
 SECTS=$((${CYLINDERS} * ${CYLSIZE}))

 echo "Initializing image..."
-dd if=/dev/zero of=${IMGPATH} count=${SECTS} >> ${LOGFILE} 2>&1
+dd if=/dev/zero of=${IMGPATH} count=1 seek=$((${SECTS} - 1)) >> ${LOGFILE} 2>&1

 # Attach the md device
 DEVICE=`mdconfig -a -t vnode -f ${IMGPATH} -x ${SECTT} -y ${HEADS}`

img.sh の dd は 200MB のファイルを作る。bs は 512 バイトなので、四十万分の一の書き込みでいい。初動時間などを無視するとざっと四十万倍の高速化である。なお clonefs.sh が作るファイルの大きさは、各々によって違うが、同じような大きさのファイルは必要だ。

今回のパッチには入れてないが、dd の前に、rm -rf でファイルを消しておいた方がいい。小さいファイルであったら、大した問題ではないのだが、dd で作る予定よりも大きい時は、問題になる。小さい分には newfs で、どうせ綺麗さっぱり初期化されるので構わないが、大きいと、予定よりも大きいファイルを使って後の処理をすることになるので、これは困る。

さて、次のパッチだが、こちらは余計な dd を消している。


diff -urN freesbie2.org/scripts/img.sh freesbie2/scripts/img.sh
--- freesbie2.org/scripts/img.sh        Wed Nov 16 19:21:42 2005
+++ freesbie2/scripts/img.sh    Thu May  4 02:33:47 2006
@@ -37,7 +37,6 @@

 # Attach the md device
 DEVICE=`mdconfig -a -t vnode -f ${IMGPATH} -x ${SECTT} -y ${HEADS}`
-rm -f ${IMGPATH}

 echo "g c${CYLINDERS} h${HEADS} s${SECTT}" > ${TMPFILE}
 echo "p 1 165 ${SECTT} $((${SECTS} - ${SECTT}))" >> ${TMPFILE}
@@ -58,10 +57,6 @@
 echo "/dev/ufs/${FREESBIE_LABEL} / ufs ro 1 1" > ${TMPDIR}/etc/fstab
 umount ${TMPDIR}
 cd ${LOCALDIR}
-
-echo "Dumping image to ${IMGPATH}..."
-
-dd if=/dev/${DEVICE} of=${IMGPATH} bs=64k >> ${LOGFILE} 2>&1

 mdconfig -d -u ${DEVICE}

${IMGPATH} は既に mdconfig で使われているファイルデバイスである。 なにも、わざわざ消して、/dev/md から dd をやり直す必要はない。

img.sh の中で時間を食うのはマウントされた md-device 上にシステムを移すのと、この /dev/md からファイルへの dd がほとんどだ。経験から適当に言うと、この二つで半々といったところである。この半分を全く無くすのだから、これは md-device を準備する時間としては、二倍の最適化と言ったところか

実は、この二倍速はとても大きいのである。こちらの高速化は主要な処理時間のほとんどを占める。いくら dd の seek が、四十万倍速くなるとは言え、全体の占める割合としては微々たる物だ。それゆえ、dd を削った効果seek の効果よりも著しい。

局所的な部分を大幅に最適化するのも効果はあるが、それよりも大局的な部分を少し速くした方が、全体的な効果がとても大きくなる事も多い。今回のは、その典型的な例であろう。

Patches: dd-seek patch no-dump patch.

前回

trackback 失敗2006年05月06日 13時09分36秒

FreeSBIE の作業/近況報告が blog なので、trackback で patch を知らせようとしたが、trackback に失敗… asablo で、うまくいかないだけだろうか。

日本語版も後日、作成公開予定。

前回次回

sysutils/freesbie: 400,000x optimization & 2x optimization2006年05月06日 08時57分00秒

FreeSBIE 2 is a well written program, as I've mentioned. Although I never used version 1, version 2 was advertised with its modulability. In fact, one of the reason why I think this design is pretty good is that it takes good advantages of the FreeBSD base build system.

However, there are yet places for improvement. In img.sh and clonefs.sh, dd is used to create a file for a md-device. Seek option helps disk writes of dd. Since dd was intended to create a large file with zero padded, by seeking, UFS creates a sparse file.


diff -urN freesbie2.org/scripts/clonefs.sh freesbie2/scripts/clonefs.sh
--- freesbie2.org/scripts/clonefs.sh    Tue Jan 10 18:30:07 2006
+++ freesbie2/scripts/clonefs.sh        Thu May  4 02:28:41 2006
@@ -35,7 +35,7 @@
     # Find the total dir size and initialize the vnode
     DIRSIZE=$(($(du -kd 0 | cut -f 1)))
     FSSIZE=$(($DIRSIZE + ($DIRSIZE/5)))
-    dd if=/dev/zero of=${UFSFILE} bs=1k count=${FSSIZE} >> ${LOGFILE} 2>&1
+    dd if=/dev/zero of=${UFSFILE} bs=1k count=1 seek=$((${FSSIZE} - 1)) >> ${LOGFILE} 2>&1

     DEVICE=/dev/$(mdconfig -a -t vnode -f ${UFSFILE})
     newfs -o space ${DEVICE} >> ${LOGFILE} 2>&1
diff -urN freesbie2.org/scripts/img.sh freesbie2/scripts/img.sh
--- freesbie2.org/scripts/img.sh        Wed Nov 16 19:21:42 2005
+++ freesbie2/scripts/img.sh    Thu May  4 02:31:41 2006
@@ -33,7 +33,7 @@
 SECTS=$((${CYLINDERS} * ${CYLSIZE}))

 echo "Initializing image..."
-dd if=/dev/zero of=${IMGPATH} count=${SECTS} >> ${LOGFILE} 2>&1
+dd if=/dev/zero of=${IMGPATH} count=1 seek=$((${SECTS} - 1)) >> ${LOGFILE} 2>&1

 # Attach the md device
 DEVICE=`mdconfig -a -t vnode -f ${IMGPATH} -x ${SECTT} -y ${HEADS}`

Since these dd creaets about a 200MB file in img.sh and the default block size, bs, is 512 byte, it makes about 400,000 times faster to create a file!!! The size of the file that clonefs.sh creates depends on the size of the system.

Although I didn't add that to this patch, it is a better idea to do "rm -rf ${filename}" before dd. Then, dd will not try to overwrite an existing directory or do not overwrite an existing file. If an existing file is smaller than the size dd is writing, there is no significant problem because newfs will wipe out everything and nothing will be visible via md-mount. On the other hand, if a larger file exists, for example, 1 GB file, dd will be no-op and FreeSBIE will use 1 GB file to create a disk image. This is a bad idea.

In addition, img.sh will do another "dd" to create a disk image. This operation is not really necessary.


diff -urN freesbie2.org/scripts/img.sh freesbie2/scripts/img.sh
--- freesbie2.org/scripts/img.sh        Wed Nov 16 19:21:42 2005
+++ freesbie2/scripts/img.sh    Thu May  4 02:33:47 2006
@@ -37,7 +37,6 @@

 # Attach the md device
 DEVICE=`mdconfig -a -t vnode -f ${IMGPATH} -x ${SECTT} -y ${HEADS}`
-rm -f ${IMGPATH}

 echo "g c${CYLINDERS} h${HEADS} s${SECTT}" > ${TMPFILE}
 echo "p 1 165 ${SECTT} $((${SECTS} - ${SECTT}))" >> ${TMPFILE}
@@ -58,10 +57,6 @@
 echo "/dev/ufs/${FREESBIE_LABEL} / ufs ro 1 1" > ${TMPDIR}/etc/fstab
 umount ${TMPDIR}
 cd ${LOCALDIR}
-
-echo "Dumping image to ${IMGPATH}..."
-
-dd if=/dev/${DEVICE} of=${IMGPATH} bs=64k >> ${LOGFILE} 2>&1

 mdconfig -d -u ${DEVICE}

${IMGPATH} generated by dd is attached to a md-device IS A DISK IMAGE ITSELF. There is no need to copy back from the md-device. Along the processes of img.sh, there are two time-consuming-processes: one is extracting files onto the md-mounted filesystem and the other is copying from md-device to a file. No-dump patch removes the later; as a result, img.sh takes about half of time compare to befeore.

Indeed, this 2x optimization is quite significant. This reduces major part of the process time, the result is actually greater than dd-seek patch. Although dd-seek makes 400,000 times faster, the original program do not spend much time there. In fact, in today's standard disks, writing from /dev/zero to a file is quite fast. On the other hand, no-dump patch reduces more time because this is a copy from the same disk to the same disk.

It is yet important to optimize on less-time-spent spots. It is more important to improve major-time-spent spots. Even if the ratio of speedup is lesser, the overall result will be greater.

Patches: dd-seek patch and no-dump patch.

next

FreeSBIE 22006年03月13日 01時25分08秒

/usr/local/share/freesbie にビルドツールが入る。 2006 年 2 月に新しく再設計された FreeSBIE 2.0 が出てきたばかりなので、情報が古くなってしまったサイトも多く、あんまりドキュメントが無いのが少々珠に傷。

freesbie.defaults.conf を参考にして、freesbie.conf に必要最低限の設定を書くのが基本。これで、基本的な設定が出来る。launch.sh が freesbie.conf を読み込み、freesbie.defaults.conf で未設定の値を補完をする。例が書かれているので、ここが始発点。これだけでも、かなり融通が効く。

それに加えて数々の拡張機能を提供している。

LOCALDIR で launch.sh:LOCALDIR=$(cd $(dirname $0)/.. && pwd) と設定される。FreeBSD ports では、/usr/local/share/freesbie になり、ここが freesbie の基地になる。

MAKE_CONF から、make の情報が取られる。MAKE_CONF が設定されていなければ LOCALDIR の下の conf/make.conf から取られる。そのときに MINIMAL が設定されていると conf/make.conf.minimal から取られる。これが、make world/kernel に使われる。/usr/src/Makefile.inc1 に書いてあるオプションが使える。freesbie では/etc/make.conf が使われるわけではない

/usr/local/share/freesbie にある Makefile は script 以下の shell script の起動順を制御する。細かい操作は script 以下に配置されている。script/launch.conf が名前の示す通り起動の基。これを通して、script の下に配置されているスクリプトを起動する。このスクリプトは scripts/custom に同名のスクリプトを置くことで、FreeSBIE の提供するスクリプトの変わりに利用することが出来る。custom のディレクトリの位置も SCRIPTS_OVERRIDE を指定しておくことで、違う場所に置くことが出来る。

KERNELCONF が設定されていると、buildkernel にそれが利用される。無い場合は LOCALDIR の中にある各 arch に対応する FREESBIE が利用される。CD 起動用に GENERIC とは違ったオプションが設定されているので、自分でカーネルを作る場合は注意をした方がいい。

ports/packages は freesbie を実行するシステムに入っている物を利用して package を作り、インストールするので、image に入れたいものはあらかじめインストールしておく必要がある。なお、package システムはインストールしてある設定ファイルを基に package ファイルを作るので、自前で変更してある分も一緒に取り込まれることになる。

これだけ、知っていれば自分の用途に合わせて、かなり自由に CD を作れるはず。

FreeSBIE 2 は、とても上手に書かれたシステムである。FreeBSD の make world/kernel と ports の仕組みをよく理解し、上手に利用している。それに加えて、make と shell script もそれぞれの特徴を生かし、書き方もとてもこなれて、きれいに FreeBSD のシステムと融合している。shell script の書き方もうまい。