]> CyberLeo.Net >> Repos - CDN/Mosi.git/blob - script/genufs
boot/zfs symlink so that zpool.cache persists
[CDN/Mosi.git] / script / genufs
1 #!/bin/sh
2
3 _root="$(dirname "${0}")"; . "${_root}/lib/env.sh"
4
5 want root log
6
7 min_ufs_pad=1024
8
9 pebkac(){
10   [ "${*}" ] && echo "${*}"
11   echo ""
12   echo "Usage: genufs [-h] [-l <label>] [-p <pad kilobytes>] [-s <size kilobytes>] [-o <image>] <directory>"
13   echo ""
14   echo "Generate a UFS filesystem image populated with the files"
15   echo " in the specified directory node."
16   exit 1
17 }
18
19 while getopts "o:hl:l:p:s:" opt
20 do
21   case "${opt}" in
22     o) root_img="${OPTARG}" ;;
23     l) root_name="${OPTARG}" ;;
24     p) ufs_pad="${OPTARG}" ;;
25     s) kbytes="${OPTARG}" ;;
26     h) pebkac ;;
27     [?]) pebkac "Unrecognized option ${opt}" ;;
28   esac
29 done
30 shift $(( $OPTIND - 1 ))
31
32 root_src="${1}"
33
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}}"
39
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
45
46 log Generating ufs image "${root_name}" "(${kbytes}kB)"
47
48 # Prepare the backing store
49 rm -f "${root_img}"
50 dd if=/dev/zero of="${root_img}" bs=1024 count=0 seek=${kbytes} 2> /dev/null
51
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')"
56
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
59
60 # Copy files into image
61 df -h "${temp_root}"
62 ( cd "${root_src}"; find . | cpio --make-directories -p "${temp_root}" 2>&1 | egrep -v ' blocks$' )
63 df -h "${temp_root}" | tail -n 1
64 sync
65
66 # Clean up
67 umount -f "${temp_root}"
68 mdconfig -d -u "${temp_node}"
69 rm -Rf "${temp_root}"
70 trap "" exit hup int term kill
71
72 # Label the image
73 tunefs -L "${root_name}" "${root_img}"