Index: uspace/app/hrctl/hrctl.c
===================================================================
--- uspace/app/hrctl/hrctl.c	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/app/hrctl/hrctl.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -52,6 +52,6 @@
 static errno_t fill_config_devs(int, char **, hr_config_t *);
 static errno_t get_vol_configs_from_sif(const char *, hr_config_t **, size_t *);
-static int create_from_config(hr_t *, const char *);
-static int create_from_argv(hr_t *, int, char **);
+static int create_from_config(hr_t *, const char *, uint8_t);
+static int create_from_argv(hr_t *, int, char **, uint8_t);
 static int handle_create(hr_t *, int, char **);
 static int assemble_from_config(hr_t *, const char *);
@@ -70,5 +70,5 @@
     "  -h, --help                                Display this message and exit.\n"
     "\n"
-    "  -c, --create                              Create a volume, options:\n"
+    "  -c, --create [--no_meta]                  Create a volume, options:\n"
     "      name {-l , --level level} device...   manual device specification, or\n"
     "      -f configuration.sif                  create from configuration file.\n"
@@ -108,4 +108,5 @@
     "\n"
     "Notes:\n"
+    "  Add --no_meta after --create to disable storing on-disk metadata.\n"
     "  Simulating an extent failure with -m volume -f index is dangerous. It marks\n"
     "  metadata as dirty in other healthy extents, and zeroes out the superblock\n"
@@ -341,5 +342,6 @@
 }
 
-static int create_from_config(hr_t *hr, const char *config_path)
+static int create_from_config(hr_t *hr, const char *config_path,
+    uint8_t vol_flags)
 {
 	hr_config_t *vol_configs = NULL;
@@ -351,4 +353,7 @@
 		return EXIT_FAILURE;
 	}
+
+	for (size_t i = 0; i < vol_count; i++)
+		vol_configs[i].vol_flags |= vol_flags;
 
 	for (size_t i = 0; i < vol_count; i++) {
@@ -368,5 +373,5 @@
 }
 
-static int create_from_argv(hr_t *hr, int argc, char **argv)
+static int create_from_argv(hr_t *hr, int argc, char **argv, uint8_t vol_flags)
 {
 	/* we need name + --level + arg + at least one extent */
@@ -381,4 +386,6 @@
 		return EXIT_FAILURE;
 	}
+
+	vol_config->vol_flags |= vol_flags;
 
 	const char *name = argv[optind++];
@@ -441,8 +448,14 @@
 {
 	int rc;
+	uint8_t vol_flags = 0;
 
 	if (optind >= argc) {
 		printf(NAME ": no arguments to --create\n");
 		return EXIT_FAILURE;
+	}
+
+	if (str_cmp(argv[optind], "--no_meta") == 0) {
+		vol_flags |= HR_VOL_FLAG_NOOP_META;
+		optind++;
 	}
 
@@ -461,7 +474,7 @@
 		}
 
-		rc = create_from_config(hr, config_path);
+		rc = create_from_config(hr, config_path, vol_flags);
 	} else {
-		rc = create_from_argv(hr, argc, argv);
+		rc = create_from_argv(hr, argc, argv, vol_flags);
 	}
 
Index: uspace/lib/device/include/hr.h
===================================================================
--- uspace/lib/device/include/hr.h	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/lib/device/include/hr.h	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -88,6 +88,11 @@
 	HR_METADATA_SOFTRAID,
 	HR_METADATA_MD,
-	HR_METADATA_LAST_DUMMY
+	HR_METADATA_NOOP,
+	HR_METADATA_LAST_PLACEHOLDER
 } hr_metadata_type_t;
+
+typedef enum hr_vol_flag {
+	HR_VOL_FLAG_NOOP_META = 0x01
+} hr_vol_flag_t;
 
 typedef struct hr {
@@ -100,4 +105,5 @@
 	size_t dev_no;
 	hr_level_t level;
+	uint8_t vol_flags;
 } hr_config_t;
 
Index: uspace/lib/device/src/hr.c
===================================================================
--- uspace/lib/device/src/hr.c	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/lib/device/src/hr.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -554,4 +554,6 @@
 	case HR_METADATA_MD:
 		return "Linux Multiple Device";
+	case HR_METADATA_NOOP:
+		return "NOOP Metadata";
 	default:
 		return "Invalid metadata type value";
Index: uspace/srv/bd/hr/hr.c
===================================================================
--- uspace/srv/bd/hr/hr.c	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/srv/bd/hr/hr.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -131,6 +131,12 @@
 	}
 
-	rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname,
-	    HR_METADATA_NATIVE);
+	hr_metadata_type_t meta_type;
+	if (cfg->vol_flags & HR_VOL_FLAG_NOOP_META)
+		meta_type = HR_METADATA_NOOP;
+	else
+		meta_type = HR_METADATA_NATIVE;
+
+	printf("creating with type %d\n", meta_type);
+	rc = hr_create_vol_struct(&vol, cfg->level, cfg->devname, meta_type);
 	if (rc != EOK) {
 		free(cfg);
Index: uspace/srv/bd/hr/meson.build
===================================================================
--- uspace/srv/bd/hr/meson.build	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/srv/bd/hr/meson.build	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -38,4 +38,5 @@
             'metadata/foreign/softraid/softraid.c',
             'metadata/native.c',
+            'metadata/noop.c',
             'parity_stripe.c',
             'raid0.c',
Index: uspace/srv/bd/hr/metadata/noop.c
===================================================================
--- uspace/srv/bd/hr/metadata/noop.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
+++ uspace/srv/bd/hr/metadata/noop.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2025 Miroslav Cimerman
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/** @addtogroup hr
+ * @{
+ */
+/**
+ * @file
+ */
+
+#include <loc.h>
+#include <stdio.h>
+
+#include "../superblock.h"
+#include "../util.h"
+#include "../var.h"
+
+static errno_t meta_noop_probe(service_id_t, void **);
+static errno_t meta_noop_init_vol2meta(hr_volume_t *);
+static errno_t meta_noop_init_meta2vol(const list_t *, hr_volume_t *);
+static errno_t meta_noop_erase_block(service_id_t);
+static bool meta_noop_compare_uuids(const void *, const void *);
+static void meta_noop_inc_counter(hr_volume_t *);
+static errno_t meta_noop_save(hr_volume_t *, bool);
+static errno_t meta_noop_save_ext(hr_volume_t *, size_t, bool);
+static const char *meta_noop_get_devname(const void *);
+static hr_level_t meta_noop_get_level(const void *);
+static uint64_t meta_noop_get_data_offset(void);
+static size_t meta_noop_get_size(void);
+static uint8_t meta_noop_get_flags(void);
+static hr_metadata_type_t meta_noop_get_type(void);
+static void meta_noop_dump(const void *);
+
+hr_superblock_ops_t noop_ops = {
+	.probe = meta_noop_probe,
+	.init_vol2meta = meta_noop_init_vol2meta,
+	.init_meta2vol = meta_noop_init_meta2vol,
+	.erase_block = meta_noop_erase_block,
+	.compare_uuids = meta_noop_compare_uuids,
+	.inc_counter = meta_noop_inc_counter,
+	.save = meta_noop_save,
+	.save_ext = meta_noop_save_ext,
+	.get_devname = meta_noop_get_devname,
+	.get_level = meta_noop_get_level,
+	.get_data_offset = meta_noop_get_data_offset,
+	.get_size = meta_noop_get_size,
+	.get_flags = meta_noop_get_flags,
+	.get_type = meta_noop_get_type,
+	.dump = meta_noop_dump
+};
+
+static errno_t meta_noop_probe(service_id_t svc_id, void **rmd)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return ENOTSUP;
+}
+
+static errno_t meta_noop_init_vol2meta(hr_volume_t *vol)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return EOK;
+}
+
+static errno_t meta_noop_init_meta2vol(const list_t *list, hr_volume_t *vol)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return ENOTSUP;
+}
+
+static errno_t meta_noop_erase_block(service_id_t dev)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return EOK;
+}
+
+static bool meta_noop_compare_uuids(const void *m1p, const void *m2p)
+{
+	return false;
+}
+
+static void meta_noop_inc_counter(hr_volume_t *vol)
+{
+	(void)vol;
+}
+
+static errno_t meta_noop_save(hr_volume_t *vol, bool with_state_callback)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return EOK;
+}
+
+static errno_t meta_noop_save_ext(hr_volume_t *vol, size_t ext_idx,
+    bool with_state_callback)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return EOK;
+}
+
+static const char *meta_noop_get_devname(const void *md_v)
+{
+	return NULL;
+}
+
+static hr_level_t meta_noop_get_level(const void *md_v)
+{
+	return HR_LVL_UNKNOWN;
+}
+
+static uint64_t meta_noop_get_data_offset(void)
+{
+	return 0;
+}
+
+static size_t meta_noop_get_size(void)
+{
+	return 0;
+}
+
+static uint8_t meta_noop_get_flags(void)
+{
+	HR_DEBUG("%s()", __func__);
+
+	uint8_t flags = 0;
+
+	flags |= HR_METADATA_HOTSPARE_SUPPORT;
+	flags |= HR_METADATA_ALLOW_REBUILD;
+
+	return flags;
+}
+
+static hr_metadata_type_t meta_noop_get_type(void)
+{
+	HR_DEBUG("%s()", __func__);
+
+	return HR_METADATA_NOOP;
+}
+
+static void meta_noop_dump(const void *md_v)
+{
+	HR_DEBUG("%s()", __func__);
+
+	printf("NOOP Metadata\n");
+}
+
+/** @}
+ */
Index: uspace/srv/bd/hr/superblock.c
===================================================================
--- uspace/srv/bd/hr/superblock.c	(revision 93ea452072c4080f314fba3f817b325ecc20452a)
+++ uspace/srv/bd/hr/superblock.c	(revision 150adbd2e618fb049e1613658a0e20af0a3ed593)
@@ -61,4 +61,5 @@
 extern hr_superblock_ops_t metadata_softraid_ops;
 extern hr_superblock_ops_t metadata_md_ops;
+extern hr_superblock_ops_t noop_ops;
 
 static hr_superblock_ops_t *hr_superblock_ops_all[] = {
@@ -67,10 +68,12 @@
 	[HR_METADATA_GEOM_STRIPE] = &metadata_gstripe_ops,
 	[HR_METADATA_SOFTRAID] = &metadata_softraid_ops,
-	[HR_METADATA_MD] = &metadata_md_ops
+	[HR_METADATA_MD] = &metadata_md_ops,
+	[HR_METADATA_NOOP] = &noop_ops
 };
 
 hr_superblock_ops_t *hr_get_meta_type_ops(hr_metadata_type_t type)
 {
-	assert(type >= HR_METADATA_NATIVE && type < HR_METADATA_LAST_DUMMY);
+	assert(type >= HR_METADATA_NATIVE &&
+	    type < HR_METADATA_LAST_PLACEHOLDER);
 
 	return hr_superblock_ops_all[type];
@@ -92,5 +95,5 @@
 
 	volatile hr_metadata_type_t type = HR_METADATA_NATIVE;
-	for (; type < HR_METADATA_LAST_DUMMY; type++) {
+	for (; type < HR_METADATA_LAST_PLACEHOLDER; type++) {
 		meta_ops = hr_superblock_ops_all[type];
 
