summaryrefslogtreecommitdiffstats
path: root/perl-install/fs.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/fs.pm')
-rw-r--r--perl-install/fs.pm512
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;