On some RHEL 10.1 installs users are running into this error, post-install, when attempting to install packages via dnf.
Unsure if the issue is isolated to users attempting to install RHEL via the full DVD ISO, from the minimal boot ISO, and users deploying RHEL 10.1 via kickstart.
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
The GPG keys listed for the "Red Hat Enterprise Linux 10 for x86_64 - AppStream (RPMs)" repository are already installed but they are not correct for this package.
Check that the correct key URLs are configured for this repository.. Failing package is: gnupg2-smime-2.4.5-3.el10_1.x86_64
GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
The downloaded packages were saved in cache until the next successful transaction.
You can remove cached packages by executing 'yum clean packages'.
Error: GPG check FAILED
I am currently aware of two workaround, one manual, one much more simple. Details below
Workaround #1 (Simple)
Use dnf to install new GPG keys used via dnf
$ sudo dnf update redhat-release
After doing so you should run the following
$ sudo dnf clean all
You should now be able to update RHEL and install additional RPMs.
Workaround #2 (manual)
You can delete the current key in “/etc/pki/rpm-gpg”
Delete the following
RPM-GPG-KEY-redhat-release
RPM-GPG-KEY-redhat-beta (if applicable)
Then SCP known working copies of the keys that you just deleted from a RHEL 10.1 host that is not experiencing this issue. I would suspect an earlier build of RHEL 10.1 or possibly a later build or RHEL 10.1 once available will not experience this issue.
The shift from srvadmin (OMSA) to iSM (iDRAC Service Module) marks the end of bloated, “in-band” server management. This occurred between Dell 12th gen and Dell 13th gen server.
If you have a 12th Gen Dell Server, you can still leverage Dell srvadmin (Idrac 7). I wrote a post on it here.
While OMSA ran as a heavy suite of services directly on the host, the modern dcism acts as a lightweight bridge that offloads the heavy lifting to the dedicated iDRAC hardware.
For RHEL 10 users, this transition is no longer optional but necessary, trading the aging omreport ecosystem for a more secure, stable, and kernel-friendly management experience.
So in this post we are going to go through the install of DISM (Dell IDRAC Service Module), on RHEL 10, running on a Dell R730.
Set Up the Dell Repository
First we need to setup the official Dell System Update (DSU) utility. Install Dell GPG keys when prompted.
You can generate a full hardware diagnostic bundle directly from the (TSR).
Note that the used Dell R730 that I just purchased on Ebay is actually under hardware support till October of 2026 – so if I need on-site hardware support a Dell technician will be dispatched to my house. I will provide snacks and a static strap.
Since omreport storage is gone, use racadm. With the iSM bridge active, Local RACADM is now your primary interface for your raid controller
racadm storage get pdisks
racadm storage get vdisks
racadm storage get controllers
The “Full Power Cycle” (The “Cold Boot” Tool) – Flea Power Drain
On an R730, if you have a hardware component acting up (like a hung NIC), a standard OS reboot often isn’t enough because the motherboard stays powered.
What it does: It tells the iDRAC to perform a “virtual” AC power pull. The server will shut down, the flea power will be drained, and it will cold-boot. This is a powerful feature to have in a remote RHEL 10 environment.
/opt/dell/srvadmin/iSM/bin/Invoke-FullPowerCycle
Real-Time “Tech Support Report” (TSR)
If you ever need to open a support ticket with Dell, they will ask for a TSR. Previously, you had to log into the iDRAC web UI and wait 10 minutes.
What it does: It triggers the iDRAC to gather every log, firmware version, and hardware event into a .zip file and saves it directly to the iDRAC (or can be pulled to the OS).
The racadm utility (which uses the iSM bridge) is the best way to see why your server has an amber light or a “System Health” warning.
View the System Event Log (SEL): This is the “Hardware Event Viewer.” It shows power supply failures, memory errors, and thermal trips.
/opt/dell/srvadmin/sbin/racadm getsel
Installing perccli
PERCCLI (PowerEdge RAID Controller Command Line Interface) is the specialized successor to the older MegaCLI tool. While RACADM is great for general server health, PERCCLI is the “surgical tool” specifically for your RAID controller (like the H730 in your R730).
Install as shown below
dnf -y install perccli.noarch
Now you can show all controllers
/opt/MegaRAID/perccli/perccli64 show
Show events.
/opt/MegaRAID/perccli/perccli64 /c0 show eventloginfo
Show all disks
/opt/MegaRAID/perccli/perccli64 /c0/eall/sall show
Epilogue
So in a nutshell. Dell srvadmin was replaced with DISM starting on Dell 13th gen servers. You have a couple powerful commands at your disposal with a ton of various ways to run both of them.
Also available is perccli, which is also a nice tool on its own.
Dell OpenManage Server Administrator (OMSA) is Dell’s on-host hardware management and monitoring framework for PowerEdge servers.
It runs inside the operating system and provides direct visibility into system hardware such as RAID controllers, physical and virtual disks, power supplies, fans, temperatures, memory, processors, and chassis health.
OMSA communicates with the server’s iDRAC and hardware controllers to retrieve real-time status and exposes this information through command-line tools like omreport, optional web interfaces, and SNMP for monitoring systems.
It is primarily used for hardware diagnostics, RAID and storage monitoring, fault detection, and health reporting, allowing administrators to verify system integrity and troubleshoot hardware issues without leaving the operating system.
So now that we have an idea of what it is, lets install it.
Note: Our system under test is a Dell R720. I probably should have lead with that.
Installation
First you will need to download the bootstrap script as shown below.
Provides shared libraries and backend support for other OMSA components
⚠️ Usually
Required by other OMSA components; often left disabled unless needed
dsm_sa_datamgrd
Systems Management Data Manager
Collects and maintains hardware inventory and system data
✅ Yes
Required for hardware monitoring (disks, temps, fans, etc.)
dsm_sa_eventmgrd
Systems Management Event Manager
Handles hardware events, alerts, and logs
✅ Yes
Required for alerts and log reporting
dsm_sa_snmpd
OMSA SNMP Agent
Provides SNMP interface for monitoring tools (LibreNMS, Zabbix, etc.)
⚠️ Optional
Needed only if using SNMP monitoring
Service Review
Now let’s review each service in detail, and see how we can leverage each one.
dsm_om_connsvc
First we need to ensure our Firewall allows this traffic. So run the commands below (RHEL), ubuntu may use ufw.
# firewall-cmd --permanent --add-port=1311/tcp
# firewall-cmd --reload
Now in your web browser, navigate to https://viper.lab:1311/ (Note https, and change host name accordingly).
Similar in appearance to the Idrac – you can find system information here, some of which does not appear in the Idrac itself. Everything is read-only.
dsm_om_shrsvc
(OMSA Shared Services) is a supporting service, not a management interface or monitoring agent.
It provides:
Shared libraries
Inter-process communication
Authentication helpers
Common backend utilities
These are required by other OMSA components to function correctly. So nothing really to see here.
dsm_sa_datamgrd.service
This is the service that collects all the data that is displayed in the WebUI (port 1311)
dsm_sa_eventmgrd.service
dsm_sa_snmpd.service is the OMSA component responsible for exposing Dell hardware monitoring data to external systems using the SNMP protocol.
This service does not collect or analyze hardware information itself; instead, it serves as the communication layer that allows remote systems to query or receive notifications about server health. When enabled, it allows OMSA to participate in centralized monitoring environments and enterprise alerting workflows, making it essential in environments where hardware status must be visible outside the server itself.
This service relies entirely on the existing system SNMP configuration, so no need to modify anything if you already have snmp configured and running with your specfic community string.
dsm_sa_snmpd.service
dsm_sa_snmpd.service is the OMSA component responsible for exposing Dell hardware monitoring data to external systems using the SNMP protocol.
It acts as the interface between the data collected internally by OMSA and third-party monitoring platforms such as LibreNMS, Zabbix, or Nagios.
This service does not collect or analyze hardware information itself; instead, it serves as the communication layer that allows remote systems to query or receive notifications about server health. When enabled, it allows OMSA to participate in centralized monitoring environments and enterprise alerting workflows, making it essential in environments where hardware status must be visible outside the server itself.
dsm_sa_snmpd.service acts as the Dell OMSA integration layer between the server’s hardware telemetry and the system’s SNMP stack, allowing Dell-specific health, storage, and sensor data to be exposed through standard SNMP queries.
It does not replace or conflict with existing monitoring agents such as Zabbix or LibreNMS (which I am using) Instead, it complements them by extending the SNMP data they can read
dsm_sa_snmpd provides access to Dell-specific MIBs that Zabbix Agent and LibreNMS Agent (or any other agent you may use) can query via the system’s SNMP daemon.
Basically, dsm_sa_snmpd is the bridge that exposes OMSA’s hardware awareness to your existing monitoring stack. Note that if you are using Zabbix you will need to install additional templates. For example, this one, note that I have not tried it yet.
Ompreport
Omreport is the command-line interface (CLI) frontend for OMSA. It queries the OMSA backend services and formats the results for humans or scripts
Note we have to use the absolute path to run this as the working dir is not in our $PATH.
/opt/dell/srvadmin/sbin/omreport system summary
If you want to add to your $PATH, run the command below
echo 'export PATH=$PATH:/opt/dell/srvadmin/sbin' | sudo tee /etc/profile.d/dell-omsa.sh
source /etc/profile
Example usage below.
omreport system summary
omreport chassis temps
omreport chassis fans
omreport chassis power
Here is an example I found useful. For some reason my raid controller keeps throwing these errors which do not seem to go away despite the fact that both SAS cables are connected (tried switching them) and all disks are healthy.
# omreport system esmlog
Severity : Critical
Date and Time : Sat Jan 31 21:15:18 2026
Description : The storage BP1 SAS B cable is not connected, or is improperly connected.
Severity : Ok
Date and Time : Sat Jan 31 21:15:20 2026
Description : The chassis is closed while the power is off.
Severity : Critical
Date and Time : Sat Jan 31 21:15:21 2026
Description : The storage BP1 SAS A cable is not connected, or is improperly connected.
Enter omconfig.
omconfig
omconfig is the configuration and control interface for Dell OpenManage Server Administrator (OMSA).
Unlike omreport, which is strictly read-only, omconfig is used to change system and OMSA behavior—including alerting, storage actions, and certain hardware-related settings exposed by OMSA.
Omconfig It operates by issuing commands to the OMSA backend services (primarily dsm_sa_datamgrd and dsm_sa_eventmgrd) and applying those changes at the software management layer, not directly to hardware firmware.
Common uses include enabling or disabling alert actions, configuring storage-related behavior, managing notification settings, and triggering maintenance operations such as consistency checks. Because omconfig can modify system behavior and suppress alerts, it should be used carefully—especially on production systems—and is best suited for controlled configuration changes rather than routine monitoring.
Because omconfig can modify system behavior and suppress alerts, it should be used carefully—especially on production systems—and is best suited for controlled configuration changes rather than routine monitoring.
So back to my two SAS cable alerts. Lets leverage omreport and omconfig to diagnose and hopefully ether determine that there is an actual issue, or suppress the alerts.
OMCONFIG and OMREPORT – Real world Usage
First lets take a sneaky-peak at my raid controller.
omreport storage controller
Controller PERC H730 Adapter(Slot 4)
Controller
ID : 0
Status : Ok
Name : PERC H730 Adapter
Slot ID : PCIe Slot 4
State : Ready
Firmware Version : 25.5.9.0001
-----truncated---
According to chatgpt I am getting these errors because the system expects that I have an external enclosure connected. I do not think that is the case, as that seems dumb. More than likely this alert is due to the fact that I am using an H730 (a 13G controller) (and its cables) in an R720 (a 12G server) in Slot 4, which is a PCIe Adapter and not the integrated “mini” version.
So let’s look at the disks and make sure all is well
Here we can see that the PERC H730 adapter does not “See” the connector states as connected, rather just ready
omreport storage connector controller=0
List of Connector(s) on Controller PERC H730 Adapter (Slot 4)
ID : 0
Status : Ok
Name : Connector 0
State : Ready
Connector Type : SAS Port RAID Mode
Termination : Not Applicable
SCSI Rate : Not Applicable
ID : 1
Status : Ok
Name : Connector 1
State : Ready
Connector Type : SAS Port RAID Mode
Termination : Not Applicable
SCSI Rate : Not Applicable
In order to use this 13th gen raid controller in a 12th gen Dell Server I could not use the original SAS cables. Rather I used SFF-8087 to SFF-8643 cables Which can cause the sideband signals (SGPIO / SES) which tell the iDRAC everything is okay which is why we are seeing the errors.
As stated above this is not actually a problem as I can see my disks. Lets do that below.
In this post I will cover setting up a ntp/chrony server on Ubuntu 22.04 using a Satellite GPS Receiver. I have also recently published another post on Chrony, which goes a bit more into basic commands. That post can be found here.
Note: the GlobalSat BU-353-W11 does not support 1pps. It’s designed primarily for positioning and navigation, not precision timing. We can use it as our timesource for chrony, with a typical accuracy: ±50–150 ms. Good enough for a lab.
Hardware Detection
After plugging in the USB cable on the GNSS module, check for a new USB device.
# lsusb
Bus 001 Device 004: ID 1546:01a7 U-Blox AG [u-blox 7]
Output from dmegs also shows the device was detected properly
[347055.572498] usb 1-2.4: new full-speed USB device number 4 using tegra-xusb
[347055.768706] cdc_acm 1-2.4:1.0: ttyACM0: USB ACM device
[347055.768784] usbcore: registered new interface driver cdc_acm
[347055.768788] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
In the output above you can see the device was detected ttyACM0. Now we need to confirm how the device was enumerated. As you can see the device is owned by root and the group is dialout
# ls -l /dev/ttyACM*
crw-rw---- 1 root dialout 166, 0 Dec 29 13:40 /dev/ttyACM0
You can run a quick check to confirm that the device is functioning as shown below
To use a GPS/GNSS antenna with chronyd on Linux for time synchronization and location sharing, we will use the gpsd service to manage the GPS hardware and make its data accessible to other applications, including chronyd
Identify the GPS device: The device will likely be /dev/ttyUSB0, /dev/ttyACM0, or similar. You can verify this by running cat /dev/ttyUSB0 (replace ttyUSB0 with your suspected device) and looking for NMEA strings (lines starting with $GPGGA, $GNRMC, etc.).
Edit the gpsd configuration file: Open /etc/default/gpsd and set the DEVICES, GPSD_OPTIONS, and USBAUTO variables.
Fix:3D DGPS FIX – means the receiver has solved all three spatial dimensions: (Latitude, Longitude, Altitude)
Time is valid
Position accuracy: ~5–10 feet horizontal
Satellite Section (Right Pane)
Seen 13 / Used 11
This means:
The receiver can currently see 13 satellites
11 of those are strong enough to be used in the solution
This is quite a healthy signal for a device sitting inside up against a window.
Anything above:
4 used → valid 3D fix
8+ used → very solid geometry
10–12 used → excellent (we are here)
Constellations
GP = GPS
U.S. GPS constellation
Medium Earth Orbit (≈20,200 km)
~30 active satellites worldwide
SB = SBAS (WAAS corrections)
Satellite-Based Augmentation System
Broadcast correction data
Improve accuracy of GPS measurements
Do not provide independent position fixes
The presence of SBAS satellites indicates differential reminder data is available, improving accuracy.
Fix & Timing (Left Pane)
Fix State
Status: 3D DGPS FIX (1 secs)
3D = Latitude, longitude, altitude solved
DGPS = WAAS corrections applied
(1 secs) = Fix age (very fresh)
Time Quality
Time: 2025-12-29T20:32:22.000Z
Time offset: 0.078609772 s
Chrony
Install Chrony via apt
# apt install chrony -y
Configure Chrony
Edit /etc/chrony/chrony.conf. This config has been tested on Ubuntu 22.04, YMMV on other Linux versions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
After a few minutes, we should start to see pre-configured clients appear in the output of the command below
# chronyc clients
Hostname NTP Drop Int IntL Last Cmd Drop Int Last
=============================================================================
scar.lab 5 0 6 - 30 0 0 - -
Chrony Client-side Setup
Ubuntu Client
$ sudo apt install chrony -y
Configure the to listen to the chrony server address 10.1.10.10. Comment out any other server or pool directives in /etc/chrony/chrony.conf.
server 10.1.10.11
Start and enable the service.
$ sudo systemctl enable chrony --now
Check configured time source for chrony
$ chronyc -n sources -v
What the above output tells you
All NTP servers/pools configured for this client
Which source is currently selected
Reachability and time quality
Key indicators
Symbol
Meaning
^*
Current sync source
^+
Candidate source
^-
Reachable, not selected
^?
Unusable / not trusted yet
Cisco Catalyst Client Config
Use the commands below to configure your Cisco switch to use the new timesource
# Enter global configuration mode
configure terminal
# Define the NTP server
ntp server 10.1.10.11
# (Optional) Set the switch to use its own hardware clock if it loses sync
ntp master 10
# Exit and save
end
write memory
In my personal lab I do not have a network managed UPS. My rack mount UPS can only be monitored via USB from a directly connected host.
This guide details the installation and configuration of Network UPS Tools (NUT) to monitor a Tripp Lite USB PDU and prepare it for Zabbix integration.
Prerequisites & Installation
Install the necessary NUT packages. RHEL 10 uses the 2.8.x branch, which introduces an “instantiated” service model.
sudo dnf install nut nut-client nut-server
Directory Structure Setup
RHEL 10 defaults to /etc/ups, we will use /etc/nut to ensure our configuration files are in the correct location and we will create a symbolic link for legacy compatibility.
# Move config if it exists in the old /etc/ups locationsudo mkdir -p /etc/nutsudo mv /etc/ups/* /etc/nut/ 2>/dev/nullsudo ln -s /etc/nut /etc/ups
Configuration Files
The following files in /etc/nut/ must be configured:
nut.conf
Set the operation mode:
MODE=netserver
NUT (Network UPS Tools) Netserver Mode is a configuration where one machine (the server) connects to a UPS, monitors it, and then broadcasts the power status and alerts (like “on battery”) across the local network
ups.conf
Define the hardware driver. Note the exact spelling of the section name [tripplite].
[tripplite]
driver = usbhid-ups
port = auto
desc = "Tripp Lite USB PDU"
upsd.conf
Control network listening. To allow remote connections (like from a Zabbix server), you must listen on the host’s IP or all interfaces (0.0.0.0).
sudo udevadm control --reload-rules && sudo udevadm trigger
Firewall
You need to allow inbound port 3493 since we want to be able to poll the ups remotely from a Zabbix host.
# Open port 3493 permanently
sudo firewall-cmd --permanent --add-port=3493/tcp
sudo firewall-cmd --reload
Service Management
RHEL 10 uses a specific sequence. You must trigger the “enumerator” to generate the systemd units for your specific PDU name.
# Force the system to recognize the [tripplite] section
sudo /usr/libexec/nut-driver-enumerator.sh
# Enable and start the driver instance
sudo systemctl enable --now nut-driver@tripplite.service
# Start the data server and monitoring daemon
sudo systemctl enable --now nut-server.service
sudo systemctl enable --now nut-monitor.service
Manual Check Commands
Use these commands to verify health:
Command
Purpose
upsc -l
Lists all configured UPS/PDU devices.
upsc tripplite@localhost
Dumps all current PDU metrics (voltage, load, etc.).
systemctl status nut-driver@tripplite
Checks if the USB driver is active and running.
journalctl -u nut-driver@tripplite -f
Follow live logs if the USB connection drops.
Test Remotely
From another host, install the nut-client. If this step does not work, but the same commands worked locally, you should double check your Firewall settings.
$ sudo apt install nut-client
And test
$ upsc tripplite@10.1.10.21
Prepare the Zabbix Agent Permissions
To allow Zabbix to collect this data automatically. Run the two commands below on the host connected to UPS via USB
Lets create a simple template for zabbix. Follow the steps shown below.
Manual Item Creation
If you just want the most important metrics, go to your Host in Zabbix and create these Items:
Name
Type
Key
Type of Information
PDU Load
Zabbix Agent
nut.ups.value[tripplite,ups.load]
Numeric (float)
Input Voltage
Zabbix Agent
nut.ups.value[tripplite,input.voltage]
Numeric (float)
Battery Charge
Zabbix Agent
nut.ups.value[tripplite,battery.charge]
Numeric (float)
PDU Status
Zabbix Agent
nut.ups.value[tripplite,ups.status]
Character
Configuring SELinux
If you check the zabbix webui, you are going to see some failures, as we need to configure selinux.
Note that we configured Zabbix “items” first so that we would be able to capture the failures in the audit log and generate a policy.
So now that we have failures, we can tell RHEL to look at all recent security denials involving the zabbix_agent and write a “policy” that allows those specific actions.
# Search the audit log for zabbix-related denials and create a policy module
grep "zabbix" /var/log/audit/audit.log | audit2allow -M zabbix_nut_final
Install the Policy
The previous command created a file called zabbix_nut_final.pp. Now, load it into the kernel:
semodule -i zabbix_nut_final.pp
You should now see data returning in the Zabbix WebUI. You may need to wait a few second or re-run the check.
Chrony is a flexible and modern implementation of the Network Time Protocol (NTP). It is designed to synchronize the system clock with NTP servers, reference clocks, or manual input with high accuracy. It excels in environments where the connection to the time source is intermittent or when the system clock is frequently interrupted (such as virtual machines)
chrony officially replaced the traditional ntpd (NTP Daemon, provided by the legacy ntp package) as the default time synchronization service starting in RHEL 7.
Feature
Chrony (chronyd)
ntpd (Legacy)
Clock Correction
Slewing Only (Default): Adjusts the clock gradually and precisely. Can handle frequent clock interruptions without losing accuracy.
Slewing & Stepping: Slews for small adjustments but uses disruptive stepping (jumping the time) for large offsets, which can impact applications.
Start-Up Time
Fast: Uses makestep at startup to quickly correct large initial errors, then immediately begins slewing.
Slow: Waits for the clock to slowly adjust, often taking longer to achieve synchronization.
Network
Better for Intermittent Connections: Handles situations where the server connection is lost or the clock frequently changes (e.g., suspend/resume).
Requires Constant Connectivity: Struggles with intermittent network loss and frequent system time changes.
Resource Use
Low: Very small memory footprint and fewer CPU cycles required.
Moderate: Larger memory and CPU consumption.
Security
More Secure: Designed with security in mind, often running with fewer privileges.
Older Codebase: Has had more vulnerabilities over the years.
Chrony Basic Commands
Command
Purpose
Notes
chronyc sourcestats -v
Shows long-term source stability. Displays long-term statistics for each source, including clock drift and frequency estimation.
Useful for spotting an unstable NTP server or bad hardware clock.
chronyc clients
Shows who is using your server. If you are configured as an NTP server, this command lists the hosts that are currently querying you for time (requires the ntpserver directive in your config).
Useful for confirming if your NetApp LIF is actually reaching your RHEL box and making a request.
chronyc makestep
Forces an immediate time correction. If your clock is severely off (more than a few minutes), this commands the daemon to immediately jump the clock to the correct time, instead of gradually slewing it.
Use with Caution! Sudden time jumps can affect applications like databases.
chronyc ntpdata$IP
This performs a one-time query to the specified server, simulating how the client would communicate with it.
$IP seems to need to exist as source in chronyd.conf
chronyc add server <IP>
Adds a server dynamically. Adds a new NTP server to the running configuration without restarting the service.
Changes made this way are not permanent and will be lost if chronyd restarts.
Service Configuration File
The main configuration file for chronyd is /etc/chrony.conf
After any config file change, you need to restart the chronyd service
# systemctl restart chrony
Show Chrony Clients
Running “chronyc -n clients -v” will show you the clients currently using a chrony server as a timesource
In this post we are going to install and configure dnsmasq with a simple webUI acting as a front end for our less technical users. Our goal is to simplify dns in our lab sandboxes, and keep users from directly modifying our dnsmasq config files.
Installation
First we need to install dnsmasq.
# dnf -y install dnsmasq
Now lets enable and start the service. We will also check the status of the service to ensure that we do not have any issues with the default config.
So far we have dnsmasq configured and running, and we have installed a web front end and have been able to start it on the command line. Now we need to configure the front end to start as a service when the OS boots. So we now need to turn the webUI into a systemd service.
First we create the following service file
# vi /etc/systemd/system/dnsmasq-webconf.service
The contents of which are below. Note that we have modified relative paths to be absolute paths.