summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xetc/rc.d/Makefile2
-rw-r--r--etc/rc.d/mdconfig195
-rw-r--r--etc/rc.d/mdconfig2226
-rw-r--r--etc/rc.subr29
-rw-r--r--share/man/man5/rc.conf.589
5 files changed, 539 insertions, 2 deletions
diff --git a/etc/rc.d/Makefile b/etc/rc.d/Makefile
index e471893..7df38ce 100755
--- a/etc/rc.d/Makefile
+++ b/etc/rc.d/Makefile
@@ -22,7 +22,7 @@ FILES= DAEMON LOGIN NETWORKING SERVERS \
kadmind kerberos kernel keyserv kldxref kpasswdd \
ldconfig local localpkg lpd \
mixer motd mountcritlocal mountcritremote \
- mountd moused mroute6d mrouted msgs \
+ mdconfig mdconfig2 mountd moused mroute6d mrouted msgs \
named natd netif netoptions \
network_ipv6 newsyslog nfsclient nfsd \
nfslocking nfsserver nisdomain nsswitch ntpd ntpdate \
diff --git a/etc/rc.d/mdconfig b/etc/rc.d/mdconfig
new file mode 100644
index 0000000..8ee3b2a
--- /dev/null
+++ b/etc/rc.d/mdconfig
@@ -0,0 +1,195 @@
+#!/bin/sh
+#
+# Copyright (c) 2006 The FreeBSD Project
+# 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.
+#
+# $FreeBSD$
+#
+
+# PROVIDE: mdconfig
+# REQUIRE: localswap
+# BEFORE: mountcritlocal
+
+. /etc/rc.subr
+
+name="mdconfig"
+stop_cmd="mdconfig_stop"
+start_cmd="mdconfig_start"
+
+is_readonly()
+{
+ local _mp _ret
+
+ _mp=$1
+ _ret=`mount | while read _line; do
+ case ${_line} in
+ *" ${_mp} "*read-only*)
+ echo "yes"
+ ;;
+
+ *)
+ ;;
+ esac;
+ done`
+
+ if [ -n "${_ret}" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+init_variables()
+{
+ local _i
+
+ _fs=""
+ _mp=""
+ _dev="/dev/${_md}"
+ eval _config=\$mdconfig_${_md}
+ eval _newfs=\$mdconfig_${_md}_newfs
+
+ _type=${_config##*-t\ }
+ _type=${_type%%\ *}
+ if [ -z "${_type}" ]; then
+ err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
+ fi
+
+ if [ "${_type}" = "vnode" ]; then
+ _file=${_config##*-f\ }
+ _file=${_file%%\ *}
+ if [ -z "${_file}" ]; then
+ err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
+ fi
+ if [ "${_file}" != "${_file%.uzip}" ]; then
+ # Load geom_uzip kernel module if needed
+ require_kld geom_uzip
+ _dev="/dev/${_md}.uzip"
+ fi
+ for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
+ fi
+
+ # Debugging help.
+ debug "${_md} config: ${_config}"
+ debug "${_md} type: ${_type}"
+ debug "${_md} dev: ${_dev}"
+ debug "${_md} file: ${_file}"
+ debug "${_md} fs: ${_fs}"
+ debug "${_md} newfs flags: ${_newfs}"
+}
+
+mdconfig_start()
+{
+ local _md _mp _config _type _dev _file _fs _newfs _fsck_cmd
+
+ require_kld g_md
+
+ for _md in ${_mdconfig_list}; do
+ init_variables ${_md}
+ # Create md(4) devices of types swap, malloc and vnode if the
+ # file is on the root partition.
+ if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then
+ if [ "${_type}" = "vnode" ]; then
+ if is_readonly ${_fs}; then
+ warn "${_fs} is mounted read-only, skipping ${_md}."
+ continue
+ fi
+ fi
+ if mdconfig -l -u ${_md} >/dev/null 2>&1; then
+ err 3 "${_md} already exists"
+ fi
+ echo "Creating ${_md} device (${_type})."
+ if ! mdconfig -a ${_config} -u ${_md}; then
+ echo "Creating ${_md} device failed, moving on."
+ continue
+ fi
+ # Skip fsck for uzip devices.
+ if [ "${_type}" = "vnode" ]; then
+ if [ "${_file}" != "${_file%.uzip}" ]; then
+ _fsck_cmd=":"
+ elif checkyesno background_fsck; then
+ _fsck_cmd="fsck -F"
+ else
+ _fsck_cmd="fsck"
+ fi
+ if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
+ echo "Fsck failed on ${_dev}, not mounting the filesystem."
+ continue
+
+ fi
+ else
+ newfs ${_newfs} ${_dev} >/dev/null
+ fi
+ if mount -d ${_dev} 2>&1 >/dev/null; then
+ echo "Mounting ${_dev}."
+ mount ${_dev}
+ fi
+ fi
+ done
+}
+
+mdconfig_stop()
+{
+ local _md _mp _config _type _dev _file _fs _newfs _i
+
+ for _md in ${_mdconfig_list}; do
+ init_variables ${_md}
+ if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then
+ for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
+ if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
+ echo "Device ${_dev} isn't mounted."
+ else
+ echo "Umounting ${_dev}."
+ umount ${_dev}
+ fi
+ if mdconfig -l -u ${_md} >/dev/null 2>&1; then
+ echo "Destroying ${_md}."
+ mdconfig -d -u ${_md}
+ fi
+ fi
+ done
+}
+
+_mdconfig_cmd="$1"
+if [ $# -gt 0 ]; then
+ shift
+fi
+[ -n "$*" ] && _mdconfig_list="$*"
+
+load_rc_config $name
+
+_mdconfig_unit=0
+if [ -z "${_mdconfig_list}" ]; then
+ while :; do
+ eval _mdconfig_config=\$mdconfig_md${_mdconfig_unit}
+ if [ -z "${_mdconfig_config}" ]; then
+ break
+ else
+ _mdconfig_list="${_mdconfig_list}${_mdconfig_list:+ }md${_mdconfig_unit}"
+ _mdconfig_unit=$((${_mdconfig_unit} + 1))
+ fi
+ done
+fi
+
+run_rc_command "${_mdconfig_cmd}"
diff --git a/etc/rc.d/mdconfig2 b/etc/rc.d/mdconfig2
new file mode 100644
index 0000000..8dc36a4
--- /dev/null
+++ b/etc/rc.d/mdconfig2
@@ -0,0 +1,226 @@
+#!/bin/sh
+#
+# Copyright (c) 2006 The FreeBSD Project
+# 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.
+#
+# $FreeBSD$
+#
+
+# PROVIDE: mdconfig2
+# REQUIRE: mountcritremote
+# BEFORE: SERVERS
+
+. /etc/rc.subr
+
+name="mdconfig2"
+stop_cmd="mdconfig2_stop"
+start_cmd="mdconfig2_start"
+
+is_readonly()
+{
+ local _mp _ret
+
+ _mp=$1
+ _ret=`mount | while read _line; do
+ case ${_line} in
+ *" ${_mp} "*read-only*)
+ echo "yes"
+ ;;
+
+ *)
+ ;;
+ esac;
+ done`
+
+ if [ -n "${_ret}" ]; then
+ return 0
+ else
+ return 1
+ fi
+}
+
+init_variables()
+{
+ local _i
+
+ _fs=""
+ _mp=""
+ _mounted="no"
+ _dev="/dev/${_md}"
+ eval _config=\$mdconfig_${_md}
+ eval _owner=\$mdconfig_${_md}_owner
+ eval _perms=\$mdconfig_${_md}_perms
+ eval _files=\$mdconfig_${_md}_files
+ eval _populate=\$mdconfig_${_md}_cmd
+
+ _type=${_config##*-t\ }
+ _type=${_type%%\ *}
+ if [ -z "${_type}" ]; then
+ err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}"
+ fi
+
+ if [ "${_type}" = "vnode" ]; then
+ _file=${_config##*-f\ }
+ _file=${_file%%\ *}
+ if [ -z "${_file}" ]; then
+ err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices"
+ fi
+
+ if [ "${_file}" != "${_file%.uzip}" ]; then
+ # Load geom_uzip kernel module if needed
+ require_kld geom_uzip
+ _dev="/dev/${_md}.uzip"
+ fi
+ for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done
+ fi
+
+ # Debugging help.
+ debug "${_md} config: ${_config}"
+ debug "${_md} type: ${_type}"
+ debug "${_md} dev: ${_dev}"
+ debug "${_md} file: ${_file}"
+ debug "${_md} fs: ${_fs}"
+ debug "${_md} owner: ${_owner}"
+ debug "${_md} perms: ${_perms}"
+ debug "${_md} files: ${_files}"
+ debug "${_md} populate cmd: ${_populate}"
+}
+
+mdconfig2_start()
+{
+ local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i
+
+ require_kld g_md
+
+ for _md in ${_mdconfig2_list}; do
+ init_variables ${_md}
+ if [ ! -r ${_file} ]; then
+ err 3 "${_file} doesn't exist"
+ continue
+ fi
+ # First pass: create md(4) vnode devices from files stored on
+ # non-root partition. Swap and malloc md(4) devices have already
+ # been created.
+ if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then
+ if is_readonly ${_fs}; then
+ warn "${_fs} is mounted read-only, skipping ${_md}."
+ continue
+ fi
+ if mdconfig -l -u ${_md} >/dev/null 2>&1; then
+ err 3 "${_md} already exists"
+ fi
+ echo "Creating ${_md} device (${_type})."
+ if ! mdconfig -a ${_config} -u ${_md}; then
+ echo "Creating ${_md} device failed, moving on."
+ continue
+ fi
+ # Skip fsck for uzip devices.
+ if [ "${_file}" != "${_file%.uzip}" ]; then
+ _fsck_cmd=":"
+ elif checkyesno background_fsck; then
+ _fsck_cmd="fsck -F"
+ else
+ _fsck_cmd="fsck"
+ fi
+ if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then
+ echo "Fsck failed on ${_dev}, not mounting the filesystem."
+ continue
+ fi
+ if mount -d ${_dev} >/dev/null 2>&1; then
+ echo "Mounting ${_dev}."
+ mount ${_dev}
+ fi
+ fi
+
+ for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done
+ if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then
+ _mounted="yes"
+ fi
+
+ if checkyesno _mounted; then
+ # Second pass: change permissions and ownership.
+ [ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp}
+ [ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp}
+
+ # Third pass: populate with foreign files.
+ if [ -n "${_files}" -o -n "${_populate}" ]; then
+ echo "Populating ${_dev}."
+ fi
+ if [ -n "${_files}" ]; then
+ cp -Rp ${_files} ${_mp}
+ fi
+ if [ -n "${_populate}" ]; then
+ eval ${_populate}
+ fi
+ fi
+ done
+}
+
+mdconfig2_stop()
+{
+ local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate
+
+ for _md in ${_mdconfig2_list}; do
+ init_variables ${_md}
+ if [ "${_type}" = "vnode" ]; then
+ for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done
+ if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then
+ continue
+ fi
+ if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then
+ echo "Device ${_dev} isn't mounted."
+ else
+ echo "Umounting ${_dev}."
+ umount ${_dev}
+ fi
+ if mdconfig -l -u ${_md} >/dev/null 2>&1; then
+ echo "Destroying ${_md}."
+ mdconfig -d -u ${_md}
+ fi
+ fi
+ done
+}
+
+_mdconfig2_cmd="$1"
+if [ $# -gt 0 ]; then
+ shift
+fi
+[ -n "$*" ] && _mdconfig2_list="$*"
+
+load_rc_config $name
+
+_mdconfig2_unit=0
+if [ -z "${_mdconfig2_list}" ]; then
+ while :; do
+ eval _mdconfig2_config=\$mdconfig_md${_mdconfig2_unit}
+ if [ -z "${_mdconfig2_config}" ]; then
+ break
+ else
+ _mdconfig2_list="${_mdconfig2_list}${_mdconfig2_list:+ }md${_mdconfig2_unit}"
+ _mdconfig2_unit=$((${_mdconfig2_unit} + 1))
+ fi
+ done
+fi
+
+run_rc_command "${_mdconfig2_cmd}"
diff --git a/etc/rc.subr b/etc/rc.subr
index 1037bbc..9c6a158 100644
--- a/etc/rc.subr
+++ b/etc/rc.subr
@@ -1379,6 +1379,35 @@ ltr()
echo "${_out}"
}
+# require_kld name
+# Ensure given module is loaded.
+# Try to load it if it's not.
+require_kld()
+{
+ local _name _line _ret
+
+ _name=$1
+ _me="require_kld"
+
+ _ret=`kldstat -v | while read _line; do
+ case ${_line} in
+ *" ${_name}")
+ echo "yes"
+ ;;
+ *)
+ ;;
+ esac;
+ done`
+
+ if [ -z "${_ret}" ]; then
+ if kldload ${_name}; then
+ info "${_name} module loaded."
+ else
+ err 1 "${_me}: ${_name} module failed to load."
+ fi
+ fi
+}
+
# Creates a list of providers for GELI encryption.
geli_make_list()
{
diff --git a/share/man/man5/rc.conf.5 b/share/man/man5/rc.conf.5
index a74e2ba..cef3c21 100644
--- a/share/man/man5/rc.conf.5
+++ b/share/man/man5/rc.conf.5
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd May 11, 2006
+.Dd May 18, 2006
.Dt RC.CONF 5
.Os
.Sh NAME
@@ -3415,6 +3415,91 @@ The default is
which causes log files flagged with a
.Cm C
to be created.
+.It Va mdconfig_md Ns Ao Ar X Ac
+.Pq Vt str
+Arguments to
+.Xr mdconfig 8
+for
+.Xr md 4
+device
+.Ar X .
+At minimum a
+.Fl t Ar type
+must be specified and either a
+.Fl s Ar size
+for malloc or swap backed
+.Xr md 4
+devices or a
+.Fl f Ar file
+for vnode backed
+.Xr md 4
+devices.
+Note that
+.Va mdconfig_md Ns Ao Ar X Ac
+variables are evaluated until one variable is unset or null.
+.It Va mdconfig_md Ns Ao Ar X Ac Ns Va _newfs
+.Pq Vt str
+Optional arguments passed to
+.Xr newfs 8
+to initialize
+.Xr md 4
+device
+.Ar X .
+.It Va mdconfig_md Ns Ao Ar X Ac Ns Va _owner
+.Pq Vt str
+An ownership specification passed to
+.Xr chown 8
+after the specified
+.Xr md 4
+device
+.Ar X
+has been mounted.
+Both the
+.Xr md 4
+device and the mount point will be changed.
+.It Va mdconfig_md Ns Ao Ar X Ac Ns Va _perms
+.Pq Vt str
+A mode string passed to
+.Xr chmod 1
+after the specified
+.Xr md 4
+device
+.Ar X
+has been mounted.
+Both the
+.Xr md 4
+device and the mount point will be changed.
+.It Va mdconfig_md Ns Ao Ar X Ac Ns Va _files
+.Pq Vt str
+Files to be copied to the mount point of the
+.Xr md 4
+device
+.Ar X
+after it has been mounted.
+.It Va mdconfig_md Ns Ao Ar X Ac Ns Va _cmd
+.Pq Vt str
+Command to execute after the specified
+.Xr md 4
+device
+.Ar X
+has been mounted.
+Note that the command is passed to
+.Li eval
+and that both
+.Li _dev
+and
+.Li _mp
+variables can be used to reference respectively the
+.Xr md 4
+device and the mount point.
+Assuming that the
+.Xr md 4
+device is
+.Li md0 ,
+one could set the following:
+.Bd -literal
+mdconfig_md0_cmd="tar xfzC /var/file.tgz \\${_mp}"
+.Ed
.It Va ramdisk_units
.Pq Vt str
A list of one or more ramdisk units to configure with
@@ -3430,6 +3515,8 @@ must specify at least a
in a
.Va ramdisk_ Ns Ao Ar X Ac Ns Va _config
variable.
+Note that this way to configure ramdisks has been deprecated
+in favor of new mdconfig variables (see above).
.It Va ramdisk_ Ns Ao Ar X Ac Ns Va _config
.Pq Vt str
Arguments to
OpenPOWER on IntegriCloud