summaryrefslogtreecommitdiffstats
path: root/perl-install/partition_table.pm
blob: a4120d0bb3f642a21fe32b0d1f12b52d8b3ae798 (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
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
package partition_table; # $Id$

use diagnostics;
use strict;
use vars qw(@ISA %EXPORT_TAGS @EXPORT_OK @important_types @important_types2 @fields2save @bad_types);

@ISA = qw(Exporter);
%EXPORT_TAGS = (
    types => [ qw(type2name type2fs name2type fs2type isExtended isExt2 isThisFs isTrueFS isSwap isDos isWin isFat isFat_or_NTFS isSunOS isOtherAvailableFS isPrimary isRawLVM isRawRAID isRAID isLVM isMountableRW isNonMountable isPartOfLVM isPartOfRAID isPartOfLoopback isLoopback isMounted isBusy isSpecial maybeFormatted isApple isAppleBootstrap isEfi) ],
);
@EXPORT_OK = map { @$_ } values %EXPORT_TAGS;


use common;
use partition_table::raw;
use detect_devices;
use log;

@important_types = ('Linux native', 'Linux swap', 
		    if_(arch() =~ /i.86/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: JFS', 'Journalised FS: XFS', 'DOS FAT16', 'FAT32'),
			if_(arch() =~ /ia64/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: XFS', 'FAT32'),
			if_(arch() =~ /x86_64/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'FAT32'),
		    if_(arch() =~ /ppc/, 'Journalised FS: ext3', 'Journalised FS: ReiserFS', 'Journalised FS: JFS', 'Journalised FS: XFS', 'Apple HFS Partition', 'Apple Bootstrap'));
@important_types2 = ('Linux RAID', 'Linux Logical Volume Manager partition');

@fields2save = qw(primary extended totalsectors isDirty needKernelReread);

@bad_types = ('Empty', 'DOS 3.3+ Extended Partition', 'Win95: Extended partition, LBA-mapped', 'Linux extended partition');

my %types = (
  0x0 => 'Empty',
if_(arch() =~ /^ppc/, 
  0x183 => 'Journalised FS: ReiserFS',
  0x283 => 'Journalised FS: XFS',
  0x383 => 'Journalised FS: JFS',
  0x483 => 'Journalised FS: ext3',
  0x401	=> 'Apple Partition',
  0x401	=> 'Apple Bootstrap',
  0x402	=> 'Apple HFS Partition',
), if_(arch() =~ /^i.86/,
  0x107 => 'NTFS',
  0x183 => 'Journalised FS: ReiserFS',
  0x283 => 'Journalised FS: XFS',
  0x383 => 'Journalised FS: JFS',
  0x483 => 'Journalised FS: ext3',
), if_(arch() =~ /^ia64/,
  0x100 => 'Various',
  0x183 => 'Journalised FS: ReiserFS',
  0x283 => 'Journalised FS: XFS',
  0x483 => 'Journalised FS: ext3',
), if_(arch() =~ /^x86_64/,
  0x183 => 'Journalised FS: ReiserFS',
  0x483 => 'Journalised FS: ext3',
), if_(arch() =~ /^sparc/,
  0x1 => 'SunOS boot',
  0x2 => 'SunOS root',
  0x3 => 'SunOS swap',
  0x4 => 'SunOS usr',
  0x5 => 'Whole disk',
  0x6 => 'SunOS stand',
  0x7 => 'SunOS var',
  0x8 => 'SunOS home',
), if_(arch() =~ /^i.86/,
  0x1 => 'DOS 12-bit FAT',
  0x2 => 'XENIX root',
  0x3 => 'XENIX /usr',
  0x4 => 'DOS 16-bit FAT (up to 32M)',
  0x5 => 'DOS 3.3+ Extended Partition',
  0x6 => 'DOS FAT16',
  0x7 => 'NTFS (or HPFS)',
  0x8 => 'OS/2 (v1.0-1.3 only) / AIX boot partition / SplitDrive / Commodore DOS / DELL partition spanning multiple drives / QNX 1.x and 2.x ("qny")',
),
  0x9 => 'AIX data partition / Coherent filesystem / QNX 1.x and 2.x ("qnz")',
  0xa => 'OS/2 Boot Manager / Coherent swap partition / OPUS',
  0xb => 'FAT32',
  0xc => 'Win98 FAT32, LBA-mapped',
  0xe => 'Win95: DOS 16-bit FAT, LBA-mapped',
  0xf => 'Win95: Extended partition, LBA-mapped',
  0x10 => 'OPUS (?)',
  0x11 => 'Hidden DOS 12-bit FAT',
  0x12 => 'Compaq/HP config partition',
  0x14 => 'Hidden DOS 16-bit FAT <32M',
  0x16 => 'Hidden DOS 16-bit FAT >=32M',
  0x17 => 'Hidden IFS (e.g., HPFS)',
  0x18 => 'AST Windows swapfile',
  0x1b => 'Hidden WIN95 OSR2 32-bit FAT',
  0x1c => 'Hidden WIN95 OSR2 32-bit FAT, LBA-mapped',
  0x1e => 'Hidden FAT95',
  0x22 => 'Used for Oxygen Extended Partition Table by ekstazya@sprint.ca.',
  0x24 => 'NEC DOS 3.x',
  0x35 => 'JFS (OS/2)',
  0x38 => 'THEOS ver 3.2 2gb partition',
  0x39 => 'THEOS ver 4 spanned partition',
  0x3a => 'THEOS ver 4 4gb partition',
  0x3b => 'THEOS ver 4 extended partition',
  0x3c => 'PartitionMagic recovery partition',
  0x40 => 'Venix 80286',
  0x41 => 'Linux/MINIX (sharing disk with DRDOS) / Personal RISC Boot / PPC PReP (Power PC Reference Platform) Boot',
  0x42 => 'Windows Dynamic Partition',
  0x43 => 'Linux native (sharing disk with DRDOS)',
  0x45 => 'EUMEL/Elan',
  0x46 => 'EUMEL/Elan 0x46',
  0x47 => 'EUMEL/Elan 0x47',
  0x48 => 'EUMEL/Elan 0x48',
  0x4d => 'QNX4.x',
  0x4e => 'QNX4.x 2nd part',
  0x4f => 'QNX4.x 3rd part / Oberon partition',
  0x50 => 'OnTrack Disk Manager (older versions) RO',
  0x51 => 'OnTrack Disk Manager RW (DM6 Aux1) / Novell',
  0x52 => 'CP/M / Microport SysV/AT',
  0x53 => 'Disk Manager 6.0 Aux3',
  0x54 => 'Disk Manager 6.0 Dynamic Drive Overlay',
  0x55 => 'EZ-Drive',
  0x56 => 'Golden Bow VFeature Partitioned Volume. / DM converted to EZ-BIOS',
  0x57 => 'DrivePro',
  0x5c => 'Priam EDisk',
  0x61 => 'SpeedStor',
  0x63 => 'Unix System V (SCO, ISC Unix, UnixWare, ...), Mach, GNU Hurd',
  0x64 => 'PC-ARMOUR protected partition / Novell Netware 2.xx',
  0x65 => 'Novell Netware 3.xx or 4.xx',
  0x67 => 'Novell',
  0x68 => 'Novell 0x68',
  0x69 => 'Novell 0x69',
  0x70 => 'DiskSecure Multi-Boot',
  0x75 => 'IBM PC/IX',
  0x80 => 'MINIX until 1.4a',
  0x81 => 'MINIX since 1.4b, early Linux / Mitac disk manager',
  0x82 => 'Linux swap',
  0x83 => 'Linux native',
  0x84 => 'OS/2 hidden C: drive / Hibernation partition',
  0x85 => 'Linux extended partition',
  0x86 => 'Old Linux RAID partition superblock / NTFS volume set',
  0x87 => 'NTFS volume set',
  0x8a => 'Linux Kernel Partition (used by AiR-BOOT)',
  0x8e => 'Linux Logical Volume Manager partition',
  0x93 => 'Amoeba',
  0x94 => 'Amoeba bad block table',
  0x99 => 'DCE376 logical drive',
  0xa0 => 'IBM Thinkpad hibernation partition / Phoenix NoteBIOS Power Management "Save-to-Disk" partition',
  0xa5 => 'BSD/386, 386BSD, NetBSD, FreeBSD',
  0xa6 => 'OpenBSD',
  0xa7 => 'NEXTSTEP',
  0xa9 => 'NetBSD',
  0xaa => 'Olivetti Fat 12 1.44Mb Service Partition',
  0xb7 => 'BSDI filesystem',
  0xb8 => 'BSDI swap partition',
  0xbe => 'Solaris boot partition',
  0xc0 => 'CTOS / REAL/32 secure small partition',
  0xc1 => 'DRDOS/secured (FAT-12)',
  0xc4 => 'DRDOS/secured (FAT-16, < 32M)',
  0xc6 => 'DRDOS/secured (FAT-16, >= 32M) / Windows NT corrupted FAT16 volume/stripe set',
  0xc7 => 'Windows NT corrupted NTFS volume/stripe set / Syrinx boot',
  0xcb => 'reserved for DRDOS/secured (FAT32)',
  0xcc => 'reserved for DRDOS/secured (FAT32, LBA)',
  0xcd => 'CTOS Memdump?',
  0xce => 'reserved for DRDOS/secured (FAT16, LBA)',
  0xd0 => 'REAL/32 secure big partition',
  0xd1 => 'Old Multiuser DOS secured FAT12',
  0xd4 => 'Old Multiuser DOS secured FAT16 <32M',
  0xd5 => 'Old Multiuser DOS secured extended partition',
  0xd6 => 'Old Multiuser DOS secured FAT16 >=32M',
  0xd8 => 'CP/M-86',
  0xdb => 'Digital Research CP/M, Concurrent CP/M, Concurrent DOS / CTOS (Convergent Technologies OS -Unisys) / KDG Telemetry SCPU boot',
  0xdd => 'Hidden CTOS Memdump?',
  0xe1 => 'DOS access or SpeedStor 12-bit FAT extended partition',
  0xe3 => 'DOS R/O or SpeedStor',
  0xe4 => 'SpeedStor 16-bit FAT extended partition < 1024 cyl.',
  0xeb => 'BeOS',
  0xee => 'EFI GPT',
  0xef => 'EFI (FAT-12/16/32)',
  0xf1 => 'SpeedStor 0xf1',
  0xf2 => 'DOS 3.3+ secondary partition',
  0xf4 => 'SpeedStor large partition / Prologue single-volume partition',
  0xf5 => 'Prologue multi-volume partition',
  0xfd => 'Linux RAID',
  0xfe => 'SpeedStor > 1024 cyl. or LANstep / IBM PS/2 IML (Initial Microcode Load) partition, located at the end of the disk. / Windows NT Disk Administrator hidden partition / Linux Logical Volume Manager partition (old)',
  0xff => 'Xenix Bad Block Table',
);

my %type2fs = (
arch() =~ /^ppc/ ? (
  0x07 => 'hpfs',
) : (
  0x07 => 'ntfs',
),
arch() !~ /sparc/ ? (
  0x01 => 'vfat',
  0x04 => 'vfat',
  0x05 => 'ignore',
  0x06 => 'vfat',
) : (
  0x01 => 'ufs',
  0x02 => 'ufs',
  0x04 => 'ufs',
  0x06 => 'ufs',
  0x07 => 'ufs',
  0x08 => 'ufs',
),
  0x0b => 'vfat',
  0x0c => 'vfat',
  0x0e => 'vfat',
  0x1b => 'vfat',
  0x1c => 'vfat',
  0x1e => 'vfat',
  0x82 => 'swap',
  0x83 => 'ext2',
  0xeb => 'befs',
  0xef => 'vfat',
  0x107 => 'ntfs',
  0x183 => 'reiserfs',
  0x283 => 'xfs',
  0x383 => 'jfs',
  0x483 => 'ext3',
  0x401 => 'apple',
  0x402 => 'hfs',
);

my %types_rev = reverse %types;
my %fs2type = reverse %type2fs;


1;

sub important_types() { 
    my @l = (@important_types, if_($::expert, @important_types2, sort values %types));
    difference2(\@l, \@bad_types);
}

sub type2fs {
    my ($part, $o_default) = @_;
    my $type = $part->{type};
    $type2fs{$type} || $type =~ /^(\d+)$/ && $o_default || $type;
}
sub fs2type { $fs2type{$_[0]} || $_[0] }
sub type2name { $types{$_[0]} || $_[0] }
sub name2type { 
    local ($_) = @_;
    /0x(.*)/ ? hex $1 : $types_rev{$_} || $_;
}

sub isEfi { arch() =~ /ia64/ && $_[0]{type} == 0xef }
sub isWholedisk { arch() =~ /^sparc/ && $_[0]{type} == 5 }
sub isExtended { arch() !~ /^sparc/ && ($_[0]{type} == 5 || $_[0]{type} == 0xf || $_[0]{type} == 0x85) }
sub isRawLVM { $_[0]{type} == 0x8e }
sub isRawRAID { $_[0]{type} == 0xfd }
sub isSwap { type2fs($_[0]) eq 'swap' }
sub isExt2 { type2fs($_[0]) eq 'ext2' }
sub isDos { arch() !~ /^sparc/ && ${{ 1 => 1, 4 => 1, 6 => 1 }}{$_[0]{type}} }
sub isWin { ${{ 0xb => 1, 0xc => 1, 0xe => 1, 0x1b => 1, 0x1c => 1, 0x1e => 1 }}{$_[0]{type}} }
sub isFat { isDos($_[0]) || isWin($_[0]) }
sub isFat_or_NTFS { isDos($_[0]) || isWin($_[0]) || $_[0]{type} == 0x107 }
sub isSunOS { arch() =~ /sparc/ && ${{ 0x1 => 1, 0x2 => 1, 0x4 => 1, 0x6 => 1, 0x7 => 1, 0x8 => 1 }}{$_[0]{type}} }
sub isApple { type2fs($_[0]) eq 'apple' && defined $_[0]{isDriver} }
sub isAppleBootstrap { type2fs($_[0]) eq 'apple' && defined $_[0]{isBoot} }
sub isHiddenMacPart { defined $_[0]{isMap} }

sub isThisFs { type2fs($_[1]) eq $_[0] }
sub isTrueFS { member(type2fs($_[0]), qw(ext2 reiserfs xfs jfs ext3)) }

sub isOtherAvailableFS { isEfi($_[0]) || isFat_or_NTFS($_[0]) || isSunOS($_[0]) || isThisFs('hfs', $_[0]) } #- other OS that linux can access its filesystem
sub isMountableRW { (isTrueFS($_[0]) || isOtherAvailableFS($_[0])) && !isThisFs('ntfs', $_[0]) }
sub isNonMountable { 
    my ($part) = @_;
    isRawRAID($part) || isRawLVM($part) || isThisFs("ntfs", $part) && !$part->{isFormatted} && $part->{notFormatted};
}

sub isPartOfLVM { defined $_[0]{lvm} }
sub isPartOfRAID { defined $_[0]{raid} }
sub isPartOfLoopback { defined $_[0]{loopback} }
sub isRAID { $_[0]{device} =~ /^md/ }
sub isUBD { $_[0]{device} =~ /^ubd/ } #- should be always true during an $::uml_install
sub isLVM { $_[0]{VG_name} }
sub isLoopback { defined $_[0]{loopback_file} }
sub isMounted { $_[0]{isMounted} }
sub isBusy { isMounted($_[0]) || isPartOfRAID($_[0]) || isPartOfLVM($_[0]) || isPartOfLoopback($_[0]) }
sub isSpecial { isRAID($_[0]) || isLVM($_[0]) || isLoopback($_[0]) || isUBD($_[0]) }
sub maybeFormatted { $_[0]{isFormatted} || !$_[0]{notFormatted} }


#- works for both hard drives and partitions ;p
sub description {
    my ($hd) = @_;
    my $win = $hd->{device_windobe};

    sprintf "%s%s (%s%s%s%s)", 
      $hd->{device}, 
      $win && " [$win:]", 
      formatXiB($hd->{totalsectors} || $hd->{size}, 512),
      $hd->{info} && ", $hd->{info}",
      $hd->{mntpoint} && ", " . $hd->{mntpoint},
      $hd->{type} && ", " . type2name($hd->{type});
}

sub isPrimary {
    my ($part, $hd) = @_;
    foreach (@{$hd->{primary}{raw}}) { $part eq $_ and return 1 }
    0;
}

sub adjustStartAndEnd {
    my ($hd, $part) = @_;

    $hd->adjustStart($part);
    $hd->adjustEnd($part);
}

sub verifyNotOverlap {
    my ($a, $b) = @_;
    $a->{start} + $a->{size} <= $b->{start} || $b->{start} + $b->{size} <= $a->{start};
}
sub verifyInside {
    my ($a, $b) = @_;
    $b->{start} <= $a->{start} && $a->{start} + $a->{size} <= $b->{start} + $b->{size};
}

sub verifyParts_ {
    foreach my $i (@_) {
	foreach (@_) {
	    next if !$i || !$_ || $i == $_ || isWholedisk($i) || isExtended($i); #- avoid testing twice for simplicity :-)
	    if (isWholedisk($_)) {
		verifyInside($i, $_) or
		  cdie sprintf("partition sector #$i->{start} (%s) is not inside whole disk (%s)!",
			       formatXiB($i->{size}, 512), formatXiB($_->{size}, 512));
	    } elsif (isExtended($_)) {
		verifyNotOverlap($i, $_) or
		  log::l(sprintf("warning partition sector #$i->{start} (%s) is overlapping with extended partition!",
				 formatXiB($i->{size}, 512))); #- only warning for this one is acceptable
	    } else {
		verifyNotOverlap($i, $_) or
		  cdie sprintf("partitions sector #$i->{start} (%s) and sector #$_->{start} (%s) are overlapping!",
			       formatXiB($i->{size}, 512), formatXiB($_->{size}, 512));
	    }
	}
    }
}
sub verifyParts {
    my ($hd) = @_;
    verifyParts_(get_normal_parts($hd));
}
sub verifyPrimary {
    my ($pt) = @_;
    $_->{start} > 0 || arch() =~ /^sparc/ || die "partition must NOT start at sector 0" foreach @{$pt->{normal}};
    verifyParts_(@{$pt->{normal}}, $pt->{extended});
}

sub assign_device_numbers {
    my ($hd) = @_;

    my $i = 1;
    my $start = 1; 
    
    #- on PPC we need to assign device numbers to the holes too - big FUN!
    #- not if it's an IBM machine using a DOS partition table though
    if (arch() =~ /ppc/ && detect_devices::get_mac_model() !~ /^IBM/) {
	#- first sort the normal parts
	$hd->{primary}{normal} = [ sort { $a->{start} <=> $b->{start} } @{$hd->{primary}{normal}} ];
    
	#- now loop through them, assigning partition numbers - reserve one for the holes
	foreach (@{$hd->{primary}{normal}}) {
	    if ($_->{start} > $start) {
		log::l("PPC: found a hole on $hd->{prefix} before $_->{start}, skipping device..."); 
		$i++;
	    }
	    $_->{device} = $hd->{prefix} . $i;
	    $_->{devfs_device} = $hd->{devfs_prefix} . '/part' . $i;
	    $start = $_->{start} + $_->{size};
	    $i++;
	}
    } else {
	foreach (@{$hd->{primary}{raw}}) {
	    $_->{device} = $hd->{prefix} . $i;
	    $_->{devfs_device} = $hd->{devfs_prefix} . '/part' . $i;
	    $i++;
	}
	foreach (map { $_->{normal} } @{$hd->{extended} || []}) {
	    my $dev = $hd->{prefix} . $i;
	    push @{$hd->{partitionsRenumbered}}, [ $_->{device}, $dev ] if $_->{device} && $dev ne $_->{device};
	    $_->{device} = $dev;
	    $_->{devfs_device} = $hd->{devfs_prefix} . '/part' . $i;
	    $i++;
	}
    }

    #- try to figure what the windobe drive letter could be!
    #
    #- first verify there's at least one primary dos partition, otherwise it
    #- means it is a secondary disk and all will be false :(
    #-
    #- isFat_or_NTFS isn't true for 0x7 partitions, only for 0x107.
    #- alas 0x107 is not set correctly at this stage
    #- solution: don't bother with 0x7 vs 0x107 here
    my ($c, @others) = grep { isFat_or_NTFS($_) || $_->{type} == 0x7 } @{$hd->{primary}{normal}};

    $i = ord 'C';
    $c->{device_windobe} = chr($i++) if $c;
    $_->{device_windobe} = chr($i++) foreach grep { isFat_or_NTFS($_) || $_->{type} == 0x7 } map { $_->{normal} } @{$hd->{extended}};
    $_->{device_windobe} = chr($i++) foreach @others;
}

sub remove_empty_extended {
    my ($hd) = @_;
    my $last = $hd->{primary}{extended} or return;
    @{$hd->{extended}} = grep {
	if ($_->{normal}) {
	    $last = $_;
	} else {
	    %{$last->{extended}} = $_->{extended} ? %{$_->{extended}} : ();
	}
	$_->{normal};
    } @{$hd->{extended}};
    adjust_main_extended($hd);
}

sub adjust_main_extended {
    my ($hd) = @_;

    if (!is_empty_array_ref $hd->{extended}) {
	my ($l, @l) = @{$hd->{extended}};

	# the first is a special case, must recompute its real size
	my $start = round_down($l->{normal}{start} - 1, $hd->{geom}{sectors});
	my $end = $l->{normal}{start} + $l->{normal}{size};
	my $only_linux = 1; my $has_win_lba = 0;
	foreach (map { $_->{normal} } $l, @l) {
	    $start = min($start, $_->{start});
	    $end = max($end, $_->{start} + $_->{size});
	    $only_linux &&= isTrueFS($_) || isSwap($_);
	    $has_win_lba ||= $_->{type} == 0xc || $_->{type} == 0xe;
	}
	$l->{start} = $hd->{primary}{extended}{start} = $start;
	$l->{size} = $hd->{primary}{extended}{size} = $end - $start;
    }
    if (!@{$hd->{extended} || []} && $hd->{primary}{extended}) {
	%{$hd->{primary}{extended}} = (); #- modify the raw entry
	delete $hd->{primary}{extended};
    }
    verifyParts($hd); #- verify everything is all right
}

sub adjust_local_extended {
    my ($hd, $part) = @_;

    my $extended = find { $_->{normal} == $part } @{$hd->{extended} || []} or return;
    $extended->{size} = $part->{size} + $part->{start} - $extended->{start};

    #- must write it there too because values are not shared
    my $prev = find { $_->{extended}{start} == $extended->{start} } @{$hd->{extended} || []} or return;
    $prev->{extended}{size} = $part->{size} + $part->{start} - $prev->{extended}{start};
}

sub get_normal_parts {
    my ($hd) = @_;

    @{$hd->{primary}{normal} || []}, map { $_->{normal} } @{$hd->{extended} || []}
}

sub get_normal_parts_and_holes {
    my ($hd) = @_;
    my ($start, $last) = ($hd->first_usable_sector, $hd->last_usable_sector);

    ref($hd) or print("get_normal_parts_and_holes: bad hd" . backtrace(), "\n");

    my @l = map {
	my $current = $start;
	$start = $_->{start} + $_->{size};
	my $hole = { start => $current, size => $_->{start} - $current, type => 0, rootDevice => $hd->{device} };
	$hole, $_;
    } sort { $a->{start} <=> $b->{start} } grep { !isWholedisk($_) } get_normal_parts($hd);

    push @l, { start => $start, size => $last - $start, type => 0, rootDevice => $hd->{device} };
    grep { $_->{type} || $_->{size} >= $hd->cylinder_size } @l;
}

sub read_one($$) {
    my ($hd, $sector) = @_;
    my ($pt, $info);

    #- it can be safely considered that the first sector is used to probe the partition table
    #- but other sectors (typically for extended partition ones) have to match this type!
    if (!$sector) {
	my @parttype = (
	  if_(arch() =~ /^ia64/, 'gpt'),
	  arch() =~ /^sparc/ ? ('sun', 'bsd') : ('dos', 'bsd', 'sun', 'mac'),
	);
	foreach ('empty', @parttype, 'lvm_PV', 'unknown') {
	    /unknown/ and die "unknown partition table format on disk " . $hd->{file};
	    eval {
		# perl_checker: require partition_table::bsd
		# perl_checker: require partition_table::dos
		# perl_checker: require partition_table::empty
		# perl_checker: require partition_table::gpt
		# perl_checker: require partition_table::lvm_PV
		# perl_checker: require partition_table::mac
		# perl_checker: require partition_table::sun
		require "partition_table/$_.pm";
		bless $hd, "partition_table::$_";
		($pt, $info) = $hd->read($sector);
		log::l("found a $_ partition table on $hd->{file} at sector $sector");
	    };
	    $@ or last;
	}
    } else {
	#- keep current blessed object for that, this means it is neccessary to read sector 0 before.
	($pt, $info) = $hd->read($sector);
    }

    my @extended = $hd->hasExtended ? grep { isExtended($_) } @$pt : ();
    my @normal = grep { $_->{size} && $_->{type} && !isExtended($_) } @$pt;
    my $nb_special_empty = int(grep { $_->{size} && $_->{type} == 0 } @$pt);

    @extended > 1 and die "more than one extended partition";

    $_->{rootDevice} = $hd->{device} foreach @normal, @extended;
    { raw => $pt, extended => $extended[0], normal => \@normal, info => $info, nb_special_empty => $nb_special_empty };
}

sub read {
    my ($hd) = @_;
    my $pt = read_one($hd, 0) or return 0;
    $hd->{primary} = $pt;
    undef $hd->{extended};
    verifyPrimary($pt);
    eval {
	my $need_removing_empty_extended;
	$pt->{extended} and read_extended($hd, $pt->{extended}, \$need_removing_empty_extended) || return 0;

	if ($need_removing_empty_extended) {
	    #- special case when hda5 is empty, it must be skipped
	    #- (windows XP generates such partition tables)
	    remove_empty_extended($hd); #- includes adjust_main_extended
	}
	
    }; 
    die "extended partition: $@" if $@;

    assign_device_numbers($hd);
    remove_empty_extended($hd);
    1;
}

sub read_extended {
    my ($hd, $extended, $need_removing_empty_extended) = @_;

    my $pt = read_one($hd, $extended->{start}) or return 0;
    $pt = { %$extended, %$pt };

    push @{$hd->{extended}}, $pt;
    @{$hd->{extended}} > 100 and die "oops, seems like we're looping here :(  (or you have more than 100 extended partitions!)";

    if (@{$pt->{normal}} == 0) {
	$$need_removing_empty_extended = 1;
	delete $pt->{normal};
	print "need_removing_empty_extended\n";
    } elsif (@{$pt->{normal}} > 1) {
	die "more than one normal partition in extended partition";
    } else {
	$pt->{normal} = $pt->{normal}[0];
	#- in case of extended partitions, the start sector is local to the partition or to the first extended_part!
	$pt->{normal}{start} += $pt->{start};

	#- the following verification can broke an existing partition table that is
	#- correctly read by fdisk or cfdisk. maybe the extended partition can be
	#- recomputed to get correct size.
	if (!verifyInside($pt->{normal}, $extended)) {
	    $extended->{size} = $pt->{normal}{start} + $pt->{normal}{size};
	    verifyInside($pt->{normal}, $extended) or die "partition $pt->{normal}{device} is not inside its extended partition";
	}
    }

    if ($pt->{extended}) {
	$pt->{extended}{start} += $hd->{primary}{extended}{start};
	return read_extended($hd, $pt->{extended}, $need_removing_empty_extended);
    } else {
	1;
    }
}

# write the partition table
sub write {
    my ($hd) = @_;
    $hd->{isDirty} or return;
    $hd->{readonly} and die "a read-only partition table should not be dirty!";

    #- set first primary partition active if no primary partitions are marked as active.
    if (my @l = @{$hd->{primary}{raw}}) {
	foreach (@l) { 
	    $_->{local_start} = $_->{start}; 
	    $_->{active} ||= 0;
	}
	$l[0]{active} = 0x80 if !any { $_->{active} } @l;
    }

    #- last chance for verification, this make sure if an error is detected,
    #- it will never be writed back on partition table.
    verifyParts($hd);

    $hd->write(0, $hd->{primary}{raw}, $hd->{primary}{info}) or die "writing of partition table failed";

    #- should be fixed but a extended exist with no real extended partition, that blanks mbr!
    if (arch() !~ /^sparc/) {
	foreach (@{$hd->{extended}}) {
	    # in case of extended partitions, the start sector must be local to the partition
	    $_->{normal}{local_start} = $_->{normal}{start} - $_->{start};
	    $_->{extended} and $_->{extended}{local_start} = $_->{extended}{start} - $hd->{primary}{extended}{start};

	    $hd->write($_->{start}, $_->{raw}) or die "writing of partition table failed";
	}
    }
    $hd->{isDirty} = 0;
    $hd->{hasBeenDirty} = 1; #- used in undo (to know if undo should believe isDirty or not)

    if ($hd->{needKernelReread} && ref($hd->{needKernelReread}) eq 'ARRAY' && $::isStandalone) {
	#- we've only been adding partitions. Try special add_partition (using BLKPG_ADD_PARTITION)
	my $F = partition_table::raw::openit($hd) or goto force_reread;

	foreach (@{$hd->{needKernelReread}}) {
	    c::add_partition(fileno $F, $_->{start}, $_->{size}, $_->{device} =~ /(\d+)$/)
		or goto force_reread;
	}
    } elsif ($hd->{needKernelReread}) {
      force_reread:
	#- now sync disk and re-read the partition table
	common::sync();

	my @magic_parts = grep { $_->{isMounted} && $_->{real_mntpoint} } get_normal_parts($hd);
	foreach (@magic_parts) {
	    syscall_('umount', $_->{real_mntpoint}) or log::l(N("error unmounting %s: %s", $_->{real_mntpoint}, $!));
	}
	$hd->kernel_read;
	foreach (@magic_parts) {
	    syscall_('mount', $_->{real_mntpoint}, type2fs($_), c::MS_MGC_VAL()) or log::l(N("mount failed: ") . $!);
	}
    }
    $hd->{needKernelReread} = 0;
}

sub active {
    my ($hd, $part) = @_;

    $_->{active} = 0 foreach @{$hd->{primary}{normal}};
    $part->{active} = 0x80;
    $hd->{isDirty} = 1;
}


# remove a normal partition from hard drive hd
sub remove {
    my ($hd, $part) = @_;
    my $i;

    #- first search it in the primary partitions
    $i = 0; foreach (@{$hd->{primary}{normal}}) {
	if ($_ eq $part) {
	    splice(@{$hd->{primary}{normal}}, $i, 1);
	    %$_ = (); #- blank it

	    $hd->raw_removed($hd->{primary}{raw});
	    return $hd->{isDirty} = $hd->{needKernelReread} = 1;
	}
	$i++;
    }

    my ($first, $second, $third) = map { $_->{normal} } @{$hd->{extended} || []};
    if ($third && $first eq $part) {
	die "Can't handle removing hda5 when hda6 is not the second partition" if $second->{start} > $third->{start};
    }      

    #- otherwise search it in extended partitions
    foreach (@{$hd->{extended} || []}) {
	$_->{normal} eq $part or next;

	delete $_->{normal}; #- remove it
	remove_empty_extended($hd);
	assign_device_numbers($hd);

	return $hd->{isDirty} = $hd->{needKernelReread} = 1;
    }
    0;
}

# create of partition at starting at `start', of size `size' and of type `type' (nice comment, uh?)
sub add_primary {
    my ($hd, $part) = @_;

    {
	local $hd->{primary}{normal}; #- save it to fake an addition of $part, that way add_primary do not modify $hd if it fails
	push @{$hd->{primary}{normal}}, $part;
	adjust_main_extended($hd); #- verify
	$hd->raw_add($hd->{primary}{raw}, $part);
    }
    push @{$hd->{primary}{normal}}, $part; #- really do it
}

sub add_extended {
    arch() =~ /^sparc|ppc/ and die \N("Extended partition not supported on this platform");

    my ($hd, $part, $extended_type) = @_;
    $extended_type =~ s/Extended_?//;

    my $e = $hd->{primary}{extended};

    if ($e && !verifyInside($part, $e)) {
	#-die "sorry, can't add outside the main extended partition" unless $::unsafe;
	my $end = $e->{start} + $e->{size};
	my $start = min($e->{start}, $part->{start});
	$end = max($end, $part->{start} + $part->{size}) - $start;

	{ #- faking a resizing of the main extended partition to test for problems
	    local $e->{start} = $start;
	    local $e->{size} = $end - $start;
	    eval { verifyPrimary($hd->{primary}) };
	    $@ and die
N("You have a hole in your partition table but I can't use it.
The only solution is to move your primary partitions to have the hole next to the extended partitions.");
	}
    }

    if ($e && $part->{start} < $e->{start}) {
	my $l = first(@{$hd->{extended}});

	#- the first is a special case, must recompute its real size
	$l->{start} = round_down($l->{normal}{start} - 1, $hd->cylinder_size);
	$l->{size} = $l->{normal}{start} + $l->{normal}{size} - $l->{start};
	my $ext = { %$l };
	unshift @{$hd->{extended}}, { type => 5, raw => [ $part, $ext, {}, {} ], normal => $part, extended => $ext };
	#- size will be autocalculated :)
    } else {
	my ($ext, $ext_size) = is_empty_array_ref($hd->{extended}) ?
	  ($hd->{primary}, -1) : #- -1 size will be computed by adjust_main_extended
	  (top(@{$hd->{extended}}), $part->{size});
	my %ext = (type => $extended_type || 5, start => $part->{start}, size => $ext_size);

	$hd->raw_add($ext->{raw}, \%ext);
	$ext->{extended} = \%ext;
	push @{$hd->{extended}}, { %ext, raw => [ $part, {}, {}, {} ], normal => $part };
    }
    $part->{start}++; $part->{size}--; #- let it start after the extended partition sector
    adjustStartAndEnd($hd, $part);

    adjust_main_extended($hd);
}

sub add {
    my ($hd, $part, $b_primaryOrExtended, $b_forceNoAdjust) = @_;

    get_normal_parts($hd) >= ($hd->{device} =~ /^rd/ ? 7 : $hd->{device} =~ /^(sd|ida|cciss|ataraid)/ ? 15 : 63) and cdie "maximum number of partitions handled by linux reached";

    $part->{notFormatted} = 1;
    $part->{isFormatted} = 0;
    $part->{rootDevice} = $hd->{device};
    $part->{start} ||= 1 if arch() !~ /^sparc/; #- starting at sector 0 is not allowed
    adjustStartAndEnd($hd, $part) unless $b_forceNoAdjust;

    my $nb_primaries = $hd->{device} =~ /^rd/ ? 3 : 1;

    if (arch() =~ /^sparc|ppc/ ||
	$b_primaryOrExtended eq 'Primary' ||
	$b_primaryOrExtended !~ /Extended/ && @{$hd->{primary}{normal} || []} < $nb_primaries) {
	eval { add_primary($hd, $part) };
	goto success if !$@;
    }
    if ($hd->hasExtended) {
	eval { add_extended($hd, $part, $b_primaryOrExtended) };
	goto success if !$@;
    }
    {
	add_primary($hd, $part);
    }
  success:
    assign_device_numbers($hd);
    $hd->{isDirty} = 1;
    push @{$hd->{needKernelReread} ||= []}, $part if !$hd->{needKernelReread} || ref($hd->{needKernelReread}) eq 'ARRAY'
}

# search for the next partition
sub next {
    my ($hd, $part) = @_;

    first(
	  sort { $a->{start} <=> $b->{start} }
	  grep { $_->{start} >= $part->{start} + $part->{size} }
	  get_normal_parts($hd)
	 );
}
sub next_start {
    my ($hd, $part) = @_;
    my $next = &next($hd, $part);
    $next ? $next->{start} : $hd->{totalsectors};
}

sub load {
    my ($hd, $file, $b_force) = @_;

    open(my $F, $file) or die \N("Error reading file %s", $file);

    my $h;
    {
	local $/ = "\0";
	eval <$F>;
    }
    $@ and die \N("Restoring from file %s failed: %s", $file, $@);

    ref($h) eq 'ARRAY' or die \N("Bad backup file");

    my %h; @h{@fields2save} = @$h;

    $h{totalsectors} == $hd->{totalsectors} or $b_force or cdie "bad totalsectors";

    #- unsure we don't modify totalsectors
    local $hd->{totalsectors};

    @$hd{@fields2save} = @$h;

    delete @$_{qw(isMounted isFormatted notFormatted toFormat toFormatUnsure)} foreach get_normal_parts($hd);
    $hd->{isDirty} = $hd->{needKernelReread} = 1;
}

sub save {
    my ($hd, $file) = @_;
    my @h = @$hd{@fields2save};
    require Data::Dumper;
    eval { output($file, Data::Dumper->Dump([\@h], ['$h']), "\0") }
      or die \N("Error writing to file %s", $file);
}
s="hl str">fdformat /dev/fd0\" followed by \"mkfs.vfat\n" "/dev/fd0\"." msgstr "" "Linux\n" " Επόμενο\n" "\n" "\n" "\n" "\n" " Για Προχωρημένους\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" " Επαναφόρτωση\n" "\n" "\n" " Αυτόματο\n" "\n" "\n" "\n" "\n" "\n" " Αποθήκευση\n" "\n" "\n" "\n" "\n" " Linux\n" #: ../help.pm:412 #, fuzzy, c-format msgid "Generate auto-install floppy" msgstr "Δημιουργία δισκέτας αυτόματης εγκατάστασης" #: ../help.pm:405 #, c-format msgid "Replay" msgstr "" #: ../help.pm:405 #, c-format msgid "Automated" msgstr "" #: ../help.pm:405 #, c-format msgid "Save packages selection" msgstr "" #: ../help.pm:408 #, fuzzy, c-format msgid "" "If you chose to reuse some legacy GNU/Linux partitions, you may wish to\n" "reformat some of them and erase any data they contain. To do so, please\n" "select those partitions as well.\n" "\n" "Please note that it's not necessary to reformat all pre-existing\n" "partitions. You must reformat the partitions containing the operating\n" "system (such as \"/\", \"/usr\" or \"/var\") but you do not have to " "reformat\n" "partitions containing data that you wish to keep (typically \"/home\").\n" "\n" "Please be careful when selecting partitions. After the formatting is\n" "completed, all data on the selected partitions will be deleted and you\n" "will not be able to recover it.\n" "\n" "Click on \"%s\" when you're ready to format the partitions.\n" "\n" "Click on \"%s\" if you want to choose another partition for your new\n" "Mageia operating system installation.\n" "\n" "Click on \"%s\" if you wish to select partitions which will be checked for\n" "bad blocks on the disk." msgstr "" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" " Επόμενο\n" "\n" " Προηγούμενο\n" " νέο Linux\n" "\n" " Για Προχωρημένους\n" "." #: ../help.pm:437 #, fuzzy, c-format msgid "" "By the time you install Mageia, it's likely that some packages will\n" "have been updated since the initial release. Bugs may have been fixed,\n" "security issues resolved. To allow you to benefit from these updates,\n" "you're now able to download them from the Internet. Check \"%s\" if you\n" "have a working Internet connection, or \"%s\" if you prefer to install\n" "updated packages later.\n" "\n" "Choosing \"%s\" will display a list of web locations from which updates can\n" "be retrieved. You should choose one near to you. A package-selection tree\n" "will appear: review the selection, and press \"%s\" to retrieve and install\n" "the selected package(s), or \"%s\" to abort." msgstr "" "Linux\n" "\n" "\n" " Διαδίκτυο\n" " Ναι Διαδίκτυο Όχι\n" "\n" "\n" " Ναι\n" "\n" " Εγκατάσταση\n" " Άκυρο." #: ../help.pm:450 #, fuzzy, c-format msgid "" "At this point, DrakX will allow you to choose the security level you desire\n" "for your machine. As a rule of thumb, the security level should be set\n" "higher if the machine is to contain crucial data, or if it's to be directly\n" "exposed to the Internet. The trade-off that a higher security level is\n" "generally obtained at the expense of ease of use.\n" "\n" "If you do not know what to choose, keep the default option. You'll be able\n" "to change it later with the draksec tool, which is part of Mageia\n" "Control Center.\n" "\n" "Fill the \"%s\" field with the e-mail address of the person responsible for\n" "security. Security messages will be sent to that address." msgstr "" "επίπεδο\n" " επίπεδο\n" "\n" " Διαδίκτυο επίπεδο\n" "\n" "\n" "\n" "\n" " εξ' ορισμού." #: ../help.pm:461 #, fuzzy, c-format msgid "Security Administrator" msgstr "Διαχειριστής Ασφαλείας:" #: ../help.pm:464 #, fuzzy, c-format msgid "" "At this point, you need to choose which partition(s) will be used for the\n" "installation of your Mageia system. If partitions have already been\n" "defined, either from a previous installation of GNU/Linux or by another\n" "partitioning tool, you can use existing partitions. Otherwise, hard disk drive\n" "partitions must be defined.\n" "\n" "To create partitions, you must first select a hard disk drive. You can select\n" "the disk for partitioning by clicking on ``hda'' for the first IDE drive,\n" "``hdb'' for the second, ``sda'' for the first SCSI drive and so on.\n" "\n" "To partition the selected hard disk drive, you can use these options:\n" "\n" " * \"%s\": this option deletes all partitions on the selected hard disk drive\n" "\n" " * \"%s\": this option enables you to automatically create ext3 and swap\n" "partitions in the free space of your hard disk drive\n" "\n" "\"%s\": gives access to additional features:\n" "\n" " * \"%s\": saves the partition table to a floppy. Useful for later\n" "partition-table recovery if necessary. It is strongly recommended that you\n" "perform this step.\n" "\n" " * \"%s\": allows you to restore a previously saved partition table from a\n" "floppy disk.\n" "\n" " * \"%s\": if your partition table is damaged, you can try to recover it\n" "using this option. Please be careful and remember that it does not always\n" "work.\n" "\n" " * \"%s\": discards all changes and reloads the partition table that was\n" "originally on the hard disk drive.\n" "\n" " * \"%s\": un-checking this option will force users to manually mount and\n" "unmount removable media such as floppies and CD-ROMs.\n" "\n" " * \"%s\": use this option if you wish to use a wizard to partition your\n" "hard disk drive. This is recommended if you do not have a good understanding of\n" "partitioning.\n" "\n" " * \"%s\": use this option to cancel your changes.\n" "\n" " * \"%s\": allows additional actions on partitions (type, options, format)\n" "and gives more information about the hard disk drive.\n" "\n" " * \"%s\": when you are finished partitioning your hard disk drive, this will\n" "save your changes back to disk.\n" "\n" "When defining the size of a partition, you can finely set the partition\n" "size by using the Arrow keys of your keyboard.\n" "\n" "Note: you can reach any option using the keyboard. Navigate through the\n" "partitions using [Tab] and the [Up/Down] arrows.\n" "\n" "When a partition is selected, you can use:\n" "\n" " * Ctrl-c to create a new partition (when an empty partition is selected)\n" "\n" " * Ctrl-d to delete a partition\n" "\n" " * Ctrl-m to set the mount point\n" "\n" "To get information about the different filesystem types available, please\n" "read the ext2FS chapter from the ``Reference Manual''.\n" "\n" "If you are installing on a PPC machine, you will want to create a small HFS\n" "``bootstrap'' partition of at least 1MB which will be used by the yaboot\n" "bootloader. If you opt to make the partition a bit larger, say 50MB, you\n" "may find it a useful place to store a spare kernel and ramdisk images for\n" "emergency boot situations." msgstr "" "\n" " Linux\n" " Linux\n" "\n" "\n" "\n" "\n" " IDE\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" " Άλλα\n" "\n" " Αποθήκευση\n" "\n" "\n" "\n" " Επαναφορά\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" " μετά βίας\n" "\n" "\n" "\n" " Οδηγός\n" "\n" "\n" "\n" " Αναίρεση\n" "\n" "\n" "\n" "\n" "\n" " Ολοκληρώθηκε\n" "\n" "\n" " Πότε\n" "\n" "\n" "\n" " Ολοκληρώθηκε\n" "\n" " Πότε\n" "\n" " νέο\n" "\n" " Διαγραφή\n" "\n" "\n" "\n" "\n" "\n" "\n" " HFS\n" "\n" "\n" "\n" "." #: ../help.pm:526 #, c-format msgid "Save partition table" msgstr "" #: ../help.pm:526 #, c-format msgid "Restore partition table" msgstr "" #: ../help.pm:526 #, c-format msgid "Rescue partition table" msgstr "" #: ../help.pm:526 #, fuzzy, c-format msgid "Removable media auto-mounting" msgstr "Αυτόματη σύνδεση αποσπώμενων μονάδων" #: ../help.pm:526 #, c-format msgid "Wizard" msgstr "" #: ../help.pm:526 #, c-format msgid "Undo" msgstr "" #: ../help.pm:526 #, fuzzy, c-format msgid "Toggle between normal/expert mode" msgstr "Αλλαγή σε κανονικό τρόπο λειτουργίας" #: ../help.pm:536 #, fuzzy, c-format msgid "" "More than one Microsoft partition has been detected on your hard disk drive.\n" "Please choose the one which you want to resize in order to install your new\n" "Mageia operating system.\n" "\n" "Each partition is listed as follows: \"Linux name\", \"Windows name\"\n" "\"Capacity\".\n" "\n" "\"Linux name\" is structured: \"hard disk drive type\", \"hard disk drive number\",\n" "\"partition number\" (for example, \"hda1\").\n" "\n" "\"Hard disk drive type\" is \"hd\" if your hard dive is an IDE hard disk drive and\n" "\"sd\" if it is a SCSI hard disk drive.\n" "\n" "\"Hard disk drive number\" is always a letter after \"hd\" or \"sd\". With IDE\n" "hard disk drives:\n" "\n" " * \"a\" means \"master hard disk drive on the primary IDE controller\";\n" "\n" " * \"b\" means \"slave hard disk drive on the primary IDE controller\";\n" "\n" " * \"c\" means \"master hard disk drive on the secondary IDE controller\";\n" "\n" " * \"d\" means \"slave hard disk drive on the secondary IDE controller\".\n" "\n" "With SCSI hard disk drives, an \"a\" means \"lowest SCSI ID\", a \"b\" means\n" "\"second lowest SCSI ID\", etc.\n" "\n" "\"Windows name\" is the letter of your hard disk drive under Windows (the first\n" "disk or partition is called \"C:\")." msgstr "" "Περισσότερες των μία κατατμήσεις Windows βρέθηκαν στον δίσκο σας. Παρακαλώ \n" "επιλέξτε ποια θέλετε να συρρικνώσετε για να εγκαταστήσετε το Mandriva " "Linux.\n" "\n" "Κάθε κατάτμηση αναφέρεται ως: \"Όνομα Linux\", \"Όνομα Windows\"\n" "\"Χωρητικότητα\".\n" "\n" "Το όνομα Linux σημαίνει τα εξής: \"Τύπος δίσκου\",\"αριθμός δίσκου\",\n" "\"αριθμός κατάτμησης για παράδειγμα, \"hda1\").\n" "\n" \"Τύπος δίσκου\" είναι \"hd\" εάν πρόκειται για δίσκο IDE και \"sd\" \n" "για SCSI δίσκο.\n" "\n" \" αριθμός δίσκου\"είναι πάντα ένα γράμμα μετά το \"hd\" ή \"sd\". Για\n" "τους IDE δίσκους: \n" "\n" " * \"a\" είναι ο \"master δίσκος στον πρώτο ελεγκτή IDE\",\n" "\n" " * \"b\" είναι ο \"slave δίσκος στον πρώτο ελεγκτή IDE\",\n" "\n" " * \"c\" είναι ο \"master δίσκος στον δεύτερο ελεγκτή IDE\",\n" "\n" " * \"d\" είναι ο \"slave δίσκος στον δεύτερο ελεγκτή IDE\".\n" "\n" "Για δίσκους SCSI, \"a\" είναι ο πρώτος δίσκος, \"b\" είναι ο δεύτερος " "δίσκος\n" " κλπ...\n" "\n" "Το \"Όνομα Windows\" είναι το γράμμα της κατάτμησης όπως φαίνεται από τα\n" "Windows (ο πρώτος δίσκος ή κατάτμηση λέγεται \"C:\")." #: ../help.pm:567 #, fuzzy, c-format msgid "" "\"%s\": check the current country selection. If you're not in this country,\n" "click on the \"%s\" button and choose another. If your country is not in " "the\n" "list shown, click on the \"%s\" button to get the complete country list." msgstr "" "\"Χώρα\": ελέγξτε την επιλογή χώρας. Αν δεν είστε σε αυτή τη χώρα,\n" "κάντε κλικ στο πλήκτρο και επιλέξτε μια άλλη." #: ../help.pm:572 #, fuzzy, c-format msgid "" "This step is activated only if an existing GNU/Linux partition has been\n" "found on your machine.\n" "\n" "DrakX now needs to know if you want to perform a new installation or an\n" "upgrade of an existing Mageia system:\n" "\n" " * \"%s\". For the most part, this completely wipes out the old system.\n" "However, depending on your partitioning scheme, you can prevent some of\n" "your existing data (notably \"home\" directories) from being over-written.\n" "If you wish to change how your hard disk drives are partitioned, or to change\n" "the filesystem, you should use this option.\n" "\n" " * \"%s\". This installation class allows you to update the packages\n" "currently installed on your Mageia system. Your current partitioning\n" "scheme and user data will not be altered. Most of the other configuration\n" "steps remain available and are similar to a standard installation.\n" "\n" "Using the ``Upgrade'' option should work fine on Mageia systems\n" "running version \"8.1\" or later. Performing an upgrade on versions prior\n" "to Mageia version \"8.1\" is not recommended." msgstr "" "ενεργοποίηση τώρα Linux\n" "\n" "\n" " νέο\n" " Linux\n" "\n" " Εγκατάσταση\n" "\n" "\n" "\n" "\n" "\n" " Αναβάθμιση\n" " Linux\n" " χρήστης\n" "\n" "\n" " Αναβάθμιση Linux\n" " εκτελείται Αναβάθμιση\n" " Linux." #: ../help.pm:594 #, fuzzy, c-format msgid "" "Depending on the language you chose (), DrakX will automatically select a\n" "particular type of keyboard configuration. Check that the selection suits\n" "you or choose another keyboard layout.\n" "\n" "Also, you may not have a keyboard which corresponds exactly to your\n" "language: for example, if you are an English-speaking Swiss native, you may\n" "have a Swiss keyboard. Or if you speak English and are located in Quebec,\n" "you may find yourself in the same situation where your native language and\n" "country-set keyboard do not match. In either case, this installation step\n" "will allow you to select an appropriate keyboard from a list.\n" "\n" "Click on the \"%s\" button to be shown a list of supported keyboards.\n" "\n" "If you choose a keyboard layout based on a non-Latin alphabet, the next\n" "dialog will allow you to choose the key binding which will switch the\n" "keyboard between the Latin and non-Latin layouts." msgstr "" "εξ' ορισμού\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" " Άλλα\n" "\n" "\n" "\n" "\n" "." #: ../help.pm:612 #, fuzzy, c-format msgid "" "The first step is to choose your preferred language.\n" "\n" "Your choice of preferred language will affect the installer, the\n" "documentation, and the system in general. First select the region you're\n" "located in, then the language you speak.\n" "\n" "Clicking on the \"%s\" button will allow you to select other languages to\n" "be installed on your workstation, thereby installing the language-specific\n" "files for system documentation and applications. For example, if Spanish\n" "users are to use your machine, select English as the default language in\n" "the tree view and \"%s\" in the Advanced section.\n" "\n" "About UTF-8 (unicode) support: Unicode is a new character encoding meant to\n" "cover all existing languages. However full support for it in GNU/Linux is\n" "still under development. For that reason, Mageia's use of UTF-8 will\n" "depend on the user's choices:\n" "\n" " * If you choose a language with a strong legacy encoding (latin1\n" "languages, Russian, Japanese, Chinese, Korean, Thai, Greek, Turkish, most\n" "iso-8859-2 languages), the legacy encoding will be used by default;\n" "\n" " * Other languages will use unicode by default;\n" "\n" " * If two or more languages are required, and those languages are not using\n" "the same encoding, then unicode will be used for the whole system;\n" "\n" " * Finally, unicode can also be forced for use throughout the system at a\n" "user's request by selecting the \"%s\" option independently of which\n" "languages were been chosen.\n" "\n" "Note that you're not limited to choosing a single additional language. You\n" "may choose several, or even install them all by selecting the \"%s\" box.\n" "Selecting support for a language means translations, fonts, spell checkers,\n" "etc. will also be installed for that language.\n" "\n" "To switch between the various languages installed on your system, you can\n" "launch the \"localedrake\" command as \"root\" to change the language used\n" "by the entire system. Running the command as a regular user will only\n" "change the language settings for that particular user." msgstr "" "\n" "\n" "\n" "\n" " Για Προχωρημένους\n" "\n" "\n" " Ισπανία\n" " εξ' ορισμού Για Προχωρημένους\n" "\n" "\n" "\n" " Επόμενο\n" "\n" "\n" "\n" "\n" " χρήστης\n" " χρήστης." #: ../help.pm:650 #, c-format msgid "Espanol" msgstr "" #: ../help.pm:643 #, c-format msgid "Use Unicode by default" msgstr "" #: ../help.pm:646 #, fuzzy, c-format msgid "" "Usually, DrakX has no problems detecting the number of buttons on your\n" "mouse. If it does, it assumes you have a two-button mouse and will\n" "configure it for third-button emulation. The third-button mouse button of a\n" "two-button mouse can be obtained by simultaneously clicking the left and\n" "right mouse buttons. DrakX will automatically know whether your mouse uses\n" "a PS/2, serial or USB interface.\n" "\n" "If you have a 3-button mouse without a wheel, you can choose a \"%s\"\n" "mouse. DrakX will then configure your mouse so that you can simulate the\n" "wheel with it: to do so, press the middle button and move your mouse\n" "pointer up and down.\n" "\n" "If for some reason you wish to specify a different type of mouse, select it\n" "from the list provided.\n" "\n" "You can select the \"%s\" entry to chose a ``generic'' mouse type which\n" "will work with nearly all mice.\n" "\n" "If you choose a mouse other than the default one, a test screen will be\n" "displayed. Use the buttons and wheel to verify that the settings are\n" "correct and that the mouse is working correctly. If the mouse is not\n" "working well, press the space bar or [Return] key to cancel the test and\n" "you will be returned to the mouse list.\n" "\n" "Occasionally wheel mice are not detected automatically, so you will need to\n" "select your mouse from a list. Be sure to select the one corresponding to\n" "the port that your mouse is attached to. After selecting a mouse and\n" "pressing the \"%s\" button, a mouse image will be displayed on-screen.\n" "Scroll the mouse wheel to ensure that it is activating correctly. As you\n" "scroll your mouse wheel, you will see the on-screen scroll wheel moving.\n" "Test the buttons and check that the mouse pointer moves on-screen as you\n" "move your mouse about." msgstr "" "\n" "\n" "\n" "\n" "\n" " σειριακό\n" "\n" "\n" "\n" "\n" " εξ' ορισμού\n" "\n" "\n" "\n" "\n" "\n" " Με ροδάκι ανιχνεύθηκε\n" "\n" "\n" " Επόμενο\n" " ενεργοποίηση τώρα\n" "\n" "\n" "." #: ../help.pm:684 #, fuzzy, c-format msgid "with Wheel emulation" msgstr "Προσομοίωση Κουμπιών" #: ../help.pm:684 #, c-format msgid "Universal | Any PS/2 & USB mice" msgstr "" #: ../help.pm:687 #, c-format msgid "" "Please select the correct port. For example, the \"COM1\" port under\n" "Windows is named \"ttyS0\" under GNU/Linux." msgstr "" "Παρακαλώ επιλέξτε την κατάλληλη θύρα. Για παράδειγμα,\n" \"COM1\" στα Windows ονομάζεται \"ttyS0\" στο GNU/Linux." #: ../help.pm:684 #, c-format msgid "" "A boot loader is a little program which is started by the computer at boot\n" "time. It's responsible for starting up the whole system. Normally, the boot\n" "loader installation is totally automated. DrakX will analyze the disk boot\n" "sector and act according to what it finds there:\n" "\n" " * if a Windows boot sector is found, it will replace it with a GRUB/LILO\n" "boot sector. This way you'll be able to load either GNU/Linux or any other\n" "OS installed on your machine.\n" "\n" " * if a GRUB or LILO boot sector is found, it'll replace it with a new one.\n" "\n" "If DrakX cannot determine where to place the boot sector, it'll ask you\n" "where it should place it. Generally, the \"%s\" is the safest place.\n" "Choosing \"%s\" will not install any boot loader. Use this option only if " "you\n" "know what you're doing." msgstr "" #: ../help.pm:745 #, fuzzy, c-format msgid "" "Now, it's time to select a printing system for your computer. Other\n" "operating systems may offer you one, but Mageia offers two. Each of\n" "the printing systems is best suited to particular types of configuration.\n" "\n" " * \"%s\" -- which is an acronym for ``print, do not queue'', is the choice\n" "if you have a direct connection to your printer, you want to be able to\n" "panic out of printer jams, and you do not have networked printers. (\"%s\"\n" "will handle only very simple network cases and is somewhat slow when used\n" "within networks.) It's recommended that you use \"pdq\" if this is your\n" "first experience with GNU/Linux.\n" "\n" " * \"%s\" stands for `` Common Unix Printing System'' and is an excellent\n" "choice for printing to your local printer or to one halfway around the\n" "planet. It's simple to configure and can act as a server or a client for\n" "the ancient \"lpd\" printing system, so it's compatible with older\n" "operating systems which may still need print services. While quite\n" "powerful, the basic setup is almost as easy as \"pdq\". If you need to\n" "emulate a \"lpd\" server, make sure you turn on the \"cups-lpd\" daemon.\n" "\"%s\" includes graphical front-ends for printing or choosing printer\n" "options and for managing the printer.\n" "\n" "If you make a choice now, and later find that you do not like your printing\n" "system you may change it by running PrinterDrake from the Mageia\n" "Control Center and clicking on the \"%s\" button." msgstr "" "Άλλο\n" " Linux\n" "\n" "\n" "\n" "\n" "\n" " απλό\n" "\n" " Linux\n" "\n" " CUPS Εκτύπωση Σύστημα\n" "\n" " απλό εξυπηρετητής\n" "\n" "\n" " εξυπηρετητής\n" " CUPS\n" "\n" "\n" "\n" "\n" " εκτελείται\n" "." #: ../help.pm:768 #, c-format msgid "pdq" msgstr "" #: ../help.pm:724 #, c-format msgid "CUPS" msgstr "" #: ../help.pm:724 #, c-format msgid "Expert" msgstr "Εξπέρ" #: ../help.pm:771 #, fuzzy, c-format msgid "" "DrakX will first detect any IDE devices present in your computer. It will\n" "also scan for one or more PCI SCSI cards on your system. If a SCSI card is\n" "found, DrakX will automatically install the appropriate driver.\n" "\n" "Because hardware detection is not foolproof, DrakX may fail in detecting\n" "your hard disk drives. If so, you'll have to specify your hardware by hand.\n" "\n" "If you had to manually specify your PCI SCSI adapter, DrakX will ask if you\n" "want to configure options for it. You should allow DrakX to probe the\n" "hardware for the card-specific options which are needed to initialize the\n" "adapter. Most of the time, DrakX will get through this step without any\n" "issues.\n" "\n" "If DrakX is not able to probe for the options to automatically determine\n" "which parameters need to be passed to the hardware, you'll need to manually\n" "configure the driver." msgstr "" "IDE\n" " PCI\n" "\n" "\n" "\n" " PCI Ναι\n" " Όχι\n" "\n" " ανιχνεύθηκε\n" " Επόμενο Επόμενο\n" "\n" "\n" " PCI\n" "\n" "\n" "\n" "\n" "\n" "\n" "\n" "." #: ../help.pm:789 #, fuzzy, c-format msgid "" "\"%s\": if a sound card is detected on your system, it'll be displayed\n" "here. If you notice the sound card is not the one actually present on your\n" "system, you can click on the button and choose a different driver." msgstr "" "ανιχνεύθηκε\n" "\n" "\n" "." #: ../help.pm:794 #, c-format msgid "" "As a review, DrakX will present a summary of information it has gathered\n" "about your system. Depending on the hardware installed on your machine, you\n" "may have some or all of the following entries. Each entry is made up of the\n" "hardware item to be configured, followed by a quick summary of the current\n" "configuration. Click on the corresponding \"%s\" button to make the change.\n" "\n" " * \"%s\": check the current keyboard map configuration and change it if\n" "necessary.\n" "\n" " * \"%s\": check the current country selection. If you're not in this\n" "country, click on the \"%s\" button and choose another. If your country\n" "is not in the list shown, click on the \"%s\" button to get the complete\n" "country list.\n" "\n" " * \"%s\": by default, DrakX deduces your time zone based on the country\n" "you have chosen. You can click on the \"%s\" button here if this is not\n" "correct.\n" "\n" " * \"%s\": verify the current mouse configuration and click on the button\n" "to change it if necessary.\n" "\n" " * \"%s\": if a sound card is detected on your system, it'll be displayed\n" "here. If you notice the sound card is not the one actually present on your\n" "system, you can click on the button and choose a different driver.\n" "\n" " * \"%s\": if you have a TV card, this is where information about its\n" "configuration will be displayed. If you have a TV card and it is not\n" "detected, click on \"%s\" to try to configure it manually.\n" "\n" " * \"%s\": you can click on \"%s\" to change the parameters associated with\n" "the card if you feel the configuration is wrong.\n" "\n" " * \"%s\": by default, DrakX configures your graphical interface in\n" "\"800x600\" or \"1024x768\" resolution. If that does not suit you, click on\n" "\"%s\" to reconfigure your graphical interface.\n" "\n" " * \"%s\": if you wish to configure your Internet or local network access,\n" "you can do so now. Refer to the printed documentation or use the\n" "Mageia Control Center after the installation has finished to benefit\n" "from full in-line help.\n" "\n" " * \"%s\": allows to configure HTTP and FTP proxy addresses if the machine\n" "you're installing on is to be located behind a proxy server.\n" "\n" " * \"%s\": this entry allows you to redefine the security level as set in a\n" "previous step ().\n" "\n" " * \"%s\": if you plan to connect your machine to the Internet, it's a good\n" "idea to protect yourself from intrusions by setting up a firewall. Consult\n" "the corresponding section of the ``Starter Guide'' for details about\n" "firewall settings.\n" "\n" " * \"%s\": if you wish to change your bootloader configuration, click this\n" "button. This should be reserved to advanced users. Refer to the printed\n" "documentation or the in-line help about bootloader configuration in the\n" "Mageia Control Center.\n" "\n" " * \"%s\": through this entry you can fine tune which services will be run\n" "on your machine. If you plan to use this machine as a server it's a good\n" "idea to review this setup." msgstr "" #: ../help.pm:809 #, fuzzy, c-format msgid "TV card" msgstr "Εσωτερική κάρτα ISDN" #: ../help.pm:809 #, fuzzy, c-format msgid "ISDN card" msgstr "Εσωτερική κάρτα ISDN" #: ../help.pm:858 #, fuzzy, c-format msgid "Graphical Interface" msgstr "Γραφικό περιβάλλον" #: ../help.pm:861 #, fuzzy, c-format msgid "" "Choose the hard disk drive you want to erase in order to install your new\n" "Mageia partition. Be careful, all data on this drive will be lost\n" "and will not be recoverable!" msgstr "" "Επιλέξτε τον δίσκο που θέλετε να διαγράψετε για να εγκαταστήσετε \n" "την νέα κατάτμηση Mageia. ΠΡΟΣΟΧΗ: Όλα τα δεδομένα θα διαγραφούν\n" "και θα είναι αδύνατη η επαναφορά τους!" #: ../help.pm:866 #, fuzzy, c-format msgid "" "Click on \"%s\" if you want to delete all data and partitions present on\n" "this hard disk drive. Be careful, after clicking on \"%s\", you will not be able\n" "to recover any data and partitions present on this hard disk drive, including\n" "any Windows data.\n" "\n" "Click on \"%s\" to quit this operation without losing data and partitions\n" "present on this hard disk drive." msgstr "" "Κάντε κλικ στο \"Επόμενο ->\" εάν θέλετε να διαγράψετε όλα τα δεδομένα\n" "τις κατατμήσεις που βρίσκονται στον σκληρό σας δίσκο. Προσοχή μετά\n" "που θα κλικ στο \"Επόμενο ->\"δεν θα μπορείτε να ανακτήσετε τα δεδομένα\n" "και τις κατατμήσεις που βρίσκονται στον δίσκο μαζί και τα Windows\n" " Επόμενο\n" "\n" "Κάντε κλικ στο \"<- Προηγούμενο\" για να τερματίσετε τη λειτουργία αυτή\n" "χωρίς να χάσετε τα δεδομένα και τις κατατμήσεις σας στο δίσκο." #: ../help.pm:872 #, c-format msgid "Next ->" msgstr "Επόμενο ->" #: ../help.pm:872 #, c-format msgid "<- Previous" msgstr "<- Προηγούμενο" #, fuzzy #~ msgid "" #~ "\"%s\": clicking on the \"%s\" button will open the printer " #~ "configuration\n" #~ "wizard. Consult the corresponding chapter of the ``Starter Guide'' for " #~ "more\n" #~ "information on how to set up a new printer. The interface presented in " #~ "our\n" #~ "manual is similar to the one used during installation." #~ msgstr "" #~ "Εκτυπωτής Όχι Εκτυπωτής\n" #~ "\n" #~ " νέο\n" #~ "." #, fuzzy #~ msgid "" #~ "This is the most crucial decision point for the security of your GNU/" #~ "Linux\n" #~ "system: you must enter the \"root\" password. \"Root\" is the system\n" #~ "administrator and is the only user authorized to make updates, add " #~ "users,\n" #~ "change the overall system configuration, and so on. In short, \"root\" " #~ "can\n" #~ "do everything! That's why you must choose a password which is difficult " #~ "to\n" #~ "guess: DrakX will tell you if the password you chose is too simple. As " #~ "you\n" #~ "can see, you're not forced to enter a password, but we strongly advise\n" #~ "against this. GNU/Linux is just as prone to operator error as any other\n" #~ "operating system. Since \"root\" can overcome all limitations and\n" #~ "unintentionally erase all data on partitions by carelessly accessing the\n" #~ "partitions themselves, it is important that it be difficult to become\n" #~ "\"root\".\n" #~ "\n" #~ "The password should be a mixture of alphanumeric characters and at least " #~ "8\n" #~ "characters long. Never write down the \"root\" password -- it makes it " #~ "far\n" #~ "too easy to compromise your system.\n" #~ "\n" #~ "One caveat: do not make the password too long or too complicated because " #~ "you\n" #~ "must be able to remember it!\n" #~ "\n" #~ "The password will not be displayed on screen as you type it. To reduce " #~ "the\n" #~ "chance of a blind typing error you'll need to enter the password twice. " #~ "If\n" #~ "you do happen to make the same typing error twice, you'll have to use " #~ "this\n" #~ "``incorrect'' password the first time you'll try to connect as \"root\".\n" #~ "\n" #~ "If you want an authentication server to control access to your computer,\n" #~ "click on the \"%s\" button.\n" #~ "\n" #~ "If your network uses either LDAP, NIS, or PDC Windows Domain " #~ "authentication\n" #~ "services, select the appropriate one for \"%s\". If you do not know " #~ "which\n" #~ "one to use, you should ask your network administrator.\n" #~ "\n" #~ "If you happen to have problems with remembering passwords, or if your\n" #~ "computer will never be connected to the Internet and you absolutely " #~ "trust\n" #~ "everybody who uses your computer, you can choose to have \"%s\"." #~ msgstr "" #~ "Linux\n" #~ " Root\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ " Linux\n" #~ "\n" #~ "\n" #~ " σημαντικό\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ " εξυπηρετητής Για Προχωρημένους\n" #~ "\n" #~ " LDAP NIS Τομέας Windows Τομέας\n" #~ "\n" #~ "\n" #~ "\n" #~ "\n" #~ " Όχι Διαδίκτυο\n" #~ "." #, fuzzy #~ msgid "authentication" #~ msgstr "Πιστοποίηση"