Fix 32-bit bcrypt ELFCLASS64 error and enhance installation

- Enhanced install_32bit.sh with clean virtual environment creation
- Added --force-reinstall and --clear flags for proper isolation
- Improved download_32bit_libs.sh with explicit armv7l targeting
- Added troubleshoot_32bit.sh for diagnosing 32-bit issues
- Better architecture verification and error messages
- Comprehensive package testing after installation

Fixes ELFCLASS64 error on 32-bit systems by ensuring proper
architecture isolation and clean package installation.
This commit is contained in:
2025-09-11 10:15:25 +03:00
parent 0aa1bb7069
commit 9c42b38c4b
3 changed files with 211 additions and 14 deletions

70
download_32bit_libs.sh Executable file → Normal file
View File

@@ -1,15 +1,71 @@
#!/bin/bash
# Download 32-bit ARM compatible libraries
# Download 32-bit ARM compatible libraries with forced architecture
set -e
echo "Downloading 32-bit ARM compatible packages..."
echo "======================================="
echo " 32-BIT ARM LIBRARY DOWNLOADER"
echo "======================================="
echo ""
# Create directory for 32-bit wheels
# Remove existing 32-bit folder to ensure clean download
if [ -d "req_libraries_32bit" ]; then
echo "🗑️ Removing existing req_libraries_32bit for clean download..."
rm -rf req_libraries_32bit
fi
# Create fresh directory
mkdir -p req_libraries_32bit
# Download with broader compatibility
pip download -r requirements.txt -d req_libraries_32bit/ --prefer-binary
echo "📦 Downloading 32-bit ARM compatible packages..."
echo " Target architecture: linux_armv7l"
echo ""
echo "Download completed!"
echo "Files downloaded to req_libraries_32bit/"
# Download with explicit 32-bit ARM platform targeting
echo "🔄 Downloading with forced 32-bit architecture..."
pip download -r requirements.txt -d req_libraries_32bit/ \
--platform linux_armv7l \
--only-binary=:all: \
--python-version 311 \
--abi cp311
echo ""
echo "📊 Download results:"
WHEEL_COUNT=$(ls req_libraries_32bit/*.whl 2>/dev/null | wc -l || echo "0")
echo " Wheel files: $WHEEL_COUNT"
if [ "$WHEEL_COUNT" -gt 0 ]; then
echo ""
echo "🔍 Key 32-bit packages:"
if ls req_libraries_32bit/bcrypt*.whl >/dev/null 2>&1; then
BCRYPT_FILE=$(basename $(ls req_libraries_32bit/bcrypt*.whl | head -1))
echo " 🔐 BCRYPT: $BCRYPT_FILE"
if [[ "$BCRYPT_FILE" == *"armv7l"* ]]; then
echo " ✅ Correct 32-bit architecture"
else
echo " ⚠️ Architecture unclear"
fi
fi
if ls req_libraries_32bit/pillow*.whl >/dev/null 2>&1; then
PILLOW_FILE=$(basename $(ls req_libraries_32bit/pillow*.whl | head -1))
echo " 🖼️ PILLOW: $PILLOW_FILE"
if [[ "$PILLOW_FILE" == *"armv7l"* ]]; then
echo " ✅ Correct 32-bit architecture"
fi
fi
echo ""
echo "✅ 32-bit libraries download completed!"
echo ""
echo "📋 Next steps:"
echo " 1. Copy this folder to your 32-bit Raspberry Pi"
echo " 2. Run: ./install_32bit.sh"
else
echo "❌ No wheel files downloaded"
echo ""
echo "💡 Troubleshooting:"
echo " • Check internet connection"
echo " • Verify requirements.txt exists"
echo " • Some packages may not have 32-bit wheels available"
fi

View File

@@ -1,5 +1,6 @@
#!/bin/bash
# Dedicated Offline Installer for 32-bit Raspberry Pi OS (armv7l)
# Ensures clean installation with proper architecture isolation
set -e
@@ -12,6 +13,7 @@ ARCH=$(uname -m)
echo "Architecture: $ARCH"
if [ "$ARCH" != "armv7l" ]; then
echo "ERROR: This script is for 32-bit Raspberry Pi OS (armv7l) only!"
echo "Current architecture: $ARCH"
exit 1
fi
@@ -19,6 +21,7 @@ fi
LIBS_FOLDER="req_libraries_32bit"
if [ ! -d "$LIBS_FOLDER" ]; then
echo "ERROR: $LIBS_FOLDER not found!"
echo "Please download 32-bit libraries first."
exit 1
fi
@@ -26,18 +29,75 @@ echo "Library folder: $LIBS_FOLDER"
WHEEL_COUNT=$(ls $LIBS_FOLDER/*.whl | wc -l)
echo "Wheel files: $WHEEL_COUNT"
# 3. Create .venv
echo "Creating .venv..."
python3 -m venv .venv
# 3. Show key 32-bit packages
echo ""
echo "32-bit packages to install:"
if ls $LIBS_FOLDER/bcrypt*.whl >/dev/null 2>&1; then
BCRYPT_FILE=$(basename $(ls $LIBS_FOLDER/bcrypt*.whl | head -1))
echo " BCRYPT: $BCRYPT_FILE"
fi
echo ""
# 4. Activate environment
# 4. Clean existing virtual environment
if [ -d ".venv" ]; then
echo "Removing existing .venv to ensure clean installation..."
rm -rf .venv
fi
# 5. Create fresh virtual environment
echo "Creating fresh virtual environment..."
python3 -m venv .venv --clear
# 6. Activate environment
echo "Activating virtual environment..."
source .venv/bin/activate
# 5. Upgrade pip
# 7. Ensure we're using the virtual environment
echo "Python location: $(which python)"
echo "Pip location: $(which pip)"
# 8. Upgrade pip
echo "Upgrading pip..."
pip install --upgrade pip
# 6. Install packages offline
pip install --no-index --no-deps --find-links $LIBS_FOLDER/ $LIBS_FOLDER/*.whl
# 9. Install packages with forced 32-bit isolation
echo ""
echo "Installing 32-bit packages (completely isolated)..."
pip install --no-index --no-deps --force-reinstall --find-links $LIBS_FOLDER/ $LIBS_FOLDER/*.whl
# 10. Verify 32-bit installation
echo ""
echo "Verifying 32-bit installation..."
python3 -c "
import sys
print(f'Python executable: {sys.executable}')
print(f'Architecture: $(uname -m)')
try:
import bcrypt
print('✅ bcrypt imported successfully')
# Test bcrypt functionality
password = b'test'
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
if bcrypt.checkpw(password, hashed):
print('✅ bcrypt functionality test passed')
else:
print('❌ bcrypt functionality test failed')
except Exception as e:
print(f'❌ bcrypt import/test failed: {e}')
try:
import requests
print('✅ requests imported successfully')
except Exception as e:
print(f'❌ requests failed: {e}')
try:
import vlc
print('✅ python-vlc imported successfully')
except Exception as e:
print(f'❌ python-vlc failed: {e}')
"
echo ""
echo "✅ 32-bit installation completed!"

81
troubleshoot_32bit.sh Executable file
View File

@@ -0,0 +1,81 @@
#!/bin/bash
# Troubleshooting script for 32-bit bcrypt issues
echo "🔍 32-BIT SYSTEM TROUBLESHOOTING"
echo "================================"
# System info
echo "1. System Information:"
echo " Architecture: $(uname -m)"
echo " OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo " Python: $(python3 --version)"
echo ""
# Check if we're in virtual environment
echo "2. Environment Check:"
if [ -n "$VIRTUAL_ENV" ]; then
echo " ✅ In virtual environment: $VIRTUAL_ENV"
echo " Python location: $(which python)"
echo " Pip location: $(which pip)"
else
echo " ❌ Not in virtual environment"
echo " System Python: $(which python3)"
fi
echo ""
# Check bcrypt installation
echo "3. Bcrypt Investigation:"
if [ -n "$VIRTUAL_ENV" ]; then
echo " Checking installed bcrypt..."
pip list | grep bcrypt || echo " ❌ bcrypt not installed"
echo " Testing bcrypt import..."
python3 -c "
try:
import bcrypt
print(' ✅ bcrypt imports successfully')
# Check bcrypt module location
print(f' Module location: {bcrypt.__file__}')
# Test basic functionality
test_pw = b'test123'
hashed = bcrypt.hashpw(test_pw, bcrypt.gensalt())
if bcrypt.checkpw(test_pw, hashed):
print(' ✅ bcrypt functionality works')
else:
print(' ❌ bcrypt functionality failed')
except ImportError as e:
print(f' ❌ bcrypt import failed: {e}')
except Exception as e:
print(f' ❌ bcrypt error: {e}')
"
else
echo " ⚠️ Please activate virtual environment first"
fi
echo ""
echo "4. Library Files Check:"
if [ -d "req_libraries_32bit" ]; then
echo " ✅ req_libraries_32bit exists"
if ls req_libraries_32bit/bcrypt*.whl >/dev/null 2>&1; then
BCRYPT_FILE=$(ls req_libraries_32bit/bcrypt*.whl | head -1)
echo " 32-bit bcrypt: $(basename $BCRYPT_FILE)"
# Quick check of wheel architecture
echo " Checking wheel architecture..."
unzip -l "$BCRYPT_FILE" | grep "\.so" | head -1 || echo " No .so files found"
else
echo " ❌ No bcrypt wheel found in 32-bit libraries"
fi
else
echo " ❌ req_libraries_32bit folder missing"
fi
echo ""
echo "5. Recommendations:"
echo " • Ensure you're on 32-bit Raspberry Pi OS (armv7l)"
echo " • Use: source .venv/bin/activate"
echo " • Run: ./install_32bit.sh for clean installation"
echo " • If still failing, remove .venv and reinstall"