<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lennard John</title>
    <description>The latest articles on DEV Community by Lennard John (@lennardj).</description>
    <link>https://dev.to/lennardj</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2643192%2Fdef1a3e0-3eaa-4c3c-9050-89034befb966.jpg</url>
      <title>DEV Community: Lennard John</title>
      <link>https://dev.to/lennardj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lennardj"/>
    <language>en</language>
    <item>
      <title>Fixing Proxmox Terraform Deletes with curl + jq</title>
      <dc:creator>Lennard John</dc:creator>
      <pubDate>Tue, 07 Apr 2026 20:53:52 +0000</pubDate>
      <link>https://dev.to/lennardj/fixing-proxmox-terraform-deletes-with-curl-jq-4p54</link>
      <guid>https://dev.to/lennardj/fixing-proxmox-terraform-deletes-with-curl-jq-4p54</guid>
      <description>&lt;p&gt;When I started automating my homelab using Terraform + Proxmox, everything worked great… until it didn’t.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a push-based deployment (via GitHub Actions), I hit a blocker:&lt;/p&gt;

&lt;p&gt;The Proxmox Terraform provider &lt;strong&gt;cannot delete a running VM/container.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Terraform tries to destroy a resource&lt;/li&gt;
&lt;li&gt;Proxmox rejects it&lt;/li&gt;
&lt;li&gt;Pipeline fails ❌&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the fix is simple in theory:&lt;/p&gt;

&lt;p&gt;✅ Check if the VM is running → stop it → then delete it&lt;/p&gt;

&lt;p&gt;But Terraform doesn’t handle this natively — so I built a small workaround using curl and jq.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What You Need&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before anything, install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;curl (for API calls) → &lt;a href="https://curl.se/windows/" rel="noopener noreferrer"&gt;https://curl.se/windows/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;jq (for parsing JSON) → &lt;a href="https://jqlang.org/download/" rel="noopener noreferrer"&gt;https://jqlang.org/download/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Proxmox API Access&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You’ll need a &lt;strong&gt;Proxmox API token.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pve.proxmox.com/wiki/Proxmox_VE_API#API_Tokens" rel="noopener noreferrer"&gt;https://pve.proxmox.com/wiki/Proxmox_VE_API#API_Tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pve.proxmox.com/pve-docs/api-viewer/index.html#/nodes/%7Bnode%7D/qemu/%7Bvmid%7D/status/current" rel="noopener noreferrer"&gt;https://pve.proxmox.com/pve-docs/api-viewer/index.html#/nodes/{node}/qemu/{vmid}/status/current&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Set your environment variables (Windows example):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setx TF_VAR_proxmox_api_url "https://YOUR-IP:8006/api2/json"&lt;br&gt;
setx TF_VAR_proxmox_api_token_id "user@pam!token"&lt;br&gt;
setx TF_VAR_proxmox_api_token_secret "your-secret"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Env Variable Ref (Windows)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Temporary:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;set MY_VAR=HelloWorld&lt;br&gt;
echo %MY_VAR%&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Persistent:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setx MY_VAR "HelloWorld"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;System-wide:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;setx /m MY_VAR "HelloWorld"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix (Core Idea)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We query the VM status using the Proxmox API:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;curl -sk -H "Authorization: PVEAPIToken=USER!TOKEN=SECRET" \&lt;br&gt;
https://IP:8006/api2/json/nodes/NODE/qemu/VMID/status/current&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Then extract the state with jq:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;jq -r '.data.status'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Putting It Together&lt;/p&gt;

&lt;p&gt;Here’s the logic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;STATUS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-sk&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PVE_AUTH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PVE_API&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/nodes/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PVE_NODE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/qemu/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VMID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/status/current"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
| jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'.data.status'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$STATUS&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"running"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Stopping VM &lt;/span&gt;&lt;span class="nv"&gt;$VMID&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
  curl &lt;span class="nt"&gt;-sk&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$PVE_AUTH&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PVE_API&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/nodes/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PVE_NODE&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/qemu/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VMID&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/status/stop"&lt;/span&gt;
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Terraform can safely destroy the VM after this runs.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
      <category>tutorial</category>
      <category>automation</category>
    </item>
    <item>
      <title>I Built a Production Platform… Just to Write a Blog</title>
      <dc:creator>Lennard John</dc:creator>
      <pubDate>Tue, 31 Mar 2026 09:24:21 +0000</pubDate>
      <link>https://dev.to/lennardj/i-built-a-production-platform-just-to-write-a-blog-5b91</link>
      <guid>https://dev.to/lennardj/i-built-a-production-platform-just-to-write-a-blog-5b91</guid>
      <description>&lt;p&gt;I just wanted to write a blog.&lt;/p&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;No scaling requirements. No users. No revenue.&lt;br&gt;
Just a place to write.&lt;/p&gt;

&lt;p&gt;So naturally, I built a 3-node Kubernetes cluster on bare metal, automated everything with Terraform and Ansible, added GitOps, monitoring, alerting, and exposed it to the internet using a zero-trust Cloudflare tunnel.&lt;/p&gt;

&lt;p&gt;Completely normal.&lt;/p&gt;

&lt;p&gt;🤔 Why Over-Engineer Something So Simple?&lt;/p&gt;

&lt;p&gt;Because the goal wasn’t the blog.&lt;/p&gt;

&lt;p&gt;The goal was to learn how real platforms are built.&lt;/p&gt;

&lt;p&gt;Not tutorials. Not “hello world” deployments.&lt;br&gt;
But the actual systems that sit behind production environments.&lt;/p&gt;

&lt;p&gt;So I treated this like a real platform:&lt;/p&gt;

&lt;p&gt;Fully automated&lt;br&gt;
Reproducible&lt;br&gt;
Observable&lt;br&gt;
Secure by design&lt;br&gt;
⚙️ The One Command That Does Everything&lt;/p&gt;

&lt;p&gt;Everything starts with:&lt;/p&gt;

&lt;p&gt;docker compose up&lt;/p&gt;

&lt;p&gt;That single command:&lt;/p&gt;

&lt;p&gt;Provisions infrastructure (Terraform → Proxmox)&lt;br&gt;
Configures the cluster (Ansible → Kubernetes)&lt;br&gt;
Deploys platform services (Ingress, monitoring, GitOps)&lt;br&gt;
Deploys applications (WordPress + MariaDB)&lt;br&gt;
Sets up public access (Cloudflare Tunnel)&lt;/p&gt;

&lt;p&gt;About 25 minutes later… the entire platform is live.&lt;/p&gt;

&lt;p&gt;No manual steps. No SSH after bootstrap.&lt;/p&gt;

&lt;p&gt;🏗️ How It’s Actually Built&lt;/p&gt;

&lt;p&gt;At a high level:&lt;/p&gt;

&lt;p&gt;Git → CI/CD → Terraform → VMs → Ansible → Kubernetes → Argo CD → Apps&lt;br&gt;
Infrastructure (Terraform)&lt;br&gt;
Creates 3 VMs on Proxmox (1 control plane, 2 workers)&lt;br&gt;
Configures Cloudflare tunnel + DNS&lt;br&gt;
Configuration (Ansible)&lt;br&gt;
Bootstraps Kubernetes using kubeadm&lt;br&gt;
Installs core services (Ingress, storage, networking)&lt;br&gt;
Deploys monitoring and applications&lt;br&gt;
GitOps (Argo CD)&lt;br&gt;
Watches the kubernetes/ directory&lt;br&gt;
Automatically syncs changes to the cluster&lt;/p&gt;

&lt;p&gt;After the initial build, I don’t SSH into anything anymore.&lt;/p&gt;

&lt;p&gt;Everything is managed through Git.&lt;/p&gt;

&lt;p&gt;🔁 GitOps in Action&lt;/p&gt;

&lt;p&gt;This is my favourite part.&lt;/p&gt;

&lt;p&gt;I change a file in Git → push → and Argo CD updates the cluster automatically.&lt;/p&gt;

&lt;p&gt;No kubectl. No manual deploys.&lt;/p&gt;

&lt;p&gt;Just Git.&lt;/p&gt;

&lt;p&gt;That shift — from “run commands” to “declare desired state” — completely changes how you think about systems.&lt;/p&gt;

&lt;p&gt;🔐 Zero Trust (No Open Ports)&lt;/p&gt;

&lt;p&gt;Nothing in my home network is exposed directly.&lt;/p&gt;

&lt;p&gt;Instead, everything goes through a Cloudflare Tunnel:&lt;/p&gt;

&lt;p&gt;User → Cloudflare Edge → Tunnel → Kubernetes Ingress → App&lt;br&gt;
No port forwarding&lt;br&gt;
No public IP exposure&lt;br&gt;
HTTPS handled at the edge&lt;/p&gt;

&lt;p&gt;It’s simple, secure, and surprisingly powerful.&lt;/p&gt;

&lt;p&gt;📊 Observability (Because Things WILL Break)&lt;/p&gt;

&lt;p&gt;I added:&lt;/p&gt;

&lt;p&gt;Prometheus (metrics)&lt;br&gt;
Grafana (dashboards)&lt;br&gt;
AlertManager (email alerts)&lt;/p&gt;

&lt;p&gt;If:&lt;/p&gt;

&lt;p&gt;a pod crashes&lt;br&gt;
a node goes down&lt;br&gt;
memory spikes&lt;/p&gt;

&lt;p&gt;I get notified.&lt;/p&gt;

&lt;p&gt;Because a platform you can’t observe… is a platform you don’t understand.&lt;/p&gt;

&lt;p&gt;💥 What Went Wrong (Important Part)&lt;/p&gt;

&lt;p&gt;This didn’t work the first time.&lt;/p&gt;

&lt;p&gt;Some of the issues I hit:&lt;/p&gt;

&lt;p&gt;Terraform not returning VM IPs (guest agent problems)&lt;br&gt;
Ansible running before infrastructure was ready&lt;br&gt;
Kubernetes probes killing WordPress before it stabilised&lt;br&gt;
Infinite HTTPS redirect loops behind Cloudflare&lt;br&gt;
PVC-related deployment deadlocks&lt;/p&gt;

&lt;p&gt;Most of these came down to one thing:&lt;/p&gt;

&lt;p&gt;I assumed things would be ready… when they weren’t.&lt;/p&gt;

&lt;p&gt;🧠 Biggest Lesson&lt;/p&gt;

&lt;p&gt;Stop designing systems that depend on timing.&lt;/p&gt;

&lt;p&gt;Start designing systems that converge.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;p&gt;“wait 30 seconds and hope”&lt;/p&gt;

&lt;p&gt;Do:&lt;/p&gt;

&lt;p&gt;retry until ready&lt;br&gt;
check actual state&lt;br&gt;
design for failure&lt;/p&gt;

&lt;p&gt;That shift alone made everything more reliable.&lt;/p&gt;

&lt;p&gt;🔁 Reproducibility (This Is the Real Win)&lt;/p&gt;

&lt;p&gt;The entire platform can be:&lt;/p&gt;

&lt;p&gt;Destroyed&lt;br&gt;
Rebuilt&lt;br&gt;
Moved&lt;/p&gt;

&lt;p&gt;Using the same codebase.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;p&gt;No snowflake servers&lt;br&gt;
No hidden config&lt;br&gt;
No “it only works on my machine”&lt;br&gt;
🎯 What This Project Actually Demonstrates&lt;/p&gt;

&lt;p&gt;This isn’t about WordPress.&lt;/p&gt;

&lt;p&gt;It demonstrates:&lt;/p&gt;

&lt;p&gt;Infrastructure as Code (Terraform)&lt;br&gt;
Configuration as Code (Ansible)&lt;br&gt;
GitOps (Argo CD)&lt;br&gt;
Zero Trust Networking (Cloudflare)&lt;br&gt;
Observability-first design&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;How modern platforms are actually built.&lt;/p&gt;

&lt;p&gt;🚀 What’s Next&lt;/p&gt;

&lt;p&gt;I’m planning to:&lt;/p&gt;

&lt;p&gt;Move this to a Talos-based cluster&lt;br&gt;
Add multi-environment support (dev/staging/prod)&lt;br&gt;
Implement proper secrets management (SOPS or Vault)&lt;br&gt;
Explore multi-cluster deployments&lt;br&gt;
👋 Final Thoughts&lt;/p&gt;

&lt;p&gt;Yes — this is overkill for a blog.&lt;/p&gt;

&lt;p&gt;But that’s kind of the point.&lt;/p&gt;

&lt;p&gt;If you can build something like this for a simple project…&lt;br&gt;
you can build it for something that actually matters.&lt;/p&gt;

&lt;p&gt;If you want to check it out:&lt;/p&gt;

&lt;p&gt;🌐 &lt;a href="https://lennardjohn.org" rel="noopener noreferrer"&gt;https://lennardjohn.org&lt;/a&gt;&lt;br&gt;
💻 &lt;a href="https://github.com/Lennardj/homelab-blog" rel="noopener noreferrer"&gt;https://github.com/Lennardj/homelab-blog&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’m Lennard — currently transitioning into DevOps / Platform Engineering.&lt;/p&gt;

&lt;p&gt;If you’re on the same journey, feel free to connect 👇&lt;/p&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>terraform</category>
      <category>ansible</category>
    </item>
    <item>
      <title>LPIC-1 Lesson 101.1 cheat sheet</title>
      <dc:creator>Lennard John</dc:creator>
      <pubDate>Thu, 16 Jan 2025 08:06:31 +0000</pubDate>
      <link>https://dev.to/lennardj/lpic-1-lesson-1011-cheat-sheet-4p5</link>
      <guid>https://dev.to/lennardj/lpic-1-lesson-1011-cheat-sheet-4p5</guid>
      <description>&lt;p&gt;I know this might be easy for most, but as i've learnt something new while reviewing this, i am sure someone else will. &lt;/p&gt;

&lt;h1&gt;
  
  
  Lesson 101.1 summarized
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Bios vs UEFI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bios (Basic Input Output system)&lt;/li&gt;
&lt;li&gt;UEFI (Unified extensible firmware interface)&lt;/li&gt;
&lt;li&gt;Bios is older, UEFI is newer and improved &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Kernel module, similar to drivers on windows&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 shows all devices currently connected to the PCI (Peripheral Component Interconnect) bus.
    common commands


```bash
lspci # list all available pci device 

lspci -s \[hex_address\] -v # show(verbose) more detail about a specific device based on Hex address given

lspci -s \[hex_address\] -k # verify which kernel module is in use based on Hex address given
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 Lists USB (Universal Serial Bus) devices currently connected to the machine
    common command


```bash
lsusb # list usb devices 

lsusb -v -d \[ID\] # detailed output of a specific device based on ID

lsusb -t # show curent usb device mapping as a tree

lsusb -s bus:dev # verify which device is using that module e.g lsusb -s 01:02
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;-&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 extracts detail information about hardware

-

 ```lsblk```

 list block device

-

 ```kmod```

 preferable way to interact with kernel module is also be call using these:

    -

 ```modprobe```

 used to add and remove module from the linux kernel 
    -

 ```lsmod```

 shows the status of module in the linux kernel 
    -

 ```rmmod```

 simple program to remove a module from linus kernel
    -

 ```insmod```

 simple program to insert a module to the linux kernel
    -

 ```modinfo```

 shows info about a kernel module
    -

 ```depmod```

 generate modules.deb and map files

- Example


```bash
sudo modprobe module_name # load a module
sudo modprobe -r module_name # remove a module
sudo rmmod module_name # remove a module
sudo rmmod -f module_name # force remove a module
sudo insmod /path/to.module.ko # load a module into kernel but doesn't handle dependencies 
modinfo module_name # display detail information about a kernel module
modinfo -p module_name # list specific module parameter
depmod -a kernel_version # generate for a specific module version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;kernel module important files
-

&lt;code&gt;/etc/modules&lt;/code&gt;

add module here to load at boot (depreciated), can also 
-

&lt;code&gt;/etc/modprobe.d/&lt;/code&gt;

use instead of /etc/module, add module config file here to load at boot
- Kernel module parameter: can be change while kernel is at boot 
-

&lt;code&gt;/etc/modprobe.conf&lt;/code&gt;

used to customized module parameter to make them persistent
-

&lt;code&gt;/etc/modprobe.d/&lt;/code&gt;

add individual files with the extension &lt;strong&gt;.conf&lt;/strong&gt; to customize module parameters
-

&lt;code&gt;/etc/modprobe.d/blacklist.conf&lt;/code&gt;

add module name here to block the loading of the module
-

&lt;code&gt;/etc/modprobe.d/&amp;lt;module_name&amp;gt;.conf&lt;/code&gt;

preferred method for blocking a module that will contain settings specific only to the given kernel module.&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;pseudo-filesystems: only exist while the system is running, not intended for conventional file storage.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/proc&lt;/strong&gt; contains files with information regarding running processes and hardware resources. 
Common /proc files

&lt;ul&gt;
&lt;li&gt;/proc/cpuinfo: Lists detailed information about the CPU(s) found by the operating system.&lt;/li&gt;
&lt;li&gt;/proc/interrupts: A list of numbers of the interrupts per IO device for each CPU.&lt;/li&gt;
&lt;li&gt;/proc/ioports: Lists currently registered Input/Output port regions in use.&lt;/li&gt;
&lt;li&gt;/proc/dma:Lists the registered DMA (direct memory access) channels in use.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;sysfs&lt;/strong&gt;  pseudo-filesystem which provides an interface to kernel data structures, he files under sysfs provide information about devices, kernel modules, filesystems, and other kernel components, which are all mounted in /sys

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/sys&lt;/strong&gt; have similar roles to those in /proc. However, the /sys directory has the specific purpose of &lt;strong&gt;storing device information and kernel data related to hardware&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;u*&lt;em&gt;dev subsystem&lt;/em&gt;*: Removable devices are handled by the udev subsystem, which creates the corresponding devices in /dev

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;/dev/&lt;/strong&gt; every file inside /dev is associated with a system device, particularly storage devices&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;/etc/udev/rules.d/&lt;/strong&gt; as new devices are detected, udev searches here for a matching rule about what to do

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/dev/hdc&lt;/code&gt; cd/dvd are represented by these&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev/fd0&lt;/code&gt; represent floppy disk&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev/sda&lt;/code&gt; represents IDE, SSD, and USB&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev/mmcblk0p1&lt;/code&gt; represents SD cards&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/dev/nvme0n1p1&lt;/code&gt; represents nvme &lt;/li&gt;
&lt;li&gt;Linux kernel version &lt;strong&gt;2.4&lt;/strong&gt;, most storage devices are identified as if they were &lt;strong&gt;SCSI devices&lt;/strong&gt;, regardless of their hardware type. &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Linux Distro&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;debian-based uses

&lt;code&gt;dpkg&lt;/code&gt;

and use apt (Advanced Packaging Tool) as package manager
- RPM-based uses

&lt;code&gt;rpm&lt;/code&gt;

and use yum (Yellowdog Updater Modified) or DNF as package manager
- debian-based common commands
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.deb&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# install&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# Remove&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# purge: remove config file&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.deb&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# list content&lt;/span&gt;

dpkg &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# check status&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;-R&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;directory&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# install from directory&lt;/span&gt;

dpkg &lt;span class="nt"&gt;-I&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.deb&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# show package info&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;dpkg &lt;span class="nt"&gt;--unpack&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.deb&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# unpack contents&lt;/span&gt;

 dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="c"&gt;# list installed package&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;RPM-based common commands
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-ivh&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.rpm&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# insall &lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# remove&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;rpm &lt;span class="nt"&gt;-Uvh&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.rpm&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# upgrade&lt;/span&gt;

rpm &lt;span class="nt"&gt;-Vp&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.rpm&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;specific&lt;span class="o"&gt;)&lt;/span&gt; or rpm &lt;span class="nt"&gt;-Va&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;all&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# verify&lt;/span&gt;

&lt;span class="c"&gt;# query&lt;/span&gt;

rpm &lt;span class="nt"&gt;-qdf&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# Documentation &lt;/span&gt;

rpm &lt;span class="nt"&gt;-qi&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# installed info&lt;/span&gt;

rpm &lt;span class="nt"&gt;-qip&lt;/span&gt; &lt;span class="se"&gt;\[&lt;/span&gt;package.rpm&lt;span class="se"&gt;\]&lt;/span&gt; &lt;span class="c"&gt;# package info from online&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>lpic1</category>
    </item>
  </channel>
</rss>
