diff options
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/draklive | 82 |
1 files changed, 53 insertions, 29 deletions
diff --git a/tools/draklive b/tools/draklive index aaea54715..a089953a7 100755 --- a/tools/draklive +++ b/tools/draklive @@ -29,19 +29,25 @@ use Cwd 'abs_path'; use Getopt::Long; use Pod::Usage; +my $dir_distrib_sqfs = { + mountpoint => '/distrib', + type => 'squashfs', + source => 'distrib.sqfs', + build_from => '/', +}; +my $dir_memory = { + mountpoint => '/memory', + type => 'tmpfs', +}; + my %predefined = ( mounts => { simple_union => { root => '/union', overlay => 'unionfs', dirs => [ - { - mountpoint => '/memory', - type => 'tmpfs', - }, - { - mountpoint => '/media', - }, + $dir_memory, + { mountpoint => '/media' }, ], }, squash_union => { @@ -49,20 +55,33 @@ my %predefined = ( overlay => 'unionfs', dirs => [ { - mountpoint => '/memory', - type => 'tmpfs', + mountpoint => '/system', + type => 'loopfs', + pre_allocate => '100k', + source => 'system.loop' }, + $dir_distrib_sqfs, + ], + }, + volatile_squash_union => { + root => '/union', + overlay => 'unionfs', + dirs => [ + $dir_memory, + $dir_distrib_sqfs, + ], + }, + multi_squash_union => { + root => '/union', + overlay => 'unionfs', + dirs => [ + $dir_memory, { mountpoint => '/system', type => 'squashfs', source => 'system.sqfs' }, - { - mountpoint => '/distrib', - type => 'squashfs', - source => 'distrib.sqfs', - build_from => '/', - }, + $dir_distrib_sqfs, ], }, }, @@ -133,12 +152,13 @@ sub progress_show_incr { sub progress_end() { print "\n" } +my $loop_number = 0; my %loop = ( squashfs => { read_only => 1, modules => [ qw(loop squashfs) ], build => sub { - my ($root, $dest) = @_; + my ($dest, $root) = @_; my $total = first(split /\s/, `du -sb $root`); print "have to process " . int($total/1000000) . " MB\n"; my $progress = progress_start($total, time(), 6); @@ -153,26 +173,30 @@ my %loop = ( } progress_end(); }, - mount => do { my $lo = 0; sub { + mount => sub { my ($live, $dir) = @_; my @mnt = ( ($live->{media}{fs} eq 'nfs' ? '/bin/losetup -r' : 'losetup') . - " /dev/loop$lo $live->{media}{mountpoint}/$dir->{source}", - "mount -o ro -t squashfs /dev/loop$lo $dir->{mountpoint}"); - $lo++; + " /dev/loop$loop_number $live->{media}{mountpoint}/$dir->{source}", + "mount -o ro -t squashfs /dev/loop$loop_number $dir->{mountpoint}"); + $loop_number++; @mnt; - } }, + }, }, - sparsefs => { + loopfs => { modules => [], create => sub { - my ($dest) = @_; - run_('dd', "of=$dest", 'count=0', 'seek=1000000', 'bs=1k'); + my ($dest, $size) = @_; + run_('dd', "of=$dest", 'count=0', "seek=$size", 'bs=1k'); run_('mke2fs', '-F', $dest); }, mount => sub { my ($live, $dir) = @_; - "mount -t ext2 $live->{media}{mountpoint}/$dir->{source} none $dir->{mountpoint}"; + my @mnt = ( + "losetup /dev/loop$loop_number $live->{media}{mountpoint}/$dir->{source}", + "mount -t ext2 /dev/loop$loop_number $dir->{mountpoint}"); + $loop_number++; + @mnt; }, }, tmpfs => { @@ -405,12 +429,12 @@ sub create_loopback_files { my $tree = $live->{system}{root} . $_->{build_from}; my $dest = $live->{images_dir} . '/' . $_->{source}; unlink($dest); - $loop{$_->{type}}{build}->($tree, $dest); + $loop{$_->{type}}{build}->($dest, $tree); } - foreach (grep { $_->{pre_create} } @{$live->{mount}{dirs} || []}) { + foreach (grep { $_->{pre_allocate} } @{$live->{mount}{dirs} || []}) { my $dest = $live->{images_dir} . '/' . $_->{source}; unlink($dest); - $loop{$_->{type}}{create}->($dest); + $loop{$_->{type}}{create}->($dest, $_->{pre_allocate}); } } @@ -463,7 +487,7 @@ sub record_master { cp_f(glob($live->{boot_dir} . '/*'), $live->{mnt}); output($live->{mnt} . '/syslinux.cfg', build_syslinux_cfg($live)); unless ($o_refresh_boot_only) { - foreach (grep { $_->{build_from} || $_->{pre_create} } @{$live->{mount}{dirs} || []}) { + foreach (grep { $_->{build_from} || $_->{pre_allocate} } @{$live->{mount}{dirs} || []}) { print "copying $_->{source}\n"; cp_f($live->{images_dir} . '/' . $_->{source}, $live->{mnt}); } |