8. ファイル

ここでは、すでに説明した設定ファイルの他に必要な、 3 個のファイルを示します。

これは stage_1.sh スクリプトです。内容を変更する必要はないでしょう。

#!/bin/sh # # stage_1.sh - FreeBSD From Scratch, 第 1 段階: システムのインストール # 使い方: ./stage_1.sh profile # 読み込むファイル: ./stage_1.conf.profile # 書き出すファイル: ./stage_1.log.profile # # 著者: Jens Schweikhardt # $Id: stage_1.sh,v 1.2 2006-03-13 16:46:15 rushani Exp $ # $FreeBSD: head/ja_JP.eucJP/articles/fbsd-from-scratch/stage_1.sh 38826 2012-05-17 19:12:14Z hrs $ # Original revision: 1.5 PATH=/bin:/usr/bin:/sbin:/usr/sbin # 前提とする環境: # # a) "make buildworld" と "make buildkernel" が正常に終了していること。 # b) 未使用パーティションがあること (ルートファイルシステム用に少なくとも 1 個、 # 好みに応じて /usr や /var 用のものを用意する) # c) カスタマイズされた stage_1.conf.profile ファイル。 if test $# -ne 1; then echo "usage: stage_1.sh profile" 1>&2 exit 1 fi # ---------------------------------------------------------------------------- # # ステップ 1: $DESTDIR 以下に空のディレクトリツリーを作成 # ---------------------------------------------------------------------------- # step_one () { create_file_systems # ここで他のすべてのディレクトリを作成。必須。 cd ${SRC}/etc; make distrib-dirs DESTDIR=${DESTDIR} } # ---------------------------------------------------------------------------- # # ステップ 2: /etc ディレクトリツリーと / にファイルを追加 # ---------------------------------------------------------------------------- # step_two () { copy_files # mergemaster の作業ファイルがあれば削除。 TEMPROOT=/var/tmp/temproot.stage1 if test -d ${TEMPROOT}; then chflags -R 0 ${TEMPROOT} rm -rf ${TEMPROOT} fi export MAKEDEVPATH="/bin:/sbin:/usr/bin" mergemaster -i -m ${SRC}/etc -t ${TEMPROOT} -D ${DESTDIR} cap_mkdb ${DESTDIR}/etc/login.conf pwd_mkdb -d ${DESTDIR}/etc -p ${DESTDIR}/etc/master.passwd # mergemaster は /var/log に置かれる空ファイルを作成しないので、 # ここで作成。ただし copy_files でコピーされている場合は、それを使う。 cd ${TEMPROOT} find . -type f | sed 's,^\./,,' | while read f; do if test -r ${DESTDIR}/${f}; then echo "${DESTDIR}/${f} already exists; not copied" else echo "Creating empty ${DESTDIR}/${f}" cp -p ${f} ${DESTDIR}/${f} fi done chflags -R 0 ${TEMPROOT} rm -rf ${TEMPROOT} } # ---------------------------------------------------------------------------- # # ステップ 3: installworld を実行する # ---------------------------------------------------------------------------- # step_three () { cd ${SRC} make installworld DESTDIR=${DESTDIR} # 追加の互換ライブラリをインストールする (オプション)。libc.so.4 を # 動的リンクするプログラムがあれば、つまり、 # /usr/libexec/ld-elf.so.1: Shared object "libc.so.4" not found # というエラーメッセージが見つかったら、これを利用すること。 cd lib/compat/compat4x.i386 make all install DESTDIR=${DESTDIR} } # ---------------------------------------------------------------------------- # # ステップ 4: カーネルとモジュールをインストールする # ---------------------------------------------------------------------------- # step_four () { cd ${SRC} # installkernel ターゲットには、loader.conf と device.hints が必要。 # ステップ 2 でコピーしていなければ、次の 2 行を使ってコピーすること。 # cp sys/boot/forth/loader.conf ${DESTDIR}/boot/defaults # cp sys/i386/conf/GENERIC.hints ${DESTDIR}/boot/device.hints make installkernel DESTDIR=${DESTDIR} KERNCONF=${KERNCONF} } # ---------------------------------------------------------------------------- # # ステップ 5: /etc/fstab とタイムゾーン情報のインストール # ---------------------------------------------------------------------------- # step_five () { create_etc_fstab # タイムゾーンの設定。ほとんどの場合は必須。 cp ${DESTDIR}/usr/share/zoneinfo/${TIMEZONE} ${DESTDIR}/etc/localtime if test -r /etc/wall_cmos_clock; then cp -p /etc/wall_cmos_clock ${DESTDIR}/etc/wall_cmos_clock fi } # ---------------------------------------------------------------------------- # # ステップ 6: 残りのカスタマイズ # ---------------------------------------------------------------------------- # step_six () { all_remaining_customization } do_steps () { echo "PROFILE=${PROFILE}" echo "DESTDIR=${DESTDIR}" echo "SRC=${SRC}" echo "KERNCONF=${KERNCONF}" echo "TIMEZONE=${TIMEZONE}" echo "TYPE=${TYPE}" echo "REVISION=${REVISION}" echo "BRANCH=${BRANCH}" echo "RELDATE=${RELDATE}" step_one step_two step_three step_four step_five step_six } # ---------------------------------------------------------------------------- # # ここから実行開始 # ---------------------------------------------------------------------------- # PROFILE="$1" set -x -e -u # エラーが発生するか未定義変数を使用したら停止する。 . ./stage_1.conf.${PROFILE} # world を make するのに使われたソースコードから変数をいくつか決定する。 # この変数は、たとえば 4.x と 5.x どちらのシステムをインストールするの # かといった動作を変更するのに使われる。RELDATE に対する # __FreeBSD_version は Port 作成者のためのハンドブック (Porter's Handbook) # で説明されている。 # doc/en_US.ISO8859-1/books/porters-handbook/freebsd-versions.html # 日本語版もあるが、最新の情報は英語版を参照のこと。 # doc/ja_JP.eucJP/books/porters-handbook/freebsd-versions.html # 形式は、<メジャー番号><マイナー番号 2 桁><リリースブランチなら 0, それ以外は 1>xx # 結果は次のようなものになる。 # # TYPE="FreeBSD" # REVISION="4.9" # BRANCH="RC" { "CURRENT", "STABLE", "RELEASE" } # RELDATE="502101" # eval $(awk '/^(TYPE|REVISION|BRANCH)=/' ${SRC}/sys/conf/newvers.sh) RELDATE=$(awk '/^[ \t]*#[ \t]*define[ \t][ \t]*__FreeBSD_version[ \t]/ { print $3 }' ${SRC}/sys/sys/param.h) echo "=> Logging to stage_1.log.${PROFILE}" do_steps 2>&1 | tee stage_1.log.${PROFILE} # vim: tabstop=2:expandtab:shiftwidth=2: # EOF $RCSfile: stage_1.sh,v $

ダウンロード: stage_1.sh.

これは stage_2.sh スクリプトです。最初の部分にある変数を変更しましょう。

#!/bin/sh # # stage_2.sh - FreeBSD From Scratch, 第 2 段階: ports のインストール # 使い方: ./stage_2.sh [-hnp] configname # # 著者: Jens Schweikhardt # $Id: stage_2.sh,v 1.2 2006-03-13 16:46:15 rushani Exp $ # $FreeBSD: head/ja_JP.eucJP/articles/fbsd-from-scratch/stage_2.sh 38826 2012-05-17 19:12:14Z hrs $ # Original revision: 1.5 DBDIR="/var/db/pkg" PORTS="/usr/ports" : ${PACKAGES:=${PORTS}/packages} LOGDIR="/home/root/setup/ports.log"; mkdir -p ${LOGDIR} PKG_PATH="/cdrom/packages/All:/dvd/packages/All" PKG= MYNAME="$(basename $0)" usage () { exec >&2 echo "usage: ${MYNAME} [-hnp] configname" echo "" echo " Options:" echo " -h Print this help text." echo " -n Dryrun: just show what would be done." echo " -p Install a precompiled package if one can be found." echo "" echo " The config file (stage_2.conf.configname) is a list of" echo " ports to install with one entry per line. Each line" echo " consists of two or three space separated fields:" echo " category, port, and optionally a build command." echo "" exit 1 } # これらの場所にあるパッケージを順に探す。 # 1 つ見つかり次第戻って、結果を標準出力に表示する。 # # ${PORTS}/${CATEGORY}/${NAME} # ${PACKAGES}/All # ${PACKAGES}/${CATEGORY} # ${PKG_PATH} # find_package () { echo "${PORTS}/${CATEGORY}/${NAME}:${PACKAGES}/All:${PACKAGES}/${CATEGORY}:${PKG_PATH}" | tr : '\n' | while read d; do test -d "${d}" || continue PKG=$(ls ${d}/${PKGNAME}.* 2>/dev/null) test $? -eq 0 && echo "${PKG}" && return done } # # コマンドライン引数を処理する。 # args=`getopt hnp $*` if test $? != 0; then usage fi set -- $args DRYRUN= CHKPKG= for i; do case "$i" in -n) DRYRUN="yes"; shift;; -p) CHKPKG="yes"; shift;; --) shift; break;; *) usage;; esac done if test $# -eq 1; then DATAFILE="$1" else usage fi # # ports 一覧に対して繰り返す。 # while read CATEGORY NAME CMD; do case "${CATEGORY}" in \#*) continue;; '') continue;; esac DIR="${PORTS}/${CATEGORY}/${NAME}" if ! test -d "${DIR}"; then echo "$DIR does not exist -- ignored" continue fi cd ${DIR} PKGNAME=`make -V PKGNAME` if test -n "${CHKPKG}"; then PKG=$(find_package) else PKG="" fi if test -d "${DBDIR}/${PKGNAME}"; then echo "${CATEGORY}/${NAME} already installed as ${PKGNAME}" continue fi LOG="${LOGDIR}/${CATEGORY}+${NAME}" echo "===> Installing ${CATEGORY}/${NAME}; logging to ${LOG}" test -n "${CMD}" || CMD="make install BATCH=yes < /dev/null" if test -n "${DRYRUN}"; then if test -n "${PKG}"; then echo pkg_add -v ${PKG} else echo "${CMD}" fi continue fi date "++++ Started %v %T +++" > ${LOG} STARTED=$(date +%s) ( if test -n "${PKG}"; then echo "Found package ${PKG}" pkg_add -v ${PKG} else echo "CMD: ${CMD}" make clean eval "${CMD}" make clean # ${PORTS} 以下のディスク容量がすくなければコメントをはずす fi ) 2>&1 | tee -a ${LOG} FINISHED=$(date +%s) DURATION=$(dc -e "${FINISHED} ${STARTED} - p") date "++++ Finished %v %T after ${DURATION} secs +++" >> ${LOG} done < stage_2.conf.${DATAFILE} # vim: tabstop=4: # EOF $RCSfile: stage_2.sh,v $

ダウンロード: stage_2.sh.

これは、わたしが使っている stage_3.mk です。 設定を自動的におこなうための手順を、ここに入れます。

# stage_3.mk - FreeBSD From Scratch, 第 3 段階: ports をインストールした後の設定 # Usage: make -f stage_3.mk all (すべての設定を行なう) # or make -f stage_3.mk target (target の設定を行なう) # # 著者: Jens Schweikhardt # # すべての target が、複数回実行しても悪影響をおよぼさないように # 確認しておくとよい。 # # $Id: stage_3.mk,v 1.2 2006-03-13 16:46:15 rushani Exp $ # $FreeBSD: head/ja_JP.eucJP/articles/fbsd-from-scratch/stage_3.mk 38826 2012-05-17 19:12:14Z hrs $ # Original revision: 1.4 .POSIX: message: @echo "Please use one of the following targets:" @echo "config_apache" @echo "config_firefox" @echo "config_inn" @echo "config_javaplugin" @echo "config_nullplugin" @echo "config_privoxy" @echo "config_smartd" @echo "config_sudo" @echo "config_TeX" @echo "config_tin" @echo "config_uucp" @echo "all -- all of the above" all: \ config_apache \ config_firefox \ config_inn \ config_javaplugin \ config_nullplugin \ config_privoxy \ config_smartd \ config_sudo \ config_TeX \ config_tin \ config_uucp config_apache: # 1. httpd.conf の変更 perl -pi \ -e 's/^\s*ServerAdmin.*/ServerAdmin schweikh\@schweikhardt.net/;' \ -e 's/^\s*Listen.*/Listen 127.0.0.1:80/;' \ -e 's/^\s*StartServers.*/StartServers 2/;' \ -e 's/^\s*MinSpareServers.*/MinSpareServers 2/;' \ -e 's,/usr/local/www/cgi-bin/,/home/opt/www/cgi-bin/,;' \ /usr/local/etc/apache2/httpd.conf # 2. ウェブページに対するシンボリックリンクの作成 cd /usr/local/www/data; \ ln -fs /home/schweikh/prj/homepage schweikhardt.net; \ ln -fs /home/opt/www/test . # httpd.conf が変更されていないか確認する。 @if ! cmp -s /usr/local/etc/apache2/httpd.conf httpd.conf; then \ echo "ATTENTION: the httpd.conf has changed. Please examine if"; \ echo "the modifications are still correct. Here is the diff:"; \ diff -u /usr/local/etc/apache2/httpd.conf httpd.conf; \ fi if test -f /var/run/httpd.pid; then \ /usr/local/etc/rc.d/apache2.sh stop; \ /usr/local/etc/rc.d/apache2.sh start; \ else \ /usr/local/etc/rc.d/apache2.sh start; \ fi config_firefox: # wheel グループが書き込めるようにして、すべての extension をインストー # ルできるようにする。 chmod -R g+w /usr/X11R6/lib/firefox/lib/mozilla-1.6/chrome config_inn: pw usermod -n news -d /usr/local/news -s /bin/sh mkdir -p /share/news/spool/outgoing \ /share/news/spool/incoming \ /share/news/spool/articles \ /share/news/spool/overview \ /share/news/spool/tmp \ /share/news/db chown -R news:news /share/news # ニュースシステムの初期設定 cd /home/root/setup; \ if test ! -f /share/news/db/active; then \ echo "installing /share/news/db/active"; \ install -C -o news -g news -m 664 active /share/news/db; \ fi; \ if test ! -f /share/news/db/newsgroups; then \ echo "installing /share/news/db/newsgroups"; \ install -C -o news -g news -m 664 newsgroups /share/news/db; \ fi # port の innd.sh は壊れていて、 # 存在しない history.pag をチェックしようとする。 cd /home/root/setup; \ install -C -o root -g wheel -m 555 innd.sh /usr/local/etc/rc.d # 格納方法の設定 cd /home/root/setup; \ printf "%s\n%s\n%s\n%s\n" \ "method tradspool {" \ " newsgroups: *" \ " class: 0" \ "}" \ >storage.conf; \ install -C -o news -g news -m 664 storage.conf /usr/local/news/etc # newsfeeds の設定 printf "%s\n%s\n" \ "ME:*::" \ "shuttle/news2.shuttle.de:!junk,!control:B32768/512,Tf,Wfb:" \ >/usr/local/news/etc/newsfeeds # inn.conf の設定 perl -pi \ -e 's/^#*\s*(organization:\s*).*/$$1"An Open Pod Bay Door"/;' \ -e 's/^#*\s*(pathhost:\s*).*/$$1hal9000.schweikhardt.net/;' \ -e 's/^#*\s*(server:).*/$$1 localhost/;' \ -e 's/^#*\s*(domain:).*/$$1 schweikhardt.net/;' \ -e 's/^#*\s*(fromhost:).*/$$1 schweikhardt.net/;' \ -e 's,^#*\s*(moderatormailer:).*,$$1 \%s\@moderators.isc.org,;' \ -e 's,^#*\s*(pathdb:\s*).*,$$1/share/news/db,;' \ -e 's,/usr/local/news/spool,/share/news/spool,;' \ /usr/local/news/etc/inn.conf # 履歴が全く存在しなければ、空の履歴を作成する。 # /usr/ports/news/inn-stable/Makefile の post-install 参照。 cd /share/news/db; \ if test ! -f history; then \ touch history; \ chmod 644 history; \ chown news:news history; \ su -fm news -c "/usr/local/news/bin/makedbz -i"; \ for s in dir hash index; do \ mv history.n.$${s} history.$${s}; \ done; \ fi # send-uucp を設定する。 echo shuttle:shuttle >/usr/local/news/etc/send-uucp.cf # inncheck を満足させる。 cd /usr/local/news/etc; \ chown news:news *; \ chmod 640 control.ctl expire.ctl nntpsend.ctl readers.conf /usr/local/news/bin/inncheck # inn.conf が変更されていないか確認する。 @if ! cmp -s /usr/local/news/etc/inn.conf inn.conf; then \ echo "ATTENTION: the inn.conf has changed. Please examine if"; \ echo "the modifications are still correct. Here is the diff:"; \ diff -u /usr/local/news/etc/inn.conf inn.conf; \ fi if ! test -f /usr/local/news/run/innd.pid; then \ /usr/local/etc/rc.d/innd.sh start; \ fi config_javaplugin: # Mozilla Firefox: cd /usr/X11R6/lib/firefox/lib/mozilla-1.6/plugins; \ ln -fs /usr/local/jdk1.4.2/jre/plugin/i386/ns610/libjavaplugin_oji.so # Plain Mozilla: #cd /usr/X11R6/lib/mozilla/plugins; \ #ln -fs /usr/local/jdk1.4.2/jre/plugin/i386/ns610/libjavaplugin_oji.so # nullplugin を邪魔にならないように削除する。また、.mozilla/*/*/prefs.js に # 次の項目を追加する。 # user_pref("plugin.display_plugin_downloader_dialog", false); # これで入手できないプラグイン (flash 等) についてポップアップダイアログが # 出ないようになる。 config_nullplugin: find /usr/X11R6/lib -name libnullplugin.so -exec mv {} {}.orig \; config_privoxy: install -C -o root -g wheel -m 644 conf/privoxy/config \ /usr/local/etc/privoxy install -C -o root -g wheel -m 755 conf/privoxy/privoxy.sh \ /usr/local/etc/rc.d /usr/local/etc/rc.d/privoxy.sh restart config_smartd: cp smartd.sh /usr/local/etc/rc.d/smartd.sh cp smartd.conf /usr/local/etc/smartd.conf config_sudo: if ! grep -q schweikh /usr/local/etc/sudoers; then \ echo 'schweikh ALL = (ALL) NOPASSWD: ALL' >> /usr/local/etc/sudoers; \ fi config_TeX: # textproc/docproj では、FreeBSD ハンドブックを JadeTeX で # タイプセットするには、次の値を設定するよう指示されている perl -pi \ -e 's/^% original texmf.cnf/% texmf.cnf/;' \ -e 's/^(hash_extra\s*=\s*).*/$${1}60000/;' \ -e 's/^(pool_size\s*=\s*).*/$${1}1000000/;' \ -e 's/^(max_strings\s*=\s*).*/$${1}70000/;' \ -e 's/^(save_size\s*=\s*).*/$${1}10000/;' \ /usr/local/share/texmf/web2c/texmf.cnf # texmf.cnf が変更されていないか確認する。 @if ! cmp -s /usr/local/share/texmf/web2c/texmf.cnf texmf.cnf; then \ echo "ATTENTION: the texmf.cnf has changed. Please examine if"; \ echo "the modifications are still correct. Here is the diff:"; \ diff -u /usr/local/share/texmf/web2c/texmf.cnf texmf.cnf; \ fi config_tin: # tin が設定したファイルを読むように設定 printf "%s\n%s\n%s\n" \ "activefile=/share/news/db/active" \ "newsgroupsfile=/share/news/db/newsgroups" \ "spooldir=/share/news/spool/articles" \ >/usr/local/etc/tin.defaults config_uucp: cd /etc/mail; make install SENDMAIL_MC=/etc/mail/hal9000.mc # su(1) が動作するように uucp ユーザのシェルを正しい uucico にする。 chpass -s /usr/local/libexec/uucp/uucico uucp # UUCP が /usr/bin/rnews を見つけられるようにする cd /usr/bin; ln -fs ../local/news/bin/rnews . # 実際の UUCP の設定 echo nodename js2015 > /usr/local/etc/uucp/config echo shuttle js2015 `cat uucp` > /usr/local/etc/uucp/call printf 'port tcp\ntype tcp\n' > /usr/local/etc/uucp/port printf "%s\n%s\n%s\n%s\n%s\n%s\n%s\n" \ "call-login *" \ "call-password *" \ "time any" \ "system shuttle" \ "address mail.s.shuttle.de" \ "commands rmail rnews" \ "port tcp" \ >/usr/local/etc/uucp/sys cd /usr/local/etc/uucp; chown uucp:uucp *; chmod o-rwx * # 起動後に uucico を実行する mkdir -p /usr/local/etc/rc.d; cp uucp.sh /usr/local/etc/rc.d # vim: tabstop=4: # EOF $RCSfile: stage_3.mk,v $

ダウンロード: stage_3.mk.

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。