Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Nov 2012 02:04:03 +0100
From:      Paul Schenkeveld <freebsd@psconsult.nl>
To:        freebsd-embedded@freebsd.org
Subject:   Re: NanoBSD: Create image sparsely
Message-ID:  <20121130010403.GA82618@psconsult.nl>
In-Reply-To: <42654855-CF29-488A-A645-2A280FC9D074@van-laarhoven.org>
References:  <42654855-CF29-488A-A645-2A280FC9D074@van-laarhoven.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Nov 29, 2012 at 08:42:23AM +0100, Nick Hibma wrote:
> In the past I have submitted patches to create images sparsely. There is however one patch missing still which, with the addition of NANO_INIT_IMG2, has become much more useful:
> 
> --- AnyWi/freebsd/nanobsd/nanobsd.sh     2012-11-08 19:48:40.000000000 +0100
> +++ /usr/src/tools/tools/nanobsd/nanobsd.sh 2012-11-06 15:24:52.000000000 +0100
> @@ -540,7 +540,7 @@
>         if [ $NANO_IMAGES -gt 1 -a $NANO_INIT_IMG2 -gt 0 ] ; then
>               # Duplicate to second image (if present)
>                echo "Duplicating to second image..."
> -         dd if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k
> +               dd conv=sparse if=/dev/${MD}s1 of=/dev/${MD}s2 bs=64k
>               mount /dev/${MD}s2a ${MNT}
>              for f in ${MNT}/etc/fstab ${MNT}/conf/base/etc/fstab
>            do
> @@ -569,7 +569,7 @@
>  
>        if ${do_copyout_partition} ; then
>               echo "Writing out _.disk.image..."
> -              dd if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
> +          dd conv=sparse if=/dev/${MD}s1 of=${NANO_DISKIMGDIR}/_.disk.image bs=64k
>    fi
>      mdconfig -d -u $MD
>  
> It copies out the image sparsely (conv=sparse). The big advantage comes when creating many images (I have between 10 and 20 images simultaneously on my disk).
> 
> Any objections to this? (*)

When copying sparsely, blocks containing zeroes are not copied over but
skipped using lseek.  When the output file is a newly created regular
file this is OK because sparse blocks read as zeroes.

But here nanobsd.sh writes to a md(4) device which does not contain
zeroes when created as a swap based device (NANO_MD_BACKING=swap).  When
a file on ${MD}s1 contains a block that deliberately contains zeroes
the resulting copy is not the same as the original which may cause all
kinds of problems.  Only when ${MD}s1 is created as a file based device,
blocks seeked over will read back as zeroes.

Earlier this month I started a thread on freebsd-security@ related to
this issue (subject: md(4) (swap-base) disks not cleaned on creation)
and the patch by Konstantin Belousov will solve this problem but that
leaves all systems before this patch vulnerable to this problem.

HTH

Paul Schenkeveld



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121130010403.GA82618>