PaulHowarth/Blog/2025-07

Paul's Blog Entries for July 2025

Tuesday 1st July 2025

Local Packages

  • Updated curl in the development repository to new upstream release candidate 8.15.0~rc2

Wednesday 2nd July 2025

Local Packages

  • Updated unrar to 7.12

Thursday 3rd July 2025

Fedora Project

  • Updated perl-Test-MockModule to 0.180.0 in Rawhide:

    • Remove Software::License from runtime dependencies (GH#67, GH#68)

Local Packages

  • Updated perl-Module-CoreList to 5.20250702:

    • Updated for v5.42.0
  • Updated perl-Test-MockModule to 0.180.0 as per the Fedora version

Monday 7th July 2025

Fedora Project

  • Updated perl-Finance-Quote to 1.66 in F-41, F-42, Rawhide and EPEL-10:

    • Modified CurrencyRates/CurrencyFreaks.pm to return from and to values instead of calculated rate

    • Removed Bloomberg.pm, Tiaacref.pm, Troweprice.pm

    • AlphaVantage: Return 'symbol not found' when no price data is returned

    • ASX: Changed error message when symbol isn't found (GH#497)

    • Added a new module to fetch the fund NAV from CMBChina (GH#494)

    • Added Cookie Jar to Comdirect user agent (GH#491)

    • Removed HU.pm, Oslobors.pm, and SEB.pm (GH#490)

  • Updated perl-Moose to 2.4000 in Rawhide:

  • Documentation
    • Clarified some wording regarding the interactions between attribute configuration options "init_arg" and "required" (GH#187)

  • Other
  • Updated perl-Test-Differences to 0.72 in Rawhide:

    • Changes to tests only, so tests pass when you have a new perl that supports bools, but an old Data::Dumper that doesn't

Local Packages

  • Updated city-fan.org-release to include the GPG key for the Fedora 43 repository in the package

  • Updated perl-Moose to 2.4000 as per the Fedora version

  • Updated perl-Net-DNS to 1.51:

    • Resync with IANA DNS Parameters registry
    • Add prototype DELEG RR package
    • Minor code and documentation improvements
  • Updated perl-Term-ReadLine-Gnu to 1.46:

    • Add readline-8.3 support

      • New functions: rl_reparse_colors, rl_print_keybinding

      • New variables: rl_full_quoting_desired, rl_macro_display_hook, rl_completion_rewrite_hook

      • New state values for rl_readline_state: RL_STATE_READSTR

    • Sample code updates
      • Import almost all examples from the GNU Readline Library
      • Use "/usr/bin/env" for sh-bang

      • Add eg/README.md

    • Make the check for being in emacs to be more like bash (GH#28)

    • Add a wrap function on every function that has Keymap as an argument

    • Add some constant functions
      • Add macro functions for rl_readline_state: RL_SETSTATE(), RL_UNSETSTATE(), RL_ISSTATE()

      • Export READERR

    • Fix for compilation in C23 mode (GH#32)

    • POD updates
      • Fix description of add_defun() in BUGS section (GH#23)

      • Fix formatting
    • GitHub actions: update OS and perl-version matrix

  • Updated perl-Test-Differences to 0.72 as per the Fedora version

Tuesday 8th July 2025

Fedora Project

  • Updated python-crypto (2.6.1) to stop using deprecated %py3_build/%py3_install macros (Bug #2377592)

  • Updated python-fluidity-sm (0.2.0) to stop using deprecated %py3_build/%py3_install macros (Bug #2377723)

  • Updated python-lexicon (2.0.1) to stop using deprecated %py3_build/%py3_install macros (Bug #2377852)

  • Updated python-paramiko (3.5.1) to stop using deprecated %py3_build/%py3_install macros (Bug #2377972)

Thursday 10th July 2025

Local Packages

  • Updated curl in development repository to new upstream release candidate 8.15.0~rc3

Friday 11th July 2025

Fedora Project

  • Updated geoipupdate to 7.1.1 in Rawhide:

    • Update dependencies and re-build binaries with new Go version; no substantive changes
  • Updated perl-Business-ISBN-Data to 20250710.001 in Rawhide:

    • Data update for 2025-07-10
  • Updated perl-IO-Socket-SSL to 2.095 in Rawhide:

    • Regression: make sysread set buffer to empty string again when returning EOF (GH#171)

  • Branched and built smbldap-tools (0.9.11) for EPEL-9

Local Packages

  • All Perl based packages in the development repository rebuilt for Perl 5.42
  • Updated geoipupdate to 7.1.1 as per the Fedora version

  • Updated perl-IO-Socket-SSL to 2.095 as per the Fedora version

Monday 14th July 2025

Fedora Project

  • Updated perltidy to 20250711 in Rawhide (see CHANGES.md for details)

Local Packages

  • Updated perl-Perl-Tidy to 20250711 as per the Fedora perltidy package

Tuesday 15th July 2025

Local Packages

Wednesday 16th July 2025

Local Packages

  • Updated curl to 8.15.0:

    • TLS: Remove support for Secure Transport and BearSSL
    • altsvc: Accept 'clear' without semicolon as well

    • asyn-ares: Remove redundant NULL check

    • asyn-thrdd: Free the previous name before strdup'ing the new

    • autotools: Detect and link 'brotlicommon' library for brotli

    • autotools: Drop '$top_builddir/src' from src header path

    • autotools: Drop headers from src mk-unity rules (fixup)

    • autotools: Drop no longer necessary '--srcdir' unity options

    • autotools: Drop redundant 'Makefile.inc' from 'EXTRA_DIST' in src

    • autotools: Simplify configuration in tests, examples
    • bufq: Change read/write signatures

    • bufq: Remove the unused Curl_bufq_unwrite function

    • build: Assume 'sys/socket.h', 'sys/time.h' on non-Windows (as in 'curl/curl.h')

    • build: Drop 'HAVE_SYS_SOCKET_H' and 'HAVE_SYS_TIME_H' macros

    • build: Drop explicit curlx from hdr paths, refer headers with 'curlx/' prefix

    • build: Drop unused variables in tests
    • build: Fix libcurltool with cmake and tunits, related tidy-ups

    • build: Split '.c' and '.h' file lists in tests

    • build: Stop checking for 'sys/stat.h'

    • build: stubgss tidy-ups (in tests)

    • build: Sync build scripts between client/libtest

    • build: Tidy up 'Makefile.inc' use in lib and src

    • build: Tidy up header paths, use srcdir where possible

    • cf-socket: Make socket data_pending a no-op

    • checksrc-all: Rewrite in Perl, remove 'checksrc.bat'

    • checksrc: Reduce exceptions, apply again to curlx

    • cmake/FindGSS: Fix processing C header path options

    • cmake/FindGSS: Initialize result variables

    • cmake: 'curl_add_clang_tidy_test_target' tidy-ups

    • cmake: Build 'stubgss' library for libtests to match autotools

    • cmake: Check USE_WINDOWS_SSPI when adding secur32 to CURL_LIBS

    • cmake: Configure c-ares header directory in project root (was: lib)
    • cmake: Document OpenSSL and ngtcp2 crypto lib custom variables

    • cmake: Drop never-propagated C macros
    • cmake: Drop passing redundant 'CURL_STATICLIB' in examples and clients

    • cmake: Drop redundant macro from test clients
    • cmake: Drop reference to future variable

    • cmake: Enable soversion by default for OpenHarmony OS

    • cmake: Fix 'curl_add_clang_tidy_test_target' when no '-D' option

    • cmake: Fix generator expression in docs/examples

    • cmake: Gather options recursively in 'curl_add_clang_tidy_test_target'

    • cmake: Make docs depend on support files
    • cmake: Move 'OUTPUT' argument in the 'add_custom_command()' line

    • cmake: Omit clang-tidy on internal libs curlu and curltool

    • cmake: Replace 'cmakelint' with 'cmake-lint' from 'cmakelang', fix issues

    • cmake: Replace the way clang-tidy verifies tests, fix issues found

    • cmake: Simplify handling generated 'lib1521.c' in libtests

    • cmake: Sync 'target_link_libraries()' order in tests more

    • cmake: Sync tests scripts by using the variable 'BUNDLE'

    • cmake: Sync tests scripts with each other and autotools (more)
    • cmake: Use 'target_link_options()' when available

    • config-win32: Fix default targets, shorten macro logic

    • configure: Order LDAP after the SSL libraries

    • connect: Drop unused struct member

    • connection: Clarify 'transport'

    • connection: Eliminate member 'remote_addr'

    • curl-config: Fix whitespace in usage text

    • curl.h: Make CURL_IPRESOLVE_* symbols defined as longs

    • curl.h: Make CURLSSLOPT_* symbols defined as longs

    • curl.h: Remove the "RESERVED" error codes

    • curl: Implement non-blocking STDIN read on Windows

    • curl: Improve non-blocking STDIN performance

    • curl: Remove the global argument from many functions

    • curl: Unify pointer names to global config
    • curl_get_line: Make sure lines end with newline

    • curl_memory.h: Fix to undefine 'accept4'

    • curl_path: Make SFTP handle a path like /~ properly

    • curlinfo: Provide the 'digest' feature

    • CURLSHOPT_SHARE.md: Mention multi-threading requires callbacks

    • DEPRECATE.md: Add VS2005 removal to the list

    • digest: Fix build with disabled digest auth
    • DISTROS: Update NixOS link

    • docs,tests: Fix english grammar "allow to" -> "allow <something> to"

    • docs/CONTRIBUTE: Fix broken link

    • docs/examples: Add ftp-delete.c

    • docs: Beef up examples/websocket.c

    • docs: Fix broken link in CODE_REVIEW.md

    • docs: Fix broken link in INSTALL.md

    • docs: Fix docs for CURLOPT_PREQUOTE after GH#17616

    • docs: Fix documentation of connect_only 2

    • docs: Fix two typos
    • docs: Mention that the netrc file works without port numbers

    • docs: Mention the as-is concept generically
    • docs: Note SSLS-EXPORT feature in -ssl-sessions doc

    • docs: Reflect that delimiter-separated capath is only OpenSSL
    • docs: Sync -tls-earlydata support with CURLOPT_SSL_OPTIONS

    • docs: Warn about lifetime in CURLOPT_CLOSESOCKET*

    • easy: Fix comment-documentation
    • easygetopt: Fix curl logo in header comment

    • firefox-db2pem: Avoid use of eval in script

    • ftp: Fix prequotes for a directory in URL
    • ftplistparser: Split parse_unix into sub-functions

    • h2_serverpush: Fix file handle leaks reported by clang-tidy

    • h3: Fix query of concurrent streams
    • http/3: Report handshake with version and cipher as for TCP connections
    • http2: Do not delay RST send on aborted transfer

    • http2: Fix var types in is_alive() implementations

    • http: Explicitly ignore parsing errors for Retry-After

    • http: Fix build with cookies and HSTS disabled

    • http_ntlm: Protect against null deref

    • http_ntlm: Remove unreachable code

    • INSTALL.md: Cygwin details and add source code link

    • ldap: Avoid automake caching issues with LDAP library names

    • ldap: If ldap-lib is sufficient, add it to LIBS

    • ldap: Initial support for --with-ldap option

    • lib2082: Drop 'typedef struct'

    • lib: Address single-use issues
    • lib: Avoid reusing unclean connection
    • lib: Drop two interim macros in favour of native libcurl API calls

    • lib: Fix unused parameter/function compiler warnings
    • lib: Make 'CURLX_SET_BINMODE()' and use it

    • lib: Make 'curlx_wait_ms()' and use it

    • lib: Replace scache no-op macros with '#ifdef'

    • lib: Stop 'time()' debug overrides at the end of source in altsvc, hsts

    • lib: Unify recv/send function signatures

    • libcurl-env.md: Drop LOGNAME, USER and NTLMUSER

    • libcurl.m4: Fix indentation

    • libssh2: Remove use of 'initialised' for clean-up

    • libssh: De-complex myssh_statemach_act()

    • libssh: Fix readdir issues

    • libtests: Make tests 1503, 1504, 1505 use the 1502 binary

    • libtests: More header tidy-ups

    • libtests: Stop building the same source multiple times

    • memdebug.h: #undef 'fclose' before defining it

    • memdebug.h: Eliminate global macro 'CURL_MT_LOGFNAME_BUFSIZE'

    • memdebug: Include in unity batch

    • memory: Stop overriding unused 'wcsdup()'/'_wcsdup()' system functions

    • memory: Tidy up '_tcsdup()' override

    • misc: Fix typos
    • mk-lib1521: Replace 'printf' with 'curl_mprintf'

    • multi: Add dirty bitset
    • multi: Do not expire a blocked transfer
    • multi: Fix polling with pending input
    • multi: Remove careful bounds check as coverity says it is not needed
    • multi: xfer table/bitset, handle limits
    • ngtcp2: Fix coverity warning about result handling

    • openssl: Enable read-ahead
    • openssl: Error on SSL_ERROR_SYSCALL

    • openssl: Fix handling of buffered data
    • openssl: Fix openssl engine use
    • openssl: Fix pkcs11 provider available check
    • os400: Upgrade ILE/RPG bindings with latest definitions
    • pingpong: On disconnect, check for unflushed pingpong state

    • projects/build-openssl.bat: Remove

    • pytest: test_07_70, weaken early data check

    • pytest: Adapt for runs with openssl-1.1.1

    • pytest: Disable test_07_37 and test_07_36 with openssl's quic

    • quic: Implement CURLINFO_TLS_SSL_PTR

    • RELEASE-PROCEDURE.md: Update docs/VERSIONS

    • runtests.pl: Fix sprintf() using one too many %s

    • runtests: Fix 'LD_PRELOAD' detection for cmake-built curl binaries

    • runtests: Support memory-limits per test

    • rustls: Apply memory function overrides, fixing an ECH buffer free

    • rustls: Don't try printing the not provided file

    • schannel: Allow partial chains for manual peer verification

    • schannel: Drop Windows 2000 compatibility logic

    • scorecard: Flame graphs and documentation
    • SCP/SFTP: Avoid busy loop after EAGAIN

    • scripts: Fix to quote the copyright email address
    • socks: Fix query when filter context is null
    • system.h: Remove some macros

    • test1117: Reduce write delays

    • test1175: Fix to run, and fix documentation issues detected

    • test1222: Fix for out-of-tree and no-libcurl-manual builds

    • test1499, 1599: use '%LOGDIR'

    • test1499: Verify two chunked responses on reused connection

    • test1596: Let test pass after year 2036

    • test1706: Pass include directory to 'managen' for out-of-tree builds

    • tests/client: Drop autotools logic no longer necessary

    • tests/client: Use 'curl_mfprintf()'

    • tests/dnsd: Read config from file

    • tests/http/clients: Drop hack and use 'curl_setup.h' again

    • tests/http/clients: Move to tests/client

    • tests/http/requirements: Remove multipart

    • tests/libtest: Call 'curlx_now_init()' for unit 1399, 2600 (Windows)

    • tests/libtest: Drop 'TEST_HANG_TIMEOUT' redefinition hack

    • tests/libtest: Drop a checksrc exception

    • tests/libtest: Use 'curltime' from curlx

    • tests/server/util.c: Include netinet/in6.h

    • tests/server: De-dupe/merge three 'sockdaemon()' clones into one

    • tests/server: Drop 'memdebug.h'

    • tests/server: Make all global vars/funcs static

    • tests/server: Move memory init to 'memptr.c'

    • tests/servers.pm: Add more ways to figure out current user

    • tests: Always make bundles, adapt build and tests
    • tests: Bundle http clients, de-dupe, enable for MSVC
    • tests: Constify, make consts static
    • tests: Drop 'BUNDLE_SRC' variable

    • tests: Drop mk-bundle exceptions

    • tests: Drop unused or redundant includes
    • tests: Drop useless "nodist_SOURCES" assignments

    • tests: Fail torture if !valgrind&threaded resolver

    • tests: Fix 1301, 1308 to fail on error

    • tests: Fix 'BUNDLE' variable references in 'Makefile.am'

    • tests: Make all names < 75 characters long

    • tests: Make individual test sources compile cleanly
    • tests: Make sshserver less verbose

    • tests: Move 'curlcheck.h' to libtest as 'unitcheck.h'

    • tests: Move GSS-API dynamic stub into debug-mode libcurl

    • tests: torture: Don't duplicate valgrind command

    • tests: Use %b64[] to base64 data

    • tests: Use %b64[] to base64 data in 2056, 2057

    • tftpd: Use 'CURLMIN()' macro

    • tidy-up: Replace '<memdebug.h>' with '"memdebug.h"' (src, units)

    • tls: Remove Curl_ssl false_start

    • tool1621: Drop unused internal libcurl headers

    • tool_getparam: Fix --ftp-pasv

    • tool_operate: Fix return code when --retry is used but not triggered

    • tool_paramhelp: Fix language in comments

    • top-complexity: Lower max allowed complexity threshold to 90
    • unit tests: Extract "private" prototypes at build time
    • unit1302: Expand the base64 encode/decode tests

    • url: Fix connection lifetime checks
    • url: Fix NULL deref with bad password when no user is provided

    • urlapi: Simplify and split into sub functions

    • urlapi: Use upper case hex encoding

    • vauth: Move auth structs to conn meta data

    • vtls: Change send/recv signatures of tls backends

    • vtls: Fix a copy-pasted early data comment typo

    • vtls: Log rustls negotiated KEX group name

    • vtls: Prefer ciphersuite to cipher in msgs

    • vtls: Prefer rustls-ffi ciphersuite name API

    • VULN-DISCLOSURE-POLICY.md: Fix typos

    • VULN-DISCLOSURE-POLICY: All reports should be disclosed

    • VULN-DISCLOSURE-POLICY: Exclude not installed software

    • VULN-DISCLOSURE-POLICY: Minor language polish

    • warnless: Drop parts of the 'read'/'write' preprocessor hack (Windows)

    • warnless: Replace 'read()'/'write()' wrapper functions with macros (Windows)

    • windows: Drop redundant 'curl_wcsdup_callback' callback

    • windows: Fixup 'fopen()' in 'CURLDEBUG' builds

    • windows: Reduce/stop loading DLLs at runtime
    • wolfssl: Add support for ML_KEM hybrids

    • ws: Drop redundant 'CURL_EXTERN' from function definitions

    • xfer: Manage pause bits

Friday 18th July 2025

Local Packages

  • Updated java-1.8.0-oracle to Java SE 8 update 461

Sunday 20th July 2025

Replacing disks on server

For some time I had been getting emails about SMART warnings on one of my servers, like these:

Device: /dev/sdb [SAT], 10 Offline uncorrectable sectors
Device: /dev/sdb [SAT], 78 Currently unreadable (pending) sectors

The numbers had been growing so I knew I had to replace the disk, which was a Seagate Barracuda 7200.10 320GB, one of a pair (sda, sdb) that were mirrored using mdraid level 1 so the server was still fine for the moment with sda not reporting any issues. I bought a pair of trusty Crucial MX500 500GB SSDs as replacements.

The existing partitioning arrangement was as follows:

Partition

Start Sec

End Sec

Size

RAID device

Usage

/dev/sda: 298.1 GiB (320 GB) with GPT partition table

sda1

2048

821247

400.0 MiB

md0

-

sda2

821248

2459647

800.0 MiB

md1

/boot (OSa)

sda3

2459648

4098047

800.0 MiB

md2

/boot (OSb)

sda4

4098048

171870207

80.0 GiB

md3

vgGKOS

sda5

171870208

423528447

120.0 GiB

md4

vgGKdata

sda6

423528448

424347647

400.0 MiB

-

/boot/efi

-

-

95.7 GiB spare

/dev/sdb: 298.1 GiB (320 GB) with GPT partition table

sdb1

2048

821247

400.0 MiB

md0

-

sdb2

821248

2459647

800.0 MiB

md1

/boot (OSa)

sdb3

2459648

4098047

800.0 MiB

md2

/boot (OSb)

sdb4

4098048

171870207

80.0 GiB

md3

vgGKOS

sdb5

171870208

423528447

120.0 GiB

md4

vgGKdata

sdb6

423528448

424347647

400.0 MiB

-

/boot/efi (copy)

-

-

95.7 GiB spare

The LVM volume groups were set up as follows:

Volume Group

Logical Volume

Size

Mount Point (OSa)

Mount Point (OSb)

vgGKdata

srv

40.00 GiB

/srv

/srv

vgGKdata

home

40.00 GiB

/home

/home

vgGKdata

Free Space

39.93 GiB

-

-

vgGKOS

root.A

15.00 GiB

/

-

vgGKOS

root.B

15.00 GiB

-

/

VgGkOS

tmp

10.00 GiB

/tmp

/tmp

VgGkOS

swap

16.00 GiB

-

-

VgGkOS

Free Space

23.93 GiB

-

-

First step was to open up the server and install the new SSDs. That introduced two new drives, sdc and sdd with nothing on them. Since the new drives were bigger than the old ones, I took the opportunity to make the partitions bigger so that I'd be able to expand things with very little effort in the process of replacing the disks. I used gdisk to partition both drives like this:

Partition

Start Sec

End Sec

Size

Partition Code

RAID device

Usage

/dev/sdc: 465.8 GiB (500 GB) with GPT partition table

sdc1

2048

1128447

550.0 MiB

EF00

md0

-

sdc2

1128448

5322751

2.0 GiB

FD00

md1

/boot (OSa)

sdc3

5322752

9517055

2.0 GiB

FD00

md2

/boot (OSb)

sdc4

9517056

345061375

160.0 GiB

FD00

md3

vgGKOS

sdc5

345061376

764491775

200.0 GiB

FD00

md4

vgGKdata

sdc6

764491776

765618175

550.0 MiB

EF00

-

/boot/efi

-

-

100.7 GiB spare

{i} md0 was originally an EFI system partition on top of an mdraid array but I decided a long time ago that that was a bad idea after reading this.

The next step was to add the new partitions to the existing RAID arrays:

# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 409536 (399.94 MiB 419.36 MB)
     Used Dev Size : 409536 (399.94 MiB 419.36 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 14:14:27 2025
             State : clean 
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1067

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
# mdadm /dev/md0 --add /dev/sdc1 /dev/sdd1
mdadm: added /dev/sdc1
mdadm: added /dev/sdd1
# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 409536 (399.94 MiB 419.36 MB)
     Used Dev Size : 409536 (399.94 MiB 419.36 MB)
      Raid Devices : 2
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 14:39:25 2025
             State : clean 
    Active Devices : 2
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 2

Consistency Policy : resync

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1069

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1

       2       8       33        -      spare   /dev/sdc1
       3       8       49        -      spare   /dev/sdd1
# mdadm /dev/md0 --grow --raid-devices=4
raid_disks for /dev/md0 set to 4
# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 409536 (399.94 MiB 419.36 MB)
     Used Dev Size : 409536 (399.94 MiB 419.36 MB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 14:40:00 2025
             State : clean, degraded, recovering 
    Active Devices : 2
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 2

Consistency Policy : resync

    Rebuild Status : 50% complete

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1080

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       3       8       49        2      spare rebuilding   /dev/sdd1
       2       8       33        3      spare rebuilding   /dev/sdc1

(some time later)
# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 409536 (399.94 MiB 419.36 MB)
     Used Dev Size : 409536 (399.94 MiB 419.36 MB)
      Raid Devices : 4
     Total Devices : 4
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 14:40:05 2025
             State : clean 
    Active Devices : 4
   Working Devices : 4
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1090

    Number   Major   Minor   RaidDevice State
       0       8        1        0      active sync   /dev/sda1
       1       8       17        1      active sync   /dev/sdb1
       3       8       49        2      active sync   /dev/sdd1
       2       8       33        3      active sync   /dev/sdc1

I then repeated the process to add new partitions to arrays md1, md2, md3 and md4 in a similar fashion, then waiting for them to complete synchronizing the data on to the new drives..

That just left the filesystems on the sixth partitions of each drive (EFI system partitions) to copy over, which I did using dd:

# dd if=/dev/sda6 of=/dev/sdc6 bs=1024
409600+0 records in
409600+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 34.6945 s, 12.1 MB/s
# blkid /dev/sdc6
/dev/sdc6: SEC_TYPE="msdos" UUID="F0A9-5AF2" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI system partition" PARTUUID="6d396dbf-f553-484c-8e35-7b798d584b3d"
# dd if=/dev/sdb6 of=/dev/sdd6 bs=1024
409600+0 records in
409600+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 8.80212 s, 47.7 MB/s

Those filesystems will be reformatted next time I install an updated OS on the server, so I didn't bother doing anything to try to increase the size of the filesystems at this time.

The /boot/efi/EFI/fedora/grub.cfg file points to the filesystem containing /boot, which was on md2 and had the same UUID as it always had, so there was nothing to change there.

The next step was to arrange for booting to take place from the new drives instead of the old one. Here was the current situation:

# efibootmgr
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000,0001,0002,0003,0004,0006,0007,0008,0009,0005
Boot0000* Fedora        HD(6,GPT,16233012-926f-4b61-9831-f0bbf24efd21,0x193e8800,0xc8000)/\EFI\FEDORA\SHIMX64.EFI
Boot0001* UEFI OS       HD(1,GPT,5584e986-3d0e-48d4-a261-f14498dfe02c,0x800,0xc8000)/\EFI\BOOT\BOOTX64.EFI0000424f
Boot0002* UEFI OS       HD(1,GPT,39ed59ca-e1da-4126-9e16-ee7b14ca4ec7,0x800,0xc8000)/\EFI\BOOT\BOOTX64.EFI0000424f
Boot0003* UEFI: IP4 Intel(R) Ethernet Connection (H) I219-LM    PciRoot(0x0)/Pci(0x1f,0x6)/MAC(e0071bff0827,0)/IPv4(0.0.0.0,0,DHCP,0.0.0.0,0.0.0.0,0.0.0.0)0000424f
Boot0004* UEFI: IP6 Intel(R) Ethernet Connection (H) I219-LM    PciRoot(0x0)/Pci(0x1f,0x6)/MAC(e0071bff0827,0)/IPv6([::],0,Static,[::],[::],64)0000424f
Boot0005* UEFI: Built-in EFI Shell      VenMedia(5023b95c-db26-429b-a648-bd47664c8012)0000424f
Boot0006* Fedora        HD(1,GPT,5584e986-3d0e-48d4-a261-f14498dfe02c,0x800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0007* Fedora        HD(6,GPT,16233012-926f-4b61-9831-f0bbf24efd21,0x193e8800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0008* Fedora        HD(1,GPT,39ed59ca-e1da-4126-9e16-ee7b14ca4ec7,0x800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0009* Fedora        HD(6,GPT,c3a13747-6fe1-49f3-b4a6-5770d6e2ee1f,0x193e8800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
# blkid /dev/sda6
/dev/sda6: SEC_TYPE="msdos" UUID="F0A9-5AF2" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="16233012-926f-4b61-9831-f0bbf24efd21"
# blkid /dev/sdc6
/dev/sdc6: PARTLABEL="EFI system partition" PARTUUID="6d396dbf-f553-484c-8e35-7b798d584b3d"

I added a new boot table entry to boot from sdc6:

# efibootmgr -c -d /dev/sdc -p 6 -L "Fedora SSD" -l '\EFI\FEDORA\SHIMX64.EFI'
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 000A,0000,0001,0002,0003,0004,0006,0007,0008,0009,0005
Boot0000* Fedora        HD(6,GPT,16233012-926f-4b61-9831-f0bbf24efd21,0x193e8800,0xc8000)/\EFI\FEDORA\SHIMX64.EFI
Boot0001* UEFI OS       HD(1,GPT,5584e986-3d0e-48d4-a261-f14498dfe02c,0x800,0xc8000)/\EFI\BOOT\BOOTX64.EFI0000424f
Boot0002* UEFI OS       HD(1,GPT,39ed59ca-e1da-4126-9e16-ee7b14ca4ec7,0x800,0xc8000)/\EFI\BOOT\BOOTX64.EFI0000424f
Boot0003* UEFI: IP4 Intel(R) Ethernet Connection (H) I219-LM    PciRoot(0x0)/Pci(0x1f,0x6)/MAC(e0071bff0827,0)/IPv4(0.0.0.0,0,DHCP,0.0.0.0,0.0.0.0,0.0.0.0)0000424f
Boot0004* UEFI: IP6 Intel(R) Ethernet Connection (H) I219-LM    PciRoot(0x0)/Pci(0x1f,0x6)/MAC(e0071bff0827,0)/IPv6([::],0,Static,[::],[::],64)0000424f
Boot0005* UEFI: Built-in EFI Shell      VenMedia(5023b95c-db26-429b-a648-bd47664c8012)0000424f
Boot0006* Fedora        HD(1,GPT,5584e986-3d0e-48d4-a261-f14498dfe02c,0x800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0007* Fedora        HD(6,GPT,16233012-926f-4b61-9831-f0bbf24efd21,0x193e8800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0008* Fedora        HD(1,GPT,39ed59ca-e1da-4126-9e16-ee7b14ca4ec7,0x800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot0009* Fedora        HD(6,GPT,c3a13747-6fe1-49f3-b4a6-5770d6e2ee1f,0x193e8800,0xc8000)/\EFI\FEDORA\SHIM.EFI0000424f
Boot000A* Fedora SSD    HD(6,GPT,6d396dbf-f553-484c-8e35-7b798d584b3d,0x2d913800,0x113000)/\EFI\FEDORA\SHIMX64.EFI

The next step was to reboot and make sure that the new boot entry worked, which it did. I then shut down the server and physically disconnected the two old drives, the brought the server back up again. That worked too, which was nice, although I did get a bunch of emails about degraded RAID arrays, which was expected.

I now had a bunch of mdraid devices with two working devices (now called sda* and sdb*) and two missing devices, so I dropped the size back to two devices for each array, e.g.:

# mdadm /dev/md0 --grow --raid-devices=2
# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 409536 (399.94 MiB 419.36 MB)
     Used Dev Size : 409536 (399.94 MiB 419.36 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 16:10:52 2025
             State : clean
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1094

    Number   Major   Minor   RaidDevice State
       3       8       17        0      active sync   /dev/sdb1
       2       8        1        1      active sync   /dev/sda1

Since the (smaller) partitions of the old drives were no longer part of the array, I could grow the array to fill the new partitions:

# mdadm --grow --size max /dev/md0
mdadm: component size of /dev/md0 has been set to 563184K
# mdadm --detail /dev/md0
/dev/md0:
           Version : 1.0
     Creation Time : Sat Mar 11 04:06:43 2017
        Raid Level : raid1
        Array Size : 563184 (549.98 MiB 576.70 MB)
     Used Dev Size : 563184 (549.98 MiB 576.70 MB)
      Raid Devices : 2
     Total Devices : 2
       Persistence : Superblock is persistent

       Update Time : Sun Jul 20 16:24:36 2025
             State : clean, resyncing
    Active Devices : 2
   Working Devices : 2
    Failed Devices : 0
     Spare Devices : 0

Consistency Policy : resync

     Resync Status : 99% complete

              Name : localhost.localdomain:0
              UUID : 3189b1a3:f4ba415b:45d478c0:2e5a08c2
            Events : 1099

    Number   Major   Minor   RaidDevice State
       3       8       17        0      active sync   /dev/sdb1
       2       8        1        1      active sync   /dev/sda1

I waited for the resync to complete before progressing to the next one.

So, I now had md0 with an old EFI system partition on it that I wasn't bothered about, md1 and md2 with ext4 filesystems that would need to be grown to fit the new array sizes, and md3 and md4 containing LVM physical volumes that would also need to be grown to fit the new array sizes:

# resize2fs /dev/md1
resize2fs 1.47.0 (5-Feb-2023)
Please run 'e2fsck -f /dev/md1' first.

# e2fsck -f /dev/md1
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Boot.A: 44/51296 files (22.7% non-contiguous), 87780/204784 blocks
# resize2fs /dev/md1
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/md1 to 524284 (4k) blocks.
The filesystem on /dev/md1 is now 524284 (4k) blocks long.

# resize2fs /dev/md2
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/md2 is mounted on /boot; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/md2 is now 524284 (4k) blocks long.

# pvdisplay /dev/md3
  --- Physical volume ---
  PV Name               /dev/md3
  VG Name               vgGKOS
  PV Size               <79.94 GiB / not usable 4.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              20463
  Free PE               6127
  Allocated PE          14336
  PV UUID               riajtP-OOK7-tK5g-Mypy-X3Qd-7uwE-JGLwWD

# pvresize -v /dev/md3
  Resizing volume "/dev/md3" to 335413248 sectors.
  Resizing physical volume /dev/md3 from 20463 to 40943 extents.
  Updating physical volume "/dev/md3"
  Archiving volume group "vgGKOS" metadata (seqno 5).
  Physical volume "/dev/md3" changed
  Creating volume group backup "/etc/lvm/backup/vgGKOS" (seqno 6).
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvdisplay /dev/md3
  --- Physical volume ---
  PV Name               /dev/md3
  VG Name               vgGKOS
  PV Size               <159.94 GiB / not usable 3.00 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              40943
  Free PE               26607
  Allocated PE          14336
  PV UUID               riajtP-OOK7-tK5g-Mypy-X3Qd-7uwE-JGLwWD

# pvdisplay /dev/md4
  --- Physical volume ---
  PV Name               /dev/md4
  VG Name               vgGKdata
  PV Size               <119.94 GiB / not usable 4.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              30703
  Free PE               10223
  Allocated PE          20480
  PV UUID               ClxfPu-FRD6-XHC7-Eb6U-80E6-SD0p-02VbT9
   
# pvresize -v /dev/md4
  Resizing volume "/dev/md4" to 419299328 sectors.
  Resizing physical volume /dev/md4 from 30703 to 51183 extents.
  Updating physical volume "/dev/md4"
  Archiving volume group "vgGKdata" metadata (seqno 3).
  Physical volume "/dev/md4" changed
  Creating volume group backup "/etc/lvm/backup/vgGKdata" (seqno 4).
  1 physical volume(s) resized or updated / 0 physical volume(s) not resized
# pvdisplay /dev/md4 
  --- Physical volume ---
  PV Name               /dev/md4
  VG Name               vgGKdata
  PV Size               <199.94 GiB / not usable 3.00 MiB
  Allocatable           yes 
  PE Size               4.00 MiB
  Total PE              51183
  Free PE               30703
  Allocated PE          20480
  PV UUID               ClxfPu-FRD6-XHC7-Eb6U-80E6-SD0p-02VbT9

Now that my LVM volume groups had more free space in them, I was able to increase the size of some of the logical volumes and the filesystems that were on them:

# vgdisplay -v vgGKOS
  --- Volume group ---
  VG Name               vgGKOS
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  6
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                4
  Open LV               3
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               159.93 GiB
  PE Size               4.00 MiB
  Total PE              40943
  Alloc PE / Size       14336 / 56.00 GiB
  Free  PE / Size       26607 / 103.93 GiB
  VG UUID               fqtzpQ-wcO6-zKdc-FCq6-T7rv-uycT-rZ2Znz

  --- Logical volume ---
  LV Path                /dev/vgGKOS/root.A
  LV Name                root.A
  VG Name                vgGKOS
  LV UUID                uUA2SK-Dbl0-9UxV-rHBh-BxE5-PE9X-zZod0K
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-03-11 06:01:58 +0000
  LV Status              available
  # open                 0
  LV Size                15.00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:2

  --- Logical volume ---
  LV Path                /dev/vgGKOS/root.B
  LV Name                root.B
  VG Name                vgGKOS
  LV UUID                antmFD-DOat-FuYa-luud-GSUP-iOG0-0ZmiJk
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-03-11 06:02:05 +0000
  LV Status              available
  # open                 1
  LV Size                15.00 GiB
  Current LE             3840
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:0

  --- Logical volume ---
  LV Path                /dev/vgGKOS/swap
  LV Name                swap
  VG Name                vgGKOS
  LV UUID                FqM6KO-cLko-BZdr-Nwq1-ye8Y-Iczm-CON3ob
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-03-11 06:02:24 +0000
  LV Status              available
  # open                 1
  LV Size                16.00 GiB
  Current LE             4096
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:1

  --- Logical volume ---
  LV Path                /dev/vgGKOS/tmp
  LV Name                tmp
  VG Name                vgGKOS
  LV UUID                1OHDnb-EwWq-Ccbi-JZ9Y-6Xq6-tH0a-pObqqZ
  LV Write Access        read/write
  LV Creation host, time localhost.localdomain, 2017-03-11 06:03:08 +0000
  LV Status              available
  # open                 1
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           252:3

  --- Physical volumes ---
  PV Name               /dev/md3
  PV UUID               riajtP-OOK7-tK5g-Mypy-X3Qd-7uwE-JGLwWD
  PV Status             allocatable
  Total PE / Free PE    40943 / 26607

# lvextend --size 25G /dev/vgGKOS/root.A
  Size of logical volume vgGKOS/root.A changed from 15.00 GiB (3840 extents) to 25.00 GiB (6400 extents).
  Logical volume vgGKOS/root.A successfully resized.
# lvextend --size 25G /dev/vgGKOS/root.B
  Size of logical volume vgGKOS/root.B changed from 15.00 GiB (3840 extents) to 25.00 GiB (6400 extents).
  Logical volume vgGKOS/root.B successfully resized.
# df /
Filesystem                1K-blocks     Used Available Use% Mounted on
/dev/mapper/vgGKOS-root.B  15375304  7901936   6670552  55% /
# resize2fs /dev/mapper/vgGKOS-root.A
resize2fs 1.47.0 (5-Feb-2023)
Please run 'e2fsck -f /dev/mapper/vgGKOS-root.A' first.

# e2fsck -f /dev/mapper/vgGKOS-root.A
e2fsck 1.47.0 (5-Feb-2023)
Root.A: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Feature orphan_present is set but orphan file is clean.
Clear<y>? yes

Root.A: ***** FILE SYSTEM WAS MODIFIED *****
Root.A: 115563/983040 files (0.4% non-contiguous), 2292449/3932160 blocks
# resize2fs /dev/mapper/vgGKOS-root.A
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/mapper/vgGKOS-root.A to 6553600 (4k) blocks.
The filesystem on /dev/mapper/vgGKOS-root.A is now 6553600 (4k) blocks long.

# resize2fs /dev/mapper/vgGKOS-root.B
resize2fs 1.47.0 (5-Feb-2023)
Filesystem at /dev/mapper/vgGKOS-root.B is mounted on /; on-line resizing required
old_desc_blocks = 2, new_desc_blocks = 4
The filesystem on /dev/mapper/vgGKOS-root.B is now 6553600 (4k) blocks long.

# df /
Filesystem                1K-blocks     Used Available Use% Mounted on
/dev/mapper/vgGKOS-root.B  25692476  7901972  16557784  33% /

I was similarly able to extend the sizes of /srv and /home on vgGKdata. I rebooted to make sure that all was well, then shut the machine down again to finally remove the old drives from the system before putting the case back together and bringing the server back up.

All in all a great success!

Monday 21st July 2025

Fedora Project

  • Updated ansible-collection-community-libvirt to 2.0.0 in Rawhide:

    • This is a major release of the community.libvirt collection

    • Many changes for virt_volume: see CHANGELOG.rst for details

    • New module community.libvirt.virt_install to provision new virtual machines using the virt-install tool

  • Updated perl-Path-Tiny to 0.150 in Rawhide:

    • Released with newest Dist::Zilla to avoid xattrs in the tarball

Local Packages

  • Updated ansible-collection-community-libvirt to 2.0.0 as per the Fedora version

  • Updated perl-ExtUtils-ParseXS to 3.58:

    • ExtUtils::ParseXS has been extensively restructured internally; most of these changes shouldn't be visible externally, but might affect XS code that was using invalid or unsupported syntax

  • Updated perl-Module-CoreList to 5.20250720:

    • Updated for v5.43.1
    • Updated for v5.43.0
  • Updated perl-Path-Tiny to 0.150 as per the Fedora version

Tuesday 22nd July 2025

Fedora Project

  • Updated perl-Business-ISBN-Data to 20250722.001 in Rawhide:

    • Data update for 2025-07-22

Sunday 27th July 2025

Local Packages

  • Rebuilt ansible-collection-community-libvirt (2.0.0), bluefish (2.2.17), check (0.15.2), grepmail (5.3111), gtkwave (3.3.124), Judy (1.0.5), libgpg-error (1.55), libidn (1.43), libnet (1.3), libssh2 (1.11.1), libxml2 (2.12.10), libxslt (1.1.43), mod_fcgid (2.3.9), nmap (7.92), perl-Any-Moose (0.27), perl-Class-XSAccessor (1.19). perl-DBI (1.647), perl-Dir-Self (0.11), perl-Feature-Compat-Class (0.07), perl-HTML-Lint (2.32), perl-IO-AIO (4.81), perl-MCE (1.901), perl-MIME-Types (2.28), perl-MIME-tools (1.515), perl-Moose (2.4000), perl-Mouse (2.5.11), perl-Net-DNS (1.51), perl-Object-HashBase (0.015), perl-Perl-Critic (1.156), perl-Perl-Tidy (20250711), perl-Specio (0.51), perl-Test-InDistDir (1.112071), perl-Test-LeakTrace (0.17), perl-Type-Tiny (2.008002), perl-Types-Path-Tiny (0.006), pptp (1.10.0), proftpd (1.3.9), rbldnsd (0.998b), sendmail (8.18.1), smbldap-tools (0.9.11) and spamass-milter (0.4.0) for the Fedora_43_Mass_Rebuild

  • Updated curl (8.15.0) to fix broken dependency on CA bundle when we don't use the old one at /etc/pki/tls/certs/ca-bundle.crt (related to Changes/dropingOfCertPemFile)

Monday 28th July 2025

Fedora Project

  • Updated perl-Crypt-CBC to 3.07 in F-41, F-42, EPEL-9, EPEL-10 and Rawhide:

    • New upstream maintainer
    • Fix CVE-2025-2814 by using Crypt::URandom

    • Fix decryption of ciphertext created with 'header' => 'randomiv'

    • Fixed bug in which manually-specified key and -pkdf=>"none" was not having any effect

    • Converted build process to Dist::Zilla

    • Miscellaneous minor Dist::Zilla related changes

  • Updated perl-Crypt-CBC (2.33) in EPEL-8 with back-ported fix for CVE-2025-2814 using Crypt::URandom

  • Updated perl-Devel-Cover to 1.51 in Rawhide:

    • Test against 5.42.0
    • Add nvim report to show coverage in neovim

    • Fix cover --outputdir option (GH#358)

  • Updated perl-Text-CSV_XS to 1.61 in Rawhide:

Local Packages

  • Updated perl-Text-CSV_XS to 1.61 as per the Fedora version

  • Updated unrar to 7.13 beta 1

Wednesday 30th July 2025

Fedora Project

Local Packages

  • Updated davfs2 (1.7.1) to add sysusers.d config file to allow rpm to create users/groups automatically from Fedora 43 onwards, and to add support for building with neon version 0.35

  • Rebuilt geoipupdate (7.1.1) as per the Fedora version

  • Updated perl-Net-DNS to 1.52:

    • Refactor SVCB to avoid internal use of generic keyNN
    • DELEG documentation and code improvement
    • Fix bug in resolver base selection on non-Unix/Linux platforms (CPAN RT#168433)

Thursday 31st July 2025

Fedora Project

  • Updated davfs2 (1.7.1) in Rawhide to support building with neon 0.35.0

Local Packages

  • Updated dovecot (2.4.1) to fix downstream HMAC patch compatibility with latest openssl (Bug #2383209)

  • Updated unrar to 7.13

Previous Month: June 2025
Next Month: August 2025

Recent