EasyOS draft submitted to Wikipedia
Forum member pp4mnk submitted this to Wikipedia awhile ago:
https://en.wikipedia.org/wiki/Draft:EasyOS
I didn't mention it earlier, as I thought that it looked OK and would be accepted. But it hasn't, see the commentary prepended.
pp4mnk sent me this in a private message, June 26:
I consider positive if easyos users can visit it and make
suggestions to improve it, but they must take into account
wikipedia basics, so a post publishing that I have prepared a
Wikipedia draft, and it is currently awaiting review. If anyone
would like to take a look and notices any errors, references
that could be improved, or sections that could be made more
neutral, I would be greatly appreciate any suggestions.
https://en.wikipedia.org/wiki/Draft:EasyOS
Many people think Wikipedia has very few restrictions, but
it's actually quite the opposite. The standards are very strict,
and depending on which reviewer evaluates your draft, getting it
accepted can sometimes be quite challenging. Let's keep our
fingers crossed!
I greatly appreciate the effort that pp4mnk has put into this.
Maybe someone could edit it, take out what they consider to be
LLM-generated.
Tags: easy
Fix for pulseaudio causing app crash
Described this earlier today:
https://bkhome.org/news/202608/pulseaudio-mixer-causes-apps-to-crash.html
I'm concerned that apps other than geany might also crash, and apps other than pavucontrol might cause the crashes.
So, have restored this in /etc/profile:
export XLIB_SKIP_ARGB_VISUALS=1
As was described in a github link in the previous blog post, enabling that variable causes issues with Asian languages in chromium. So, instead have disabled it in chromium.
/usr/bin/chromium is a script, that will run chromium as user "chromium". I have inserted this into the script:
unset XLIB_SKIP_ARGB_VISUALS
The script is generated by /usr/local/clients/setup-client, by woofQ2 when EasyOS is built.
Interesting, I wonder if some other mysterious crashes that some
users have reported, will now be fixed.
Tags: easy
Pulseaudio mixer causes apps to crash
Forum members vtpup and NorthernSoul have reported the problem:
https://forum.puppylinux.com/viewtopic.php?p=175677#p175677
Look in /etc/profile:
#20230918 remove... ref: https://github.com/puppylinux-woof-CE/woof-CE/pull/3867
##v2.10 MU: rox crashes with DRI modules. solution:
#export XLIB_SKIP_ARGB_VISUALS=1
That link:
https://github.com/puppylinux-woof-CE/woof-CE/pull/3867
That variable was unset due to Chromium unable to properly display Chinese and other Asian characters if it is set.
I'll think about it, but probably won't set it globally, just set
it when run 'pavucontrol', as the guys have suggested.
Tags: easy
More packages compiled in woofQ2
Just to let you guys know, I'm still working on EasyOS; currently compiling packages in woofQ2.
The Excalibur-series is built with a lot of binary packages from the Scarthgap-series. Scarthgap is built with binary packages compiled in OpenEmbedded/Yocto, and there are a lot that are not available in the Devuan/Debian repositories. Hence, those binary packages have been used to build the Excalibur-series. But, I am gradually porting them into woofQ2, so they will be compiled in a running Easy Excalibur.
Doing the nomad thing right now, and likely for sometime into the
future, so at times won't have Internet access. Right now where
I'm camping, don't have a phone signal, but do have one nearby. A
five minute walk, where I am right now.
Tags: easy
EasyOS Excalibur-series version 7.4.7 released
Right now, I'm camping on the south coast of Western Australia. My campsite does not have a phone signal, but a short work away, overlooking the ocean, get 4G Vodafone and Optus signals. Weak, but usable.

I went there this morning and started to upload the Easy 7.4.7 release. But, so slow. So, drove to a nearby town, which has the phone tower where the 4G is coming from at my campsite. This time, quicker upload, and interesting, Vodafone performing better than Telstra. Was anxiously watching the battery level, now down to 22%, after everything has uploaded.
This town has a library and community centre, and they are happy
for me to bring in my laptop and plug it into the mains power. So
will do that next time, if I'm still here.
Highlights since 7.4.6:
- Xlibre and gtk2-ng are back! — August 09, 2026
- Remove user-installed package if builtin — August 09, 2026
- Continuing getting APT to work in a layered filesystem — August 08, 2026
- Grey with pink-highlights theme — August 01, 2026
Download:
https://distro.ibiblio.org/easyos/amd64/releases/excalibur/2026/7.4.7/
See you on the forum!
Tags: easy
Xlibre and gtk2-ng are back!
Xlibre, the continuation of X11, and gtk2-ng, the continuation of gtk2, were in EasyOS 7.4. In a subsequent release, I removed Xlibre as the 'nouveau' driver caused the X server to crash. Then in another later release, gtk2-ng was removed, as it caused Xdialog to misbehave.
Well, good news, these are active projects, and the developers of both have fixed the problems. See my issue posts and the replies:
"Xdialog calendar broken"
https://git.devuan.org/Daemonratte/gtk2-ng/issues/27
"Xserver crashes for all testers with nouveau driver"
https://github.com/X11Libre/xserver/issues/3144
I haven't personally verified that these are fixed. Will build
Easy 7.4.7 soon, and will be able to verify Xdialog fixed, but you
guys with nVidia GPU can verify that nouveau now
works.
Tags: easy
Remove user-installed package if builtin
The previous blog post explained how APT is sync'ed with what is actually installed in the overlayfs layered filesystem:
https://bkgome.org/news/202608/continuing-getting-apt-to-work-in-a-layered-filesystem.html
The 'sync-dpkg-layers' script previously had some code to delete a user-installed package if it is now builtin. However, it did not work properly in that context.
What can happen is that a user installs a package, but at the next version update of EasyOS, that package is builtin to easy.sfs or devx.sfs. This may be a "corner case" but it does happen. In that situation, the user-installed package needs to be removed; however, it cannot be done while EasyOS is running. It has to be done before the layered filesystem is created, in the initrd.
I have created /sbin/zrem-user-pkgs in the initrd, called from /sbin/fixlayers. Script 'fixlayers' has this code:
#20260809 rem user-installed pkg if builtin...
if [ -n "$prevVER" ];then #prevVER set if a version update.
/sbin/zrem-user-pkgs ${WKG_DEV} ${WKG_DIR} ${prevVER}
fi
Here is script 'zrem-user-pkgs':
#!/bin/ash
#20260808 called from fixlayers
#situation where user has installed a package, then at next EasyOS version, same pkg
#is builtin to easy.sfs (or dev.sfs). Then need to remove the user-installed pkg.
#passed in...
WKG_DEV="$1" #ex: sda2
WKG_DIR="$2" #ex: easyos/
VER="$3" #previous version. ex: 7.4.6
#########
#containers...
Cpaths="$(find /mnt/${WKG_DEV}/${WKG_DIR}containers -mindepth 1 -maxdepth 1 -type d)"
#...ex: /mnt/nvme0n1p2/excalibur/containers/devx
for aS in ${Cpaths}
do
[ -z "$aS" ] && continue
[ ! -d "$aS/.session" ] && continue
[ ! -f "$aS/configuration" ] && continue
grep -q '^EASY_LAYER_RO.*devx' ${aS}/configuration
if [ $? -ne 0 ];then
#devx not loaded.
WOOFpkgs='/easy_ro/easy_sfs/root/.packages/woof-installed-packages'
else
#devx loaded.
WOOFpkgs='/easy_ro/easy_sfs/root/.packages/woof-installed-packages /easy_ro/easy_sfs/root/.packages/devx-only-installed-packages'
fi
for aU in $(cut -f 2 -d '|' ${aS}/.session/root/.packages/user-installed-packages | busybox tr '\n' ' ')
do
grep -q -F "|${aU}|" ${WOOFpkgs}
if [ $? -eq 0 ];then
if [ -f ${aS}/.session/var/lib/dpkg/info/${aU}.list ];then
FLIST="${aS}/.session/var/lib/dpkg/info/${aU}.list"
else
FLIST="$(find ${aS}/.session/root/.packages/filesdb -maxdepth 1 -name "${aU}_*.files" | head -n 1)"
fi
if [ -n "$FLIST" ];then
while read aF
do
[ -z "$aF" ] && continue
[ "$aF" == "/." ] && continue
if [ -f "${aS}/.session${aF}" ];then
rm -f "${aS}/.session${aF}"
fi
done <${FLIST}
#also delete empty folder...
while read aF
do
[ -z "$aF" ] && continue
[ "$aF" == "/." ] && continue
if [ -d "${aS}/.session${aF}" ];then
find "${aS}/.session${aF}" -maxdepth 0 -type d -empty -delete
fi
done <${FLIST}
sed -i "/|${aU}|/d" ${aS}/.session/root/.packages/user-installed-packages
fi
fi
done
done
############
#main desktop
#'configuration' file in this location:
#/mnt/${WKG_DEV}/${WKG_DIR}releases/easy-<version>/configuration
#with entry like this: "EASY_LAYER_RO1=devx.sfs"
[ ! -f /mnt/${WKG_DEV}/${WKG_DIR}releases/easy-${VER}/configuration ] && exit
grep -q '^EASY_LAYER_RO.*devx' /mnt/${WKG_DEV}/${WKG_DIR}releases/easy-${VER}/configuration
if [ $? -eq 0 ];then
#devx loaded.
WOOFpkgs='/easy_ro/easy_sfs/root/.packages/woof-installed-packages /easy_ro/easy_sfs/root/.packages/devx-only-installed-packages'
else
#devx not loaded.
WOOFpkgs='/easy_ro/easy_sfs/root/.packages/woof-installed-packages'
fi
for aU in $(cut -f 2 -d '|' /mnt/${WKG_DEV}/${WKG_DIR}.session/session1/root/.packages/user-installed-packages | busybox tr '\n' ' ')
do
grep -q -F "|${aU}|" ${WOOFpkgs}
if [ $? -eq 0 ];then
if [ -f /mnt/${WKG_DEV}/${WKG_DIR}.session/session1/var/lib/dpkg/info/${aU}.list ];then
FLIST="/mnt/${WKG_DEV}/${WKG_DIR}.session/session1/var/lib/dpkg/info/${aU}.list"
else
FLIST="$(find /mnt/${WKG_DEV}/${WKG_DIR}.session/session1/root/.packages/filesdb -maxdepth 1 -name "${aU}_*.files" | head -n 1)"
fi
if [ -n "$FLIST" ];then
while read aF
do
[ -z "$aF" ] && continue
[ "$aF" == "/." ] && continue
if [ -f "/mnt/${WKG_DEV}/${WKG_DIR}.session/session1${aF}" ];then
rm -f "/mnt/${WKG_DEV}/${WKG_DIR}.session/session1${aF}"
fi
done <${FLIST}
#also delete empty folder...
while read aF
do
[ -z "$aF" ] && continue
[ "$aF" == "/." ] && continue
if [ -d "/mnt/${WKG_DEV}/${WKG_DIR}.session/session1${aF}" ];then
find "/mnt/${WKG_DEV}/${WKG_DIR}.session/session1${aF}" -maxdepth 0 -type d -empty -delete
fi
done <${FLIST}
sed -i "/|${aU}|/d" /mnt/${WKG_DEV}/${WKG_DIR}.session/session1/root/.packages/user-installed-packages
fi
fi
done
###end###
It is another hack to get APT and dpkg to play nice in the
layered filesystem.
Tags: easy
Continuing getting APT to work in a layered filesystem
The problem is fundamental; Debian's APT has no concept of a layered filessystem such as overlayfs. Getting it to work in such an environment is a major challenge. The issues started with EasyOS 7.0, that introduced APT as the underlying package manager, with PKGget (PPM) is a GUI frontend.
EasyOS runs in an overlayfs stacked filesystem, with bottom layer the read-only easy.sfs (mounted on a folder), and the read-write layer either in RAM or a folder in the working partition. There may be more read-only layers, in between, for example devx.sfs.
APT maintains, via the underlying dpkg, /var/lib/dpkg/status file and /var/lib/dpkg/info folder, and these are created in easy.sfs. Any changes, such as install a package, will be written on the read-write layer. At a version upgrade of EasyOS, there will be new APT database information in the easy.sfs read-only layer, making the information in the read-write layer incorrect.
The woofQ2 build system creates the devx.sfs such that when it is layered on top of easy.sfs, the /var/lib/dpkg data in the devx.sfs represents everything, all the installed packages in both the devx.sfs and easy.sfs
This creates a major problem; if the user decides to install the devx.sfs, then at bootup, the database information in the read-write layer will be completely incorrect.
EasyOS 7.0 has basic handling of this, but there were issues, that we have been tackling. Here are past relevant blog posts:
https://bkhome.org/news/202508/dpkg-db-ro-and-rw-layers-synchronized.html
https://bkhome.org/news/202607/fix-for-multiple-sfs-layers-in-main-desktop.html
https://bkhome.org/news/202607/partial-fix-for-devx-sfs-loaded-on-main-desktop.html
It did seem to be working ok in the devx container, but loading devx.sfs on the main desktop, the database information was not correctly updating on the read-write layer. So, have worked some more on it...
Right now, sitting in a tent, at a campsite on the south coast of Western Australia. Very windy, but the tent is holding up and OK inside.
I have introduced this code in /usr/local/easy_containers/start-container:
#20260808 copy debian 'status' file(s) into container...
mkdir -p ${CONTAINER}/root/.packages
cp -a -f /mnt/.easy_ro/easy_sfs/var/lib/dpkg/status ${CONTAINER}/root/.packages/woof-status
grep -q '^EASY_LAYER_RO.*devx\.sfs' /mnt/${WKG_DEV}/${WKG_DIR}containers/${EXE}/configuration
if [ $? -eq 0 ];then
cp -a -f /mnt/${WKG_DEV}/${WKG_DIR}containers/${EXE}/.devx/var/lib/dpkg/status ${CONTAINER}/root/.packages/devx-woof-status
else
rm -f ${CONTAINER}/root/.packages/devx-woof-status 2>/dev/null
fi
...purpose is to make the dpkg 'status' file available inside a container. If the devx.sfs is loaded, there will be two of them.
Script /usr/local/petget/alias/sync-dpkg-layers has had an almost complete rewrite:
#!/bin/bash
#bootup new version of easyos, there will be discrepancies between /var/lib/dpkg
#in /mnt/wkg/.session/session1 (and in containers .session) and in easy.sfs
#--new or removed pkgs in easy.sfs, version changes.
export LANG=C
mkdir -p /tmp/petget
###############
#get list of installed ro packages...
if [ -e /root/.packages/devx-woof-status ];then
#running in a container, with devx loaded.
Cmode=3
DEVXloaded=1
ROstatuspath='/root/.packages/devx-woof-status'
ROstatusnames="$(grep '^Package: ' /root/.packages/devx-woof-status | cut -f 2 -d ' ' | sort)"
elif [ -e /root/.packages/woof-status ];then
#running in a container, without devx loaded.
Cmode=2
DEVXloaded=0
ROstatuspath='/root/.packages/woof-status'
ROstatusnames="$(grep '^Package: ' /root/.packages/woof-status | cut -f 2 -d ' ' | sort)"
elif [ -e /mnt/.easy_ro/devx/usr/bin/gcc ];then
#running on main desktop, devx loaded.
Cmode=1
DEVXloaded=1
ROstatuspath='/mnt/.easy_ro/devx/var/lib/dpkg/status'
#devx sfs was constructed to have record of all packages installed, devx+easy.sfs
ROstatusnames="$(grep '^Package: ' /mnt/.easy_ro/devx/var/lib/dpkg/status | cut -f 2 -d ' ' | sort)"
else
#running on main desktop, no devx.
Cmode=0
DEVXloaded=0
ROstatuspath='/mnt/.easy_ro/easy_sfs/var/lib/dpkg/status'
ROstatusnames="$(grep '^Package: ' /mnt/.easy_ro/easy_sfs/var/lib/dpkg/status | cut -f 2 -d ' ' | sort)"
fi
echo -n "${ROstatuspath}" > /tmp/petget/ROstatuspath
#this will contain pkgs installed in ro-layer and user-installed...
# but, will be wrong if devx layer added or removed.
RWstatus="$(grep '^Package: ' /var/lib/dpkg/status | cut -f 2 -d ' ' | sort)"
echo -n "$RWstatus" > /tmp/petget/dpkg-RWstatus
echo -n "$ROstatusnames" > /tmp/petget/dpkg-ROstatusnames
#find pkgs in rw layer, not in ro...
NEWstatus="$(grep -v -F -x -f /tmp/petget/dpkg-ROstatusnames /tmp/petget/dpkg-RWstatus)"
#...some of these are user-installed, some no longer in easy.sfs
echo -n "${NEWstatus}" > /tmp/petget/dpkg-NEWstatus
#find pkgs in ro layer, not in rw...
MISSstatus="$(grep -v -F -x -f /tmp/petget/dpkg-RWstatus /tmp/petget/dpkg-ROstatusnames)"
#...these may be new in easy.sfs or devx.sfs
echo -n "${MISSstatus}" > /tmp/petget/dpkg-MISSstatus
##############
#handle NEWstatus...
for aNEW in ${NEWstatus}
do
[ -z "$aNEW" ] && continue
grep -q -F "|${aNEW}|" /root/.packages/user-installed-packages
[ $? -eq 0 ] && continue
grep -q -F "|${aNEW}|" /root/.packages/woof-installed-packages
[ $? -eq 0 ] && continue
#20250822 careful, devx sfs may be loaded...
if [ $DEVXloaded -ne 0 ];then
grep -q -F "|${aNEW}|" /root/.packages/devx-only-installed-packages
[ $? -eq 0 ] && continue
fi
#want to purge it from db, as no longer exists...
sed -i "/^Package: ${aNEW}$/,/^$/d" /var/lib/dpkg/status
rm -f /var/lib/dpkg/info/${aNEW}:* 2>/dev/null
rm -f /var/lib/dpkg/info/${aNEW}.* 2>/dev/null
done
##############
#handle MISSstatus...
for aMISS in ${MISSstatus}
do
[ -z "$aMISS" ] && continue
#extract paragraph from ro-layer, append on rw-layer...
P1="$(sed -n "/^Package: ${aMISS}$/,/^$/p" ${ROstatuspath})"
[ -z "$P1" ] && continue
echo "${P1}
" >> /var/lib/dpkg/status
done
#############
#handle pkg version change...
ROpkgs="$(grep -E '^Package: |^Version: |^$' ${ROstatuspath} | cut -f 2 -d ' ' | sed -e 's%^$%ZZZZZ%' | tr '\n' '|' | sed -e 's%|ZZZZZ|%\n%g')"
#...ex: xserver-xorg-video-vmware|1:13.4.0-1 (note, some have epoch prefix, such as "1:"
for aP in ${ROpkgs}
do
[ -z "$aP" ] && continue
Pn="${aP%|*}"
Pv="${aP#*|}"
RWpara="$(sed -n "/^Package: ${Pn}$/,/^$/p" /var/lib/dpkg/status)"
grep -q "^Version: ${Pv}$" <<<"$RWpara"
if [ $? -ne 0 ];then
#top-level status file has wrong version...
#delete it...
sed -i "/^Package: ${Pn}$/,/^$/d" /var/lib/dpkg/status
ROpara="$(sed -n "/^Package: ${Pn}$/,/^$/p" ${ROstatuspath})"
echo "${ROpara}
" >> /var/lib/dpkg/status
#also the info files...
rm -f /var/lib/dpkg/info/${Pn}:* 2>/dev/null
rm -f /var/lib/dpkg/info/${Pn}.* 2>/dev/null
case "$Cmode" in
3) #running in a container, with devx loaded.
true
;;
2) #running in a container, without devx loaded.
true
;;
1)#running on main desktop, devx loaded.
cp -a -f /mnt/.easy_ro/devx/var/lib/dpkg/info/${Pn}:* /var/lib/dpkg/info/ 2>/dev/null
cp -a -f /mnt/.easy_ro/devx/var/lib/dpkg/info/${Pn}.* /var/lib/dpkg/info/ 2>/dev/null
;;
0) #running on main desktop, no devx.
cp -a -f /mnt/.easy_ro/easy_sfs/var/lib/dpkg/info/${Pn}:* /var/lib/dpkg/info/ 2>/dev/null
cp -a -f /mnt/.easy_ro/easy_sfs/var/lib/dpkg/info/${Pn}.* /var/lib/dpkg/info/ 2>/dev/null
;;
esac
fi
done
sync
###end###
In a nutshell, what all of the above does, is make sure that the
information in the top read-write layer, in particular
/var/lib/dpkg/status, agrees with what is actually installed. It
seems logical, but will need more testing.
Tags: easy