| @@ -1,16 +1,16 @@ | | | @@ -1,16 +1,16 @@ |
1 | #! /bin/sh | | 1 | #! /bin/sh |
2 | | | 2 | |
3 | # $NetBSD: mkimage,v 1.1 2012/01/15 02:01:02 agc Exp $ | | 3 | # $NetBSD: mkimage,v 1.2 2012/01/20 02:19:47 agc Exp $ |
4 | | | 4 | |
5 | # Copyright (c) 2012 Alistair Crooks <agc@NetBSD.org> | | 5 | # Copyright (c) 2012 Alistair Crooks <agc@NetBSD.org> |
6 | # All rights reserved. | | 6 | # All rights reserved. |
7 | # | | 7 | # |
8 | # Redistribution and use in source and binary forms, with or without | | 8 | # Redistribution and use in source and binary forms, with or without |
9 | # modification, are permitted provided that the following conditions | | 9 | # modification, are permitted provided that the following conditions |
10 | # are met: | | 10 | # are met: |
11 | # 1. Redistributions of source code must retain the above copyright | | 11 | # 1. Redistributions of source code must retain the above copyright |
12 | # notice, this list of conditions and the following disclaimer. | | 12 | # notice, this list of conditions and the following disclaimer. |
13 | # 2. Redistributions in binary form must reproduce the above copyright | | 13 | # 2. Redistributions in binary form must reproduce the above copyright |
14 | # notice, this list of conditions and the following disclaimer in the | | 14 | # notice, this list of conditions and the following disclaimer in the |
15 | # documentation and/or other materials provided with the distribution. | | 15 | # documentation and/or other materials provided with the distribution. |
16 | # | | 16 | # |
| @@ -73,117 +73,125 @@ sizeone() { | | | @@ -73,117 +73,125 @@ sizeone() { |
73 | case "$1" in | | 73 | case "$1" in |
74 | *.tgz|*.tar.gz) | | 74 | *.tgz|*.tar.gz) |
75 | tar tvzf "$1" | awk '{ tot += $5 } END { print tot }' | | 75 | tar tvzf "$1" | awk '{ tot += $5 } END { print tot }' |
76 | ;; | | 76 | ;; |
77 | *.tbz|*.tar.bz2) | | 77 | *.tbz|*.tar.bz2) |
78 | tar tvjf "$1" | awk '{ tot += $5 } END { print tot }' | | 78 | tar tvjf "$1" | awk '{ tot += $5 } END { print tot }' |
79 | ;; | | 79 | ;; |
80 | *) | | 80 | *) |
81 | echo 0 | | 81 | echo 0 |
82 | ;; | | 82 | ;; |
83 | esac | | 83 | esac |
84 | } | | 84 | } |
85 | | | 85 | |
86 | setsdir=/usr/build/release/i386/binary/sets | | 86 | bar="===" |
87 | size=0 # in MB | | 87 | custom=custom |
88 | overhead=8 # in MB | | | |
89 | image=usermode.img | | | |
90 | h=usermode1.$(uname -n) | | 88 | h=usermode1.$(uname -n) |
| | | 89 | image=usermode.img |
| | | 90 | overhead=8 # in MB |
91 | sets="base etc modules" | | 91 | sets="base etc modules" |
92 | usermodedirs="/var.run /var.log /etc.cow /root.cow /pkgs" | | 92 | setsdir=/usr/build/release/$(uname -m)/binary/sets |
| | | 93 | size=0 # in MB |
93 | specialdirs="/kern /proc" | | 94 | specialdirs="/kern /proc" |
94 | bar="===" | | 95 | usermodedirs="/var.run /var.log /etc.cow /root.cow /pkgs" |
| | | 96 | sudo="sudo" |
95 | | | 97 | |
96 | while [ $# -gt 0 ]; do | | 98 | while [ $# -gt 0 ]; do |
97 | case "$1" in | | 99 | case "$1" in |
98 | -S) setsdir=$2; shift ;; | | 100 | -S) setsdir=$2; shift ;; |
| | | 101 | -c) custom=$2; shift ;; |
99 | -h) h=$2; shift ;; | | 102 | -h) h=$2; shift ;; |
100 | -s) size=$2; shift ;; | | 103 | -s) size=$2; shift ;; |
101 | -x) set -x ;; | | 104 | -x) set -x ;; |
102 | *) break ;; | | 105 | *) break ;; |
103 | esac | | 106 | esac |
104 | shift | | 107 | shift |
105 | done | | 108 | done |
106 | | | 109 | |
107 | if [ $# -gt 0 ]; then | | 110 | if [ $# -gt 0 ]; then |
108 | # take the next argument as being the image name | | 111 | # take the next argument as being the image name |
109 | image="$1" | | 112 | image="$1" |
110 | shift | | 113 | shift |
111 | fi | | 114 | fi |
112 | | | 115 | |
113 | total=0 | | 116 | total=0 |
114 | for s in ${sets}; do | | 117 | for s in ${sets}; do |
115 | total=$(expr ${total} + $(sizeone ${setsdir}/${s}.tgz)) | | 118 | total=$(expr ${total} + $(sizeone ${setsdir}/${s}.tgz)) |
116 | done | | 119 | done |
117 | total=$(expr \( ${total} / 1000000 \) + ${overhead}) | | 120 | # calculate size of custom files |
| | | 121 | custsize=0 |
| | | 122 | if [ -d "${custom}" ]; then |
| | | 123 | custsize=$(ls -lR "${custom}" | awk 'NF == 9 { tot += $5 } END { print tot }') |
| | | 124 | fi |
| | | 125 | total=$(expr \( \( ${total} + ${custsize} \) / 1000000 \) + ${overhead}) |
118 | if [ $size -eq 0 ]; then | | 126 | if [ $size -eq 0 ]; then |
119 | # auto-size the pkgs fs | | 127 | # auto-size the pkgs fs |
120 | size=${total} | | 128 | size=${total} |
121 | else | | 129 | else |
122 | # check that we've been given enough space | | 130 | # check that we've been given enough space |
123 | if [ ${total} -gt ${size} ]; then | | 131 | if [ ${total} -gt ${size} ]; then |
124 | echo "File system size given as ${size} MB, but it needs ${total} MB" >&2 | | 132 | echo "File system size given as ${size} MB, but it needs ${total} MB" >&2 |
125 | exit 1 | | 133 | exit 1 |
126 | fi | | 134 | fi |
127 | fi | | 135 | fi |
128 | | | 136 | |
129 | echo "${bar} making a new ${size} MB image in ${image} ${bar}" | | 137 | echo "${bar} making a new ${size} MB image in ${image} ${bar}" |
130 | dd if=/dev/zero of=${image} bs=1m count=${size} | | 138 | dd if=/dev/zero of=${image} bs=1m count=${size} |
131 | | | 139 | |
132 | vnddev=$(next_avail vnd) | | 140 | vnddev=$(next_avail vnd) |
133 | echo "${bar} mounting image via vnd ${vnddev} ${bar}" | | 141 | echo "${bar} mounting image via vnd ${vnddev} ${bar}" |
134 | sudo vnconfig ${vnddev} ${image} | | 142 | ${sudo} vnconfig ${vnddev} ${image} |
135 | sudo newfs /dev/r${vnddev}a | | 143 | ${sudo} newfs /dev/r${vnddev}a |
136 | sudo mount /dev/${vnddev}a /mnt | | 144 | ${sudo} mount /dev/${vnddev}a /mnt |
137 | | | 145 | |
138 | echo "${bar} installing sets ${bar}" | | 146 | echo "${bar} installing sets ${bar}" |
139 | (cd /mnt && | | 147 | (cd /mnt && |
140 | for s in ${sets}; do | | 148 | for s in ${sets}; do |
141 | echo ${s} | | 149 | echo ${s} |
142 | sudo tar xpzf ${setsdir}/${s}.tgz | | 150 | ${sudo} tar xpzf ${setsdir}/${s}.tgz |
143 | done | | 151 | done |
144 | ) | | 152 | ) |
145 | | | 153 | |
146 | echo "${bar} performing customisations ${bar}" | | 154 | echo "${bar} performing customisations ${bar}" |
147 | sudo rm -f /mnt/etc/motd | | 155 | ${sudo} rm -f /mnt/etc/motd |
148 | | | 156 | |
149 | tmp=/tmp/usermode.$$ | | 157 | tmp=/tmp/usermode.$$ |
150 | cat > ${tmp} << EOF | | 158 | cat > ${tmp} << EOF |
151 | # NetBSD/usermode /etc/fstab | | 159 | # NetBSD/usermode /etc/fstab |
152 | /dev/ld0a / ffs ro 1 1 | | 160 | /dev/ld0a / ffs ro 1 1 |
153 | /dev/ld1a /pkgs ffs ro 1 2 | | 161 | /dev/ld1a /pkgs ffs ro 1 2 |
154 | kernfs /kern kernfs rw | | 162 | kernfs /kern kernfs rw |
155 | ptyfs /dev/pts ptyfs rw | | 163 | ptyfs /dev/pts ptyfs rw |
156 | procfs /proc procfs rw | | 164 | procfs /proc procfs rw |
157 | # mount /root as tmpfs on top of existing dir | | 165 | # mount /root as tmpfs on top of existing dir |
158 | tmpfs /root.cow tmpfs rw,-s2M 0 0 | | 166 | tmpfs /root.cow tmpfs rw,-s2M 0 0 |
159 | /root.cow /root union rw,hidden 0 0 | | 167 | /root.cow /root union rw,hidden 0 0 |
160 | # mount /etc as tmpfs on top of existing dir | | 168 | # mount /etc as tmpfs on top of existing dir |
161 | tmpfs /etc.cow tmpfs rw,-s12M 0 0 | | 169 | tmpfs /etc.cow tmpfs rw,-s12M 0 0 |
162 | /etc.cow /etc union rw,hidden 0 0 | | 170 | /etc.cow /etc union rw,hidden 0 0 |
163 | # mount /var/run as tmpfs on top of existing dir | | 171 | # mount /var/run as tmpfs on top of existing dir |
164 | tmpfs /var.run tmpfs rw,-s1M 0 0 | | 172 | tmpfs /var.run tmpfs rw,-s1M 0 0 |
165 | /var.run /var/run union rw,hidden - - | | 173 | /var.run /var/run union rw,hidden - - |
166 | # mount /var/log as tmpfs on top of existing dir | | 174 | # mount /var/log as tmpfs on top of existing dir |
167 | tmpfs /var.log tmpfs rw,-s10M 0 0 | | 175 | tmpfs /var.log tmpfs rw,-s10M 0 0 |
168 | /var.log /var/log union rw,hidden - - | | 176 | /var.log /var/log union rw,hidden - - |
169 | tmpfs /var/db tmpfs rw,-s8M 0 0 | | 177 | tmpfs /var/db tmpfs rw,-s8M 0 0 |
170 | tmpfs /tmp tmpfs rw,-s32M 0 0 | | 178 | tmpfs /tmp tmpfs rw,-s32M 0 0 |
171 | /dev/cd0a /cdrom cd9660 ro,noauto | | 179 | /dev/cd0a /cdrom cd9660 ro,noauto |
172 | EOF | | 180 | EOF |
173 | sudo mv ${tmp} /mnt/etc/fstab | | 181 | ${sudo} mv ${tmp} /mnt/etc/fstab |
174 | | | 182 | |
175 | cat > ${tmp} << EOF | | 183 | cat > ${tmp} << EOF |
176 | # $NetBSD: mkimage,v 1.1 2012/01/15 02:01:02 agc Exp $ | | 184 | # $NetBSD: mkimage,v 1.2 2012/01/20 02:19:47 agc Exp $ |
177 | # | | 185 | # |
178 | # see rc.conf(5) for more information. | | 186 | # see rc.conf(5) for more information. |
179 | # | | 187 | # |
180 | # Use program=YES to enable program, NO to disable it. program_flags are | | 188 | # Use program=YES to enable program, NO to disable it. program_flags are |
181 | # passed to the program on the command line. | | 189 | # passed to the program on the command line. |
182 | # | | 190 | # |
183 | | | 191 | |
184 | # Load the defaults in from /etc/defaults/rc.conf (if it's readable). | | 192 | # Load the defaults in from /etc/defaults/rc.conf (if it's readable). |
185 | # These can be overridden below. | | 193 | # These can be overridden below. |
186 | # | | 194 | # |
187 | if [ -r /etc/defaults/rc.conf ]; then | | 195 | if [ -r /etc/defaults/rc.conf ]; then |
188 | . /etc/defaults/rc.conf | | 196 | . /etc/defaults/rc.conf |
189 | fi | | 197 | fi |
| @@ -192,42 +200,48 @@ fi | | | @@ -192,42 +200,48 @@ fi |
192 | # | | 200 | # |
193 | rc_configured=YES | | 201 | rc_configured=YES |
194 | | | 202 | |
195 | # make sure we have the right rw filesystem at boot | | 203 | # make sure we have the right rw filesystem at boot |
196 | critical_filesystems_local="/var/db /var.run /var/run /var.log /var/log /etc.cow /etc /root.cow /root" | | 204 | critical_filesystems_local="/var/db /var.run /var/run /var.log /var/log /etc.cow /etc /root.cow /root" |
197 | | | 205 | |
198 | # Add local overrides below | | 206 | # Add local overrides below |
199 | # | | 207 | # |
200 | dhcpcd=YES | | 208 | dhcpcd=YES |
201 | sshd=YES | | 209 | sshd=YES |
202 | | | 210 | |
203 | hostname=${h} | | 211 | hostname=${h} |
204 | EOF | | 212 | EOF |
205 | sudo mv ${tmp} /mnt/etc/rc.conf | | 213 | ${sudo} mv ${tmp} /mnt/etc/rc.conf |
206 | | | 214 | |
207 | echo "${bar} making extra directories ${bar}" | | 215 | echo "${bar} making extra directories ${bar}" |
208 | for d in ${usermodedirs}; do | | 216 | for d in ${usermodedirs}; do |
209 | sudo mkdir -p /mnt/${d} | | 217 | ${sudo} mkdir -p /mnt/${d} |
210 | done | | 218 | done |
211 | for d in ${specialdirs}; do | | 219 | for d in ${specialdirs}; do |
212 | sudo mkdir -p /mnt/${d} | | 220 | ${sudo} mkdir -p /mnt/${d} |
213 | done | | 221 | done |
214 | | | 222 | |
215 | echo "${bar} customising /var/tmp ${bar}" | | 223 | echo "${bar} customising /var/tmp ${bar}" |
216 | sudo rm -rf /mnt/var/tmp | | 224 | ${sudo} rm -rf /mnt/var/tmp |
217 | (cd /mnt/var && sudo ln -s /tmp tmp) | | 225 | (cd /mnt/var && ${sudo} ln -s /tmp tmp) |
218 | | | 226 | |
219 | # package-related stuff | | 227 | # package-related stuff |
220 | (cat /mnt/etc/csh.cshrc;echo "setenv PKG_DBDIR /usr/pkg/.dbdir") > ${tmp} | | 228 | (cat /mnt/etc/csh.cshrc;echo "setenv PKG_DBDIR /usr/pkg/.dbdir") > ${tmp} |
221 | sudo mv ${tmp} /mnt/etc/csh.cshrc | | 229 | ${sudo} mv ${tmp} /mnt/etc/csh.cshrc |
222 | (cat /mnt/etc/profile;echo "export PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} | | 230 | (cat /mnt/etc/profile;echo "export PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} |
223 | sudo mv ${tmp} /mnt/etc/profile | | 231 | ${sudo} mv ${tmp} /mnt/etc/profile |
224 | (echo "PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} | | 232 | (echo "PKG_DBDIR=/usr/pkg/.dbdir") > ${tmp} |
225 | sudo mv ${tmp} /mnt/etc/mk.conf | | 233 | ${sudo} mv ${tmp} /mnt/etc/mk.conf |
226 | (cd /mnt/usr && sudo ln -s /pkgs/usr/pkg pkg) | | 234 | (cd /mnt/usr && ${sudo} ln -s /pkgs/usr/pkg pkg) |
| | | 235 | |
| | | 236 | # last, customisation stage |
| | | 237 | if [ -d ${custom} ]; then |
| | | 238 | echo "${bar} user customisations from files in ${custom} ${bar}" |
| | | 239 | (cd ${custom} && ${sudo} pax -rwpe . /mnt) |
| | | 240 | fi |
227 | | | 241 | |
228 | df /mnt | | 242 | df /mnt |
229 | | | 243 | |
230 | sudo umount /mnt | | 244 | ${sudo} umount /mnt |
231 | sudo vnconfig -u ${vnddev} | | 245 | ${sudo} vnconfig -u ${vnddev} |
232 | | | 246 | |
233 | exit 0 | | 247 | exit 0 |