Skip to content

Instantly share code, notes, and snippets.

@deeagle
Last active April 15, 2023 23:27
Show Gist options
  • Save deeagle/768bc0b50bf705e6edb027a04c14c076 to your computer and use it in GitHub Desktop.
Save deeagle/768bc0b50bf705e6edb027a04c14c076 to your computer and use it in GitHub Desktop.
Simple fix for a debian linux upgrade to bullseye. Some packages will show an error message like `/usr/bin/perl: /lib64/libcrypt.so.1: version `XCRYPT_2.0' not found (required by /usr/bin/perl` and you have to link the new spot of the library. Update: I have to run it before installs and upgrades and everything is fine.
#!/bin/bash
# Needed for debian upgrade
# atm from buster to bullseye the linked libs are broken
# see: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=951880
LIB="libcrypt.so.1"
# Checks if the executer has super user permissions.
#
# @exit 2 if the user has no super user permissions
function validateRootPermissions() {
if [[ $(/usr/bin/id -u) -ne 0 ]]; then
echo "[ERR!] script must be run as root (sudo) and you're not root."
exit 2
fi
}
# Validates the existing of:
# - the source library exists (normally a link to the lib file)
# - both destinations are symlinks
function validateLibsExists() {
if [[ ! -f "/lib/x86_64-linux-gnu/${LIB}" ]]; then
echo "ERROR: Library file </lib/x86_64-linux-gnu/${LIB}> does not exists."
exit 1
fi
if [[ ! -L "/lib64/${LIB}" ]]; then
echo "ERROR: Library symlink </lib64/${LIB}> does not exists."
exit 2
fi
if [[ ! -L "/lib/x86_64-linux-gnu/${LIB}" ]]; then
echo "ERROR: Library symlink </lib/x86_64-linux-gnu/${LIB}> does not exists."
exit 3
fi
}
# Analyse the src and dest libs and if they link this src lib.
function analyseLibLinks() {
validateLibsExists
local correctPathSrcLib="$(readlink -f "/lib/x86_64-linux-gnu/${LIB}")"
if [[ $(readlink -f "/lib64/${LIB}") = "${correctPathSrcLib}" ]]; then
echo "[ ok ] $(ls -la "/lib64/${LIB}")"
else
echo "[ERR!] $(ls -la "/lib64/${LIB}")"
fi
if [[ $(readlink -f "/lib/x86_64-linux-gnu/${LIB}") = "${correctPathSrcLib}" ]]; then
echo "[ ok ] $(ls -la "/lib/x86_64-linux-gnu/${LIB}")"
else
echo "[ERR!] $(ls -la "/lib/x86_64-linux-gnu/${LIB}")"
fi
}
# Simple list of the symlinks to check.
function showLibLinks() {
ls -la "/lib64/${LIB}"
ls -la "/lib/x86_64-linux-gnu/${LIB}"
}
# Removes the old links and set the new symlinks.
function changeLibLinks() {
sudo rm "/lib64/${LIB}"
sudo rm "/lib/x86_64-linux-gnu/${LIB}"
sudo ln -s "/usr/lib/x86_64-linux-gnu/${LIB}" "/lib64/${LIB}"
sudo ln -s "/usr/lib/x86_64-linux-gnu/${LIB}" "/lib/x86_64-linux-gnu/${LIB}"
}
# Prints the help to stdout.
function printHelp() {
cat <<EOF
Project: rlxcrypt
Desc: Repair lib error XCRYPT2.x, XCRYPT4.4 not found.
Version: 0.0.2
Infos: Martin Kock <[email protected]>
Possible options:
-a | --analyse Show the actual linked libraries
-r | --repair Change the library links to </usr/lib/x86_64-linux-gnu/${LIB}
-h | --help prints this help
EOF
}
# Catch arguments and go
if [[ $# -eq 0 ]]; then
# starts the main function
printHelp
else
case "${1}" in
-a | --analyse)
analyseLibLinks
;;
-r | --repair)
validateRootPermissions
changeLibLinks
;;
-h | --help | *)
printHelp
;;
esac
fi
exit 0
@deeagle
Copy link
Author

deeagle commented Jul 8, 2021

Here the repair steps as script.

  • upgrade the system as root only (sudo won't work because it can break while upgrade!)
  • if you saw an error while update
    • something like this
      Processing triggers for initramfs-tools (0.140) ...                                                                                                                                                                 
      /usr/bin/perl: /lib64/libcrypt.so.1: version `XCRYPT_2.0' not found (required by /usr/bin/perl)                                                                                                                     
      /usr/bin/perl: /lib64/libcrypt.so.1: version `XCRYPT_2.0' not found (required by /usr/bin/perl)                                                                                                                     
      dpkg: error processing package initramfs-tools (--configure):                                                                                                                                                       
      installed initramfs-tools package post-installation script subprocess returned error exit status 1       
      Errors were encountered while processing:
       initramfs-tools                                                                                          
      E: Sub-process /usr/bin/dpkg returned an error code (1)                   
  • run the following script
    #!/bin/bash
    
    rm /lib64/libcrypt.so.1
    ln -s /lib/x86_64-linux-gnu/libcrypt.so.1 /lib64/libcrypt.so.1
    # shows your current perl version -> system ok
    perl -v >/dev/null && echo "[ OK ] libcrypt spot is correct" || echo "[ERR!] libcrypt spot seems not correct (can't run perl -v) don't logout root-shell"

edit: add echo to perl -v-call

@famarm
Copy link

famarm commented Jul 9, 2021

Sorry but the solution you wrote did not solve for me.
I keep getting the error after the update and go to KP.
I have to restore with rsync to have a bootable system again.

@deeagle
Copy link
Author

deeagle commented Jul 14, 2021

@famarm I'm sorry about that, but good thing you have a backup of the pre-situation.

My system runs clean with this workaround but I run the following cli loop til apt says "nothing to do":

  • apt upgrade -yq
  • bash repair-libcrypt-v2.sh

Overall, though, this is a really terrible situation. Yes, it is testing, but I would have thought that the kind of bugs are found between unstable and testing.
Let's see how to support the community process in the future.

Good luck too you

@krusic22
Copy link

krusic22 commented Apr 15, 2023

After spending even more time on this issue, I found a simple way of fixing all the lib related issues that pop up during the upgrade, since there is a bunch.
Simply install usrmerge, modify the script to remove the files located in the /usr directories when it errors, run till it's finally happy and run the upgrade afterwards. Just works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment