diff options
Diffstat (limited to 'perl-install/fs/format.pm')
| -rw-r--r-- | perl-install/fs/format.pm | 191 |
1 files changed, 161 insertions, 30 deletions
diff --git a/perl-install/fs/format.pm b/perl-install/fs/format.pm index 5b87f22f1..1fa90c29e 100644 --- a/perl-install/fs/format.pm +++ b/perl-install/fs/format.pm @@ -1,4 +1,4 @@ -package fs::format; # $Id: format.pm 268842 2010-05-17 06:54:44Z pterjan $ +package fs::format; use diagnostics; use strict; @@ -10,27 +10,56 @@ use fs::type; use fs::loopback; use log; +=head1 SYNOPSYS + +B<fs::format> enables to format filesystems. + +=head1 Variables + +=over + +=item %cmds + +Commands to format filesystem: + +For each filesystem, list: [ package_name, command_to_use, options_to_use ] + +=cut + my %cmds = ( ext2 => [ 'e2fsprogs', 'mkfs.ext2', '-F' ], ext3 => [ 'e2fsprogs', 'mkfs.ext3', '-F' ], ext4 => [ 'e2fsprogs', 'mkfs.ext4', '-F' ], + f2fs => [ 'f2fs-tools', 'mkfs.f2fs', '-f' ], reiserfs => [ 'reiserfsprogs', 'mkfs.reiserfs', '-ff' ], xfs => [ 'xfsprogs', 'mkfs.xfs', '-f', '-q' ], jfs => [ 'jfsutils', 'mkfs.jfs', '-f' ], hfs => [ 'hfsutils', 'hformat' ], - dos => [ 'dosfstools', 'mkdosfs' ], - vfat => [ 'dosfstools', 'mkdosfs', '-F', '32' ], + dos => [ 'dosfstools', 'mkfs.fat' ], + vfat => [ 'dosfstools', 'mkfs.fat', '-F', '32' ], + exfat => [ 'exfatprogs', 'mkfs.exfat' ], swap => [ 'util-linux', 'mkswap' ], - ntfs => [ 'ntfsprogs', 'mkntfs', '--fast' ], - 'ntfs-3g' => [ 'ntfsprogs', 'mkntfs', '--fast' ], - btrfs => [ 'btrfs-progs', 'mkfs.btrfs' ], - nilfs2 => [ 'nilfs-utils', 'mkfs.nilfs2' ], + ntfs => [ 'ntfs-3g', 'mkfs.ntfs', '--fast' ], + 'ntfs-3g' => [ 'ntfs-3g', 'mkfs.ntfs', '--fast' ], + btrfs => [ 'btrfs-progs', 'mkfs.btrfs', '-f' ], + nilfs2 => [ 'nilfs-utils', 'mkfs.nilfs2', '-f' ], ); -my %LABELs = ( #- option, length, handled_by_mount + +=item %LABELs + +mkfs option to use in order to set the label + label specs. + +For each filesystem, list: [ option, max_length, handled_by_mount ] + +=cut + +my %LABELs = ( ext2 => [ '-L', 16, 1 ], ext3 => [ '-L', 16, 1 ], ext4 => [ '-L', 16, 1 ], + exfat => [ '-L', 16, 1 ], + f2fs => [ '-l', 16, 1 ], reiserfs => [ '-l', 16, 1 ], xfs => [ '-L', 12, 1 ], jfs => [ '-L', 16, 1 ], @@ -44,9 +73,19 @@ my %LABELs = ( #- option, length, handled_by_mount nilfs2 => [ '-L', 16, 1 ], ); -my %edit_LABEL = ( # package, command, option -# If option is defined, run <command> <option> <label> <device> -# If no option, run <command> <device> <label> +=item %edit_LABEL + +Commands to set the file system label. + +For each filesystem, list: [ package, command, option ] + +If option is defined, run <command> <option> <label> <device> + +If no option, run <command> <device> <label> + +=cut + +my %edit_LABEL = ( # ext2 => [ 'e2fsprogs', 'tune2fs', '-L' ], ext3 => [ 'e2fsprogs', 'tune2fs', '-L' ], ext4 => [ 'e2fsprogs', 'tune2fs', '-L' ], @@ -55,22 +94,42 @@ my %edit_LABEL = ( # package, command, option jfs => [ 'jfsutils', 'jfs_tune', '-L' ], # hfs dos => [ 'mtools', 'mlabel', '-i' ], + exfat => [ 'exfatprogs', 'tune.exfat', '-L' ], vfat => [ 'mtools', 'mlabel', '-i' ], swap => [ 'util-linux', 'swaplabel', '-L' ], - ntfs => [ 'ntfsprogs', 'ntfslabel' ], - 'ntfs-3g' => [ 'ntfsprogs', 'ntfslabel' ], - btrfs => [ 'btrfs-progs', 'btrfs', 'filesystem', 'label' ], - nilfs2 => [ 'nilfs-utils', 'nilfs-tune', '-L' ], + ntfs => [ 'ntfs-3g', 'ntfslabel' ], + 'ntfs-3g' => [ 'ntfs-3g', 'ntfslabel' ], + btrfs => [ 'btrfs-progs', 'btrfs', 'filesystem', 'label' ], + nilfs2 => [ 'nilfs-utils', 'nilfs-tune', '-L' ], ); -# Preserve UUID on fs where we couldn't enforce it while formatting -my %preserve_UUID = ( # package, commande - #btrfs => [ 'btrfs-progs', 'FIXME' ], +=item %preserve_UUID + +For each filesystem, list: [ option, max_length, handled_by_mount ] + +Those are used in order to preserve UUID on fs where we couldn't enforce it while formatting. + +=cut + +my %preserve_UUID = ( # package, command jfs => [ 'jfsutils', 'jfs_tune', ], xfs => [ 'xfsprogs', 'xfs_admin' ], nilfs2 => [ 'nilfs-utils', 'nilfs-tune' ], ); - + + +=back + +=head1 Functions + +=over + +=item package_needed_for_partition_type($part) + +Return the package needed for that partition's type. + +=cut + sub package_needed_for_partition_type { my ($part) = @_; my $l = $cmds{$part->{fs_type}} or return; @@ -101,6 +160,12 @@ sub canEditLabel { to_bool($edit_LABEL{$part->{fs_type}}); } +=item part($all_hds, $part, $wait_message) + +Frontend to part_raw() + +=cut + sub part { my ($all_hds, $part, $wait_message) = @_; if (isRAID($part)) { @@ -117,6 +182,12 @@ sub part { undef $part->{toFormat}; } +=item write_label($part) + +Set the label on the filesystem hold in $part. + +=cut + sub write_label { my ($part) = @_; @@ -144,6 +215,36 @@ sub write_label { delete $part->{device_LABEL_changed}; } +sub write_btrfs_uuid { + my ($UUID, $dev) = @_; + $dev = devices::make($dev); + my $status = system("echo y|btrfstune -U $UUID $dev") == 0; + die "failed to set UUID to '$UUID' on $dev (status=$status)" if !$status; +} + +=item sub option_to_preserve_UUID_while_formating($part, $fs_type) + +Return the options needed to preserve UUID while formating + +=cut + +sub option_to_preserve_UUID_while_formating { + my ($part, $fs_type) = @_; + if (member($fs_type, qw(swap ext2 ext3 ext4))) { + return '-U', $part->{device_UUID} if $part->{device_UUID}; + } elsif ($fs_type eq 'reiserfs') { + return '-u', $part->{device_UUID} if $part->{device_UUID}; + } + return (); +} + +=item part_raw($part, $wait_message) + +Actually format the $part partition disk. $wait_message is only used when formating ext3/4. +If not set, ext[3-4] will be formated without any progression bar, like other fses... + +=cut + sub part_raw { my ($part, $wait_message) = @_; @@ -170,13 +271,8 @@ sub part_raw { push @options, '-l', 'bootstrap'; } - # Preserve UUID - if (member($fs_type, 'swap', 'ext2', 'ext3', 'ext4')) { - push @options, '-U', $part->{device_UUID} if $part->{device_UUID}; - } elsif ($fs_type eq 'reiserfs') { - push @options, '-u', $part->{device_UUID} if $part->{device_UUID}; - } - + push @options, option_to_preserve_UUID_while_formating($part, $fs_type); + if ($part->{device_LABEL}) { push @options, @{$LABELs{$fs_type}}[0], $part->{device_LABEL}; } @@ -193,10 +289,8 @@ sub part_raw { delete $part->{device_LABEL_changed}; - # Preserve UUID on fs where we couldn't enforce it while formatting - (undef, $cmd) = @{$preserve_UUID{$fs_type}}; - run_program::raw($cmd, '-U', devices::make($dev)) if $cmd; - + preserve_UUID_after_format($dev, $part, $fs_type); + if (member($fs_type, qw(ext3 ext4))) { disable_forced_fsck($dev); } @@ -204,6 +298,28 @@ sub part_raw { after_formatting($part); } +=item preserve_UUID_after_format($dev, $part, $fs_type) + +Preserve UUID on fs where we couldn't enforce it while formatting + +=cut + +sub preserve_UUID_after_format { + my ($dev, $part, $fs_type) = @_; + if (my $uuid_cmd = $preserve_UUID{$fs_type}) { + my (undef, $cmd) = @$uuid_cmd; + run_program::raw({}, $cmd, '-U', $part->{device_UUID}, devices::make($dev)) if $cmd; + } elsif ($fs_type eq 'btrfs' && $part->{device_UUID}) { + write_btrfs_uuid($part->{device_UUID}, $dev); + } +} + +=item after_formatting($part) + +Misc post formating tags (rereading UUID & setting state) + +=cut + sub after_formatting { my ($part) = @_; @@ -213,6 +329,12 @@ sub after_formatting { set_isFormatted($part, 1); } +=item mkfs_ext3($wait_message, @args) + +Display a progression bar whike formating ext3/4 + +=cut + sub mkfs_ext3 { my ($wait_message, @args) = @_; @@ -229,6 +351,12 @@ sub mkfs_ext3 { return close($F); } +=item disable_forced_fsck($dev) + +Disable automatic fsck on extX (infinite number of mounts & duration between 2 fsck runs) + +=cut + sub disable_forced_fsck { my ($dev) = @_; run_program::run("tune2fs", "-c0", "-i0", devices::make($dev)); @@ -300,5 +428,8 @@ sub formatMount_all { }; } +=back + +=cut 1; |
