summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandr Ilenko <AIlenko@IBS.RU>2022-06-24 17:53:39 +0300
committerAlexandr Ilenko <AIlenko@IBS.RU>2022-06-27 13:41:05 +0300
commit1e96abd8888f408454ac4e1bea5dc73f1b3556f8 (patch)
treef2ce6697b41f3ec9456eecdc44a63f1e9235f75e
parent8ed4477f38204550c252b73c1cf10e20c7ffe03e (diff)
downloadopenbmc-1e96abd8888f408454ac4e1bea5dc73f1b3556f8.tar.xz
Add: nfs, smb protocols to virtual-media, cdrom pre-configured
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend10
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch37
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch17
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch47
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch73
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch87
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch101
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch264
-rw-r--r--meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch159
9 files changed, 794 insertions, 1 deletions
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend
index 31aea02c0a..03d468783b 100644
--- a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media.bbappend
@@ -8,6 +8,14 @@ SRC_URI += "\
file://0005-virtual-media.1-Fix-Use-machine.forceDisconnectNbd.patch \
file://0006-Upd-disable-tls13-ciphers-for-http-protocol.patch \
file://0007-Upd-rename-Slot_-0123-to-USB-0123-in-virtual-media.j.patch \
+ file://0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch \
+ file://0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch \
+ file://0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch \
+ file://0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch \
+ file://0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch \
+ file://0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch \
+ file://0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch \
+ file://0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch \
"
-RDEPENDS:${PN}:append = " nfs-utils-mount"
+RDEPENDS:${PN}:append = " nfs-utils-mount phosphor-misc-usb-ctrl"
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch
new file mode 100644
index 0000000000..1695161967
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0008-virtual-media.3-Upd-Use-umount2-.-instead-of-umount.patch
@@ -0,0 +1,37 @@
+From 23c187385db3228bd01520fc0dc7f83cd988e37a Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 09:56:47 +0300
+Subject: [PATCH 08/20] virtual-media.3: Upd: Use "::umount2(.)" instead of
+ "::umount(.)"
+
+---
+ src/resources.hpp | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/src/resources.hpp b/src/resources.hpp
+index b211d55..e307955 100644
+--- a/src/resources.hpp
++++ b/src/resources.hpp
+@@ -88,10 +88,17 @@ class Mount
+
+ ~Mount()
+ {
+- if (int result = ::umount(directory->getPath().string().c_str()))
++ if (int result = ::umount2(directory->getPath().string().c_str(), MNT_DETACH))
+ {
+- LogMsg(Logger::Error, result, " : Unable to unmout directory ",
++ LogMsg(Logger::Error, result, " : Unable to lazy unmout directory. Attempt to force umount ",
+ directory->getPath());
++ result = ::umount2(directory->getPath().string().c_str(), MNT_FORCE);
++ if (result)
++ {
++ LogMsg(Logger::Error, result, " : Unable to unmout directory ",
++ directory->getPath().string());
++ return;
++ }
+ }
+ }
+
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch
new file mode 100644
index 0000000000..db3b677240
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0009-virtual-media.3-Upd-Just-re-name-smb-netdev-.hpp.patch
@@ -0,0 +1,17 @@
+From 5bc7ec6580751844474bd7c111394cce76e2dbf8 Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 09:43:07 +0300
+Subject: [PATCH 09/20] virtual-media.3: Upd: Just re-name "{smb=>netdev}.hpp"
+
+---
+ src/{smb.hpp => netdev.hpp} | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ rename src/{smb.hpp => netdev.hpp} (100%)
+
+diff --git a/src/smb.hpp b/src/netdev.hpp
+similarity index 100%
+rename from src/smb.hpp
+rename to src/netdev.hpp
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch
new file mode 100644
index 0000000000..6e947c6081
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0010-virtual-media.3-Upd-Just-move-SmbShare-s-methods.patch
@@ -0,0 +1,47 @@
+From b3ce2fd3b4095b8232d679d48a1156aec84aa0c7 Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 09:52:28 +0300
+Subject: [PATCH 10/20] virtual-media.3: Upd: Just move SmbShare`s methods
+
+---
+ src/netdev.hpp | 17 +++++++++--------
+ 1 file changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/src/netdev.hpp b/src/netdev.hpp
+index 9e4a2fc..064b340 100644
+--- a/src/netdev.hpp
++++ b/src/netdev.hpp
+@@ -13,6 +13,15 @@ namespace fs = std::filesystem;
+
+ class SmbShare
+ {
++ protected:
++ std::string mountDir;
++
++ /* Check if username does not contain comma (,) character */
++ bool validateUsername(const std::string& username)
++ {
++ return username.find(',') == std::string::npos;
++ }
++
+ public:
+ SmbShare(const fs::path& mountDir) : mountDir(mountDir)
+ {
+@@ -68,14 +77,6 @@ class SmbShare
+ }
+
+ private:
+- std::string mountDir;
+-
+- /* Check if username does not contain comma (,) character */
+- bool validateUsername(const std::string& username)
+- {
+- return username.find(',') == std::string::npos;
+- }
+-
+ int mountWithSmbVers(const fs::path& remote, std::string options,
+ const std::string& version)
+ {
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch
new file mode 100644
index 0000000000..e6d693fde3
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0011-virtual-media.3-Upd-Split-SmbShare-to-NetDevShare-an.patch
@@ -0,0 +1,73 @@
+From 36cb2a2adc06483e65278e367d2146934cfaf080 Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 09:53:41 +0300
+Subject: [PATCH 11/20] virtual-media.3: Upd: Split "SmbShare" to "NetDevShare"
+ and "CifsShare"
+
+---
+ src/netdev.hpp | 28 ++++++++++++++++++++++++----
+ 1 file changed, 24 insertions(+), 4 deletions(-)
+
+diff --git a/src/netdev.hpp b/src/netdev.hpp
+index 064b340..47d39a1 100644
+--- a/src/netdev.hpp
++++ b/src/netdev.hpp
+@@ -11,8 +11,19 @@
+
+ namespace fs = std::filesystem;
+
+-class SmbShare
++class NetDevShare
+ {
++ public:
++ NetDevShare(const fs::path& mountDir) : mountDir(mountDir)
++ {
++ }
++ ~NetDevShare() = default;
++
++ virtual const char* getMountType() const = 0;
++
++ virtual bool mount(const fs::path& remote, bool rw,
++ const std::unique_ptr<utils::CredentialsProvider>& credentials) = 0;
++
+ protected:
+ std::string mountDir;
+
+@@ -21,14 +32,23 @@ class SmbShare
+ {
+ return username.find(',') == std::string::npos;
+ }
++};
+
++class SmbShare : public NetDevShare
++{
++ static constexpr const char* mountType = "cifs";
+ public:
+- SmbShare(const fs::path& mountDir) : mountDir(mountDir)
++ SmbShare(const fs::path& mountDir) : NetDevShare(mountDir)
++ {
++ }
++
++ virtual const char* getMountType() const override
+ {
++ return mountType;
+ }
+
+ bool mount(const fs::path& remote, bool rw,
+- const std::unique_ptr<utils::CredentialsProvider>& credentials)
++ const std::unique_ptr<utils::CredentialsProvider>& credentials) override
+ {
+ LogMsg(Logger::Debug, "Trying to mount remote : ", remote);
+
+@@ -82,7 +102,7 @@ class SmbShare
+ {
+ options += "," + version;
+
+- auto ec = ::mount(remote.c_str(), mountDir.c_str(), "cifs", 0,
++ auto ec = ::mount(remote.c_str(), mountDir.c_str(), mountType, 0,
+ options.c_str());
+ utils::secureCleanup(options);
+
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch
new file mode 100644
index 0000000000..a3a64087b8
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0012-virtual-media.3-Add-NfsShare-based-on-NetDevShare.patch
@@ -0,0 +1,87 @@
+From 190e85aaf6cfa553ce31467a7ef57a1ae13305a5 Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 09:46:43 +0300
+Subject: [PATCH 12/20] virtual-media.3: Add: "NfsShare", based on
+ "NetDevShare"
+
+---
+ src/netdev.hpp | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 66 insertions(+)
+
+diff --git a/src/netdev.hpp b/src/netdev.hpp
+index 47d39a1..fc1b907 100644
+--- a/src/netdev.hpp
++++ b/src/netdev.hpp
+@@ -115,3 +115,69 @@ class SmbShare : public NetDevShare
+ return ec;
+ }
+ };
++
++class NfsShare final: public NetDevShare
++{
++ static constexpr const char* mountType = "nfs";
++ public:
++ explicit NfsShare(const fs::path& mountDir): NetDevShare(mountDir)
++ {
++ }
++
++ virtual const char* getMountType() const override
++ {
++ return mountType;
++ }
++
++ bool mount(const fs::path& remote, bool rw,
++ const std::unique_ptr<utils::CredentialsProvider>& credentials) override
++ {
++ LogMsg(Logger::Debug, "Trying to mount remote : ", remote);
++
++ try {
++ auto mountUri = parseMountUri(remote);
++ const std::string params = "nolock";
++ const std::string& mountAddress = mountUri.first;
++ const std::string& mountPath = mountUri.second;
++ auto options = params + ",addr=" + mountAddress;
++
++ LogMsg(Logger::Debug, "Mounting URI: ", mountPath);
++ LogMsg(Logger::Debug, "With options: ", options);
++
++ auto ec = ::mount((":" + mountPath).c_str(), mountDir.c_str(),
++ mountType, 0, options.c_str());
++ utils::secureCleanup(options);
++
++ if (ec)
++ {
++ LogMsg(Logger::Error, "Mount failed with ec = ", ec,
++ " errno = ", errno);
++ return false;
++ }
++ } catch (const std::exception& ex) {
++
++ LogMsg(Logger::Error, "Mount failed: ", ex.what());
++ return false;
++ }
++ return true;
++ }
++ private:
++ using MountAddress = std::string;
++ using MountPath = std::string;
++
++ static std::pair<MountAddress, MountPath> parseMountUri(const std::string uri)
++ {
++ // All paths start with '//', so seek a cursor to the 2 positions
++ // forward.
++ constexpr unsigned char startAddressPos = 2U;
++ auto hostnameEndPos = uri.find('/', startAddressPos);
++ if (hostnameEndPos == std::string::npos) {
++ throw std::invalid_argument("Mount Uri");
++ }
++ return {
++ uri.substr(startAddressPos, hostnameEndPos - startAddressPos),
++ uri.substr(hostnameEndPos),
++ };
++ }
++
++};
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch
new file mode 100644
index 0000000000..a94ced515f
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0013-virtual-media.3-Upd-Apply-NetDevShare-devices-CifsSh.patch
@@ -0,0 +1,101 @@
+From 740679a451f361b83f9604d238f02ef95aefd01e Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 10:02:29 +0300
+Subject: [PATCH 13/20] virtual-media.3: Upd: Apply "NetDevShare" devices
+ ("CifsShare" and "NfsShare")
+
+---
+ src/resources.hpp | 9 +++++----
+ src/state/activating_state.cpp | 11 ++++++++---
+ src/state/activating_state.hpp | 1 +
+ 3 files changed, 14 insertions(+), 7 deletions(-)
+
+diff --git a/src/resources.hpp b/src/resources.hpp
+index e307955..f300308 100644
+--- a/src/resources.hpp
++++ b/src/resources.hpp
+@@ -1,6 +1,6 @@
+ #pragma once
+
+-#include "smb.hpp"
++#include "netdev.hpp"
+ #include "system.hpp"
+
+ namespace interfaces
+@@ -74,15 +74,16 @@ class Mount
+ Mount& operator=(Mount&& other) = delete;
+
+ explicit Mount(
+- std::unique_ptr<Directory> directory, SmbShare& smb,
++ std::unique_ptr<Directory> directory, NetDevShare& netDevShare,
+ const std::filesystem::path& remote, bool rw,
+ const std::unique_ptr<utils::CredentialsProvider>& credentials) :
+ directory(std::move(directory))
+ {
+- if (!smb.mount(remote, rw, credentials))
++ if (!netDevShare.mount(remote, rw, credentials))
+ {
+ throw Error(std::errc::invalid_argument,
+- "Failed to mount CIFS share");
++ (std::stringstream("Failed to mount ")
++ << netDevShare.getMountType() << " share").str());
+ }
+ }
+
+diff --git a/src/state/activating_state.cpp b/src/state/activating_state.cpp
+index f926547..e50d284 100644
+--- a/src/state/activating_state.cpp
++++ b/src/state/activating_state.cpp
+@@ -143,13 +143,18 @@ std::unique_ptr<BasicState> ActivatingState::activateLegacyMode()
+ }
+
+ std::unique_ptr<BasicState> ActivatingState::mountSmbShare()
++{
++ return mountNetDevShare([](const fs::path& mountDir){ return std::make_unique<SmbShare>(mountDir); });
++}
++
++std::unique_ptr<BasicState> ActivatingState::mountNetDevShare(const std::function<std::unique_ptr<NetDevShare>(const fs::path&)>& netDevShareCreator)
+ {
+ try
+ {
+ auto mountDir =
+ std::make_unique<resource::Directory>(machine.getName());
+
+- SmbShare smb(mountDir->getPath());
++ std::unique_ptr<NetDevShare> netDevShare = netDevShareCreator(mountDir->getPath());
+ fs::path remote = getImagePath(machine.getTarget()->imgUrl);
+ auto remoteParent = "/" + remote.parent_path().string();
+ auto localFile = mountDir->getPath() / remote.filename();
+@@ -159,7 +164,7 @@ std::unique_ptr<BasicState> ActivatingState::mountSmbShare()
+ "\n Local file: ", localFile);
+
+ machine.getTarget()->mountPoint = std::make_unique<resource::Mount>(
+- std::move(mountDir), smb, remoteParent, machine.getTarget()->rw,
++ std::move(mountDir), *netDevShare, remoteParent, machine.getTarget()->rw,
+ machine.getTarget()->credentials);
+
+ process = spawnNbdKit(machine, localFile);
+@@ -195,7 +200,7 @@ std::unique_ptr<BasicState> ActivatingState::mountFtpShare()
+
+ std::unique_ptr<BasicState> ActivatingState::mountNfsShare()
+ {
+- return mountXxxShare("NFS");
++ return mountNetDevShare([](const fs::path& mountDir){ return std::make_unique<NfsShare>(mountDir); });
+ }
+
+ std::unique_ptr<BasicState> ActivatingState::mountXxxShare(const char* pMountType)
+diff --git a/src/state/activating_state.hpp b/src/state/activating_state.hpp
+index affca24..1dca7aa 100644
+--- a/src/state/activating_state.hpp
++++ b/src/state/activating_state.hpp
+@@ -30,6 +30,7 @@ struct ActivatingState : public BasicStateT<ActivatingState>
+ std::unique_ptr<BasicState> mountFtpShare();
+ std::unique_ptr<BasicState> mountNfsShare();
+ std::unique_ptr<BasicState> mountXxxShare(const char* pMountType);
++ std::unique_ptr<BasicState> mountNetDevShare(const std::function<std::unique_ptr<NetDevShare>(const fs::path&)>& netDevShareCreator);
+
+ static std::unique_ptr<resource::Process>
+ spawnNbdKit(interfaces::MountPointStateMachine& machine,
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch
new file mode 100644
index 0000000000..d52a8d4afd
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0014-virtual-media.1-Upd-Use-usb-ctrl-instead-of-sysfs-.-.patch
@@ -0,0 +1,264 @@
+From c367cf3c1b092ad00ee4865b2f470169ef65c74e Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Mon, 20 Jun 2022 18:36:59 +0300
+Subject: [PATCH 14/20] virtual-media.1: Upd: Use "usb-ctrl" instead of
+ "sysfs". Add: machine.target.type
+
+---
+ src/interfaces/mount_point_state_machine.hpp | 1 +
+ src/resources.cpp | 2 +
+ src/state/initial_state.hpp | 20 +++-
+ src/system.hpp | 120 ++++++++++---------
+ 4 files changed, 86 insertions(+), 57 deletions(-)
+
+diff --git a/src/interfaces/mount_point_state_machine.hpp b/src/interfaces/mount_point_state_machine.hpp
+index c4b4391..b023b63 100644
+--- a/src/interfaces/mount_point_state_machine.hpp
++++ b/src/interfaces/mount_point_state_machine.hpp
+@@ -16,6 +16,7 @@ struct MountPointStateMachine
+ {
+ std::string imgUrl;
+ bool rw;
++ UsbGadget::InterfaceType type;
+ std::unique_ptr<resource::Mount> mountPoint;
+ std::unique_ptr<utils::CredentialsProvider> credentials;
+ };
+diff --git a/src/resources.cpp b/src/resources.cpp
+index a501bba..950f698 100644
+--- a/src/resources.cpp
++++ b/src/resources.cpp
+@@ -23,6 +23,8 @@ Gadget::Gadget(interfaces::MountPointStateMachine& machine,
+ {
+ status = UsbGadget::configure(
+ std::string(machine.getName()), machine.getConfig().nbdDevice, devState,
++ machine.getTarget() ? machine.getTarget()->type
++ : UsbGadget::interfaceTypeUSB,
+ machine.getTarget() ? machine.getTarget()->rw : false);
+ }
+
+diff --git a/src/state/initial_state.hpp b/src/state/initial_state.hpp
+index 0e8876a..e0d8a5d 100644
+--- a/src/state/initial_state.hpp
++++ b/src/state/initial_state.hpp
+@@ -153,6 +153,21 @@ struct InitialState : public BasicStateT<InitialState>
+ machine.getConfig().nbdDevice.to_string());
+ iface->register_property("EndpointId", machine.getConfig().endPointId);
+ iface->register_property("Socket", machine.getConfig().unixSocket);
++ iface->register_property(
++ "InterfaceType", static_cast<uint8_t>(UsbGadget::interfaceTypeUSB),
++ [](uint8_t, uint8_t) -> bool {
++ throw sdbusplus::exception::SdBusError(
++ EPERM, "Setting InterfaceType property is not allowed");
++ return false;
++ },
++ [&target = machine.getTarget()](
++ uint8_t) -> uint8_t {
++ if (!target.has_value())
++ {
++ return UsbGadget::interfaceTypeUSB;
++ }
++ return target->type;
++ });
+ iface->register_property(
+ "ImageURL", std::string(),
+ []([[maybe_unused]] const std::string& req,
+@@ -234,12 +249,15 @@ struct InitialState : public BasicStateT<InitialState>
+ iface->register_method(
+ "Mount", [&machine = machine](boost::asio::yield_context yield,
+ std::string imgUrl, bool rw,
++ uint8_t type,
+ optional_fd fd) {
+ LogMsg(Logger::Info, "[App]: Mount called on ",
+ getObjectPath(machine), machine.getName());
+
+ interfaces::MountPointStateMachine::Target target = {
+- imgUrl, rw, nullptr, nullptr};
++ imgUrl, rw,
++ static_cast<UsbGadget::InterfaceType>(type),
++ nullptr, nullptr};
+
+ if (std::holds_alternative<unix_fd>(fd))
+ {
+diff --git a/src/system.hpp b/src/system.hpp
+index d0af549..5dfb4df 100644
+--- a/src/system.hpp
++++ b/src/system.hpp
+@@ -498,24 +498,48 @@ struct UsbGadget : private FsHelper
+ static const std::string getGadgetDirPrefix()
+ {
+ const std::string gadgetDirPrefix =
+- "/sys/kernel/config/usb_gadget/mass-storage-";
++ "/sys/kernel/config/usb_gadget/";
+ return gadgetDirPrefix;
+ }
+
+ public:
++ enum InterfaceType : uint8_t
++ {
++ interfaceTypeUSB = 0,
++ interfaceTypeHDD = 1,
++ interfaceTypeCDROM = 2,
++ unknown = 0xFF
++ };
++
+ static int32_t configure(const std::string& name, const NBDDevice& nbd,
+- StateChange change, const bool rw = false)
++ StateChange change,
++ InterfaceType interfaceType = interfaceTypeUSB,
++ const bool rw = false)
+ {
+- return configure(name, nbd.to_path(), change, rw);
++ return configure(name, nbd.to_path(), change, interfaceType, rw);
+ }
+
+ static int32_t configure(const std::string& name, const fs::path& path,
+- StateChange change, const bool rw = false)
++ StateChange change,
++ InterfaceType interfaceType = interfaceTypeUSB,
++ const bool rw = false)
+ {
+ LogMsg(Logger::Info, "[App]: Configure USB Gadget (name=", name,
+ ", path=", path, ", State=", static_cast<uint32_t>(change), ")");
+ bool success = true;
+- std::error_code ec;
++ static const std::map<uint8_t, std::string> vmInterfaces {
++ {interfaceTypeUSB, "usb"},
++ {interfaceTypeHDD, "hdd"},
++ {interfaceTypeCDROM, "cdrom"},
++ };
++ auto interfaceIt = vmInterfaces.find(interfaceType);
++ if (interfaceIt == vmInterfaces.end())
++ {
++ LogMsg(Logger::Critical,
++ "[App]: Spiecifed unknown interface type: ", interfaceType);
++ return -1;
++ }
++
+ if (change == StateChange::unknown)
+ {
+ LogMsg(Logger::Critical,
+@@ -523,50 +547,35 @@ struct UsbGadget : private FsHelper
+ return -1;
+ }
+
+- const fs::path gadgetDir = getGadgetDirPrefix() + name;
+- const fs::path funcMassStorageDir =
+- gadgetDir / "functions/mass_storage.usb0";
+- const fs::path stringsDir = gadgetDir / "strings/0x409";
+- const fs::path configDir = gadgetDir / "configs/c.1";
+- const fs::path massStorageDir = configDir / "mass_storage.usb0";
+- const fs::path configStringsDir = configDir / "strings/0x409";
+-
+ if (change == StateChange::inserted)
+ {
++ const std::string roConfPath = "/sys/kernel/config/usb_gadget/" +
++ name + "/functions/mass_storage." +
++ name + "/lun.0/ro";
++ // /usr/bin/usb-ctrl insert <name> <file> [<type=usb|usb-ro|hdd|cdrom>]
+ try
+ {
+- fs::create_directories(gadgetDir);
+- echoToFile(gadgetDir / "idVendor", "0x1d6b");
+- echoToFile(gadgetDir / "idProduct", "0x0104");
+- fs::create_directories(stringsDir);
+- echoToFile(stringsDir / "manufacturer", "OpenBMC");
+- echoToFile(stringsDir / "product", "Virtual Media Device");
+- fs::create_directories(configStringsDir);
+- echoToFile(configStringsDir / "configuration", "config 1");
+- fs::create_directories(funcMassStorageDir);
+- fs::create_directories(funcMassStorageDir / "lun.0");
+- fs::create_directory_symlink(funcMassStorageDir,
+- massStorageDir);
+- echoToFile(funcMassStorageDir / "lun.0/removable", "1");
+- echoToFile(funcMassStorageDir / "lun.0/ro", rw ? "0" : "1");
+- echoToFile(funcMassStorageDir / "lun.0/cdrom", "0");
+- echoToFile(funcMassStorageDir / "lun.0/file", path);
+-
+- for (const auto& port : fs::directory_iterator(
+- "/sys/bus/platform/devices/1e6a0000.usb-vhub"))
++ std::vector<std::string> args{
++ "insert",
++ name,
++ path,
++ interfaceIt->second,
++ };
++ if (!rw)
+ {
+- if (fs::is_directory(port) && !fs::is_symlink(port) &&
+- !fs::exists(port.path() / "gadget/suspended"))
+- {
+- const std::string portId = port.path().filename();
+- LogMsg(Logger::Debug,
+- "Use port : ", port.path().filename());
+- echoToFile(gadgetDir / "UDC", portId);
+- return 0;
+- }
++ args.emplace_back("readonly");
+ }
++ auto child = boost::process::child(
++ "/usr/bin/usb-ctrl", boost::process::args(args));
++ child.wait();
++
++ LogMsg(Logger::Debug, "Success of 'usb-ctrl insert ",
++ name.c_str(), " ", path.c_str(), " ",
++ interfaceIt->second.c_str(),
++ "': ", std::strerror(child.exit_code()));
++ return 0;
+ }
+- catch (fs::filesystem_error& e)
++ catch (boost::process::process_error& e)
+ {
+ // Got error perform cleanup
+ LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what());
+@@ -574,7 +583,6 @@ struct UsbGadget : private FsHelper
+ }
+ catch (std::ofstream::failure& e)
+ {
+- // Got error perform cleanup
+ LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what());
+ success = false;
+ }
+@@ -582,19 +590,18 @@ struct UsbGadget : private FsHelper
+ // StateChange: unknown, notMonitored, inserted were handler
+ // earlier. We'll get here only for removed, or cleanup
+
+- echoToFile(gadgetDir / "UDC", "");
+- const std::array<const char*, 6> dirs = {
+- massStorageDir.c_str(), funcMassStorageDir.c_str(),
+- configStringsDir.c_str(), configDir.c_str(),
+- stringsDir.c_str(), gadgetDir.c_str()};
+- for (const char* dir : dirs)
++ // /usr/bin/usb-ctrl eject <name>
++ try
+ {
+- fs::remove(dir, ec);
+- if (ec)
+- {
+- success = false;
+- LogMsg(Logger::Error, "[App]: UsbGadget ", ec.message());
+- }
++ auto result = boost::process::system(
++ "/usr/bin/usb-ctrl", "eject", name.c_str());
++ LogMsg(Logger::Debug, "Success of 'usb-ctrl eject ", name.c_str(),
++ "': ", std::strerror(result));
++ }
++ catch (boost::process::process_error& e)
++ {
++ LogMsg(Logger::Error, "[App]: UsbGadget: ", e.what());
++ success = false;
+ }
+
+ if (success)
+@@ -607,7 +614,8 @@ struct UsbGadget : private FsHelper
+ static std::optional<std::string> getStats(const std::string& name)
+ {
+ const fs::path statsPath = getGadgetDirPrefix() + name +
+- "/functions/mass_storage.usb0/lun.0/stats";
++ "/functions/mass_storage." + name +
++ "/lun.0/stats";
+
+ std::ifstream ifs(statsPath);
+ if (!ifs.is_open())
+--
+2.35.1
+
diff --git a/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch
new file mode 100644
index 0000000000..ae2bc7d5dd
--- /dev/null
+++ b/meta-ibs/meta-cp2-5422/recipes-phosphor/virtual-media/virtual-media/0015-virtual-media.1-Fix-Use-usb-ctrl-cdrom-is-pre-config.patch
@@ -0,0 +1,159 @@
+From c7755195ee7107a72bf40ad3101079f94cf015ae Mon Sep 17 00:00:00 2001
+From: Alexandr Ilenko <AIlenko@IBS.RU>
+Date: Fri, 24 Jun 2022 17:15:54 +0300
+Subject: [PATCH 15/20] virtual-media.1: Fix: Use "usb-ctrl" ("cdrom" is
+ pre-configured).
+
+---
+ src/configuration.hpp | 18 ++++++++++++++++++
+ src/state/initial_state.hpp | 31 ++++++++++++++++++++++++++++++-
+ src/system.hpp | 3 ---
+ virtual-media.json | 12 ++++++++----
+ 4 files changed, 56 insertions(+), 8 deletions(-)
+
+diff --git a/src/configuration.hpp b/src/configuration.hpp
+index efdddf2..0a713a5 100644
+--- a/src/configuration.hpp
++++ b/src/configuration.hpp
+@@ -36,6 +36,7 @@ class Configuration
+ static constexpr int defaultTimeout = 30;
+
+ NBDDevice nbdDevice;
++ std::string interfaceType;
+ std::string unixSocket;
+ std::string endPointId;
+ std::optional<int> timeout;
+@@ -142,6 +143,23 @@ class Configuration
+ continue;
+ }
+ };
++ const auto interfaceTypeIter =
++ mountpoint.value().find("InterfaceType");
++ if (interfaceTypeIter != mountpoint.value().cend())
++ {
++ const std::string* value =
++ interfaceTypeIter->get_ptr<const std::string*>();
++ if (value)
++ {
++ mp.interfaceType = *value;
++ }
++ else
++ {
++ LogMsg(Logger::Error,
++ "InterfaceType required, not set");
++ continue;
++ }
++ }
+ const auto unixSocketIter =
+ mountpoint.value().find("UnixSocket");
+ if (unixSocketIter != mountpoint.value().cend())
+diff --git a/src/state/initial_state.hpp b/src/state/initial_state.hpp
+index e0d8a5d..7f25fc7 100644
+--- a/src/state/initial_state.hpp
++++ b/src/state/initial_state.hpp
+@@ -249,11 +249,40 @@ struct InitialState : public BasicStateT<InitialState>
+ iface->register_method(
+ "Mount", [&machine = machine](boost::asio::yield_context yield,
+ std::string imgUrl, bool rw,
+- uint8_t type,
++ // This new argument requires 3-repos to be updated:
++ // uint8_t type,
++ // Let`s use original way:
++ // cdrom-type is pre-configured hardly
+ optional_fd fd) {
+ LogMsg(Logger::Info, "[App]: Mount called on ",
+ getObjectPath(machine), machine.getName());
+
++ uint8_t type = UsbGadget::interfaceTypeUSB;
++ // TODO: extract id<=>string mapping to proper place
++ static const std::map<std::string, uint8_t> vmInterfaces {
++ {"usb" , UsbGadget::interfaceTypeUSB, },
++ {"hdd" , UsbGadget::interfaceTypeHDD, },
++ {"cdrom", UsbGadget::interfaceTypeCDROM, },
++ };
++ const auto& interfaceTypeStr = machine.getConfig().interfaceType;
++ auto interfaceIt = vmInterfaces.find(interfaceTypeStr);
++ if (interfaceIt == vmInterfaces.end())
++ {
++ LogMsg(Logger::Error,
++ "[App]: Spiecifed unknown interface type: ", interfaceTypeStr);
++ interfaceIt = vmInterfaces.begin();
++ LogMsg(Logger::Warning,
++ "[App]: Forcly apply interface type: ", interfaceIt->first);
++ }
++ type = interfaceIt->second;
++
++ if (type == UsbGadget::interfaceTypeCDROM && rw)
++ {
++ LogMsg(Logger::Warning,
++ "[App]: Forcly apply read-only for cdrom: ");
++ rw = false;
++ }
++
+ interfaces::MountPointStateMachine::Target target = {
+ imgUrl, rw,
+ static_cast<UsbGadget::InterfaceType>(type),
+diff --git a/src/system.hpp b/src/system.hpp
+index 5dfb4df..33e3363 100644
+--- a/src/system.hpp
++++ b/src/system.hpp
+@@ -549,9 +549,6 @@ struct UsbGadget : private FsHelper
+
+ if (change == StateChange::inserted)
+ {
+- const std::string roConfPath = "/sys/kernel/config/usb_gadget/" +
+- name + "/functions/mass_storage." +
+- name + "/lun.0/ro";
+ // /usr/bin/usb-ctrl insert <name> <file> [<type=usb|usb-ro|hdd|cdrom>]
+ try
+ {
+diff --git a/virtual-media.json b/virtual-media.json
+index 79615c9..6d035f1 100644
+--- a/virtual-media.json
++++ b/virtual-media.json
+@@ -1,34 +1,38 @@
+ {
+ "InactivityTimeout": 1800,
+ "MountPoints": {
+- "USB0": {
++ "ISO0": {
+ "EndpointId": "/nbd/0",
+ "Mode": 0,
+ "NBDDevice": "nbd0",
++ "InterfaceType": "cdrom",
+ "UnixSocket": "/run/virtual-media/nbd0.sock",
+ "Timeout": 30,
+ "BlockSize": 512
+ },
+- "USB1": {
++ "USB0": {
+ "EndpointId": "/nbd/1",
+ "Mode": 0,
+ "NBDDevice": "nbd1",
++ "InterfaceType": "usb",
+ "UnixSocket": "/run/virtual-media/nbd1.sock",
+ "Timeout": 30,
+ "BlockSize": 512
+ },
+- "USB2": {
++ "ISO1": {
+ "EndpointId": "",
+ "Mode": 1,
+ "NBDDevice": "nbd2",
++ "InterfaceType": "cdrom",
+ "UnixSocket": "/run/virtual-media/nbd2.sock",
+ "Timeout": 90,
+ "BlockSize": 512
+ },
+- "USB3": {
++ "USB1": {
+ "EndpointId": "",
+ "Mode": 1,
+ "NBDDevice": "nbd3",
++ "InterfaceType": "usb",
+ "UnixSocket": "/run/virtual-media/nbd3.sock",
+ "Timeout": 90,
+ "BlockSize": 512
+--
+2.35.1
+