10696600cSBjoern A. Zeeb#!/bin/sh 20696600cSBjoern A. Zeeb# 30696600cSBjoern A. Zeeb# Copyright (c) 2006 The FreeBSD Project 40696600cSBjoern A. Zeeb# All rights reserved. 50696600cSBjoern A. Zeeb# 60696600cSBjoern A. Zeeb# Redistribution and use in source and binary forms, with or without 70696600cSBjoern A. Zeeb# modification, are permitted provided that the following conditions 80696600cSBjoern A. Zeeb# are met: 90696600cSBjoern A. Zeeb# 1. Redistributions of source code must retain the above copyright 100696600cSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer. 110696600cSBjoern A. Zeeb# 2. Redistributions in binary form must reproduce the above copyright 120696600cSBjoern A. Zeeb# notice, this list of conditions and the following disclaimer in the 130696600cSBjoern A. Zeeb# documentation and/or other materials provided with the distribution. 140696600cSBjoern A. Zeeb# 150696600cSBjoern A. Zeeb# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 160696600cSBjoern A. Zeeb# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 170696600cSBjoern A. Zeeb# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 180696600cSBjoern A. Zeeb# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 190696600cSBjoern A. Zeeb# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 200696600cSBjoern A. Zeeb# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 210696600cSBjoern A. Zeeb# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 220696600cSBjoern A. Zeeb# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 230696600cSBjoern A. Zeeb# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 240696600cSBjoern A. Zeeb# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 250696600cSBjoern A. Zeeb# SUCH DAMAGE. 260696600cSBjoern A. Zeeb# 270696600cSBjoern A. Zeeb# 280696600cSBjoern A. Zeeb 290696600cSBjoern A. Zeeb# PROVIDE: mdconfig2 300696600cSBjoern A. Zeeb# REQUIRE: mountcritremote 310696600cSBjoern A. Zeeb# BEFORE: SERVERS 320696600cSBjoern A. Zeeb 330696600cSBjoern A. Zeeb. /etc/rc.subr 340696600cSBjoern A. Zeeb 350696600cSBjoern A. Zeebname="mdconfig2" 360696600cSBjoern A. Zeebdesc="Create and control memory disks" 370696600cSBjoern A. Zeebstop_cmd="mdconfig2_stop" 380696600cSBjoern A. Zeebstart_cmd="mdconfig2_start" 390696600cSBjoern A. Zeebstart_precmd='[ -n "${_mdconfig2_list}" ]' 400696600cSBjoern A. Zeebrequired_modules="geom_md:g_md" 410696600cSBjoern A. Zeeb 420696600cSBjoern A. Zeebis_readonly() 430696600cSBjoern A. Zeeb{ 440696600cSBjoern A. Zeeb local _mp _ret 450696600cSBjoern A. Zeeb 460696600cSBjoern A. Zeeb _mp=$1 470696600cSBjoern A. Zeeb _ret=`mount | while read _line; do 480696600cSBjoern A. Zeeb case ${_line} in 490696600cSBjoern A. Zeeb *" ${_mp} "*read-only*) 500696600cSBjoern A. Zeeb echo "yes" 510696600cSBjoern A. Zeeb ;; 520696600cSBjoern A. Zeeb 530696600cSBjoern A. Zeeb *) 540696600cSBjoern A. Zeeb ;; 550696600cSBjoern A. Zeeb esac; 560696600cSBjoern A. Zeeb done` 570696600cSBjoern A. Zeeb 580696600cSBjoern A. Zeeb if [ -n "${_ret}" ]; then 590696600cSBjoern A. Zeeb return 0 600696600cSBjoern A. Zeeb else 610696600cSBjoern A. Zeeb return 1 620696600cSBjoern A. Zeeb fi 630696600cSBjoern A. Zeeb} 640696600cSBjoern A. Zeeb 650696600cSBjoern A. Zeebinit_variables() 660696600cSBjoern A. Zeeb{ 670696600cSBjoern A. Zeeb local _i 680696600cSBjoern A. Zeeb 690696600cSBjoern A. Zeeb _fs="" 700696600cSBjoern A. Zeeb _mp="" 710696600cSBjoern A. Zeeb _mounted="no" 720696600cSBjoern A. Zeeb _dev="/dev/${_md}" 730696600cSBjoern A. Zeeb eval _config=\$mdconfig_${_md} 740696600cSBjoern A. Zeeb eval _owner=\$mdconfig_${_md}_owner 750696600cSBjoern A. Zeeb eval _perms=\$mdconfig_${_md}_perms 760696600cSBjoern A. Zeeb eval _files=\$mdconfig_${_md}_files 770696600cSBjoern A. Zeeb eval _populate=\$mdconfig_${_md}_cmd 780696600cSBjoern A. Zeeb 790696600cSBjoern A. Zeeb _type=${_config##*-t\ } 800696600cSBjoern A. Zeeb _type=${_type%%\ *} 810696600cSBjoern A. Zeeb if [ -z "${_type}" ]; then 820696600cSBjoern A. Zeeb err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}" 830696600cSBjoern A. Zeeb fi 840696600cSBjoern A. Zeeb 850696600cSBjoern A. Zeeb if [ "${_type}" = "vnode" ]; then 860696600cSBjoern A. Zeeb _file=${_config##*-f\ } 870696600cSBjoern A. Zeeb _file=${_file%%\ *} 880696600cSBjoern A. Zeeb if [ -z "${_file}" ]; then 890696600cSBjoern A. Zeeb err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices" 900696600cSBjoern A. Zeeb fi 910696600cSBjoern A. Zeeb 920696600cSBjoern A. Zeeb if [ "${_file}" != "${_file%.uzip}" ]; then 930696600cSBjoern A. Zeeb _dev="/dev/${_md}.uzip" 940696600cSBjoern A. Zeeb fi 950696600cSBjoern A. Zeeb for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done 960696600cSBjoern A. Zeeb fi 970696600cSBjoern A. Zeeb 980696600cSBjoern A. Zeeb # Debugging help. 990696600cSBjoern A. Zeeb debug "${_md} config: ${_config}" 1000696600cSBjoern A. Zeeb debug "${_md} type: ${_type}" 1010696600cSBjoern A. Zeeb debug "${_md} dev: ${_dev}" 1020696600cSBjoern A. Zeeb debug "${_md} file: ${_file}" 1030696600cSBjoern A. Zeeb debug "${_md} fs: ${_fs}" 1040696600cSBjoern A. Zeeb debug "${_md} owner: ${_owner}" 1050696600cSBjoern A. Zeeb debug "${_md} perms: ${_perms}" 1060696600cSBjoern A. Zeeb debug "${_md} files: ${_files}" 1070696600cSBjoern A. Zeeb debug "${_md} populate cmd: ${_populate}" 1080696600cSBjoern A. Zeeb} 1090696600cSBjoern A. Zeeb 1100696600cSBjoern A. Zeebmdconfig2_start() 1110696600cSBjoern A. Zeeb{ 1120696600cSBjoern A. Zeeb local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate _fsck_cmd _i 1130696600cSBjoern A. Zeeb 1140696600cSBjoern A. Zeeb for _md in ${_mdconfig2_list}; do 1150696600cSBjoern A. Zeeb init_variables ${_md} 1160696600cSBjoern A. Zeeb if [ ! -r ${_file} ]; then 1170696600cSBjoern A. Zeeb err 3 "${_file} doesn't exist" 1180696600cSBjoern A. Zeeb continue 1190696600cSBjoern A. Zeeb fi 1200696600cSBjoern A. Zeeb # First pass: create md(4) vnode devices from files stored on 1210696600cSBjoern A. Zeeb # non-root partition. Swap and malloc md(4) devices have already 1220696600cSBjoern A. Zeeb # been created. 1230696600cSBjoern A. Zeeb if [ "${_type}" = "vnode" -a "${_fs}" != "/" ]; then 1240696600cSBjoern A. Zeeb if [ "${_file}" != "${_file%.uzip}" ]; then 125b11974c2SChris Rees load_kld -m g_uzip geom_uzip || return 3 1260696600cSBjoern A. Zeeb fi 1270696600cSBjoern A. Zeeb if is_readonly ${_fs}; then 1280696600cSBjoern A. Zeeb warn "${_fs} is mounted read-only, skipping ${_md}." 1290696600cSBjoern A. Zeeb continue 1300696600cSBjoern A. Zeeb fi 1310696600cSBjoern A. Zeeb if mdconfig -l -u ${_md} >/dev/null 2>&1; then 1320696600cSBjoern A. Zeeb err 3 "${_md} already exists" 1330696600cSBjoern A. Zeeb fi 1340696600cSBjoern A. Zeeb echo "Creating ${_md} device (${_type})." 1350696600cSBjoern A. Zeeb if ! mdconfig -a ${_config} -u ${_md}; then 1360696600cSBjoern A. Zeeb echo "Creating ${_md} device failed, moving on." 1370696600cSBjoern A. Zeeb continue 1380696600cSBjoern A. Zeeb fi 1390696600cSBjoern A. Zeeb # Skip fsck for uzip devices. 1400696600cSBjoern A. Zeeb if [ "${_file}" != "${_file%.uzip}" ]; then 1410696600cSBjoern A. Zeeb _fsck_cmd=":" 1420696600cSBjoern A. Zeeb elif checkyesno background_fsck; then 1430696600cSBjoern A. Zeeb _fsck_cmd="fsck -F" 1440696600cSBjoern A. Zeeb else 1450696600cSBjoern A. Zeeb _fsck_cmd="fsck" 1460696600cSBjoern A. Zeeb fi 1470696600cSBjoern A. Zeeb if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then 1480696600cSBjoern A. Zeeb echo "Fsck failed on ${_dev}, not mounting the filesystem." 1490696600cSBjoern A. Zeeb continue 1500696600cSBjoern A. Zeeb fi 1510696600cSBjoern A. Zeeb if mount -d ${_dev} >/dev/null 2>&1; then 1520696600cSBjoern A. Zeeb echo "Mounting ${_dev}." 1530696600cSBjoern A. Zeeb mount ${_dev} 1540696600cSBjoern A. Zeeb fi 1550696600cSBjoern A. Zeeb fi 1560696600cSBjoern A. Zeeb 1570696600cSBjoern A. Zeeb for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done 1580696600cSBjoern A. Zeeb if [ ! -z "${_mp}" -a "${_mp}" = "${_mp%%%}" ]; then 1590696600cSBjoern A. Zeeb _mounted="yes" 1600696600cSBjoern A. Zeeb fi 1610696600cSBjoern A. Zeeb 1620696600cSBjoern A. Zeeb if checkyesno _mounted; then 1630696600cSBjoern A. Zeeb # Second pass: change permissions and ownership. 1640696600cSBjoern A. Zeeb [ -z "${_owner}" ] || chown -f ${_owner} ${_dev} ${_mp} 1650696600cSBjoern A. Zeeb [ -z "${_perms}" ] || chmod -f ${_perms} ${_dev} ${_mp} 1660696600cSBjoern A. Zeeb 1670696600cSBjoern A. Zeeb # Third pass: populate with foreign files. 1680696600cSBjoern A. Zeeb if [ -n "${_files}" -o -n "${_populate}" ]; then 1690696600cSBjoern A. Zeeb echo "Populating ${_dev}." 1700696600cSBjoern A. Zeeb fi 1710696600cSBjoern A. Zeeb if [ -n "${_files}" ]; then 1720696600cSBjoern A. Zeeb cp -Rp ${_files} ${_mp} 1730696600cSBjoern A. Zeeb fi 1740696600cSBjoern A. Zeeb if [ -n "${_populate}" ]; then 1750696600cSBjoern A. Zeeb eval ${_populate} 1760696600cSBjoern A. Zeeb fi 1770696600cSBjoern A. Zeeb fi 1780696600cSBjoern A. Zeeb done 1790696600cSBjoern A. Zeeb} 1800696600cSBjoern A. Zeeb 1810696600cSBjoern A. Zeebmdconfig2_stop() 1820696600cSBjoern A. Zeeb{ 1830696600cSBjoern A. Zeeb local _md _fs _mp _mounted _dev _config _type _file _owner _perms _files _populate 1840696600cSBjoern A. Zeeb 1850696600cSBjoern A. Zeeb for _md in ${_mdconfig2_list}; do 1860696600cSBjoern A. Zeeb init_variables ${_md} 1870696600cSBjoern A. Zeeb if [ "${_type}" = "vnode" ]; then 1880696600cSBjoern A. Zeeb for i in `df ${_dev} 2>/dev/null`; do _mp=$i; done 1890696600cSBjoern A. Zeeb if [ ! -r "${_file}" -o "${_fs}" = "/" ]; then 1900696600cSBjoern A. Zeeb continue 1910696600cSBjoern A. Zeeb fi 1920696600cSBjoern A. Zeeb if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then 1930696600cSBjoern A. Zeeb echo "Device ${_dev} isn't mounted." 1940696600cSBjoern A. Zeeb else 1950696600cSBjoern A. Zeeb echo "Umounting ${_dev}." 1960696600cSBjoern A. Zeeb umount ${_dev} 1970696600cSBjoern A. Zeeb fi 1980696600cSBjoern A. Zeeb if mdconfig -l -u ${_md} >/dev/null 2>&1; then 1990696600cSBjoern A. Zeeb echo "Destroying ${_md}." 2000696600cSBjoern A. Zeeb mdconfig -d -u ${_md} 2010696600cSBjoern A. Zeeb fi 2020696600cSBjoern A. Zeeb fi 2030696600cSBjoern A. Zeeb done 2040696600cSBjoern A. Zeeb} 2050696600cSBjoern A. Zeeb 2060696600cSBjoern A. Zeeb_mdconfig2_cmd="$1" 2070696600cSBjoern A. Zeebif [ $# -gt 0 ]; then 2080696600cSBjoern A. Zeeb shift 2090696600cSBjoern A. Zeebfi 2100696600cSBjoern A. Zeeb[ -n "$*" ] && _mdconfig2_list="$*" 2110696600cSBjoern A. Zeeb 2120696600cSBjoern A. Zeebload_rc_config $name 2130696600cSBjoern A. Zeeb 214*f99f0ee1SAlexander Leidinger# doesn't make sense to run in a svcj: config setting 215*f99f0ee1SAlexander Leidingermdconfig2_svcj="NO" 216*f99f0ee1SAlexander Leidinger 2170696600cSBjoern A. Zeebif [ -z "${_mdconfig2_list}" ]; then 2180696600cSBjoern A. Zeeb for _mdconfig2_config in `list_vars mdconfig_md[0-9]\* | 2190696600cSBjoern A. Zeeb sort_lite -nk1.12` 2200696600cSBjoern A. Zeeb do 2210696600cSBjoern A. Zeeb _mdconfig2_unit=${_mdconfig2_config#mdconfig_md} 2220696600cSBjoern A. Zeeb [ "${_mdconfig2_unit#*[!0-9]}" = "$_mdconfig2_unit" ] || 2230696600cSBjoern A. Zeeb continue 2240696600cSBjoern A. Zeeb _mdconfig2_list="$_mdconfig2_list md$_mdconfig2_unit" 2250696600cSBjoern A. Zeeb done 2260696600cSBjoern A. Zeeb _mdconfig2_list="${_mdconfig2_list# }" 2270696600cSBjoern A. Zeebfi 2280696600cSBjoern A. Zeeb 2290696600cSBjoern A. Zeebrun_rc_command "${_mdconfig2_cmd}" 230