#ifdef HAVE_KINETIC
 #include "KineticStore.h"
 #endif
+#ifdef HAVE_LIBAIO
+#include "os/bluestore/BlueStore.h"
+#endif
 
 KeyValueDB *KeyValueDB::create(CephContext *cct, const string& type,
                               const string& dir,
   }
 #endif
 
+#ifdef HAVE_LIBAIO
+  if (type == "bluestore-kv") {
+    // note: we'll leak this!  the only user is ceph-kvstore-tool and
+    // we don't care.
+    BlueStore *bluestore = new BlueStore(cct, dir);
+    KeyValueDB *db = nullptr;
+    int r = bluestore->start_kv_only(&db);
+    if (r < 0)
+      return nullptr;  // yes, we leak.
+    return db;
+  }
+#endif
   if ((type == "memdb") && 
     cct->check_experimental_feature_enabled("memdb")) {
     return new MemDB(cct, dir, p);
 
   return ret;
 }
 
-int BlueStore::_open_db(bool create)
+int BlueStore::_open_db(bool create, bool kv_no_open)
 {
   int r;
   assert(!db);
   if (kv_backend == "rocksdb")
     options = cct->_conf->bluestore_rocksdb_options;
   db->init(options);
+  if (kv_no_open) {
+    return 0;
+  }
   if (create)
     r = db->create_and_open(err);
   else
   }
 }
 
-int BlueStore::mount()
+int BlueStore::_mount(bool kv_only)
 {
   dout(1) << __func__ << " path " << path << dendl;
 
   if (r < 0)
     goto out_fsid;
 
-  r = _open_db(false);
+  r = _open_db(false, kv_only);
   if (r < 0)
     goto out_bdev;
 
+  if (kv_only)
+    return 0;
+
   r = _open_super_meta();
   if (r < 0)
     goto out_db;
 
 
   int _open_bdev(bool create);
   void _close_bdev();
-  int _open_db(bool create);
+  int _open_db(bool create, bool kv_no_open=false);
   void _close_db();
   int _open_fm(bool create);
   void _close_fm();
 
   bool test_mount_in_use() override;
 
-  int mount() override;
+private:
+  int _mount(bool kv_only);
+public:
+  int mount() override {
+    return _mount(false);
+  }
   int umount() override;
 
+  int start_kv_only(KeyValueDB **pdb) {
+    int r = _mount(true);
+    if (r < 0)
+      return r;
+    *pdb = db;
+    return 0;
+  }
+
   int fsck(bool deep) override;
 
   void set_cache_shards(unsigned num) override;