Creating Rocky Linux 8.6 for 32bit i686/i586

[Screenshot of Rocky Linux 8.6 desktop on Pentium 120MHz]

This page is an attempt to create a Rocky Linux 8 for 32bit i686/i586.

Warning: This doesn't work on MMX-only processors. Processors with MMX but no SSE will execute some SSE instructions as MMX instruction, which lacks #UD exception for emulating it.
Note: This is just a technical challenge. It is insanely impractical to deploy Rocky Linux/AlmaLinux/CentOS 8 on sub-GHz CPUs in any way.

It works fairly well on Pentium M 1.8GHz. KDE 5 is somewhat sluggish, but works.

Some figures deployed on Pentium 120MHz:


$Keywords: Rocky Linux 8, AlmaLinux 8, CentOS Linux 8, 32bit, el8.i686, el8.i586, installation media respin, anaconda, Pentium, CMOV emulation, SSE emulation, SSE2 emulation, QtWebEngine without SSE2 $

Former info for CentOS 8.5 i586 is also archived.

$Id: i686.html,v 1.17 2022-07-24 22:08:44+09 kabe Exp $ (2021/09)


Does this work on my machine?

Your CPU has capability of
cmov mmx sse sse2 works? Example CPUs
yesplain Pentium
mmx noPentium MMX, K6-2, WinChip
cmovmmx noPentium II, Cyrix MII
cmovmmxsse noPentium III, Athlon XP
cmovmmxssesse2 yesPentium M, Pentium 4

The reason for all this fuss is that not all binaries are re-compiled. RHEL provided userland .i686 RPMs includes CMOV and SSE2 instructions which needs emulation, but MMX/SSE only processors cannot emulate them properly.

Memory Requirement

You need enough memory to fit the unexpanded (70MB) and expanded (~220MB) initrd of anaconda installer, plus kernel itself (20MB uncompressed), plus the work memory. 512MB was not enough.


Things you need

Compiled kernel's /lib/modules/4.18.0-*/bls.conf "title" label will be taken from the work machine's /etc/os-release , so using the same distribution for work machine and target is recommended.


Preparing i686 compilation environment

Compiling for .i686.rpm packages should be done in setarch i686'ed chroot environment. Many packages just doesn't cross-compile properly in x86_64 environment.

On the work machine, make SELinux permissive. This is a lorax(1) requirement. You need a reboot for this. Build of sed package fails if SELinux is totally disabled.

Bind-mounting a chroot filesystems

Suppose you are prepring a chroot environment in /chroot/i686/ of the work machine. After sudo mkdir -p /chroot/i686/, add the following entries in /etc/fstab :

# /chroot/i686
/proc		/chroot/i686/proc	none auto,bind 0 0
/dev		/chroot/i686/dev	none auto,bind 0 0
/dev/pts	/chroot/i686/dev/pts	none auto,bind 0 0
tmpfs		/chroot/i686/dev/shm	tmpfs auto,nosuid,nodev 0 0
sysfs		/chroot/i686/sys	sysfs auto,rw,nosuid,nodev,noexec 0 0
/sys/fs/cgroup	/chroot/i686/sys/fs/cgroup none auto,bind 0 0
## to let systemd build test see a /sys/fs/cgroup/systemd fs_type
/sys/fs/cgroup/systemd	/chroot/i686/sys/fs/cgroup/systemd none auto,bind 0 0
## to let systemd build test see /run/systemd/session/<#>
/run		/chroot/i686/run	none auto,bind 0 0
## to let sed build test see selinux
selinuxfs	/chroot/i686/sys/fs/selinux	selinuxfs auto 0 0

/home		/chroot/i686/home	none auto,bind 0 0

Do:

base$ sudo mkdir -p /chroot/i686/{proc,dev,sys,run} /chroot/i686/home

Then, manually mount the entries above, or just reboot to mount them all.

Bootstrapping 32bit development environment in the chroot

The goal is to prepare enough 32bit packages into /chroot/i686/ to run rpmbuild(8).

Drop-in ix86.repo as /chroot/i686/etc/yum.repos.d/ix86.repo .

base$ sudo mkdir -p /chroot/i686/etc/yum.repos.d/
base$ sudo cp ix86.repo /chroot/i686/etc/yum.repos.d/ix86.repo
base$ sudo cp /etc/resolv.conf /chroot/i686/etc/

Install rpm-build package and mass dependencies using dnf --installroot . Use precompiled packages provided by this site for bootstrapping.

base$ sudo setarch i686 --32bit \
    dnf --installroot=/chroot/i686 --releasever=8 \
    --disablerepo=\* \
    --enablerepo=ix86repo-BaseOS --enablerepo=ix86repo-AppStream \
    --verbose install rpm-build sudo

Pull in other packages needed for rpmbuild:

base$ sudo setarch i386 --32bit \
    dnf --installroot=/chroot/i686 --releasever=8 \
    --disablerepo=\* \
    --enablerepo=ix86repo-BaseOS --enablerepo=ix86repo-AppStream \
    --verbose install dnf gcc make

chrooting to the i686 environment

With bash(1) installed in the chroot, it should be able to chroot inside. Check uname -a to see if it is an i686 environment.

base$ uname -a
Linux rocky8.five.ten 4.18.0-348.el8.0.2.x86_64 #1 SMP Sun Nov 14 00:51:12 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

base$ sudo cp -p /etc/passwd /etc/shadow /etc/sudoers /chroot/i686/etc/
base$ sudo setarch i686 --32bit chroot /chroot/i686 sudo -u $LOGNAME -s
i686$ uname -a
Linux rocky8.five.ten 4.18.0-348.el8.0.2.x86_64 #1 SMP Sun Nov 14 00:51:12 UTC 2021 i686 i686 i386 GNU/Linux
This is tedious, so you want to add the following to ~/.bashrc in the work machine's base x86_64 system:
if [ `uname -m` != i686 ]; then
	alias i686env="sudo setarch i686 --32bit chroot /chroot/i686 sudo -u $LOGNAME -s"
fi


Compiling a Package

Now, you would compile the individual packages.

To compile a package,

mkdir a dedicated directory

Since you are mass-building various packages, directly building under ~/rpmbuild/ is not recommended. The example below uses ~/c8builds/coreutils-c8/ for coreutils package build.

base$ sudo setarch i686 --32bit chroot /chroot/i686
i686# sudo -u user -s
user@i686$ cd
user@i686$ mkdir -p c8builds/coreutils-c8
user@i686$ cd c8builds/coreutils-c8
user@i686$ pwd
/home/user/c8builds/coreutils-c8

Prepare the directory for rpmbuild

You would like to run a following mkrpmdir shellscript inside the directory:

#!/bin/sh

### mkdir
#for d in RPMS/i686 RPMS/i486 RPMS/i586 RPMS/noarch RPMS/i386 BUILD SPECS SRPMS SOURCES; do mkdir -p $d; done
for d in SPECS SOURCES; do mkdir -p $d; done

### ./rpmbin
cat > ./rpmbin << 'EOF'
#!/bin/sh

D=${0%/*}
## bash builtin "pwd" will return virtual path when
## symlink involves in the path. Avoid it.
## Otherwise /usr/lib/rpm/debugedit will be screwed.
#test x"$D" = x"." && D="`pwd`"
test x"$D" = x"." && D="`/bin/pwd`"

#--target=i586
exec ${0##*/} -D "_topdir $D" "$@"

EOF
chmod +x ./rpmbin

### symlink ./rpmbuild, ./rpm -> rpmbin
for i in rpmbuild rpm; do rm -f ./$i; ln -s rpmbin ./$i; done

### Makefile
if [ ! -e ./Makefile ]; then
cat > ./Makefile << 'EOF'
PKG=$(shell ls SPECS/*.spec | sed -ne 's:SPECS/\(.*\)\.spec$$:\1:p')
DIST=.el8
binary:
	./rpmbuild --target=i586 -v -bb \
	-D 'dist $(DIST)' \
	SPECS/$(PKG).spec 2>&1 | \
	while IFS="" read line; do echo `date '+%Y-%m-%d %T'` "$$line"; done | \
	tee log

src:
	./rpmbuild --target=i586 -v -bs \
	-D 'dist $(DIST)' \
	SPECS/$(PKG).spec
EOF
fi
This script prepares ./rpm and ./rpmbuild to install/compile the package.

Download a source rpm

Source RPMs are available under ix86.repo/Source/, or if not, under Rocky Linux mirror. For example, source RPM for coreutils package is at https://download.rockylinux.org/pub/rocky/8.6/BaseOS/source/tree/Packages/c/coreutils-8.30-12.el8.src.rpm . Download it:

user@i686$ curl -R -O https://download.rockylinux.org/pub/rocky/8.6/BaseOS/source/tree/Packages/c/coreutils-8.30-12.el8.src.rpm
You would like to take note what directory the package goes eventually:
user@i686$ echo BaseOS > reponame

Expand the source rpm in the directory

"Install" the source rpm in the current directory. You do not need a root privilege for source installation and compile.

user@i686$ ./rpm -ivh coreutils-8.30-12.el8.src.rpm
Note that you use ./rpm . It installs the source RPM in current directory and populates ./SPECS/ and ./SOURCE/ .

Invoke rpmbuild to build the binary RPM

You will invoke ./rpmbuild multiple times until it compiles, so prepare a ./Makefile like the following:

PKG=$(shell ls SPECS/*.spec | sed -ne 's:SPECS/\(.*\)\.spec$$:\1:p')
DIST=.el8
binary:
	./rpmbuild --target=i586 -v -bb \
	-D 'dist $(DIST)' \
	SPECS/$(PKG).spec 2>&1 | \
	while IFS="" read line; do echo `date '+%Y-%m-%d %T'` "$$line"; done | \
	tee log

src:
	./rpmbuild --target=i586 -v -bs \
	-D 'dist $(DIST)' \
	SPECS/$(PKG).spec
Change the emphasized part according to the package.

Invoke rpmbuild to build the binary RPM

You have made a Makefile, so invoke

user@i686$ make
./rpmbuild --target=i586 -v -bb \
-D 'dist .el8' \
SPECS/coreutils.spec 2>&1 | \
while IFS="" read line; do echo `date '+%Y-%m-%d %T'` "$line"; done| \
tee log
2020-11-03 07:17:53 error: Failed build dependencies:
2020-11-03 07:17:53     autoconf is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     automake is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     gettext-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     glibc-langpack-en is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     gmp-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     hostname is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     libacl-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     libattr-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     libcap-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     libselinux-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     libselinux-utils is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     openssl-devel is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     strace is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53     texinfo is needed by coreutils-8.30-7.el8.1.i586
2020-11-03 07:17:53 Building target platforms: i586
2020-11-03 07:17:53 Building for target i586
Log will be logged in ./log file. You will normally have dependencies like above to resolve for building packages. Recursively build and install them, or install from this site:
i686# dnf --disablerepo=\* --enablerepo=ix86repo-\* install strace
Repeat recursive build, install and make until binary RPMs are built.


Packages modified for 32bit

Kernel

Although the not hardest to compile for 32bit, kernel package has the most patches.

Bootloader (grub2)

Patched to make grub2-pc-modules as .i586, not .noarch .

RPM toolset

These are patched to let .i686 packages install on i586 host. (Usually rpm refuses so)

anaconda

Patched for slower machine deployment.

D-Bus and systemd patched to allow longer timeout

Eliminate hardcoded cmov, sse2

Refer Source directory for other modified packages.

Note: QtWebEngine (Chromium) is about 20 time heavier than KHTML even after eliminating SSE2. Konqueror provided on this page is patched to use KHTML by default. (EPEL Konqueror defaults to QtWebEngine)

Opcode emulation kernel

The kernel above has CMOV, NOPL, FCOMI, FCMOVcc opcode emulation, and some SSE2 emulation enough to run compiler-generated (-mfpmath=sse) SSE2 instructions. This will let .i686 binaries run on i586 CPUs, which lacks cmov and sse2 capability.

Note: opcode emulation is very slow in nature. Recompile for .i586 whenever possible.

Counts of emulated opcodes will be available under /proc/emulated_ops:

$ cat /proc/emulated_ops
cmov:   3750123
nopl:   0
fcomi:  0
fucomi: 0
fcmov:  0
sse:    32682918
sse2:   1489899

GNOME3 is heavy; use KDE5

On RHEL 8, for desktop environment, only GNOME 3 is provided, but on slow machines I strongly recommend KDE. GNOME3 had become too heavyweight for sub-GHz, single-thread processor. KDE 5 is provided via EPEL, but since it provides only x86_64 binaries, every KDE 5 components had to be recompiled for 32bit.


Packages needed to be copied from Rocky Linux repository

Collect .i686 packages listed in rocky-packages.txt from your favorite Rocky Linux x86_64 repository or mirror. For downloading, dnf download --downloadonly --downloaddir=`pwd` package will download it in the current directory, but timestamp is not preserved. Recommend downloading by wget or curl -R -O .


Packages needed to be compiled

Compile source packages listed in compile-packages.txt .

These packages needs to be compiled because either

Use Source RPMs in Source directory if available. If there wasn't, use Source RPMs from Rocky Linux downloads or mirror .

Packages needed to be checked out from Git

Following packages may not have corresponding source RPM in Rocky Linux mirror. You must directly check it out from https://git.rockylinux.org/staging/rpms/packagename.git/ or git.centos.org.

antlr babeltrace bcel console-setup datefudge libabigail pam_wrapper perl(-5.26) psutils python-cryptography-vectors python-pretend rubygem-coderay rubygem-kramdown unicode-emoji

Example:

user@i686$ git clone https://git.rockylinux.org/staging/rpms/datefudge.git/ datefudge-c8 ## checks out into ./datefudge-c8/ directory

To download the missing source blobs, you could use get_rocky_sources.sh , which is the modified version of CentOS get_sources.sh .

You may also need to git clone the whole dependencies of ghc (Glasgow Haskell Compiler), which is dependency of pandoc, which is dependency of LLVM.

Packages requiring nonstandard rpmbuild Makefile

See List of nonstandard Makefiles.

EPEL packages for KDE 5

For KDE 5 desktop, additional EPEL source packages must be compiled.

If you encountered an error similar to the following:

CMake Error: The source directory "/home/user/c8builds/kf5-kwindowsystem-epel-c8/BUILD/kwindowsystem-5.68.0/i586-redhat-linux-gnu" does not appear to contain CMakeLists.txt.
Add -D '__cmake_in_source_build 1' to the rpmbuild arguments.


Collecting Compiled Packages into a Repository

You need to collect the downloaded/compiled RPMs and assemble them as a repository, which lorax(1) requires.

Preparing a Repository directory

Prepare another directory for a repository:

user@i686$ cd
user@i686$ mkdir ix86.repo
user@i686$ cd ix86.repo
user@i686$ mkdir -p BaseOS/Packages AppStream/Packages PowerTools/Packages epel/Packages

Collecting compiled RPMs

Then, collect the downloaded/compiled binary RPMs into the above directories. You don't have to strictly follow the location of the directory as published in Rocky/CentOS/RHEL; if you are lazy, just cramming everything into BaseOS/Packages/ may work.

user@i686$ find ../c8builds/coreutils-c8/RPMS/ -name '*.rpm' | egrep -v -- '-debuginfo-|-debugsource-' | xargs ln -t BaseOS/Packages
You would like to take advantage of "reponame" file made earlier for automatic sieving.

Run createrepo_c

First, browse in the Rocky Linux x86_64 binary repository for comps.xml file. If your favorite mirror is located at https://download.rockylinux.org/pub/rocky/8.6/BaseOS/x86_64/os/ , the comps.xml file may be at https://download.rockylinux.org/pub/rocky/8.6/BaseOS/x86_64/os/repodata/217729a5f5641e407369df34462664dfbe2e20de280336e2956d7351cb6e6de6-comps-BaseOS.x86_64.xml . Copy it as ./comps-BaseOS.x86_64.xml (for later use).

Then, invoke createrepo_c against the RPM collection directory:

user@i686$ mkdir -p ./BaseOS/repodata/
user@i686$ cp -p comps-BaseOS.x86_64.xml ./BaseOS/repodata/comps.xml
user@i686$ createrepo_c -v --groupfile repodata/comps.xml ./BaseOS
Do the same thing against ./AppStream/ , ./PowerTools/ and ./epel/ directory.

Add module information

Since the compiled RPMs are not "modularized", there are no module info in the repository and anaconda installation will fail. Install a repo2module program.

user@i686$ dnf --enablerepo=ix86\* modulemd-tools
Add module information to the repository:
user@i686$ cd
user@i686$ cd ix86.repo
user@i686$ repo2module --module-name=BaseOS --module-stream=stable ./BaseOS modules.yaml
## ./modules.yaml will be created. No need to edit for current purpose
user@i686$ modifyrepo_c --mdtype=modules modules.yaml BaseOS/repodata
Do the same thing against ./AppStream/ and ./PowerTools/ .

(Optional) Check if the repo is queriable

Use dnf --repofrompath option to temporary make the new repository recognized, and list the contents.

user@i686$ dnf --disablerepo=\* --repofrompath=testrepo-BaseOS,`pwd`/BaseOS clean all
user@i686$ dnf --disablerepo=\* --repofrompath=testrepo-BaseOS,`pwd`/BaseOS list
...
zlib.i586                            1.2.11-13.el8           testrepo-BaseOS
zlib-devel.i586                      1.2.11-13.el8           testrepo-BaseOS
zlib-static.i586                     1.2.11-13.el8           testrepo-BaseOS


Assembling anaconda installer

After you had made the repository, it's the time to use lorax(1) to assemble the anaconda installer.

On the x86_64 work host, install lorax package from official repository or media.

base$ sudo dnf --disablerepo=\* --enablerepo=media\* install lorax

Create boot image with lorax

On the x86_64 work host, prepare a separate directory for boot image assembling. Begin with a pristine directory to store the boot.iso file:

base$ cd
base$ mkdir c8lorax
base$ cd c8lorax

base$ rm -fr ./img8

Download add_template.tmpl file. You need this if the target machine is a slow machine.

Then, invoke the lorax with some options. Below assumes that assembled repository resides in ../ix86.repo/ .

base$ sudo lorax -p "Rocky Linux" -v 8 -r 8 \
	-s `pwd`/../ix86.repo/BaseOS \
	-s `pwd`/../ix86.repo/AppStream \
	-s `pwd`/../ix86.repo/PowerTools \
	--add-template `pwd`/add_template.tmpl \
	--buildarch=i686 --nomacboot \
	`pwd`/img8
This takes a long time! (about 40 minutes on 3GHz 2-thread machine) Logfiles are automatically created as ./lorax.log, ./pylorax.log, ./program.log .

As a result, ./img8/ will be populated with installer boot files, notably ./img8/images/boot.iso .

Scratch directories, owned by root, may be lying around in /var/tmp/lorax/ directory. You can safely delete them.

The created files are owned by root, so you would like to

base$ sudo chown -R $LOGNAME ./img8
base$      chmod -R +w       ./img8

The generated ./img8/images/boot.iso of about 828MB should boot as a network installer. You would like to try it out on target machine to see if the anaconda installer would work. (from RHEL 8.5, even the network installer does not fit on a CD.)

Discussion

lorax does not use the native files of the work machine to build the installer; it unpacks files from the *.rpm in the -s path directory. Thus the work host doesn't have to be i686; working on x86_64 should be okay.


Collect packages from the repository to a DVD tree

Copy (hardlink) over your repository contents to ./img8/ .

base$ sudo chown -R $LOGNAME ./img8
base$ rm -fr ./img8/Packages ./img8/SPackages ./img8/repodata
base$ rm -fr ./img8/{BaseOS,AppStream,PowerTools,epel}
base$ cp -rpl ../ix86.repo/{BaseOS,AppStream,PowerTools,epel} ./img8/

Optionally, if the target machine is slow, append the kernel boot line with inst.xtimeout=600 (wait for 600 seconds for Xorg to start; default 60 secs)

base$ sed -i -e 's/ quiet$/ inst.xtimeout=600&/' ./img8/isolinux/isolinux.cfg


Regenerate .treeinfo

The ./img8/.treeinfo generated by lorax doesn't include BaseOS/, AppStream/ et al directives. You must recreate it.

You need to install python3-productmd package beforehand. If the work host is not Fedora, RHEL or CentOS, you have to patch /usr/lib/python3.6/site-packages/productmd/treeinfo.py .

Download productmd-treeinfo.py file, and invoke as:

base$ if [ ! -e ./img8/.treeinfo.lorax ]; then cp -p ./img8/.treeinfo ./img8/.treeinfo.lorax; fi
base$ python3 ./productmd-treeinfo.py ./img8/.treeinfo.lorax > ./img8/.treeinfo


Respin the media

Now you can respin the DVD media image.

base$ mkisofs -o ./DVD1.iso \
	-b isolinux/isolinux.bin -c isolinux/boot.cat \
	-no-emul-boot -boot-load-size 4 -boot-info-table \
	-R -T -J \
	-v \
	-V "Rocky-Linux-8-i386" \
	-m upgrade.img -m boot.iso \
	-m 'texlive-*' \
	./img8
base$ implantisomd5 ./DVD1.iso

The volume label (-V "Rocky-Linux-8-i386") should match with kernel option in ./img8/isolinux/isolinux.cfg, inst.stage2=hd:LABEL=Rocky-Linux-8-i386 .
Excluding boot.iso (~800MB) and texlive-* (~480MB) is for lowering size of the final DVD1.iso .

This will create a DVD1.iso image around 4.4GB. Burn the DVD1.iso and try it out on your target machine.


Changes observed from RHEL 8.5 to 8.6

- QUEUE_FLAG_* exceeded 32bit, resulting in non-working zram.ko
In include/linux/blkdev.h, RHEL defined a new bitmask
	#define QUEUE_FLAG_STABLE_WRITES 32
	
which does not fit into unsigned long queue_flags bitmask. Fortunately, 4 was vacant, so kernel on this page renumbered QUEUE_FLAG_* to be within 32bit. This fixed a nonworking zram.ko, which will be invoked during start of anaconda installer.

Changes observed from RHEL 8.4 to 8.5

- rpmbuild -D '__cmake_in_source_build 1' is no longer needed
epel-rpm-macros-8-16.noarch package from EPEL was updated to build things in separate directory, so -D '__cmake_in_source_build 1' is no longer needed for builds using cmake.
- 32bit DVD image exceeds 4.7GB limit
From RHEL 8.5 (CentOS 8.5) 32bit, the DVD image generated by lorax wil be around 4.8GB, which does not fit on a single-layer DVD. You may have to exclude some packages. Texlive takes up lot of space, so to exclude them, do mkisofs -m texlive-* to generate a 4.4GB image.
- (EPEL) Konqueror is not installed by default anymore by dnf group install kde-desktop-environment
You need to dnf install konqueror to get the browser.
- (EPEL) Konqueror default page (konq:konqueror) is always rendered by WebEngine
As part of getting away from KHTML probably, tha default page (that titled "Be free.") is always rendered by WebEngine part. This could be heavy on i586. Other pages will be rendered according to user preference. Konqueror provided on this page defaults to KHTML, which is easier on CPU.

Changes observed from RHEL 8.3 to 8.4

- rngd (rng-tools) will not be installed by default

rngd, which seeds /dev/random, is now not installed by default in 8.4. You must install rng-tools package manually, or install haveged (EPEL), to seed /dev/random faster. You will need this when using a crypto filesystem or SSL.

Upgraded systems will continue to have rngd. Only new installs will be affected.

Despite above, the installer environment (anaconda created by lorax) still has rngd enabled.

- struct __kernel_timespec had been separated from struct timespec

In RHEL 8.4 kernel code, kernel internal struct __kernel_timespec was separated from struct timespec. These were just an alias up to 8.3.

This change does not affect 64bit kernel/userland, but in 32bit kernel, any system calls using struct timespec (such as clock_gettime(2), ppoll(2), pselect(2)) will fail miserably with a kernel panic, or *** stack smashing detected ***: <unknown> terminated , since system calls expect struct __kernel_timespec to be passed, which became 64bit.

So, the 32bit kernel provided on this page reverts to 8.3 behavior, making these structs an alias and be 32bit. I guess 32 bit struct timespec will serve in RHEL 8.x support timespan.

Changes observed from RHEL 8.2 to 8.3

- anaconda installer asks for root password in main spoke
From 8.3, anaconda (GUI installer) now asks for root passwd in the main spoke (main menu where you select timezone, network settings, etc) instead of during the package installation. This menu will not be visible on a screen shorter than 768 vertical pixels, so do not use ex. 800x600 screen during GUI install.

Troubleshooting


Error during %check building cmake

Symptom: %check during build of cmake fails:

The following tests FAILED:
    249 - CTestTestStopTime (Failed)
    251 - CTestTestTimeout (Failed)
    252 - CTestTestRerunFailed (Failed)
    342 - RunCMake.Make (Failed)
    377 - RunCMake.GoogleTest (Failed)
    424 - RunCMake.ctest_test (Failed)
    468 - RunCMake.CTestTimeout (Failed)
    469 - RunCMake.CTestTimeoutAfterMatch (Failed)
    501 - RunCMake.CTestCommandLine (Failed)
Errors while running CTest

Cause: The installed libuv package is too old. libuv-1.23.1-1 suffers. Older libuv had bugs regarding usage of epoll_wait(2), used in timeout tests.

Resolution: Install later libuv package (libuv-1.41.1-1.el8_4), then retry rpmbuild.


Error during %check building curl

Symptom: %check fails during build of curl:

 1148: output (log/stderrlog1148) FAILED:
--- log/check-expected      2021-08-17 14:24:40.713936980 +0900
+++ log/check-generated     2021-08-17 14:24:40.713936980 +0900
@@ -1 +1 @@
-[CR]bar 100.0%[LF]
+#=#=#                                                                         [CR][CR]bar 100.0%[LF]

Cause: Test 1148 was not tolerant enough to accomodate intermediate progress bar appearing on slow build environment.

Resolution: Port the commit of upstream show below:


Error during %check building gtk-doc

Symptom: During building gtk-doc package, %check fails. tests/test-suite.log says:

...
expected no more than 1 log line in /home/kabe/c8builds/gtk-doc-c8/BUILD/gtk-doc-1.28/tests/gobject/docs/gtkdoc-mkpdf.log, but got 3
71 %: Checks 7, Failures: 2
FAIL sanity.sh (exit status: 1)
tests/gobject/docs/gtkdoc-mkpdf.log says:
gtkdoc-mkpdf --uninstalled --path=/home/kabe/c8builds/gtk-doc-c8/BUILD/gtk-doc-1.28/tests/gobject/docs  --imgdir=./images tester tester-docs.xml --path=/home/kabe/c8builds/gtk-doc-c8/BUILD/gtk-doc-1.28/tests/gobject/examples
Unexpected error occured
Error: sequence item 0: expected str instance, bytes found

Cause: 'bug' in dblatex, invoked by gtkdoc-mkpdf. The error is a familiar message for python3 users when mixing (unicode) string and (binary) bytes type.

Workaround: Patch the installed dblatex .py files.


Error during %install building postfix

Symptom: Intermediate %install stops during build of postfix:

SHLIB_ENV_VAR= SHLIB_ENV_VAL= LD_LIBRARY_PATH=/home/kabe/c8builds/postfix-c8/BUILD/postfix-3.5.8/lib shlib_directory=${shlib_directory:-`LD_LIBRARY_PATH=/home/kabe/c8builds/postfix-c8/BUILD/postfix-3.5.8/lib bin/postconf -dhx shlib_directory`} /bin/sh         postfix-install -non-interactive -package -keep-build-mtime
bin/postconf: symbol lookup error: bin/postconf: undefined symbol: printable_except
postfix-install: Error: "" should be "no" or an absolute path name.
make[1]: *** [Makefile:199: non-interactive-package] Error 1

Cause The generated binaries has RPATH /usr/lib/postfix/ embedded, causing LD_LIBRARY_PATH to be completely ignored, and tries to read already-installed, stale /usr/lib/postfix/*.so .

The postfix package itself remedies this by adding --enable-new-dtags compile option on configure, but RHEL SPECS/postfix.spec has SHLIB_RPATH explicitly defined without.

Resolution: Fix SPECS/postfix.spec to include SHLIB_RPATH="-Wl,--enable-new-dtags ..." .

This does not manifest in mock environment, since it does not have /usr/lib/postfix/ inside the build environment.

See ld.so(8) for information about RPATH, RUNPATH and LD_LIBRARY_PATH. Use objdump -p binary to see content of RPATH or RUNPATH of the binary.


productmd-treeinfo.py errors out by TypeError: Release: Field 'short' has invalid type: <class 'NoneType'>

Symptom: Using Rocky Linux 8 as the work host. When regenerating .treeinfo, productmd-treeinfo.py raises error:

$ python3 ./productmd-treeinfo.py ./img8/.treeinfo.lorax > ./img8/.treeinfo
Traceback (most recent call last):
  File "./productmd-treeinfo.py", line 18, in <module>
    t.load(sys.argv[1])
  File "/usr/lib/python3.6/site-packages/productmd/common.py", line 260, in load
    self.deserialize(parser)
  File "/usr/lib/python3.6/site-packages/productmd/treeinfo.py", line 122, in deserialize
    self.release.deserialize(parser)
  File "/usr/lib/python3.6/site-packages/productmd/treeinfo.py", line 222, in deserialize
    self.validate()
  File "/usr/lib/python3.6/site-packages/productmd/common.py", line 246, in validate
    method()
  File "/usr/lib/python3.6/site-packages/productmd/treeinfo.py", line 177, in _validate_short
    self._assert_type("short", list(six.string_types))
  File "/usr/lib/python3.6/site-packages/productmd/common.py", line 207, in _assert_type
    raise TypeError("%s: Field '%s' has invalid type: %s" % (self.__class__.__name__, field, type(value)))
TypeError: Release: Field 'short' has invalid type: <class 'NoneType'>

Cause: python3-productmd package of AlmaLinux 8.5 and Rocky Linux 8.5 is not post-patched to read .treeinfo generated by its lorax . Seems to be not manifesting as a problem, as official releases uses pungi.

Workaround: Patch /usr/lib/python3.6/site-packages/productmd/treeinfo.py .


Installer panics by "Unable to mount root fs on unknown-block(0,0)"

Symptom: When booting the installer, kernel panics with:

[   27.665083] List of all partitions:
[   27.706705] No filesystem could mount root, tried:
[   27.706707]
[   27.782675] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[   27.870028] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.0-305.10.2.el8_4.centos.plus.v9.i586 #1
[   27.970027] Hardware name: FUJITSU FMVC10C131/FM111AA, BIOS V1.04 09/16/2003
[   28.070026] Call Trace:
[   28.090028]  dump_stack+0x58/0x7e
[   28.130027]  panic+0x94/0x23f
[   28.170028]  mount_block_root+0x24e/0x267
[   28.210028]  mount_root+0x97/0x9c
[   28.250026]  prepare_namespace+0x11b/0x14b
[   28.310026]  kernel_init_freeable+0x1d0/0x1dd
[   28.350028]  ? rest_init+0x8a/0x8a
[   28.390026]  kernel_init+0xd/0xda
[   28.440036]  ret_from_fork+0x2e/0x40
[   28.450012] Kernel Offset: disabled
[   28.450012] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---

Possible cause: Try booting via serial console (kernel parameter: console=ttyS0,9600 inst.graphical) , and find earlier errors. If you found the following:

[    6.492624] Unpacking initramfs...
[   14.139809] Initramfs unpacking failed: write error
[   14.297618] Freeing initrd memory: 69156K
you need more physical memory.

Discussion: initrd of the installer image is big; it expands to almost 220MB. 384MB memory (128MBx3) is not enough. You want at least 640MB (256MBx2+128MB) to invoke the installer. Most "Super 7"motherboards with PC100 DIMM slots could go up to 768MB (256MBx3); some could go up to 1.5GB (512MBx3).

Recommended minimim RAM is 1GB. (RHEL official info for x86_64 says 1.5GB)

Previous RHEL 6 anaconda installer had logic to check memory and refused to install under 640MB systems, but RHEL 8 anaconda installer implements impractical limits of 320MB text, 410MB GUI, which is way too low for even booting the installer.

Also after install, it tends to invoke OOM killer frequently on 384MB; you would like to keep 512MB as bare minimum.

To simulate small memory system, add mem=640M to kernel option.


Installer halts by "reboot: System halted"

Symptom: (only last 25 lines will be visible on VGA console; the list below is collected from serial console)

         Starting iSCSI UserSpace I/O driver...
[    9.912121] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/25-parse-anaconda-options.sh: line 21: echo: write error: No space left on device[FAILED] Failed to start iSCSI UserSpace I/O driver.
See 'systemctl status iscsiuio.service' for details.

[    9.948517] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/25-parse-anaconda-options.sh: line 21: echo: write error: No space left on device
[    9.965607] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/25-parse-anaconda-options.sh: line 21: echo: write error: No space left on device
[    9.979705] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/25-parse-anaconda-options.sh: line 21: echo: write error: No space left on device
[   10.073960] dracut-cmdline[242]: /lib/dracut-lib.sh: line 978: printf: write error: No space left on device
[   10.083264] dracut-cmdline[242]: /lib/dracut-lib.sh: line 981: printf: write error: No space left on device
[   10.093371] dracut-cmdline[242]: /lib/dracut-lib.sh: line 982: printf: write error: No space left on device
[   10.113705] dracut-cmdline[242]: /lib/dracut-lib.sh: line 944: echo: write error: No space left on device
[   10.123044] dracut-cmdline[242]: /lib/dracut-lib.sh: line 945: echo: write error: No space left on device
[   10.132484] dracut-cmdline[242]: /lib/dracut-lib.sh: line 946: echo: write error: No space left on device
[   10.142119] dracut-cmdline[242]: /lib/dracut-lib.sh: line 953: /sbin/initqueue: No such file or directory
[   10.163881] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/28-parse-anaconda-net.sh: line 68: echo: write error: No space left on device
[   10.204876] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/30-parse-crypt.sh: line 34: echo: write error: No space left on device
[   10.216631] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/30-parse-crypt.sh: line 35: echo: write error: No space left on device
[   10.241670] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/30-parse-crypt.sh: line 172: echo: write error: No space left on device
[  OK  ] Stopped iSCSI UserSpace I/O driver.
         Starting iSCSI UserSpace I/O driver...
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[FAILED] Failed to start iSCSI UserSpace I/O driver.
See 'systemctl status iscsiuio.service' for details.
[   10.364706] dracut-cmdline[242]: //lib/dracut/hooks/cmdline/90-parse-iscsiroot.sh: line 95: modprobe: command not found[   10.375167] dracut: FATAL: iscsiroot requested but kernel/initrd does not support iscsi

[   10.383789] dracut: Refusing to continue
[   10.388025] dracut-cmdline[242]: /lib/dracut-lib.sh: line 465: echo: write error: No space left on device
[   10.396831] dracut-cmdline[242]: /lib/dracut-lib.sh: line 466: echo: write error: No space left on device
[  OK  ] Stopped iSCSI UserSpace I/O driver.
         Starting iSCSI UserSpace I/O driver...
[   10.470710] printk: systemd-shutdow: 32 output lines suppressed due to ratelimiting
[   10.485505] systemd-shutdown[1]: Syncing filesystems and block devices.
[   10.492578] systemd-shutdown[1]: Sending SIGTERM to remaining processes...
[   10.501769] systemd-shutdown[1]: Sending SIGKILL to remaining processes...
[   10.510457] systemd-shutdown[1]: Unmounting file systems.
[   10.516670] [518]: Unmounting '/etc/machine-id'.
[   10.521939] [519]: Remounting '/' read-only in with options 'size=214252k,nr_inodes=53563'.
[   10.530814] systemd-shutdown[1]: All filesystems unmounted.
[   10.536367] systemd-shutdown[1]: Deactivating swaps.
[   10.542065] systemd-shutdown[1]: All swaps deactivated.
[   10.547050] systemd-shutdown[1]: Detaching loop devices.
[   10.552277] systemd-shutdown[1]: All loop devices detached.
[   10.557572] systemd-shutdown[1]: Detaching DM devices.
[   12.640513] psmouse serio1: trackpoint: IBM TrackPoint firmware: 0x01, buttons: 3/3
[   12.668504] input: TPPS/2 IBM TrackPoint as /devices/platform/i8042/serio1/input/input3
[   12.685037] reboot: System halted

Cause: More physical memory is required. The "No space left on device" refers to the ramdisk, not an HDD, used during initrd run.


Unknown error occured in anaconda installer

Symptom: During anaconda startup, anaconda bails out:

08:46:07,998 CRT exception: Traceback (most recent call last):

  File "/usr/lib/python3.6/site-packages/pyanaconda/ui/gui/__init__.py", line 988, in _on_continue_clicked
    nextAction = self._instantiateAction(self._actions[1])

  File "/usr/lib/python3.6/site-packages/pyanaconda/ui/gui/__init__.py", line 773, in _instantiateAction
    obj = actionClass(self.data, self.storage, self.payload, self.instclass)

  File "/usr/lib/python3.6/site-packages/pyanaconda/ui/gui/spokes/network.py", line 1692, in __init__
    self.network_control_box.current_hostname = self._network_module.proxy.GetCurrentHostname()

  File "/usr/lib/python3.6/site-packages/pydbus/proxy_method.py", line 102, in __call__
    raise error

pyanaconda.modules.common.errors.DBusError: g-dbus-error-quark: GDBus.Error:org.freedesktop.DBus.Error.TimedOut: Failed to activate service 'org.freedesktop.hostname1': timed out (service_start_timeout=25000ms) (20)

Cause: DBus timeout is by default 25 seconds in bus/config-parser.c:

parser->limits.activation_timeout = 25000; /* 25 seconds */
which could be too short on slow machine.

Workaround: The timeout could be adjusted by adding /etc/dbus-1/system-local.conf XML file, which is included from /usr/share/dbus-1/system.conf .

Add /etc/dbus-1/system-local.conf :

<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<!-- dbus: enlengthen default hardcoded
   <limit name="service_start_timeout">25000</limit>
   (dbus package, bus/config-parser.c:parser->limits.activation_timeout = 25000; /* 25 seconds */)
   to longer value, using system drop-in included from
   /usr/share/dbus-1/system.conf
-->
<busconfig>
  <limit name="service_start_timeout">240045</limit>
</busconfig>
Doing this is already added in add_template.tmpl .


Unsupported video card uses VESA driver in 800x600 resulution

800x600 resulution is tough to install RHEL 8.

Try passing vga=ask inst.xdriver=fbdev option to kernel command line on DVD boot. If selecting ex. 1024x768x16 will make the text console in that resolution, Xorg will pick that up.

inst.xdriver and inst.usefbx (equivalent of inst.xdriver=fbdev) is mentioned in docs/boot-options.rst of anaconda source code. Unfortunaly the document is not installed anywhere.


I want to use VESA driver for unsupported video card

Pass in inst.xdriver=vesa for installer kernel option.

It seems that VESA driver prefers more colors than resolution. 800x600 is tough for RHEL 8 installation if autoselected. Try fbdev driver mentioned above if possible.


Unknown error occured in anaconda installer

Symptom: During install, anaconda bails out:

09:04:05,946 INF threading: Thread Failed: AnaInstallThread (-1313998016)
09:04:05,946 DBG exception: running handleException
09:04:05,954 CRT exception: Traceback (most recent call last):

  File "/usr/lib/python3.6/site-packages/pyanaconda/threading.py", line 286, in run
    threading.Thread.run(self)

  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)

  File "/usr/lib/python3.6/site-packages/pyanaconda/installation.py", line 388, in doInstall
    installation_queue.start()

  File "/usr/lib/python3.6/site-packages/pyanaconda/installation_tasks.py", line 304, in start
    item.start()

  File "/usr/lib/python3.6/site-packages/pyanaconda/installation_tasks.py", line 304, in start
    item.start()

  File "/usr/lib/python3.6/site-packages/pyanaconda/installation_tasks.py", line 472, in start
    self.run_task()

  File "/usr/lib/python3.6/site-packages/pyanaconda/installation_tasks.py", line 438, in run_task
    self._task(*self._task_args, **self._task_kwargs)

  File "/usr/lib/python3.6/site-packages/pyanaconda/payload/dnfpayload.py", line 1089, in install
    raise payload.PayloadError(msg)

pyanaconda.payload.PayloadError: Payload error - DNF installation has ended up abruptly: No available modular metadata for modular packageTraceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/pyanaconda/payload/dnfpayload.py", line 283, in do_transaction
    base.do_transaction(display=display)
  File "/usr/lib/python3.6/site-packages/dnf/base.py", line 834, in do_transaction
    self.transaction._populate_rpm_ts(self._ts)
  File "/usr/lib/python3.6/site-packages/dnf/db/group.py", line 334, in _populate_rpm_ts
    raise dnf.exceptions.Error(_("No available modular metadata for modular package"))
dnf.exceptions.Error: No available modular metadata for modular package

Resolution: Create fake modular metadata on the repository.


tmux hogs CPU during anaconda installer

Symptom: tmux server seems to use all CPU power available (30% ~ 50%) during the anaconda install.

Cause: The following /usr/share/anaconda/tmux.conf line during anaconda setup, read by tmux, repeatedly invokes /bin/sh and eats up CPU. (included as data/tmux.conf in anaconda source code)

set-option status-right '#[fg=blue]#(echo -n "Switch tab: Alt+Tab | Help: F1 ")'

Resolution: Since this is a static string, there's no need to invoke a shell via #(); just replacing it to

set-option status-right '#[fg=blue]Switch tab: Alt+Tab | Help: F1 '
will make tmux CPU usage sane. The anaconda source and binary package provided by this site already has this patch applied.


rngd eats up the CPU

Symptom: On old machine without a TPM chip, rngd eats up CPU to nearly 100% for several minutes on boot.

Workaround: Use haveged package provided from EPEL. It is much lighter on CPU on slow machines.

# dnf --disablerepo=\* --enablerepo=ix86repo\* install haveged
# systemctl disable rngd
# systemctl enable haveged

This still launches rngd in initrd, so boot could still be slow. To get rid of it (and you aren't using crypto filesystems), uninstall rng-tools package and re-dracut:

# rpm -ev rng-tools
# dracut -vv -f

To replace rngd with haveged in anaconda installer, place the haveged.i586.rpm in PowerTools/Packages/ of the repository, then invoke lorax with --installpkgs=haveged . add_template.tmpl already have quirks to replace rngd with haveged for anaconda.


Many services fail on boot

Symptom: On slow machine, some systemd service fail to boot due to timeout.

Resolution: Enlenghten TimeoutStartSec settings using drop-in settings on such services. add_template.html includes such quirks for installer. You may have to implement the quirks below manually after install.

/etc/dbus-1/system-local.conf
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<!-- dbus: enlengthen default hardcoded
   <limit name="service_start_timeout">25000</limit>
   (dbus package, bus/config-parser.c:parser->limits.activation_timeout = 25000; /* 25 seconds */)
   to longer value, using system drop-in included from
   /usr/share/dbus-1/system.conf
-->
<busconfig>
  <limit name="service_start_timeout">240045</limit>
</busconfig>
/etc/systemd/system/systemd-hwdb-update.service.d/timeout.conf
[Service]
TimeoutStartSec=5min
/etc/systemd/system/polkit.service.d/timeout.conf
[Service]
TimeoutStartSec=5min
/etc/systemd/system/NetworkManager-wait-online.service.d/timeout.conf
[Service]
TimeoutStartSec=5min
Additionally, edit /usr/lib/systemd/system/NetworkManager-wait-online.service to use --timeout=300 instead of --timeout=30 .
/etc/systemd/system/systemd-hostnamed.service.d/timeout.conf
[Service]
TimeoutStartSec=5min
/etc/systemd/system/udisks2.service.d/timeout.conf
[Service]
TimeoutStartSec=5min
/etc/systemd/system/systemd-logind.service.d/timeout.conf
[Service]
RestartSec=2s
TimeoutStartSec=5min

Wi-Fi interface not recognized after install

Symptom: The machine has a wifi network adaptor. It was usable in installer and rescue disc, but after HDD install, it doesn't work.
It is listed under ip link as

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp2s1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:11:25:44:08:c3 brd ff:ff:ff:ff:ff:ff
3: wlp2s2: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether 00:0e:9b:99:bb:19 brd ff:ff:ff:ff:ff:ff
but NetworkManager seems to ignore the interface; scanning for Access Points (nmcli dev wifi list) nor authenticated connection (nmcli --ask dev wifi connect) doesn't work.

When NetworkManager -d is invoked manually, it says

<info>  [1604490696.4915] manager: (wlp2s2): 'wifi' plugin not available; creating generic device
<info>  [1604490696.4927] manager: (wlp2s2): new Generic device (/org/freedesktop/NetworkManager/Devices/3)

Cause: NetworkManager-wifi plugin is not installed. It is not installed by "minimum install".

Resolution: Install NetworkManager-wifi package. After install, NetworkManager -d output should be

...
<info>  [1604490850.9231] Loaded device plugin: NMWifiFactory (/usr/lib/NetworkManager/1.22.8-5.el8_2/libnm-device-plugin-wifi.so)
...
<info>  [1604490850.9926] device (wlp2s2): driver supports Access Point (AP) mode
<info>  [1604490850.9938] manager: (wlp2s2): new 802.11 Wi-Fi device (/org/freedesktop/NetworkManager/Devices/3)
<info>  [1604490850.9964] device (wlp2s2): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external')
<info>  [1604490851.1861] device (wlp2s2): set-hw-addr: set MAC address to D2:BF:13:B9:78:4F (scanning)
<info>  [1604490851.2284] supplicant: wpa_supplicant running
<info>  [1604490851.2286] device (wlp2s2): supplicant interface state: init -> starting


lsmem does not work

Symptom: lsmem emits error and does not show any useful info.

$ lsmem
lsmem: This system does not support memory blocks
$ _

Cause: lsmem needs /sys/devices/system/memory/block_size_bytes and related /sys entries in the same directory, but 32bit kernel does not have this directory, due to that memory hot-add is disabled for x86_32 (kernel.org decision).

Workaround: Try cat /proc/meminfo, if that suffices.

(Build tool of rust compiler package relies on lsmem to determine parallel build processes, so this might bite on pure build of rust on i686)


Xorg fails to start, FBIOPUT_VSCREENINFO: Invalid argument

Symptom: Using old VGA device such as S3 Trio64 (2MB memory). After install, fbcon driver is enabled and full screen resolution is available, but xinit does not work.

/var/log/Xorg.0.log says:

[   188.728] (II) FBDEV(0): Console is 8bpp, defaulting to 32bpp
[   188.728] (II) FBDEV(0): Creating default Display subsection in Screen section
	"Default Screen Section" for depth/fbbpp 24/32
[   188.728] (==) FBDEV(0): Depth 24, (==) framebuffer bpp 32
[   188.728] (==) FBDEV(0): RGB weight 888
[   188.728] (==) FBDEV(0): Default visual is TrueColor
[   188.728] (==) FBDEV(0): Using gamma correction (1.0, 1.0, 1.0)
[   188.728] (II) FBDEV(0): hardware: S3 Trio64V2/DX (video memory: 2048kB)
[   188.728] (II) FBDEV(0): checking modes against framebuffer device...
[   188.728] (II) FBDEV(0): checking modes against monitor...
[   188.728] (II) FBDEV(0): Virtual size is 1360x768 (pitch 1360)
[   188.728] (**) FBDEV(0):  Built-in mode "current": 85.5 MHz, 47.7 kHz, 60.0 Hz
[   188.728] (II) FBDEV(0): Modeline "current"x0.0   85.51  1360 1424 1536 1792  768 771 777 795 +hsync +vsync -csync (47.7 kHz b)
[   188.729] (==) FBDEV(0): DPI set to (96, 96)
[   188.729] (II) Loading sub module "fb"
[   188.729] (II) LoadModule: "fb"
[   188.729] (II) Loading /usr/lib/xorg/modules/libfb.so
[   188.729] (II) Module fb: vendor="X.Org Foundation"
[   188.729] 	compiled for 1.20.10, module version = 1.0.0
[   188.729] 	ABI class: X.Org ANSI C Emulation, version 0.4
[   188.729] (**) FBDEV(0): using shadow framebuffer
[   188.729] (II) Loading sub module "shadow"
[   188.729] (II) LoadModule: "shadow"
[   188.730] (II) Loading /usr/lib/xorg/modules/libshadow.so
[   188.730] (II) Module shadow: vendor="X.Org Foundation"
[   188.730] 	compiled for 1.20.10, module version = 1.1.0
[   188.730] 	ABI class: X.Org ANSI C Emulation, version 0.4
[   188.730] (EE) FBDEV(0): FBIOPUT_VSCREENINFO: Invalid argument
[   188.730] (EE) FBDEV(0): mode initialization failed
[   188.730] (EE) 
Fatal server error:
[   188.730] (EE) AddScreen/ScreenInit failed for driver 0

Cause: xorg-x11-drv-fbdev driver assumes 32bit depth when no depth is specified. The VGA card may not have enough video memory to do it.

Workaround: First, try explicit -depth by

$ xinit -- /usr/bin/Xorg :0 -depth 16
If that results in working X, add a config file under /etc/X11/xorg.conf.d:
# /etc/X11/xorg.conf.d/50-depth.conf
Section "Screen"
	Identifier "Screen0"
	DefaultDepth 16
Endsection

See xorg.conf(5) about *.conf.

Caveats: KDE 5 assumes 24bit FullColor, so this setting will not get a proper operating Plasma 5 desktop. You need a video card with more memory.


Starting KDE invokes the screenlocker and cannot reach desktop on slow machine

Symptom: Started KDE by startx on a slow machine. Since it's slow, it invokes the default screenlocker during startup, and the machine is slow enough to be screenlocker reinvoked after disarming the screenlocker. I can't access the desktop. systemsettings5 can't be invoked to change the setting.

Workaround: Manually disable the spash screen and screenlocker by creating following files:

; ~/.config/ksplashrc
[KSplash]
Engine=none
Theme=None
; ~/.config/kscreenlockerrc
[Daemon]
Autolock=false


cannot change input method

Symptom:Trying to switch ibus input method. Click-selecting the keyboard icon, or using [Super]-Space, does show the alternate input method (after terrible delay), but keyboard icon doesn't change and input method doesn't change.

Cause: Default timeout of 5 seconds may be too short for slow machines

Resolution: set a longer timeout on ibus-daemon.

% pkill ibus-daemon
% IBUS_TIMEOUT=60000 /usr/bin/ibus-daemon -d -r --xim --timeout=60000

There are two configurable timeouts for ibus-daemon; ibus timeout (IBUS_TIMEOUT), which defaults to 6 seconds, and gdbus timeout (--timeout) which defaults to 5 seconds. These may be too short for slow machines. Above example sets them to 60 seconds. (--timeout seems to be enough)

Making change permanent

Edit /etc/X11/xinit/xinput.d/ibus.conf as:

XIM=ibus
XIM_PROGRAM="/usr/bin/ibus-daemon"
ICON="ibus"
XIM_ARGS="-r --xim --timeout=60000"
PREFERENCE_PROGRAM=/usr/bin/ibus-setup
...


ZD1211 USB WiFi does not work

Symptom: ZyDAS zd1211 based USB wifi adapter (such as Buffalo WLI-UC-AG) is not recognized. On insertion, /var/log/messages or journalctl -xe says:

Nov 06 21:10:17 scorpio kernel: usb 1-4: Direct firmware load for zd1211/zd1211b_ub failed with error -2
Nov 06 21:10:17 scorpio kernel: usb 1-4: Could not load firmware file zd1211/zd1211b_ub. Error number -2
Nov 06 21:10:17 scorpio kernel: zd1211rw 1-4:1.0: couldn't load firmware. Error number -2
Nov 06 21:10:17 scorpio NetworkManager[675]: <info>  [1604664617.4144] device (wlp0s29f7u4): state change: unmanaged -> unavailable (reason 'managed', sys-iface-state: 'external')
Nov 06 21:10:17 scorpio NetworkManager[675]: <warn>  [1604664617.4266] device (wlp0s29f7u4): firmware may be missing.
Nov 06 21:10:17 scorpio NetworkManager[675]: <info>  [1604664617.4274] device (wlp0s29f7u4): set-hw-addr: set MAC address to 0E:E1:3E:98:C5:2F (scanning)

Resolution: Install zd1211-firmware package. The one supplied with CentOS 6 will work nicely.

Note: you cannot use 802.11a band; the driver lacks implementation.

To make the driver work in installation/rescue disc, you must add zd1211-firmware-1.4-4.el6.noarch.rpm in BaseOS/Packages/, createrepo_c, and pass --installpkgs=zd1211-firmware to lorax.


BCM43xx based WiFi does not work

Symptom: On insertion of Broadcom BCM43xx based (Cardbus) WiFi adapter, journalctl or /var/log/messages says

Nov 07 10:48:47 scorpio kernel: pcmcia_socket pcmcia_socket0: pccard: CardBus card inserted into slot 0
Nov 07 10:48:47 scorpio kernel: pci 0000:03:00.0: [14e4:4320] type 00 class 0x028000
Nov 07 10:48:47 scorpio kernel: pci 0000:03:00.0: reg 0x10: [mem 0x00000000-0x00001fff]
Nov 07 10:48:47 scorpio kernel: pci 0000:03:00.0: BAR 0: assigned [mem 0xd4000000-0xd4001fff]
Nov 07 10:48:47 scorpio kernel: pci 0000:03:00.0: cache line size of 32 is not supported
Nov 07 10:48:48 scorpio kernel: b43-pci-bridge 0000:03:00.0: enabling device (0000 -> 0002)
Nov 07 10:48:48 scorpio kernel: ssb: Found chip with id 0x4306, rev 0x03 and package 0x00
Nov 07 10:48:48 scorpio kernel: ssb: Core 0 found: ChipCommon (cc 0x800, rev 0x04, vendor 0x4243)
Nov 07 10:48:48 scorpio kernel: ssb: Core 1 found: IEEE 802.11 (cc 0x812, rev 0x05, vendor 0x4243)
Nov 07 10:48:48 scorpio kernel: ssb: Core 2 found: PCMCIA (cc 0x80D, rev 0x02, vendor 0x4243)
Nov 07 10:48:48 scorpio kernel: ssb: Core 3 found: V90 (cc 0x807, rev 0x02, vendor 0x4243)
Nov 07 10:48:48 scorpio kernel: ssb: Core 4 found: PCI (cc 0x804, rev 0x09, vendor 0x4243)
Nov 07 10:48:48 scorpio kernel: ssb: Sonics Silicon Backplane found on PCI device 0000:03:00.0
Nov 07 10:48:48 scorpio kernel: b43-phy1: Broadcom 4306 WLAN found (core revision 5)
Nov 07 10:48:48 scorpio kernel: b43-phy1: Found PHY: Analog 2, Type 2 (G), Revision 2
Nov 07 10:48:48 scorpio kernel: b43-phy1: Found Radio: Manuf 0x17F, ID 0x2050, Revision 2, Version 0
Nov 07 10:48:48 scorpio kernel: Broadcom 43xx driver loaded [ Features: PNLS ]
Nov 07 10:48:48 scorpio kernel: b43 ssb0:0: Direct firmware load for b43/ucode5.fw failed with error -2
Nov 07 10:48:48 scorpio kernel: b43 ssb0:0: Direct firmware load for b43/ucode5.fw failed with error -2
Nov 07 10:48:48 scorpio kernel: b43 ssb0:0: Direct firmware load for b43-open/ucode5.fw failed with error -2
Nov 07 10:48:48 scorpio kernel: b43 ssb0:0: Direct firmware load for b43-open/ucode5.fw failed with error -2
Nov 07 10:48:48 scorpio kernel: b43-phy1 ERROR: Firmware file "b43/ucode5.fw" not found
Nov 07 10:48:48 scorpio kernel: b43-phy1 ERROR: Firmware file "b43-open/ucode5.fw" not found
Nov 07 10:48:48 scorpio kernel: b43-phy1 ERROR: You must go to http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware and download the correct firmware for this driver version. Please carefully read all instructions on this website.

Resolution: Install a firmware package. b43-openfwwf-5.2-10.el6.noarch.rpm supplied with CentOS 6 works. If it doesn't, you need to use b43-fwcutter by yourself to extract a firmware.

The URL mentioned in the kernel message is old. Currently it is https://wireless.wiki.kernel.org/en/users/drivers/b43 , although it doesn't have much information now.

To make the driver work in installation/rescue disc, you must add b43-openfwwf-5.2-10.el6.noarch.rpm in BaseOS/Packages/, createrepo_c, and pass --installpkgs=b43-openfwwf to lorax.


3Com 3c509 does not work

Symptom: Using 3com EtherlinkIII 3c509 network adaptor. When manually modprobe 3c509 is done, the card is detected, but does not link up, even if I said ethtool -s eth0 port tp. Kernel messages says:

eth0: 3c5x9 found at 0x310, BNC port, address 00:a0:24:28:c2:80, IRQ 3.
3c509.c:1.20 04Feb2008 becker@scyld.com
------------[ cut here ]------------
WARNING: CPU: 0 PID: 737 at net/sched/sch_generic.c:356 dev_watchdog+0x1f3/0x200
NETDEV WATCHDOG: eth0 (3c509): transmit queue 0 timed out
Modules linked in: ip_set nfnetlink ebtable_nat ...
CPU: 0 PID: 737 Comm: nmcli Not tainted 3.10.0-862.el7.v37.i586 #1
Hardware name: System Manufacturer System Name/ALADDIN5, BIOS 0626 07/15/95
Call Trace:
 <SOFTIRQ>  [<c09c5ba0>] dump_stack+0x16/0x18
 [<c0452daa>] __warn+0xea/0x110
 [<c08e8f53>] ? dev_watchdog+0x1f3/0x200
 [<c0452e16>] warn_slowpath_fmt+0x46/0x60
 [<c08e8f53>] dev_watchdog+0x1f3/0x200
 [<c04612f2>] call_timer_fn+0x32/0x100
 [<c07bc312>] ? scsi_decide_disposition+0x1d2/0x210
 [<c047cc69>] ? put_cred_rcu+0x89/0xb0
 [<c08e8d60>] ? dev_deactivate_queue.constprop.30+0x50/0x50
 [<c0463429>] run_timer_softirq+0x199/0x270
 [<c08e8d60>] ? dev_deactivate_queue.constprop.30+0x50/0x50
 [<c045b933>] __do_softirq+0xc3/0x1f0
 [<c045b870>] ? tasklet_action+0x110/0x110
 [<c041a565>] call_on_stack+0x45/0x50
 <EOI>  [<c045bbb5>] ? irq_exit+0x95/0xa0
 [<c0419e95>] ? do_IRQ+0x45/0xd0
 [<c09d0810>] ? __do_page_fault+0x490/0x490
 [<c09d4ef3>] ? common_interrupt+0x33/0x40
---[ end trace b49bc66903ceb9e0 ]---
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1332.
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1484.
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1528.
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1408.
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1328.
eth0: transmit timed out, Tx_status 00 status 2000 Tx FIFO room 1260.

Cause: Media autodetection is disabled on the card. When the card is set to use particular link port, ethtool -s eth0 port tp doesn't have any effect.

Resolution: Use 3C5X9CFG.EXE, included in 3Com EtherDisk, to set the card to use TP (RJ-45) medium.


Cannot login on console under heavy load

Symptom: Under heavy load, login on vt console is rejected by

Login timed out after 60 seconds

Resolution: Add login(1) LOGIN_TIMEOUT in /etc/login.defs:

## default 60secs is short under heavy load
LOGIN_TIMEOUT	300

You may have to boot into single user mode to make this change, since multi-user mode keeps CPU load > 5 for several minutes.


Cannot login as root on single-user mode

Symptom: Passed single as kernel command line, to drop into single-user mode. Root password is denied as:

Give root password for maintenance
(or type Control-D to continue): ********
sulogin: crypt failed: Invalid argument
Login incorrect

Give root password for maintenance
(or type Control-D to continue): _

Cause: SELinux is in enforcing mode, and /etc/shadow is not labelled correctly as

----------. root root system_u:object_r:shadow_t:s0    /etc/shadow

Resolution: Boot with enforcing=0 single kernel option. You should be able to login as root. At shell prompt, do /sbin/restorecon -v /etc/shadow to reset the SELinux context.


Text screen resolution reset when using Matrox video card

Symptom: Using a Matrox video card (such as G200). Text console resolution is reset to 80x30 regardess of vga=... nomodeset kernel option.

Cause: matroxfb_base module is read in by udev, which does not honor kernel options such as video=, vga=, nomodeset.

Resolution: Prepare /etc/modprobe.d/matrox.conf, or append to /etc/modprobe.d/blacklist.conf the following to prevent matroxfb from loading:

## /etc/modprobe.d/matrox.conf
# disable loading matroxfb by udev.
# udev scans /sys/**/modalias and loads driver by modprobe -b;
# "video=matroxfb:disabled" isn't honored by udev

blacklist matroxfb_base

If you want to explicitly set the resolution, you may say
#blacklist matroxfb_base
# 1024x768 
options matroxfb_base vesa=0x118 left=168
# 800x600
#options matroxfb_base vesa=0x115 upper=22 left=112 right=48 
# 1360x768 widescreen
#options matroxfb_base xres=1360 yres=768 fv=60 hslen=112 vslen=7 upper=18 lower=3 left=256 right=64 

See Documentation/fb/matroxfb.txt (provided by kernel-doc package) for options.

Note: VESA graphics console (vga=...) is very slow on older CPU, occasionaly causing "tsc unstable" log. Using matroxfb is recommended.

Widescreen not enabled on Matrox MGA G200 in X

Symptom: Using Matrox G200 graphics card and widescreen monitor. Full 1360x768 resolution was available in CentOS 6 X11 desktop, but only 1024x768 is provided in CentOS 8, which seems to use VESA driver.

Cause: Xorg server of RHEL8 is patched to not find legacy xorg-x11-drv-* drivers which isn't shipped with RHEL8. MGA (xorg-x11-drv-mga) is among such driver.

Resolution: Replace the xorg-x11-server-Xorg with the one provided on this page, and additionally install the driver below. This will enable full resolution available for desktop Matrox graphics cards.

To enable full resolution in anaconda installer, add --installpkgs=xorg-x11-drv-mga argument to lorax.


Text screen resolution reset when using S3 video card

Symptom: Using a S3 video card (such as S3 Virge). Text console resolution is reset to 80x30 regardess of vga=... nomodeset kernel option.

Cause: s3fb module is read in by udev, which does not honor kernel options such as video=, vga=, nomodeset.

Workaround: Prepare /etc/modprobe.d/s3fb.conf, or append to /etc/modprobe.d/blacklist.conf the following to prevent s3fb from loading:

## /etc/modprobe.d/s3fb.conf
# disable loading s3fb by udev.
# udev scans /sys/**/modalias and loads driver by modprobe -b;
# "video=s3fb:disabled" isn't honored by udev

blacklist s3fb

If you want to explicitly set the resolution, you may say

#blacklist s3fb
options s3fb mode_options=1024x768-16@60

s3fb.ko module will pick up DDC info from the monitor and sets widescreen resolution if DDC pin on the output is wired. If you see the following in the system log (perhaps after manual invocation of modprobe s3fb)

i2c i2c-0: unable to read EDID block.
i2c i2c-0: unable to read EDID block.
i2c i2c-0: unable to read EDID block.
the card is not capable of reading DDC info from the monitor.

Since s3fb.ko framebuffer could be very slow, especially when backscrolling, you may want to blacklist s3fb, and use xorg-x11-drv-s3 or xorg-x11-drv-s3virge for X11.


Widescreen not enabled on S3 Virge card in X

Symptom: Using S3 Virge video card (4MB memory). Widescreen is not enabled in X by xinit. Also the resolution is ugly like 960x540.

Cause Assuming you had installed xorg-x11-drv-s3virge driver, the driver couldn't read DDC info from monitor, and used whatever resolution it liked.

Workaround: Try adding then following as /etc/X11/xorg.conf.d/60-1360x.conf , and restart xinit :

# /etc/X11/xorg.conf.d/60-1360x.conf
Section "Monitor"
	Identifier "Monitor0"
	Option "MaxPixClock" "70000"
	Option "ReducedBlanking" "yes"
	## need HorizSync or VertRefresh to make MaxPixClock effective
	VertRefresh 60
	#Matrox timing
	ModeLine "mx1360x768"  85.50  1360 1424 1536 1792   768 771 777 795 +hsync +vsync
EndSection

Section "Screen"
	Identifier "Screen0"
	Monitor "Monitor0"
	DefaultDepth 16
	SubSection "Display"
		Modes "mx1360x768"
	EndSubSection
EndSection

Caveats: KDE 5 assumes 24bit FullColor, so this setting will not get a proper operating Plasma 5 desktop. You need a video card with more memory.


Graphic console instable on NVIDIA Geforce2 card

Symptom: Using NVIDIA Geforce2 (NV11) video card. Kernel nouveau.ko driver automatically loads on boot and provides full graphic console, but not stable; just doing man nouveau makes the screen hang and /var/log/messages is filled with

kernel: nouveau 0000:01:00.0: fifo: DMA_PUSHER - ch 0 [DRM] get 0000f6b4 put 00008638 state 401c0008 (err: INVALID_MTHD) push 00000000
cygnus systemd-journald[689]: Missed 1 kernel messages
kernel: nouveau 0000:01:00.0: fifo: DMA_PUSHER - ch 0 [DRM] get 00001578 put 0000a410 state 401c0008 (err: INVALID_MTHD) push 00000000
systemd-journald[689]: Missed 2 kernel messages
kernel: nouveau 0000:01:00.0: fifo: DMA_PUSHER - ch 0 [DRM] get 000032dc put 0000c9c4 state 40180004 (err: INVALID_MTHD) push 00000010
systemd-journald[689]: Missed 1 kernel messages
kernel: nouveau 0000:01:00.0: fifo: DMA_PUSHER - ch 0 [DRM] get 0000c9ec put 00006178 state 400c0004 (err: INVALID_MTHD) push 00000000

Workaround: Disable nouveau.ko kernel driver. You would add a following new file /etc/modprobe.d/nouveau.conf :

blacklist nouveau

## this is needed to make "fbdev" based Xorg work
#options nouveau fbcon_bpp=32

This may still load the nouveau.ko module during the initrd boot, so you want to remove the drm driver from initrd. Disable drm and plymouth dracut package in initrd, by invoking dracut as dracut -f -v --omit "drm plymouth" option,
or drop in an /etc/dracut.conf.d/noplymouth.conf file:

# /etc/dracut.conf.d/noplymouth.conf
omit_dracutmodules+=" drm plymouth "
and invoke usual dracut -f -v, to rebuild initrd.

For X11, on older NVIDIA cards, you would have more chance having a stable system by using legacy xorg-x11-drv-nv driver, instead of DRI dependent xorg-x11-drv-nouveau .

Install xorg-x11-drv-nv package. Then, uninstall xorg-x11-drv-nouveau package, or drop in an xorg.conf file as /etc/X11/xorg.conf.d/30-use-nv.conf :

#
# force use of nv_drv.so instead of nouveau_drv.so
#
Section "Device"
        Identifier "nv-device"
        Driver "nv"
EndSection
You MUST blacklist nouveau.ko kernel driver when using legacy X11 nv_drv.so driver, since nv_drv.so driver cannot reclaim the framebuffer device claimed by kernel nouveau.ko .

To use nv_drv.so X11 driver on graphical install, pass --installpkgs=xorg-x11-drv-nv to lorax, and pass module_blacklist=nouveau inst.xdriver=nv kernel option when booting the installer.


Blue is too dark to read on console

Symptom: Using a raw VGA conole. Blue color is too dark to read; ls -l shows directories in blue which is too dark.

Workaround: Set the color palette to brighter blue (as in other KMS consoles):

$ printf '\033]P44444FF\033]PC4444FF'

These console codes were explained in console_codes(4) manual page up till RHEL 7, but RHEL 8 seems to not have this manual.

Workaround: If you want this automatically, append the sequence to /etc/issue:

# printf '\033]P44444FF\033]PC4444FF' >> /etc/issue
From RHEL 8.5, console palette seems to be VT independent, so using printf '\033]P44444FF\033]PC4444FF' > /dev/tty0 from /etc/rc.d/rc.local stopped working.

Fails to load SoundBlaster AWE32 driver

Symptom: Using SoundBlaster AWE32 soundcard. Since this card isn't detected automatically, I tried to load the driver by insmod, but fails as following:

# modprobe snd_sbawe
sbawe 01:01.00: activated
sbawe 01:01.02: activated
sbawe: fatal error - EMU-8000 synthesizer not detected at 0x620
sbawe 01:01.00: disabled
sbawe 01:01.02: disabled

Workaround: Add snd_sbawe seq_ports=0 option. This skips detection of EMU-8000 wavetable sequencer, so PCM part of driver loads.

# modprobe snd_sbawe seq_ports=0
sbawe 01:01.00: activated
sbawe 01:01.02: activated
Note: snd_sbawe.ko module is not compiled in for stock CentOS kernel.

NE2000 (RTL8019AS) does not work with SoundBlaster AWE32

Symptom: RTL8019AS and SoundBlaster AWE32 both in PnP mode. Manually modprobe ne; modprobe snd-sbawe will recognize the driver, but ne driver does not work. It seems to stop working after modprobe snd-sbawe.

Resolution: Try modprobe in opposite order, i.e modprobe snd-sbawe; modprobe ne. snd-sbawe driver seems to be less forgiving in PnP resource allocation, so let it allocate resources first, then load ne which is more flexible in resource allocation.


Unable to mount root fs on unknown-block(0,0)

Symptom: On boot, kernel panics at early stage:

...
[    7.030357] md: ... autorun DONE.
[    7.035143] List of all partitions:
[    7.038643] No filesystem could mount root, tried:
[    7.038645]
[    7.045754] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    7.054114] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.0-193.6.3.el8_2.centos.plus.v3.i586 #1
[    7.054114] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090008  12/07/2018
[    7.054114] Call Trace:
[    7.054114]  dump_stack+0x58/0x7e
[    7.054114]  panic+0x94/0x230
[    7.054114]  mount_block_root+0x242/0x25b
[    7.054114]  mount_root+0x76/0x7b
...

Cause: The grub menu is lacking initrd ($root)/initramfs-4.18.0-193.6.3.el8_2.centos.plus.v3.i586.img line. You are very likely have interrupted the kernel installation by Ctrl+C, which leaves /boot/grub2/grub.cfg in transient state, missing initrd line.

Resolution: The easiest way is to reinstall the kernel-core package, after booting in previous kernel:

# dnf reinstall ./kernel-core-4.18.0-193.6.3.el8_2.centos.plus.v3.i586.rpm


pulseaudio hogs CPU in desktop environment

Symptom: Used startx to start a desktop environment. Watching the top(1) output. pulseaudio is hogging the cpu and desktop initialization crawls to nearly halt.

Workaround: Disable autospawn of pulseaudio. Edit /etc/pulse/client.conf, and add

autospawn = no
This will prevent pulseaudio from automatically starting. After the desktop had initialized, manually invoke pulseaudio by pulseaudio --start .

Since pulseaudio is designed for platform where CPU power >> soundcard processing power, you are not likely to have satisfactory performance when using ISA soundcards. PCI soundcard is recommended.

I want a progress meter for grub2 loader

Symptom: On a slow machine, grub just sits there during vmlinuz and initrd load. Isn't there a progress meter like grub-legacy had?

Resolution: Add below somewhere in /boot/grub2/grub.cfg . It shows percentage text of things loading in 1.5 seconds interval.

insmod progress


How do I eject a PCMCIA/CardBus card safely

Resolution: Install pcmciautils, and issue pccardctl eject 0 .


Konqueror shows error when launched from App Launcher Favorites

Symptom: When Konqueror is launched from App Launcher (Start Menu) -> Favorites, it always shows an error screen as below. No problem when invoking konqueror from a terminal, KRunner (Alt+F2) or App Launcher -> Applications -> Internet -> Konqueror .

The requested operation could not be completed


Undocumented Error
Details of the Request:
Description:

Unknown error code -1,229.371,680 Please send a full bug report at https://bugs.kde.org.

Cause: An entry in Favorites invokes kfmclient openURL "" text/html via /usr/share/applications/kfmclient.desktop , but Konqueror doesn't like the null string ("") passed in.

Workaround: Patch the konqueror package. This will not pass the URL argument if it was a null string, to make the "Home Page" open. This patch is partial; it always invokes "about:" URL when Konqueror is already running, since there's no explicit URL to invoke the "Home Page" setting of Konqueror via DBus.


Cannot open System Settings (systemsettings5), black window

Symptom: Using a hardware which uses i915 driver. When opening KDE System Settings, it only shows a black window. Invoking systemsettings5 from terminal shows

QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader
QOpenGLShader: could not create shader

Cause: KDE5 needs OpenGL 2.0 renderer, but /usr/lib/dri/i915_dri.so seems to not support it.

Checking glxinfo:

...
Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Intel Open Source Technology Center (0x8086)
    Device: Mesa DRI Intel(R) 852GM/855GM x86/MMX/SSE2 (0x3582)
    Version: 20.3.3
    Accelerated: yes
    Video memory: 96MB
    Unified memory: yes
    Preferred profile: compat (0x2)
    Max core profile version: 0.0
    Max compat profile version: 1.3
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 0.0
...

Workaround: Delete /usr/lib/dri/i915_dri.so . Restarting Xorg will make use of software renderer /usr/lib/dri/swrast_dri.so, and invoking glxinfo will now show

...
Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Mesa/X.org (0xffffffff)
    Device: llvmpipe (LLVM 11.0.0, 128 bits) (0xffffffff)
    Version: 20.3.3
    Accelerated: no
    Video memory: 983MB
    Unified memory: no
    Preferred profile: core (0x1)
    Max core profile version: 4.5
    Max compat profile version: 3.1
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.2
...

Text cursor disappears in xterm

Symptom: Using a hardware using i915 driver. When xterm is invoked,the text cursor (block cursor) disappears on key input. It becomes visible when backspace or left-arrow key is pressed. Konsole is not affected.
Killing kwin_x11 (window manager) makes cursor back to normal; re-invoking kwin_x11 makes cursor invisible again.

Workaround: Add a new file, /etc/X11/xorg.conf.d/20-intel.conf:

Section "Device"
    Identifier "Intel Graphics"
    Driver "Intel"
    ## Use legacy UXA, not default SNA
    Option "AccelMethod" "UXA"
EndSection

See intel(4) manpage for "AccelMethod".


Cutting down initramfs size for HDD boot

You could shave off several megabytes from /boot/initramfs if not booting from network (usually not) by dropping in the following as /etc/dracut.cond.d/nonet.conf :

# /etc/dracut.conf.d/nonet.conf
# setting for non-network booting machine
omit_dracutmodules+="nss-softokn i18n network-manager network ifcfg drm plymouth microcode_ctl-fw_dir_override"
omit_dracutmodules+="resume terminfo kernel-modules-extra"
and re- dracut -vf .

Smaller initframfs will gain 2-3 minutes of booting time on slow machine.


QProcess: Destroyed while process ("/usr/bin/plasma_session") is still running.

Symptom: On slow machine, KDE does not start.

When doing xinit and invoking startkde manually from the lone xterm, following error is recorded and startkde exits; KDE desketop does not start.

QProcess: Destroyed while process ("/usr/bin/plasma_session") is still running.
startkde: Starting up...

Cause: plasma-workspace.src package has hardcoded timeout of 120 secs to start /usr/bin/plasma_session. This could cause abnormal termination on slow machines:

startkde/startplasma.cpp: rc = startPlasmaSession.waitForFinished(120 * 1000);

Workaround: The plasma-workspace package provided on this page already has this timeout enlengthened to 600 secs.


<Super>space shortcut does not switch keyboard

Symptom: <Super>Space (<Windows>Space) shortcut key shows ibus keyboard switcher at the center of the screen, but keyboard icon in the tasktray does not change. Selecting layout from tasktray icon works (after some delay).

Solution: Change focus (click) on a textbox or terminal, and try the shortcut. Layout switcher by <Super>Space seems only effective when current focus is text-inputtable.

You may need to enlengthen timeout of ibus on slow machines.


initramfs is bloated with NotoSansCJK-Regular.ttc

Symptom: After installing google-noto-sans-cjk-ttc-fonts package, kernel installation or dracut generates initramfs of 20MB bigger than previous, which includes /usr/share/fonts/google-noto-cjk/NotoSansCJK-Regular.ttc .

Cause: The plymouth dracut package pulls in TrueType fonts by fc-match "":lang="$lang" file inside /usr/libexec/plymouth/plymouth-populate-initrd .

Workaround: Disable plymouth dracut package, by invoking dracut --omit plymouth option, or drop in an /etc/dracut.conf.d/noplymouth.conf file:

# /etc/dracut.conf.d/noplymouth.conf
omit_dracutmodules+="plymouth"

Emulate3Buttons does not work

Symptom: I have following as /etc/X11/xorg.conf.d/30-emulate3buttons:

Section "InputClass"
	Identifier "pointer3e"
	MatchIsPointer "on"
	MatchDevicePath "/dev/input/event*"
	Driver "evdev"
	Option "Emulate3Buttons" "True"
	Option "Emulate3Timeout" "50"
EndSection
but Xorg X11 server seems to not picking the settings; there is no "Emulate3Buttons" output in /var/log/Xorg.0.log .

Cause: You do not have xorg-x11-drv-evdev package installed. The functionality is "evdev" specific. It may not be pulled in when installing raw Xorg from minimum install.

Resolution: dnf install xorg-x11-drv-evdev, or dnf install xorg-x11-drivers, which will also pull in the package.



kabe.sra-tohoku.co.jp