Date: Wed, 11 Jul 2007 17:32:45 GMT From: Ivan Voras <ivoras@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 123333 for review Message-ID: <200707111732.l6BHWj6d060266@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123333 Change 123333 by ivoras@ivoras_finstall on 2007/07/11 17:32:25 Make /usr tree in a compressed UFS-formatted disk image, introduce a (hopefully, temporary) ugly kludge for the "current date is negative" problem, discussed (without much progress) on mailing lists. Affected files ... .. //depot/projects/soc2007/ivoras_finstall/makeimage/bundles/livecd#3 edit .. //depot/projects/soc2007/ivoras_finstall/makeimage/makeimage.py#8 edit Differences ... ==== //depot/projects/soc2007/ivoras_finstall/makeimage/bundles/livecd#3 (text+ko) ==== @@ -1,10 +1,30 @@ +#!/bin/sh # $dest_file$ generated by finstall makeimage.py on $date$ $time$ # BEFORE: hostid # REQUIRE: root # KEYWORD: nojail -# -/sbin/mount_mfs -s 32m -S -m 3 -f 512 -b 4096 md /tmp -/bin/mkdir /tmp/etc /tmp/var /tmp/root + +# This is hack of tremendeous bogosity, but currently there's no way +# out of it. A normal FreeBSD kernel, once CD-booted, reports a date in +# 1937 (at least in VMWare Server). +# What I'm doing here is detecting if the date (in unix time_t format) +# is negative, and set the positive value as the current date. It doesn't +# work since the "wrong" date isn't simply a negative of the current one +# but at least it's in the current epoch. +t=`/bin/date +%s` +if [ $t -lt 0 ] +then + t=`/bin/expr -- $t \* -1` + /bin/date -f %s $t +fi + +/sbin/mount_mfs -s 128m -S -m 3 -f 512 -b 4096 md /tmp +/bin/mkdir /tmp/etc /tmp/var /tmp/root /tmp/install /sbin/mount_unionfs -o copymode=transparent /tmp/etc /etc /sbin/mount_unionfs -o copymode=transparent /tmp/var /var /sbin/mount_unionfs -o copymode=transparent /tmp/root /root +/sbin/mount_unionfs -o copymode=transparent /tmp/install /install + +/sbin/mdconfig -a -t vnode -f /usr/usr.img.uzip -u 60 +/sbin/mount -o ro /dev/md60.uzip /usr + ==== //depot/projects/soc2007/ivoras_finstall/makeimage/makeimage.py#8 (text+ko) ==== @@ -73,7 +73,7 @@ ISO = None STARTDIR = os.path.realpath(".") -opts, args = getopt(sys.argv[1:], "d:s:i:p:bch") +opts, args = getopt(sys.argv[1:], "d:s:i:p:k:bch") for o,a in opts: if o == "-d": WORKDIR = a @@ -113,6 +113,8 @@ DESTDIR = "%s/livecd" % WORKDIR initutils() + + if DoMakeRoot: if os.path.exists(DESTDIR): if not os.path.exists("%s/COPYRIGHT" % DESTDIR): @@ -127,6 +129,23 @@ os.makedirs(DESTDIR) + +os.chdir(WORKDIR) +if DoMakeRoot: + execute("touch usr.img") + execute("truncate -s 600m usr.img") +if not os.path.exists("%s/usr.img" % WORKDIR): + print "No usr.img" + sys.exit(1) +execute("mdconfig -a -t vnode -f usr.img -u 60") +execute("newfs -m 2 /dev/md60") +if not os.path.exists("%s/usr" % DESTDIR): + os.mkdir("%s/usr" % DESTDIR) +execute("mount /dev/md60 %s/usr" % DESTDIR) +os.chdir(STARTDIR) + + +if DoMakeRoot: printmsg("Using '%s' as source directory" % SRCDIR) printmsg("Using '%s' as working directory (root on '%s')" % (WORKDIR, DESTDIR)) printmsg("Using '%s' kernel" % KERNEL) @@ -135,9 +154,9 @@ if DoBuild: execute("make buildworld") execute("make installworld DESTDIR=%s" % DESTDIR) + execute("make installkernel KERNCONF=%s DESTDIR=%s" % (KERNEL, DESTDIR)) execute("make distribution DESTDIR=%s" % DESTDIR) - execute("make installkernel KERNCONF=%s DESTDIR=%s" % (KERNEL, DESTDIR)) - execute("rm %s/boot/kernel/*.symbols" % DESTDIR) +# execute("rm %s/boot/kernel/*.symbols" % DESTDIR) os.chdir(DESTDIR) execute("mtree -c > livecd.mtree") os.chdir(STARTDIR) @@ -146,6 +165,9 @@ print "%s doesn't look like existing livecd root" % DESTDIR sys.exit(1) + +# Prepare /usr image + str_time = strftime("%H:%M") str_date = strftime("%Y-%m-%d") @@ -238,9 +260,40 @@ else: printmsg("WARNING: Not bundling any config files") +### finstall-specific part ### +# Everything done until now has been for a generic LiveCD. Now, do some magic +# (configuration mostly) for finstall. + +# Create an alternative root user named "install" and make it run startx when +# logged in. +install_found = False +f = file("%s/etc/passwd" % DESTDIR, "r") +for line in f.readlines(): + if line.startswith("install:"): + install_found = True +f.close() +if not install_found: + f = file("%s/tmp/userinst.sh" % DESTDIR, "w") + f.write("pw useradd -n install -o -u 0 -d /install -m -s /bin/tcsh -w none -c Installer") + f.close() + execute("chroot %s /bin/sh /tmp/userinst.sh" % DESTDIR) + os.unlink("%s/tmp/userinst.sh" % DESTDIR) +skel_cshrc = file("%s/usr/share/skel/dot.cshrc" % DESTDIR, "r").read() +f = file("%s/install/.cshrc" % DESTDIR, "w") +f.write(skel_cshrc) +f.write("startx\n") +f.close() + + +# finish usr image os.chdir(WORKDIR) +execute("umount %s/usr" % DESTDIR) +execute("mdconfig -d -u 60") +execute("mkuzip -v -o %s/usr/usr.img.uzip -s 16384 usr.img" % DESTDIR) + +os.chdir(WORKDIR) if ISO == None: ISO = "%s/image.iso" % WORKDIR -execute("mkisofs -l -nobak -V %s -T -J -r -ldots -b boot/cdboot -no-emul-boot -o %s %s" % (LABEL, ISO, DESTDIR)) +execute("mkisofs -l -nobak -V %s -T -J -R -ldots -b boot/cdboot -no-emul-boot -o %s %s" % (LABEL, ISO, DESTDIR)) os.chdir(STARTDIR)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707111732.l6BHWj6d060266>