Actions
Bug #12897
closedceph-disk activate-journal fails on dmcrypt device
% Done:
0%
Source:
other
Tags:
Backport:
Regression:
No
Severity:
3 - minor
Reviewed:
Affected Versions:
ceph-qa-suite:
Pull request ID:
Crash signature (v1):
Crash signature (v2):
Description
# ceph-disk --verbose activate-journal /dev/mapper/3faa1f70-509a-11e5-93e7-fa163ede7c3e DEBUG:ceph-disk:get_dm_uuid /dev/mapper/3faa1f70-509a-11e5-93e7-fa163ede7c3e uuid path is /sys/dev/block/252:1/dm/uuid DEBUG:ceph-disk:get_dm_uuid /dev/mapper/3faa1f70-509a-11e5-93e7-fa163ede7c3e uuid is CRYPT-LUKS1-f2a68d27e1fd4a1e8e4a308282e7c42f-3faa1f70-509a-11e5-93e7-fa163ede7c3e Traceback (most recent call last): File "/usr/sbin/ceph-disk", line 3546, in <module> main(sys.argv[1:]) File "/usr/sbin/ceph-disk", line 3503, in main args.func(args) File "/usr/sbin/ceph-disk", line 2495, in main_activate_journal osd_uuid = get_journal_osd_uuid(dev) File "/usr/sbin/ceph-disk", line 2443, in get_journal_osd_uuid if (get_partition_type(path) == MPATH_JOURNAL_UUID and File "/usr/sbin/ceph-disk", line 2644, in get_partition_type return get_sgdisk_partition_info(part, 'Partition GUID code: (\S+)') File "/usr/sbin/ceph-disk", line 2650, in get_sgdisk_partition_info (base, partnum) = split_dev_base_partnum(dev) File "/usr/sbin/ceph-disk", line 2639, in split_dev_base_partnum partnum = open(os.path.join(b, 'partition')).read().strip() IOError: [Errno 2] No such file or directory: '/sys/dev/block/252:1/partition'
Updated by Loïc Dachary over 8 years ago
Activate journal for a dmcrypt device has been broken for some time: the code path fails because a prototype is missing. Providing a /dev/mapper/XXXX path won't work either, the logic is not there.
diff --git a/qa/workunits/ceph-disk/ceph-disk-test.py b/qa/workunits/ceph-disk/ceph-disk-test.py index bc6d254..f5fbbd1 100644 --- a/qa/workunits/ceph-disk/ceph-disk-test.py +++ b/qa/workunits/ceph-disk/ceph-disk-test.py @@ -178,7 +178,7 @@ class TestCephDisk(object): disk = c.unused_disks()[0] osd_uuid = str(uuid.uuid1()) journal_uuid = str(uuid.uuid1()) - d = tempfile.mkdtemp() + d = '/tmp' # tempfile.mkdtemp() c.sh("ceph-disk zap " + disk) c.sh("ceph-disk prepare " + " --dmcrypt-key-dir " + d + @@ -186,25 +186,26 @@ class TestCephDisk(object): " --journal-uuid " + journal_uuid + " --dmcrypt " + " " + disk) - if type == 'plain': - c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + - " --key-size 256 create " + osd_uuid + - " " + disk + "1") - else: - c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + ".luks.key" + - " luksOpen " + - " " + disk + "1" + - " " + osd_uuid) - if type == 'plain': - c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + - " --key-size 256 create " + journal_uuid + - " " + disk + "2") - else: - c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + ".luks.key" + - " luksOpen " + - " " + disk + "2" + - " " + journal_uuid) - c.sh("ceph-disk activate /dev/mapper/" + osd_uuid) + # if type == 'plain': + # c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + + # " --key-size 256 create " + osd_uuid + + # " " + disk + "1") + # else: + # c.sh("cryptsetup --key-file " + d + "/" + osd_uuid + ".luks.key" + + # " luksOpen " + + # " " + disk + "1" + + # " " + osd_uuid) + # if type == 'plain': + # c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + + # " --key-size 256 create " + journal_uuid + + # " " + disk + "2") + # else: + # c.sh("cryptsetup --key-file " + d + "/" + journal_uuid + ".luks.key" + + # " luksOpen " + + # " " + disk + "2" + + # " " + journal_uuid) +# c.sh("ceph-disk activate /dev/mapper/" + osd_uuid) + c.sh("ceph-disk activate-journal --dmcrypt --dmcrypt-key-dir /tmp " + disk + "2") data_partition = c.get_osd_partition(osd_uuid) assert data_partition['type'] == 'data' assert data_partition['state'] == 'active' diff --git a/src/ceph-disk b/src/ceph-disk index a755a7f..26a8763 100755 --- a/src/ceph-disk +++ b/src/ceph-disk @@ -1,5 +1,6 @@ #!/usr/bin/env python # +# Copyright (C) 2015 Red Hat <contact@redhat.com> # Copyright (C) 2014 Inktank <info@inktank.com> # Copyright (C) 2014 Cloudwatt <libre.licensing@cloudwatt.com> # Copyright (C) 2014 Catalyst.net Ltd @@ -1669,6 +1670,17 @@ def check_journal_reqs(args): ]) return (not allows_journal, not wants_journal, not needs_journal) +def get_cryptsetup_parameters(cluster): + cryptsetup_parameters_str = get_conf( + cluster=cluster, + variable='osd_cryptsetup_parameters', + ) + if cryptsetup_parameters_str is None: + cryptsetup_parameters = [] + else: + cryptsetup_parameters = shlex.split(cryptsetup_parameters_str) + return cryptsetup_parameters + def main_prepare(args): journal_dm_keypath = None osd_dm_keypath = None @@ -1755,14 +1767,7 @@ def main_prepare(args): ) journal_size = int(journal_size) - cryptsetup_parameters_str = get_conf( - cluster=args.cluster, - variable='osd_cryptsetup_parameters', - ) - if cryptsetup_parameters_str is None: - cryptsetup_parameters = [] - else: - cryptsetup_parameters = shlex.split(cryptsetup_parameters_str) + cryptsetup_parameters = get_cryptsetup_parameters(args.cluster) dmcrypt_keysize_str = get_conf( cluster=args.cluster, @@ -2481,11 +2486,21 @@ def main_activate_journal(args): # it before proceeding. rawdev = args.dev ptype = get_partition_type(rawdev) - if ptype not in [DMCRYPT_JOURNAL_UUID]: + if ptype == DMCRYPT_JOURNAL_UUID: + type = 'plain' + elif ptype == DMCRYPT_LUKS_JOURNAL_UUID: + type = 'LUKS' + else: raise Error('activate-journal --dmcrypt called for invalid dev %s' % (rawdev)) part_uuid = get_partition_uuid(rawdev) - dmcrypt_key_path = os.path.join(args.dmcrypt_key_dir, part_uuid) - dev = dmcrypt_map(rawdev, dmcrypt_key_path, part_uuid) + dmcrypt_key_path = get_dmcrypt_key_path(part_uuid, + args.dmcrypt_key_dir, + type == 'LUKS') + LOG.debug('main_activate_journal: raw device ' + rawdev + ' type ' + type) + dev = dmcrypt_map(rawdev, dmcrypt_key_path, part_uuid, + get_cryptsetup_parameters(args.cluster), + type == 'LUKS') + LOG.debug('main_activate_journal: dmcrypt device ' + dev) else: dev = args.dev @@ -3328,6 +3343,12 @@ def make_prepare_parser(subparsers): def make_activate_parser(subparsers): activate_parser = subparsers.add_parser('activate', help='Activate a Ceph OSD') activate_parser.add_argument( + '--cluster', + metavar='NAME', + default='ceph', + help='Ceph cluster name', + ) + activate_parser.add_argument( '--mount', action='store_true', default=None, help='mount a block device [deprecated, ignored]', @@ -3376,6 +3397,12 @@ def make_activate_parser(subparsers): def make_activate_journal_parser(subparsers): activate_journal_parser = subparsers.add_parser('activate-journal', help='Activate an OSD via its journal device') activate_journal_parser.add_argument( + '--cluster', + metavar='NAME', + default='ceph', + help='Ceph cluster name', + ) + activate_journal_parser.add_argument( 'dev', metavar='DEV', help='path to journal block device',
Updated by Loïc Dachary over 8 years ago
Updated by Loïc Dachary over 8 years ago
- Status changed from 12 to In Progress
Updated by Loïc Dachary over 8 years ago
- Status changed from In Progress to Resolved
Actions