You are not logged in.

#1 2025-06-27 12:53

theasmitkid
Member
From: New Delhi
Registered: 2025-01-26
Posts: 27

My setup on a Dual-Core 2GB Ram Machine

Just wanted to share my experience with Q4OS so far. My laptop has a braswell dual-core cpu (Intel Celeron N3060) and 2GB of onboard memory and a 500GB HDD, and fortunately 64-bit is enabled my the manufacturer. when i got this laptop it was running the latest version of windows 10 with over 80% memory usage on boot and barely any program would run. Decided to try out windows 7 because i've always had good experience with it but unfortunately a lot of drivers were missing for os older than windows 8. Tried windows 8.1, it ran too well on the 1st boot but had somewhat limited app support coz most apps wants me to run windows 10, and when i tried to reboot, i got stuck in a bootloop. Next up tried Tiny10 and it ran fine except it removed a lot of core features which caused many app crashes, frustrated i tried windows xlite project which claimed to be really resource efficient, but it wasnt that much and again a lot of errors coz of missing core files and features. Well i remember i used 1809 build of tiny10 which was kinda fast so i found a 1903 or 1909 build and installed it, pretty fast, did the usual debloating and disabling unneeded features and services and windows updates but this time no files and references were missing so it ran pretty well at 42% ram usage on boot and if i run a resource intensive program or game, it runs well with max of 1.1GB ram usage.

But its still not that fast so i decided to try linux, and i found Q4OS project which i did try installing on my previous 32bit computer but windows 7 just runs better and has more app compatibility

Tried Q4OS 3, 4 and 5, Plasma, LXQT, LXDE, XFCE, and TDE.
Plasma --> too heavy and not as customisable as TDE, for me atleast.
LXQT & LXDE --> just old and not as customisable as TDE.
XFCE --> pretty good but it doesnt have an official installation iso so installation is a pain and setup is quite hard, for me atleast.
TDE --> very lightweight, very customisable, very fast, woah its just the best

Q4OS 3 --> ran really well and even ran anbox easily~
Q4OS 4 --> didnt use much, upgraded to newer LTS
Q4OS 5 --> works pretty well

Currently running dual booted windows 10 1909(or 1903, i dont remember, on sda1) and Q4OS 5 Trinity DE (on sda2), using sda3 for storing most of my files (around 180GB as of now) and sda5 for timeshift, winehq-devel, etc.

i've a 2GB swap disk just for hibernation (and swap, if zram is oom) and zram setup for a total of 2GB. i also enabled zswap in the boot command if i remember correctly..

sda      8:0    0 465.8G  0 disk
├─sda1   8:1    0    32G  0 part
├─sda2   8:2    0    32G  0 part /
├─sda3   8:3    0 335.8G  0 part /userdata
├─sda4   8:4    0     1K  0 part
├─sda5   8:5    0    64G  0 part /stash
└─sda6   8:6    0     2G  0 part [SWAP]
zram0  254:0    0     1G  0 disk [SWAP]
zram1  254:1    0     1G  0 disk [SWAP]

here's the apps i use
1. VLC
-for classes and short videos
-Issues: setting video output to "XVideo Output (XCB)" runs videos really smoothly but i think has a memory leak which causes ram usage of Xorg to increase slowly until the os crashes
-version: 3.0.21 (latest version from apt)

2. MPV
-long videos
-issues: seeking is weird.. it moves like 10s forward and 9.1s backward, the increment of speed is kinda weird too, 1x 1.14x 1.56x...
-version: 0.35.1-4 (latest version from apt)

3. Xarchiver

4. ark-trinity (for when i use konqueror fm)

5. Thunar FM
-lightweight, fast, doesnt crash
-masked gvfs services that i dont use to reduce resource usage
-why thunar? well i used dolphin earlier, but it keeps crashing and mtp stopped working too
-why gvfs? smb, mtp and ftp

6. kate-trinity
-its pretty light, gets simple things done
-why not the modern kate? well its kinda heavy and i dont really need all of those features.

7. Pragtical
-code editor, has all the features i ever need, also fast and lightweight

8. Arduino IDE (Legacy)
-for programming microcontrollers, works the best

9. Fritzing (from apt)
-for kinda bigger projects, designing and programming, works well.

10. Libreoffice, novelwriter, qpdfview, timeshift, gparted, bleachbit, angry ip scanner, godot 3.x, godot 4.x

11. Kcoloredit. kcolorchooser, kcolourpaint (all trinity's), feh, scrcpy
-they are hella fast and got all features, no need for the bulky modern ones

12. Apps i used once upon a time: stacer, pomotroid, sayonara music player, spotube, beeper

13. FreeTube: for youtube videos
-issues: well you need to update it often, and because of an api change on youtube many people are facing some issues, would take some time to fix

14. Winehq-devel (latest dev release)
-also installed x86 office 2007, runs super well
-runs almost every app i normally run on windows, but sometimes i need to use windows 10 anyways

15. Blueman
-well the only bluetooth manager i could find tbh
-made custom plugin to integrate a music player, pomodoro, resource usage overview, wifi usage, download n upload speed, googledrive ocamlfuse, creating a virtual monitor which can be accessed via http on local wifi network, scripts to temporarily fix wifi(by restarting), script to power bluetooth on (sometimes needed), battery monitor(coz tdepower manager is really buggy), still thinking of adding more stuff

16. googledrive ocamlfuse
-it works best for mounting google drive even on an unstable network
-kde's kio gdrive never worked for me, gvfs's one was too heavy and didnt work well on unstable network

17. itch
-the desktop app, runs html games offline and faster than normal webbrowsers

18. Browser
Wow it took a lot of time to find a good browser

Google Chrome
-always sucked
-ram usage: ~600mb on startup

Brave Browser
-too good to be true on my android 8.1 tablet with 2GB ram
-too heavy on both linux and windows
-ram usage: ~772mb on startup on linux

Opera Browsers
-tried all of them, too heavy
-ram usage: 600~900mb on startup

Chromium
-well, okay-ish
-ram usage: ~500mb on startup

Firefox
-had high expectations, but too heavy and too slow for me
-ram usage: 400~800mb on startup

Dillo (compiled from source)
-well.. most stuff dont work
-ram usage: ~200mb on startup

The firefox-in-terminal one
-slowwww and heavy


Ungoogled-Chromium
-the best and fastest browser i've used for desktop
-ram usage in windows: ~160mb on startup (really fast launch time)
-ram usage in Q4OS 5: ~200mb on startup (kinda slow lauch time)
-extensions:
--chromium store(i usually have this disabled and i enable it when i have to install an extention)
--google docs offline (well it works, but i just discovered that it uses like 130mb on idle.. so removed it)
--TWP (translation, works nice)
-installed on windows via installer from github
-installed on linux via portable one from github
-issues: sometimes cloudflare verification fails, need to use different device or firefox to access those pages

19. scrcpy, aft-mtp-mount
-for mtp, aft-mtp-mount works the best for me

20. bt-dualboot
-so that my headphones can work on both windows and linux, cant get it work on my android x86 installation aswell tho.. if you know how can i do it then please guide me

Okay thats pretty much all, now lets talk about theming
-i use the waterleaf dark icon theme because it looks the best to me
--issue: when i have all the extras installed and i try to pick an icon, from lets say kmenuedit, it takes like 10 mins to load the picker and sometimes i need to kill kicker n stuff just so i can use my lapy again)

-bourbon menu style
--issue: when i click on the "apps" button or any folder, it stops responding for 10~20s and after that i enters
--(well it bothered me so much i tried tasty menu from trinity which is really nice but i hated the search so i reverted to this slow bourbon one)

-colours: darkonair, a little modified

-gtk2: breeze

-gtk3: breeze-dark

-style: custom qtcurve style

-window decorations: custom icewm style, it's plain and modern somewhat like windows

-input actions (shortcuts kinda), (did via trinity's control panel)
--tiling: (needs: xdotool)
---center, left, right, left top, left bottom, right top, right bottom, fullscreen
---commands: ctrl+win+enter for center
                    ctrl+win+space for fullscreen
                    ctrl+win+<arrow keys>
---issue? well, if i hold down onto win key it still shows the menu, so i cant tile via win+... i want to show menu when user pressed and released win key and didn't press any other button in between

--brightness management: (needs brightnessctl)
---up, down, toggle
---commands: ctrl+win+f5
                    ctrl+win+f6
                    ctrl+win+f7
---issue: fn+f... doesnt work.. it cant detect XF86MonBrightnessUp XF86MonBrightnessDown events


-paths: well since i've documents donwloads n all in /userdata i changed the path to use this drive, its ntfs and can be used in both win n linux afterall


other issues/stuff:
-wifi and bluetooth issues, after lots n lots of searching still couldnt get it to work properly on q4os, works really well on windows, ended up using fruit's apt repo's firmware which feels a little better to me but still i need to restart wifi time to time so it works and bluetooth headphones keep disconnecting every now and then

-pipewire: it works better than pulseaudio for me so i use it

-slow app launch time

-removed cups because i know i will never use printing stuff with this device, also removed firmware for devices i know i would never use

-has enabled deb backports, proposed updates n all

-trinity stuff, like using non konsole terminals doesnt work on this version of trinity de, it was fixed in later versions of trinity and it also brings xdg-desktop-portal-tde and many other bug fixes so excited for Q4OS 6, hopefully wifi n bluetooth issues and other issues i mentioned in the post are fixed by then too~

-these days feel like q4os has gotten slower than win10 installation(it used to be faster a couple months ago)

so thats all, q4os 5 (64bit) boots up with 350mb ram without blueman and 417mb with blueman and my extra heavy-ish plugins, but sometimes i use windows 10 coz its faster, sorry for broken english every now and then, im not a native english speaker

if you want to know about something specific then feel free to, and also if you can help me fix the issues i've mentioned all around the post then i would be really grateful
thankyou~

Last edited by theasmitkid (2025-06-27 12:56)

Offline

#2 2025-06-28 10:57

josek
Member
Registered: 2025-02-23
Posts: 75

Re: My setup on a Dual-Core 2GB Ram Machine

You need to install all pipewire and bluez dependencies.

When you encounter Bluetooth issues on Linux, especially with audio, the combination of PipeWire (or PulseAudio) and BlueZ is key.
You need the PulseAudio compatibility module: pipewire-pulse (so that applications that expect PulseAudio can work with PipeWire).

You need the PipeWire session manager: pipewire-media-session or the more modern wireplumber. These manage audio connections and device profiles.
For PulseAudio (if not using PipeWire):

You need the Bluetooth module for PulseAudio: pulseaudio-module-bluetooth. If this module is missing, PulseAudio cannot "see" Bluetooth audio devices.

I also had the same problem when using PulseAudio, and it would keep cutting out or the sound would go out.

By the way, my Q40S Trinity consumes 230MB of RAM, even booting in 5 seconds (before it took 30s and consumed 450MB). The machine didn't hibernate or anything. I had to modify the grub, the initramfs, download kernel modules, modify some systemd files...
The Q40S is heavy for some machines, but it's quite lightweight and will fly if you optimize it little by little and remove features you don't use daily.

Offline

#3 2025-06-28 13:57

theasmitkid
Member
From: New Delhi
Registered: 2025-01-26
Posts: 27

Re: My setup on a Dual-Core 2GB Ram Machine

Yes i do have all bluez and pipewire deps installed,

The only bluetooth issue I have is that my headphones keep disconnecting every 10 or so minutes if no media is being played. And similarly i need to restart wifi every 30 mins or so when I suddenly stop being able to access the internet.. rebooting fixes the Bluetooth issue, it kinda increases the disconnects time to 1 hour but wifi is still problematic no matter what, also note that i don't have any wifi/Bluetooth issue on windows and android-x86 installation on same device

Sometimes after doing timeshift restores bluetooth and wifi stops working on Linux as well as windows, and the only solution for me was to boot into Android-x86 and restart Bluetooth and wifi there, booting back into other os, they just start working again.

230MB of ram on boot is quite impressive! I couldn't get lower than 277MB on any of my device using any version of Q4OS, maybe I just have some program requirements which consume more ram than yours~

Offline

#4 2025-06-28 15:10

josek
Member
Registered: 2025-02-23
Posts: 75

Re: My setup on a Dual-Core 2GB Ram Machine

It seems like an energy management problem

Addressing Recurring Disconnections

This focuses on power saving within Linux.

Disable Wi-Fi Power Saving:

Temporarily:

Bash

sudo iwconfig wlan0 power off
(Replace wlan0 with the name of your Wi-Fi interface; ip a will display it.)

Permanently (NetworkManager Method):

In the Wi-Fi connection options in NetworkManager (graphical network configuration), find the "Wi-Fi Settings" or "IPv6" tab and change the "Power Saving Mode" to "Disabled" or "Never."

Or create a file in /etc/NetworkManager/conf.d/ (e.g., sudo nano /etc/NetworkManager/conf.d/disable-wifi-powersave.conf) with:

[connection]
wifi.powersave = 2
(Then sudo systemctl reload NetworkManager).

Disable Bluetooth power saving:
This can be a bit more complex, as Bluetooth doesn't have a similar iwconfig command.

Edit the main BlueZ configuration file:

Bash

sudo nano /etc/bluetooth/main.conf
Find the [General] section and make sure the line AutoEnable=true is commented out or disabled (or change it to false if it exists) and Disable=Socket and ControllerMode=dual if present.

Find the [Policy] section and see if there's anything about "auto-suspend." You might need to add:

Enable=Source,Sink,Headset,Gateway,Control,Media
AutoConnect=true
Restart the Bluetooth service after the changes: sudo systemctl restart bluetooth

Kernel/driver version: Sometimes a newer or older kernel, or specific drivers (e.g., from a PPA) can fix Wi-Fi/Bluetooth issues on problematic laptops.

Offline

#5 2025-06-28 15:40

theasmitkid
Member
From: New Delhi
Registered: 2025-01-26
Posts: 27

Re: My setup on a Dual-Core 2GB Ram Machine

i have already disabled wifi power saving sinces ages

asmit@asmit-e202sa:~$ ls /etc/NetworkManager/conf.d/*
/etc/NetworkManager/conf.d/default-wifi-powersave-on.conf
asmit@asmit-e202sa:~$ cat /etc/NetworkManager/conf.d/*
[connection]
wifi.powersave = 2

and about bluetooth config, i am a little confused about what you said.. here's my /etc/bluetooth/main.conf, what should i change?

[General]

# Defaults to 'BlueZ X.YZ', if Name is not set here and plugin 'hostname' is not loaded.
# The plugin 'hostname' is loaded by default and overides the Name set here so
# consider modifying /etc/machine-info with variable PRETTY_HOSTNAME=<NewName> instead.
#Name = BlueZ

# Default device class. Only the major and minor device class bits are
# considered. Defaults to '0x000000'.
#Class = 0x000100

# How long to stay in discoverable mode before going back to non-discoverable
# The value is in seconds. Default is 180, i.e. 3 minutes.
# 0 = disable timer, i.e. stay discoverable forever
#DiscoverableTimeout = 0

# Always allow pairing even if there are no agent registered
# Possible values: true, false
# Default: false
#AlwaysPairable = false

# How long to stay in pairable mode before going back to non-discoverable
# The value is in seconds. Default is 0.
# 0 = disable timer, i.e. stay pairable forever
#PairableTimeout = 0

# Use vendor id source (assigner), vendor, product and version information for
# DID profile support. The values are separated by ":" and assigner, VID, PID
# and version.
# Possible vendor id source values: bluetooth, usb (default) or false (disabled)
#DeviceID = bluetooth:1234:5678:abcd

# Do reverse service discovery for previously unknown devices that connect to
# us. For BR/EDR this option is really only needed for qualification since the
# BITE tester doesn't like us doing reverse SDP for some test cases, for LE
# this disables the GATT client functionally so it can be used in system which
# can only operate as peripheral.
# Defaults to 'true'.
#ReverseServiceDiscovery = true

# Enable name resolving after inquiry. Set it to 'false' if you don't need
# remote devices name and want shorter discovery cycle. Defaults to 'true'.
#NameResolving = true

# Enable runtime persistency of debug link keys. Default is false which
# makes debug link keys valid only for the duration of the connection
# that they were created for.
#DebugKeys = false

# Restricts all controllers to the specified transport. Default value
# is "dual", i.e. both BR/EDR and LE enabled (when supported by the HW).
# Possible values: "dual", "bredr", "le"
#ControllerMode = dual

# Maximum number of controllers allowed to be exposed to the system.
# Default=0 (unlimited)
#MaxControllers=0

# Enables Multi Profile Specification support. This allows to specify if
# system supports only Multiple Profiles Single Device (MPSD) configuration
# or both Multiple Profiles Single Device (MPSD) and Multiple Profiles Multiple
# Devices (MPMD) configurations.
# Possible values: "off", "single", "multiple"
#MultiProfile = off

# Permanently enables the Fast Connectable setting for adapters that
# support it. When enabled other devices can connect faster to us,
# however the tradeoff is increased power consumptions. This feature
# will fully work only on kernel version 4.1 and newer. Defaults to
# 'false'.
#FastConnectable = false

# Default privacy setting.
# Enables use of private address.
# Possible values for LE mode: "off", "network/on", "device"
# Possible values for Dual mode: "off", "network/on", "device",
# "limited-network", "limited-device"
#
# - off: Local privacy disabled.
#
# - network/on: A device will only accept advertising packets from peer
# devices that contain private addresses. It may not be compatible with some
# legacy devices since it requires the use of RPA(s) all the time.
#
# - device: A device in device privacy mode is only concerned about the
# privacy of the device and will accept advertising packets from peer devices
# that contain their Identity Address as well as ones that contain a private
# address, even if the peer device has distributed its IRK in the past.

# - limited-network: Apply Limited Discoverable Mode to advertising, which
# follows the same policy as to BR/EDR that publishes the identity address when
# discoverable, and Network Privacy Mode for scanning.
#
# - limited-device: Apply Limited Discoverable Mode to advertising, which
# follows the same policy as to BR/EDR that publishes the identity address when
# discoverable, and Device Privacy Mode for scanning.
#
# Defaults to "off"
#Privacy = off

# Specify the policy to the JUST-WORKS repairing initiated by peer
# Possible values: "never", "confirm", "always"
# Defaults to "never"
#JustWorksRepairing = never

# How long to keep temporary devices around
# The value is in seconds. Default is 30.
# 0 = disable timer, i.e. never keep temporary devices
#TemporaryTimeout = 30

# Enables the device to issue an SDP request to update known services when
# profile is connected. Defaults to true.
#RefreshDiscovery = true

# Enables D-Bus experimental interfaces
# Possible values: true or false
Experimental = true

# Enables kernel experimental features, alternatively a list of UUIDs
# can be given.
# Possible values: true,false,<UUID List>
# Possible UUIDS:
# d4992530-b9ec-469f-ab01-6c481c47da1c (BlueZ Experimental Debug)
# 671b10b5-42c0-4696-9227-eb28d1b049d6 (BlueZ Experimental Simultaneous Central and Peripheral)
# 15c0a148-c273-11ea-b3de-0242ac130004 (BlueZ Experimental LL privacy)
# 330859bc-7506-492d-9370-9a6f0614037f (BlueZ Experimental Bluetooth Quality Report)
# a6695ace-ee7f-4fb9-881a-5fac66c629af (BlueZ Experimental Offload Codecs)
# 6fbaf188-05e0-496a-9885-d6ddfdb4e03e (BlueZ Experimental ISO socket)
# Defaults to false.
#KernelExperimental = false

# The duration to avoid retrying to resolve a peer's name, if the previous
# try failed.
# The value is in seconds. Default is 300, i.e. 5 minutes.
#RemoteNameRequestRetryDelay = 300

[BR]
# The following values are used to load default adapter parameters for BR/EDR.
# BlueZ loads the values into the kernel before the adapter is powered if the
# kernel supports the MGMT_LOAD_DEFAULT_PARAMETERS command. If a value isn't
# provided, the kernel will be initialized to it's default value.  The actual
# value will vary based on the kernel version and thus aren't provided here.
# The Bluetooth Core Specification should be consulted for the meaning and valid
# domain of each of these values.

# BR/EDR Page scan activity configuration
#PageScanType=
#PageScanInterval=
#PageScanWindow=

# BR/EDR Inquiry scan activity configuration
#InquiryScanType=
#InquiryScanInterval=
#InquiryScanWindow=

# BR/EDR Link supervision timeout
#LinkSupervisionTimeout=

# BR/EDR Page Timeout
#PageTimeout=

# BR/EDR Sniff Intervals
#MinSniffInterval=
#MaxSniffInterval=

[LE]
# The following values are used to load default adapter parameters for LE.
# BlueZ loads the values into the kernel before the adapter is powered if the
# kernel supports the MGMT_LOAD_DEFAULT_PARAMETERS command. If a value isn't
# provided, the kernel will be initialized to it's default value.  The actual
# value will vary based on the kernel version and thus aren't provided here.
# The Bluetooth Core Specification should be consulted for the meaning and valid
# domain of each of these values.
# LE advertisement interval (used for legacy advertisement interface only)
#MinAdvertisementInterval=
#MaxAdvertisementInterval=
#MultiAdvertisementRotationInterval=

# LE scanning parameters used for passive scanning supporting auto connect
# scenarios
#ScanIntervalAutoConnect=
#ScanWindowAutoConnect=

# LE scanning parameters used for passive scanning supporting wake from suspend
# scenarios
#ScanIntervalSuspend=
#ScanWindowSuspend=

# LE scanning parameters used for active scanning supporting discovery
# proceedure
#ScanIntervalDiscovery=
#ScanWindowDiscovery=

# LE scanning parameters used for passive scanning supporting the advertisement
# monitor Apis
#ScanIntervalAdvMonitor=
#ScanWindowAdvMonitor=

# LE scanning parameters used for connection establishment.
#ScanIntervalConnect=
#ScanWindowConnect=

# LE default connection parameters.  These values are superceeded by any
# specific values provided via the Load Connection Parameters interface
#MinConnectionInterval=
#MaxConnectionInterval=
#ConnectionLatency=
#ConnectionSupervisionTimeout=
#Autoconnecttimeout=

# Scan duration during interleaving scan. Only used when scanning for ADV
# monitors. The units are msec.
# Default: 300
#AdvMonAllowlistScanDuration=
# Default: 500
#AdvMonNoFilterScanDuration=

# Enable/Disable Advertisement Monitor interleave scan for power saving.
# 0: disable
# 1: enable
# Defaults to 1
#EnableAdvMonInterleaveScan=

[GATT]
# GATT attribute cache.
# Possible values:
# always: Always cache attributes even for devices not paired, this is
# recommended as it is best for interoperability, with more consistent
# reconnection times and enables proper tracking of notifications for all
# devices.
# yes: Only cache attributes of paired devices.
# no: Never cache attributes
# Default: always
#Cache = always

# Minimum required Encryption Key Size for accessing secured characteristics.
# Possible values: 0 and 7-16. 0 means don't care.
# Defaults to 0
#KeySize = 0

# Exchange MTU size.
# Possible values: 23-517
# Defaults to 517
#ExchangeMTU = 517

# Number of ATT channels
# Possible values: 1-5 (1 disables EATT)
# Default to 3
#Channels = 3

[AVDTP]
# AVDTP L2CAP Signalling Channel Mode.
# Possible values:
# basic: Use L2CAP Basic Mode
# ertm: Use L2CAP Enhanced Retransmission Mode
#SessionMode = basic

# AVDTP L2CAP Transport Channel Mode.
# Possible values:
# basic: Use L2CAP Basic Mode
# streaming: Use L2CAP Streaming Mode
#StreamMode = basic

[Policy]
#
# The ReconnectUUIDs defines the set of remote services that should try
# to be reconnected to in case of a link loss (link supervision
# timeout). The policy plugin should contain a sane set of values by
# default, but this list can be overridden here. By setting the list to
# empty the reconnection feature gets disabled.
#ReconnectUUIDs=00001112-0000-1000-8000-00805f9b34fb,0000111f-0000-1000-8000-00805f9b34fb,0000110a-0000-1000-8000-00805f9b34fb,0000110b-0000-1000-8000-00805f9b34fb

# ReconnectAttempts define the number of attempts to reconnect after a link
# lost. Setting the value to 0 disables reconnecting feature.
#ReconnectAttempts=7

# ReconnectIntervals define the set of intervals in seconds to use in between
# attempts.
# If the number of attempts defined in ReconnectAttempts is bigger than the
# set of intervals the last interval is repeated until the last attempt.
#ReconnectIntervals=1,2,4,8,16,32,64

# AutoEnable defines option to enable all controllers when they are found.
# This includes adapters present on start as well as adapters that are plugged
# in later on. Defaults to 'true'.
AutoEnable=true

# Audio devices that were disconnected due to suspend will be reconnected on
# resume. ResumeDelay determines the delay between when the controller
# resumes from suspend and a connection attempt is made. A longer delay is
# better for better co-existence with Wi-Fi.
# The value is in seconds.
# Default: 2
#ResumeDelay = 2

[AdvMon]
# Default RSSI Sampling Period. This is used when a client registers an
# advertisement monitor and leaves the RSSISamplingPeriod unset.
# Possible values:
# 0x00       Report all advertisements
# N = 0xXX   Report advertisements every N x 100 msec (range: 0x01 to 0xFE)
# 0xFF       Report only one advertisement per device during monitoring period
# Default: 0xFF
#RSSISamplingPeriod=0xFF

Offline

#6 2025-06-28 18:12

josek
Member
Registered: 2025-02-23
Posts: 75

Re: My setup on a Dual-Core 2GB Ram Machine

After reviewing your main.conf, my previous suggestions about AutoEnable or ControllerMode=dual aren't the key here, as those are fine or are default values that don't cause the inactivity disconnection issue.

The issue of headphones disconnecting "if no media is playing" is a very common symptom of a power-saving feature or inactivity disconnection policy in the audio layer (PipeWire/PulseAudio), not so much the BlueZ daemon itself (bluetoothd).

Configuring PipeWire/WirePlumber for Idle Timeouts:

Since you use PipeWire and WirePlumber (we saw this in your systemctl --user list-units), it's likely that the inactivity policy for Bluetooth devices is handled by WirePlumber.

Look for WirePlumber configuration files related to Bluetooth. These are usually located in:

/usr/share/wireplumber/main.lua.d/ (system files)

~/.config/wireplumber/main.lua.d/ (user configuration files)
There may be a file like 50-alsa-config.lua or 50-bluetooth-policy.lua (or similar) that contains a line like audio.properties = { session.suspend.timeout = 5000000 } (the value is in nanoseconds) or something similar. The default value for Bluetooth devices is sometimes very low (e.g., 5 seconds) if there is no active stream.

Search for terms like timeout, suspend-on-idle, or idle-timeout within those files. If you find a low timeout, you can try increasing it. If the line is commented out, it means the default value is used and you may need to add a new one.

Quick (but perhaps not elegant) Bluetooth fix:
If you can't find the specific setting in WirePlumber, some users have solved this by constantly playing an inaudible "silence" in their headphones. This tricks the system into thinking there's continuous audio activity. There are utilities for this if you really need it as a last resort.

Sorry I can't give you an effective solution, but it's always better to check the configuration files in case we're missing something or some data that could be useful to us.
Wi-Fi power saving is fine now. For Bluetooth, look at the PipeWire/WirePlumber settings related to audio stream idle time.

Offline

#7 2025-06-28 20:17

theasmitkid
Member
From: New Delhi
Registered: 2025-01-26
Posts: 27

Re: My setup on a Dual-Core 2GB Ram Machine

upgraded realtek firmware to bookworm backports' latest one, wifi feels stable so far, will report after a few days of use.. bluetooth is still disconnenecting so i rekon its a wireplumber issue

found this

asmit@asmit-e202sa:~$ ls /usr/share/wireplumber/main.lua.d/
00-functions.lua          30-v4l2-monitor.lua     50-default-access-config.lua
20-default-access.lua     40-device-defaults.lua  50-libcamera-config.lua
30-alsa-monitor.lua       40-stream-defaults.lua  50-v4l2-config.lua
30-libcamera-monitor.lua  50-alsa-config.lua      90-enable-all.lua
asmit@asmit-e202sa:~$ cat /usr/share/wireplumber/main.lua.d/50*
alsa_monitor.enabled = true

alsa_monitor.properties = {
  -- Create a JACK device. This is not enabled by default because
  -- it requires that the PipeWire JACK replacement libraries are
  -- not used by the session manager, in order to be able to
  -- connect to the real JACK server.
  --["alsa.jack-device"] = false,

  -- Reserve devices via org.freedesktop.ReserveDevice1 on D-Bus
  -- Disable if you are running a system-wide instance, which
  -- doesn't have access to the D-Bus user session
  ["alsa.reserve"] = true,
  --["alsa.reserve.priority"] = -20,
  --["alsa.reserve.application-name"] = "WirePlumber",

  -- Enables MIDI functionality
  ["alsa.midi"] = true,

  -- Enables monitoring of alsa MIDI devices
  ["alsa.midi.monitoring"] = true,

  -- MIDI bridge node properties
  ["alsa.midi.node-properties"] = {
    -- Name set for the node with ALSA MIDI ports
    ["node.name"] = "Midi-Bridge",
    -- Removes longname/number from MIDI port names
    --["api.alsa.disable-longname"] = true,
  },

  -- These properties override node defaults when running in a virtual machine.
  -- The rules below still override those.
  ["vm.node.defaults"] = {
    ["api.alsa.period-size"] = 256,
    ["api.alsa.headroom"] = 8192,
  },
}

alsa_monitor.rules = {
  -- An array of matches/actions to evaluate.
  --
  -- If you want to disable some devices or nodes, you can apply properties per device as the following example.
  -- The name can be found by running pw-cli ls Device, or pw-cli dump Device
  --{
  --  matches = {
  --    {
  --      { "device.name", "matches", "name_of_some_disabled_card" },
  --    },
  --  },
  --  apply_properties = {
  --    ["device.disabled"] = true,
  --  },
  --}
  {
    -- Rules for matching a device or node. It is an array of
    -- properties that all need to match the regexp. If any of the
    -- matches work, the actions are executed for the object.
    matches = {
      {
        -- This matches all cards.
        { "device.name", "matches", "alsa_card.*" },
      },
    },
    -- Apply properties on the matched object.
    apply_properties = {
      -- Use ALSA-Card-Profile devices. They use UCM or the profile
      -- configuration to configure the device and mixer settings.
      ["api.alsa.use-acp"] = true,

      -- Use UCM instead of profile when available. Can be
      -- disabled to skip trying to use the UCM profile.
      --["api.alsa.use-ucm"] = true,

      -- Don't use the hardware mixer for volume control. It
      -- will only use software volume. The mixer is still used
      -- to mute unused paths based on the selected port.
      --["api.alsa.soft-mixer"] = false,

      -- Ignore decibel settings of the driver. Can be used to
      -- work around buggy drivers that report wrong values.
      --["api.alsa.ignore-dB"] = false,

      -- The profile set to use for the device. Usually this is
      -- "default.conf" but can be changed with a udev rule or here.
      --["device.profile-set"] = "profileset-name",

      -- The default active profile. Is by default set to "Off".
      --["device.profile"] = "default profile name",

      -- Automatically select the best profile. This is the
      -- highest priority available profile. This is disabled
      -- here and instead implemented in the session manager
      -- where it can save and load previous preferences.
      ["api.acp.auto-profile"] = false,

      -- Automatically switch to the highest priority available port.
      -- This is disabled here and implemented in the session manager instead.
      ["api.acp.auto-port"] = false,

      -- Other properties can be set here.
      --["device.nick"] = "My Device",
    },
  },
  {
    matches = {
      {
        -- Matches all sources.
        { "node.name", "matches", "alsa_input.*" },
      },
      {
        -- Matches all sinks.
        { "node.name", "matches", "alsa_output.*" },
      },
    },
    apply_properties = {
      --["node.nick"]              = "My Node",
      --["node.description"]       = "My Node Description",
      --["priority.driver"]        = 100,
      --["priority.session"]       = 100,
      --["node.pause-on-idle"]     = false,
      --["monitor.channel-volumes"] = false
      --["resample.quality"]       = 4,
      --["resample.disable"]       = false,
      --["channelmix.normalize"]   = false,
      --["channelmix.mix-lfe"]     = false,
      --["channelmix.upmix"]       = true,
      --["channelmix.upmix-method"] = "psd",  -- "none" or "simple"
      --["channelmix.lfe-cutoff"]  = 150,
      --["channelmix.fc-cutoff"]   = 12000,
      --["channelmix.rear-delay"]  = 12.0,
      --["channelmix.stereo-widen"] = 0.0,
      --["channelmix.hilbert-taps"] = 0,
      --["channelmix.disable"]     = false,
      --["dither.noise"]           = 0,
      --["dither.method"]          = "none",  -- "rectangular", "triangular" or "shaped5"
      --["audio.channels"]         = 2,
      --["audio.format"]           = "S16LE",
      --["audio.rate"]             = 44100,
      --["audio.allowed-rates"]    = "32000,96000",
      --["audio.position"]         = "FL,FR",
      --["api.alsa.period-size"]   = 1024,
      --["api.alsa.period-num"]    = 2,
      --["api.alsa.headroom"]      = 0,
      --["api.alsa.start-delay"]   = 0,
      --["api.alsa.disable-mmap"]  = false,
      --["api.alsa.disable-batch"] = false,
      --["api.alsa.use-chmap"]     = false,
      --["api.alsa.multirate"]     = true,
      --["latency.internal.rate"]  = 0
      --["latency.internal.ns"]    = 0
      --["clock.name"]             = "api.alsa.0"
      --["session.suspend-timeout-seconds"] = 5,  -- 0 disables suspend
    },
  },
}
default_access.enabled = true

default_access.properties = {
  -- Enable the use of the flatpak portal integration.
  -- Disable if you are running a system-wide instance, which
  -- doesn't have access to the D-Bus user session
  ["enable-flatpak-portal"] = true,
}

default_access.rules = {
  {
    matches = {
      {
        { "pipewire.access", "=", "flatpak" },
        { "media.category", "=", "Manager" },
      },
    },
    default_permissions = "all",
  },
  {
    matches = {
      {
        { "pipewire.access", "=", "flatpak" },
      },
    },
    default_permissions = "rx",
  },
  {
    matches = {
      {
        { "pipewire.access", "=", "restricted" },
      },
    },
    default_permissions = "rx",
  },
}
libcamera_monitor.enabled = true

libcamera_monitor.rules = {
  -- An array of matches/actions to evaluate.
  {
    -- Rules for matching a device or node. It is an array of
    -- properties that all need to match the regexp. If any of the
    -- matches work, the actions are executed for the object.
    matches = {
      {
        -- This matches all cards.
        { "device.name", "matches", "libcamera_device.*" },
      },
    },
    -- Apply properties on the matched object.
    apply_properties = {
      -- ["device.nick"] = "My Device",
    },
  },
  {
    matches = {
      {
        -- Matches all sources.
        { "node.name", "matches", "libcamera_input.*" },
      },
      {
        -- Matches all sinks.
        { "node.name", "matches", "libcamera_output.*" },
      },
    },
    apply_properties = {
      --["node.nick"] = "My Node",
      --["priority.driver"] = 100,
      --["priority.session"] = 100,
      --["node.pause-on-idle"] = false,
    },
  },
}
v4l2_monitor.enabled = true

v4l2_monitor.rules = {
  -- An array of matches/actions to evaluate.
  {
    -- Rules for matching a device or node. It is an array of
    -- properties that all need to match the regexp. If any of the
    -- matches work, the actions are executed for the object.
    matches = {
      {
        -- This matches all cards.
        { "device.name", "matches", "v4l2_device.*" },
      },
    },
    -- Apply properties on the matched object.
    apply_properties = {
      -- ["device.nick"] = "My Device",
    },
  },
  {
    matches = {
      {
        -- Matches all sources.
        { "node.name", "matches", "v4l2_input.*" },
      },
      {
        -- Matches all sinks.
        { "node.name", "matches", "v4l2_output.*" },
      },
    },
    apply_properties = {
      --["node.nick"] = "My Node",
      --["priority.driver"] = 100,
      --["priority.session"] = 100,
      --["node.pause-on-idle"] = false,
    },
  },
}

should i uncomment it and set it to zero?

--["session.suspend-timeout-seconds"] = 5,  -- 0 disables suspend

note: user config files for wireplumber doesnt exist.

thankyou for your time, i really appreciate the efforts you have put to help me out @josek so no need to apologise

Offline

#8 2025-06-28 21:52

josek
Member
Registered: 2025-02-23
Posts: 75

Re: My setup on a Dual-Core 2GB Ram Machine

Since "user configuration files for wireplumber do not exist" (which is normal by default), you must create a user configuration file for WirePlumber to override this system setting.

1. Create the user configuration directory (if it doesn't exist):
mkdir -p ~/.config/wireplumber/main.lua.d/

2. Create a new configuration file to override inactivity suspend:
This file will be named 99-disable-suspend.lua (the 99- ensures that it is loaded last and overrides any other settings for the same property).
nano ~/.config/wireplumber/main.lua.d/99-disable-suspend.lua

-- ~/.config/wireplumber/main.lua.d/99-disable-suspend.lua
-- This rule disables the session suspension timeout for all ALSA audio inputs and outputs.
-- This often helps with Bluetooth headset disconnects due to inactivity, since Bluetooth devices
-- are typically managed as "ALSA nodes" by PipeWire.

-- Insert a new rule for ALSA audio outputs (e.g., headsets)
table.insert(alsa_monitor.rules, {
  matches = {
    { "node.name", "matches", "alsa_output.*" },
  },
  apply_properties = {
    ["session.suspend-timeout-seconds"] = 0, -- 0 = deshabilitar la suspensión por inactividad
  },
  priority = 1000, -- Asigna una prioridad alta para asegurar que esta regla prevalezca
})

-- Inserta una nueva regla para las entradas de audio ALSA (ej. micrófonos de auriculares)
table.insert(alsa_monitor.rules, {
  matches = {
    { "node.name", "matches", "alsa_input.*" },
  },
  apply_properties = {
    ["session.suspend-timeout-seconds"] = 0, -- 0 = deshabilitar la suspensión por inactividad
  },
  priority = 1000, -- Assign a high priority to ensure this rule prevails
})

##  This Lua code will add a new rule to WirePlumber that sets the sleep time to 0 seconds for all ALSA audio input and output (which is how PipeWire handles Bluetooth devices):

3.Save and close the file (Ctrl+O, Enter, Ctrl+X in nano).

4.Apply the changes:
systemctl --user restart wireplumber.service

Or simply log out and log back in.

After this, your Bluetooth headphones should no longer disconnect from media playback due to inactivity. I hope this resolves your Bluetooth issue.

Offline

#9 2025-07-06 11:14

theasmitkid
Member
From: New Delhi
Registered: 2025-01-26
Posts: 27

Re: My setup on a Dual-Core 2GB Ram Machine

After a week of usage, i still have similar issues, headphones still disconnect and reconnect every now and then :(

Last edited by theasmitkid (2025-07-06 11:15)

Offline

#10 2025-07-19 19:50

GuestStar
Member
Registered: 2022-06-15
Posts: 4

Re: My setup on a Dual-Core 2GB Ram Machine

Just a side note not connected to your issues. Some time ago I was testing different swap options for a similar setup and I found zram swap work better for me. If you use zram anyway, skip installing and running zswap, they'll fight for the sparse resources. At least in other debian based distros where neither of them is initially installed it is enough to install the meta package zram-tools from the debian repos. It will set up a default zram swap, and you can configure it further to your liking.

Offline

#11 2025-07-19 23:53

Ells
Member
Registered: 2025-06-18
Posts: 7

Re: My setup on a Dual-Core 2GB Ram Machine

I found the Falkon browser to be very lightweight and I've had no trouble with it for the websites I frequent. Not much in the way of extensions except an ad blocker but that's fine by me.


Q4OS w/ Trinity on HP 210 Netbook, 2 GB RAM, Atom processor

Offline

Board footer

Powered by FluxBB