What Is the Difference Between apt and yum?
Understanding apt and yum Package Managers
Managing software on Linux systems represents one of the most fundamental skills for system administrators, developers, and anyone working with server infrastructure. The way you install, update, and remove software packages directly impacts system stability, security, and performance. Understanding the tools that handle these critical operations becomes essential when you're responsible for maintaining production environments or even managing your personal Linux workstation.
Package managers serve as the bridge between users and the vast repositories of software available for Linux distributions. Two of the most prominent package management systems—apt (Advanced Package Tool) and yum (Yellowdog Updater Modified)—have shaped how millions of users interact with their systems daily. While both accomplish similar goals, they represent different philosophies, technical implementations, and distribution families. This exploration offers multiple perspectives: technical architecture, practical usage, historical context, and performance considerations.
Throughout this comprehensive examination, you'll gain clarity on when to use each tool, understand their underlying mechanisms, discover their strengths and limitations, and learn practical commands that will make your Linux experience more efficient. Whether you're deciding which distribution to deploy, troubleshooting package conflicts, or simply curious about Linux internals, this knowledge will empower you to make informed decisions and work more effectively with your chosen system.
Distribution Family Origins and Ecosystem Alignment
The fundamental difference between apt and yum begins with the Linux distribution families they serve. The apt package manager belongs to the Debian ecosystem, which includes Debian itself, Ubuntu, Linux Mint, Pop!_OS, and dozens of other derivatives. This family tree represents one of the oldest and most established lineages in Linux history, with Debian's first release dating back to 1993. The Debian philosophy emphasizes stability, free software principles, and extensive testing before packages reach stable repositories.
Conversely, yum originated in the Red Hat ecosystem, serving distributions like Red Hat Enterprise Linux (RHEL), CentOS, Fedora, and their derivatives. This family prioritizes enterprise readiness, commercial support options, and cutting-edge technology integration. Red Hat's business model, which combines open-source development with commercial support contracts, has influenced how yum evolved to meet corporate infrastructure needs. More recently, dnf (Dandified Yum) has replaced yum in newer Fedora and RHEL versions, though yum commands often still work through compatibility layers.
"The choice between apt and yum isn't really a choice at all—it's determined by your distribution. Understanding both makes you versatile across different Linux environments."
These ecosystem differences extend beyond technical implementation to community culture, documentation styles, and support channels. Debian-based systems typically feature extensive wikis maintained by community volunteers, while Red Hat systems benefit from professional documentation backed by corporate resources. The package naming conventions, directory structures, and configuration file locations all reflect these different approaches to system organization.
Package Format Foundations
At the core of these package managers lie different package formats. The apt system works with .deb packages, which use the ar archive format combined with tar compression. These packages contain binary files, configuration files, pre-installation and post-installation scripts, and metadata describing dependencies and conflicts. The .deb format was designed for simplicity and transparency, allowing users to inspect package contents with standard Unix tools.
The yum ecosystem utilizes .rpm (Red Hat Package Manager) packages, which employ a different internal structure based on cpio archives. RPM packages include similar components—binaries, scripts, and metadata—but organize them differently and use distinct compression algorithms. The RPM format includes more sophisticated features for package signing, verification, and transaction management, reflecting its enterprise heritage.
| Characteristic | apt (.deb) | yum (.rpm) |
|---|---|---|
| Distribution Family | Debian, Ubuntu, Mint, Pop!_OS | RHEL, CentOS, Fedora, Rocky Linux |
| Package Format | .deb (ar + tar) | .rpm (cpio) |
| Low-Level Tool | dpkg | rpm |
| Configuration Directory | /etc/apt/ | /etc/yum.repos.d/ |
| Cache Location | /var/cache/apt/ | /var/cache/yum/ |
| Primary Repository File | /etc/apt/sources.list | /etc/yum.repos.d/*.repo |
| Modern Successor | apt (from apt-get) | dnf (Dandified Yum) |
Command Syntax and Daily Operations
When working with these package managers daily, you'll notice both similarities and differences in command structure. The apt system has evolved through several generations, starting with apt-get and apt-cache as separate utilities, then consolidating into the modern apt command that combines the most common operations into a more user-friendly interface. This evolution reflects Debian's commitment to improving user experience while maintaining backward compatibility.
The yum command structure remained relatively consistent for years, with a straightforward verb-noun syntax that enterprise administrators found predictable and scriptable. Commands like yum install, yum update, and yum remove became second nature to Red Hat system administrators. The transition to dnf maintained this familiar syntax while improving performance and dependency resolution algorithms underneath.
Essential Package Operations
Installing software represents the most common package manager operation. With apt, you would execute apt install package-name after updating the package index with apt update. This two-step process ensures you're installing the latest available version from your configured repositories. The apt system separates index updating from package operations, giving administrators explicit control over when repository metadata refreshes.
Using yum, the equivalent command yum install package-name automatically checks for updated repository metadata before proceeding with installation. This behavior reduces the number of commands administrators need to remember but can slightly slow down operations when you're installing multiple packages in quick succession. The automatic metadata refresh reflects yum's design philosophy of prioritizing correctness over speed.
- 🔄 Update package index:
apt updatevs. automatic in yum - ⬆️ Upgrade installed packages:
apt upgradevs.yum update - 📦 Install new package:
apt installvs.yum install - 🗑️ Remove package:
apt removevs.yum remove - 🔍 Search for packages:
apt searchvs.yum search
"The best package manager is the one that ships with your distribution. Learning both apt and yum makes you adaptable to any Linux environment you encounter."
Removing software shows another philosophical difference. The apt system offers multiple removal options: apt remove uninstalls packages but preserves configuration files, while apt purge removes everything including configurations. This granularity gives users control over whether they want to preserve settings when uninstalling software, which proves valuable when you plan to reinstall later with the same configuration.
The yum approach with yum remove typically removes packages and their configurations together, though the behavior can vary based on how package maintainers structured their .rpm files. The RPM format allows maintainers to mark certain files as configuration files that might be preserved, but the default behavior tends toward complete removal. This difference reflects the enterprise focus on clean, reproducible system states.
Advanced Package Management Features
Beyond basic operations, both package managers offer sophisticated features for complex scenarios. The apt system includes apt-mark for controlling automatic updates, allowing you to hold packages at specific versions or mark them as manually installed versus automatically installed as dependencies. This distinction helps when cleaning up unused packages with apt autoremove, which only removes packages that were installed automatically and are no longer needed.
The yum ecosystem provides group installations through yum groupinstall, which installs collections of related packages in a single operation. This feature proves particularly valuable in enterprise environments where you need to configure servers for specific roles. Installing a "Web Server" group, for example, might include Apache, PHP, necessary modules, and documentation in one command. The apt system achieves similar functionality through metapackages, which are packages that depend on collections of other packages.
Dependency Resolution and Conflict Management
Dependency resolution represents one of the most critical functions of any package manager. Modern software rarely exists in isolation—applications depend on libraries, which depend on other libraries, creating complex dependency trees. Both apt and yum must navigate these relationships, ensuring all required components are present while avoiding conflicts between incompatible versions.
The apt system uses a sophisticated dependency resolver called libapt that employs Boolean satisfiability (SAT) solving algorithms. When you request a package installation, apt examines all dependencies, checks for conflicts, and calculates an installation plan that satisfies all requirements. If multiple solutions exist, apt attempts to minimize the number of packages installed and prefers keeping currently installed packages at their existing versions when possible.
"Dependency hell isn't about the package manager—it's about the complexity of modern software. Good package managers make the complexity manageable, not invisible."
The yum dependency resolver, and especially its successor dnf, uses similar algorithms but with different heuristics for choosing between multiple possible solutions. The DNF resolver, based on the libsolv library, often makes different choices than apt when multiple packages could satisfy a dependency. These differences rarely matter for end users but can produce slightly different package sets when building container images or minimal installations.
Handling Package Conflicts
Package conflicts arise when two packages cannot coexist on the same system, typically because they provide the same files or incompatible versions of shared resources. The apt system declares conflicts explicitly in package metadata, and the resolver refuses installations that would create conflict situations. You might encounter messages like "package-a conflicts with package-b," requiring you to remove one before installing the other.
The RPM format and yum handle conflicts through several mechanisms. The "Provides" and "Obsoletes" fields in RPM metadata allow packages to declare that they replace other packages or provide capabilities that other packages require. This system enables smooth transitions when package names change or when multiple packages can fulfill the same role. The alternatives system in Red Hat-based distributions further manages situations where multiple packages provide the same command or library.
Repository Management and Package Sources
Repositories serve as the source of packages for your system, hosting thousands of software packages organized by category, architecture, and distribution version. Understanding how each package manager handles repositories helps you add third-party software sources, troubleshoot download issues, and optimize package installation speed.
The apt repository configuration lives primarily in /etc/apt/sources.list and files within /etc/apt/sources.list.d/. Each repository entry specifies a URL, distribution codename, and components (like main, contrib, non-free). This structure allows fine-grained control over which package categories you enable. Adding a new repository typically involves adding a line to sources.list and importing the repository's GPG key to verify package signatures.
Repository management in yum uses individual .repo files in /etc/yum.repos.d/, with each file potentially containing multiple repository definitions. These files use an INI-style format with sections for each repository, including URLs, GPG key locations, and enable/disable flags. This modular approach makes it easy to add third-party repositories by dropping a single file into the directory, and many software vendors provide .repo files for easy integration.
| Operation | apt Command | yum Command |
|---|---|---|
| List repositories | cat /etc/apt/sources.list | yum repolist |
| Add repository | add-apt-repository | yum-config-manager --add-repo |
| Enable repository | Edit sources.list | yum-config-manager --enable |
| Disable repository | Edit sources.list | yum-config-manager --disable |
| Clean cache | apt clean | yum clean all |
| Show package info | apt show package-name | yum info package-name |
| List installed | apt list --installed | yum list installed |
Mirror Selection and Download Optimization
Both package management systems support repository mirrors to distribute bandwidth load and improve download speeds for users worldwide. The apt system traditionally relied on manual mirror selection or tools like apt-mirror and apt-cacher-ng for local caching. Modern Debian and Ubuntu releases include mirror selection in their installers, automatically choosing geographically close mirrors to optimize download speeds.
The yum and dnf systems include built-in mirror selection through the fastestmirror plugin, which measures response times to available mirrors and automatically selects the fastest options. This feature requires no manual configuration and adapts to network conditions, making it particularly valuable for systems that move between networks or for users with variable internet connectivity. The metalink feature in yum repositories provides even more sophisticated mirror selection based on geographic location and mirror health status.
Performance Characteristics and System Impact
Performance considerations affect daily operations, especially on systems with limited resources or when managing large package installations. The speed of package operations depends on multiple factors: dependency resolution algorithms, metadata caching strategies, download parallelization, and disk I/O patterns.
The apt system generally performs dependency resolution quickly due to its optimized SAT solver and compact metadata format. Package lists download as compressed files that apt caches locally, with subsequent operations reading from cache until you explicitly run apt update. This caching strategy minimizes network traffic but requires administrators to remember to update before installing packages to get the latest versions.
"Performance differences between apt and yum matter less than you'd think. Modern hardware makes both fast enough that the real bottleneck is usually network bandwidth."
Historical versions of yum earned a reputation for slower performance, particularly during dependency resolution for complex package sets. The transition to dnf addressed many of these concerns through a rewritten codebase in C++ (versus yum's Python implementation) and more efficient algorithms. Modern dnf performs comparably to apt in most scenarios, with the remaining differences often attributable to repository mirror speeds rather than the package manager itself.
Disk Space and Cache Management
Package managers cache downloaded packages and metadata, consuming disk space in exchange for faster operations and the ability to reinstall packages without re-downloading. The apt cache in /var/cache/apt/archives/ stores .deb files indefinitely by default, allowing you to reinstall or downgrade packages from cache. This behavior proves valuable when repository mirrors remove older package versions, but it can consume significant disk space on systems with frequent updates.
Managing the apt cache involves commands like apt clean (removes all cached packages) and apt autoclean (removes only packages that can no longer be downloaded from repositories). The configuration option APT::Clean-Installed allows automatic cache management, though many administrators prefer manual control over cache cleanup to preserve the ability to downgrade packages if needed.
The yum cache operates similarly but with more granular control through the keepcache configuration option. Setting keepcache=1 in /etc/yum.conf preserves downloaded packages, while the default behavior removes them after installation to conserve disk space. The command yum clean all removes all cached data including metadata, while yum clean packages removes only downloaded packages. This flexibility allows administrators to balance disk space constraints against the convenience of cached packages.
Security Features and Package Verification
Security in package management encompasses several concerns: verifying package authenticity, ensuring packages haven't been tampered with during download, and managing security updates efficiently. Both apt and yum implement cryptographic signature verification, but with different approaches reflecting their ecosystem philosophies.
The apt system uses GPG signatures to verify repository metadata and individual packages. When you add a repository, you must import its GPG key, which apt uses to verify that package lists and packages actually come from the claimed source. This verification happens automatically during apt update and installation operations. If signature verification fails, apt refuses to proceed, protecting against man-in-the-middle attacks and compromised mirrors.
Repository keys in apt live in /etc/apt/trusted.gpg.d/ or the older /etc/apt/trusted.gpg keyring. The apt-key command manages these keys, though recent versions of apt deprecated this command in favor of placing key files directly in the trusted.gpg.d directory. This change improves security by isolating keys for different repositories rather than storing them in a shared keyring.
"Package signature verification isn't paranoia—it's basic security hygiene. The few seconds spent verifying signatures protect against supply chain attacks that could compromise entire systems."
Security Update Management
Handling security updates efficiently represents a critical operational concern, especially for production systems. The apt ecosystem provides the unattended-upgrades package, which automatically installs security updates on a configurable schedule. This automation reduces the window of vulnerability between security patch release and installation, though it requires careful configuration to avoid unexpected system changes during critical operations.
The configuration for unattended-upgrades allows fine-grained control over which updates install automatically. You can configure it to only install updates from security repositories, to avoid updates that require reboots, or to notify administrators before applying changes. These options balance the security benefits of rapid patching against the operational risk of automated system modifications.
The yum ecosystem approaches automatic updates through the yum-cron package (or dnf-automatic for dnf systems). This tool provides similar functionality with configuration options for applying updates automatically, downloading them for manual installation, or simply notifying administrators of available updates. The configuration in /etc/yum/yum-cron.conf allows administrators to specify update types (security only, bugfixes, or all updates) and timing.
Red Hat-based systems benefit from the RHEL Security Advisory (RHSA) system, which categorizes updates by severity and provides detailed information about vulnerabilities addressed. The command yum updateinfo list security shows available security updates, while yum update --security installs only security-related updates. This granularity helps administrators prioritize updates and comply with security policies that mandate rapid security patching while allowing more conservative approaches to feature updates.
Transaction Management and Rollback Capabilities
Modern package managers implement transaction-based operations, treating package installations, updates, and removals as atomic operations that either complete fully or roll back entirely. This transactional approach prevents the system from ending up in inconsistent states if operations fail partway through due to disk space exhaustion, network interruptions, or dependency conflicts.
The apt system implements transactions through its internal state management, but historically provided limited rollback capabilities. If an installation fails, apt attempts to restore the previous state, but complex scenarios involving multiple packages and configuration file changes might leave the system in a partially modified state. The apt-mark command helps manage package states, and tools like apt-clone can capture and restore entire package selections, but these don't provide true point-in-time rollback.
The yum and dnf systems provide more sophisticated transaction history and rollback features. The command yum history displays all package transactions with unique transaction IDs, showing what packages were installed, updated, or removed in each operation. More importantly, yum history undo can reverse specific transactions, reinstalling removed packages or downgrading updated ones to their previous versions.
System Snapshots and Package Management
Beyond package manager built-in features, system-level snapshot tools integrate with package management to provide comprehensive rollback capabilities. On Debian-based systems, tools like Timeshift create filesystem snapshots before major updates, allowing complete system restoration if updates cause problems. These snapshots capture not just package changes but also configuration modifications and user data if configured to do so.
Red Hat-based systems increasingly integrate with rpm-ostree and similar technologies that treat the operating system as an image rather than a collection of packages. This approach, used in Fedora Silverblue and Red Hat CoreOS, maintains multiple OS versions simultaneously, allowing instant rollback to previous versions by simply selecting a different boot entry. While this represents a different paradigm from traditional package management, it addresses the same fundamental need for safe, reversible system updates.
Plugin Ecosystems and Extensibility
Both package managers support plugins that extend functionality beyond core package management operations. These plugins add features like parallel downloads, automatic mirror selection, version locking, and integration with other system management tools.
The apt ecosystem provides several extension mechanisms. The APT::Update::Pre-Invoke and APT::Update::Post-Invoke hooks allow administrators to run scripts before and after package operations, enabling custom logging, notification systems, or integration with configuration management tools. The apt-listbugs and apt-listchanges packages demonstrate this extensibility, automatically checking for known bugs and displaying changelog information before package installations.
The yum plugin architecture offers more formal extension points through Python modules in /usr/lib/yum-plugins/. Popular plugins include fastestmirror (automatic mirror selection), versionlock (preventing specific packages from updating), and security (filtering updates by security relevance). The dnf plugin system maintains compatibility with yum plugins while adding new capabilities, and the transition to dnf encouraged plugin developers to modernize their code for improved performance.
Integration with System Management and Automation Tools
Package managers rarely operate in isolation in modern infrastructure. They integrate with configuration management systems, container build processes, continuous integration pipelines, and monitoring solutions. Understanding these integration points helps you build robust automated systems.
Configuration management tools like Ansible, Puppet, and Chef provide abstractions over apt and yum, allowing you to write infrastructure code that works across different Linux distributions. These tools detect the target system's package manager and translate generic package operations into appropriate apt or yum commands. This abstraction layer simplifies multi-distribution environments but requires understanding the underlying package managers to troubleshoot issues and optimize performance.
"Automation doesn't eliminate the need to understand package managers—it amplifies the consequences of misunderstanding them. Small mistakes multiply across hundreds of servers."
Container builds with Docker or Podman frequently use apt or yum to install software during image creation. The choice between Debian-based and Red Hat-based base images often comes down to which ecosystem you're more familiar with, though specific requirements like package availability or image size might influence the decision. Optimizing container builds requires understanding package manager caching behavior, layer creation, and techniques like multi-stage builds to minimize final image size.
Scripting and Programmatic Access
Writing scripts that interact with package managers requires careful attention to output formats, return codes, and handling of interactive prompts. Both apt and yum provide options for non-interactive operation, essential for automation scenarios where human intervention isn't possible.
The apt command offers several flags for scripting: -y or --yes automatically answers yes to prompts, -q or --quiet reduces output verbosity, and --assume-no defaults to negative responses for testing. The apt-get command, while older, remains popular in scripts due to its stable interface and well-documented behavior. The DEBIAN_FRONTEND environment variable set to "noninteractive" prevents packages from prompting for configuration during installation.
The yum command similarly provides -y for automatic confirmation and -q for quiet operation. The --downloadonly option downloads packages without installing them, useful for pre-staging updates or creating offline installation media. The return codes from yum commands indicate success or failure types, allowing scripts to implement appropriate error handling and retry logic.
Cross-Platform Considerations and Ecosystem Interoperability
Organizations often maintain infrastructure spanning multiple Linux distributions, requiring administrators to work fluently with both apt and yum. Understanding the conceptual similarities between these tools helps you transfer knowledge between ecosystems, while recognizing the differences prevents mistakes that could impact system stability.
Package naming conventions differ between Debian and Red Hat ecosystems, sometimes significantly. A library might be named "libssl-dev" in Debian-based systems but "openssl-devel" in Red Hat-based systems. Development packages typically end in "-dev" in Debian and "-devel" in Red Hat. These naming differences extend beyond conventions to philosophical approaches about package splitting—Debian tends to split packages more granularly, while Red Hat sometimes bundles related components together.
Converting between package formats occasionally becomes necessary, though it's generally discouraged due to dependency and path differences between distributions. Tools like alien can convert between .deb and .rpm formats, but the results often require manual adjustment to work correctly. The better approach involves finding native packages for your distribution or building from source when official packages don't exist.
Troubleshooting Common Package Management Issues
Package management problems range from simple issues like locked databases to complex dependency conflicts requiring manual intervention. Developing systematic troubleshooting approaches helps you resolve issues efficiently without compromising system stability.
Lock files prevent multiple package manager instances from running simultaneously, protecting database integrity. If apt reports "Could not get lock /var/lib/dpkg/lock," another process is using the package manager—possibly an automatic update running in the background. Identifying the process with lsof /var/lib/dpkg/lock or ps aux | grep apt helps you determine whether to wait for completion or terminate a hung process. Simply deleting lock files without understanding what holds them risks database corruption.
Broken dependencies occur when packages require versions of libraries or other packages that aren't available in your configured repositories. The apt command apt --fix-broken install attempts automatic resolution, while apt-mark hold package-name prevents specific packages from updating if newer versions cause conflicts. Understanding the dependency tree with apt-cache depends and apt-cache rdepends helps you identify root causes of dependency issues.
Repository Synchronization Problems
Repository metadata occasionally becomes corrupted or out of sync, causing cryptic errors during package operations. The apt error "Hash Sum mismatch" indicates that downloaded files don't match the checksums in repository metadata, possibly due to mirror synchronization issues or corrupted local cache. Running apt clean followed by apt update often resolves these issues by forcing fresh downloads of all metadata.
The yum equivalent involves clearing the cache with yum clean all and rebuilding it with yum makecache. If problems persist, examining repository configuration files for typos or incorrect URLs helps identify configuration issues. The yum repolist -v command provides detailed information about configured repositories, including their URLs and current status.
Future Directions and Emerging Technologies
Package management continues evolving to address modern challenges like containerization, immutable infrastructure, and application sandboxing. Understanding these trends helps you anticipate changes and evaluate new tools as they emerge.
The transition from yum to dnf represents one significant evolution, bringing improved performance and better dependency resolution. This transition maintains command compatibility, with yum often symlinked to dnf, easing the migration path for administrators and scripts. The DNF codebase provides a foundation for future enhancements while maintaining the familiar interface that Red Hat ecosystem users expect.
Alternative packaging formats like Snap, Flatpak, and AppImage address limitations of traditional package managers, particularly around application isolation and cross-distribution compatibility. These formats bundle applications with their dependencies, reducing dependency conflicts and allowing applications to run on multiple distributions without repackaging. However, they introduce trade-offs around disk space, update mechanisms, and system integration that make them complementary to rather than replacements for traditional package managers.
The rise of immutable infrastructure and container-based deployments changes how we think about package management. Rather than updating packages on running systems, immutable approaches involve building new system images with updated packages and deploying them as replacements for old versions. This paradigm shift doesn't eliminate the need for package managers but changes when and how we use them—during image build time rather than on production systems.
How do I convert a .deb package to .rpm or vice versa?
While tools like alien can convert between package formats, this approach is generally unreliable due to differences in file system layouts, dependencies, and package naming conventions between distributions. The converted package often requires manual adjustment and may not work correctly. A better approach involves finding native packages for your distribution, building from source, or using distribution-agnostic formats like AppImage or Flatpak.
Can I use both apt and yum on the same system?
No, you cannot use both apt and yum on the same system for managing system packages. Each package manager is designed for its specific distribution family and package format. Installing packages from the wrong ecosystem will likely break your system. However, you can install both package managers as tools (for example, to examine packages without installing them), but only use the one appropriate for your distribution to actually manage system packages.
Which package manager is faster, apt or yum?
Modern versions of both package managers perform similarly in most scenarios. Historically, yum was slower due to its Python implementation and dependency resolution algorithms, but dnf (its successor) addresses these performance issues. The perceived speed difference often comes from repository mirror speeds, network conditions, and system resources rather than the package manager itself. Both are fast enough for practical use on modern hardware.
How do I prevent a specific package from being updated?
For apt, use apt-mark hold package-name to prevent updates to a specific package. You can later remove the hold with apt-mark unhold package-name. For yum/dnf, install the versionlock plugin and use yum versionlock add package-name (or dnf versionlock add package-name). Both mechanisms prevent the specified package from being updated during system-wide upgrade operations while allowing manual updates if you explicitly request them.
What should I do if my package manager is stuck or frozen?
First, determine if another package manager process is running using ps aux | grep apt or ps aux | grep yum. If a legitimate process is running (like automatic updates), wait for it to complete. If the process is genuinely stuck, you can safely terminate it and then run dpkg --configure -a (for apt) or check for issues with rpm --rebuilddb (for yum) to repair any database inconsistencies. Avoid forcefully deleting lock files without terminating the process holding them, as this can lead to database corruption.
How do I find which package provides a specific file or command?
For apt-based systems, use apt-file search filename (requires installing the apt-file package first and running apt-file update). Alternatively, dpkg -S /path/to/file searches installed packages only. For yum-based systems, use yum provides filename or yum whatprovides */filename to search all available packages. These commands help you identify which package to install when you need a specific library or command.
Sponsor message — This article is made possible by Dargslan.com, a publisher of practical, no-fluff IT & developer workbooks.
Why Dargslan.com?
If you prefer doing over endless theory, Dargslan’s titles are built for you. Every workbook focuses on skills you can apply the same day—server hardening, Linux one-liners, PowerShell for admins, Python automation, cloud basics, and more.