# gpufan -- sets manual fan speed on AMD Radeon GPU. For 5.x / 6.x Linux Kernel users running AMDGPU driver... # Author: Ben @ LostGeek . NET # Created 09/20/2025 # READ ME! How to use: # save as /usr/local/bin/gpufan then chmod +x # running "gpufan" will give temperature & fan rpm. gpufan followed by a number (1-100) # will manually set speed. "gpufan auto" will restore auto / driver control.
Category: linux
Writing a wrapper for DD
I’ve been working on a handy lil’ tool, basically a glorified wrapper script for dd. But I think I worked in some solid concepts:
You just run it, no args needed. (Though you can pass args if you want.)
Automatic target selection: Devices with the prefix /dev/sd* that are not mounted will be considered. I’ve put in a volume limit of 64 GB for safety. If the device is greater than 96 GB, then (imo) it’s probably something else – HDD/SSD – so in that case a manual override is required.
Automatic block size: Chosen based on drive capacity. Tiny drives use a smaller block size, while larger (likely more modern USB 3) drives can use big chunks, like bs=4M. This usually improves performance.
Once I get it all ironed out, I’ll share the code. So far, I find it pretty handy.

Debian Trixie: Goodbye Init Freedom
With Trixie, comes changes…
As someone who has been running Debian servers for about a decade, one thing I’ve always appreciated is that if you didn’t like a core component, you could swap it out. That used to include the init system. Whether you preferred sysvinit, OpenRC, or runit, Debian gave you the tools to do it.
With Debian 13 Trixie, that is basically over.
What Changed
To be clear, Debian as defaulted to systemd since Jessie; we’re not talking about that. We’re talking about the OPTION to use another system instead. On Bookworm and earlier, moving away from systemd was simple:
apt install sysvinit-core
reboot
You might clean up a few services or install orphan-sysvinit-scripts, but it worked.
In Trixie, too many core packages now assume systemd is there. Udev is the most obvious example. During upgrades, it will pull in systemd even if you’re trying to stay init-free. Other essential packages have dropped their init scripts or unit files for anything else. If you boot without systemd, critical services will fail. The choice exists in theory, but it’s fragile and unsupported in practice.
Why It Is Happening Now??
This isn’t random. Version 13 tightens dependency chains across the core system. Packages such as udev, dbus, logind, and many desktop or network management components are systemd-aware by default. In previous releases, these dependencies were optional or provided fallbacks. In Trixie, the fallback paths are gone or broken. Swapping init now can silently break critical parts of the system.
For Some, Devuan May Finally Make a Lot of Sense
I never really understood why Devuan existed. On Jessie, Buster, Bullseye, and Bookworm, one could do a base install, install their init of choice, reboot, and purge systemd. Devuan always seemed like a convenience for users who wanted to skip that step.
Now, changing init is a literal nightmare. The system doesn’t allow it. You’re forced to boot from another system and attempt the change via chroot. Even then, it’s messy. For those who want a system without systemd, Devuan now has a legitimate place, even for technically inclined users.
Why might one avoid systemd:
-
Simplicity and predictability: Traditional init systems are easy to debug, less opaque, and don’t pull in a large web of dependencies.
-
Resource footprint: Sysvinit or OpenRC can run with minimal memory and CPU usage, ideal for very small servers or embedded systems.
-
Control: Fewer hidden processes and services mean you can strip down and tune exactly what runs at boot.
Reasons to stick with systemd:
-
Ubiquity: Most packages, especially in Trixie, assume systemd is present. Running without it often leads to breakage or fragile setups.
-
Service management features: systemd provides dependency-based service startup, logging, timers, and cgroup integration out of the box.
-
Easier integration with modern software: Many newer server tools and desktop components expect systemd and may not work properly without it.
Systemd Makes Sense for Most Users
For the majority of us, systemd offers clear advantages and a cohesive, performant set of system daemons that do their job reliably. It’s unfortunate, however, that the long tradition of Debian giving users choice in init has essentially come to an end.
For those disappointed by this, Alpine is worth a look. Alpine is a super minimal distribution based on BusyBox. It uses the musl C library and remains impressively small while still offering a well-curated and thorough selection of packages. And of course, Devuan. Devuan is a Debian fork whose claim to fame is being systemd-free. Any packages that would normally depend on systemd have been adjusted or patched for a smooth experience, including things like elogind replacements and tweaks to GNOME dependencies.
Final Thoughts
Debian used to be a super-flexible system that could be stripped down and tuned to run in very small memory footprints. It mostly still is, but with Trixie, it’s just a bit less flexible, and that’s truly too bad. They broke a decades-long tradition.
For those who are really bothered by this, thankfully there is Alpine and Devuan.
Whether you preferred sysvinit, OpenRC, or runit, Debian gave you the tools to do it.
With Debian 13 Trixie, that is basically over.
OpenWRT on a Thrift Store Router (Netgear WNDR3700 v4)

Earlier today I stopped by a local Goodwill to see what they had in the way of electronics. Among the digital photo frames and old keyboards, I spotted two routers. I’m always on the lookout for hardware that can run Linux. One of the routers was a Netgear WNDR3700 v4. It was in its original box with the power adapter and a couple of patch cords.
Normally I’d pull out my phone and check OpenWrt support before buying, but this one looked old enough that I figured there was at least a 50/50 chance it would be an easy convert. I’m glad I grabbed it; Not only is this model supported, but flashing OpenWrt is about as painless as it gets.
Flashing with OpenWrt — No UART, no TFTP, no drama.
- Factory reset the router.
- Connect to it at
http://192.168.1.1/in your web browser. Log in with:
Username: admin
Password: password - Go to Advanced.
- Download the latest OpenWrt “factory” image for WNDR3700 v4 from the OpenWrt site. *Note, maybe do this first!*
- Upload it via the Netgear’s firmware page, under “Advanced” in the web ui.
- Wait a few minutes for the flash to complete.
- Reconnect your computer (get a fresh DHCP lease), then visit
192.168.1.1again. - Log in with:
Username: root
Password: (blank)*Note, maybe do this first!* - Set your own password… and you’re done!
This 2012-era router is now running a fully up-to-date Linux distribution.
In My Case…
I reconfigured mine to serve as a simple gigabit switch:
- Disabled both Wi-Fi radios.
- Configured the “WAN” port into another LAN / switch port.
- Disabled the DHCP server.
- Set the LAN bridge (
br-lan) to DHCP client so it picks up an IP from my main network. - Gave the new router’s MAC a dhcp reservation on my main router, and added the new hostname to my hosts file.
That way I can still log in for maintenance while it’s acting as an extra switch.
WNDR3700 v4 Hardware
CPU / SoC: Atheros AR9344 @ 560 MHz
RAM / Flash: 128 MB RAM / ~128 MB flash
Wireless: Dual-band 2.4 GHz + 5 GHz, 802.11n (N600)
Ethernet: 1× Gigabit WAN, 4× Gigabit LAN
USB: 1× USB 2.0 “ReadySHARE” port
What Can You Do With It?
Plenty. This hardware can easily run the latest OpenWrt without feeling sluggish. The USB port opens up even more possibilities:
- Failover WWAN modem or phone tethering
- Network printer sharing
- USB hard drive for network storage
- DIY internet radio streamer with a USB sound card
With OpenWrt, you’re only limited by your time and imagination.
Why Bother?
Netgear’s last firmware for this model came out in 2018. That’s seven years without security updates. OpenWrt gives you:
- Modern kernel & drivers
- Current security patches
- A huge ecosystem of packages
All on hardware that cost me four bucks at a thrift store.
OpenWrt Support History for the WNDR3700
- Original WNDR3700 (v1) launched in mid–late 2009 with Atheros hardware.
- OpenWrt support for the series appeared within months of launch, making it a long-time favorite in the community.
- The v4 hardware revision hit the market around June 2012.
- Because v4 kept an Atheros chipset (AR9344) with generous RAM and flash, it was officially supported soon after release.
- The best part: Netgear’s stock firmware for v4 accepts an OpenWrt “factory” image through the web interface. No serial cable required, no bootloader tricks, just upload and reboot.
This combination of long-term support, open-friendly hardware, and GUI-based flashing makes the WNDR3700 v4 one of the easiest budget OpenWrt targets you can find.
NETGEAR WNDR3700 on OpenWRT Wiki / TOH
OpenWRT Version 24.10 Factory Image for WNDR3700 V4 – Direct Link
Building an Optimized Linux Kernel on Fedora 42

Preparation: You’ll need to install some tools and dependencies required by the build process. On Fedora you’ll want to run the following:
sudo dnf install gcc make ncurses-devel bc openssl-devel elfutils-libelf-devel rpmdevtools fedpkg rpm-build
sudo dnf builddep kernel
Getting the Kernel source tarball
Head over to https://kernel.org and download your branch of choice. I’d recommend the latest Stable tarball.
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.15.9.tar.xz
tar -xf linux-6.15.9.tar.xz
cd linux-6.15.9
Copy your current defconfig
We’ll copy the running kernel’s configuration into our source tree…
cp /boot/config-$(uname -r) .config
make oldconfig
You should see some output, ending with “configuration written to .config”.
The easiest way to set our flags is to simply export them in our current shell before proceeding to run make. I did the following for my AMD Ryzen 5800XT:
export KCFLAGS=’-march=znver3 -O3′
export KCPPFLAGS=’-march=znver3 -O3′
You can do march=native if you’re not sure exactly what to use for your specific CPU. Only do znver3 if you’ve got a Zen 3 chip!
Then build.*
make -j$(nproc)
* If you’d like, make additional makefile edits before running make. Or, make menuconfig if you’d like to browse through available options. But, be careful… It gets pretty technical! Simply by following the instructions above you’ll end up with a Kernel which is newer than what you’ve got, better optimized, and smaller. Basically, better in all ways. All without having to make any questionable changes on your own… But of course, feel free to explore the available options! Keep in mind, always keep a known-good stable kernel in your grub configuration in case you make a mistake!
Your kernel will take some time to compile. Anywhere from several minutes to a couple of hours, depending on how powerful your processor is and how many modules must be built. Higher optimization levels typically will take more time as well; the standard level is O2, we’re doing O3. Performance is generally better but the initial build will take a bit longer.
When the compilation is finished:
sudo make modules_install
sudo make install
This will install the kernel modules to /lib/modules/6.15.9/ (in this case). These are drivers and kernel features compiled as =m; they’re loadable instead of built directly into the kernel. Make install will install the compiled image to /boot. In this case /boot/vmlinuz-6.15.9.
We can verify our new image is Grub’s default by running:
sudo grubby –default-kernel
We should see “/boot/vmlinuz-6.15.9”.
Reboot into your new optimized kernel!
B550M AORUS ELITE AX — Replacing the lousy WiFi!
Finally decided to retire the Haswell system I’ve been using, and ordered up some AM4 goodies during the recent Prime Day sale. I grabbed an AMD Ryzen 7 5800X (8-core, 16-thread), 32 GB of DDR4-3600, and the Gigabyte AORUS Elite AX (Rev 1.3) motherboard. The CPU was the main draw — it was only $130! The board was on sale for $90 (currently $149.99 on Amazon).

Thus far I am happy with this motherboard. It doesn’t give me the same vibe of Gigabyte superior value which I got back in the day from the likes of the classics — GA-EP45-UD3P comes to mind! — but, for under $100 it seems quite adequate.
The included WiFi leaves much to be desired though… Maybe it works fine on Windows?? On Linux, I was only seeing 2 bars and maybe 300 – 400 Mbps.
The solution? Grab yourself an AX210.
Intel wireless cards have excellent support on Linux and BSD alike. For just $20–$30 online, you can replace the built-in Realtek card. It takes about half a dozen screws to open the board and swap the M.2 module. I highly recommend tweezers for disconnecting and reattaching the tiny U.FL antenna connectors.
Where’s the Wi-Fi module located?


My pings are now way, better. Night and day. And the speed is a solid 100 Mbps better, or more. See for yourself!

XScreenSaver MATE Script for Fedora

Added a script which does all the same things as the Debian MATE XSS script did…
Installs the Full XScreenSaver collection (GL + Extras)
Removes MATE Screensaver
Symlinks XSS commands to replace MATE SS commands
Optional SETUID for Sonar
Ensures MATE SS doesn’t try to reinstall
Locking works via “System” –> “Lock Screen”
Fix for locking via keyboard shortcut
OpenWRT on the Dynalink DL-WRX36 WiFi 6 Router
The Dynalink DL-WRX36 Wireless Router
I purchased my unit from Amazon about 18 months ago. I never even tried the stock firmware — I bought this router specifically because of its solid OpenWRT support and excellent bang-for-the-buck features.
For around $80 (if I recall correctly) you get:
- Qualcomm 2.2 GHz Quad-Core CPU (ARM64 / ARMv8)
- 1 GB RAM, 256 MB Flash (for firmware/storage)
- 2.5 Gbps WAN port, 4× 1 Gbps LAN switch ports
- WiFi 2.4 / 5 GHz dual-band (4× internal antennas)
- USB 3.0 port (for a USB HDD/SSD, FTP/Samba share, or cellular modem, etc.)
It’s a shame — I always intended to do a proper, in-depth review of this unit, along with a full guide on flashing OpenWRT. That said, the flashing process was painless and straightforward. If you’ve ever loaded DD-WRT onto an old Linksys back in the day, this is quite similar, though with a few extra steps.
I do recall some slightly ‘gray’ areas in the instructions on the OpenWRT Table of Hardware (TOH) page for the DL-WRX36, and I had made some notes. If I can dig them up, I’ll definitely update this post to include them. As I remember, nothing critical — just a couple of steps that were worded a little ambiguously. I highly recommend reading through the guide fully before starting, so you’re not left halfway through wondering what to do next.
Is it still available?
Amazon doesn’t have it in stock at the moment. Would I recommend it if it was? Absolutely. I’m very happy with mine.
Things to Note:
- Unofficial builds exist that take advantage of hardware features on this router’s SoC. (The standard OpenWRT images don’t enable these by default — and for now, I’m sticking with the official builds. But performance is still excellent for my needs.)
For those curious, the IPQ807x SoC inside this router supports advanced hardware features like Qualcomm’s NSS (Network Subsystem) hardware acceleration, which dramatically improves routing throughput and reduces CPU load for tasks like NAT, firewalling, and VPN handling. While official OpenWRT builds don’t currently enable these proprietary modules, a few skilled community developers have published unofficial builds that do.
Personally, I run the latest stable firmware from the official OpenWRT release repository, and it’s been absolutely flawless for me. I get my full broadband speeds with headroom to spare — whether wired or over 5 GHz WiFi — and I’ve never felt limited by not having those additional offload features. This setup also ensures I have seamless access to the official OpenWRT package repository via Luci and UCI, with a stable, predictable system that updates cleanly.
That said, for the adventurous or performance-hungry tinkerers out there, those community builds with hardware offloading might be worth exploring. More details and links are listed below if you’d like to check them out.
Additionally — OpenWRT natively supports VLANs and VLAN tagging, letting you create isolated network segments, guest networks, or prioritize traffic on your LAN however you like. Combined with its firewall and routing flexibility, this makes OpenWRT an extremely versatile platform for both home and small business networks.
Performance
Since upgrading my desktop to an Intel AX210 WiFi card, I consistently get 1–3 ms pings to wired LAN machines — pretty respectable. Speeds are solid too, with ~500 Mbps transmit/receive over 5 GHz WiFi.
My configuration is simple:
- One network for 2.4 GHz and another for 5 GHz, each with its own SSID.
- I’ve heard of issues running both bands under a single SSID, so I avoided that.
- IoT devices, mobile phones, TV boxes, etc. are on 2.4 GHz for better range and to keep them off the 5 GHz radio.
- Desktops and laptops connect to 5 GHz for speed.
It works beautifully. No worries about being stuck on ancient 3.x kernels — OpenWRT keeps this thing current and reliable.
Why is OpenWRT the Cat’s Meow?
Luci, the web-based interface, is clean, solid, and well-organized. Every function accessible through the web GUI can also be executed via SSH on the command line.
If you’re a geek, you already get why this is awesome. But for everyone else: it makes quick changes a breeze — no digging through endless menus. You can configure it like a Cisco router via serial, telnet, SSH, or otherwise.
Other Perks
Packages. Tons of networking, telephony, and FOSS/Linux software packages are at your fingertips — one search away.
At the end of the day, every router is a computer of some sort. Unless it runs something exotic like VxWorks, chances are it’s powered by a Linux kernel. OpenWRT puts you in control. It’s your hardware — and you should run it your way. Suddenly that consumer-grade router feels like enterprise-grade gear.
Useful Links
- OpenWRT Project Homepage
- DL-WRX36 Table of Hardware Page
- OpenWRT Forum: DL-WRX36 Support / Technical Discussion
- Qosmio’s Unofficial OpenWRT Build for IPQ807x (with NSS / hardware offload support)
- Qosmio’s Build Config Gist for DL-WRX36
- CookeInCode’s Dynalink DL-WRX36 Custom OpenWRT Builds
- Official OpenWRT Stable Firmware Downloads
Happy hacking!
CrystalDiskMark for Linux?? KDiskMark is here to satisfy!
Here is a bit of KDE software which I was not aware of. It was not included in Debian 11 (Bullseye) — you had to build it from source or use third-party packages… However it was officially packaged starting with Debian 12 (Bookworm) and newer.
Here it is, running it on Kubuntu 25.04:

Excellent little tool for those who don’t want to benchmark disks in the terminal via dd / fio. Nothing wrong with healthy feature parity & easy of use!
Running XScreenSaver on a laptop? Let’s run cool…
For most people these days, screensavers have died off.

I still like having them. And while most people have moved on from X.Org on Linux, well… here we are.
The 5300U in my ThinkPad has more than enough GPU power to display some beautiful screensavers. But by default, the system will ramp up into a higher performance state — because normally, that’s exactly what you’d want. Like if you were playing a game, or trying to load some bloated modern website.
But my idle laptop? I don’t want it getting all hot while it’s sitting on my lap or on the bed, just because it’s running a screensaver. So this is my little attempt to fix that — and it’s looking pretty promising.
The idea:
When XScreenSaver runs one of its screen hacks (screensavers), we’ll put the CPU into its lowest available frequency. That way, even when running hardware-accelerated 3D, the system will stay nice and cool.
Fortunately, the author of XScreenSaver — Jamie Zawinski — is a pretty smart dude, and the software already includes a clean little mechanism we can hook into to make this work.
Here’s how I’ve got it set up:
Create a script in your home folder, or wherever you want. xscreensaver_freq_watch.sh
#!/bin/bash
# Save current CPU and GPU max frequencies
CPU_MAX_BEFORE=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq)
GPU_MAX_BEFORE=$(cat /sys/class/drm/card0/gt_max_freq_mhz)# Watch xscreensaver events
xscreensaver-command -watch | while read -r line
do
case “$line” in
LOCK*)
# Optional: do something on screen lock
;;
UNBLANK*)
echo “Screensaver stopped — restoring frequencies…”
echo $CPU_MAX_BEFORE | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq > /dev/null
echo $GPU_MAX_BEFORE | sudo tee /sys/class/drm/card0/gt_max_freq_mhz > /dev/null
;;
BLANK*)
echo “Screensaver started — limiting frequencies…”
echo 500000 | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq > /dev/null
echo 300 | sudo tee /sys/class/drm/card0/gt_max_freq_mhz > /dev/null
;;
esac
done
Of course, make it exactable with chmod +x. Also, use nopasswd in your /etc/sudoers line for your user.
Now because I’m using MATE / LightDM, I’m going to use a .desktop file. You could do something else, .xinitrc or a systemd service, but this is how I did it.
mkdir -p ~/.config/autostart
nano ~/.config/autostart/screensaver-watch.desktop
And inside that, we have the following
[Desktop Entry]
Type=Application
Exec=/home/ben/screensaver_freq_watch.sh
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Screensaver Frequency Watcher
Comment=Limits CPU and GPU frequencies while the screensaver is running
So far, it’s looking good! You may need to change this a bit depending on your configuration.




