diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile b/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile new file mode 100644 index 0000000000..2753c0bb79 --- /dev/null +++ b/en_US.ISO8859-1/articles/fbsd-from-scratch/Makefile @@ -0,0 +1,23 @@ +# +# $FreeBSD$ +# +# Article: FreeBSD From Scratch + +DOC?= article + +FORMATS?= html + +MAINTAINER= schweikh@FreeBSD.org + +INSTALL_COMPRESSED?= gz +INSTALL_ONLY_COMPRESSED?= + +# SGML content +SRCS= article.sgml stage_1.sh stage_2.sh stage_3.mk + +DOC_PREFIX?= ${.CURDIR}/../../.. + +afterinstall: + ${INSTALL_DOCS} stage_1.sh stage_2.sh stage_3.mk ${DESTDIR} + +.include "${DOC_PREFIX}/share/mk/doc.project.mk" diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/article.sgml b/en_US.ISO8859-1/articles/fbsd-from-scratch/article.sgml new file mode 100644 index 0000000000..83676bdbb7 --- /dev/null +++ b/en_US.ISO8859-1/articles/fbsd-from-scratch/article.sgml @@ -0,0 +1,571 @@ + +%man; + +%freebsd; +FreeBSD From Scratch"> +]> + +
+ + FreeBSD From Scratch + + + Jens + Schweikhardt + +
schweikh@FreeBSD.org
+
+
+ + 2002 + Jens Schweikhardt + + + $FreeBSD$ +
+ + + This article describes my efforts at &scratch.ap;: a fully + automated installation of a customized &os; system compiled from + source, including compilation of all your favorite ports and + configured to match your idea of the perfect system. If you + think make world is a wonderful concept, + &scratch.ap; extends it to make evenmore. + + + + Introduction + + Have you ever upgraded your system with make world? + There is a problem if you have only one system on your disks. If + the installworld fails partway through, + you are left with a broken system that might not even boot any + longer. Or maybe the installworld runs + smoothly but the new kernel does not boot. Then it is time to + reach for the Fixit CD and dig for those backups you have taken + half a year ago. + + I believe in the wipe your disks when upgrading systems + paradigm. Wiping disks, or rather partitions, makes sure there is no + old cruft left lying around, something which most upgrade procedures + just do not care about. But wiping the partitions means you have to + also recompile/reinstall all your ports and packages and then + redo all your carefully crafted configuration tweaks. + If you think that this task should be automated as well, read on. + + + + Why would I (not) want &scratch.ap;? + + This is a legitimate question. We have + sysinstall and the well known way to + compile the kernel and the userland tools. + + The problem with sysinstall is + that it is severely limited in what, where and how it can install. + + + + It is normally used to install pre-built distribution sets and + packages from some other source (CD, DVD, FTP). It cannot install + the result of a make buildworld. + + + + It cannot install a second system under a directory + in a running system. + + + + It cannot install in Vinum + partitions. + + + + It cannot compile ports, only install precompiled packages. + + + + It is hard to script or to make arbitrary post-installation + changes. + + + + Last but not least, sysinstall + is semi-officially at its End-Of-Life. + + + + The well known way to build and install the world, as + described in the + Handbook, by default replaces + the existing system. Only the kernel and modules are saved. + System binaries, headers and a lot of other files are overwritten; + obsolete files are still present and can cause surprises. If the + upgrade fails for any reason, it may be hard or even impossible to + restore the previous state of the system. + + &scratch.ap; solves all these problems. The strategy is + simple: use a running system to install a new system under an empty + directory tree, while new partitions are mounted appropriately + in that tree. Many config files can be copied to the appropriate + place and &man.mergemaster.8; can take care of those that cannot. + Arbitrary post-configuration of the new system can be + done from within the old system, up to the point where you can + chroot to the new system. In other words, we go through three + stages, where each stage consists of either running a shell + script or invoke make: + + + + stage_1.sh: + Create a new bootable system under an empty directory and merge + or copy as many files as are necessary. + Then boot the new system. + + + + stage_2.sh: + Install desired ports. + + + + stage_3.mk: + Do post-configuration for software installed in previous stage. + + + + Once you have used &scratch.ap; to build a second system and + found it works satisfactorily for a couple of weeks, you can then + use it again to reinstall the original system. From now on, whenever + you feel like an update is in order, you simply toggle the + partitions you want to wipe and reinstall. + + Maybe you have heard of or even tried Linux From Scratch, + or LFS for short. LFS also describes how to build and install a + system from scratch in empty partitions using a running system. + The focus in LFS seems to be to show the role of each system + component (such as kernel, compiler, devices, shell, terminal database, + etc) and the details of each component's installation. + &scratch.ap; does not go into that much detail. My goal is to + provide an automated and complete installation, not explaining all + the gory details that go on under the hood when making the world. + In case you want to explore &os; at this level of detail, start + looking at /usr/src/Makefile and follow the + actions of a make buildworld. + + There are also downsides in the approach taken by &scratch.ap; + that you should bear in mind. + + + + + + While compiling the ports during stage two the system can + not be used for its usual duties. If you run a production server + you have to consider the downtime caused by stage two. The ports + compiled by stage_2.sh below require about 4 + hours to build on an AMD1800+ SCSI system with 10krpm disks and + 1GB of RAM. + + + + + + + Prerequisites + + For going the &scratch.ap; way, you need to have: + + + + A running &os; system with sources and a ports tree. + + + + At least one unused partition where the new system will be + installed. + + + + Experience with running &man.mergemaster.8;. Or at least no fear + doing so. + + + + If you have no or only a slow link to the Internet: the distfiles + for your favorite ports. + + + + Basic knowledge of shell scripting with the Bourne shell, + &man.sh.1;. + + + + Finally, you should also be able to tell your boot + loader how to boot the new system, either interactively, or + by means of a config file. + + + + + + + Stage One: System Installation + + The following is my stage_1.sh. You + need to customize it in various places to match your idea of + the perfect system. I have tried to + extensively comment the places you should adapt. The points to + ponder are: + + + + Partition layout. + + I do not subscribe to the idea of a single huge partition + for the whole system. My systems generally have at least + one partition for + /, + /usr and + /var with + /tmp symlinked to + /var/tmp. + In addition I share the file systems for + /home (user homes), + /home/ncvs (&os; CVS repository replica), + /usr/ports (the ports tree), + /src (various checked out src trees) and + /share (other shared data without the need + for backups, like the news spool). + + + + Luxury items. + + What you want immediately after booting the new system and + even before starting stage two. In my case this is shells/zsh because this is the login + shell for my account as specified in /etc/passwd. + Strictly speaking you can do without luxury items, because all you + need to do is log in as root and run the next stage. + + The reason for not simply installing all my beloved ports + during stage one is that in theory and in practice there are + bootstrap and consistency issues: stage one has your old kernel + running, but the chrooted environment consists of new binaries + and headers. If the new system for example supports a new system + call (according to its headers), some configure-type script + might try to use it and get killed because it executes on the + old kernel. I have seen other issues when I tried building + lang/perl5. + + + + Before you run stage_1.sh make sure + you have completed the usual tasks in preparation for + make installworld installkernel, like: + + + + configured your kernel config file + + + + successfully completed make buildworld + + + + successfully completed make buildkernel + KERNCONF=whatever + + + + When you run stage_1.sh for the first + time, and the config files copied from your running system to the + new system are not up-to-date with respect to what is under + /usr/src, mergemaster will + ask you how to proceed. I recommend merging the changes. If you get + tired of going through the dialogues you can simply update the files + on your running system once (Only if this is an + option. You probably do not want to do this if one of your systems + runs -STABLE and the other + -CURRENT. The changes may be incompatible). + Subsequent mergemaster invocations will detect + that the RCS version IDs match those under + /usr/src and skip the file. + + The stage_1.sh script will stop at the + first command that fails (returns a non-zero exit status) due to + set -e, so you cannot overlook errors. You should + correct any errors in your version of + stage_1.sh before you go on. + + In stage_1.sh we invoke + mergemaster. Even if none of the files requires a + merge, it will display and ask at the end + + *** Comparison complete + +Do you wish to delete what is left of /var/tmp/temproot.stage1? [no] no + + Please answer no or just hit + Enter. The reason is that mergemaster + will have left a few zero sized files below + /var/tmp/temproot.stage1 which will be copied to the + new system later (unless already there). + + After that it will list the files it installed, making use of + a pager (&man.more.1; by default, optionally &man.less.1;): + +*** You chose the automatic install option for files that did not + exist on your system. The following were installed for you: + /newroot/etc/defaults/rc.conf + ... + /newroot/COPYRIGHT + +(END) + + Type q to quit the pager. Then you will + be informed about login.conf: + + *** You installed a login.conf file, so make sure that you run + '/usr/bin/cap_mkdb /newroot/etc/login.conf' + to rebuild your login.conf database + + Would you like to run it now? y or n [n] + + The answer does not matter since we will run &man.cap.mkdb.1; in any + case. + + Everything stage_1.sh does is logged to + stage_1.log for you to examine if you wish to + do so. + + Here is the author's stage_1.sh, which + you need to modify substantially, especially steps 1, 2, 5 and 6. + + + Please pay attention to the &man.newfs.8; commands. + While you can not create new file systems on mounted partitions, the + script will happily erase any unmounted + /dev/da3s1a, /dev/vinum/var_a + and /dev/vinum/usr_a. This can be enough to ruin + your day, so be sure to modify the device names. + + + + + Download stage_1.sh. + + Running this script installs a system that when booted + provides: + + + Inherited users and groups. + + + Firewalled Internet connectivity over Ethernet and PPP. + + + Correct time zone and NTP. + + + Some more minor configuration, like + /etc/ttys and + inetd. + + + + Other areas are prepared for configuration, but will not work + until stage two is completed. For example we have copied files to + configure printing and X11. Printing however is likely to need + applications not found in the base system, like PostScript + utilities. X11 will not run before we have compiled the server, + libraries and programs. + + + + Stage Two: Ports Installation + + + It is also possible to install the (precompiled) + packages at this stage, instead of compiling ports. In this case, + stage_2.sh would be nothing more than a list of + pkg_add commands. I trust you know how to write + such a script. Here we concentrate on the more flexible and + traditional way of using the ports. + + + The following stage_2.sh script is how I + install my favorite ports. It can be run any number of times and + will skip all ports that are already installed. It supports the + dryrun option () to just + show what would be done. You will certainly want to edit the list of + ports, and possibly change a few environment variables. + + The list of ports consists of lines with two or more space + separated words: the category and the port, optionally followed by + an installation command that will compile and install the port + (default: make install). Empty lines and lines + starting with # are ignored. Most of the time it suffices to only + name category and port. A few ports however can be fine tuned by + specifying make variables, e.g.: + + www mozilla make WITHOUT_MAILNEWS=yes WITHOUT_CHATZILLA=yes install +mail procmail make BATCH=yes install + + In fact you can specify arbitrary shell commands, so you are + not restricted to simple make invocations: + + java linux-sun-jdk13 yes | make install +news inn-stable CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" make install + + Note that the line for + news/inn-stable is an example + for a one-shot shell variable assignment to + CONFIGURE_ARGS. The port + Makefile will use this as an initial value + and augment some other essential args. The difference to + specifying a make variable on the command line + with + + news inn-stable make CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" install + + is that the latter will override instead of augment. It depends on + the particular port which method you want. + + Be careful that your ports do not use an interactive install, i.e. + they should not try to read from stdin other than what you explicitly + give them on stdin. If they do, they will read the next line(s) from + your list of ports in the here-document and get confused. If + stage_2.sh mysteriously skips a port or stops + processing, this is likely the reason. + + Here is stage_2.sh. It creates a log file + named LOGDIR/category+port for each port + it actually installs. If you do not have + stage_2.sh on a shared partition make sure you + copy it to the new system before you boot it. + + + + Download stage_2.sh. + + + + Stage Three + + You have installed your beloved ports during stage two. Some + ports require a little bit of configuration. This is what stage three, + the post-configuration is for. I could have integrated this + post-configuration at the end of the stage_2.sh + script. However, I think there is a conceptual difference between + installing a port and modifying its out-of-the-box configuration + that warrants a separate stage. + + I have chosen to implement stage three as a + Makefile because this allows easy selection of + what you want to configure simply by running: + + + &prompt.root; make -f stage_3.mk target + + + As with stage_2.sh make sure you have + stage_3.mk available after booting the new + system, either by putting it on a shared partition or copying it + somewhere on the new system. + + + + Download stage_3.mk. + + + + Limitations + + The automated installation of a port may prove difficult if it + is interactive and does not support make BATCH=YES + install. For a few ports the interaction is nothing more + than typing yes when asked to accept some license. + If such input is read from the standard input, we simply pipe the + appropriate answers to the installation command (usually make + install; this is how we deal with java/linux-sun-jdk13 in + stage_2.sh). + + This strategy for example does not work for editors/staroffice52, which requires that + X11 is running. The installation procedure involves a fair amount of + clicking and typing, so it cannot be automated like other ports can. + However the following workaround does the trick for me: first I + create a staroffice package on the old system with + + + &prompt.root; cd /usr/ports/editors/staroffice52 +&prompt.root; make package +===> Building package for staroffice-5.2_1 +Creating package /usr/ports/editors/staroffice52/staroffice-5.2_1.tbz +Registering depends:. +Creating bzip'd tar ball in '/usr/ports/editors/staroffice52/staroffice-5.2_1.tbz' + + + and during stage two I simply use: + + + &prompt.root; pkg_add /usr/ports/editors/staroffice52/staroffice-5.2_1.tbz + + + You should also be aware of upgrade issues for config files. + In general you do not know when and if the format or contents of a + config file changes. A new group may be added to + /etc/group, or /etc/passwd + may gain another field. All of this has happened in the past. Simply + copying a config file from the old to the new system may be enough + most of the time, but in these cases it was not. If you update a + system the canonical way (by overwriting the old files) you are + expected to use mergemaster to deal with changes + where you effectively want to merge your local config with + potentially new items. Unfortunately, mergemaster + is only available for base system files, not for anything installed + by ports. Some third party software seems to be especially designed + to keep me on my toes by changing the config file format every + fortnight. All you can do is be alert, especially when the major + version number bumps. In the past I had to tweak or rewrite files + for web servers, news servers and readers. All software actively + maintained is a prime candidate for config file scrutiny. + + I have used &scratch.ap; several times to update a + 5-CURRENT to 5-CURRENT, i.e. + I have never tried to install a 5-CURRENT from + a 4-STABLE system or vice versa. Due to the + number of changes between different major release numbers I would + expect this process to be a bit more involved. Using &scratch.ap; + for upgrades within the realm of 4-STABLE + should work painlessly (although I have not yet tried it.) Users of + 4-STABLE may want to consider the following + areas: + + + + If you do not use the device file system + (devfs) you may want to create devices for + some of your hardware with &man.MAKEDEV.8; in stage one, step + six. + + + + +
diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh new file mode 100644 index 0000000000..472a0d2c45 --- /dev/null +++ b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_1.sh @@ -0,0 +1,228 @@ +#!/bin/sh +# +# stage_1.sh - FreeBSD From Scratch, Stage 1: System Installation. +# Usage: ./stage_1.sh +# +# $FreeBSD$ + +set -x -e +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +# Prerequisites: +# +# a) Successfully completed "make buildworld" and "make buildkernel" +# b) Unused partitions (at least one for the root fs, probably more for +# the new /usr and /var, to your liking.) + +# Root mount point where you create the new system. Because it is only +# used as a mount point, no space will be used on that file system as all +# files are of course written to the mounted file system(s). +DESTDIR=/newroot +SRC=/usr/src # Where your src tree is. + +# ---------------------------------------------------------------------------- # +# Step 1: Create an empty directory tree below $DESTDIR. +# ---------------------------------------------------------------------------- # + +step_one () { + # The new root file system. Mandatory. + # Change device names (DEV_*) or risk foot shooting. + DEV_ROOT=/dev/da3s1a + mkdir -p ${DESTDIR} + newfs ${DEV_ROOT} + tunefs -n enable ${DEV_ROOT} + mount -o noatime ${DEV_ROOT} ${DESTDIR} + + # Additional file systems and initial mount points. Optional. + DEV_VAR=/dev/vinum/var_a + newfs ${DEV_VAR} + tunefs -n enable ${DEV_VAR} + mkdir -m 755 ${DESTDIR}/var + mount -o noatime ${DEV_VAR} ${DESTDIR}/var + + DEV_USR=/dev/vinum/usr_a + newfs ${DEV_USR} + tunefs -n enable ${DEV_USR} + mkdir -m 755 ${DESTDIR}/usr + mount -o noatime ${DEV_USR} ${DESTDIR}/usr + + mkdir -m 755 -p ${DESTDIR}/usr/ports + mount /dev/vinum/ports ${DESTDIR}/usr/ports + + # Now create all the other directories. Mandatory. + cd ${SRC}/etc; make distrib-dirs DESTDIR=${DESTDIR} + # My personal preference is to symlink tmp -> var/tmp. Optional. + cd ${DESTDIR}; rmdir tmp; ln -s var/tmp +} + +# ---------------------------------------------------------------------------- # +# Step 2: Fill the empty /etc directory tree and put a few files in /. +# ---------------------------------------------------------------------------- # + +step_two () { + # Add or remove from this list at your discretion. Mostly mandatory. + for f in \ + /.profile \ + /etc/group \ + /etc/hosts \ + /etc/inetd.conf \ + /etc/ipfw.conf \ + /etc/make.conf \ + /etc/master.passwd \ + /etc/nsswitch.conf \ + /etc/ntp.conf \ + /etc/printcap \ + /etc/profile \ + /etc/rc.conf \ + /etc/resolv.conf \ + /etc/start_if.xl0 \ + /etc/ttys \ + /etc/ppp/* \ + /etc/mail/aliases \ + /etc/mail/aliases.db \ + /etc/mail/hal9000.mc \ + /etc/mail/service.switch \ + /etc/ssh/*key* \ + /etc/ssh/*_config \ + /etc/X11/XF86Config-4 \ + /boot/splash.bmp \ + /boot/loader.conf \ + /boot/device.hints ; do + cp -p ${f} ${DESTDIR}${f} + done + # Delete mergemaster's temproot, if any. + TEMPROOT=/var/tmp/temproot.stage1 + if test -d ${TEMPROOT}; then + chflags -R 0 ${TEMPROOT} + rm -rf ${TEMPROOT} + fi + 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 does not create empty files, e.g. in /var/log. Do so now, + # but do not clobber files that may have been copied in the loop above. + 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} +} + +# ---------------------------------------------------------------------------- # +# Step 3: Install world. +# ---------------------------------------------------------------------------- # + +step_three () { + cd ${SRC} + make installworld DESTDIR=${DESTDIR} +} + +# ---------------------------------------------------------------------------- # +# Step 4: Install kernel and modules. +# ---------------------------------------------------------------------------- # + +step_four () { + cd ${SRC} + # The loader.conf and device.hints are required by the installkernel target. + # If you have not copied them in Step 2, cp them as shown in the next 2 lines. + # cp sys/boot/forth/loader.conf ${DESTDIR}/boot/defaults + # cp sys/i386/conf/GENERIC.hints ${DESTDIR}/boot/device.hints + make installkernel DESTDIR=${DESTDIR} KERNCONF=HAL9000 +} + +# ---------------------------------------------------------------------------- # +# Step 5: Install or modify a few essential files. +# ---------------------------------------------------------------------------- # + +step_five () { + # Create /etc/fstab; mandatory. Modify to match your devices. + cat <${DESTDIR}/etc/fstab +# Device Mountpoint FStype Options Dump Pass# +/dev/da3s1b none swap sw 0 0 +/dev/da4s2b none swap sw 0 0 +/dev/da3s1a / ufs rw 1 1 +/dev/da1s2a /src ufs rw 0 2 +/dev/da2s2f /share ufs rw 0 2 +/dev/vinum/var_a /var ufs rw 0 2 +/dev/vinum/usr_a /usr ufs rw 0 2 +/dev/vinum/home /home ufs rw 0 2 +/dev/vinum/ncvs /home/ncvs ufs rw,noatime 0 2 +/dev/vinum/ports /usr/ports ufs rw,noatime 0 2 +# +/dev/cd0 /dvd cd9660 ro,noauto 0 0 +/dev/cd1 /cdrom cd9660 ro,noauto 0 0 +proc /proc procfs rw 0 0 +EOF + + # More directories; optional. + mkdir -m 755 -p ${DESTDIR}/src; chown root:wheel ${DESTDIR}/src + mkdir -m 755 -p ${DESTDIR}/share; chown root:wheel ${DESTDIR}/share + mkdir -m 755 -p ${DESTDIR}/dvd; chown root:wheel ${DESTDIR}/dvd + mkdir -m 755 -p ${DESTDIR}/home; chown root:wheel ${DESTDIR}/home + mkdir -m 755 -p ${DESTDIR}/usr/ports; chown root:wheel ${DESTDIR}/usr/ports + # Setup time zone info; pretty much mandatory. + cp ${DESTDIR}/usr/share/zoneinfo/Europe/Berlin ${DESTDIR}/etc/localtime + if test -r /etc/wall_cmos_clock; then + cp -p /etc/wall_cmos_clock ${DESTDIR}/etc/wall_cmos_clock + fi +} + +# ---------------------------------------------------------------------------- # +# Step 6: Things important to me when I first login to a new system. +# NOTE: Do not install too many binaries here. With the old system running and +# the new binaries and headers installed you are likely to run into bootstrap +# problems. Ports should be compiled after you have booted in the new system. +# ---------------------------------------------------------------------------- # + +step_six () { + chroot ${DESTDIR} sh -c "cd /usr/ports/shells/zsh; make clean install clean" + chroot ${DESTDIR} sh -c "cd /etc/mail; make install" # configure sendmail + + # Without the compat symlink the linux_base files end up on the root fs: + cd ${DESTDIR}; mkdir -m 755 usr/compat + chown root:wheel usr/compat; ln -s usr/compat + mkdir -m 755 usr/compat/linux + mkdir -m 755 boot/grub + + # Make spooldirs for the printers in my /etc/printcap. + cd ${DESTDIR}/var/spool/output/lpd; mkdir -p as od ev te lp da + touch ${DESTDIR}/var/log/lpd-errs + + # More files I want to inherit from the old system. + for f in \ + /var/cron/tabs/root \ + /var/mail/* \ + /boot/grub/*; do + cp -p ${f} ${DESTDIR}${f} + done + + # If you do not have /home on a shared partition, you may want to copy it: + # mkdir -p ${DESTDIR}/home + # cd /home; tar cf - . | (cd ${DESTDIR}/home; tar xpvf -) + + # Starting with FreeBSD 5.x, perl lives in /usr/local/bin but many scripts + # use a hardcoded #!/usr/bin/perl; use a symlink to make them work. + cd ${DESTDIR}/usr/bin; ln -s ../local/bin/perl + cd ${DESTDIR}/usr; rmdir src; ln -s ../src/current src +} + +do_steps () { + step_one + step_two + step_three + step_four + step_five + step_six +} + +do_steps 2>&1 | tee stage_1.log + +# EOF $RCSfile: stage_1.sh,v $ vim: tabstop=2:expandtab: diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh new file mode 100644 index 0000000000..00c0248faa --- /dev/null +++ b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_2.sh @@ -0,0 +1,147 @@ +#!/bin/sh +# +# stage_2.sh - FreeBSD From Scratch, Stage 2: Ports Installation. +# Usage: ./stage_2.sh +# +# $FreeBSD$ + +DBDIR=/var/db/pkg +PORTS=/usr/ports +LOGDIR=/home/root/setup/ports.log; mkdir -p ${LOGDIR} + +# Set some variables used by more than one port. +PAPERSIZE=a4; export PAPERSIZE +USA_RESIDENT=NO; export USA_RESIDENT + +MYNAME=$(basename $0) +usage () { + exec >&2 + echo "usage: ${MYNAME} [-hn]" + echo "" + echo " Options:" + echo " -h Print this help text." + echo " -n Dryrun: just show what would be done." + echo "" + exit 1 +} + +args=`getopt hn $*` +if test $? != 0; then + usage +fi +set -- $args +DRYRUN= +for i; do + case "$i" in + -n) DRYRUN=yes;; + --) break;; + *) usage;; + esac +done + +cat << EOF | +lang perl5 +security sudo +x11-servers XFree86-4-Server +x11 wrapper +x11 XFree86-4-libraries +x11 XFree86-4-clients +x11-fonts XFree86-4-font75dpi +x11-fonts XFree86-4-font100dpi +x11-fonts XFree86-4-fontScalable +x11-fonts urwfonts +x11-fonts webfonts +x11-toolkits open-motif +x11 rxvt +x11-wm ctwm +security openssh-askpass +astro xplanet +astro setiathome make BATCH=yes install +astro xephem +editors vim +print ghostscript-gnu make A4=yes BATCH=yes install +print a2ps-a4 +print psutils-a4 +print gv +print acroread5 +print transfig +archivers zip +archivers unzip +java linux-sun-jdk13 yes | make install +java jdk13 +www apache2 +www weblint +www amaya +www mozilla make WITHOUT_MAILNEWS=yes WITHOUT_CHATZILLA=yes install +www netscape48-navigator +www checkbot +www privoxy +graphics xfig +graphics xv +graphics fxtv +lang expect +news tin +net freebsd-uucp +net cvsup-without-gui +net pathchar make NO_CHECKSUM=yes install +ftp wget +ftp ncftp3 +textproc ispell +german ispell-neu +german ispell-alt +textproc docproj make JADETEX=yes HAVE_MOTIF=yes install +sysutils samefile +sysutils pstree +sysutils mkisofs +sysutils cdrtools +sysutils grub +devel ddd +devel ctags +devel ElectricFence +mail procmail make BATCH=yes install +mail metamail +mail mutt +mail spamoracle +emulators mtools +sysutils portupgrade +news inn-stable CONFIGURE_ARGS="--enable-uucp-rnews --enable-setgid-inews" make install +misc figlet-fonts +textproc gmat +EOF +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 -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" + if test -n "${DRYRUN}"; then + echo "${CMD}" + continue + fi + date "++++++++++ %v %T +++++++++" > ${LOG} + echo "CMD: ${CMD}" >> ${LOG} + ( + make clean + eval "${CMD}" + # make clean # Uncomment if diskspace is tight under ${PORTS}. + ) 2>&1 | tee -a ${LOG} +done + +# Install StarOffice as a package, created on old the system with +# "make package", because the port uses an interactive X11 install. +#pkg_add ${PORTS}/editors/staroffice52/staroffice-*.tbz + +# EOF $RCSfile: stage_2.sh,v $ vim: tabstop=4: diff --git a/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk new file mode 100644 index 0000000000..2acb0dd590 --- /dev/null +++ b/en_US.ISO8859-1/articles/fbsd-from-scratch/stage_3.mk @@ -0,0 +1,146 @@ +# stage_3.mk - FreeBSD From Scratch, Stage 3: Ports Post-Configuration. +# Usage: make -f stage_3.mk all (config everything) +# or make -f stage_3.mk target (to just config target) +# +# It is a good idea to make sure any target can be made more than +# once without ill effect. +# +# $FreeBSD$ + +.POSIX: + +message: + @echo "Please use one of the following targets:" + @echo "config_apache" + @echo "config_inn" + @echo "config_javaplugin" + @echo "config_privoxy" + @echo "config_setiathome" + @echo "config_sgml" + @echo "config_sudo" + @echo "config_TeX" + @echo "config_tin" + @echo "config_uucp" + @echo "all -- all of the above" + +all: config_apache \ + config_inn \ + config_javaplugin \ + config_privoxy \ + config_setiathome \ + config_sgml \ + config_sudo \ + config_TeX \ + config_tin \ + config_uucp + +config_apache: + # 1. Modify httpd.conf. + perl -pi \ + -e 's/#ServerName new.host.name/ServerName hal9000.s.shuttle.de/;' \ + -e 's/^ServerAdmin.*/ServerAdmin schweikh\@schweikhardt.net/;' \ + -e 's,/usr/local/www/cgi-bin/,/home/opt/www/cgi-bin/,;' \ + /usr/local/etc/apache2/httpd.conf + # 2. Restore symlinks to web pages. + cd /usr/local/www/data; \ + ln -fs /home/schweikh/prj/homepage schweikhardt.net; \ + ln -fs /home/opt/www/test . + +config_inn: + pw usermod -n news -d /usr/local/news -s /bin/sh + # Give the news system its initial configuration. + cd /home/root/setup; \ + install -C -o news -g news -m 664 active newsgroups /usr/local/news/db + # The innd.sh that comes with the port is broken, it + # checks for history.pag which does not exist. + cd /home/root/setup; \ + install -C -o root -g wheel -m 555 innd.sh /usr/local/etc/rc.d + # Configure storage method. + 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 + # Configure newsfeeds. + printf "%s\n%s\n" \ + "ME:*::" \ + "shuttle/news2.shuttle.de:!junk,!control:B32768/512,Tf,Wfb:" \ + >/usr/local/news/etc/newsfeeds + # Configure inn.conf. + perl -pi \ + -e 's/^(organization:\s*).*/$$1 An Open Pod Bay Door/;' \ + -e 's/^(pathhost:\s*).*/$$1 hal9000.schweikhardt.net/;' \ + -e 's/^(server:).*/$$1 localhost/;' \ + -e 's/^(domain:).*/$$1 schweikhardt.net/;' \ + -e 's/^(fromhost:).*/$$1 schweikhardt.net/;' \ + -e 's,^(moderatormailer:).*,$$1 \%s\@moderators.isc.org,;' \ + -e 's,/usr/local/news/spool,/share/news/spool,;' \ + /usr/local/news/etc/inn.conf + +config_javaplugin: + cd /usr/local/lib/netscape-linux/plugins; \ + if ! test -h javaplugin.so; then \ + ln -s ../../../linux-sun-jdk1.3.1/jre/plugin/i386/ns4/javaplugin.so; \ + fi; \ + ls -l javaplugin.so + +config_privoxy: + install -C -o root -g wheel -m 644 config /usr/local/etc/privoxy + +config_setiathome: + perl -pi \ + -e 's,^.*seti_wrkdir.*#,seti_wrkdir=/home/nobody/setiathome #,;' \ + /usr/local/etc/rc.setiathome.conf + +config_sgml: + cp -p /usr/local/share/gmat/sgml/ISO_8879-1986/entities/* \ + /usr/local/share/sgml/docbook/4.1 + +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 advises: to typeset the FreeBSD Handbook with JadeTeX, + # change the following settings to the listed values: + perl -pi \ + -e 's/^% original texmf.cnf/% texmf.cnf/;' \ + -e 's/^(hash_extra\s*=).*/$$1 60000/;' \ + -e 's/^(pool_size\s*=).*/$$1 1000000/;' \ + -e 's/^(max_strings\s*=).*/$$1 70000/;' \ + -e 's/^(save_size\s*=).*/$$1 10000/;' \ + /usr/local/share/texmf/web2c/texmf.cnf + +config_tin: + # Point tin to our files. + printf "%s\n%s\n%s\n" \ + "activefile=/usr/local/news/db/active" \ + "newsgroupsfile=/usr/local/news/db/newsgroups" \ + "spooldir=/share/news/spool/articles" \ + >/usr/local/etc/tin.defaults + +config_uucp: + # UUCP expects to find /usr/bin/rnews. + cd /usr/bin; ln -fs ../local/news/bin/rnews . + # Actual UUCP configuration. + 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 * + # Trigger uucico after booting. + mkdir -p /usr/local/etc/rc.d; cp uucp.sh /usr/local/etc/rc.d + +# EOF $RCSfile: stage_3.mk,v $ vim: tabstop=4: