summaryrefslogtreecommitdiffstats
path: root/perl-install/diskdrake/hd_gtk.pm
blob: fab65884bb5cbfd9bbbad0b5f1a55eb8bb02f5dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
package diskdrake::hd_gtk; # $Id$

use diagnostics;
use strict;

use common;
use mygtk2 qw(gtknew);
use ugtk2 qw(:helpers :wrappers :create);
use partition_table;
use fs::type;
use detect_devices;
use diskdrake::interactive;
use run_program;
use devices;
use log;
use fsedit;

my ($width, $height, $minwidth) = (400, 50, 5);
my ($all_hds, $in, $do_force_reload, $current_kind, $current_entry, $update_all);
my ($w, @notebook, $done_button);

=begin


=head1 SYNOPSYS

struct {
  string name      # which is displayed in tab of the notebook
  bool no_auto     # wether the kind can disappear after creation
  string type      # one of { 'hd', 'raid', 'lvm', 'loopback', 'removable', 'nfs', 'smb' }
  hd | hd_lvm | part_raid[] | part_loopback[] | raw_hd[]  val

  # 
  widget main_box
  widget display_box
  widget action_box
  widget info_box
} current_kind

part current_entry

notebook current_kind[]

=cut

sub main {
    ($in, $all_hds, $do_force_reload) = @_;

    @notebook = ();

    local $in->{grab} = 1;

    $w = ugtk2->new(N("Partitioning"));
    $::main_window = $w->{real_window} if !$::isEmbedded && !$::isInstall;
    my $rc = "/usr/share/libDrakX/diskdrake.rc";
    -r $rc or $rc = dirname(__FILE__) . "/../diskdrake.rc";
    -r $rc or $rc = dirname(__FILE__) . "/../share/diskdrake.rc";
    Gtk2::Rc->parse($rc);

    # TODO
#    is_empty_array_ref($all_hds->{raids}) or raid::stopAll;
#    updateLoopback();

    gtkadd($w->{window},
	   gtkpack_(Gtk2::VBox->new(0,7),
		    0, filesystems_button_box(),
		    1, (my $notebook_widget = Gtk2::Notebook->new),
		    0, (my $per_kind_action_box = Gtk2::HBox->new(0,0)),
		    0, (my $general_action_box  = Gtk2::HBox->new(0,0)),
		   ),
	  );
    my $lock;
    $update_all = sub {
	$lock and return;
	$lock = 1;
	partition_table::assign_device_numbers($_) foreach fs::get::hds($all_hds);
	create_automatic_notebooks($notebook_widget);
	general_action_box($general_action_box);
	per_kind_action_box($per_kind_action_box, $current_kind);
	current_kind_changed($in, $current_kind);
	current_entry_changed($current_kind, $current_entry);
	$lock = 0;
    };
    create_automatic_notebooks($notebook_widget);

    $notebook_widget->signal_connect(switch_page => sub {
	$current_kind = $notebook[$_[2]];
	$current_entry = '';
	$update_all->();
    });
    $w->sync;
    $done_button->grab_focus;
    $in->ask_from_list_(N("Read carefully!"), N("Please make a backup of your data first"), 
			[ N_("Exit"), N_("Continue") ], N_("Continue")) eq N_("Continue") or return
      if $::isStandalone;
    $in->ask_warn('', 
N("If you plan to use aboot, be careful to leave a free space (2048 sectors is enough)
at the beginning of the disk")) if arch() eq 'alpha' && !$::isEmbedded;

    $w->main;
}

sub try {
    my ($name, @args) = @_;
    my $f = $diskdrake::interactive::{$name} or die "unknown function $name";
    try_($name, \&$f, @args);
}
sub try_ {
    my ($name, $f, @args) = @_;

    my $v = eval { $f->($in, @args, $all_hds) };
    if (my $err = $@) {
	$in->ask_warn(N("Error"), formatError($err));
    }
    if ($v eq 'force_reload') {	
	$all_hds = $do_force_reload->();
    }

    $current_entry = '' if !diskdrake::interactive::is_part_existing($current_entry, $all_hds);
    $update_all->();

    Gtk2->main_quit if $v && member($name, 'Done');
}

################################################################################
# generic: helpers
################################################################################
sub add_kind2notebook {
    my ($notebook_widget, $kind) = @_;
    die if $kind->{main_box};

    $kind->{display_box} = gtkset_size_request(Gtk2::HBox->new(0,0), $width, $height);
    $kind->{action_box} = gtkset_size_request(Gtk2::VBox->new(0,0), $::isStandalone ? 165 : 150, $::isEmbedded ? 150 : 180);
    $kind->{info_box} = Gtk2::VBox->new(0,0);
    $kind->{main_box} =
      gtkpack_(Gtk2::VBox->new(0,7),
	       0, $kind->{display_box},
	       1, gtkpack_(Gtk2::HBox->new(0,7),
			   0, $kind->{action_box},
			   1, $kind->{info_box}));
    ugtk2::add2notebook($notebook_widget, $kind->{name}, $kind->{main_box});
    push @notebook, $kind;
    $kind;
}

sub interactive_help() {
    if ($::isInstall) {
        my $func = $in->interactive_help_sub_display_id('partition_with_diskdrake');
        $func and $func->();
    } else {
        require run_program;
        run_program::raw({ detach => 1 }, 'drakhelp', '--id', 'diskdrake');
    }
}

sub general_action_box {
    my ($box) = @_;
    $_->destroy foreach $box->get_children;

    gtkadd($box, gtksignal_connect(Gtk2::Button->new(N("Help")), clicked => \&interactive_help));

    my @actions = (
		   diskdrake::interactive::general_possible_actions($in, $all_hds), 
		   N_("Done"));
    foreach my $s (@actions) {
	my $button = Gtk2::Button->new(translate($s));
	$done_button = $button if $s eq 'Done';
	gtkadd($box, gtksignal_connect($button, clicked => sub { try($s) }));
    }
}
sub per_kind_action_box {
    my ($box, $kind) = @_;
    $_->destroy foreach $box->get_children;

    $kind->{type} =~ /hd|lvm/ or return;

    foreach my $s (diskdrake::interactive::hd_possible_actions($in, kind2hd($kind), $all_hds)) {
	gtkadd($box, 
	       gtksignal_connect(Gtk2::Button->new(translate($s)),
				 clicked => sub { try($s, kind2hd($kind)) }));
    }
}
sub per_entry_action_box {
    my ($box, $kind, $entry) = @_;
    $_->destroy foreach $box->get_children;

    if ($entry) {
	my @buttons = map { 
	    my $s = $_;
	    my $w = Gtk2::Button->new(translate($s));
	    $w->signal_connect(clicked => sub { try($s, kind2hd($kind), $entry) });
	    $w;
	} diskdrake::interactive::part_possible_actions($in, kind2hd($kind), $entry, $all_hds);

	gtkadd($box, gtkadd(Gtk2::Frame->new(N("Choose action")),
			    create_scrolled_window(gtkpack__(Gtk2::VBox->new(0,0), @buttons)))) if @buttons;
    } else {
	my $txt = !$::isStandalone && fsedit::is_one_big_fat_or_NT($all_hds->{hds}) ?
N("You have one big Microsoft Windows partition.
I suggest you first resize that partition
(click on it, then click on \"Resize\")") : N("Please click on a partition");
	gtkpack($box, gtktext_insert(Gtk2::TextView->new, $txt));
    }
}

sub per_entry_info_box {
    my ($box, $kind, $entry) = @_;
    $_->destroy foreach $box->get_children;
    my $info;
    if ($entry) {
	$info = diskdrake::interactive::format_part_info(kind2hd($kind), $entry);
    } elsif ($kind->{type} =~ /hd|lvm/) {
	$info = diskdrake::interactive::format_hd_info($kind->{val});
    }
    gtkpack($box, gtkadd(gtkcreate_frame(N("Details")), 
                         gtknew('HBox', border_width => 5, children_loose => [
                         gtkset_alignment(gtkset_justify(Gtk2::Label->new($info), 'left'), 0, 0) ])));
}

sub current_kind_changed {
    my ($_in, $kind) = @_;

    $_->destroy foreach $kind->{display_box}->get_children;

    my $v = $kind->{val};
    my @parts = 
      $kind->{type} eq 'raid' ? grep { $_ } @$v :
      $kind->{type} eq 'loopback' ? @$v : fs::get::hds_fstab_and_holes($v);
    my $totalsectors = 
      $kind->{type} =~ /raid|loopback/ ? sum(map { $_->{size} } @parts) : $v->{totalsectors};
    create_buttons4partitions($kind, $totalsectors, @parts);
}

sub current_entry_changed {
    my ($kind, $entry) = @_;
    $current_entry = $entry;
    if ($kind) {
	per_entry_action_box($kind->{action_box}, $kind, $entry);
	per_entry_info_box($kind->{info_box}, $kind, $entry);
    }
}

sub create_automatic_notebooks {
    my ($notebook_widget) = @_;

    $_->{marked} = 0 foreach @notebook;
    my $may_add = sub {
	my ($kind) = @_;
	my @l = grep { $kind->{val} == $_->{val} } @notebook;
	@l > 1 and log::l("weird: create_automatic_notebooks");
	$kind = $l[0] || add_kind2notebook($notebook_widget, $kind);
	$kind->{marked} = 1;
    };
    $may_add->(hd2kind($_)) foreach @{$all_hds->{hds}};
    $may_add->(lvm2kind($_)) foreach @{$all_hds->{lvms}};
    $may_add->(raid2kind()) if @{$all_hds->{raids}};
    $may_add->(loopback2kind()) if @{$all_hds->{loopbacks}};

    @notebook = grep_index {
	my $b = $_->{marked} or $notebook_widget->remove_page($::i);
	$b;
    } @notebook;
    @notebook or $in->ask_warn(N("Error"), N("No hard drives found")), $in->exit(1);
}

################################################################################
# parts: helpers
################################################################################
sub create_buttons4partitions {
    my ($kind, $totalsectors, @parts) = @_;

    $width = max($width, 0.9 * second($w->{window}->window->get_size)) if $w->{window}->window;

    my $ratio = $totalsectors ? ($width - @parts * $minwidth) / $totalsectors : 1;
    while (1) {
	my $totalwidth = sum(map { $_->{size} * $ratio + $minwidth } @parts);
	$totalwidth <= $width and last;
	$ratio /= $totalwidth / $width * 1.1;
    }

    my $current_button;
    my $set_current_button = sub {
	my ($w) = @_;
	$current_button->set_active(0) if $current_button;
	($current_button = $w)->set_active(1);
    };

    foreach my $entry (@parts) {
	my $info = $entry->{mntpoint};
	$info .= "\n" . ($entry->{size} ? formatXiB($entry->{size}, 512) : N("Unknown")) if $info;
	my $w = Gtk2::ToggleButton->new_with_label($info) or internal_error('new_with_label');
	$w->signal_connect(clicked => sub { 
	    $current_button != $w or return;
	    current_entry_changed($kind, $entry); 
	    $set_current_button->($w);
	});
	$w->signal_connect(key_press_event => sub {
	    my (undef, $event) = @_;
	    member('control-mask', @{$event->state}) && $w == $current_button or return; 
	    my $c = chr $event->keyval;

	    foreach my $s (diskdrake::interactive::part_possible_actions($in, kind2hd($kind), $entry, $all_hds)) {
		${{
		    Create => 'c', Delete => 'd', Format => 'f', 
		    Loopback => 'l', Resize => 'r', Type => 't', 
		    Mount => 'M', Unmount => 'u', 'Mount point' => 'm',
		    'Add to LVM' => 'L', 'Remove from LVM' => 'L', 
		    'Add to RAID' => 'R', 'Remove from RAID' => 'R',
		}}{$s} eq $c or next;

		try($s, kind2hd($kind), $entry);
		last;
	    }
	});
	my @colorized_fs_types = qw(ext3 ext4dev xfs swap vfat ntfs ntfs-3g);
	$w->set_name("PART_" . (isEmpty($entry) ? 'empty' : 
				$entry->{fs_type} && member($entry->{fs_type}, @colorized_fs_types) ? $entry->{fs_type} :
				'other'));
	$w->set_size_request($entry->{size} * $ratio + $minwidth, 0);
	gtkpack__($kind->{display_box}, $w);
	if ($current_entry && fsedit::are_same_partitions($current_entry, $entry)) {
	    $set_current_button->($w);
	    $w->grab_focus;
	}
    }
}


################################################################################
# disks: helpers
################################################################################
sub current_hd() { 
    $current_kind->{type} eq 'hd' or die 'current_hd called but $current_kind is not an hd';
    $current_kind->{val};
}
sub current_part() {
    current_hd();
    $current_entry;
}

sub kind2hd {
    my ($kind) = @_;
    $kind->{type} =~ /hd|lvm/ ? $kind->{val} : bless({}, 'partition_table::raw');
}

sub hd2kind {
    my ($hd) = @_;
    { type => 'hd', name => $hd->{device}, val => $hd };
}

sub filesystems_button_box() {
    my @types = (N_("Ext3"), N_("XFS"), N_("Swap"), arch() =~ /sparc/ ? N_("SunOS") : arch() eq "ppc" ? N_("HFS") : N_("Windows"),
		 N_("Other"), N_("Empty"));
    my %name2fs_type = (Ext3 => 'ext3', Ext4 => 'ext4dev', 'XFS' => 'xfs', Swap => 'swap', Other => 'other', "Windows" => 'vfat', HFS => 'hfs');

    gtkpack(Gtk2::HBox->new(0,0), 
	    N("Filesystem types:"),
	    map { my $w = Gtk2::Button->new(translate($_));
		  my $t = $name2fs_type{$_};
		  $w->signal_connect(clicked => sub { try_('', \&createOrChangeType, $t, current_hd(), current_part()) });
		  $w->can_focus(0);
		  $w->set_name('PART_' . ($t || 'empty')); 
		  $w;
	    } @types);
}

sub createOrChangeType {
    my ($in, $fs_type, $hd, $part, $all_hds) = @_;

    $part ||= !fs::get::hds_fstab($hd) && 
              { pt_type => 0, start => 1, size => $hd->{totalsectors} - 1 };
    $part or return;
    if ($fs_type eq 'other') {
        if (isEmpty($part)) {
            try('Create', $hd, $part);
        } else {
            try('Type', $hd, $part);
        }
    } elsif (!$fs_type) {
        if (isEmpty($part)) {
            $in->ask_warn(N("Warning"), N("This partition is already empty"));
        } else {
            try('Delete', $hd, $part);
        }
    } elsif (isEmpty($part)) {
	fs::type::set_fs_type($part, $fs_type);
	diskdrake::interactive::Create($in, $hd, $part, $all_hds);
    } else {
	return if $fs_type eq $part->{fs_type};
	$in->ask_warn('', isBusy($part) ? N("Use ``Unmount'' first") : N("Use ``%s'' instead (in expert mode)", N("Type")));
    }
}

################################################################################
# lvms: helpers
################################################################################
sub lvm2kind {
    my ($lvm) = @_;
    { type => 'lvm', name => $lvm->{VG_name}, val => $lvm };
}

################################################################################
# raids: helpers
################################################################################
sub raid2kind() {
    { type => 'raid', name => 'raid', val => $all_hds->{raids} };
}

################################################################################
# loopbacks: helpers
################################################################################
sub loopback2kind() {
    { type => 'loopback', name => 'loopback', val => $all_hds->{loopbacks} };
}

1;
str">selected. If you use Microsoft Windows on this computer, choose \"No\"."), configureServices => __("You may now choose which services you want to start at boot time. When your mouse comes over an item, a small balloon help will popup which describes the role of the service. Be very careful in this step if you intend to use your machine as a server: you will probably want not to start any services that you don't need. Please remember that several services can be dangerous if they are enable on a server. In general, select only the services that you really need."), configurePrinter => __("You can configure a local printer (connected to your computer) or remote printer (accessible via a Unix, Netware or Microsoft Windows network)."), configurePrinterSystem => __("If you wish to be able to print, please choose one printing system between CUPS and LPR. CUPS is a new, powerful and flexible printing system for Unix systems (CUPS means \"Common Unix Printing System\"). It is the default printing system in Mandrake Linux. LPR is the old printing system used in previous Mandrake Linux distributions. If you don't have printer, click on \"None\"."), configurePrinterConnected => __("GNU/Linux can deal with many types of printer. Each of these types requires a different setup. If your printer is physically connected to your computer, select \"Local printer\". If you want to access a printer located on a remote Unix machine, select \"Remote printer\". If you want to access a printer located on a remote Microsoft Windows machine (or on Unix machine using SMB protocol), select \"SMB/Windows 95/98/NT\"."), configurePrinterLocal => __("Please turn on your printer before continuing to let DrakX detect it. You have to enter some informations here. * Name of printer: the print spooler uses \"lp\" as default printer name. So, you must have a printer named \"lp\". If you have only one printer, you can use several names for it. You just need to separate them by a pipe character (a \"|\"). So, if you prefer a more meaningful name, you have to put it first, eg: \"My printer|lp\". The printer having \"lp\" in its name(s) will be the default printer. * Description: this is optional but can be useful if several printers are connected to your computer or if you allow other computers to access to this printer. * Location: if you want to put some information on your printer location, put it here (you are free to write what you want, for example \"2nd floor\"). "), configurePrinterLPR => __("You need to enter some informations here. * Name of queue: the print spooler uses \"lp\" as default printer name. So, you need have a printer named \"lp\". If you have only one printer, you can use several names for it. You just need to separate them by a pipe character (a \"|\"). So, if you prefer to have a more meaningful name, you have to put it first, eg: \"My printer|lp\". The printer having \"lp\" in its name(s) will be the default printer. * Spool directory: it is in this directory that printing jobs are stored. Keep the default choice if you don't know what to use * Printer Connection: If your printer is physically connected to your computer, select \"Local printer\". If you want to access a printer located on a remote Unix machine, select \"Remote lpd printer\". If you want to access a printer located on a remote Microsoft Windows machine (or on Unix machine using SMB protocol), select \"SMB/Windows 95/98/NT\". If you want to acces a printer located on NetWare network, select \"NetWare\". "), configurePrinterDev => __("Your printer has not been detected. Please enter the name of the device on which it is connected. For information, most printers are connected on the first parallel port. This one is called \"/dev/lp0\" under GNU/Linux and \"LPT1\" under Microsoft Windows."), configurePrinterType => __("You must now select your printer in the above list."), configurePrinterOptions => __("Please select the right options according to your printer. Please see its documentation if you don't know what choose here. You will be able to test your configuration in next step and you will be able to modify it if it doesn't work as you want."), setRootPassword => __("You can now enter the root password for your Mandrake Linux system. The password must be entered twice to verify that both password entries are identical. Root is the system's administrator and is the only user allowed to modify the system configuration. Therefore, choose this password carefully. Unauthorized use of the root account can be extemely dangerous to the integrity of the system, its data and other system connected to it. The password should be a mixture of alphanumeric characters and at least 8 characters long. It should never be written down. Do not make the password too long or complicated, though: you must be able to remember it without too much effort."), setRootPasswordAuth => __("If your network uses LDAP (or NIS) protocol for authentication, select \"LDAP\" (or \"NIS\") as authentication. If you don't know, ask your network administrator. If your computer is not connected to any administrated network, you may want to choose \"Local files\" for authentication."), addUser => __("You may now create one or more \"regular\" user account(s), as opposed to the \"privileged\" user account, root. You can create one or more account(s) for each person you want to allow to use the computer. Note that each user account will have its own preferences (graphical environment, program settings, etc.) and its own \"home directory\", in which these preferences are stored. First of all, create an account for yourself! Even if you will be the only user of the machine, you may NOT connect as root for daily use of the system: it's a very high security risk. Making the system unusable is very often a typo away. Therefore, you should connect to the system using the user account you will have created here, and login as root only for administration and maintenance purposes."), createBootdisk => __("Creating a boot disk is strongly recommended. If you can't boot your computer, it's the only way to rescue your system without reinstalling it."), setupBootloaderBeginner => __("You need to indicate where you wish to place the information required to boot to GNU/Linux. Unless you know exactly what you are doing, choose \"First sector of drive (MBR)\"."), setupBootloader => __("Unless you know specifically otherwise, the usual choice is \"/dev/hda\" (primary master IDE disk) or \"/dev/sda\" (first SCSI disk)."), setupBootloaderAddEntry => __("LILO (the LInux LOader) and Grub are bootloaders: they are able to boot either GNU/Linux or any other operating system present on your computer. Normally, these other operating systems are correctly detected and installed. If this is not the case, you can add an entry by hand in this screen. Be careful as to choose the correct parameters. You may also want not to give access to these other operating systems to anyone, in which case you can delete the corresponding entries. But in this case, you will need a boot disk in order to boot them!"), setupBootloaderGeneral => __("LILO and grub main options are: - Boot device: Sets the name of the device (e.g. a hard disk partition) that contains the boot sector. Unless you know specifically otherwise, choose \"/dev/hda\". - Delay before booting default image: Specifies the number in tenths of a second the boot loader should wait before booting the first image. This is useful on systems that immediately boot from the hard disk after enabling the keyboard. The boot loader doesn't wait if \"delay\" is omitted or is set to zero. - Video mode: This specifies the VGA text mode that should be selected when booting. The following values are available: * normal: select normal 80x25 text mode. * <number>: use the corresponding text mode. - Clean \"/tmp\" at each boot: if you want delete all files and directories stored in \"/tmp\" when you boot your system, select this option. - Precise RAM if needed: unfortunately, there is no standard method to ask the BIOS about the amount of RAM present in your computer. As consequence, Linux may fail to detect your amount of RAM correctly. If this is the case, you can specify the correct amount or RAM here. Please note that a difference of 2 or 4 MB between detected memory and memory present in your system is normal."), setupYabootGeneral => __("Yaboot is a bootloader for NewWorld MacIntosh hardware. It is able to boot either GNU/Linux, MacOS, or MacOSX, if present on your computer. Normally, these other operating systems are correctly detected and installed. If this is not the case, you can add an entry by hand in this screen. Be careful as to choose the correct parameters. Yaboot main options are: - Init Message: A simple text message that is displayed before the boot prompt. - Boot Device: Indicate where you want to place the information required to boot to GNU/Linux. Generally, you will have setup a bootstrap partition earlier to hold this information. - Open Firmware Delay: Unlike LILO, there are two delays available with yaboot. The first delay is measured in seconds and at this point you can choose between CD, OF boot, MacOS, or Linux. - Kernel Boot Timeout: This timeout is similar to the LILO boot delay. After selecting Linux, you will have this delay in 0.1 seconds before your default kernel description is selected. - Enable CD Boot?: Checking this option will allow you to choose 'C' for CD at the first boot prompt. - Enable OF Boot?: Checking this option will allow you to choose 'N' for Open Firmware at the first boot prompt. - Default OS: You can select which OS will boot by default when the Open Firmware Delay expires."), setupYabootAddEntry => __("You can add additional entries for yaboot, either for other operating systems, alternate kernels, or for an emergency boot image. For other OS's - the entry consists only of a label and the root partition. For Linux, there are a few possible options: - Label: This is simply the name will type at the yaboot prompt to select this boot option. - Image: This would be the name of the kernel to boot. Typically vmlinux or a variation of vmlinux with an extension. - Root: The root device or '/' for your Linux installation. - Append: On Apple hardware, the kernel append option is used quite often to assist in initializing video hardware, or to enable keyboard mouse button emulation for the often lacking 2nd and 3rd mouse buttons on a stock Apple mouse. The following are some examples: video=aty128fb:vmode:17,cmode:32,mclk:71 adb_buttons=103,111 hda=autotune video=atyfb:vmode:12,cmode:24 adb_buttons=103,111 - Initrd: This option can be used either to load initial modules, before the boot device is available, or to load a ramdisk image for an emergency boot situation. - Initrd-size: The default ramdisk size is generally 4096 bytes. If you should need to allocate a large ramdisk, this option can be used. - Read-write: Normally the 'root' partition is initially brought up read-only, to allow a filesystem check before the system becomes 'live'. You can override this option here. - NoVideo: Should the Apple video hardware prove to be exceptionally problematic, you can select this option to boot in 'novideo' mode, with native framebuffer support. - Default: Selects this entry as being the default Linux selection, selectable by just pressing ENTER at the yaboot prompt. This entry will also be highlighted with a '*', if you press TAB to see the boot selections."), setupSILOAddEntry => __("SILO is a bootloader for SPARC: it is able to boot either GNU/Linux or any other operating system present on your computer. Normally, these other operating systems are correctly detected and installed. If this is not the case, you can add an entry by hand in this screen. Be careful as to choose the correct parameters. You may also want not to give access to these other operating systems to anyone, in which case you can delete the corresponding entries. But in this case, you will need a boot disk in order to boot them!"), setupSILOGeneral => __("SILO main options are: - Bootloader installation: Indicate where you want to place the information required to boot to GNU/Linux. Unless you know exactly what you are doing, choose \"First sector of drive (MBR)\". - Delay before booting default image: Specifies the number in tenths of a second the boot loader should wait before booting the first image. This is useful on systems that immediately boot from the hard disk after enabling the keyboard. The boot loader doesn't wait if \"delay\" is omitted or is set to zero."), configureX => __("Now it's time to configure the X Window System, which is the core of the GNU/Linux GUI (Graphical User Interface). For this purpose, you must configure your video card and monitor. Most of these steps are automated, though, therefore your work may only consist of verifying what has been done and accept the settings :) When the configuration is over, X will be started (unless you ask DrakX not to) so that you can check and see if the settings suit you. If they don't, you can come back and change them, as many times as necessary."), configureXmain => __("If something is wrong in X configuration, use these options to correctly configure the X Window System."), configureXxdm => __("If you prefer to use a graphical login, select \"Yes\". Otherwise, select \"No\"."), miscellaneous => __("You can choose a security level for your system. Please refer to the manual for complete information. Basically, if you don't know what to choose, keep the default option. "), exitInstall => __("Your system is going to reboot. After rebooting, your new Mandrake Linux system will load automatically. If you want to boot into another existing operating system, please read the additional instructions."), ); #-#- ################################################################################ #-#- NO LONGER UP-TO-DATE... #-%steps_long = ( #-selectLanguage => #- __("Choose preferred language for install and system usage."), #- #-selectKeyboard => #- __("Choose the layout corresponding to your keyboard from the list above"), #- #-selectPath => #- __("Choose \"Installation\" if there are no previous versions of GNU/Linux #-installed, or if you wish to use multiple distributions or versions. #- #- #-Choose \"Update\" if you wish to update a previous version of Mandrake #-Linux: 5.1 (Venice), 5.2 (Leeloo), 5.3 (Festen) or 6.0 (Venus)."), #- #-selectInstallClass => #- __("Select: #- #- - Beginner: If you have never installed GNU/Linux before, and wish to #-install the distribution elected \"Product of the year\" for 1999, #-click here. #- #- - Developer: If you are familiar with GNU/Linux and will be using the #-computer primarily for software development, you will find happiness #-here. #- #- - Server: If you wish to install a general purpose server, or the #-GNU/Linux distribution elected \"Distribution/Server\" for 1999, select #-this. #- #- - Expert: If you are fluent with GNU/Linux and want to perform #-a highly customized installation, this Install Class is for you."), #- #-setupSCSI => #- __("DrakX will attempt at first to look for one or more PCI #-SCSI adapter(s). If it finds it (or them) and knows which driver(s) #-to use, it will insert it (them) automatically. #- #-If your SCSI adapter is ISA, or is PCI but DrakX doesn't know #-which driver to use for this card, or if you have no SCSI adapters #-at all, you will then be prompted on whether you have one or not. #-If you have none, answer \"No\". If you have one or more, answer #-\"Yes\". A list of drivers will then pop up, from which you will #-have to select one. #- #-After you have selected the driver, DrakX will ask if you #-want to specify options for it. First, try and let the driver #-probe for the hardware: it usually works fine. #- #-If not, do not forget the information on your hardware that you #-could get from you documentation or from Windows (if you have #-it on your system), as suggested by the installation guide. #-These are the options you will need to provide to the driver."), #- #-partitionDisks => #- __("In this stage, you may choose what partition(s) use to install your #-Mandrake Linux system."), #- #-#At this point, hard drive partitions must be defined. (Unless you #-#are overwriting a previous install of GNU/Linux and have already defined #-#your hard drive partitions as desired.) This operation consists of #-#logically dividing the computer's hard drive capacity into separate #-#areas for use. #-# #-# #-#Two common partition are: the root partition (/), which is the starting #-#point of the filesystem's directory hierarchy, and /boot, which contains #-#all files necessary to start the operating system when the #-#computer is first turned on. #-# #-# #-#Because the effects of this process are usually irreversible, partitioning #-#can be intimidating and stressful to the unexperienced. DiskDrake #-#simplifies the process so that it need not be. Consult the documentation #-#and take your time before proceeding."), #- #-formatPartitions => #- __("Any partitions that have been newly defined must be formatted for #-use (formatting meaning creating a filesystem). At this time, you may #-wish to re-format some already existing partitions to erase the data #-they contain. Note: it is not necessary to re-format pre-existing #-partitions, particularly if they contain files or data you wish to keep. #-Typically retained are /home and /usr/local."), #- #-choosePackages => #- __("You may now select the packages you wish to install. #- #- #-Please note that some packages require the installation of others. #-These are referred to as package dependencies. The packages you select, #-and the packages they require will be automatically selected for #-install. It is impossible to install a package without installing all #-of its dependencies. #- #- #-Information on each category and specific package is available in the #-area titled \"Info\", located between list of packages and the five #-buttons \"Install\", \"Select more/less\" and \"Show more/less\"."), #- #-doInstallStep => #- __("The packages selected are now being installed. #- #- #-This operation should take a few minutes."), #- #-selectMouse => #- __("If DrakX failed to find your mouse, or if you want to #-check what it has done, you will be presented the list of mice #-above. #- #- #-If you agree with DrakX' settings, just jump to the section #-you want by clicking on it in the menu on the left. Otherwise, #-choose a mouse type in the menu which you think is the closest #-match for your mouse. #- #-In case of a serial mouse, you will also have to tell DrakX #-which serial port it is connected to."), #- #-configureNetwork => #- __("This section is dedicated to configuring a local area network, #-or LAN. If you answer \"Yes\" here, DrakX will try to find an #-Ethernet adapter on your machine. PCI adapters should be found and #-initialized automatically. However, if your peripheral is ISA, #-autodetection will not work, and you will have to choose a driver