[Announce] Rebuild/Refresh a custom SoaS iso from a running stick
by Frederick Grose
We are a good ways closer to being able to
"Support cloning of a customized SoaS image directly from that running
image", which is the SoaS spin F15 feature proposal #4 on this page,
http://wiki.sugarlabs.org/go/Features/Soas_V5/
If your SoaS machine has 4+ GiBytes disc space (as is commonly available on
an attached hard drive that you could mount in your SoaS instance), then
this alpha version python script, edit-liveos.py,
http://people.sugarlabs.org/fgrose/edit-liveos
(based on the livecd-tools, edit-livecd), and a copy or rsync will let you
build a new, custom installation .iso file from your running SoaS instance.
I've tested the script on SoaS in F13 and F14, and with some filesystem
hacks (this is my first python project), it will run to completion.
I've booted the F14 version and confirmed that the system overlay file was
refreshed and the system and user customizations had transferred. See this
screenshot of 'About my Computer':
http://people.sugarlabs.org/fgrose/My%20computer.png
Customization of SoaS spins have been a long-sought goal of the project.
See, for example,
http://wiki.sugarlabs.org/go/Features/Feature_SoaS_customization, and all
the work Satellit has contributed toward the Sugar Creation Kit,
http://wiki.sugarlabs.org/go/Sugar_Creation_Kit
There remain many supporting tasks to be completed before we have an
integrated product.
1. The edit-liveos.py script depends on rsync, which has to be
installed on SoaS first.
2. The livecd-iso-to-disk script needs to be amended to transfer the
home.img file from the new source.iso
3. Other supporting installation scripts and a Sugar Activity are
needed to simplify the use of the onboard image builder.
Some of the above are addressed in Sugar Clone,
http://wiki.sugarlabs.org/go/Sugar_on_a_Stick/Sugar_Clone
which is a quick way to achieve customization without any disc resources
beyond those on the Sugar Stick itself.
I imagine that further refinements of these tools will allow us to
automatically monitor the system overlay consumption and advise the Learner
to "run a refresh" rebuilds their personal system or provides a fresh one
from the School Server.
Please see the Sugar Clone page to see the project goals and plans, and
please help test the new, edit-liveos script!
--Fred
13 years, 2 months
Would like instructions to build a bootable USB with F14 for the Mac
by wbsec.flive@new.rr.com
I am using F14 live CD and trying to build a USB with Fedora 14 that will boot a Mac intel machine. I have searched the internet and forums for the answer but have not found a solution that works. Can someone supply me with instructions? I don't know if I am formatting the USB wrong or if I need to download a package in order to do this. It seems like I should be able to use "./livecd-iso-to-disk --reset-mbr --noverify --efi /dev/sr0 /dev/sdb1" but the USB is not recognized on the Mac in my tests. Thank you for any help.
13 years, 2 months
tools/livecd-iso-to-disk.sh
by Brian C. Lane
tools/livecd-iso-to-disk.sh | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
New commits:
commit 09f64c7066746023d69e78c2673ded67ec30919f
Author: Brian C. Lane <bcl(a)redhat.com>
Date: Fri Feb 4 17:45:00 2011 -0800
Align start of partition at 1MiB (#668967)
diff --git a/tools/livecd-iso-to-disk.sh b/tools/livecd-iso-to-disk.sh
index 722e58d..d6fa95a 100755
--- a/tools/livecd-iso-to-disk.sh
+++ b/tools/livecd-iso-to-disk.sh
@@ -172,7 +172,7 @@ createGPTLayout() {
/sbin/parted --script $device mklabel gpt
partinfo=$(LC_ALL=C /sbin/parted --script -m $device "unit b print" |grep ^$device:)
size=$(echo $partinfo |cut -d : -f 2 |sed -e 's/B$//')
- /sbin/parted --script $device unit b mkpart '"EFI System Partition"' fat32 17408 $(($size - 17408)) set 1 boot on
+ /sbin/parted --script $device unit b mkpart '"EFI System Partition"' fat32 1048576 $(($size - 1048576)) set 1 boot on
# Sometimes automount can be _really_ annoying.
echo "Waiting for devices to settle..."
/sbin/udevadm settle
@@ -195,7 +195,7 @@ createMSDOSLayout() {
/sbin/parted --script $device mklabel msdos
partinfo=$(LC_ALL=C /sbin/parted --script -m $device "unit b print" |grep ^$device:)
size=$(echo $partinfo |cut -d : -f 2 |sed -e 's/B$//')
- /sbin/parted --script $device unit b mkpart primary fat32 17408 $(($size - 17408)) set 1 boot on
+ /sbin/parted --script $device unit b mkpart primary fat32 1048576 $(($size - 1048576)) set 1 boot on
# Sometimes automount can be _really_ annoying.
echo "Waiting for devices to settle..."
/sbin/udevadm settle
@@ -222,7 +222,7 @@ createEXTFSLayout() {
/sbin/parted --script $device mklabel msdos
partinfo=$(LC_ALL=C /sbin/parted --script -m $device "unit b print" |grep ^$device:)
size=$(echo $partinfo |cut -d : -f 2 |sed -e 's/B$//')
- /sbin/parted --script $device unit b mkpart primary ext2 17408 $(($size - 17408)) set 1 boot on
+ /sbin/parted --script $device unit b mkpart primary ext2 1048576 $(($size - 1048576)) set 1 boot on
# Sometimes automount can be _really_ annoying.
echo "Waiting for devices to settle..."
/sbin/udevadm settle
13 years, 2 months
3 commits - imgcreate/creator.py imgcreate/fs.py imgcreate/live.py tools/livecd-creator
by Brian C. Lane
imgcreate/creator.py | 18 ++++++++++++------
imgcreate/fs.py | 23 ++++++++++++++---------
imgcreate/live.py | 4 +++-
tools/livecd-creator | 13 ++++++++-----
4 files changed, 37 insertions(+), 21 deletions(-)
New commits:
commit fcf8197558fb9e83f9fa0b44a86def5a31de1671
Author: Brian C. Lane <bcl(a)redhat.com>
Date: Fri Feb 4 12:08:14 2011 -0800
Pass tmpdir to ImageCreator class initializer (#476676)
diff --git a/tools/livecd-creator b/tools/livecd-creator
index 75949c1..3424636 100755
--- a/tools/livecd-creator
+++ b/tools/livecd-creator
@@ -141,17 +141,20 @@ def main():
ks = imgcreate.read_kickstart(options.kscfg)
if options.image_type == 'livecd':
- creator = imgcreate.LiveImageCreator(ks, name, fslabel=fslabel, releasever=options.releasever)
+ creator = imgcreate.LiveImageCreator(ks, name,
+ fslabel=fslabel,
+ releasever=options.releasever,
+ tmpdir=os.path.abspath(options.tmpdir))
elif options.image_type == 'image':
- creator = imgcreate.LoopImageCreator(ks, name, fslabel=fslabel, releasever=options.releasever)
+ creator = imgcreate.LoopImageCreator(ks, name,
+ fslabel=fslabel,
+ releasever=options.releasever,
+ tmpdir=os.path.abspath(options.tmpdir))
else:
# Cannot happen, we validate this when parsing options.
logging.error(u"'%s' is not a valid image type" % options.image_type)
return 1
- creator.tmpdir = os.path.abspath(options.tmpdir)
- if not os.path.exists(creator.tmpdir):
- makedirs(creator.tmpdir)
creator.compress_type = options.compress_type
creator.skip_compression = options.skip_compression
creator.skip_minimize = options.skip_minimize
commit 0726cfa1982a285ed7bd8d96ce479e6b061e2658
Author: Brian C. Lane <bcl(a)redhat.com>
Date: Fri Feb 4 10:58:55 2011 -0800
Add tmpdir to ImageCreator class initializer (#476676)
Create the tmpdir if it doesn't exist.
diff --git a/imgcreate/creator.py b/imgcreate/creator.py
index d9b5afc..b915b11 100644
--- a/imgcreate/creator.py
+++ b/imgcreate/creator.py
@@ -51,7 +51,7 @@ class ImageCreator(object):
"""
- def __init__(self, ks, name, releasever=None):
+ def __init__(self, ks, name, releasever=None, tmpdir="/tmp"):
"""Initialize an ImageCreator instance.
ks -- a pykickstart.KickstartParser instance; this instance will be
@@ -62,6 +62,8 @@ class ImageCreator(object):
filesystem labels
releasever -- Value to substitute for $releasever in repo urls
+
+ tmpdir -- Top level directory to use for temporary files and dirs
"""
self.ks = ks
"""A pykickstart.KickstartParser instance."""
@@ -71,8 +73,10 @@ class ImageCreator(object):
self.releasever = releasever
- self.tmpdir = "/var/tmp"
+ self.tmpdir = tmpdir
"""The directory in which all temporary files will be created."""
+ if not os.path.exists(self.tmpdir):
+ makedirs(self.tmpdir)
self.__builddir = None
self.__bindmounts = []
@@ -796,7 +800,7 @@ class LoopImageCreator(ImageCreator):
"""
- def __init__(self, ks, name, fslabel=None, releasever=None):
+ def __init__(self, ks, name, fslabel=None, releasever=None, tmpdir="/tmp"):
"""Initialize a LoopImageCreator instance.
This method takes the same arguments as ImageCreator.__init__() with
@@ -805,7 +809,7 @@ class LoopImageCreator(ImageCreator):
fslabel -- A string used as a label for any filesystems created.
"""
- ImageCreator.__init__(self, ks, name, releasever=releasever)
+ ImageCreator.__init__(self, ks, name, releasever=releasever, tmpdir=tmpdir)
self.__fslabel = None
self.fslabel = fslabel
@@ -940,7 +944,7 @@ class LoopImageCreator(ImageCreator):
self.__fstype,
self.__blocksize,
self.fslabel,
- self.__tmpdir)
+ self.tmpdir)
try:
self.__instloop.mount()
commit e606117e948fa3ee34b80b166adf27d5053a2b11
Author: Frederick Grose <fgrose(a)gmail.com>
Date: Thu Feb 3 16:31:26 2011 -0800
Enable an optional tmpdir for e2image in fs.resize2fs()
Provide facility for an optional tmpdir during image resizing or
minimizing. This is useful for LiveOSystems with limited
resources, as the hardcoded /tmp is mounted on a tmpfs.
diff --git a/imgcreate/creator.py b/imgcreate/creator.py
index 4d0e59d..d9b5afc 100644
--- a/imgcreate/creator.py
+++ b/imgcreate/creator.py
@@ -934,11 +934,13 @@ class LoopImageCreator(ImageCreator):
if not base_on is None:
self._base_on(base_on)
- self.__instloop = ExtDiskMount(SparseLoopbackDisk(self._image, self.__image_size),
+ self.__instloop = ExtDiskMount(SparseLoopbackDisk(self._image,
+ self.__image_size),
self._instroot,
self.__fstype,
self.__blocksize,
- self.fslabel)
+ self.fslabel,
+ self.__tmpdir)
try:
self.__instloop.mount()
diff --git a/imgcreate/fs.py b/imgcreate/fs.py
index a43c6e5..de61c7b 100644
--- a/imgcreate/fs.py
+++ b/imgcreate/fs.py
@@ -56,14 +56,14 @@ def mksquashfs(in_img, out_img, compress_type):
raise SquashfsError("'%s' exited with error (%d)" %
(string.join(args, " "), ret))
-def resize2fs(fs, size = None, minimal = False):
+def resize2fs(fs, size = None, minimal = False, tmpdir = "/tmp"):
if minimal and size is not None:
raise ResizeError("Can't specify both minimal and a size for resize!")
if not minimal and size is None:
raise ResizeError("Must specify either a size or minimal for resize!")
e2fsck(fs)
- (fd, saved_image) = tempfile.mkstemp("", "resize-image-", "/tmp")
+ (fd, saved_image) = tempfile.mkstemp("", "resize-image-", tmpdir)
os.close(fd)
call(["/sbin/e2image", "-r", fs, saved_image])
@@ -184,7 +184,9 @@ class SparseLoopbackMount(LoopbackMount):
class SparseExtLoopbackMount(SparseLoopbackMount):
"""SparseExtLoopbackMount compatibility layer for old API"""
def __init__(self, lofile, mountdir, size, fstype, blocksize, fslabel):
- self.diskmount = ExtDiskMount(SparseLoopbackDisk(lofile,size), mountdir, fstype, blocksize, fslabel, rmmountdir = True)
+ self.diskmount = ExtDiskMount(SparseLoopbackDisk(lofile,size),
+ mountdir, fstype, blocksize, fslabel,
+ rmmountdir = True, tmpdir = "/tmp")
def __format_filesystem(self):
@@ -414,10 +416,12 @@ class DiskMount(Mount):
class ExtDiskMount(DiskMount):
"""A DiskMount object that is able to format/resize ext[23] filesystems."""
- def __init__(self, disk, mountdir, fstype, blocksize, fslabel, rmmountdir=True):
+ def __init__(self, disk, mountdir, fstype, blocksize, fslabel,
+ rmmountdir=True, tmpdir="/tmp"):
DiskMount.__init__(self, disk, mountdir, fstype, rmmountdir)
self.blocksize = blocksize
self.fslabel = "_" + fslabel
+ self.tmpdir = tmpdir
def __format_filesystem(self):
logging.info("Formating %s filesystem on %s" % (self.fstype, self.disk.device))
@@ -445,7 +449,7 @@ class ExtDiskMount(DiskMount):
if size > current_size:
self.disk.expand(size)
- resize2fs(self.disk.lofile, size)
+ resize2fs(self.disk.lofile, size, tmpdir = self.tmpdir)
return size
def __create(self):
@@ -487,7 +491,7 @@ class ExtDiskMount(DiskMount):
return int(parse_field(out, "Block count")) * self.blocksize
def __resize_to_minimal(self):
- resize2fs(self.disk.lofile, minimal = True)
+ resize2fs(self.disk.lofile, minimal = True, tmpdir = self.tmpdir)
return self.__get_size_from_filesystem()
def resparse(self, size = None):
@@ -577,7 +581,8 @@ class DeviceMapperSnapshot(object):
except ValueError:
raise SnapshotError("Failed to parse dmsetup status: " + out)
-def create_image_minimizer(path, image, compress_type, target_size = None):
+def create_image_minimizer(path, image, compress_type, target_size = None,
+ tmpdir = "/tmp"):
"""
Builds a copy-on-write image which can be used to
create a device-mapper snapshot of an image where
@@ -605,9 +610,9 @@ def create_image_minimizer(path, image, compress_type, target_size = None):
snapshot.create()
if target_size is not None:
- resize2fs(snapshot.path, target_size)
+ resize2fs(snapshot.path, target_size, tmpdir = tmpdir)
else:
- resize2fs(snapshot.path, minimal = True)
+ resize2fs(snapshot.path, minimal = True, tmpdir = tmpdir)
cow_used = snapshot.get_cow_used()
finally:
diff --git a/imgcreate/live.py b/imgcreate/live.py
index 60cd1de..bf3a4dd 100644
--- a/imgcreate/live.py
+++ b/imgcreate/live.py
@@ -297,7 +297,9 @@ class LiveImageCreatorBase(LoopImageCreator):
self._resparse()
if not self.skip_minimize:
- create_image_minimizer(self.__isodir + "/LiveOS/osmin.img", self._image, self.compress_type)
+ create_image_minimizer(self.__isodir + "/LiveOS/osmin.img",
+ self._image, self.compress_type,
+ tmpdir = self.tmpdir)
if self.skip_compression:
shutil.move(self._image, self.__isodir + "/LiveOS/ext3fs.img")
13 years, 2 months
[PATCH] Enable an optional tmpdir for e2image in fs.resize2fs()
by Frederick Grose
Bug 674697 <https://bugzilla.redhat.com/show_bug.cgi?id=674697> - Enable an
optional tmpdir for e2image in fs.resize2fs()
Created attachment 476676
<https://bugzilla.redhat.com/attachment.cgi?id=476676&action=diff>
[details] <https://bugzilla.redhat.com/attachment.cgi?id=476676&action=edit>
Enable an optional tmpdir for fs.resize2fs()
During image resizing or minimizing, the output from e2image in fs.resize2fs()
is hardcoded to go to /tmp.
This can strain the resources of a LiveOSystem, where /tmp is on a tmpfs.
A clone option is being added to edit-livecd.py
(seehttps://bugzilla.redhat.com/show_bug.cgi?id=448030#c27), where
this feature
will be significant for resource-limited Sugar on a Stick installations.
The tmpdir.patch, attached, has only been tested in the cloning code path of
edit-liveos.py to remove the bind mount of /tmp onto an attached disc.
I'm not familiar with the traditional building of Live images, so
please help in testing this.
--Fred
Author: Frederick Grose <fgrose(a)gmail.com>
Date: Wed Feb 2 17:06:42 2011 -0500
Enable an optional tmpdir for e2image in fs.resize2fs()
Provide facility for an optional tmpdir during image resizing or
minimizing. This is useful for LiveOSystems with limited
resources, as the hardcoded /tmp is mounted on a tmpfs.
diff --git a/imgcreate/creator.py b/imgcreate/creator.py
index 4d0e59d..d9b5afc 100644
--- a/imgcreate/creator.py
+++ b/imgcreate/creator.py
@@ -934,11 +934,13 @@ class LoopImageCreator(ImageCreator):
if not base_on is None:
self._base_on(base_on)
- self.__instloop = ExtDiskMount(SparseLoopbackDisk(self._image,
self.__image_size),
+ self.__instloop = ExtDiskMount(SparseLoopbackDisk(self._image,
+
self.__image_size),
self._instroot,
self.__fstype,
self.__blocksize,
- self.fslabel)
+ self.fslabel,
+ self.__tmpdir)
try:
self.__instloop.mount()
diff --git a/imgcreate/fs.py b/imgcreate/fs.py
index a43c6e5..de61c7b 100644
--- a/imgcreate/fs.py
+++ b/imgcreate/fs.py
@@ -56,14 +56,14 @@ def mksquashfs(in_img, out_img, compress_type):
raise SquashfsError("'%s' exited with error (%d)" %
(string.join(args, " "), ret))
-def resize2fs(fs, size = None, minimal = False):
+def resize2fs(fs, size = None, minimal = False, tmpdir = "/tmp"):
if minimal and size is not None:
raise ResizeError("Can't specify both minimal and a size for
resize!")
if not minimal and size is None:
raise ResizeError("Must specify either a size or minimal for
resize!")
e2fsck(fs)
- (fd, saved_image) = tempfile.mkstemp("", "resize-image-", "/tmp")
+ (fd, saved_image) = tempfile.mkstemp("", "resize-image-", tmpdir)
os.close(fd)
call(["/sbin/e2image", "-r", fs, saved_image])
@@ -184,7 +184,9 @@ class SparseLoopbackMount(LoopbackMount):
class SparseExtLoopbackMount(SparseLoopbackMount):
"""SparseExtLoopbackMount compatibility layer for old API"""
def __init__(self, lofile, mountdir, size, fstype, blocksize, fslabel):
- self.diskmount = ExtDiskMount(SparseLoopbackDisk(lofile,size),
mountdir, fstype, blocksize, fslabel, rmmountdir = True)
+ self.diskmount = ExtDiskMount(SparseLoopbackDisk(lofile,size),
+ mountdir, fstype, blocksize, fslabel,
+ rmmountdir = True, tmpdir = "/tmp")
def __format_filesystem(self):
@@ -414,10 +416,12 @@ class DiskMount(Mount):
class ExtDiskMount(DiskMount):
"""A DiskMount object that is able to format/resize ext[23]
filesystems."""
- def __init__(self, disk, mountdir, fstype, blocksize, fslabel,
rmmountdir=True):
+ def __init__(self, disk, mountdir, fstype, blocksize, fslabel,
+ rmmountdir=True, tmpdir="/tmp"):
DiskMount.__init__(self, disk, mountdir, fstype, rmmountdir)
self.blocksize = blocksize
self.fslabel = "_" + fslabel
+ self.tmpdir = tmpdir
def __format_filesystem(self):
logging.info("Formating %s filesystem on %s" % (self.fstype,
self.disk.device))
@@ -445,7 +449,7 @@ class ExtDiskMount(DiskMount):
if size > current_size:
self.disk.expand(size)
- resize2fs(self.disk.lofile, size)
+ resize2fs(self.disk.lofile, size, tmpdir = self.tmpdir)
return size
def __create(self):
@@ -487,7 +491,7 @@ class ExtDiskMount(DiskMount):
return int(parse_field(out, "Block count")) * self.blocksize
def __resize_to_minimal(self):
- resize2fs(self.disk.lofile, minimal = True)
+ resize2fs(self.disk.lofile, minimal = True, tmpdir = self.tmpdir)
return self.__get_size_from_filesystem()
def resparse(self, size = None):
@@ -577,7 +581,8 @@ class DeviceMapperSnapshot(object):
except ValueError:
raise SnapshotError("Failed to parse dmsetup status: " + out)
-def create_image_minimizer(path, image, compress_type, target_size = None):
+def create_image_minimizer(path, image, compress_type, target_size = None,
+ tmpdir = "/tmp"):
"""
Builds a copy-on-write image which can be used to
create a device-mapper snapshot of an image where
@@ -605,9 +610,9 @@ def create_image_minimizer(path, image, compress_type,
target_size = None):
snapshot.create()
if target_size is not None:
- resize2fs(snapshot.path, target_size)
+ resize2fs(snapshot.path, target_size, tmpdir = tmpdir)
else:
- resize2fs(snapshot.path, minimal = True)
+ resize2fs(snapshot.path, minimal = True, tmpdir = tmpdir)
cow_used = snapshot.get_cow_used()
finally:
diff --git a/imgcreate/live.py b/imgcreate/live.py
index 60cd1de..bf3a4dd 100644
--- a/imgcreate/live.py
+++ b/imgcreate/live.py
@@ -297,7 +297,9 @@ class LiveImageCreatorBase(LoopImageCreator):
self._resparse()
if not self.skip_minimize:
- create_image_minimizer(self.__isodir + "/LiveOS/osmin.img",
self._image, self.compress_type)
+ create_image_minimizer(self.__isodir + "/LiveOS/osmin.img",
+ self._image, self.compress_type,
+ tmpdir = self.tmpdir)
if self.skip_compression:
shutil.move(self._image, self.__isodir +
"/LiveOS/ext3fs.img")
13 years, 2 months
Building a multipart customized install ISO
by James Heather
Can anyone work out why I can no longer build a customized install ISO
that spans multiple disks?
Attached is the kickstart file. I last built this on F12, and it hasn't
changed except for changing the repos from F12 to F14, and a few minor
changes to the packages. It used to build as two DVDs, but now it seems
to run out of space when writing to the underlying image. Obviously I'm
including more than one DVD's worth of stuff--but I thought the 'part'
line was supposed to split over multiple ISOs?
I don't understand why it used to work and doesn't any more... what am I
doing wrong?
James
PS You won't be able to build it yourself without removing the 'local'
bits, because they're coming from a local repo.
13 years, 2 months
Re: [Fedora-livecd-list] [Announce] Rebuild/Refresh a custom SoaS iso from a running stick
by Brandon Miller
Stop sending me this!! It's like 30 to 65 messages everytime I log In!!
Sent from my iPhone
On Jan 28, 2011, at 4:07 AM, Frederick Grose <fgrose(a)gmail.com> wrote:
We are a good ways closer to being able to
"Support cloning of a customized SoaS image directly from that running image", which is the SoaS spin F15 feature proposal #4 on this page,
http://wiki.sugarlabs.org/go/Features/Soas_V5/
If your SoaS machine has 4+ GiBytes disc space (as is commonly available on an attached hard drive that you could mount in your SoaS instance), then this alpha version python script, edit-liveos.py,
http://people.sugarlabs.org/fgrose/edit-liveos
(based on the livecd-tools, edit-livecd), and a copy or rsync will let you build a new, custom installation .iso file from your running SoaS instance.
I've tested the script on SoaS in F13 and F14, and with some filesystem hacks (this is my first python project), it will run to completion.
I've booted the F14 version and confirmed that the system overlay file was refreshed and the system and user customizations had transferred. See this screenshot of 'About my Computer':
http://people.sugarlabs.org/fgrose/My%20computer.png
Customization of SoaS spins have been a long-sought goal of the project. See, for example, http://wiki.sugarlabs.org/go/Features/Feature_SoaS_customization, and all the work Satellit has contributed toward the Sugar Creation Kit, http://wiki.sugarlabs.org/go/Sugar_Creation_Kit
There remain many supporting tasks to be completed before we have an integrated product.
1. The edit-liveos.py script depends on rsync, which has to be
installed on SoaS first.
2. The livecd-iso-to-disk script needs to be amended to transfer the
home.img file from the new source.iso
3. Other supporting installation scripts and a Sugar Activity are
needed to simplify the use of the onboard image builder.
Some of the above are addressed in Sugar Clone,
http://wiki.sugarlabs.org/go/Sugar_on_a_Stick/Sugar_Clone
which is a quick way to achieve customization without any disc resources beyond those on the Sugar Stick itself.
I imagine that further refinements of these tools will allow us to automatically monitor the system overlay consumption and advise the Learner to "run a refresh" rebuilds their personal system or provides a fresh one from the School Server.
Please see the Sugar Clone page to see the project goals and plans, and please help test the new, edit-liveos script!
--Fred
--
livecd mailing list
livecd(a)lists.fedoraproject.org
https://admin.fedoraproject.org/mailman/listinfo/livecd
13 years, 2 months