Using PC-Sysinstall for automated network installs of FreeBSD

Mark Saad nonesuch at longcount.org
Fri Nov 16 16:54:15 UTC 2012


All
 I wanted to share with you my method for network installs of FreeBSD
9.1-RCn . This does not use PC-BSD just stock FreeBSD. This should
work on 9.0-RELEASE is known to work on 9.1-RC's and BETA.

I decided to use pc-sysinstall in place of bsdinstall as pc-sysinstall
supported using a config file that could be passed to the installer
much like the old sysinstall way of doing things.


Jumpstart host:
--------------------------

Exported filesystems:  /export/

Useful paths on /export, /export/install/freebsd/9.1/{i386,amd64}
 this is the contents of the install media rsync'd to a local filesystem

TFTP configured to server from /tftpboot which is a symlink to
/export/install/freebsd/9.1/{i386,amd64}

DHCPD configured as follows

subnet 10.1.5.0 netmask 255.255.255.0 {
        authoritative;
        option netbios-name-servers 10.1.5.252;
        option routers 10.1.5.1;
        option subnet-mask 255.255.255.0;
        option broadcast-address 10.1.5.255;
        option domain-name "ops.com";
        option domain-name-servers 8.8.8.8, 10.1.5.101;
        next-server     10.1.5.28;
        option root-path "/tftpboot";
        filename "/pxeboot";
        default-lease-time      21600;
        max-lease-time          43200;
}


Changes to make the install media boot the way I want it.
--------------------------------------

1. I copied boot/pxeboot to /export/install/freebsd/9.1/{i386,amd64}
thats a work symantic not required
2. I created a conf directory to store my pc-sysinatll configs
3. I added the following bits to rc.conf to make the nfs root happy
  sendmail_enable="NONE"
  hostid_enable="NO"
  update_motd="NO"
  hostid_enable="NO"
  varmfs="YES"
  hostname="jumpstart00.ops.com"
4. I modified the fstab file as follows
   #/dev/iso9660/FREEBSD_INSTALL / cd9660 ro 0 0
   none /tmp tmpfs rw 0 0
5 I changed my rc.conf to start a simple shell script and not the
bsdinstall bits

export TERM=vt220

echo "o  PC-SYSINSTALL "
exec /conf/picker.sh

6. Here is /conf/picker.sh

#!/bin/sh

: ${DIALOG_OK=0}
: ${DIALOG_CANCEL=1}
: ${DIALOG_HELP=2}
: ${DIALOG_EXTRA=3}
: ${DIALOG_ITEM_HELP=4}
: ${DIALOG_ESC=255}


dialog --backtitle "FreeBSD Jumpstart" --title "Welcome"  --no-label
"Shell" --yes-label "Install" --yesno "Welcome to FreeBSD! Woul
d you like to begin an installation or use the live filesystem?" 0 0

case $? in
$DIALOG_OK)     # Install
        exec /conf/disk.sh
        ;;
$DIALOG_CANCEL) # Live CD
        ;;
esac


7. Here is /conf/disk.sh
 #!/bin/sh

: ${DIALOG_OK=0}
: ${DIALOG_CANCEL=1}
: ${DIALOG_HELP=2}
: ${DIALOG_EXTRA=3}
: ${DIALOG_ITEM_HELP=4}
: ${DIALOG_ESC=255}


dialog --backtitle "FreeBSD Jumpstart" --title "Select disk type"
--no-label "SCSI/SAS da0" --yes-label "IDE/SATA ada0" --yesno "Se
lect Your servers root disk type" 0 0

case $? in
$DIALOG_OK)     # Install IDE/SATA
        exec /usr/sbin/pc-sysinstall -c /conf/ada-install.cfg
        ;;
$DIALOG_CANCEL) # Install SCSI/SAS
        exec /usr/sbin/pc-sysinstall -c /conf/da-install.cfg
        ;;
esac
exit 255

The install config
------------------------

 I created /conf/ada-install.cfg and /conf/da-install.cfg the only
difference here is the name of the disk as that is not auto
discovered.

Here is ada-install.cfg

 # User Generated pc-sysinstall configuration
installInteractive=no
installMode=fresh
installType=FreeBSD
installMedium=local
localPath=/usr/freebsd-dist/
installFile=fbsd-release.txz
packageType=tar

hostname=nynewserver1.ops.com
netDev=AUTO-DHCP


# Disk Setup
disk0=ada0  #Change me to suite your needs
partition=ALL
bootManager=bsd
partscheme=GPT
commitDiskPart

# Partition Setup for da0(ALL)
# All sizes are expressed in MB
# Avail FS Types, UFS, UFS+S, UFS+SUJ, UFS+J, ZFS, SWAP
# UFS.eli, UFS+S.eli, UFS+SUJ, UFS+J.eli, ZFS.eli, SWAP.eli
disk0-part=UFS+SUJ 0 /
disk0-part=SWAP 4096 none
disk0-part=UFS+SUJ 10240 /var
commitDiskLabel


# Optional Components
#installComponents=src

# Root Password
rootPass=iAmAwinner


# Setup basic network
runCommand=echo 'ifconfig_bge0="DHCP"' >>/etc/rc.conf
runCommand=echo 'ifconfig_em0="DHCP"' >>/etc/rc.conf
runCommand=echo 'ifconfig_igb0="DHCP"' >>/etc/rc.conf
runCommand=echo 'ifconfig_bce0="DHCP"' >>/etc/rc.conf
runCommand=echo 'ifconfig_nfe0="DHCP"' >>/etc/rc.conf
runCommand=echo 'sshd_enable="YES"' >>/etc/rc.conf
runCommand=echo 'ntpd_enable="YES"' >>/etc/rc.conf

#Tweak the configs
runExtCommand=/mnt/sbin/mount_nullfs /packages/ /mnt/mnt/
runExtCommand=mount -t devfs devfs ${FSMNT}/dev
runCommand=echo "-D" > /boot.config
runCommand=echo 'boot_multicons="YES"' > /boot/loader.conf
runCommand=echo 'boot_serial="YES"' >> /boot/loader.conf
runCommand=echo 'comconsole_speed="9600"' >> /boot/loader.conf
runCommand=echo 'console="comconsole,vidconsole"' >> /boot/loader.conf
runCommand=cp /mnt/sysctl.conf /etc
runCommand=cp /mnt/motd /etc
runCommand=cp /mnt/ttys /etc
runCommand=cp /mnt/sshd_config /etc/ssh/
runCommand=mkdir -p /root/.ssh/
runCommand=chmod 700 /root/.ssh/
runCommand=cp /mnt/authorized_keys /root/.ssh/
runCommand=chmod 600 /root/.ssh/authorized_keys

# Set up date/time
runCommand=cp /usr/share/zoneinfo/UTC /etc/localtime
runCommand=touch /etc/wall_cmos_clock
runCommand=adjkerntz -a

# Install packages
runCommand=pkg_add /mnt/All/bash-4.2.37.tbz
runCommand=pkg_add /mnt/All/vim-lite-7.3.632.tbz
runCommand=pkg_add /mnt/All/rsync-3.0.9_1.tbz
runCommand=pkg_add /mnt/All/perl-5.14.2_2.tbz
runCommand=pkg_add /mnt/All/python27-2.7.3_3.tbz
runCommand=pkg_add /mnt/All/ruby-1.8.7.370,1.tbz
runCommand=pkg_add /mnt/All/lua-5.1.5_4.tbz
runCommand=pkg_add /mnt/All/sudo-1.8.5.p3.tbz
runCommand=pkg_add /mnt/All/portaudit-0.6.0.tbz
runCommand=pkg_add /mnt/All/curl-7.24.0.tbz
runCommand=pkg_add /mnt/All/openldap-client-2.4.32_1.tbz
runCommand=pkg_add /mnt/All/pam_ldap-1.8.6_2.tbz
runCommand=pkg_add /mnt/All/pam_mkhomedir-0.2.tbz
runCommand=pkg_add /mnt/All/nss-3.13.6.tbz
runCommand=pkg_add /mnt/All/portupgrade-2.4.9.9,2.tbz
runCommand=pkg_add /mnt/All/unzip-6.0_1.tbz
runCommand=pkg_add /mnt/All/syslog-ng-3.3.5_1.tbz
runCommand=pkg_add /mnt/All/cciss_vol_status-1.10.tbz
runCommand=pkg_add /mnt/All/compat6x-amd64-6.4.604000.200810_3.tbz
runCommand=pkg_add /mnt/All/dmidecode-2.11.tbz
runCommand=pkg_add /mnt/All/pcre-8.31.tbz
runCommand=pkg_add /mnt/All/mcelog-1.0.p2.tbz
runCommand=pkg_add /mnt/All/openjdk6-b25_1.tbz
runCommand=pkg_add /mnt/All/net-snmp-5.7.1_7.tbz

#Clean up and reboot
runExtCommand=umount ${FSMNT}/mnt
runExtCommand=umount ${FSMNT}/dev
runCommand=shutdown -r now


Notes

1. The package install its some hoop jumping but it works. I hope that
Kriss More with add a macro to handle this in the future. I would like
it use to PKG_PATH to make this simpler.
2. The installed FreeBSD originally came from the fbsd-release.txz on
the pc-bsd mirrors however you can provide you own . Work is being
done to make this macro use the FreeBSD tar
balls provided on the install media . That may make it into
9.1-RELEASE but I doubt it.

Thanks to Kriss More for all his help.


-- 
mark saad | nonesuch at longcount.org


More information about the freebsd-hackers mailing list