mdconfig revision 208307
1289284Srpaulo#!/bin/sh 2289284Srpaulo# 3289284Srpaulo# Copyright (c) 2006 The FreeBSD Project 4289284Srpaulo# All rights reserved. 5289284Srpaulo# 6289284Srpaulo# Redistribution and use in source and binary forms, with or without 7289284Srpaulo# modification, are permitted provided that the following conditions 8289284Srpaulo# are met: 9289284Srpaulo# 1. Redistributions of source code must retain the above copyright 10289284Srpaulo# notice, this list of conditions and the following disclaimer. 11289284Srpaulo# 2. Redistributions in binary form must reproduce the above copyright 12289284Srpaulo# notice, this list of conditions and the following disclaimer in the 13289284Srpaulo# documentation and/or other materials provided with the distribution. 14289284Srpaulo# 15289284Srpaulo# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16289284Srpaulo# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17289284Srpaulo# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18337817Scy# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19289284Srpaulo# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20289284Srpaulo# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21289284Srpaulo# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22289284Srpaulo# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23289284Srpaulo# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24289284Srpaulo# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25289284Srpaulo# SUCH DAMAGE. 26289284Srpaulo# 27289284Srpaulo# $FreeBSD: head/etc/rc.d/mdconfig 208307 2010-05-19 19:03:19Z dougb $ 28289284Srpaulo# 29289284Srpaulo 30289284Srpaulo# PROVIDE: mdconfig 31289284Srpaulo# REQUIRE: localswap root 32289284Srpaulo 33289284Srpaulo. /etc/rc.subr 34289284Srpaulo 35289284Srpauloname="mdconfig" 36289284Srpaulostop_cmd="mdconfig_stop" 37289284Srpaulostart_cmd="mdconfig_start" 38289284Srpaulostart_precmd='[ -n "${_mdconfig_list}" ]' 39289284Srpaulorequired_modules="geom_md:g_md" 40289284Srpaulo 41289284Srpaulois_readonly() 42289284Srpaulo{ 43289284Srpaulo local _mp _ret 44289284Srpaulo 45289284Srpaulo _mp=$1 46289284Srpaulo _ret=`mount | while read _line; do 47289284Srpaulo case ${_line} in 48289284Srpaulo *" ${_mp} "*read-only*) 49289284Srpaulo echo "yes" 50289284Srpaulo ;; 51289284Srpaulo 52289284Srpaulo *) 53289284Srpaulo ;; 54289284Srpaulo esac; 55289284Srpaulo done` 56289284Srpaulo 57289284Srpaulo if [ -n "${_ret}" ]; then 58289284Srpaulo return 0 59289284Srpaulo else 60289284Srpaulo return 1 61289284Srpaulo fi 62289284Srpaulo} 63289284Srpaulo 64289284Srpauloinit_variables() 65289284Srpaulo{ 66289284Srpaulo local _i 67289284Srpaulo 68289284Srpaulo _fs="" 69289284Srpaulo _mp="" 70289284Srpaulo _dev="/dev/${_md}" 71289284Srpaulo eval _config=\$mdconfig_${_md} 72289284Srpaulo eval _newfs=\$mdconfig_${_md}_newfs 73289284Srpaulo 74289284Srpaulo _type=${_config##*-t\ } 75289284Srpaulo _type=${_type%%\ *} 76289284Srpaulo if [ -z "${_type}" ]; then 77289284Srpaulo err 1 "You need to specify \"-t <type>\" in mdconfig_${_md}" 78289284Srpaulo fi 79289284Srpaulo 80289284Srpaulo if [ "${_type}" = "vnode" ]; then 81289284Srpaulo _file=${_config##*-f\ } 82289284Srpaulo _file=${_file%%\ *} 83289284Srpaulo if [ -z "${_file}" ]; then 84289284Srpaulo err 2 "You need to specify \"-f <file>\" in mdconfig_${_md} for vnode devices" 85289284Srpaulo fi 86289284Srpaulo if [ "${_file}" != "${_file%.uzip}" ]; then 87289284Srpaulo _dev="/dev/${_md}.uzip" 88289284Srpaulo fi 89289284Srpaulo for _i in `df ${_file} 2>/dev/null`; do _fs=${_i}; done 90289284Srpaulo fi 91289284Srpaulo 92289284Srpaulo # Debugging help. 93289284Srpaulo debug "${_md} config: ${_config}" 94289284Srpaulo debug "${_md} type: ${_type}" 95289284Srpaulo debug "${_md} dev: ${_dev}" 96289284Srpaulo debug "${_md} file: ${_file}" 97289284Srpaulo debug "${_md} fs: ${_fs}" 98289284Srpaulo debug "${_md} newfs flags: ${_newfs}" 99289284Srpaulo} 100289284Srpaulo 101289284Srpaulomdconfig_start() 102289284Srpaulo{ 103289284Srpaulo local _md _mp _config _type _dev _file _fs _newfs _fsck_cmd 104289284Srpaulo 105289284Srpaulo for _md in ${_mdconfig_list}; do 106289284Srpaulo init_variables ${_md} 107289284Srpaulo # Create md(4) devices of types swap, malloc and vnode if the 108289284Srpaulo # file is on the root partition. 109289284Srpaulo if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then 110337817Scy if [ "${_type}" = "vnode" ]; then 111289284Srpaulo if is_readonly ${_fs}; then 112289284Srpaulo warn "${_fs} is mounted read-only, skipping ${_md}." 113289284Srpaulo continue 114289284Srpaulo fi 115289284Srpaulo if [ "${_file}" != "${_file%.uzip}" ]; then 116289284Srpaulo load_kld -m g_uzip geom_uzip || return 3 117289284Srpaulo # sleep a bit to allow creation of /dev/mdX.uzip 118289284Srpaulo sleep 2 119289284Srpaulo fi 120337817Scy fi 121337817Scy if mdconfig -l -u ${_md} >/dev/null 2>&1; then 122337817Scy err 3 "${_md} already exists" 123289284Srpaulo fi 124289284Srpaulo echo "Creating ${_md} device (${_type})." 125289284Srpaulo if ! mdconfig -a ${_config} -u ${_md}; then 126289284Srpaulo echo "Creating ${_md} device failed, moving on." 127289284Srpaulo continue 128289284Srpaulo fi 129289284Srpaulo # Skip fsck for uzip devices. 130337817Scy if [ "${_type}" = "vnode" ]; then 131289284Srpaulo if [ "${_file}" != "${_file%.uzip}" ]; then 132289284Srpaulo _fsck_cmd=":" 133289284Srpaulo elif checkyesno background_fsck; then 134289284Srpaulo _fsck_cmd="fsck -F" 135289284Srpaulo else 136289284Srpaulo _fsck_cmd="fsck" 137289284Srpaulo fi 138289284Srpaulo if ! eval ${_fsck_cmd} -p ${_dev} >/dev/null; then 139289284Srpaulo echo "Fsck failed on ${_dev}, not mounting the filesystem." 140289284Srpaulo continue 141289284Srpaulo 142289284Srpaulo fi 143289284Srpaulo else 144289284Srpaulo newfs ${_newfs} ${_dev} >/dev/null 145289284Srpaulo fi 146289284Srpaulo if mount -d ${_dev} 2>&1 >/dev/null; then 147289284Srpaulo echo "Mounting ${_dev}." 148289284Srpaulo mount ${_dev} 149289284Srpaulo fi 150289284Srpaulo fi 151289284Srpaulo done 152289284Srpaulo} 153289284Srpaulo 154289284Srpaulomdconfig_stop() 155289284Srpaulo{ 156289284Srpaulo local _md _mp _config _type _dev _file _fs _newfs _i 157289284Srpaulo 158289284Srpaulo for _md in ${_mdconfig_list}; do 159289284Srpaulo init_variables ${_md} 160289284Srpaulo if [ "${_type}" != "vnode" -o "${_fs}" = "/" ]; then 161289284Srpaulo for _i in `df ${_dev} 2>/dev/null`; do _mp=${_i}; done 162289284Srpaulo if [ -z "${_mp}" -o "${_mp}" != "${_mp%%%}" ]; then 163289284Srpaulo echo "Device ${_dev} isn't mounted." 164289284Srpaulo else 165289284Srpaulo echo "Umounting ${_dev}." 166289284Srpaulo umount ${_dev} 167289284Srpaulo fi 168289284Srpaulo if mdconfig -l -u ${_md} >/dev/null 2>&1; then 169337817Scy echo "Destroying ${_md}." 170289284Srpaulo mdconfig -d -u ${_md} 171289284Srpaulo fi 172289284Srpaulo fi 173289284Srpaulo done 174289284Srpaulo} 175289284Srpaulo 176289284Srpaulo_mdconfig_cmd="$1" 177289284Srpauloif [ $# -gt 0 ]; then 178289284Srpaulo shift 179289284Srpaulofi 180289284Srpaulo[ -n "$*" ] && _mdconfig_list="$*" 181289284Srpaulo 182289284Srpauloload_rc_config $name 183289284Srpaulo 184289284Srpaulo_mdconfig_unit=0 185289284Srpauloif [ -z "${_mdconfig_list}" ]; then 186289284Srpaulo while :; do 187289284Srpaulo eval _mdconfig_config=\$mdconfig_md${_mdconfig_unit} 188289284Srpaulo if [ -z "${_mdconfig_config}" ]; then 189289284Srpaulo break 190289284Srpaulo else 191289284Srpaulo _mdconfig_list="${_mdconfig_list}${_mdconfig_list:+ }md${_mdconfig_unit}" 192289284Srpaulo _mdconfig_unit=$((${_mdconfig_unit} + 1)) 193289284Srpaulo fi 194289284Srpaulo done 195289284Srpaulofi 196289284Srpaulo 197289284Srpaulorun_rc_command "${_mdconfig_cmd}" 198289284Srpaulo