linux-base: For consistency with fresh installations, use or assign UUIDs rather than labels where both are available (Closes: #572376)

svn path=/dists/trunk/linux-2.6/; revision=15347
This commit is contained in:
Ben Hutchings 2010-03-10 03:57:49 +00:00
parent 85a33caf87
commit a40042f1ab
4 changed files with 109 additions and 50 deletions

2
debian/changelog vendored
View File

@ -11,6 +11,8 @@ linux-2.6 (2.6.33-1~experimental.3) UNRELEASED; urgency=low
of unknown filesystem type (Closes: #572341, #572445)
* linux-base: Don't accept empty filesystem labels as identifiers
(Closes: #572438)
* linux-base: For consistency with fresh installations, use or assign
UUIDs rather than labels where both are available (Closes: #572376)
-- Ben Hutchings <ben@decadent.org.uk> Sun, 28 Feb 2010 17:01:33 +0000

View File

@ -22,6 +22,7 @@ use AptPkg::Config;
use Debconf::Client::ConfModule ':all';
use FileHandle;
use POSIX ();
use UUID;
package DebianKernel::DiskId;
@ -1086,33 +1087,46 @@ my @config_files = ({packages => 'mount',
# with few exceptions. Such as including a '^'.
suffix => '^old'});
### Filesystem relabelling
### Filesystem labels and UUIDs
sub ext2_label {
sub ext2_set_label {
my ($bdev, $label) = @_;
system('e2label', $bdev, $label) == 0 or die "e2label failed: $?";
system('tune2fs', '-L', $label, $bdev) == 0 or die "tune2fs failed: $?";
}
sub ext2_set_uuid {
my ($bdev, $uuid) = @_;
system('tune2fs', '-U', $uuid, $bdev) == 0 or die "tune2fs failed: $?";
}
sub jfs_label {
sub jfs_set_label {
my ($bdev, $label) = @_;
system('jfs_tune', '-L', $label, $bdev) == 0 or die "jfs_tune failed: $?";
}
sub fat_label {
my ($bdev, $label) = @_;
system('dosfslabel', $bdev, $label) == 0 or die "dosfslabel failed: $?";;
sub jfs_set_uuid {
my ($bdev, $uuid) = @_;
system('jfs_tune', '-U', $uuid, $bdev) == 0 or die "jfs_tune failed: $?";
}
sub ntfs_label {
sub fat_set_label {
my ($bdev, $label) = @_;
system('dosfslabel', $bdev, $label) == 0 or die "dosfslabel failed: $?";
}
sub ntfs_set_label {
my ($bdev, $label) = @_;
system('ntfslabel', $bdev, $label) == 0 or die "ntfslabel failed: $?";
}
sub reiserfs_label {
sub reiserfs_set_label {
my ($bdev, $label) = @_;
system('reiserfstune', '--label', $label, $bdev)
or die "reiserfstune failed: $?";
}
sub reiserfs_set_uuid {
my ($bdev, $uuid) = @_;
system('reiserfstune', '--uuid', $uuid, $bdev)
or die "reiserfstune failed: $?";
}
# There is no command to relabel swap, and we mustn't run mkswap if
# the partition is already in use. Thankfully the header format is
@ -1129,9 +1143,10 @@ sub reiserfs_label {
# };
# and has the signature 'SWAPSPACE2' at the end of the first page.
use constant { SWAP_SIGNATURE => 'SWAPSPACE2',
SWAP_UUID_OFFSET => 1036, SWAP_UUID_LEN => 16,
SWAP_LABEL_OFFSET => 1052, SWAP_LABEL_LEN => 16 };
sub swap_label {
my ($bdev, $label) = @_;
sub _swap_set_field {
my ($bdev, $offset, $value) = @_;
my $pagesize = POSIX::sysconf(POSIX::_SC_PAGESIZE) or die "$!";
my ($length, $signature);
@ -1146,11 +1161,10 @@ sub swap_label {
die "swap signature not found on $bdev";
}
# Set the label
$label = pack('Z' . SWAP_LABEL_LEN, $label);
POSIX::lseek($fd, SWAP_LABEL_OFFSET, POSIX::SEEK_SET);
$length = POSIX::write($fd, $label, SWAP_LABEL_LEN);
if (!defined($length) || $length != SWAP_LABEL_LEN) {
# Set the field
POSIX::lseek($fd, $offset, POSIX::SEEK_SET);
$length = POSIX::write($fd, $value, length($value));
if (!defined($length) || $length != length($value)) {
my $error = "$!";
POSIX::close($fd);
die $error;
@ -1158,29 +1172,54 @@ sub swap_label {
POSIX::close($fd);
}
sub swap_set_label {
my ($bdev, $label) = @_;
_swap_set_field($bdev, SWAP_LABEL_OFFSET, pack('Z' . SWAP_LABEL_LEN, $label));
}
sub swap_set_uuid {
my ($bdev, $uuid) = @_;
my $uuid_bin;
if (UUID::parse($uuid, $uuid_bin) != 0 ||
length($uuid_bin) != SWAP_UUID_LEN) {
die "internal error: invalid UUID string";
}
_swap_set_field($bdev, SWAP_UUID_OFFSET, $uuid_bin);
}
sub ufs_label {
sub ufs_set_label {
my ($bdev, $label) = @_;
system('tunefs.ufs', '-L', $label, $bdev) or die "tunefs.ufs failed: $?";
}
sub xfs_label {
sub xfs_set_label {
my ($bdev, $label) = @_;
system('xfs_admin', '-L', $label, $bdev) or die "xfs_admin failed: $?";
}
sub xfs_set_uuid {
my ($bdev, $uuid) = @_;
system('xfs_admin', '-U', $uuid, $bdev) or die "xfs_admin failed: $?";
}
my %label_types = (ext2 => { len => 16, relabel => \&ext2_label },
ext3 => { len => 16, relabel => \&ext2_label },
ext4 => { len => 16, relabel => \&ext2_label },
jfs => { len => 16, relabel => \&jfs_label },
msdos => { len => 11, relabel => \&fat_label },
ntfs => { len => 128, relabel => \&ntfs_label },
reiserfs => { len => 16, relabel => \&reiserfs_label },
swap => { len => SWAP_LABEL_LEN,
relabel => \&swap_label },
ufs => { len => 32, relabel => \&ufs_label },
vfat => { len => 11, relabel => \&fat_label },
xfs => { len => 12, relabel => \&xfs_label });
my %filesystem_types = (
ext2 => { label_len => 16, set_label => \&ext2_set_label,
set_uuid => \&ext2_set_uuid },
ext3 => { label_len => 16, set_label => \&ext2_set_label,
set_uuid => \&ext2_set_uuid },
ext4 => { label_len => 16, set_label => \&ext2_set_label,
set_uuid => \&ext2_set_uuid },
jfs => { label_len => 16, set_label => \&jfs_set_label,
set_uuid => \&jfs_set_uuid },
msdos => { label_len => 11, set_label => \&fat_set_label },
ntfs => { label_len => 128, set_label => \&ntfs_set_label },
reiserfs => { label_len => 16, set_label => \&reiserfs_set_label,
set_uuid => \&reiserfs_set_uuid },
swap => { label_len => SWAP_LABEL_LEN, set_label => \&swap_set_label,
set_uuid => \&swap_set_uuid },
ufs => { label_len => 32, set_label => \&ufs_set_label },
vfat => { label_len => 11, set_label => \&fat_set_label },
xfs => { label_len => 12, set_label => \&xfs_set_label,
set_uuid => \&xfs_set_uuid }
);
my %bdev_map;
my @matched_configs;
@ -1253,13 +1292,16 @@ sub scan_config_files {
sub add_tag {
# Map disks to labels/UUIDs and vice versa. Include all disks in
# the reverse mapping so we can detect ambiguity.
my ($bdev, $name, $value) = @_;
my ($bdev, $name, $value, $new) = @_;
my $id = "$name=$value";
push @{$id_map{$id}}, $bdev;
if (exists($bdev_map{$bdev})) {
$bdev_map{$bdev}->{$name} = $value;
push @{$bdev_map{$bdev}->{ids}}, $id;
}
if ($new) {
$bdev_map{$bdev}->{new_id} = $id;
}
}
sub scan_devices {
@ -1280,18 +1322,26 @@ sub scan_devices {
}
}
sub assign_labels {
sub assign_new_ids {
my $hostname = (POSIX::uname())[1];
# For all devices that have no alternate device ids, suggest labelling
# them based on fstab or just using a generic label.
# For all devices that have no alternate device ids, suggest setting
# UUIDs, labelling them based on fstab or just using a generic label.
for my $bdev (keys(%bdev_map)) {
next if $#{$bdev_map{$bdev}->{ids}} >= 0;
my $type = $bdev_map{$bdev}->{type};
next unless defined($type) && exists($label_types{$type});
next unless defined($type) && exists($filesystem_types{$type});
my $label_len = $label_types{$type}->{len};
if (defined($filesystem_types{$type}->{set_uuid})) {
my ($uuid_bin, $uuid);
UUID::generate($uuid_bin);
UUID::unparse($uuid_bin, $uuid);
add_tag($bdev, 'UUID', $uuid, 1);
next;
}
my $label_len = $filesystem_types{$type}->{len};
my $label;
use bytes; # string lengths are in bytes
@ -1331,17 +1381,23 @@ sub assign_labels {
} while (exists($id_map{"LABEL=$label"}));
}
add_tag($bdev, 'LABEL', $label);
$bdev_map{$bdev}->{relabel} = 1;
add_tag($bdev, 'LABEL', $label, 1);
}
}
sub relabel {
sub set_new_ids {
for my $bdev (keys(%bdev_map)) {
my $bdev_info = $bdev_map{$bdev};
if ($bdev_info->{relabel}) {
my $relabel = $label_types{$bdev_info->{type}}->{relabel};
&{$relabel}($bdev, $bdev_info->{LABEL});
if ($bdev_info->{new_id}) {
my ($name, $value) = split(/=/, $bdev_info->{new_id}, 2);
my $setter;
if ($name eq 'UUID') {
$setter = $filesystem_types{$bdev_info->{type}}->{set_uuid};
} elsif ($name eq 'LABEL') {
$setter = $filesystem_types{$bdev_info->{type}}->{set_label};
}
defined($setter) or die "internal error: invalid new_id type";
&{$setter}($bdev, $value);
}
}
}
@ -1410,14 +1466,15 @@ sub transition {
if ($answer eq 'true') {
scan_devices();
assign_labels();
assign_new_ids();
if (grep({$bdev_map{$_}->{relabel}} keys(%bdev_map))) {
if (grep({$bdev_map{$_}->{new_id}} keys(%bdev_map))) {
$question = 'linux-base/disk-id-convert-plan';
($ret, $seen) = subst($question, 'relabel',
join("\\n",
map({sprintf("%s: %s", $_, $bdev_map{$_}->{LABEL})}
grep({$bdev_map{$_}->{relabel}}
map({sprintf("%s: %s",
$_, $bdev_map{$_}->{new_id})}
grep({$bdev_map{$_}->{new_id}}
keys(%bdev_map)))));
die "Error setting debconf substitutions in $question: $seen" if $ret;
} else {
@ -1448,7 +1505,7 @@ sub transition {
if ($answer ne 'true') {
# TODO: go back to the auto/manual question or allow editing the plan
} else {
relabel();
set_new_ids();
update_config();
}
}

View File

@ -15,7 +15,7 @@ Template: linux-base/disk-id-convert-plan
Type: boolean
Default: true
Description: Apply these configuration changes to disk device ids?
These devices will be relabelled:
These devices will be assigned UUIDs or labels:
.
${relabel}
.

View File

@ -79,7 +79,7 @@ Description: Support files for Linux @upstreamversion@
Package: linux-base
Architecture: all
Depends: libapt-pkg-perl, ${misc:Depends}
Depends: libapt-pkg-perl, libuuid-perl, ${misc:Depends}
Description: Linux image base package
This package contains files and support scripts for all Linux
images.