3 _root="$(dirname "${0}")"; . "${_root}/lib/env.sh"
10 [ "${*}" ] && echo "${*}"
12 echo "Usage: genufs [-h] [-l <label>] [-p <pad kilobytes>] [-s <size kilobytes>] [-o <image>] <directory>"
14 echo "Generate a UFS filesystem image populated with the files"
15 echo " in the specified directory node."
19 while getopts "o:hl:l:p:s:" opt
22 o) root_img="${OPTARG}" ;;
23 l) root_name="${OPTARG}" ;;
24 p) ufs_pad="${OPTARG}" ;;
25 s) kbytes="${OPTARG}" ;;
27 [?]) pebkac "Unrecognized option ${opt}" ;;
30 shift $(( $OPTIND - 1 ))
34 ufs_pad="${ufs_pad:-${min_ufs_pad}}"
35 root_name="${root_name:-$(basename "${root_src}")}" # "
36 root_img="${root_img:-${root_name}.img}"
37 fs_kbytes="$(( $( du -sk "${root_src}" | awk '{print $1}' ) + ${ufs_pad} ))" 2>/dev/null
38 kbytes="${kbytes:-${fs_kbytes}}"
40 # Execution constraints
41 [ ! -d "${root_src}" ] && err "${root_src}": not a directory
42 [ -f "${root_img}" ] && err "${root_img}": file exists
43 [ "${ufs_pad}" -lt "${min_ufs_pad}" ] && err ufs_pad should be at least "${min_ufs_pad}"
44 [ "${kbytes}" -lt "${fs_kbytes}" ] && err Image size "${kbytes}"kB cannot hold supplied filetree "${fs_kbytes}"kB
46 log Generating ufs image "${root_name}" "(${kbytes}kB)"
48 # Prepare the backing store
50 dd if=/dev/zero of="${root_img}" bs=1024 count=0 seek=${kbytes} 2> /dev/null
52 # Generate and mount the image
53 temp_root="$(mktemp -d "/tmp/${root_name}.XXXXXXXX")"
54 mdmfs -F "${root_img}" -U -m0 -Ospace -oasync md "${temp_root}"
55 temp_node="$(df "${temp_root}" | tail -n 1 | awk '{print $1}' | sed -e 's/^\/dev\///g')"
57 # Clean up if things explode
58 trap "umount -f '${temp_root}'; mdconfig -d -u '${temp_node}'; rm -Rf '${temp_root}'" exit hup int term kill
60 # Copy files into image
62 ( cd "${root_src}"; find . | cpio --make-directories -p "${temp_root}" 2>&1 | egrep -v ' blocks$' )
63 df -h "${temp_root}" | tail -n 1
67 umount -f "${temp_root}"
68 mdconfig -d -u "${temp_node}"
70 trap "" exit hup int term kill
73 tunefs -L "${root_name}" "${root_img}"