Project

General

Profile

Actions

Bug #12897

closed

ceph-disk activate-journal fails on dmcrypt device

Added by Loïc Dachary over 8 years ago. Updated over 8 years ago.

Status:
Resolved
Priority:
Normal
Assignee:
Category:
-
Target version:
-
% 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'
Actions #1

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',
Actions #3

Updated by Loïc Dachary over 8 years ago

  • Status changed from 12 to In Progress
Actions

Also available in: Atom PDF