diff options
Diffstat (limited to 'perl-install/fs.pm')
| -rw-r--r-- | perl-install/fs.pm | 512 |
1 files changed, 89 insertions, 423 deletions
diff --git a/perl-install/fs.pm b/perl-install/fs.pm index c5b26fbf4..90cc772e0 100644 --- a/perl-install/fs.pm +++ b/perl-install/fs.pm @@ -8,9 +8,11 @@ use MDK::Common::Various; use common; use log; use devices; -use partition_table qw(:types); +use fs::type; +use fs::get; +use fs::format; +use fs::mount_options; use run_program; -use swap; use detect_devices; use modules; use fsedit; @@ -27,7 +29,9 @@ sub read_fstab { my %comments; my $comment; my @l = grep { - if (/^\s*#/) { + if (/^Filename\s*Type\s*Size/) { + 0; #- when reading /proc/swaps + } elsif (/^\s*#/) { $comment .= chomp_($_) . "\n"; 0; } else { @@ -46,12 +50,11 @@ sub read_fstab { $options = 'defaults' if $options eq 'rw'; # clean-up for mtab read - my $pt_type = fs2pt_type($fs_type); - if ($pt_type eq 'supermount') { + if ($fs_type eq 'supermount') { # normalize this bloody supermount $options = join(",", 'supermount', grep { if (/fs=(.*)/) { - $pt_type = $1; + $fs_type = $1; 0; } elsif (/dev=(.*)/) { $dev = $1; @@ -62,15 +65,15 @@ sub read_fstab { 1; } } split(',', $options)); - } elsif ($pt_type eq 'smb') { + } elsif ($fs_type eq 'smb') { # prefering type "smbfs" over "smb" - $pt_type = 'smbfs'; + $fs_type = 'smbfs'; } $mntpoint =~ s/\\040/ /g; $dev =~ s/\\040/ /g; my $h = { - mntpoint => $mntpoint, pt_type => $pt_type, + mntpoint => $mntpoint, fs_type => $fs_type, options => $options, comment => $comment, if_(member('keep_freq_passno', @reading_options), freq => $freq, passno => $passno), }; @@ -87,12 +90,12 @@ sub read_fstab { require network::smb; #- remove credentials=file with username=foo,password=bar,domain=zoo #- the other way is done in fstab_to_string - my ($options, $unknown) = mount_options_unpack($h); + my ($options, $unknown) = fs::mount_options::unpack($h); my $file = delete $options->{'credentials='}; my $credentials = network::smb::read_credentials_raw($file); if ($credentials->{username}) { $options->{"$_="} = $credentials->{$_} foreach qw(username password domain); - mount_options_pack($h, $options, $unknown); + fs::mount_options::pack($h, $options, $unknown); } } @@ -110,16 +113,15 @@ sub merge_fstabs { $p->{mntpoint} = $p2->{mntpoint} if delete $p->{unsafeMntpoint}; - $p->{pt_type} = $p2->{pt_type} if $p2->{pt_type} && !$loose; + $p->{fs_type} = $p2->{fs_type} if $p2->{fs_type} && !$loose; $p->{options} = $p2->{options} if $p2->{options} && !$loose; #- important to get isMounted property else DrakX may try to mount already mounted partitions :-( add2hash($p, $p2); $p->{device_alias} ||= $p2->{device_alias} || $p2->{device} if $p->{device} ne $p2->{device} && $p2->{device} !~ m|/|; - $p->{pt_type} && $p2->{pt_type} && $p->{pt_type} ne $p2->{pt_type} && type2fs($p) ne type2fs($p2) && - $p->{pt_type} ne 'auto' && $p2->{pt_type} ne 'auto' and - log::l("err, fstab and partition table do not agree for $p->{device} type: " . - (type2fs($p) || pt_type2name($p->{pt_type})) . " vs ", (type2fs($p2) || pt_type2name($p2->{pt_type}))); + $p->{fs_type} && $p2->{fs_type} && $p->{fs_type} ne $p2->{fs_type} + && $p->{fs_type} ne 'auto' && $p2->{fs_type} ne 'auto' and + log::l("err, fstab and partition table do not agree for $p->{device} type: $p->{fs_type} vs $p2->{fs_type}"); } @l; } @@ -130,7 +132,8 @@ sub subpart_from_wild_device_name { if ($dev =~ /^LABEL=(.*)/) { return { device_LABEL => $1 }; } elsif ($dev eq 'none') { - } elsif ($dev =~ m!^(\w+):/\w!) { + } elsif ($dev eq 'rootfs') { + } elsif ($dev =~ m!^(\S+):/\w!) { #- nfs } elsif ($dev =~ m!^//\w!) { #- smb @@ -140,23 +143,31 @@ sub subpart_from_wild_device_name { if ($dev !~ m!^/! && -e "$::prefix/dev/$dev") { $dev = "/dev/$dev"; } - if ($dev =~ m!^/(tmp|dev)/(.*)!) { + if ($dev =~ m!^/(tmp|u?dev)/(.*)!) { my %part; if (my $rdev = (stat "$::prefix$dev")[6]) { ($part{major}, $part{minor}) = unmakedev($rdev); } - if (my $symlink = readlink("$::prefix$dev")) { - if ($symlink =~ m|^[^/]+$|) { - $part{device_alias} = $dev; - $dev = $symlink; - } + my $symlink = readlink("$::prefix$dev"); + $dev =~ s!/(tmp|u?dev)/!!; + + if ($symlink && $symlink =~ m|^[^/]+$|) { + $part{device_alias} = $dev; + $dev = $symlink; } - $dev =~ s!/(tmp|dev)/!!; - my $is_devfs = $dev =~ m!/(disc|part\d+)$!; - $part{$is_devfs ? 'devfs_device' : 'device'} = $dev; + if (my (undef, $part_number) = $dev =~ m!/(disc|part(\d+))$!) { + $part{part_number} = $part_number if $part_number; + $part{devfs_device} = $dev; + } else { + $part{device} = $dev; + my $part_number = devices::part_number(\%part); + $part{part_number} = $part_number if $part_number; + } return \%part; + } elsif ($dev =~ m!^/! && -f "$::prefix$dev") { + #- loopback file } else { log::l("part_from_wild_device_name: unknown device $dev"); } @@ -165,24 +176,16 @@ sub subpart_from_wild_device_name { { device => $dev }; } -sub device2part { - my ($dev, $fstab) = @_; - my $subpart = fs::subpart_from_wild_device_name($dev); - my $part = find { fsedit::is_same_hd($subpart, $_) } @$fstab; - log::l("fs::device2part: unknown device <<$dev>>") if !$part; - $part; -} - sub add2all_hds { my ($all_hds, @l) = @_; - @l = merge_fstabs('', [ fsedit::get_really_all_fstab($all_hds) ], @l); + @l = merge_fstabs('', [ fs::get::really_all_fstab($all_hds) ], @l); foreach (@l) { my $s = - isThisFs('nfs', $_) ? 'nfss' : - isThisFs('smbfs', $_) ? 'smbs' : - isThisFs('davfs', $_) ? 'davs' : + $_->{fs_type} eq 'nfs' ? 'nfss' : + $_->{fs_type} eq 'smbfs' ? 'smbs' : + $_->{fs_type} eq 'davfs' ? 'davs' : isTrueLocalFS($_) || isSwap($_) || isOtherAvailableFS($_) ? '' : 'special'; push @{$all_hds->{$s}}, $_ if $s; @@ -200,9 +203,9 @@ sub merge_info_from_mtab { my ($fstab) = @_; my @l1 = map { my $l = $_; - my %l = (pt_type => fs2pt_type('swap')); - $l{$_} = $l->{$_} foreach qw(device major minor); - \%l; + my $h = fs::type::fs_type2subpart('swap'); + $h->{$_} = $l->{$_} foreach qw(device major minor); + $h; } read_fstab('', '/proc/swaps'); my @l2 = map { read_fstab('', $_) } '/etc/mtab', '/proc/mounts'; @@ -216,7 +219,8 @@ sub merge_info_from_mtab { $_->{mntpoint} = common::usingRamdisk() && "/mnt/hd"; #- remap for hd install. } } - $_->{isMounted} = $_->{isFormatted} = 1; + $_->{isMounted} = 1; + set_isFormatted($_, 1); delete $_->{options}; } merge_fstabs('loose', $fstab, @l1, @l2); @@ -228,7 +232,7 @@ sub merge_info_from_fstab { my @l = grep { if ($uniq) { - my $part = fsedit::mntpoint2part($_->{mntpoint}, $fstab); + my $part = fs::get::mntpoint2part($_->{mntpoint}, $fstab); !$part || fsedit::is_same_hd($part, $_); #- keep it only if it is the mountpoint AND the same device } else { 1; @@ -238,10 +242,9 @@ sub merge_info_from_fstab { merge_fstabs($loose, $fstab, @l); } -# - when using "$loose", it does not merge in type&options from the fstab sub get_info_from_fstab { - my ($all_hds, $prefix) = @_; - my @l = read_fstab($prefix, '/etc/fstab', 'keep_default'); + my ($all_hds) = @_; + my @l = read_fstab($::prefix, '/etc/fstab', 'keep_default'); add2all_hds($all_hds, @l) } @@ -255,7 +258,7 @@ sub prepare_write_fstab { my $device = isLoopback($_) ? ($_->{mntpoint} eq '/' ? "/initrd/loopfs" : $_->{loopback_device}{mntpoint}) . $_->{loopback_file} : - part2device($o_prefix, $_->{prefer_devfs_name} ? $_->{devfs_device} : $_->{device}, $_->{pt_type}); + part2device($o_prefix, $_->{prefer_devfs_name} ? $_->{devfs_device} : $_->{device}, $_->{fs_type}); my $real_mntpoint = $_->{mntpoint} || ${{ '/tmp/hdimage' => '/mnt/hd' }}{$_->{real_mntpoint}}; mkdir_p("$o_prefix$real_mntpoint") if $real_mntpoint =~ m|^/|; @@ -275,7 +278,7 @@ sub prepare_write_fstab { my $options = $_->{options}; - if (isThisFs('smbfs', $_) && $options =~ /password=/ && !$b_keep_smb_credentials) { + if ($_->{fs_type} eq 'smbfs' && $options =~ /password=/ && !$b_keep_smb_credentials) { require network::smb; if (my ($opts, $smb_credentials) = network::smb::fstab_entry_to_credentials($_)) { $options = $opts; @@ -283,7 +286,7 @@ sub prepare_write_fstab { } } - my $fs_type = type2fs($_, 'auto'); + my $fs_type = $_->{fs_type} || 'auto'; my $dev = $_->{prefer_device_LABEL} ? 'LABEL=' . $_->{device_LABEL} : @@ -295,9 +298,8 @@ sub prepare_write_fstab { # handle bloody supermount special case if ($options =~ /supermount/) { my @l = grep { $_ ne 'supermount' } split(',', $options); - my @l1 = grep { member($_, 'ro', 'exec') } @l; - my @l2 = difference2(\@l, \@l1); - $options = join(",", "dev=$dev", "fs=$fs_type", @l1, if_(@l2, '--', @l2)); + my ($l1, $l2) = partition { member($_, 'ro', 'exec') } @l; + $options = join(",", "dev=$dev", "fs=$fs_type", @$l1, if_(@$l2, '--', @$l2)); ($dev, $fs_type) = ('none', 'supermount'); } else { #- if we were using supermount, the type could be something like ext2:vfat @@ -309,14 +311,14 @@ sub prepare_write_fstab { } else { () } - } grep { $_->{device} && ($_->{mntpoint} || $_->{real_mntpoint}) && $_->{pt_type} && ($_->{isFormatted} || !$_->{notFormatted}) } @$fstab; + } grep { $_->{device} && ($_->{mntpoint} || $_->{real_mntpoint}) && $_->{fs_type} && ($_->{isFormatted} || !$_->{notFormatted}) } @$fstab; join('', map { $_->[1] } sort { $a->[0] cmp $b->[0] } @l), \@smb_credentials; } sub fstab_to_string { my ($all_hds, $o_prefix) = @_; - my $fstab = [ fsedit::get_really_all_fstab($all_hds), @{$all_hds->{special}} ]; + my $fstab = [ fs::get::really_all_fstab($all_hds), @{$all_hds->{special}} ]; my ($s, undef) = prepare_write_fstab($fstab, $o_prefix, 'keep_smb_credentials'); $s; } @@ -324,15 +326,15 @@ sub fstab_to_string { sub write_fstab { my ($all_hds, $o_prefix) = @_; log::l("writing $o_prefix/etc/fstab"); - my $fstab = [ fsedit::get_really_all_fstab($all_hds), @{$all_hds->{special}} ]; + my $fstab = [ fs::get::really_all_fstab($all_hds), @{$all_hds->{special}} ]; my ($s, $smb_credentials) = prepare_write_fstab($fstab, $o_prefix, ''); output("$o_prefix/etc/fstab", $s); network::smb::save_credentials($_) foreach @$smb_credentials; } sub part2device { - my ($prefix, $dev, $pt_type) = @_; - $dev eq 'none' || member($pt_type, qw(nfs smbfs davfs)) ? + my ($prefix, $dev, $fs_type) = @_; + $dev eq 'none' || member($fs_type, qw(nfs smbfs davfs)) ? $dev : do { my $dir = $dev =~ m!^(/|LABEL=)! ? '' : '/dev/'; @@ -345,246 +347,6 @@ sub auto_fs() { grep { chop; $_ && !/nodev/ } cat_("/etc/filesystems"); } -sub mount_options() { - my %non_defaults = ( - sync => 'async', noatime => 'atime', noauto => 'auto', ro => 'rw', - user => 'nouser', nodev => 'dev', noexec => 'exec', nosuid => 'suid', - ); - my @user_implies = qw(noexec nodev nosuid); - \%non_defaults, \@user_implies; -} - -sub mount_options_unpack { - my ($part) = @_; - my $packed_options = $part->{options}; - - my ($non_defaults, $user_implies) = mount_options(); - - my @auto_fs = auto_fs(); - my %per_fs = ( - iso9660 => [ qw(unhide) ], - vfat => [ qw(umask=0 umask=0022) ], - ntfs => [ qw(umask=0 umask=0022) ], - nfs => [ qw(rsize=8192 wsize=8192) ], - smbfs => [ qw(username= password=) ], - davfs => [ qw(username= password= uid= gid=) ], - reiserfs => [ 'notail' ], - ); - push @{$per_fs{$_}}, 'usrquota', 'grpquota' foreach 'ext2', 'ext3', 'xfs'; - - while (my ($fs, $l) = each %per_fs) { - isThisFs($fs, $part) || $part->{pt_type} eq 'auto' && member($fs, @auto_fs) or next; - $non_defaults->{$_} = 1 foreach @$l; - } - - $non_defaults->{encrypted} = 1 if !$part->{isFormatted} || isSwap($part); - - $non_defaults->{supermount} = 1 if $part->{pt_type} =~ /:/ || member(type2fs($part), 'auto', @auto_fs); - - my $defaults = { reverse %$non_defaults }; - my %options = map { $_ => '' } keys %$non_defaults; - my @unknown; - foreach (split(",", $packed_options)) { - if ($_ eq 'user') { - $options{$_} = 1 foreach 'user', @$user_implies; - } elsif (exists $non_defaults->{$_}) { - $options{$_} = 1; - } elsif ($defaults->{$_}) { - $options{$defaults->{$_}} = 0; - } elsif (/(.*?=)(.*)/) { - $options{$1} = $2; - } else { - push @unknown, $_; - } - } - # merge those, for cleaner help - $options{'rsize=8192,wsize=8192'} = delete $options{'rsize=8192'} && delete $options{'wsize=8192'} - if exists $options{'rsize=8192'}; - - my $unknown = join(",", @unknown); - \%options, $unknown; -} - -sub mount_options_pack_ { - my ($_part, $options, $unknown) = @_; - - my ($non_defaults, $user_implies) = mount_options(); - my @l; - - my @umasks = map { - if (/^umask=/) { - my $v = delete $options->{$_}; - /^umask=(.+)/ ? if_($v, $1) : $v; - } else { () } - } keys %$options; - if (@umasks) { - push @l, 'umask=' . min(@umasks); - } - - if (delete $options->{user}) { - push @l, 'user'; - foreach (@$user_implies) { - if (!delete $options->{$_}) { - # overriding - $options->{$non_defaults->{$_}} = 1; - } - } - } - push @l, map_each { if_($::b, $::a =~ /=$/ ? "$::a$::b" : $::a) } %$options; - push @l, $unknown; - - join(",", uniq(grep { $_ } @l)); -} -sub mount_options_pack { - my ($part, $options, $unknown) = @_; - $part->{options} = mount_options_pack_($part, $options, $unknown); - noreturn(); -} - -# update me on each util-linux new release: -sub mount_options_help() { - ( - - 'grpquota' => '', - - 'noatime' => N("Do not update inode access times on this file system -(e.g, for faster access on the news spool to speed up news servers)."), - - 'noauto' => N("Can only be mounted explicitly (i.e., -the -a option will not cause the file system to be mounted)."), - - 'nodev' => N("Do not interpret character or block special devices on the file system."), - - 'noexec' => N("Do not allow execution of any binaries on the mounted -file system. This option might be useful for a server that has file systems -containing binaries for architectures other than its own."), - - 'nosuid' => N("Do not allow set-user-identifier or set-group-identifier -bits to take effect. (This seems safe, but is in fact rather unsafe if you -have suidperl(1) installed.)"), - - 'ro' => N("Mount the file system read-only."), - - 'sync' => N("All I/O to the file system should be done synchronously."), - - 'supermount' => '', - - 'user' => N("Allow an ordinary user to mount the file system. The -name of the mounting user is written to mtab so that he can unmount the file -system again. This option implies the options noexec, nosuid, and nodev -(unless overridden by subsequent options, as in the option line -user,exec,dev,suid )."), - - 'usrquota' => '', - - 'umask=0' => N("Give write access to ordinary users"), - - 'umask=0022' => N("Give read-only access to ordinary users"), - ); -} - - -sub rationalize_options { - my ($part) = @_; - - my ($options, $unknown) = mount_options_unpack($part); - - if (!isThisFs('reiserfs', $part)) { - $options->{notail} = 0; - } - - mount_options_pack($part, $options, $unknown); -} - -sub set_default_options { - my ($part, %opts) = @_; - #- opts are: useSupermount security iocharset codepage - - my ($options, $unknown) = mount_options_unpack($part); - - if ($part->{is_removable}) { - $options->{supermount} = $opts{useSupermount} && !($opts{useSupermount} eq 'magicdev' && $part->{media_type} eq 'cdrom'); - $part->{pt_type} = !$options->{supermount} ? 'auto' : - $part->{media_type} eq 'cdrom' ? 'udf:iso9660' : 'ext2:vfat'; - } - - if ($part->{media_type} eq 'cdrom') { - $options->{ro} = 1; - } - - if ($part->{media_type} eq 'fd') { - # slow device so don't loose time, write now! - $options->{sync} = 1; - } - - if (isTrueFS($part)) { - #- noatime on laptops (do not wake up the hd) - #- Do not update inode access times on this - #- file system (e.g, for faster access on the - #- news spool to speed up news servers). - $options->{noatime} = detect_devices::isLaptop(); - } - if (isThisFs('nfs', $part)) { - put_in_hash($options, { - nosuid => 1, 'rsize=8192,wsize=8192' => 1, soft => 1, - }); - } - if (isThisFs('smbfs', $part)) { - add2hash($options, { 'username=' => '%' }) if !$options->{'credentials='}; - } - if (isFat($part) || member('vfat', split(':', $part->{pt_type})) || isThisFs('auto', $part)) { - - put_in_hash($options, { - user => 1, noexec => 0, - }) if $part->{is_removable}; - - put_in_hash($options, { - 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, - 'iocharset=' => $opts{iocharset}, 'codepage=' => $opts{codepage}, - }); - } - if (isThisFs('ntfs', $part)) { - put_in_hash($options, { ro => 1, 'nls=' => $opts{iocharset}, - 'umask=0' => $opts{security} < 3, 'umask=0022' => $opts{security} < 4, - }); - } - if (member('iso9660', split(':', $part->{pt_type})) || isThisFs('auto', $part)) { - put_in_hash($options, { user => 1, noexec => 0, 'iocharset=' => $opts{iocharset} }); - } - if (isThisFs('reiserfs', $part)) { - $options->{notail} = 1; - } - if (isLoopback($part) && !isSwap($part)) { #- no need for loop option for swap files - $options->{loop} = 1; - } - - # rationalize: no need for user - if ($options->{autofs} || $options->{supermount}) { - $options->{user} = 0; - } - - # have noauto when we have user - $options->{noauto} = 1 if $options->{user}; - - if ($options->{user}) { - # ensure security (user_implies - noexec as noexec is not a security matter) - $options->{$_} = 1 foreach 'nodev', 'nosuid'; - } - - mount_options_pack($part, $options, $unknown); - - rationalize_options($part); -} - -sub set_all_default_options { - my ($all_hds, %opts) = @_; - #- opts are: useSupermount security iocharset codepage - - foreach my $part (fsedit::get_really_all_fstab($all_hds)) { - set_default_options($part, %opts); - } -} - sub set_removable_mntpoints { my ($all_hds) = @_; @@ -603,120 +365,19 @@ sub get_raw_hds { push @{$all_hds->{raw_hds}}, detect_devices::removables(); $_->{is_removable} = 1 foreach @{$all_hds->{raw_hds}}; - $_->{is_removable} = 1 foreach map { partition_table::get_normal_parts($_) } grep { $_->{usb_media_type} } @{$all_hds->{hds}}; get_major_minor(@{$all_hds->{raw_hds}}); my @fstab = read_fstab($prefix, '/etc/fstab', 'keep_default'); - $all_hds->{nfss} = [ grep { isThisFs('nfs', $_) } @fstab ]; - $all_hds->{smbs} = [ grep { isThisFs('smbfs', $_) } @fstab ]; - $all_hds->{davs} = [ grep { isThisFs('davfs', $_) } @fstab ]; + $all_hds->{nfss} = [ grep { $_->{fs_type} eq 'nfs' } @fstab ]; + $all_hds->{smbs} = [ grep { $_->{fs_type} eq 'smbfs' } @fstab ]; + $all_hds->{davs} = [ grep { $_->{fs_type} eq 'davfs' } @fstab ]; $all_hds->{special} = [ - (grep { isThisFs('tmpfs', $_) } @fstab), - { device => 'none', mntpoint => '/proc', pt_type => 'proc' }, - { device => 'none', mntpoint => '/dev/pts', pt_type => 'devpts', options => 'mode=0620' }, + (grep { $_->{fs_type} eq 'tmpfs' } @fstab), + { device => 'none', mntpoint => '/proc', fs_type => 'proc' }, ]; } -################################################################################ -# formatting functions -################################################################################ -sub disable_forced_fsck { - my ($dev) = @_; - run_program::run("tune2fs", "-c0", "-i0", devices::make($dev)); -} - -sub format_ext2($@) { - #- mke2fs -b (1024|2048|4096) -c -i(1024 > 262144) -N (1 > 100000000) -m (0-100%) -L volume-label - #- tune2fs - my ($dev, @options) = @_; - $dev =~ m,(rd|ida|cciss)/, and push @options, qw(-b 4096 -R stride=16); #- For RAID only. - push @options, qw(-b 1024 -O none) if arch() =~ /alpha/; - run_program::raw({ timeout => 60 * 60 }, 'mke2fs', '-F', @options, devices::make($dev)) or die N("%s formatting of %s failed", (any { $_ eq '-j' } @options) ? "ext3" : "ext2", $dev); -} -sub format_ext3 { - my ($dev, @options) = @_; - format_ext2($dev, "-j", @options); - disable_forced_fsck($dev); -} -sub format_reiserfs { - my ($dev, @options) = @_; - #TODO add -h tea - run_program::raw({ timeout => 60 * 60 }, "mkreiserfs", "-ff", @options, devices::make($dev)) or die N("%s formatting of %s failed", "reiserfs", $dev); -} -sub format_xfs { - my ($dev, @options) = @_; - run_program::raw({ timeout => 60 * 60 }, "mkfs.xfs", "-f", "-q", @options, devices::make($dev)) or die N("%s formatting of %s failed", "xfs", $dev); -} -sub format_jfs { - my ($dev, @options) = @_; - run_program::raw({ timeout => 60 * 60 }, "mkfs.jfs", "-f", @options, devices::make($dev)) or die N("%s formatting of %s failed", "jfs", $dev); -} -sub format_dos { - my ($dev, @options) = @_; - run_program::raw({ timeout => 60 * 60 }, "mkdosfs", @options, devices::make($dev)) or die N("%s formatting of %s failed", "dos", $dev); -} -sub format_hfs { - my ($dev, @options) = @_; - run_program::raw({ timeout => 60 * 60 }, "hformat", @options, devices::make($dev)) or die N("%s formatting of %s failed", "HFS", $dev); -} -sub real_format_part { - my ($part) = @_; - - $part->{isFormatted} and return; - - if ($part->{encrypt_key}) { - set_loop($part); - } - - my $dev = $part->{real_device} || $part->{device}; - - my @options = if_($part->{toFormatCheck}, "-c"); - log::l("formatting device $dev (type ", pt_type2name($part->{pt_type}), ")"); - - if (isExt2($part)) { - push @options, "-F" if isLoopback($part); - push @options, "-m", "0" if $part->{mntpoint} =~ m|^/home|; - format_ext2($dev, @options); - } elsif (isThisFs("ext3", $part)) { - push @options, "-m", "0" if $part->{mntpoint} =~ m|^/home|; - format_ext3($dev, @options); - } elsif (isThisFs("reiserfs", $part)) { - format_reiserfs($dev, @options); - } elsif (isThisFs("xfs", $part)) { - format_xfs($dev, @options); - } elsif (isThisFs("jfs", $part)) { - format_jfs($dev, @options); - } elsif (isDos($part)) { - format_dos($dev, @options); - } elsif (isWin($part) || isEfi($part)) { - format_dos($dev, @options, '-F', 32); - } elsif (isThisFs('hfs', $part)) { - format_hfs($dev, @options, '-l', "Untitled"); - } elsif (isAppleBootstrap($part)) { - format_hfs($dev, @options, '-l', "bootstrap"); - } elsif (isSwap($part)) { - my $check_blocks = any { /^-c$/ } @options; - swap::make($dev, $check_blocks); - } else { - die N("I don't know how to format %s in type %s", $part->{device}, pt_type2name($part->{pt_type})); - } - $part->{isFormatted} = 1; -} -sub format_part { - my ($raids, $part, $prefix, $wait_message) = @_; - if (isRAID($part)) { - $wait_message->(N("Formatting partition %s", $part->{device})) if $wait_message; - require raid; - raid::format_part($raids, $part); - } elsif (isLoopback($part)) { - $wait_message->(N("Creating and formatting file %s", $part->{loopback_file})) if $wait_message; - loopback::format_part($part, $prefix); - } else { - $wait_message->(N("Formatting partition %s", $part->{device})) if $wait_message; - real_format_part($part); - } -} ################################################################################ # mounting functions @@ -726,17 +387,28 @@ sub set_loop { $part->{real_device} ||= devices::set_loop(devices::make($part->{device}), $part->{encrypt_key}, $part->{options} =~ /encryption=(\w+)/); } +sub swapon { + my ($dev) = @_; + log::l("swapon called with $dev"); + syscall_('swapon', devices::make($dev), 0) or die "swapon($dev) failed: $!"; +} + +sub swapoff { + my ($dev) = @_; + syscall_('swapoff', devices::make($dev)) or die "swapoff($dev) failed: $!"; +} + sub formatMount_part { my ($part, $raids, $fstab, $prefix, $wait_message) = @_; if (isLoopback($part)) { formatMount_part($part->{loopback_device}, $raids, $fstab, $prefix, $wait_message); } - if (my $p = up_mount_point($part->{mntpoint}, $fstab)) { + if (my $p = fs::get::up_mount_point($part->{mntpoint}, $fstab)) { formatMount_part($p, $raids, $fstab, $prefix, $wait_message) unless loopback::carryRootLoopback($part); } if ($part->{toFormat}) { - format_part($raids, $part, $prefix, $wait_message); + fs::format::part($raids, $part, $prefix, $wait_message); } mount_part($part, $prefix, 0, $wait_message); } @@ -752,7 +424,7 @@ sub formatMount_all { #- for fun :) #- that way, when install exits via ctrl-c, it gives hand to partition eval { - my ($_type, $major, $minor) = devices::entry(fsedit::get_root($fstab)->{device}); + my ($_type, $major, $minor) = devices::entry(fs::get::root($fstab)->{device}); output "/proc/sys/kernel/real-root-dev", makedev($major, $minor); }; } @@ -765,7 +437,7 @@ sub mount { $dev = part2device('', $dev, $fs); - $fs ne 'skip' or log::l("not mounting $dev partition"), return; + $fs or log::l("not mounting $dev partition"), return; my @fs_modules = qw(vfat hfs romfs ufs reiserfs xfs jfs ext3); @@ -869,22 +541,26 @@ sub mount_part { unless ($::testing) { if (isSwap($part)) { $o_wait_message->(N("Enabling swap partition %s", $part->{device})) if $o_wait_message; - swap::swapon($part->{device}); + swapon($part->{device}); } else { $part->{mntpoint} or die "missing mount point for partition $part->{device}"; my $mntpoint = ($o_prefix || '') . $part->{mntpoint}; if (isLoopback($part) || $part->{encrypt_key}) { set_loop($part); + } elsif ($part->{options} =~ /encrypted/) { + log::l("skip mounting $part->{device} since we don't have the encrypt_key"); + return; } elsif (loopback::carryRootLoopback($part)) { $mntpoint = "/initrd/loopfs"; } my $dev = $part->{real_device} || $part->{device}; - mount($dev, $mntpoint, type2fs($part, 'skip'), $b_rdonly, $part->{options}, $o_wait_message); + mount($dev, $mntpoint, $part->{fs_type}, $b_rdonly, $part->{options}, $o_wait_message); rmdir "$mntpoint/lost+found"; } } - $part->{isMounted} = $part->{isFormatted} = 1; #- assume that if mount works, partition is formatted + $part->{isMounted} = 1; + set_isFormatted($part, 1); #- assume that if mount works, partition is formatted } sub umount_part { @@ -894,7 +570,7 @@ sub umount_part { unless ($::testing) { if (isSwap($part)) { - swap::swapoff($part->{device}); + swapoff($part->{device}); } elsif (loopback::carryRootLoopback($part)) { umount("/initrd/loopfs"); } else { @@ -930,10 +606,9 @@ sub df { return; #- won't even try! } else { mkdir_p($dir); - eval { mount($part->{device}, $dir, type2fs($part, 'skip'), 'readonly') }; + eval { mount($part->{device}, $dir, $part->{fs_type}, 'readonly') }; if ($@) { - $part->{notFormatted} = 1; - $part->{isFormatted} = 0; + set_isFormatted($part, 0); unlink $dir; return; } @@ -949,13 +624,4 @@ sub df { $part->{free}; } -sub up_mount_point { - my ($mntpoint, $fstab) = @_; - while (1) { - $mntpoint = dirname($mntpoint); - $mntpoint ne "." or return; - $_->{mntpoint} eq $mntpoint and return $_ foreach @$fstab; - } -} - 1; |
