Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F102962101
D41704.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
95 KB
Referenced Files
None
Subscribers
None
D41704.diff
View Options
diff --git a/contrib/mfsbsd/.gitignore b/contrib/mfsbsd/.gitignore
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/.gitignore
@@ -0,0 +1,18 @@
+*.gz
+*.iso
+*.img
+mini/*.gz
+mini/*.iso
+mini/*.img
+tmp/
+mini/tmp/
+packages/*.txz
+mini/packages/*.txz
+tools/pkg-static
+tools/roothack/.depend
+tools/roothack/.depend.roothack.o
+tools/roothack/roothack
+tools/roothack/roothack.debug
+tools/roothack/roothack.full
+tools/roothack/roothack.o
+work
diff --git a/contrib/mfsbsd/BUILD.md b/contrib/mfsbsd/BUILD.md
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/BUILD.md
@@ -0,0 +1,84 @@
+# mfsBSD building instructions
+
+Copyright (c) 2019 Martin Matuska <mm at FreeBSD.org>
+
+## Configuration
+Read hints in the sample configuration files in the conf/ directory, copy
+these files to files without .sample ending and make modifications to suit
+your needs.
+
+The default root password is "mfsroot". You can pick a difrerent password
+with the ROOTPW or ROOTPW_HASH make variables.
+
+## Additional packages and files
+If you want any packages installed, copy the .tbz files that should be
+automatically installed into the packages/ directory.
+
+Add any additional files into the customfiles/ directory. These will be copied
+recursively into the root of the boot image.
+
+WARNING:
+Your image should not exceed MFSROOT_MAXSIZE in total.
+Please adjust the variable for larger images.
+
+## Distribution or custom world and kernel
+You may choose to build from a FreeBSD distribution (e.g. CDROM), or by
+using make buildworld / buildkernel from your own world and kernel
+configuration.
+
+To use a distribution (e.g. FreeBSD cdrom), you need access to it
+(e.g. a mounted FreeBSD ISO via mdconfig) and use BASE=/path/to/distribution
+
+To use your own but already built world and kernel, use CUSTOM=1
+If you want this script to do make buildworld and make buildkernel for you,
+use BUILDWORLD=1 and BUILDKERNEL=1
+
+## Creating images
+
+You may create three types of output: disc image for use by dd(1),
+ISO image or a simple .tar.gz file
+
+##Examples
+
+1. disc image
+
+ ```bash
+ make BASE=/cdrom/usr/freebsd-dist
+ make BASE=/cdrom/10.2-RELEASE
+ make CUSTOM=1 BUILDWORLD=1 BUILDKERNEL=1
+ ```
+
+2. bootable ISO file:
+
+ ```bash
+ make iso BASE=/cdrom/usr/freebsd-dist
+ make iso BASE=/cdrom/10.2-RELEASE
+ make iso CUSTOM=1 BUILDWORLD=1 BUILDKERNEL=1
+ ```
+
+3. .tar.gz file:
+
+ ```bash
+ make tar BASE=/cdrom/usr/freebsd-dist
+ make tar BASE=/cdrom/10.2-RELEASE
+ make tar CUSTOM=1 BUILDWORLD=1 BUILDKERNEL=1
+ ```
+
+4. roothack edition:
+
+ ```bash
+ make iso CUSTOM=1 BUILDWORLD=1 BUILDKERNEL=1 ROOTHACK=1
+ ```
+
+5. special edition (with FreeBSD distribution):
+
+ ```bash
+ make iso BASE=/cdrom/11.0-RELEASE RELEASE=11.0-RELEASE ARCH=amd64
+ ```
+
+6. GCE-compatible .tar.gz file:
+
+ ```bash
+ make gce BASE=/cdrom/11.0-RELEASE
+ make gce CUSTOM=1 BUILDWORLD=1 BUILDKERNEL=1
+ ```
diff --git a/contrib/mfsbsd/INSTALL.md b/contrib/mfsbsd/INSTALL.md
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/INSTALL.md
@@ -0,0 +1,39 @@
+# mfsBSD installation (deployment) instructions
+
+Copyright (c) 2019 Martin Matuska <mm at FreeBSD.org>
+
+## Build
+For customized build please see the [BUILD](./BUILD.md) file
+
+## Deploy
+
+### Scenario 1
+You have a linux server without console access and want to install
+FreeBSD on this server.
+
+1. modify your configuration files (do this properly, or no ssh access)
+2. create an image file (e.g. make BASE=/cdrom/usr/freebsd-dist)
+3. write image with dd to the bootable harddrive of the linux server
+4. reboot
+5. ssh to your machine and enjoy :)
+
+### Scenario 2
+You want a rescue CD-ROM with a minimal FreeBSD installation that doesn't
+need to remain in the tray after booting.
+
+1. modify your configuration files
+2. create an iso image file (e.g. make iso BASE=/cdrom/usr/freebsd-dist)
+3. burn ISO image onto a writable CD
+4. boot from the CD and enjoy :)
+
+### Scenario 3
+You want a rescue partition on your FreeBSD system so you can re-partition
+all harddrives remotely.
+
+1. modify your configuration files
+2. create an .tar.gz file (e.g. make tar BASE=/cdrom/usr/freebsd-dist)
+3. create your UFS partition with sysinstall or gpart (e.g. ada0p2)
+4. create a filesystem on the partition (e.g. newfs /dev/ada0p2)
+5. mount the partition and extract your .tar.gz file on it
+6. configure a bootmanager (e.g. gpart bootcode -b /poot/pmbr -p /boot/gptboot -i 1 ada0)
+7. boot from your rescue system and enjoy :)
diff --git a/contrib/mfsbsd/LICENSE b/contrib/mfsbsd/LICENSE
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/LICENSE
@@ -0,0 +1,25 @@
+BSD 2-Clause License
+
+Copyright (c) 2018, Martin Matuska
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/contrib/mfsbsd/Makefile b/contrib/mfsbsd/Makefile
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/Makefile
@@ -0,0 +1,668 @@
+# $Id$
+#
+# mfsBSD
+# Copyright (c) 2019 Martin Matuska <mm at FreeBSD.org>
+
+#
+# User-defined variables
+#
+BASE?= /cdrom/usr/freebsd-dist
+KERNCONF?= GENERIC
+MFSROOT_FREE_INODES?= 10%
+MFSROOT_FREE_BLOCKS?= 10%
+MFSROOT_MAXSIZE?= 4700m
+ROOTPW_HASH?= $$6$$051DdQA7fTvLymkY$$Z5f6snVFQJKugWmGi8y0motBNaKn9em0y2K0ZsJMku3v9gkiYh8M.OTIIie3RvHpzT6udumtZUtc0kXwJcCMR1
+
+# If you want to build your own kernel and make you own world, you need to set
+# -DCUSTOM or CUSTOM=1
+#
+# To make buildworld use
+# -DCUSTOM -DBUILDWORLD or CUSTOM=1 BUILDWORLD=1
+#
+# To make buildkernel use
+# -DCUSTOM -DBUILDKERNEL or CUSTOM=1 BUILDKERNEL=1
+#
+# For all of this use
+# -DCUSTOM -DBUILDWORLD -DBUILDKERNEL or CUSTOM=1 BUILDKERNEL=1 BUILDWORLD=1
+#
+
+#
+# Paths
+#
+SRC_DIR?= /usr/src
+CFGDIR?= conf
+SCRIPTSDIR?= scripts
+PACKAGESDIR?= packages
+CUSTOMFILESDIR?= customfiles
+CUSTOMSCRIPTSDIR?= customscripts
+TOOLSDIR?= tools
+PRUNELIST?= ${TOOLSDIR}/prunelist
+KERN_EXCLUDE?= ${TOOLSDIR}/kern_exclude
+PKG_STATIC?= /usr/local/sbin/pkg-static
+#
+# Program defaults
+#
+MKDIR?= /bin/mkdir -p
+CHOWN?= /usr/sbin/chown
+CAT?= /bin/cat
+PWD?= /bin/pwd
+TAR?= /usr/bin/tar
+GTAR?= /usr/local/bin/gtar
+CP?= /bin/cp
+MV?= /bin/mv
+RM?= /bin/rm
+RMDIR?= /bin/rmdir
+CHFLAGS?= /bin/chflags
+GZIP?= /usr/bin/gzip
+TOUCH?= /usr/bin/touch
+INSTALL?= /usr/bin/install
+LS?= /bin/ls
+LN?= /bin/ln
+FIND?= /usr/bin/find
+PW?= /usr/sbin/pw
+SED?= /usr/bin/sed
+UNAME?= /usr/bin/uname
+BZIP2?= /usr/bin/bzip2
+XZ?= /usr/bin/xz
+MAKEFS?= /usr/sbin/makefs
+SSHKEYGEN?= /usr/bin/ssh-keygen
+SYSCTL?= /sbin/sysctl
+PKG?= /usr/local/sbin/pkg
+OPENSSL?= /usr/bin/openssl
+CUT?= /usr/bin/cut
+#
+WRKDIR?= ${.CURDIR}/work
+#
+BSDLABEL?= bsdlabel
+#
+DOFS?= ${TOOLSDIR}/doFS.sh
+SCRIPTS?= mdinit mfsbsd interfaces packages
+BOOTMODULES?= acpi ahci
+.if defined(LOADER_4TH)
+BOOTFILES?= defaults device.hints loader_4th *.rc *.4th
+EFILOADER?= loader_4th.efi
+.else
+BOOTFILES?= defaults device.hints loader_lua lua
+EFILOADER?= loader_lua.efi
+.endif
+MFSMODULES?= aesni crypto cryptodev ext2fs geom_eli geom_mirror geom_nop \
+ ipmi ntfs nullfs opensolaris smbus snp tmpfs zfs
+# Sometimes the kernel is compiled with a different destination.
+KERNDIR?= kernel
+#
+XZ_FLAGS?=
+#
+
+.if defined(V)
+_v=
+VERB=1
+.else
+_v=@
+VERB=
+.endif
+
+.if !defined(ARCH)
+TARGET!= ${SYSCTL} -n hw.machine_arch
+.else
+TARGET= ${ARCH}
+.endif
+
+.if !defined(RELEASE)
+RELEASE!= ${UNAME} -r
+.endif
+
+.if !defined(PKG_ABI)
+PKG_ABI!= echo "FreeBSD:`${UNAME} -U | ${CUT} -c 1-2`:`${UNAME} -m`"
+.endif
+
+.if !defined(SE)
+IMAGE_PREFIX?= mfsbsd
+.else
+IMAGE_PREFIX?= mfsbsd-se
+.endif
+
+IMAGE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.img
+ISOIMAGE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.iso
+TARFILE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.tar
+GCEFILE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.tar.gz
+_DISTDIR= ${WRKDIR}/dist/${RELEASE}-${TARGET}
+
+.if !defined(DEBUG)
+EXCLUDE= --exclude *.symbols
+.else
+EXCLUDE=
+.endif
+
+# Roothack stuff
+.if !defined(NO_ROOTHACK)
+. if defined(ROOTHACK_FILE) && exists(${ROOTHACK_FILE})
+ROOTHACK_PREBUILT=1
+. else
+ROOTHACK_FILE= ${WRKDIR}/roothack/roothack
+. endif
+.endif
+
+# Check if we are installing FreeBSD 9 or higher
+.if exists(${BASE}/base.txz) && exists(${BASE}/kernel.txz)
+FREEBSD9?= yes
+BASEFILE?= ${BASE}/base.txz
+KERNELFILE?= ${BASE}/kernel.txz
+.else
+BASEFILE?= ${BASE}/base/base.??
+KERNELFILE?= ${BASE}/kernels/generic.??
+.endif
+
+.if defined(MAKEJOBS)
+_MAKEJOBS= -j${MAKEJOBS}
+.endif
+
+_ROOTDIR= ${WRKDIR}/mfs
+_BOOTDIR= ${_ROOTDIR}/boot
+.if !defined(NO_ROOTHACK)
+_DESTDIR= ${_ROOTDIR}/rw
+MFSROOT_FREE_INODES?=1%
+MFSROOT_FREE_BLOCKS?=1%
+.else
+_DESTDIR= ${_ROOTDIR}
+.endif
+
+.if !defined(SE)
+# Environment for custom build
+BUILDENV?= env \
+ NO_FSCHG=1 \
+ WITHOUT_CLANG=1 \
+ WITHOUT_DICT=1 \
+ WITHOUT_GAMES=1 \
+ WITHOUT_LIB32=1
+
+# Environment for custom install
+INSTALLENV?= ${BUILDENV} \
+ WITHOUT_TOOLCHAIN=1
+.endif
+
+# Environment for custom scripts
+CUSTOMSCRIPTENV?= env \
+ WRKDIR=${WRKDIR} \
+ DESTDIR=${_DESTDIR} \
+ DISTDIR=${_DISTDIR} \
+ BASE=${BASE}
+
+.if defined(FULLDIST)
+NO_PRUNE=1
+WITH_RESCUE=1
+.endif
+
+all: image
+
+destdir: ${_DESTDIR} ${_BOOTDIR}
+${_DESTDIR}:
+ ${_v}${MKDIR} ${_DESTDIR} && ${CHOWN} root:wheel ${_DESTDIR}
+
+${_BOOTDIR}:
+ ${_v}${MKDIR} ${_BOOTDIR}/kernel ${_BOOTDIR}/modules && ${CHOWN} -R root:wheel ${_BOOTDIR}
+
+extract: destdir ${WRKDIR}/.extract_done
+${WRKDIR}/.extract_done:
+.if !defined(CUSTOM)
+ ${_v}if [ ! -d "${BASE}" ]; then \
+ echo "Please set the environment variable BASE to a path"; \
+ echo "with FreeBSD distribution files (e.g. /cdrom/9.2-RELEASE)"; \
+ echo "Examples:"; \
+ echo "make BASE=/cdrom/9.2-RELEASE"; \
+ echo "make BASE=/cdrom/usr/freebsd-dist"; \
+ exit 1; \
+ fi
+.if !defined(FREEBSD9)
+ ${_v}for DIR in base kernels; do \
+ if [ ! -d "${BASE}/$$DIR" ]; then \
+ echo "Cannot find directory \"${BASE}/$$DIR\""; \
+ exit 1; \
+ fi \
+ done
+.endif
+ @echo -n "Extracting base and kernel ..."
+ ${_v}${CAT} ${BASEFILE} | ${TAR} --unlink -xpzf - -C ${_DESTDIR}
+.if !defined(FREEBSD9)
+ ${_v}${CAT} ${KERNELFILE} | ${TAR} --unlink -xpzf - -C ${_BOOTDIR}
+ ${_v}${MV} ${_BOOTDIR}/${KERNCONF}/* ${_BOOTDIR}/kernel
+ ${_v}${RMDIR} ${_BOOTDIR}/${KERNCONF}
+.else
+ ${_v}${CAT} ${KERNELFILE} | ${TAR} --unlink -xpzf - -C ${_ROOTDIR}
+.endif
+ @echo " done"
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.extract_done
+
+build: extract ${WRKDIR}/.build_done
+${WRKDIR}/.build_done:
+.if defined(CUSTOM)
+. if defined(BUILDWORLD)
+ @echo -n "Building world ..."
+ ${_v}cd ${SRC_DIR} && \
+ ${BUILDENV} make ${_MAKEJOBS} buildworld TARGET=${TARGET}
+. endif
+. if defined(BUILDKERNEL)
+ @echo -n "Building kernel KERNCONF=${KERNCONF} ..."
+ ${_v}cd ${SRC_DIR} && make buildkernel KERNCONF=${KERNCONF} TARGET=${TARGET}
+. endif
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.build_done
+
+install: destdir build ${WRKDIR}/.install_done
+${WRKDIR}/.install_done:
+.if defined(CUSTOM)
+ @echo -n "Installing world and kernel KERNCONF=${KERNCONF} ..."
+ ${_v}cd ${SRC_DIR} && \
+ ${INSTALLENV} make installworld distribution DESTDIR="${_DESTDIR}" TARGET=${TARGET} && \
+ ${INSTALLENV} make installkernel KERNCONF=${KERNCONF} DESTDIR="${_ROOTDIR}" TARGET=${TARGET}
+.endif
+.if defined(SE)
+. if !defined(CUSTOM) && exists(${BASE}/base.txz) && exists(${BASE}/kernel.txz)
+ @echo -n "Copying base.txz and kernel.txz ..."
+. else
+ @echo -n "Creating base.txz and kernel.txz ..."
+. endif
+ ${_v}${MKDIR} ${_DISTDIR}
+. if !defined(NO_ROOTHACK)
+ ${_v}${CP} -rp ${_BOOTDIR}/${KERNDIR} ${_DESTDIR}/boot
+. if "${KERNDIR}" != "kernel"
+ ${_v}${MV} -f ${_DESTDIR}/boot/${KERNDIR} ${_DESTDIR}/boot/kernel
+. endif
+. endif
+. if !defined(CUSTOM) && exists(${BASE}/base.txz) && exists(${BASE}/kernel.txz)
+ ${_v}${CP} ${BASE}/base.txz ${_DISTDIR}/base.txz
+ ${_v}${CP} ${BASE}/kernel.txz ${_DISTDIR}/kernel.txz
+. else
+ ${_v}${TAR} -c -C ${_DESTDIR} -J ${EXCLUDE} --exclude "boot/${KERNDIR}/*" -f ${_DISTDIR}/base.txz .
+ ${_v}${TAR} -c -C ${_DESTDIR} -J ${EXCLUDE} -f ${_DISTDIR}/kernel.txz boot/kernel
+. endif
+ @echo " done"
+. if !defined(NO_ROOTHACK)
+ ${_v}${RM} -rf ${_DESTDIR}/boot/${KERNDIR}
+. endif
+.endif
+ ${_v}${CHFLAGS} -R noschg ${_DESTDIR} > /dev/null 2> /dev/null || exit 0
+.if !defined(WITHOUT_RESCUE) && defined(RESCUE_LINKS)
+ ${_v}cd ${_DESTDIR} && \
+ for FILE in `${FIND} rescue -type f`; do \
+ FILE=$${FILE##rescue/}; \
+ if [ -f bin/$$FILE ]; then \
+ ${RM} bin/$$FILE && \
+ ${LN} rescue/$$FILE bin/$$FILE; \
+ elif [ -f sbin/$$FILE ]; then \
+ ${RM} sbin/$$FILE && \
+ ${LN} rescue/$$FILE sbin/$$FILE; \
+ elif [ -f usr/bin/$$FILE ]; then \
+ ${RM} usr/bin/$$FILE && \
+ ${LN} -s ../../rescue/$$FILE usr/bin/$$FILE; \
+ elif [ -f usr/sbin/$$FILE ]; then \
+ ${RM} usr/sbin/$$FILE && \
+ ${LN} -s ../../rescue/$$FILE usr/sbin/$$FILE; \
+ fi; \
+ done
+.endif
+.if defined(WITHOUT_RESCUE)
+ ${_v}cd ${_DESTDIR} && ${RM} -rf rescue
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.install_done
+
+prune: install ${WRKDIR}/.prune_done
+${WRKDIR}/.prune_done:
+.if !defined(NO_PRUNE)
+ @echo -n "Removing selected files from distribution ..."
+ ${_v}if [ -f "${PRUNELIST}" ]; then \
+ for FILE in `${CAT} ${PRUNELIST}`; do \
+ if [ -n "$${FILE}" ]; then \
+ ${RM} -rf ${_DESTDIR}/$${FILE}; \
+ fi; \
+ done; \
+ fi
+ ${_v}${TOUCH} ${WRKDIR}/.prune_done
+ @echo " done"
+.endif
+
+cdboot: install prune ${WRKDIR}/.cdboot_done
+${WRKDIR}/.cdboot_done:
+ @echo -n "Copying out cdboot and EFI loader ..."
+ ${_v}${MKDIR} ${WRKDIR}/cdboot
+ ${_v}${CP} ${_DESTDIR}/boot/cdboot ${WRKDIR}/cdboot/
+ ${_v}${CP} ${_DESTDIR}/boot/loader_4th.efi ${_DESTDIR}/boot/loader_lua.efi ${WRKDIR}/cdboot/
+ ${_v}${TOUCH} ${WRKDIR}/.cdboot_done
+ @echo " done"
+
+packages: install prune cdboot ${WRKDIR}/.packages_done
+${WRKDIR}/.packages_done:
+ @echo -n "Installing pkgng ..."
+. if !exists(${PKG_STATIC})
+ @echo "pkg-static not found at: ${PKG_STATIC}"
+ ${_v}exit 1
+. endif
+ ${_v}mkdir -p ${_DESTDIR}/usr/local/sbin
+ ${_v}${INSTALL} -o root -g wheel -m 0755 ${PKG_STATIC} ${_DESTDIR}/usr/local/sbin/
+ ${_v}${LN} -sf pkg-static ${_DESTDIR}/usr/local/sbin/pkg
+ @echo " done"
+ @echo "Installing user packages ..."
+ ${_v}if [ -f "${TOOLSDIR}/packages" ]; then \
+ _PKGS="${TOOLSDIR}/packages"; \
+ elif [ -f "${TOOLSDIR}/packages.sample" ]; then \
+ _PKGS="${TOOLSDIR}/packages.sample"; \
+ fi; \
+ if [ -n "$${_PKGS}" ]; then \
+ env ASSUME_ALWAYS_YES=yes \
+ PKG_ABI="${PKG_ABI}" \
+ PKG_CACHEDIR=${WRKDIR}/pkgcache \
+ ${PKG} -r ${_DESTDIR} install `${CAT} $${_PKGS}`; \
+ fi;
+ ${_v}${TOUCH} ${WRKDIR}/.packages_done
+
+packages-mini: packages ${WRKDIR}/.packages_mini_done
+${WRKDIR}/.packages_mini_done:
+ @echo "Installing additional mini packages ..."
+ ${_v}if [ -f "${TOOLSDIR}/packages-mini" ]; then \
+ _PKGS="${TOOLSDIR}/packages-mini"; \
+ elif [ -f "${TOOLSDIR}/packages-mini.sample" ]; then \
+ _PKGS="${TOOLSDIR}/packages-mini.sample"; \
+ fi; \
+ if [ -n "$${_PKGS}" ]; then \
+ env ASSUME_ALWAYS_YES=yes \
+ PKG_ABI="${PKG_ABI}" \
+ PKG_CACHEDIR=${WRKDIR}/pkgcache \
+ ${PKG} -r ${_DESTDIR} install `${CAT} $${_PKGS}`; \
+ fi;
+ ${_v}${TOUCH} ${WRKDIR}/.packages_mini_done
+
+config: install ${WRKDIR}/.config_done
+${WRKDIR}/.config_done:
+ @echo -n "Installing configuration scripts and files ..."
+.for FILE in boot.config loader.conf rc.conf rc.local resolv.conf interfaces.conf ttys
+. if !exists(${CFGDIR}/${FILE}) && !exists(${CFGDIR}/${FILE}.sample)
+ @echo "Missing ${CFGDIR}/${FILE}.sample" && exit 1
+. endif
+.endfor
+.if defined(SE)
+ ${_v}${INSTALL} -m 0644 ${TOOLSDIR}/motd.se ${_DESTDIR}/etc/motd
+ ${_v}${INSTALL} -d -m 0755 ${_DESTDIR}/cdrom
+.else
+ ${_v}${INSTALL} -m 0644 ${TOOLSDIR}/motd ${_DESTDIR}/etc/motd
+.endif
+ ${_v}${MKDIR} ${_DESTDIR}/stand ${_DESTDIR}/etc/rc.conf.d
+ ${_v}if [ -f "${CFGDIR}/boot.config" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/boot.config ${_DESTDIR}/boot.config; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/boot.config.sample ${_DESTDIR}/boot.config; \
+ fi
+ ${_v}if [ -f "${CFGDIR}/loader.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf ${_BOOTDIR}/loader.conf; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf.sample ${_BOOTDIR}/loader.conf; \
+ fi
+ ${_v}if [ -f "${CFGDIR}/rc.local" ]; then \
+ ${INSTALL} -m 0744 ${CFGDIR}/rc.local ${_DESTDIR}/etc/rc.local; \
+ else \
+ ${INSTALL} -m 0744 ${CFGDIR}/rc.local.sample ${_DESTDIR}/etc/rc.local; \
+ fi
+.for FILE in rc.conf ttys
+ ${_v}if [ -f "${CFGDIR}/${FILE}" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE} ${_DESTDIR}/etc/${FILE}; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE}.sample ${_DESTDIR}/etc/${FILE}; \
+ fi
+.endfor
+.if !defined(NO_ROOTHACK)
+ @echo 'root_rw_mount="NO"' >> ${_DESTDIR}/etc/rc.conf
+.endif
+ ${_v}if [ -f "${CFGDIR}/resolv.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/resolv.conf ${_DESTDIR}/etc/resolv.conf; \
+ fi
+ ${_v}if [ -f "${CFGDIR}/interfaces.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/interfaces.conf ${_DESTDIR}/etc/rc.conf.d/interfaces; \
+ fi
+ ${_v}if [ -f "${CFGDIR}/authorized_keys" ]; then \
+ ${INSTALL} -d -m 0700 ${_DESTDIR}/root/.ssh; \
+ ${INSTALL} ${CFGDIR}/authorized_keys ${_DESTDIR}/root/.ssh/; \
+ fi
+ ${_v}${MKDIR} ${_DESTDIR}/root/bin
+ ${_v}${INSTALL} ${TOOLSDIR}/zfsinstall ${_DESTDIR}/root/bin
+ ${_v}${INSTALL} ${TOOLSDIR}/destroygeom ${_DESTDIR}/root/bin
+ ${_v}for SCRIPT in ${SCRIPTS}; do \
+ ${INSTALL} -m 0555 ${SCRIPTSDIR}/$${SCRIPT} ${_DESTDIR}/etc/rc.d/; \
+ done
+# ${_v}${SED} -I -E 's/\(ttyv[2-7].*\)on /\1off/g' ${_DESTDIR}/etc/ttys
+.if defined(NO_ROOTHACK)
+ ${_v}echo "/dev/md0 / ufs rw 0 0" > ${_DESTDIR}/etc/fstab
+ ${_v}echo "tmpfs /tmp tmpfs rw,mode=1777 0 0" >> ${_DESTDIR}/etc/fstab
+.else
+ ${_v}${TOUCH} ${_DESTDIR}/etc/fstab
+.endif
+.if defined(ROOTPW)
+ ${_v}echo '${ROOTPW}'| ${OPENSSL} passwd -6 -stdin | ${PW} -V ${_DESTDIR}/etc usermod root -H 0
+.elif !empty(ROOTPW_HASH)
+ ${_v}echo '${ROOTPW_HASH}'| ${PW} -V ${_DESTDIR}/etc usermod root -H 0
+.endif
+ ${_v}echo PermitRootLogin yes >> ${_DESTDIR}/etc/ssh/sshd_config
+.if exists(${CFGDIR}/hosts)
+ ${_v}${INSTALL} -m 0644 ${CFGDIR}/hosts ${_DESTDIR}/etc/hosts
+.elif exists(${CFGDIR}/hosts.sample)
+ ${_v}${INSTALL} -m 0644 ${CFGDIR}/hosts.sample ${_DESTDIR}/etc/hosts
+.else
+ @echo "Missing ${CFGDIR}/hosts.sample" && exit 1
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.config_done
+ @echo " done"
+
+genkeys: config ${WRKDIR}/.genkeys_done
+${WRKDIR}/.genkeys_done:
+ @echo -n "Generating SSH host keys ..."
+ ${_v}test -f ${_DESTDIR}/etc/ssh/ssh_host_key || ${SSHKEYGEN} -t rsa1 -b 1024 -f ${_DESTDIR}/etc/ssh/ssh_host_key -N '' > /dev/null 2> /dev/null || true
+ ${_v}test -f ${_DESTDIR}/etc/ssh/ssh_host_dsa_key || ${SSHKEYGEN} -t dsa -f ${_DESTDIR}/etc/ssh/ssh_host_dsa_key -N '' > /dev/null 2> /dev/null || true
+ ${_v}test -f ${_DESTDIR}/etc/ssh/ssh_host_rsa_key || ${SSHKEYGEN} -t rsa -f ${_DESTDIR}/etc/ssh/ssh_host_rsa_key -N '' > /dev/null
+ ${_v}test -f ${_DESTDIR}/etc/ssh/ssh_host_ecdsa_key || ${SSHKEYGEN} -t ecdsa -f ${_DESTDIR}/etc/ssh/ssh_host_ecdsa_key -N '' > /dev/null
+ ${_v}test -f ${_DESTDIR}/etc/ssh/ssh_host_ed25519_key || ${SSHKEYGEN} -t ed25519 -f ${_DESTDIR}/etc/ssh/ssh_host_ed25519_key -N '' > /dev/null
+ ${_v}${TOUCH} ${WRKDIR}/.genkeys_done
+ @echo " done"
+
+customfiles: config ${WRKDIR}/.customfiles_done
+${WRKDIR}/.customfiles_done:
+.if exists(${CUSTOMFILESDIR})
+ @echo "Copying user files ..."
+ ${_v}${CP} -afv ${CUSTOMFILESDIR}/ ${_DESTDIR}/
+ ${_v}${TOUCH} ${WRKDIR}/.customfiles_done
+ @echo " done"
+.endif
+
+customscripts: config ${WRKDIR}/.customscripts_done
+${WRKDIR}/.customscripts_done:
+.if exists(${CUSTOMSCRIPTSDIR})
+ @echo -n "Running user scripts ..."
+ @for SCRIPT in `find ${CUSTOMSCRIPTSDIR} -type f`; do \
+ chmod +x $$SCRIPT; \
+ ${CUSTOMSCRIPTENV} $$SCRIPT; \
+ done
+ ${_v}${TOUCH} ${WRKDIR}/.customscripts_done
+ @echo " done"
+.endif
+
+compress-usr: install prune cdboot config genkeys customfiles customscripts boot efiboot packages ${WRKDIR}/.compress-usr_done
+${WRKDIR}/.compress-usr_done:
+.if defined(NO_ROOTHACK)
+ @echo -n "Compressing usr ..."
+ ${_v}${TAR} -c -J -C ${_DESTDIR} -f ${_DESTDIR}/.usr.tar.xz usr
+ ${_v}${RM} -rf ${_DESTDIR}/usr && ${MKDIR} ${_DESTDIR}/usr
+.else
+ @echo -n "Compressing root ..."
+ ${_v}${TAR} -c -C ${_ROOTDIR} -f - rw | \
+ ${XZ} ${XZ_FLAGS} -v -c > ${_ROOTDIR}/root.txz
+ ${_v}${RM} -rf ${_DESTDIR} && ${MKDIR} ${_DESTDIR}
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.compress-usr_done
+ @echo " done"
+
+roothack: ${WRKDIR}/roothack/roothack
+${WRKDIR}/roothack/roothack:
+.if !defined(ROOTHACK_PREBUILT)
+ ${_v}${MKDIR} -p ${WRKDIR}/roothack
+ ${_v}cd ${TOOLSDIR}/roothack && env MAKEOBJDIR=${WRKDIR}/roothack make
+.endif
+
+install-roothack: compress-usr roothack ${WRKDIR}/.install-roothack_done
+${WRKDIR}/.install-roothack_done:
+ @echo -n "Installing roothack ..."
+ ${_v}${MKDIR} -p ${_ROOTDIR}/dev ${_ROOTDIR}/sbin
+ ${_v}${INSTALL} -m 555 ${ROOTHACK_FILE} ${_ROOTDIR}/sbin/init
+ ${_v}${TOUCH} ${WRKDIR}/.install-roothack_done
+ @echo " done"
+
+boot: install prune cdboot ${WRKDIR}/.boot_done
+${WRKDIR}/.boot_done:
+ @echo -n "Configuring boot environment ..."
+ ${_v}${MKDIR} -p ${WRKDIR}/disk/boot/kernel
+ ${_v}${CHOWN} root:wheel ${WRKDIR}/disk
+ ${_v}${TAR} -c -X ${KERN_EXCLUDE} -C ${_BOOTDIR}/${KERNDIR} -f - . | ${TAR} -xv -C ${WRKDIR}/disk/boot/kernel -f -
+ ${_v}${CP} -rp ${_DESTDIR}/boot.config ${WRKDIR}/disk
+.for FILE in ${BOOTFILES}
+ ${_v}${CP} -rp ${_DESTDIR}/boot/${FILE} ${WRKDIR}/disk/boot
+.endfor
+.if defined(LOADER_4TH)
+ ${_v}${MV} -f ${WRKDIR}/disk/boot/loader_4th ${WRKDIR}/disk/boot/loader
+.else
+ ${_v}${MV} -f ${WRKDIR}/disk/boot/loader_lua ${WRKDIR}/disk/boot/loader
+.endif
+ ${_v}${RM} -rf ${WRKDIR}/disk/boot/kernel/*.ko ${WRKDIR}/disk/boot/kernel/*.symbols
+.if defined(DEBUG)
+ ${_v}-${INSTALL} -m 0555 ${_BOOTDIR}/${KERNDIR}/kernel.symbols ${WRKDIR}/disk/boot/kernel
+.endif
+ # Install modules need to boot into the kernel directory
+ ${_v}${FIND} ${_BOOTDIR}/${KERNDIR} -name 'acpi*.ko' -exec ${INSTALL} -m 0555 {} ${WRKDIR}/disk/boot/kernel \;
+.for FILE in ${BOOTMODULES}
+ ${_v}[ ! -f ${_BOOTDIR}/${KERNDIR}/${FILE}.ko ] || \
+ ${INSTALL} -m 0555 ${_BOOTDIR}/${KERNDIR}/${FILE}.ko ${WRKDIR}/disk/boot/kernel
+. if defined(DEBUG)
+ ${_v}[ ! -f ${_BOOTDIR}/${KERNDIR}/${FILE}.ko.symbols ] || \
+ ${INSTALL} -m 0555 ${_BOOTDIR}/${KERNDIR}/${FILE}.ko.symbols ${WRKDIR}/disk/boot/kernel
+. endif
+.endfor
+ ${_v}${MKDIR} -p ${_DESTDIR}/boot/modules
+.for FILE in ${MFSMODULES}
+ ${_v}[ ! -f ${_BOOTDIR}/${KERNDIR}/${FILE}.ko ] || \
+ ${INSTALL} -m 0555 ${_BOOTDIR}/${KERNDIR}/${FILE}.ko ${_DESTDIR}/boot/modules
+. if defined(DEBUG)
+ ${_v}[ ! -f ${_BOOTDIR}/${KERNDIR}/${FILE}.ko.symbols ] || \
+ ${INSTALL} -m 0555 ${_BOOTDIR}/${KERNDIR}/${FILE}.ko.symbols ${_DESTDIR}/boot/modules
+. endif
+.endfor
+.if !defined(NO_ROOTHACK)
+ ${_v}${MKDIR} -p ${_ROOTDIR}/boot/modules
+ ${_v}${INSTALL} -m 0666 ${_BOOTDIR}/${KERNDIR}/tmpfs.ko ${_ROOTDIR}/boot/modules
+.endif
+ ${_v}${RM} -rf ${_BOOTDIR}/${KERNDIR} ${_BOOTDIR}/*.symbols
+ ${_v}${MKDIR} -p ${WRKDIR}/boot
+ ${_v}${CP} -p ${_DESTDIR}/boot/pmbr ${_DESTDIR}/boot/gptboot ${WRKDIR}/boot
+ ${_v}${TOUCH} ${WRKDIR}/.boot_done
+ @echo " done"
+
+efiboot: install prune cdboot config genkeys customfiles customscripts boot ${WRKDIR}/.efiboot_done
+${WRKDIR}/.efiboot_done:
+.if !defined(NO_EFIBOOT)
+ @echo -n "Creating EFI boot image ..."
+ ${_v}${MKDIR} -p ${WRKDIR}/efiroot/EFI/BOOT
+ ${_v}${CP} ${WRKDIR}/cdboot/${EFILOADER} ${WRKDIR}/efiroot/EFI/BOOT/BOOTX64.efi
+ ${_v}${MAKEFS} -t msdos -s 2048k -o fat_type=12,sectors_per_cluster=1 ${WRKDIR}/cdboot/efiboot.img ${WRKDIR}/efiroot
+ ${_v}${TOUCH} ${WRKDIR}/.efiboot_done
+ @echo " done"
+.endif
+
+.if !defined(NO_ROOTHACK)
+mfsroot: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr packages install-roothack ${WRKDIR}/.mfsroot_done
+.else
+mfsroot: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr packages ${WRKDIR}/.mfsroot_done
+.endif
+${WRKDIR}/.mfsroot_done:
+ @echo -n "Creating and compressing mfsroot ..."
+ ${_v}${MKDIR} ${WRKDIR}/mnt
+ ${_v}${MAKEFS} -t ffs -m ${MFSROOT_MAXSIZE} -f ${MFSROOT_FREE_INODES} -b ${MFSROOT_FREE_BLOCKS} ${WRKDIR}/disk/mfsroot ${_ROOTDIR} > /dev/null
+ ${_v}${RM} -rf ${WRKDIR}/mnt
+ ${_v}${GZIP} -9 -f ${WRKDIR}/disk/mfsroot
+ ${_v}${GZIP} -9 -f ${WRKDIR}/disk/boot/kernel/kernel
+ ${_v}if [ -f "${CFGDIR}/loader.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf ${WRKDIR}/disk/boot/loader.conf; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf.sample ${WRKDIR}/disk/boot/loader.conf; \
+ fi
+ ${_v}${TOUCH} ${WRKDIR}/.mfsroot_done
+ @echo " done"
+
+fbsddist: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr packages mfsroot ${WRKDIR}/.fbsddist_done
+${WRKDIR}/.fbsddist_done:
+.if defined(SE)
+ @echo -n "Copying FreeBSD installation image ..."
+ ${_v}${CP} -rf ${_DISTDIR} ${WRKDIR}/disk/
+ @echo " done"
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.fbsddist_done
+
+image: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr mfsroot fbsddist ${IMAGE}
+${IMAGE}:
+ @echo -n "Creating image file ..."
+.if defined(BSDPART)
+ ${_v}${MKDIR} ${WRKDIR}/mnt ${WRKDIR}/trees/base/boot
+ ${_v}${INSTALL} -m 0444 ${WRKDIR}/disk/boot/boot ${WRKDIR}/trees/base/boot/
+ ${_v}${DOFS} ${BSDLABEL} "" ${WRKDIR}/disk.img ${WRKDIR} ${WRKDIR}/mnt 0 ${WRKDIR}/disk 80000 auto > /dev/null 2> /dev/null
+ ${_v}${RM} -rf ${WRKDIR}/mnt ${WRKDIR}/trees
+ ${_v}${MV} ${WRKDIR}/disk.img ${.TARGET}
+.else
+ ${_v}${TOOLSDIR}/do_gpt.sh ${.TARGET} ${WRKDIR}/disk 0 ${WRKDIR}/boot ${WRKDIR}/cdboot/efiboot.img ${VERB}
+.endif
+ @echo " done"
+ ${_v}${LS} -l ${.TARGET}
+
+gce: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr mfsroot fbsddist ${IMAGE} ${GCEFILE}
+${GCEFILE}:
+ @echo -n "Creating GCE-compatible tarball..."
+.if !exists(${GTAR})
+ ${_v}echo "${GTAR} is missing, please install archivers/gtar first"; exit 1
+.else
+ ${_v}${GTAR} -C ${.CURDIR} -Szcf ${GCEFILE} --transform='s/${IMAGE}/disk.raw/' ${IMAGE}
+ @echo " GCE tarball built"
+ ${_v}${LS} -l ${GCEFILE}
+.endif
+
+iso: install prune cdboot config genkeys customfiles customscripts boot efiboot compress-usr mfsroot fbsddist ${ISOIMAGE}
+${ISOIMAGE}:
+ @echo -n "Creating ISO image ..."
+.if !defined(NO_EFIBOOT)
+ ${_v}${MAKEFS} -t cd9660 -o rockridge,label=mfsBSD \
+ -o bootimage=i386\;${WRKDIR}/cdboot/cdboot,no-emul-boot \
+ -o bootimage=i386\;${WRKDIR}/cdboot/efiboot.img,no-emul-boot,platformid=efi \
+ ${ISOIMAGE} ${WRKDIR}/disk
+.else
+ ${_v}${MAKEFS} -t cd9660 -o rockridge,label=mfsBSD \
+ -o bootimage=i386\;${WRKDIR}/cdboot/cdboot,no-emul-boot \
+ ${ISOIMAGE} ${WRKDIR}/disk
+.endif
+ @echo " done"
+ ${_v}${LS} -l ${ISOIMAGE}
+
+tar: install prune cdboot config customfiles customscripts boot efiboot compress-usr mfsroot fbsddist ${TARFILE}
+${TARFILE}:
+ @echo -n "Creating tar file ..."
+ ${_v}cd ${WRKDIR}/disk && ${FIND} . -depth 1 \
+ -exec ${TAR} -r -f ${.CURDIR}/${TARFILE} {} \;
+ @echo " done"
+ ${_v}${LS} -l ${TARFILE}
+
+prepare-mini: packages-mini config boot cdboot
+
+clean-roothack:
+ ${_v}${RM} -rf ${WRKDIR}/roothack
+
+clean-pkgcache:
+ ${_v}${RM} -rf ${WRKDIR}/pkgcache
+
+clean:
+ ${_v}if [ -d ${WRKDIR} ]; then \
+ ${CHFLAGS} -R noschg ${WRKDIR} && \
+ cd ${WRKDIR} && \
+ ${RM} -rf boot mfs mnt disk dist trees cdboot efiroot .*_done; \
+ fi
+
+clean-all: clean clean-roothack clean-pkgcache
diff --git a/contrib/mfsbsd/README.md b/contrib/mfsbsd/README.md
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/README.md
@@ -0,0 +1,31 @@
+# mfsBSD
+
+Copyright (c) 2019 Martin Matuska <mm at FreeBSD.org>
+
+Version 2.4
+
+## Description
+
+This is a set of scripts that generates a bootable image, ISO file or boot
+files only, that create a working minimal installation of FreeBSD. This
+minimal installation gets completely loaded into memory.
+
+The image may be written directly using dd(1) onto any bootable block device,
+e.g. a hard disk or a USB stick e.g. /dev/da0, or a bootable slice only,
+e.g. /dev/ada0s1
+
+## Build-time requirements
+ - FreeBSD 11 or higher installed, tested on i386 or amd64
+ - base.txz and kernel.txz from a FreeBSD 11 or higher distribution
+
+## Runtime requirements
+ - a minimum of 512MB system memory
+
+## Other information
+
+See [BUILD](./BUILD.md) and [INSTALL](./INSTALL.md) for building and installation instructions.
+
+Project homepage: http://mfsbsd.vx.sk
+
+This project is based on the ideas of the depenguinator project:
+http://www.daemonology.net/depenguinator/
diff --git a/contrib/mfsbsd/ci/ci.sh b/contrib/mfsbsd/ci/ci.sh
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/ci/ci.sh
@@ -0,0 +1,46 @@
+#!/bin/sh
+set -e
+BASE=/tmp/freebsd-dist
+RELEASE=${RELEASE:-13.0-RELEASE}
+DOWNLOAD_URL=http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${RELEASE}
+while getopts b:r: opt
+do
+ case $opt in
+ b) ACTION="${OPTARG}";;
+ r) RELEASE="${OPTARG}";;
+ esac
+done
+if [ "${ACTION}" = "prepare" ]
+then
+ mkdir -p ${BASE}
+ fetch -m -o ${BASE}/base.txz ${DOWNLOAD_URL}/base.txz
+ fetch -m -o ${BASE}/kernel.txz ${DOWNLOAD_URL}/kernel.txz
+ if [ -x tools/roothack/roothack ]
+ then
+ cd tools/roothack && make depend && make
+ fi
+elif [ "${ACTION}" = "build-std" ]
+then
+ make clean V=1
+ make iso V=1 RELEASE=${RELEASE} BASE=${BASE} ROOTHACK=1
+ make V=1 RELEASE=${RELEASE} BASE=${BASE} ROOTHACK=1
+elif [ "${ACTION}" = "build-se" ]
+then
+ make clean V=1
+ make iso V=1 RELEASE=${RELEASE} BASE=${BASE} ROOTHCK=1 SE=1
+ make V=1 RELEASE=${RELEASE} BASE=${BASE} ROOTHACK=1 SE=1
+elif [ "${ACTION}" = "build-mini" ]
+then
+ make clean V=1
+ make prepare-mini V=1 RELEASE=${RELEASE} ROOTHACK=1 BASE=${BASE}
+ cd mini
+ make clean V=1
+ make iso V=1 RELEASE=${RELEASE} ROOTHACK=1 BASE=${BASE}
+ make clean V=1
+ cd ..
+ make clean V=1
+ mv mini/*.iso .
+else
+ echo "Unknown build step"
+ false
+fi
diff --git a/contrib/mfsbsd/conf/authorized_keys.sample b/contrib/mfsbsd/conf/authorized_keys.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/authorized_keys.sample
@@ -0,0 +1,2 @@
+# $Id$
+# Public SSH key(s) for root authorization
diff --git a/contrib/mfsbsd/conf/boot.config.sample b/contrib/mfsbsd/conf/boot.config.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/boot.config.sample
@@ -0,0 +1 @@
+-D
diff --git a/contrib/mfsbsd/conf/hosts.sample b/contrib/mfsbsd/conf/hosts.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/hosts.sample
@@ -0,0 +1,6 @@
+# $Id$
+#
+# The file will be the /etc/hosts file in your image
+#
+::1 localhost localhost.my.domain
+127.0.0.1 localhost localhost.my.domain
diff --git a/contrib/mfsbsd/conf/interfaces.conf.sample b/contrib/mfsbsd/conf/interfaces.conf.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/interfaces.conf.sample
@@ -0,0 +1,16 @@
+# $Id$
+#
+# If you don't know the exact interface names and/or order in which they
+# appear, you can configure interfaces depending on their MAC addresses here.
+
+# mac_interfaces should be a user-defined list of virtual interface names.
+#mac_interfaces="ext1 ext2"
+
+# ifconfig_FOO_mac should be the MAC address of interface FOO
+#ifconfig_ext1_mac="00:00:00:00:00:00"
+#ifconfig_ext2_mac="ff:ff:ff:ff:ff:ff"
+
+# ifconfig_FOO should be configured like the real interface behind FOO
+# for more information, see ifconfig(8)
+#ifconfig_ext1="inet 192.168.0.1/24"
+#ifconfig_ext2="inet 192.168.1.1/24"
diff --git a/contrib/mfsbsd/conf/loader.conf.sample b/contrib/mfsbsd/conf/loader.conf.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/loader.conf.sample
@@ -0,0 +1,54 @@
+# $Id$
+#
+# This is the /boot/loader.conf of your image
+#
+# Custom mfsbsd variables
+#
+# Set all auto-detected interfaces to DHCP
+#mfsbsd.autodhcp="YES"
+#
+# Define a new root password
+#mfsbsd.rootpw="foobar"
+#
+# Alternatively define a root password hash like in master.passwd
+# NOTICE: replace '$' characters with '%'
+#mfsbsd.rootpwhash=""
+#
+# Add additional nameservers here
+#mfsbsd.nameservers="192.168.1.1 192.168.1.2"
+#
+# Change system hostname
+#mfsbsd.hostname="mfsbsd"
+#
+# List of interfaces to be set
+#mfsbsd.interfaces="em0 em1"
+#
+# Individual configuration of each interface
+#mfsbsd.ifconfig_em0="DHCP"
+#mfsbsd.ifconfig_em1="DHCP"
+#
+# List of special interfaces to be created
+#mfsbsd.cloned_interfaces=""
+#
+# List of mac_interfaces (see interfaces.conf.sample)
+#mfsbsd.mac_interfaces="eth0"
+#mfsbsd.ifconfig_eth0_mac="xx:xx:xx:xx:xx:xx"
+#mfsbsd.ifconfig_eth0="inet 192.168.1.10/24"
+#
+# Default router
+#mfsbsd.defaultrouter="192.168.1.1"
+#
+# List of static routes and their definitions
+#mfsbsd.static_routes="r1 r2"
+#mfsbsd.route_r1="-net 192.168.2 192.168.1.1"
+#mfsbsd.route_r2="-net 192.168.3 192.168.1.1"
+
+#
+# Do not change anything here until you know what you are doing
+#
+mfs_load="YES"
+mfs_type="mfs_root"
+mfs_name="/mfsroot"
+ahci_load="YES"
+vfs.root.mountfrom="ufs:/dev/md0"
+mfsbsd.autodhcp="YES"
diff --git a/contrib/mfsbsd/conf/rc.conf.sample b/contrib/mfsbsd/conf/rc.conf.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/rc.conf.sample
@@ -0,0 +1,24 @@
+# $Id$
+#
+# This will be the rc.conf file in your image.
+#
+# You may set anything you want here, including network interfaces.
+# If you are not sure about network interface names and/or their order,
+# see the interfaces.conf file in this directory.
+#
+# Set this to any desired hostname
+hostname="mfsbsd"
+#
+# You need a gateway defined for a working network setup
+#defaultrouter="192.168.0.254"
+#
+# You may configure a network interface here, you may use "DHCP" as well
+#ifconfig_em0="inet 192.168.0.1 netmask 255.255.255.0"
+#ifconfig_rl0="DHCP"
+#
+# Change the values below only if you know what you are doing!
+#
+sshd_enable="YES"
+sendmail_enable="NONE"
+cron_enable="NO"
+local_enable="YES"
diff --git a/contrib/mfsbsd/conf/rc.local.sample b/contrib/mfsbsd/conf/rc.local.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/rc.local.sample
@@ -0,0 +1,2 @@
+# sample rc.local
+# add your code below
\ No newline at end of file
diff --git a/contrib/mfsbsd/conf/resolv.conf.sample b/contrib/mfsbsd/conf/resolv.conf.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/resolv.conf.sample
@@ -0,0 +1,6 @@
+# $Id$
+#
+# The file will be the /etc/resolv.conf file in your image
+#
+#domain com
+#nameserver 192.168.0.254
diff --git a/contrib/mfsbsd/conf/ttys.sample b/contrib/mfsbsd/conf/ttys.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/conf/ttys.sample
@@ -0,0 +1,22 @@
+# $FreeBSD$
+#
+console none unknown off secure
+#
+ttyv0 "/usr/libexec/getty Pc" xterm on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" xterm off secure
+ttyv2 "/usr/libexec/getty Pc" xterm off secure
+ttyv3 "/usr/libexec/getty Pc" xterm off secure
+ttyv4 "/usr/libexec/getty Pc" xterm off secure
+ttyv5 "/usr/libexec/getty Pc" xterm off secure
+ttyv6 "/usr/libexec/getty Pc" xterm off secure
+ttyv7 "/usr/libexec/getty Pc" xterm off secure
+ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
+# Serial terminals
+# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
+ttyu0 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu2 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu3 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+# Dumb console
+dcons "/usr/libexec/getty std.9600" vt100 off secure
diff --git a/contrib/mfsbsd/mini/Makefile b/contrib/mfsbsd/mini/Makefile
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/Makefile
@@ -0,0 +1,333 @@
+# $Id$
+#
+# mfsBSD-mini
+# Copyright (c) 2018 Martin Matuska <mm at FreeBSD.org>
+#
+# Version 0.2
+#
+
+#
+# User-defined variables
+#
+BASEDIR?=${CURDIR}/../work/mfs/rw
+BOOTBASE?=${CURDIR}/../work/disk/boot
+CDBOOTBASE?=${CURDIR}/../work/cdboot
+CFGDIR?=${CURDIR}/conf
+MFSROOT_FREE_INODES?=5000
+MFSROOT_FREE_BLOCKS?=10%
+MFSROOT_MINSIZE?=64m
+MFSROOT_MAXSIZE?=64m
+ROOTPW_HASH?=$$6$$051DdQA7fTvLymkY$$Z5f6snVFQJKugWmGi8y0motBNaKn9em0y2K0ZsJMku3v9gkiYh8M.OTIIie3RvHpzT6udumtZUtc0kXwJcCMR1
+LOCALBASEDIR?=${BASEDIR}
+
+.if defined(LOADER_4TH)
+BOOTFILES?= defaults device.hints loader *.rc *.4th
+EFILOADER?= loader_4th.efi
+.else
+BOOTFILES?= defaults device.hints loader lua
+EFILOADER?= loader_lua.efi
+.endif
+
+#
+# Program defaults
+#
+CAT=/bin/cat
+CHFLAGS=/bin/chflags
+CHOWN=/usr/sbin/chown
+CP=/bin/cp
+DIRNAME=/usr/bin/dirname
+FIND=/usr/bin/find
+GTAR=/usr/local/bin/gtar
+GZIP=/usr/bin/gzip
+INSTALL=/usr/bin/install
+LN=/bin/ln
+LS=/bin/ls
+MAKEFS=/usr/sbin/makefs
+MKDIR=/bin/mkdir -p
+MTREE=/usr/sbin/mtree
+MV=/bin/mv
+PW=/usr/sbin/pw
+PWD=/bin/pwd
+RM=/bin/rm
+RMDIR=/bin/rmdir
+SYSCTL=/sbin/sysctl
+TAR=/usr/bin/tar
+TOUCH=/usr/bin/touch
+UNAME=/usr/bin/uname
+#
+BSDLABEL=bsdlabel
+
+#
+CURDIR!=${PWD}
+WRKDIR?=${CURDIR}/tmp
+FILESDIR=${CURDIR}/files
+TOOLSDIR=${CURDIR}/../tools
+#
+#
+DOFS=${TOOLSDIR}/doFS.sh
+BOOTMODULES=acpi ahci
+MFSMODULES=geom_mirror geom_nop opensolaris zfs ext2fs smbus ipmi ntfs nullfs tmpfs \
+ aesni crypto cryptodev geom_eli
+#
+.if defined(V)
+_v=
+VERB=1
+.else
+_v=@
+VERB=
+.endif
+
+.if !defined(ARCH)
+TARGET!= ${SYSCTL} -n hw.machine_arch
+.else
+TARGET= ${ARCH}
+.endif
+
+.if !defined(RELEASE)
+RELEASE!=${UNAME} -r
+.endif
+
+IMAGE_PREFIX=mfsbsd-mini
+
+IMAGE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.img
+ISOIMAGE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.iso
+TARFILE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.tar
+GCEFILE?= ${IMAGE_PREFIX}-${RELEASE}-${TARGET}.tar.gz
+_DISTDIR= ${WRKDIR}/dist/${RELEASE}-${TARGET}
+
+.if !defined(DEBUG)
+EXCLUDE=--exclude *.symbols
+.else
+EXCLUDE=
+.endif
+
+_ROOTDIR= ${WRKDIR}/mfs
+_BOOTDIR= ${_ROOTDIR}/boot
+_MODULESDIR= ${BASEDIR}/boot/modules
+
+all: image
+
+destdir: ${_ROOTDIR} ${_BOOTDIR}
+${_ROOTDIR}:
+ ${_v}${MKDIR} ${_ROOTDIR} && ${CHOWN} root:wheel ${_ROOTDIR}
+
+${_BOOTDIR}:
+ ${_v}${MKDIR} ${_BOOTDIR}/kernel ${_BOOTDIR}/modules && ${CHOWN} -R root:wheel ${_BOOTDIR}
+
+hierarchy: destdir ${WRKDIR}/.hierarchy_done
+${WRKDIR}/.hierarchy_done:
+ ${_v}echo -n "Creating directory hierarchy ..."
+ ${_v}${MTREE} -deU -f ${BASEDIR}/etc/mtree/BSD.root.dist -p ${_ROOTDIR} > /dev/null
+ ${_v}${MTREE} -deU -f ${BASEDIR}/etc/mtree/BSD.usr.dist -p ${_ROOTDIR}/usr > /dev/null
+ ${_v}${TOUCH} ${WRKDIR}/.hierarchy_done
+ ${_v}echo " done"
+
+installkernel: ${_BOOTDIR} ${WRKDIR}/.installkernel_done
+${WRKDIR}/.installkernel_done:
+ ${_v}echo -n "Installing kernel ..."
+ ${_v}${CP} -a ${BOOTBASE}/ ${_BOOTDIR}
+ ${_v}${TOUCH} ${WRKDIR}/.installkernel_done
+ ${_v}echo " done"
+
+rescuelinks: hierarchy ${WRKDIR}/.rescuelinks_done
+${WRKDIR}/.rescuelinks_done:
+ ${_v}echo -n "Installing rescue with linking script ..."
+ ${_v}${INSTALL} -m 0555 ${BASEDIR}/rescue/rescue ${_ROOTDIR}/rescue/rescue
+ ${_v}for FILE in `cat ${FILESDIR}/rescuelinks`; do \
+ ${LN} ${_ROOTDIR}/rescue/rescue ${_ROOTDIR}/$${FILE}; \
+ done
+ ${_v}${TOUCH} ${WRKDIR}/.rescuelinks_done
+ ${_v}echo " done"
+
+installbase: hierarchy rescuelinks ${WRKDIR}/.installbase_done
+${WRKDIR}/.installbase_done:
+ ${_v}echo -n "Installing base files ..."
+ ${_v}cd ${_ROOTDIR} && for FILE in `cat ${FILESDIR}/instfiles`; do \
+ ${CP} -pP ${BASEDIR}/$${FILE} ${_ROOTDIR}/$${FILE}; \
+ done
+ ${_v}cd ${_ROOTDIR} && for DIR in `cat ${FILESDIR}/instdirs`; do \
+ ${CP} -a ${BASEDIR}/$${DIR}/ ${_ROOTDIR}/$${DIR}; \
+ done
+ ${_v}${TOUCH} ${WRKDIR}/.installbase_done
+ ${_v}echo " done"
+
+basetar: hierarchy rescuelinks ${WRKDIR}/.basetar_done
+${WRKDIR}/.basetar_done:
+ ${_v}echo -n "Creating tar of base libraries and binaries ..."
+ ${_v}cd ${BASEDIR} && ${TAR} -cJf ${_ROOTDIR}/.mfs_base.txz \
+ `cat ${FILESDIR}/basedirs` `cat ${FILESDIR}/basefiles`
+ ${_v}${TOUCH} ${WRKDIR}/.basetar_done
+ ${_v}echo " done"
+
+localtar: hierarchy ${WRKDIR}/.localtar_done
+${WRKDIR}/.localtar_done:
+.if exists(${FILESDIR}/localfiles)
+ ${_v}echo -n "Creating local files tar ..."
+ ${_v}cd ${LOCALBASEDIR}/usr/local && ${TAR} -cJf ${_ROOTDIR}/.mfs_local.txz \
+ `cat ${FILESDIR}/localfiles`
+ ${_v}${TOUCH} ${WRKDIR}/.localtar_done
+ ${_v}echo " done"
+.endif
+
+install: installbase basetar localtar
+
+config: install ${WRKDIR}/.config_done
+${WRKDIR}/.config_done:
+ ${_v}echo -n "Installing configuration scripts and files ..."
+ ${_v}if [ -f "${CFGDIR}/loader.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf ${_BOOTDIR}/loader.conf; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf.sample ${_BOOTDIR}/loader.conf; \
+ fi
+.for FILE in rc hosts ttys resolv.conf rc.local
+ ${_v}if [ -f "${CFGDIR}/${FILE}" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE} ${_ROOTDIR}/etc/${FILE}; \
+ elif [ -f "${CFGDIR}/${FILE}.sample" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE}.sample ${_ROOTDIR}/etc/${FILE}; \
+ fi
+.endfor
+ ${_v}${MKDIR} ${_ROOTDIR}/root/bin
+.for FILE in .cshrc .profile
+ ${_v}if [ -f "${CFGDIR}/${FILE}" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE} ${_ROOTDIR}/root/${FILE}; \
+ elif [ -f "${CFGDIR}/${FILE}.sample" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/${FILE}.sample ${_ROOTDIR}/root/${FILE}; \
+ fi
+.endfor
+ ${_v}${INSTALL} ${TOOLSDIR}/zfsinstall ${_ROOTDIR}/root/bin
+ ${_v}${INSTALL} ${TOOLSDIR}/destroygeom ${_ROOTDIR}/root/bin
+ ${_v}echo "/dev/md0 / ufs rw 0 0" > ${_ROOTDIR}/etc/fstab
+ ${_v}echo "tmpfs /tmp tmpfs rw,mode=1777 0 0" >> ${_ROOTDIR}/etc/fstab
+.if defined(ROOTPW)
+ ${_v}echo '${ROOTPW}'| ${OPENSSL} passwd -6 -stdin | ${PW} -V ${_ROOTDIR}/etc usermod root -H 0
+.elif !empty(ROOTPW_HASH)
+ ${_v}echo '${ROOTPW_HASH}'| ${PW} -V ${_ROOTDIR}/etc usermod root -H 0
+.endif
+ ${_v}${TOUCH} ${WRKDIR}/.config_done
+ ${_v}echo " done"
+
+boot: installkernel install ${WRKDIR}/.boot_done
+${WRKDIR}/.boot_done:
+ ${_v}echo -n "Configuring boot environment ..."
+ ${_v}${MKDIR} ${WRKDIR}/disk/boot && ${CHOWN} root:wheel ${WRKDIR}/disk
+ ${_v}${RM} -f ${_BOOTDIR}/kernel/kernel.debug
+ ${_v}${CP} -rp ${_BOOTDIR}/kernel ${WRKDIR}/disk/boot
+.for FILE in ${BOOTFILES}
+ ${_v}${CP} -rp ${_ROOTDIR}/boot/${FILE} ${WRKDIR}/disk/boot
+.endfor
+ ${_v}${RM} -rf ${WRKDIR}/disk/boot/kernel/*.ko ${WRKDIR}/disk/boot/kernel/*.symbols
+.if defined(DEBUG)
+ ${_v}test -f ${_BOOTDIR}/kernel/kernel.symbols \
+ && ${INSTALL} -m 0555 ${_BOOTDIR}/kernel/kernel.symbols ${WRKDIR}/disk/boot/kernel >/dev/null 2>/dev/null || exit 0
+.endif
+.for FILE in ${BOOTMODULES}
+ ${_v}test -f ${_BOOTDIR}/kernel/${FILE}.ko \
+ && ${INSTALL} -m 0555 ${_BOOTDIR}/kernel/${FILE}.ko ${WRKDIR}/disk/boot/kernel >/dev/null 2>/dev/null || exit 0
+. if defined(DEBUG)
+ ${_v}test -f ${_BOOTDIR}/kernel/${FILE}.ko \
+ && ${INSTALL} -m 0555 ${_BOOTDIR}/kernel/${FILE}.ko.symbols ${WRKDIR}/disk/boot/kernel >/dev/null 2>/dev/null || exit 0
+. endif
+.endfor
+ ${_v}${MKDIR} ${_ROOTDIR}/boot/modules
+.for FILE in ${MFSMODULES}
+ ${_v}test -f ${_MODULESDIR}/${FILE}.ko \
+ && ${INSTALL} -m 0555 ${_MODULESDIR}/${FILE}.ko ${_ROOTDIR}/boot/modules >/dev/null 2>/dev/null || exit 0
+. if defined(DEBUG)
+ ${_v}test -f ${_MODULESDIR}/${FILE}.ko.symbols \
+ && ${INSTALL} -m 0555 ${_MODULESDIR}/${FILE}.ko.symbols ${_ROOTDIR}/boot/modules >/dev/null 2>/dev/null || exit 0
+. endif
+.endfor
+ ${_v}${RM} -rf ${_BOOTDIR}/kernel ${_BOOTDIR}/*.symbols
+ ${_v}${TOUCH} ${WRKDIR}/.boot_done
+ ${_v}echo " done"
+
+efiboot: boot ${WRKDIR}/.efiboot_done
+${WRKDIR}/.efiboot_done:
+.if !defined(NO_EFIBOOT)
+ @echo -n "Creating EFI boot image ..."
+ ${_v}${MKDIR} -p ${WRKDIR}/efiroot/EFI/BOOT ${WRKDIR}/cdboot
+ ${_v}${CP} ${CDBOOTBASE}/${EFILOADER} ${WRKDIR}/efiroot/EFI/BOOT/BOOTX64.efi
+ ${_v}${MAKEFS} -t msdos -s 2048k -o fat_type=12,sectors_per_cluster=1 ${WRKDIR}/cdboot/efiboot.img ${WRKDIR}/efiroot
+ ${_v}${TOUCH} ${WRKDIR}/.efiboot_done
+ @echo " done"
+.endif
+
+boottar: boot ${WRKDIR}/.boottar_done
+${WRKDIR}/.boottar_done:
+ ${_v}echo -n "Compressing mfsroot boot ..."
+ ${_v}${TAR} -c -J -C ${_ROOTDIR} -f ${_ROOTDIR}/.mfs_boot.txz boot
+ ${_v}cd ${_ROOTDIR} && ${RM} -rf boot
+ ${_v}${TOUCH} ${WRKDIR}/.boottar_done
+ ${_v}echo " done"
+
+mfsroot: boottar ${WRKDIR}/.mfsroot_done
+${WRKDIR}/.mfsroot_done:
+ ${_v}echo -n "Creating and compressing mfsroot ..."
+ ${_v}${MKDIR} ${WRKDIR}/mnt
+ ${_v}${MAKEFS} -t ffs -M ${MFSROOT_MINSIZE} -m ${MFSROOT_MAXSIZE} -f ${MFSROOT_FREE_INODES} -b ${MFSROOT_FREE_BLOCKS} ${WRKDIR}/disk/mfsroot ${_ROOTDIR} > /dev/null
+ ${_v}${RM} -rf ${WRKDIR}/mnt
+ ${_v}${GZIP} -9 -f ${WRKDIR}/disk/mfsroot
+ ${_v}${GZIP} -9 -f ${WRKDIR}/disk/boot/kernel/kernel
+ ${_v}if [ -f "${CFGDIR}/loader.conf" ]; then \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf ${WRKDIR}/disk/boot/loader.conf; \
+ else \
+ ${INSTALL} -m 0644 ${CFGDIR}/loader.conf.sample ${WRKDIR}/disk/boot/loader.conf; \
+ fi
+ ${_v}${TOUCH} ${WRKDIR}/.mfsroot_done
+ ${_v}echo " done"
+
+image: install config boot mfsroot ${IMAGE}
+${IMAGE}:
+ @echo -n "Creating image file ..."
+.if defined(BSDPART)
+ ${_v}${MKDIR} ${WRKDIR}/mnt ${WRKDIR}/trees/base/boot
+ ${_v}${INSTALL} -m 0444 ${WRKDIR}/disk/boot/boot ${WRKDIR}/trees/base/boot/
+ ${_v}${DOFS} ${BSDLABEL} "" ${WRKDIR}/disk.img ${WRKDIR} ${WRKDIR}/mnt 0 ${WRKDIR}/disk 80000 auto > /dev/null 2> /dev/null
+ ${_v}${RM} -rf ${WRKDIR}/mnt ${WRKDIR}/trees
+ ${_v}${MV} ${WRKDIR}/disk.img ${.TARGET}
+.else
+ ${_v}${TOOLSDIR}/do_gpt.sh ${.TARGET} ${WRKDIR}/disk 0 ${BASEDIR}/boot ${WRKDIR}/cdboot/efiboot.img ${VERB}
+.endif
+ @echo " done"
+ ${_v}${LS} -l ${.TARGET}
+
+gce: install config boot mfsroot ${IMAGE} ${GCEFILE}
+${GCEFILE}:
+ ${_v}echo -n "Creating GCE-compatible tarball..."
+.if !exists(${GTAR})
+ ${_v}echo "${GTAR} is missing, please install archivers/gtar first"; exit 1
+.else
+ ${_v}${GTAR} -C ${CURDIR} -Szcf ${GCEFILE} --transform='s/${IMAGE}/disk.raw/' ${IMAGE}
+ ${_v}echo " GCE tarball built"
+ ${_v}${LS} -l ${GCEFILE}
+.endif
+
+iso: install config boot efiboot mfsroot ${ISOIMAGE}
+${ISOIMAGE}:
+ ${_v}echo -n "Creating ISO image ..."
+.if !defined(NO_EFIBOOT)
+ ${_v}${MAKEFS} -t cd9660 -o rockridge,label=mfsBSD \
+ -o bootimage=i386\;${CDBOOTBASE}/cdboot,no-emul-boot \
+ -o bootimage=i386\;${WRKDIR}/cdboot/efiboot.img,no-emul-boot,platformid=efi \
+ ${ISOIMAGE} ${WRKDIR}/disk
+.else
+ ${_v}${MAKEFS} -t cd9660 -o rockridge,label=mfsBSD \
+ -o bootimage=i386\;${CDBOOTBASE}/cdboot,no-emul-boot \
+ ${ISOIMAGE} ${WRKDIR}/disk
+.endif
+ ${_v}echo " done"
+ ${_v}${LS} -l ${ISOIMAGE}
+
+tar: install config boot mfsroot ${TARFILE}
+${TARFILE}:
+ ${_v}echo -n "Creating tar file ..."
+ ${_v}cd ${WRKDIR}/disk && ${FIND} . -depth 1 \
+ -exec ${TAR} -r -f ${CURDIR}/${TARFILE} {} \;
+ ${_v}echo " done"
+ ${_v}${LS} -l ${TARFILE}
+
+clean:
+ ${_v}if [ -d ${WRKDIR} ]; then \
+ ${CHFLAGS} -R noschg ${WRKDIR} && \
+ cd ${WRKDIR} && ${RM} -rf mfs mnt disk dist trees efiroot cdboot .*_done; \
+ fi
diff --git a/contrib/mfsbsd/mini/README.md b/contrib/mfsbsd/mini/README.md
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/README.md
@@ -0,0 +1,19 @@
+# mfsBSD-mini
+
+Copyright (c) 2019 Martin Matuska <mm at FreeBSD.org>
+
+## Description
+
+This is a set of scripts that generates a small bootable image, ISO file or
+tar archive from a installed FreeBSD system. The image gets completely loaded
+into memory.
+
+The image may be written directly using dd(1) onto any bootable block device,
+e.g. a hard disk or a USB stick e.g. /dev/da0, or a bootable partition only,
+e.g. /dev/ada0p2
+
+## Building
+
+You need to do "make prepare-mini" in the main mfsBSD directory
+
+Project homepage: http://mfsbsd.vx.sk
diff --git a/contrib/mfsbsd/mini/conf/.cshrc.sample b/contrib/mfsbsd/mini/conf/.cshrc.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/.cshrc.sample
@@ -0,0 +1,43 @@
+# $FreeBSD: releng/10.1/etc/root/dot.cshrc 243893 2012-12-05 13:56:39Z eadler $
+#
+# .cshrc - csh resource script, read at beginning of execution by each shell
+#
+# see also csh(1), environ(7).
+# more examples available at /usr/share/examples/csh/
+#
+
+alias h history 25
+alias j jobs -l
+alias la ls -aF
+alias lf ls -FA
+alias ll ls -lAF
+
+# A righteous umask
+umask 22
+
+set path = (/sbin /bin /usr/sbin /usr/bin /usr/games /usr/local/sbin /usr/local/bin $HOME/bin)
+
+setenv EDITOR vi
+setenv PAGER more
+setenv BLOCKSIZE K
+
+if ($?prompt) then
+ # An interactive shell -- set some stuff up
+ set prompt = "%N@%m:%~ %# "
+ set promptchars = "%#"
+
+ set filec
+ set history = 1000
+ set savehist = (1000 merge)
+ set autolist = ambiguous
+ # Use history to aid expansion
+ set autoexpand
+ set autorehash
+ set mail = (/var/mail/$USER)
+ if ( $?tcsh ) then
+ bindkey "^W" backward-delete-word
+ bindkey -k up history-search-backward
+ bindkey -k down history-search-forward
+ endif
+
+endif
diff --git a/contrib/mfsbsd/mini/conf/.profile.sample b/contrib/mfsbsd/mini/conf/.profile.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/.profile.sample
@@ -0,0 +1,10 @@
+# $FreeBSD: releng/10.1/etc/root/dot.profile 199243 2009-11-13 05:54:55Z ed $
+#
+PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:~/bin
+export PATH
+HOME=/root
+export HOME
+TERM=${TERM:-xterm}
+export TERM
+PAGER=more
+export PAGER
diff --git a/contrib/mfsbsd/mini/conf/hosts.sample b/contrib/mfsbsd/mini/conf/hosts.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/hosts.sample
@@ -0,0 +1,6 @@
+# $Id$
+#
+# The file will be the /etc/hosts file in your image
+#
+::1 localhost localhost.my.domain
+127.0.0.1 localhost localhost.my.domain
diff --git a/contrib/mfsbsd/mini/conf/loader.conf.sample b/contrib/mfsbsd/mini/conf/loader.conf.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/loader.conf.sample
@@ -0,0 +1,4 @@
+mfs_load="YES"
+mfs_type="mfs_root"
+mfs_name="/mfsroot"
+vfs.root.mountfrom="ufs:/dev/md0"
diff --git a/contrib/mfsbsd/mini/conf/rc.local b/contrib/mfsbsd/mini/conf/rc.local
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/rc.local
@@ -0,0 +1,6 @@
+#!/bin/sh
+ldconfig /usr/local/lib
+ln -s /usr/local/bin/dbclient /usr/bin/dbclient
+ln -s /usr/local/bin/dbclient /usr/local/bin/ssh
+mkdir -p /usr/local/etc/dropbear
+/usr/local/sbin/dropbear -R
diff --git a/contrib/mfsbsd/mini/conf/rc.sample b/contrib/mfsbsd/mini/conf/rc.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/rc.sample
@@ -0,0 +1,40 @@
+#!/bin/sh
+HOME=/
+PATH=/sbin:/bin/:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
+export HOME PATH
+
+# REMOUT ROOT
+mount -uw /
+
+# EXTRACT BOOT
+tar -x -J -C / -f /.mfs_boot.txz
+
+# MOUNT TMPFS FILESYSTEMS
+mount -t tmpfs tmpfs /tmp
+mount -t tmpfs tmpfs /var
+mount -t tmpfs tmpfs /usr/local
+
+# EXTRACT BASE and LOCAL
+tar -x -J -C / -f /.mfs_base.txz
+[ -f /.mfs_local.txz ] && tar -x -J -C /usr/local -f /.mfs_local.txz
+
+# VAR
+mtree -deU -f /etc/mtree/BSD.var.dist -p /var > /dev/null
+touch /var/log/utx.lastlogin /var/log/utx.log
+cap_mkdb -f /tmp/termcap /etc/termcap.small
+
+# NETWORKING
+ifconfig lo0 inet 127.0.0.1/8
+for i in `ifconfig -l`; do
+ if [ "$i" != "lo0" ]; then
+ dhclient $i
+ fi
+done
+hostname mfsbsd
+
+# SERVERS
+newsyslog -C
+syslogd -s
+
+# LOCAL
+[ -f /etc/rc.local ] && . /etc/rc.local
diff --git a/contrib/mfsbsd/mini/conf/ttys.sample b/contrib/mfsbsd/mini/conf/ttys.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/conf/ttys.sample
@@ -0,0 +1,22 @@
+# $FreeBSD$
+#
+console none unknown off secure
+#
+ttyv0 "/usr/libexec/getty Pc" xterm on secure
+# Virtual terminals
+ttyv1 "/usr/libexec/getty Pc" xterm off secure
+ttyv2 "/usr/libexec/getty Pc" xterm off secure
+ttyv3 "/usr/libexec/getty Pc" xterm off secure
+ttyv4 "/usr/libexec/getty Pc" xterm off secure
+ttyv5 "/usr/libexec/getty Pc" xterm off secure
+ttyv6 "/usr/libexec/getty Pc" xterm off secure
+ttyv7 "/usr/libexec/getty Pc" xterm off secure
+ttyv8 "/usr/local/bin/xdm -nodaemon" xterm off secure
+# Serial terminals
+# The 'dialup' keyword identifies dialin lines to login, fingerd etc.
+ttyu0 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu1 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu2 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+ttyu3 "/usr/libexec/getty 3wire" vt100 onifconsole secure
+# Dumb console
+dcons "/usr/libexec/getty std.9600" vt100 off secure
diff --git a/contrib/mfsbsd/mini/files/basedirs b/contrib/mfsbsd/mini/files/basedirs
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/basedirs
@@ -0,0 +1,9 @@
+lib/geom
+libexec
+usr/libexec/bsdconfig
+usr/libexec/bsdinstall
+usr/share/bsdconfig
+usr/share/locale/C.UTF-8
+usr/share/locale/en_US.UTF-8
+usr/share/syscons
+usr/share/zoneinfo
diff --git a/contrib/mfsbsd/mini/files/basefiles b/contrib/mfsbsd/mini/files/basefiles
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/basefiles
@@ -0,0 +1,154 @@
+bin/domainname
+bin/sleep
+sbin/dhclient-script
+sbin/geli
+sbin/gnop
+sbin/poweroff
+sbin/resolvconf
+sbin/rmd160
+sbin/sha1
+sbin/sha256
+sbin/sha512
+sbin/shutdown
+lib/casper/libcap_dns.so*
+lib/casper/libcap_fileargs.so*
+lib/libalias*
+lib/libbegemot.so*
+lib/libbsdxml.so*
+lib/libc.so*
+lib/libcam.so*
+lib/libcasper.so*
+lib/libcrypt.so*
+lib/libcrypto.so*
+lib/libctf.so*
+lib/libcxxrt.so*
+lib/libdevstat.so*
+lib/libedit.so*
+lib/libelf.so*
+lib/libgcc_s.so*
+lib/libgeom.so*
+lib/libibverbs.so*
+lib/libipsec.so*
+lib/libjail.so*
+lib/libkiconv.so*
+lib/libkvm.so*
+lib/libm.so*
+lib/libmd.so*
+lib/libmlx5.so*
+lib/libncursesw.so*
+lib/libnv.so*
+lib/libpcap.so*
+lib/libsbuf.so*
+lib/libssp.so*
+lib/libthr.so*
+lib/libufs.so*
+lib/libulog.so*
+lib/libutil.so*
+lib/libxo.so*
+lib/libz.so*
+usr/bin/awk
+usr/bin/basename
+usr/bin/bc
+usr/bin/cap_mkdb
+usr/bin/cut
+usr/bin/dc
+usr/bin/b64decode
+usr/bin/b64encode
+usr/bin/dialog
+usr/bin/dirname
+usr/bin/du
+usr/bin/false
+usr/bin/fetch
+usr/bin/file
+usr/bin/find
+usr/bin/grep
+usr/bin/last
+usr/bin/ldd
+usr/bin/login
+usr/bin/openssl
+usr/bin/passwd
+usr/bin/sort
+usr/bin/top
+usr/bin/touch
+usr/bin/true
+usr/bin/uname
+usr/bin/uniq
+usr/bin/uptime
+usr/bin/uudecode
+usr/bin/uuencode
+usr/bin/w
+usr/bin/wall
+usr/bin/wc
+usr/bin/which
+usr/bin/who
+usr/bin/xargs
+usr/lib/libarchive.so*
+usr/lib/libbsm.so*
+usr/lib/libbz2.so*
+usr/lib/libc++.so*
+usr/lib/libcap_dns.so*
+usr/lib/libcap_fileargs.so*
+usr/lib/libdialog.so*
+usr/lib/libdevctl.so*
+usr/lib/libdevinfo.so*
+usr/lib/libfetch.so*
+usr/lib/liblzma.so*
+usr/lib/libmagic.so*
+usr/lib/libopie.so*
+usr/lib/libpam.so*
+usr/lib/libregex.so*
+usr/lib/librt.so*
+usr/lib/libssl.so*
+usr/lib/libusb.so*
+usr/lib/libypclnt.so*
+usr/lib/pam_deny.so*
+usr/lib/pam_group.so*
+usr/lib/pam_lastlog.so*
+usr/lib/pam_login_access.so*
+usr/lib/pam_nologin.so*
+usr/lib/pam_opie.so*
+usr/lib/pam_opieaccess.so*
+usr/lib/pam_permit.so*
+usr/lib/pam_rootok.so*
+usr/lib/pam_securetty.so*
+usr/lib/pam_self.so*
+usr/lib/pam_unix.so*
+usr/libexec/getty
+usr/sbin/acpidump
+usr/sbin/arp
+usr/sbin/bsdconfig
+usr/sbin/bsdinstall
+usr/sbin/boot0cfg
+usr/sbin/cpucontrol
+usr/sbin/cron
+usr/sbin/daemon
+usr/sbin/devctl
+usr/sbin/devinfo
+usr/sbin/diskinfo
+usr/sbin/getextattr
+usr/sbin/gstat
+usr/sbin/jail
+usr/sbin/jexec
+usr/sbin/jls
+usr/sbin/lsextattr
+usr/sbin/mtree
+usr/sbin/newsyslog
+usr/sbin/ntpdate
+usr/sbin/pciconf
+usr/sbin/pw
+usr/sbin/pwd_mkdb
+usr/sbin/rmextattr
+usr/sbin/sade
+usr/sbin/setextattr
+usr/sbin/syslogd
+usr/sbin/tcpdump
+usr/sbin/traceroute
+usr/sbin/traceroute6
+usr/sbin/trim
+usr/sbin/tzsetup
+usr/sbin/usbconfig
+usr/sbin/usbdump
+usr/share/misc/iso3166
+usr/share/misc/termcap
+usr/share/misc/magic
+usr/share/misc/magic.mgc
diff --git a/contrib/mfsbsd/mini/files/instdirs b/contrib/mfsbsd/mini/files/instdirs
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/instdirs
@@ -0,0 +1,2 @@
+etc/pam.d
+etc/security
diff --git a/contrib/mfsbsd/mini/files/instfiles b/contrib/mfsbsd/mini/files/instfiles
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/instfiles
@@ -0,0 +1,16 @@
+etc/crontab
+etc/gettytab
+etc/group
+etc/hosts
+etc/login.conf
+etc/master.passwd
+etc/mtree/BSD.var.dist
+etc/newsyslog.conf
+etc/nsswitch.conf
+etc/passwd
+etc/pwd.db
+etc/services
+etc/spwd.db
+etc/syslog.conf
+etc/termcap.small
+etc/ttys
diff --git a/contrib/mfsbsd/mini/files/localfiles b/contrib/mfsbsd/mini/files/localfiles
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/localfiles
@@ -0,0 +1,20 @@
+bin/cpdup
+bin/dbclient
+bin/dbscp
+bin/dropbearconvert
+bin/dropbearkey
+bin/ipmitool
+bin/rsync
+bin/nano
+bin/tmux
+lib/libevent-2.1.so*
+lib/libiconv.so.*
+lib/libintl.so.*
+lib/liblz4.so.*
+lib/libreadline.so.*
+lib/libutf8proc.so.*
+lib/libxxhash.so.*
+lib/libzstd.so.*
+sbin/dropbear
+sbin/dmidecode
+sbin/smartctl
diff --git a/contrib/mfsbsd/mini/files/rescuelinks b/contrib/mfsbsd/mini/files/rescuelinks
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/mini/files/rescuelinks
@@ -0,0 +1,140 @@
+rescue/sh
+bin/ln
+bin/sh
+bin/[
+bin/cat
+bin/chflags
+bin/chio
+bin/chmod
+bin/cp
+bin/csh
+bin/date
+bin/dd
+bin/df
+bin/echo
+bin/ed
+bin/expr
+bin/getfacl
+bin/hostname
+bin/kenv
+bin/kill
+bin/link
+bin/ls
+bin/mkdir
+bin/mv
+bin/pgrep
+bin/pkill
+bin/ps
+bin/pwd
+bin/rcp
+bin/realpath
+bin/red
+bin/rm
+bin/rmdir
+bin/setfacl
+bin/stty
+bin/sync
+bin/tcsh
+bin/test
+bin/unlink
+sbin/atmconfig
+sbin/badsect
+sbin/bsdlabel
+sbin/camcontrol
+sbin/ccdconfig
+sbin/clri
+sbin/devfs
+sbin/dhclient
+sbin/disklabel
+sbin/dmesg
+sbin/dump
+sbin/dumpfs
+sbin/dumpon
+sbin/fastboot
+sbin/fasthalt
+sbin/fdisk
+sbin/fsck
+sbin/fsck_4.2bsd
+sbin/fsck_ffs
+sbin/fsck_msdosfs
+sbin/fsck_ufs
+sbin/fsdb
+sbin/fsirand
+sbin/gbde
+sbin/geom
+sbin/glabel
+sbin/gpart
+sbin/halt
+sbin/ifconfig
+sbin/init
+sbin/ipf
+sbin/kldconfig
+sbin/kldload
+sbin/kldstat
+sbin/kldunload
+sbin/ldconfig
+sbin/md5
+sbin/mdconfig
+sbin/mdmfs
+sbin/mknod
+sbin/mount
+sbin/mount_cd9660
+sbin/mount_msdosfs
+sbin/mount_nfs
+sbin/mount_nullfs
+sbin/mount_udf
+sbin/mount_unionfs
+sbin/newfs
+sbin/newfs_msdos
+sbin/nextboot
+sbin/nos-tun
+sbin/ping
+sbin/ping6
+sbin/rcorder
+sbin/rdump
+sbin/reboot
+sbin/restore
+sbin/route
+sbin/routed
+sbin/rrestore
+sbin/rtquery
+sbin/rtsol
+sbin/savecore
+sbin/spppcontrol
+sbin/swapon
+sbin/sysctl
+sbin/tunefs
+sbin/umount
+sbin/zfs
+sbin/zpool
+usr/bin/bunzip2
+usr/bin/bzcat
+usr/bin/bzip2
+usr/bin/chgrp
+usr/bin/ex
+usr/bin/groups
+usr/bin/gunzip
+usr/bin/gzcat
+usr/bin/gzip
+usr/bin/head
+usr/bin/id
+usr/bin/less
+usr/bin/lzcat
+usr/bin/lzma
+usr/bin/more
+usr/bin/mt
+usr/bin/nc
+usr/bin/sed
+usr/bin/tail
+usr/bin/tar
+usr/bin/tee
+usr/bin/unlzma
+usr/bin/unxz
+usr/bin/vi
+usr/bin/whoami
+usr/bin/xz
+usr/bin/xzcat
+usr/bin/zcat
+usr/sbin/chown
+usr/sbin/chroot
+usr/sbin/zdb
diff --git a/contrib/mfsbsd/scripts/interfaces b/contrib/mfsbsd/scripts/interfaces
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/scripts/interfaces
@@ -0,0 +1,38 @@
+#!/bin/sh
+# $Id$
+
+# PROVIDE: interfaces
+# BEFORE: NETWORKING netif
+# REQUIRE: mdinit mfsbsd
+# KEYWORD: FreeBSD
+
+. /etc/rc.subr
+
+name="interfaces"
+start_cmd="interfaces_start"
+stop_cmd=":"
+
+interfaces_start()
+{
+ if [ -z "${mac_interfaces}" ]; then
+ exit 0
+ fi
+ for if in ${mac_interfaces}; do
+ _cmac=`eval echo "\\$ifconfig_${if}_mac"`
+ if [ -n "$_cmac" ]; then
+ _dif=`/sbin/ifconfig -l | /usr/bin/sed -E 's/lo[0-9]+//g'`
+ for i in $_dif; do
+ _mac=`/sbin/ifconfig $i | /usr/bin/grep ether | /usr/bin/awk '{ print $2 }'`
+ if [ "$_mac" = "$_cmac" ]; then
+ _cif=`eval echo "\\$ifconfig_${if}"`
+ if [ -n "$_cif" ]; then
+ echo "ifconfig_$i=\"${_cif}\"" >> /etc/rc.conf.d/network
+ fi
+ fi
+ done
+ fi
+ done
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/contrib/mfsbsd/scripts/mdinit b/contrib/mfsbsd/scripts/mdinit
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/scripts/mdinit
@@ -0,0 +1,36 @@
+#!/bin/sh
+# $Id$
+
+# PROVIDE: mdinit
+# BEFORE: FILESYSTEMS
+# REQUIRE: mountcritlocal
+# KEYWORD: FreeBSD
+
+. /etc/rc.subr
+
+name="mdinit"
+start_cmd="mdinit_start"
+stop_cmd=":"
+
+mdinit_start()
+{
+ if [ -f /.usr.tar.xz ]; then
+ /sbin/mount -t tmpfs tmpfs /usr
+ /rescue/xz -d -c /.usr.tar.xz | /rescue/tar -x -C / -f -
+ elif [ -f /.usr.tar.bz2 ]; then
+ /sbin/mount -t tmpfs tmpfs /usr
+ /rescue/bzip2 -d -c /.usr.tar.bz2 | /rescue/tar -x -C / -f -
+ elif [ -f /.usr.tar.gz ]; then
+ /sbin/mount -t tmpfs tmpfs /usr
+ /rescue/gzip -d -c /.usr.tar.gz | /rescue/tar -x -C / -f -
+ fi
+ # Check if we are using roothack
+ if ! /sbin/mount -t tmpfs | /usr/bin/grep -q " /rw "; then
+ /sbin/mount -t tmpfs tmpfs /var/db/pkg
+ mkdir -p /var/cache/pkg
+ /sbin/mount -t tmpfs tmpfs /var/cache/pkg
+ fi
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/contrib/mfsbsd/scripts/mfsbsd b/contrib/mfsbsd/scripts/mfsbsd
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/scripts/mfsbsd
@@ -0,0 +1,87 @@
+#!/bin/sh
+# $Id$
+
+# PROVIDE: mfsbsd
+# BEFORE: NETWORKING netif routing hostname
+# REQUIRE: mountcritlocal mdinit
+# KEYWORD: FreeBSD
+
+. /etc/rc.subr
+
+name="mfsbsd"
+start_cmd="mfsbsd_start"
+stop_cmd=":"
+
+mfsbsd_start()
+{
+ _hn=`/bin/kenv -q mfsbsd.hostname`
+ _clif=`/bin/kenv -q mfsbsd.cloned_interfaces`
+ _mif=`/bin/kenv -q mfsbsd.mac_interfaces`
+ _dhcp=`/bin/kenv -q mfsbsd.autodhcp`
+ _if=`/bin/kenv -q mfsbsd.interfaces`
+ _dr=`/bin/kenv -q mfsbsd.defaultrouter`
+ _sr=`/bin/kenv -q mfsbsd.static_routes`
+ _ns=`/bin/kenv -q mfsbsd.nameservers`
+ _rootpw=`/bin/kenv -q mfsbsd.rootpw`
+ _rootpwhash=`/bin/kenv -q mfsbsd.rootpwhash`
+ if [ -n "$_hn" ]; then
+ echo "hostname=\"$_hn\"" >> /etc/rc.conf.d/hostname
+ fi
+ if [ -n "$_clif" ]; then
+ echo "cloned_interfaces=\"$_clif\"" >> /etc/rc.conf.d/network
+ fi
+ if [ -n "$_mif" ]; then
+ echo "mac_interfaces=\"$_mif\"" >> /etc/rc.conf.d/interfaces
+ for i in $_mif; do
+ _mac=`/bin/kenv mfsbsd.ifconfig_${i}_mac`
+ if [ -n "$_mac" ]; then
+ echo "ifconfig_${i}_mac=\"$_mac\"" >> /etc/rc.conf.d/interfaces
+ fi
+ _config=`/bin/kenv mfsbsd.ifconfig_$i`
+ if [ -n "$_config" ]; then
+ echo "ifconfig_$i=\"$_config\"" >> /etc/rc.conf.d/interfaces
+ fi
+ done
+ fi
+ if [ -n "$_dhcp" ]; then
+ if `checkyesno _dhcp`; then
+ _dif=`/sbin/ifconfig -l | /usr/bin/sed -E 's/lo[0-9]+//g'`
+ for i in $_dif; do
+ echo "ifconfig_$i=\"DHCP\"" >> /etc/rc.conf.d/network
+ done
+ fi
+ fi
+ for i in $_if $_mif $_clif; do
+ _config=`/bin/kenv mfsbsd.ifconfig_$i`
+ if [ -n "$_config" ]; then
+ echo "ifconfig_$i=\"$_config\"" >> /etc/rc.conf.d/network
+ fi
+ done
+ if [ -n "$_dr" ]; then
+ echo "defaultrouter=\"$_dr\"" >> /etc/rc.conf.d/routing
+ fi
+ if [ -n "$_sr" ]; then
+ echo "static_routes=\"$_sr\"" >> /etc/rc.conf.d/routing
+ for i in $_sr; do
+ _config=`/bin/kenv mfsbsd.route_$i`
+ if [ -n "$_config" ]; then
+ echo "route_$i=\"$_config\"" >> /etc/rc.conf.d/routing
+ fi
+ done
+ fi
+ if [ -n "$_rootpw" ]; then
+ echo $_rootpw | /usr/sbin/pw usermod root -h 0
+ /bin/kenv -u mfsbsd.rootpw
+ elif [ -n "$_rootpwhash" ]; then
+ echo $_rootpwhash | /usr/bin/sed -e 's,%,$,g' | /usr/sbin/pw usermod root -H 0
+ /bin/kenv -u mfsbsd.rootpwhash
+ fi
+ if [ -n "$_ns" ]; then
+ for n in $_ns; do
+ echo "nameserver $n" >> /etc/resolv.conf
+ done
+ fi
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/contrib/mfsbsd/scripts/packages b/contrib/mfsbsd/scripts/packages
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/scripts/packages
@@ -0,0 +1,27 @@
+#!/bin/sh
+# $Id$
+
+# PROVIDE: packages
+# BEFORE: LOGIN
+# REQUIRE: mdinit tmp var
+# KEYWORD: FreeBSD
+
+. /etc/rc.subr
+
+name="packages"
+start_cmd="packages_start"
+stop_cmd=":"
+
+packages_start()
+{
+ PACKAGES=`/bin/ls -1 /packages/*.t?z 2>/dev/null`
+ if /bin/test -n "$PACKAGES"; then
+ MD=`/sbin/mdconfig -a -t swap -s 64m`
+ /sbin/newfs -U /dev/$MD
+ /sbin/mount /dev/$MD /usr/local
+ cd /packages && /usr/sbin/pkg_add *.t?z > /dev/null 2> /dev/null
+ fi
+}
+
+load_rc_config $name
+run_rc_command "$1"
diff --git a/contrib/mfsbsd/tools/destroygeom b/contrib/mfsbsd/tools/destroygeom
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/tools/destroygeom
@@ -0,0 +1,81 @@
+#!/bin/sh
+# $Id$
+#
+# mfsBSD ZFS pool and geom partition deleting
+#
+# Copyright (c) 2010-2011 Georges Discry <murmex at gathex.net>
+# Copyright (c) 2018 Martin Matuska <mm at FreeBSD.org>
+
+usage () {
+ echo "Usage: $0 [-h] -d geom [-d geom ...] [-p zpool ...]"
+}
+
+help () {
+ echo; echo "Destroy all partitions on geom provider(s)"
+ echo; echo "Required flags:"
+ echo "-d geom : geom provider(s) to clear"
+ echo;echo "Optional flags:"
+ echo "-p zpool : zpool(s) installed on the geom providers to clear"
+ echo;echo "Examples:"
+ echo "Destroy all partitions on ad4 and ad6:"
+ echo "$0 -d ad4 -d ad6"
+ echo "Destroy ZFS pool tank and all partitions on ada0:"
+ echo "$0 -p tank -d ada0"
+}
+
+while getopts d:p:h o; do
+ case "$o" in
+ d) DEVS="$DEVS ${OPTARG##/dev/}" ;;
+ p) POOLS="$POOLS ${OPTARG}" ;;
+ h) help; exit 1;;
+ [?]) usage; exit 1;;
+ esac
+done
+
+if [ -z "$DEVS" ]; then
+ usage
+ exit 1
+fi
+
+
+for DEV in ${DEVS}; do
+ if ! [ -c "/dev/${DEV}" ]; then
+ echo "error: /dev/${DEV} is not a block device"
+ exit 1
+ fi
+done
+
+for POOL in ${POOLS}; do
+ if ! /sbin/zpool list -H ${POOL} > /dev/null 2> /dev/null; then
+ echo "warning: pool does not exist"
+ continue
+ fi
+
+ echo -n "Destroying ZFS pool ${POOL} ..."
+ if ! /sbin/zpool destroy -f ${POOL} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo " done"
+done
+
+
+for DEV in ${DEVS}; do
+ GEOMS=`/sbin/gpart show | /usr/bin/tail -r | /usr/bin/grep '=>' | /usr/bin/awk '{print $4}' | /usr/bin/grep "^${DEV}" | /usr/bin/uniq`
+ for GEOM in ${GEOMS}; do
+ echo "Destroying geom ${GEOM}:"
+ PARTS=`/sbin/gpart show ${GEOM} | /usr/bin/grep -v '=>\|- free -' | /usr/bin/awk '{if ($3 ~ /[0-9]+/) print $3}' | /usr/bin/sort -n | /usr/bin/uniq`
+ for PART in ${PARTS}; do
+ echo -n " Deleting partition ${PART} ..."
+ if ! /sbin/gpart delete -i${PART} ${GEOM} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo " done"
+ done
+ if ! /sbin/gpart destroy ${GEOM} > /dev/null 2> /dev/null; then
+ echo "error: could not destroy geom ${GEOM}"
+ exit 1
+ fi
+ done
+done
diff --git a/contrib/mfsbsd/tools/doFS.sh b/contrib/mfsbsd/tools/doFS.sh
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/tools/doFS.sh
@@ -0,0 +1,126 @@
+#!/bin/sh
+#
+# $FreeBSD: src/release/scripts/doFS.sh,v 1.60 2004/08/25 01:39:52 kensmith Exp $
+#
+
+set -ex
+
+export BLOCKSIZE=512
+
+DISKLABEL=$1; shift
+MACHINE=${1:+"-m $1"}; shift
+FSIMG=$1; shift
+RD=$1 ; shift
+MNT=$1 ; shift
+FSSIZE=$1 ; shift
+FSPROTO=$1 ; shift
+FSINODE=$1 ; shift
+FSLABEL=$1 ; shift
+
+#
+# If we've been told to, compute the required file system size
+# and average inode size automatically.
+#
+if [ ${FSSIZE} -eq 0 -a ${FSLABEL} = "auto" ]; then
+ roundup() echo $((($1+$2-1)-($1+$2-1)%$2))
+ nf=$(find ${FSPROTO} |wc -l)
+ sk=$(du -skA ${FSPROTO} |cut -f1)
+ FSINODE=$(roundup $(($sk*1024/$nf)) ${FSINODE})
+ FSSIZE=$(roundup $(($sk*12/10)) 1024)
+fi
+
+dofs_vn () {
+ if [ "x$VNDEVICE" = "x" ] ; then
+ VNDEVICE=vn0
+ fi
+ u=`expr $VNDEVICE : 'vn\([0-9]*\)' || true`
+ VNDEVICE=vnn$u
+
+ rm -f /dev/*vnn*
+ mknod /dev/rvnn${u} c 43 `expr 65538 + $u '*' 8`
+ mknod /dev/rvnn${u}a c 43 `expr 2 + $u '*' 8`
+ mknod /dev/vnn${u} b 15 `expr 65538 + $u '*' 8`
+ mknod /dev/vnn${u}a b 15 `expr 2 + $u '*' 8`
+
+ umount /dev/${VNDEVICE} 2>/dev/null || true
+ umount ${MNT} 2>/dev/null || true
+ vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
+
+ vnconfig -s labels -c /dev/r${VNDEVICE} ${FSIMG}
+
+ trap "umount ${MNT}; vnconfig -u /dev/r${VNDEVICE}; rm -f /dev/*vnn*" EXIT
+
+ disklabel -w ${BOOT} ${VNDEVICE} ${FSLABEL}
+ newfs -i ${FSINODE} -o space -m 0 /dev/r${VNDEVICE}a
+
+ mount -o async /dev/${VNDEVICE}a ${MNT}
+}
+
+dofs_md () {
+ if [ "x${MDDEVICE}" != "x" ] ; then
+ umount /dev/${MDDEVICE} 2>/dev/null || true
+ umount ${MNT} 2>/dev/null || true
+ mdconfig -d -u ${MDDEVICE} 2>/dev/null || true
+ fi
+
+ MDDEVICE=`mdconfig -a -t vnode -f ${FSIMG}`
+ if [ ! -c /dev/${MDDEVICE} ] ; then
+ echo "No /dev/$MDDEVICE" 1>&2
+ exit 1
+ fi
+
+ trap "umount ${MNT}; mdconfig -d -u ${MDDEVICE}" EXIT
+
+ if [ "x${DISKLABEL}" != "x" ] ; then
+ ${DISKLABEL} ${MACHINE} -w ${BOOT} ${MDDEVICE} ${FSLABEL}
+ newfs -O2 -i ${FSINODE} -o space -m 0 /dev/${MDDEVICE}a
+ mount -o async /dev/${MDDEVICE}a ${MNT}
+ else
+ newfs -O2 -i ${FSINODE} -o space -m 0 /dev/${MDDEVICE}
+ mount -o async /dev/${MDDEVICE} ${MNT}
+ fi
+}
+
+rm -f ${FSIMG}
+dd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
+
+#
+# We don't have any bootblocks on ia64. Note that -B implies -r,
+# so we have to specifically specify -r when we don't have -B.
+# bsdlabel fails otherwise.
+#
+case `uname -r` in
+4.*)
+ if [ -f "${RD}/trees/base/boot/boot1" ]; then
+ BOOT="-B -b ${RD}/trees/base/boot/boot1"
+ if [ -f "${RD}/trees/base/boot/boot2" ]; then
+ BOOT="${BOOT} -s ${RD}/trees/base/boot/boot2"
+ fi
+ else
+ BOOT="-r"
+ fi
+ dofs_vn
+ ;;
+*)
+ if [ -f "${RD}/trees/base/boot/boot" ]; then
+ BOOT="-B -b ${RD}/trees/base/boot/boot"
+ else
+ BOOT="-r"
+ fi
+ dofs_md
+ ;;
+esac
+
+if [ -d ${FSPROTO} ]; then
+ ABS=`cd ${MNT} && pwd`
+ (set -e && cd ${FSPROTO} && find . -print | cpio -dump ${ABS})
+else
+ cp -p ${FSPROTO} ${MNT}
+fi
+
+df -ki ${MNT}
+
+set `df -ki ${MNT} | tail -1`
+
+echo "*** File system is ${FSSIZE} K, $4 left"
+echo "*** ${FSINODE} bytes/inode, $7 left"
diff --git a/contrib/mfsbsd/tools/do_gpt.sh b/contrib/mfsbsd/tools/do_gpt.sh
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/tools/do_gpt.sh
@@ -0,0 +1,89 @@
+#!/bin/sh
+#
+set -e
+
+FSIMG=$1
+FSPROTO=$2
+FSSIZE=$3
+BOOTDIR=$4
+EFIIMG=$5
+VERBOSE=$6
+
+FSLABEL="auto"
+
+
+exit_with() {
+ local status="$1"
+ shift
+
+ if [ -n "$@" ]; then
+ echo
+ echo "$@"
+ fi
+
+ mdconfig -d -u ${unit}
+ rm -f ${TMPIMG}
+
+ exit ${status}
+}
+
+#Trap the killer signals so that we can exit with a good message.
+trap "exit_with 1 'Received signal SIGHUP'" SIGHUP
+trap "exit_with 1 'Received signal SIGINT'" SIGINT
+trap "exit_with 1 'Received signal SIGTERM'" SIGTERM
+
+if [ ${FSSIZE} -eq 0 -a ${FSLABEL} = "auto" ]; then
+ roundup() echo $((($1+$2-1)-($1+$2-1)%$2))
+ nf=$(find ${FSPROTO} |wc -l)
+ sk=$(du -skA ${FSPROTO} |cut -f1)
+ FSSIZE=$(roundup $(($sk*12/10)) 1024)
+ IMG_SIZE=$((${FSSIZE}+32))
+fi
+
+if [ -n "$VERBOSE" ]; then
+ echo "FSIMG ${FSIMG} FSPROTO ${FSPROTO} FSSIZE ${FSSIZE}"
+fi
+
+TMPIMG=`env TMPDIR=. mktemp -t ${FSIMG}`
+
+dd of=${FSIMG} if=/dev/zero count=${IMG_SIZE} bs=1k
+dd of=${TMPIMG} if=/dev/zero count=${FSSIZE} bs=1k
+
+export unit=`mdconfig -a -t vnode -f ${FSIMG}`
+if [ $? -ne 0 ]; then
+ echo "mdconfig failed"
+ exit 1
+fi
+
+if [ -n "$VERBOSE" ]; then
+ TIME=time
+ set -x
+else
+ TIME=
+fi
+
+gpart create -s gpt ${unit}
+gpart add -t freebsd-boot -b 40 -l boot -s 472 ${unit}
+gpart bootcode -b ${BOOTDIR}/pmbr -p ${BOOTDIR}/gptboot -i 1 ${unit}
+if [ -n "${EFIIMG}" -a -f "${EFIIMG}" ]; then
+ gpart add -t efi -s 2m ${unit}
+ ${TIME} dd if=${EFIIMG} of=/dev/${unit}p2 bs=128k
+fi
+gpart add -t freebsd-ufs -l rootfs ${unit}
+${TIME} makefs -B little ${TMPIMG} ${FSPROTO}
+if [ -f ${EFIIMG} ]; then
+ ${TIME} dd if=${TMPIMG} of=/dev/${unit}p3 bs=128k
+else
+ ${TIME} dd if=${TMPIMG} of=/dev/${unit}p2 bs=128k
+fi
+
+if [ -n "$VERBOSE" ]; then
+ set +x
+fi
+if [ $? -ne 0 ]; then
+ echo "makefs failed"
+ exit_with 1
+fi
+
+exit_with 0
+
diff --git a/contrib/mfsbsd/tools/kern_exclude b/contrib/mfsbsd/tools/kern_exclude
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/kern_exclude
@@ -0,0 +1,3 @@
+kernel.debug
+*.symbols
+*.ko
diff --git a/contrib/mfsbsd/tools/motd b/contrib/mfsbsd/tools/motd
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/motd
@@ -0,0 +1,10 @@
+Welcome to mfsBSD, the memory based FreeBSD distribution.
+
+This is a stripped-down version of FreeBSD without:
+- manual pages, info pages, examples
+- include files, static library files, development tools
+- bind binaries (host, dig, named, etc.)
+
+Feel free to email me with any bug reports or feature suggestions.
+Martin Matuska <mm@FreeBSD.org>
+http://mfsbsd.vx.sk/
diff --git a/contrib/mfsbsd/tools/motd.se b/contrib/mfsbsd/tools/motd.se
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/motd.se
@@ -0,0 +1,16 @@
+Welcome to mfsBSD SE, the memory based FreeBSD distribution.
+This is a special version intended for full-ZFS install of FreeBSD
+
+To make a full-ZFS FreeBSD install from this ISO:
+
+1. Mount the CD device
+( e.g. mount_cd9660 /dev/cd0 /cdrom )
+2. Run "zfsinstall" with path to release directory and your drive
+( e.g. zfsinstall -d ada0 -u /cdrom/9.2-RELEASE-amd64 )
+
+Run zfsinstall with the -h flag for help or without flags for options.
+I recommend creating a GPT swap partition (e.g. -s 2G for a 2GB swap).
+
+Feel free to email me with any bug reports or feature suggestions.
+Martin Matuska <mm@FreeBSD.org>
+http://mfsbsd.vx.sk/
diff --git a/contrib/mfsbsd/tools/packages-mini.sample b/contrib/mfsbsd/tools/packages-mini.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/packages-mini.sample
@@ -0,0 +1 @@
+dropbear
diff --git a/contrib/mfsbsd/tools/packages.sample b/contrib/mfsbsd/tools/packages.sample
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/packages.sample
@@ -0,0 +1,12 @@
+cpdup
+dmidecode
+indexinfo
+ipmitool
+libevent
+libiconv
+nano
+readline
+rsync
+smartmontools
+tmux
+utf8proc
diff --git a/contrib/mfsbsd/tools/prunelist b/contrib/mfsbsd/tools/prunelist
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/prunelist
@@ -0,0 +1,81 @@
+usr/bin/c++
+usr/bin/c++filt
+usr/bin/g++
+usr/bin/c89
+usr/bin/c99
+usr/bin/CC
+usr/bin/cc
+usr/bin/clang
+usr/bin/clang++
+usr/bin/clang-cpp
+usr/bin/clang-tblgen
+usr/bin/cpp
+usr/bin/gcc
+usr/bin/yacc
+usr/bin/f77
+usr/bin/byacc
+usr/bin/addr2line
+usr/bin/ar
+usr/bin/gnu-ar
+usr/bin/gnu-ranlib
+usr/bin/as
+usr/bin/gasp
+usr/bin/gcov
+usr/bin/gdb
+usr/bin/gdbreplay
+usr/bin/kyua
+usr/bin/ld
+usr/bin/ld.bfd
+usr/bin/ld.lld
+usr/bin/lldb
+usr/bin/lldb-tblgen
+usr/bin/llvm-addr2line
+usr/bin/llvm-ar
+usr/bin/llvm-cov
+usr/bin/llvm-cxxfilt
+usr/bin/llvm-nm
+usr/bin/llvm-objdump
+usr/bin/llvm-profdata
+usr/bin/llvm-ranlib
+usr/bin/llvm-symbolizer
+usr/bin/llvm-tblgen
+usr/bin/nm
+usr/bin/objcopy
+usr/bin/objdump
+usr/bin/ranlib
+usr/bin/readelf
+usr/bin/size
+usr/bin/strip
+usr/bin/svnlite
+usr/bin/svnliteadmin
+usr/bin/svnlitebench
+usr/bin/svnlitedumpfilter
+usr/bin/svnlitefsfs
+usr/bin/svnlitelook
+usr/bin/svnlitemucc
+usr/bin/svnliterdump
+usr/bin/svnliteserve
+usr/bin/svnlitesync
+usr/bin/svnliteversion
+usr/bin/gdbtui
+usr/bin/kgdb
+usr/games
+usr/include
+usr/lib32
+usr/lib/*.a
+usr/lib/clang
+usr/lib/private/*.a
+usr/lib/private/libunbound*
+usr/libexec/cc1
+usr/libexec/cc1obj
+usr/libexec/cc1plus
+usr/libexec/f771
+usr/sbin/unbound*
+usr/share/dict
+usr/share/doc
+usr/share/examples
+usr/share/info
+usr/share/games
+usr/share/man
+usr/share/openssl
+usr/share/nls
diff --git a/contrib/mfsbsd/tools/prunelist.9 b/contrib/mfsbsd/tools/prunelist.9
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/prunelist.9
@@ -0,0 +1,67 @@
+usr/bin/c++
+usr/bin/c++filt
+usr/bin/g++
+usr/bin/c89
+usr/bin/c99
+usr/bin/CC
+usr/bin/cc
+usr/bin/clang
+usr/bin/clang++
+usr/bin/clang-cpp
+usr/bin/clang-tblgen
+usr/bin/cpp
+usr/bin/gcc
+usr/bin/yacc
+usr/bin/f77
+usr/bin/byacc
+usr/bin/addr2line
+usr/bin/ar
+usr/bin/gnu-ar
+usr/bin/gnu-ranlib
+usr/bin/as
+usr/bin/gasp
+usr/bin/gdb
+usr/bin/gdbreplay
+usr/bin/ld
+usr/bin/nm
+usr/bin/objcopy
+usr/bin/objdump
+usr/bin/ranlib
+usr/bin/readelf
+usr/bin/size
+usr/bin/strip
+usr/bin/gdbtui
+usr/bin/kgdb
+usr/include
+usr/games
+usr/lib32
+usr/lib/*.a
+usr/lib/private/*.a
+usr/libexec/cc1
+usr/libexec/cc1obj
+usr/libexec/cc1plus
+usr/libexec/f771
+usr/share/dict
+usr/share/doc
+usr/share/examples
+usr/share/info
+usr/share/games
+usr/share/man
+usr/share/openssl
+usr/share/nls
+usr/bin/dig
+usr/bin/host
+usr/bin/nslookup
+usr/bin/nsupdate
+usr/sbin/dnssec-dsfromkey
+usr/sbin/dnssec-signzone
+usr/sbin/lwresd
+usr/sbin/named
+usr/sbin/named-checkconf
+usr/sbin/named-checkzone
+usr/sbin/named-compilezone
+usr/sbin/dnssec-keygen
+usr/sbin/dnssec-keyfromlabel
+usr/sbin/rndc-confgen
+usr/sbin/named-reconfig
+usr/sbin/named-reload
diff --git a/contrib/mfsbsd/tools/roothack/Makefile b/contrib/mfsbsd/tools/roothack/Makefile
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/roothack/Makefile
@@ -0,0 +1,10 @@
+PROG= roothack
+MAN=
+
+LDADD= -larchive -lbz2 -lz -llzma -lcrypto -lbsdxml -lmd -lprivatezstd
+
+NO_SHARED=
+
+WARNS= 6
+
+.include <bsd.prog.mk>
diff --git a/contrib/mfsbsd/tools/roothack/roothack.c b/contrib/mfsbsd/tools/roothack/roothack.c
new file mode 100644
--- /dev/null
+++ b/contrib/mfsbsd/tools/roothack/roothack.c
@@ -0,0 +1,176 @@
+/*-
+ * Copyright (c) 2010-2012 Ed Schouten <ed@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/linker.h>
+#include <sys/module.h>
+#include <sys/mount.h>
+#include <sys/uio.h>
+
+#include <archive.h>
+#include <archive_entry.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+static void
+die(const char *msg)
+{
+ int fd, serrno;
+
+ serrno = errno;
+ fd = open("/dev/console", O_RDWR);
+ if (fd != -1 && fd != STDERR_FILENO)
+ dup2(fd, STDERR_FILENO);
+ errno = serrno;
+ perror(msg);
+ sleep(10);
+ exit(1);
+}
+
+static void
+domount(const char * const list[], unsigned int elems)
+{
+ struct iovec iov[elems];
+ unsigned int i;
+
+ for (i = 0; i < elems; i++) {
+ iov[i].iov_base = __DECONST(char *, list[i]);
+ iov[i].iov_len = strlen(list[i]) + 1;
+ }
+
+ if (nmount(iov, elems, 0) != 0)
+ die(list[1]);
+}
+
+static int
+copy_data(struct archive *ar, struct archive *aw)
+{
+ int r;
+ const void *buff;
+ size_t size;
+ off_t offset;
+
+ for (;;) {
+ r = archive_read_data_block(ar, &buff, &size, &offset);
+ if (r == ARCHIVE_EOF)
+ return (ARCHIVE_OK);
+ if (r != ARCHIVE_OK)
+ return (r);
+ r = archive_write_data_block(aw, buff, size, offset);
+ if (r != ARCHIVE_OK) {
+ die(archive_error_string(aw));
+ return (r);
+ }
+ }
+}
+
+static void
+extract(const char *filename)
+{
+ struct archive *a;
+ struct archive *ext;
+ struct archive_entry *entry;
+ int flags;
+ int r;
+
+ flags = ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM;
+
+ a = archive_read_new();
+ archive_read_support_format_all(a);
+#if ARCHIVE_VERSION_NUMBER < 3000000
+ archive_read_support_compression_all(a);
+#else
+ archive_read_support_filter_all(a);
+#endif
+ ext = archive_write_disk_new();
+ archive_write_disk_set_options(ext, flags);
+ archive_write_disk_set_standard_lookup(ext);
+#if ARCHIVE_VERSION_NUMBER < 3000000
+ if ((r = archive_read_open_file(a, filename, 10240)))
+ die("archive_read_open_file");
+#else
+ if ((r = archive_read_open_filename(a, filename, 10240)))
+ die("archive_read_open_filename");
+#endif
+ for (;;) {
+ r = archive_read_next_header(a, &entry);
+ if (r == ARCHIVE_EOF)
+ break;
+ if (r < ARCHIVE_WARN)
+ die(archive_error_string(a));
+ r = archive_write_header(ext, entry);
+ if (r == ARCHIVE_OK && archive_entry_size(entry) > 0) {
+ r = copy_data(a, ext);
+ if (r < ARCHIVE_WARN)
+ die(archive_error_string(a));
+ }
+ r = archive_write_finish_entry(ext);
+ if (r < ARCHIVE_WARN)
+ die(archive_error_string(ext));
+ }
+ archive_read_close(a);
+ archive_read_free(a);
+ archive_write_close(ext);
+ archive_write_free(ext);
+}
+
+static char const * const tmpfs[] = {
+ "fstype", "tmpfs", "fspath", "/rw"
+};
+static char const * const devfs[] = {
+ "fstype", "devfs", "fspath", "/rw/dev"
+};
+
+int
+main(int argc __unused, char *argv[])
+{
+
+ /* Prevent foot shooting. */
+ if (getpid() != 1)
+ return (1);
+
+ if (modfind("tmpfs") == -1 && kldload("tmpfs") == -1)
+ die("error loading tmpfs");
+
+ /* Extract FreeBSD installation in a tmpfs. */
+ domount(tmpfs, sizeof(tmpfs) / sizeof(char *));
+ extract("/root.txz");
+ domount(devfs, sizeof(devfs) / sizeof(char *));
+
+ /* chroot() into system and continue boot process. */
+ if (chroot("/rw") != 0)
+ die("chroot");
+ chdir("/");
+
+ /* Execute the real /sbin/init. */
+ execv(argv[0], argv);
+ die("execv");
+ return (1);
+}
diff --git a/contrib/mfsbsd/tools/zfsinstall b/contrib/mfsbsd/tools/zfsinstall
new file mode 100755
--- /dev/null
+++ b/contrib/mfsbsd/tools/zfsinstall
@@ -0,0 +1,501 @@
+#!/bin/sh
+# $Id$
+#
+# mfsBSD ZFS install script
+# Copyright (c) 2018 Martin Matuska <mm at FreeBSD.org>
+#
+FREEBSD_MIRROR="${FREEBSD_MIRROR:-ftp://ftp.freebsd.org/pub/FreeBSD}"
+FS_LIST="var tmp"
+RAID_TYPES="mirror raidz raidz1 raidz2 raidz3"
+
+usage() {
+ echo "Usage: $0 [-h] -d geom_provider [-d geom_provider ...] [ -u dist_url ] [-r mirror|raidz[1|2|3]] [-m mount_point] [-p zfs_pool_name] [-s swap_partition_size] [-z zfs_partition_size] [-c] [-C] [-l] [-4] [-A]"
+}
+
+osarch() {
+ /sbin/sysctl -n hw.machine_arch
+}
+
+osrelease() {
+ /sbin/sysctl -n kern.osrelease | /usr/bin/sed -E -e 's,-p[0-9]+$,,g'
+}
+
+check_raid() {
+ RAID_TYPE="$1"
+ test -n "$RAID_TYPE" || return 1
+
+ for raid_type in $RAID_TYPES; do
+ if [ "$raid_type" = $RAID_TYPE ]; then
+ return 0
+ fi
+ done
+
+ return 1
+}
+
+help() {
+ echo; echo "Install FreeBSD using ZFS from a compressed archive"
+ echo; echo "Required flags:"
+ echo "-d geom_provider : geom provider(s) to install to (e.g. da0)"
+ echo; echo "Optional flags:"
+ echo "-r raidz[1|2|3]|mirror : select raid mode if more than one -d provider given"
+ echo " (must begin after -d)"
+ echo "-u dist_url : URL or directory with base.txz and kernel.txz"
+ echo " (defaults to FreeBSD FTP mirror)"
+ echo "-s swap_part_size : create a swap partition with given size (default: no swap)"
+ echo "-z zfs_part_size : create zfs parition of this size (default: all space left)"
+ echo "-p pool_name : specify a name for the ZFS pool (default: tank)"
+ echo "-C : compatibility mode with limited feature flags"
+ echo " (enable only async_destroy, empty_bpobj and lz4_compress)"
+ echo "-m mount_point : use this mount point for operations (default: /mnt)"
+ echo "-c : enable compression for all datasets"
+ echo "-l : use legacy mounts (via fstab) instead of ZFS mounts"
+ echo "-4 : use fletcher4 as default checksum algorithm"
+ echo "-A : align partitions to 4K blocks"
+ echo; echo "Examples:"
+ echo "Install on a single drive with 2GB swap:"
+ echo "$0 -u /path/to/release -d da0 -s 2G"
+ echo "Install on four-disk stripe:"
+ echo "$0 -u /path/to/release -d da0 -d da1 -d da2 -d da3"
+ echo "Install on an stripped mirror:"
+ echo "$0 -u /path/to/release -d da0 -d da1 -r mirror -d da2 -d da3 -r mirror"
+ echo "Install on a raidz2:"
+ echo "$0 -u /path/to/release -d da0 -d da1 -d da2 -d da3 -r raidz2"
+ echo "Install on a mirror without swap, pool name rpool:"
+ echo "$0 -u /path/to/release -d da0 -d da1 -r mirror -p rpool"
+ echo; echo "Notes:"
+ echo "When using swap and raidz/mirror, the swap partition is created on all drives."
+ echo "The /etc/fstab entry will contatin only the first drive's swap partition."
+ echo "You can enable all swap partitions and/or make a gmirror-ed swap later."
+}
+
+while getopts d:u:t:r:p:s:z:m:V:Chcl4A o; do
+ case "$o" in
+ d) DEVS="$DEVS ${OPTARG##/dev/}"; ZDEVS="$ZDEVS ${OPTARG##/dev/}" ;;
+ u) URL="${OPTARG}" ;;
+ t) ARCHIVE="${OPTARG}" ;;
+ p) POOL="${OPTARG}" ;;
+ s) SWAP="${OPTARG}" ;;
+ m) MNT="${OPTARG}" ;;
+ r)
+ if [ -z "${ZDEVS}" ]; then
+ echo "Error: geom providers must be defined before using \
+ this option"
+ usage
+ exit 1
+ fi
+
+ if [ -n "${RAID}" -a "${RAID}" != "${OPTARG}" ]; then
+ echo "Error: array types do not match"
+ exit 1
+ else
+ RAID="${OPTARG}"
+ fi
+
+ if ! check_raid "$RAID"; then
+ echo "Error: please choose raid mode with the -r switch (mirror or raidz[1|2|3])"
+ exit 1
+ fi
+
+ COUNT=`echo ${ZDEVS} | /usr/bin/wc -w | /usr/bin/awk '{ print $1 }'`
+ if [ "$COUNT" -lt "3" ] && [ "$RAID" = "raidz" -o "$RAID" = "raidz1" ]; then
+ echo "Error: raidz needs at least three devices (-d switch)"
+ exit 1
+ elif [ "$COUNT" -lt "4" -a "$RAID" = "raidz2" ]; then
+ echo "Error: raidz2 needs at least four devices (-d switch)"
+ exit 1
+ elif [ "$COUNT" -lt "5" -a "$RAID" = "raidz3" ]; then
+ echo "Error: raidz3 needs at least five devices (-d switch)"
+ exit 1
+ elif [ "$COUNT" = "1" -a "$RAID" = "mirror" ]; then
+ echo "Error: mirror needs at least two devices (-d switch)"
+ exit 1
+ fi
+
+ ZARRAY="${ZARRAY} ${RAID} ${ZDEVS}"
+
+ unset ZDEVS
+ ;;
+ z) ZPART="${OPTARG}" ;;
+ V) VERSION="${OPTARG}" ;;
+ C) COMPAT=1 ;;
+ c) COMPRESS=1 ;;
+ l) LEGACY=1 ;;
+ 4) FLETCHER=1 ;;
+ A) ALIGN=1 ;;
+ h) help; exit 1;;
+ [?]) usage; exit 1;;
+esac
+done
+
+if ! `/sbin/kldstat -m zfs >/dev/null 2>/dev/null`; then
+ /sbin/kldload zfs >/dev/null 2>/dev/null
+fi
+
+ZFS_VERSION=`/sbin/sysctl -n vfs.zfs.version.spa 2>/dev/null`
+
+if [ -z "$ZFS_VERSION" ]; then
+ echo "Error: failed to load ZFS module"
+ exit 1
+elif [ "$ZFS_VERSION" -lt "13" ]; then
+ echo "Error: ZFS module too old, version 13 or higher required"
+ exit 1
+fi
+
+if [ -z "$DEVS" ]; then
+ usage
+ exit 1
+fi
+
+if [ -z "$POOL" ]; then
+ POOL=tank
+fi
+
+if [ -z "$VERSION" ]; then
+ VERSION=${ZFS_VERSION}
+elif [ "$VERSION" -gt "$ZFS_VERSION" ]; then
+ echo "Error: invalid ZFS pool version (maximum: $ZFS_VERSION)"
+ exit 1
+fi
+
+if [ "$VERSION" = "5000" ]; then
+ VERSION=
+else
+ VERSION="-o version=${VERSION}"
+fi
+
+if [ "$COMPAT" = "1" ]; then
+ if [ "$ZFS_VERSION" != 5000 ]; then
+ echo "Error: compatibility mode requires ZFS version 5000"
+ exit 1
+ fi
+ COMPATFLAGS="-d -o feature@async_destroy=enabled -o feature@empty_bpobj=enabled -o feature@lz4_compress=enabled"
+fi
+
+if [ "$ALIGN" = "1" ]; then
+ ALIGNMENT="-a 4096"
+fi
+
+if /sbin/zpool list $POOL > /dev/null 2> /dev/null; then
+ echo Error: ZFS pool \"$POOL\" already exists
+ echo Please choose another pool name or rename/destroy the existing pool.
+ exit 1
+fi
+
+EXPOOLS=`/sbin/zpool import 2> /dev/null | /usr/bin/grep pool: | /usr/bin/awk '{ print $2 }'`
+
+if [ -n "${EXPOOLS}" ]; then
+ for P in ${EXPOOLS}; do
+ if [ "$P" = "$POOL" ]; then
+ echo Error: An exported ZFS pool \"$POOL\" already exists
+ echo Please choose another pool name or rename/destroy the exported pool.
+ exit 1
+ fi
+ done
+fi
+
+if [ -z "${ZARRAY}" ]; then
+ echo Notice: no raid type has been chosen, it will be \`stripe\`
+ ZARRAY="${DEVS}"
+fi
+
+for DEV in ${DEVS}; do
+ if ! [ -c "/dev/${DEV}" ]; then
+ echo "Error: /dev/${DEV} is not a block device"
+ exit 1
+ fi
+ if /sbin/gpart show $DEV > /dev/null 2> /dev/null; then
+ echo "Error: /dev/${DEV} already contains a partition table."
+ echo ""
+ /sbin/gpart show $DEV
+ echo "You may erase the partition table manually with the destroygeom command"
+ exit 1
+ fi
+done
+
+EXTRACT_FILES="/tmp/base.txz /tmp/kernel.txz"
+
+if [ -z "${URL}" ]; then
+ if [ -z "${ARCHIVE}" ]; then
+ URL="${FREEBSD_MIRROR}/releases/$(osarch)/$(osrelease)"
+ elif ! [ -f "${ARCHIVE}" ]; then
+ echo "Error: file $ARCHIVE does not exist"
+ exit 1
+ else
+ EXTRACT_FILES=${ARCHIVE}
+ fi
+else
+ if [ -d "${URL}" ]; then
+ for file in base.txz kernel.txz; do
+ if ! [ -f "${URL}/${file}" ]; then
+ echo "File not found: ${URL}/${file}"
+ exit 1
+ fi
+ done
+ EXTRACT_FILES="${URL}/base.txz ${URL}/kernel.txz"
+ fi
+fi
+
+if [ -z "$MNT" ]; then
+ MNT=/mnt
+fi
+
+if ! [ -d "${MNT}" ]; then
+ echo "Error: $MNT is not a directory"
+ exit 1
+fi
+
+if [ -n "${ZPART}" ]; then
+ SZPART="-s ${ZPART}"
+fi
+
+if [ "${LEGACY}" = "1" ]; then
+ ALTROOT=
+ ROOTMNT=legacy
+else
+ ALTROOT="-o altroot=${MNT} -o cachefile=/boot/zfs/zpool.cache"
+ ROOTMNT=/
+fi
+
+# Fetch base.txz and kernel.txz
+
+if [ -n "${URL}" -a ! -d "${URL}" ]; then
+ echo "Fetching base files from: $URL"
+ if ! /usr/bin/fetch -o /tmp/base.txz "${URL}/base.txz"; then
+ echo "Error fetching ${URL}/base.txz"
+ exit 1
+ elif ! /usr/bin/fetch -o /tmp/kernel.txz "${URL}/kernel.txz"; then
+ echo "Error fetching ${URL}/kernel.txz"
+ exit 1
+ fi
+fi
+
+# Create GPT
+
+for DEV in ${DEVS}; do
+ echo -n "Creating GUID partitions on ${DEV} ..."
+ if ! /sbin/gpart create -s GPT /dev/${DEV} > /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ /bin/sleep 1
+ if ! echo "a 1" | /sbin/fdisk -f - ${DEV} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ if ! /sbin/gpart add -t freebsd-boot -b 40 -s 472 ${DEV} > /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ if [ -n "${SWAP}" ]; then
+ if ! /sbin/gpart add -t freebsd-swap ${ALIGNMENT} -s "${SWAP}" ${DEV} > /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ SWAPPART=`/sbin/glabel status ${DEV}p2 | /usr/bin/grep gptid | /usr/bin/awk '{ print $1 }'`
+ if [ -z "$SWAPPART" ]; then
+ echo " error determining swap partition"
+ fi
+ if [ -z "$FSWAP" ]; then
+ FSWAP=${SWAPPART}
+ fi
+ fi
+ if ! /sbin/gpart add -t freebsd-zfs ${ALIGNMENT} ${SZPART} ${DEV} > /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ /bin/dd if=/dev/zero of=/dev/${DEV}p2 bs=512 count=560 > /dev/null 2> /dev/null
+ if [ -n "${SWAP}" ]; then
+ /bin/dd if=/dev/zero of=/dev/${DEV}p3 bs=512 count=560 > /dev/null 2> /dev/null
+ fi
+ echo " done"
+
+ echo -n "Configuring ZFS bootcode on ${DEV} ..."
+ if ! /sbin/gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ${DEV} > /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo " done"
+ /sbin/gpart show ${DEV}
+done
+
+# Create zpool and zfs
+
+for DEV in ${ZARRAY}; do
+ if check_raid "${DEV}"; then
+ if [ -n "${_PARTS}" ]; then
+ ZPARTS="${ZPARTS} ${RAID} ${_PARTS}"
+
+ unset _PARTS
+ fi
+ continue
+ fi
+
+ PART=`/sbin/gpart show ${DEV} | /usr/bin/grep freebsd-zfs | /usr/bin/awk '{ print $3 }'`
+
+ if [ -z "${PART}" ]; then
+ echo Error: freebsd-zfs partition not found on /dev/$DEV
+ exit 1
+ fi
+
+ GPART=`/sbin/glabel list ${DEV}p${PART} | /usr/bin/grep gptid | /usr/bin/awk -F"gptid/" '{ print "gptid/" $2 }'`
+
+ GPARTS="${GPARTS} ${GPART}"
+ PARTS="${PARTS} ${DEV}p${PART}"
+ _PARTS="${_PARTS} ${DEV}p${PART}"
+done
+ZPARTS="${ZPARTS} ${RAID} ${_PARTS}"
+
+echo -n "Creating ZFS pool ${POOL} on ${PARTS} ..."
+if ! /sbin/zpool create -f -m none ${ALTROOT} ${COMPATFLAGS} ${VERSION} ${POOL} ${ZPARTS} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+fi
+echo " done"
+
+if [ "${FLETCHER}" = "1" ]; then
+ echo -n "Setting default checksum to fletcher4 for ${POOL} ..."
+ if ! /sbin/zfs set checksum=fletcher4 ${POOL} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo " done"
+fi
+
+if [ "${COMPRESS}" = "1" ]; then
+ echo -n "Enabling default compression on ${POOL} ..."
+ if ! /sbin/zfs set compression=on ${POOL} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo " done"
+fi
+
+echo -n "Creating ${POOL} root partition:"
+if ! /sbin/zfs create -o mountpoint=${ROOTMNT} ${POOL}/root > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+fi
+echo " ... done"
+echo -n "Creating ${POOL} partitions:"
+for FS in ${FS_LIST}; do
+ if [ "${LEGACY}" = 1 ]; then
+ MNTPT="-o mountpoint=legacy"
+ else
+ MNTPT=
+ fi
+ if ! /sbin/zfs create ${MNTPT} ${POOL}/root/${FS} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+ echo -n " ${FS}"
+done
+echo " ... done"
+echo -n "Setting bootfs for ${POOL} to ${POOL}/root ..."
+if ! /sbin/zpool set bootfs=${POOL}/root ${POOL} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+fi
+echo " done"
+/sbin/zfs list -r ${POOL}
+
+# Mount and populate zfs (if legacy)
+if [ "${LEGACY}" = "1" ]; then
+ echo -n "Mounting ${POOL} on ${MNT} ..."
+ /bin/mkdir -p ${MNT}
+ if ! /sbin/mount -t zfs ${POOL}/root ${MNT} > /dev/null 2> /dev/null; then
+ echo " error mounting pool/root"
+ exit 1
+ fi
+ for FS in ${FS_LIST}; do
+ /bin/mkdir -p ${MNT}/${FS}
+ if ! /sbin/mount -t zfs ${POOL}/root/${FS} ${MNT}/${FS} > /dev/null 2> /dev/null; then
+ echo " error mounting ${POOL}/root/${FS}"
+ exit 1
+ fi
+ done
+echo " done"
+fi
+
+echo -n "Extracting FreeBSD distribution ..."
+for file in ${EXTRACT_FILES}; do
+ if ! /usr/bin/tar -C ${MNT} -x -f ${file} > /dev/null 2> /dev/null; then
+ echo " error"
+ exit 1
+ fi
+done
+echo " done"
+
+# Adjust configuration files
+
+echo -n "Writing /boot/loader.conf..."
+echo "zfs_load=\"YES\"" > ${MNT}/boot/loader.conf
+echo "vfs.root.mountfrom=\"zfs:${POOL}/root\"" >> ${MNT}/boot/loader.conf
+echo " done"
+
+# Write fstab if swap or legacy
+echo -n "Writing /etc/fstab..."
+rm -f ${MNT}/etc/fstab
+touch ${MNT}/etc/fstab
+if [ -n "${FSWAP}" -o "${LEGACY}" = "1" ]; then
+ if [ -n "${FSWAP}" ]; then
+ echo "/dev/${FSWAP} none swap sw 0 0" > ${MNT}/etc/fstab
+ fi
+ if [ "${LEGACY}" = "1" ]; then
+ for FS in ${FS_LIST}; do
+ echo ${POOL}/root/${FS} /${FS} zfs rw 0 0 >> ${MNT}/etc/fstab
+ done
+ fi
+fi
+if [ "${LEGACY}" != "1" ]; then
+ echo -n "Writing /etc/rc.conf..."
+ echo 'zfs_enable="YES"' >> ${MNT}/etc/rc.conf
+fi
+echo " done"
+
+echo -n "Copying /boot/zfs/zpool.cache ..."
+if [ -n "${LEGACY}" ]; then
+ for FS in ${FS_LIST}; do
+ /sbin/umount ${MNT}/${FS} > /dev/null 2> /dev/null
+ done
+ /sbin/umount ${MNT} > /dev/null 2> /dev/null
+fi
+if ! /sbin/zpool export ${POOL} > /dev/null 2> /dev/null; then
+ echo " error exporting pool"
+ exit 1
+fi
+if ! /sbin/zpool import ${ALTROOT} ${POOL} > /dev/null 2> /dev/null; then
+ echo " error importing pool"
+ exit 1
+fi
+if [ -n "${LEGACY}" ]; then
+ if ! /sbin/mount -t zfs ${POOL}/root ${MNT} > /dev/null 2> /dev/null; then
+ echo " error mounting ${POOL}/root"
+ exit 1
+ fi
+fi
+if ! /bin/cp /boot/zfs/zpool.cache ${MNT}/boot/zfs/ > /dev/null 2> /dev/null; then
+ echo " error copying zpool.cache"
+ exit 1
+fi
+if [ -n "${LEGACY}" ]; then
+ for FS in ${FS_LIST}; do
+ if ! /sbin/mount -t zfs ${POOL}/${FS} ${MNT}/${FS} > /dev/null 2> /dev/null; then
+ echo " error mounting ${POOL}/${FS}"
+ exit 1
+ fi
+ done
+fi
+echo " done"
+
+echo ""
+echo "Installation complete."
+echo "The system will boot from ZFS with clean install on next reboot"
+echo ""
+echo "You may make adjustments to the installed system using chroot:"
+echo "chroot ${MNT}"
+echo ""
+echo "Some adjustments may require a mounted devfs:"
+echo "mount -t devfs devfs ${MNT}/dev"
+echo ""
+echo "WARNING - Don't export ZFS pool \"${POOL}\"!"
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Nov 20, 6:10 AM (13 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14731855
Default Alt Text
D41704.diff (95 KB)
Attached To
Mode
D41704: mfsBSD: Vendor import mfsBSD (mmatuska/mfsbsd@0da8061)
Attached
Detach File
Event Timeline
Log In to Comment