archlinux-s390x/scripts/build-systemd-zvm.sh
Josephine Pfeiffer 7b50875291
systemd mvp
2025-06-02 22:58:34 +02:00

192 lines
No EOL
5.1 KiB
Bash
Executable file

#!/bin/bash
# Build minimal systemd natively on z/VM RHEL 9.6
# This script should be run on the z/VM system via SSH
set -e
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
# Configuration
SYSTEMD_VERSION="256.7"
BUILD_DIR="$HOME/systemd-build"
OUTPUT_DIR="$HOME/systemd-minimal"
PREFIX="/usr"
echo -e "${GREEN}=== Building minimal systemd on s390x z/VM ===${NC}"
echo "This will build systemd natively on RHEL 9.6 s390x"
# Create directories
mkdir -p "$BUILD_DIR" "$OUTPUT_DIR"
# Install build dependencies if not already present
echo -e "${YELLOW}Installing build dependencies...${NC}"
sudo dnf install -y \
gcc \
gcc-c++ \
meson \
ninja-build \
pkgconfig \
gperf \
glib2-devel \
libcap-devel \
libmount-devel \
libblkid-devel \
libuuid-devel \
libseccomp-devel \
libacl-devel \
libattr-devel \
kmod-devel \
elfutils-devel \
dbus-devel \
python3-jinja2 \
wget \
tar \
gzip
# Download systemd
cd "$BUILD_DIR"
if [ ! -d "systemd-$SYSTEMD_VERSION" ]; then
echo -e "${YELLOW}Downloading systemd $SYSTEMD_VERSION...${NC}"
wget -q "https://github.com/systemd/systemd/archive/v$SYSTEMD_VERSION.tar.gz"
tar xzf "v$SYSTEMD_VERSION.tar.gz"
fi
cd "systemd-$SYSTEMD_VERSION"
# Configure minimal build for s390x
echo -e "${YELLOW}Configuring minimal systemd build...${NC}"
meson setup build-minimal \
--prefix="$PREFIX" \
--sysconfdir=/etc \
--localstatedir=/var \
-Drootprefix=/usr \
-Drootlibdir=/lib \
-Dmode=release \
-Dlink-udev-shared=true \
-Dsplit-bin=false \
-Dsplit-usr=false \
-Dresolve=false \
-Dnetworkd=false \
-Dlogind=false \
-Dmachined=false \
-Dhomed=false \
-Dportabled=false \
-Duserdb=false \
-Dbootloader=false \
-Defi=false \
-Dlibcryptsetup=false \
-Dlibiptc=false \
-Dlibidn2=false \
-Dlibcurl=false \
-Dlibidn=false \
-Dlz4=false \
-Dxz=false \
-Dzlib=false \
-Dbzip2=false \
-Dzstd=false \
-Dgcrypt=false \
-Dopenssl=false \
-Dp11kit=false \
-Dbinfmt=false \
-Dcoredump=false \
-Dpolkit=false \
-Dman=false \
-Dhtml=false \
-Dtests=false \
-Dinstall-tests=false \
-Dnss-myhostname=false \
-Dnss-mymachines=false \
-Dnss-resolve=false \
-Dnss-systemd=false \
-Dpam=false \
-Dselinux=false \
-Dapparmor=false \
-Daudit=false \
-Dima=false \
-Dsmack=false \
-Dseccomp=true \
-Dxkbcommon=false \
-Dpcre2=false \
-Dglib=false \
-Ddbus=true \
-Dgnutls=false \
-Dmicrohttpd=false \
-Dlibfido2=false \
-Dtpm=false \
-Dtpm2=false \
-Dqrencode=false \
-Db_lto=false \
-Db_pie=true
# Build
echo -e "${YELLOW}Building systemd...${NC}"
ninja -C build-minimal
# Install to output directory
echo -e "${YELLOW}Installing to $OUTPUT_DIR...${NC}"
DESTDIR="$OUTPUT_DIR" ninja -C build-minimal install
# Strip binaries
echo -e "${YELLOW}Stripping binaries...${NC}"
find "$OUTPUT_DIR" -type f -executable -exec file {} \; | \
grep 'ELF.*executable' | cut -d: -f1 | \
xargs -r strip --strip-unneeded
# Remove non-essential files
echo -e "${YELLOW}Removing non-essential files...${NC}"
rm -rf "$OUTPUT_DIR/usr/share/doc"
rm -rf "$OUTPUT_DIR/usr/share/man"
rm -rf "$OUTPUT_DIR/usr/share/locale"
rm -rf "$OUTPUT_DIR/usr/share/factory"
rm -rf "$OUTPUT_DIR/usr/share/bash-completion"
rm -rf "$OUTPUT_DIR/usr/share/zsh"
# Keep only essential binaries
cd "$OUTPUT_DIR/usr/bin"
for binary in *; do
case "$binary" in
systemctl|journalctl|systemd-*) ;;
*) rm -f "$binary" ;;
esac
done
# Copy essential system libraries for runtime
echo -e "${YELLOW}Copying runtime libraries...${NC}"
mkdir -p "$OUTPUT_DIR/lib" "$OUTPUT_DIR/lib64"
# Copy dynamic linker and essential libraries
cp -L /lib64/ld-linux-s390x.so.2 "$OUTPUT_DIR/lib/" 2>/dev/null || true
cp -L /lib64/ld64.so.1 "$OUTPUT_DIR/lib/" 2>/dev/null || true
# Copy essential glibc and other system libraries
for lib in libc.so.6 libm.so.6 libpthread.so.0 libdl.so.2 librt.so.1 \
libcrypt.so.1 libcap.so.2 libblkid.so.1 libuuid.so.1 \
libmount.so.1 libseccomp.so.2 libacl.so.1 libattr.so.1 \
libkmod.so.2 libdw.so.1 libelf.so.1 libz.so.1 \
libbz2.so.1 liblzma.so.5 libdbus-1.so.3; do
find /lib64 /usr/lib64 -name "$lib*" -exec cp -L {} "$OUTPUT_DIR/lib64/" \; 2>/dev/null || true
done
# Create lib64 symlink
ln -sf lib "$OUTPUT_DIR/lib64" 2>/dev/null || true
# Create tarball for transfer
cd "$OUTPUT_DIR"
echo -e "${YELLOW}Creating tarball...${NC}"
tar czf "$HOME/systemd-minimal-s390x.tar.gz" .
# Calculate sizes
TOTAL_SIZE=$(du -sh "$OUTPUT_DIR" | cut -f1)
TARBALL_SIZE=$(du -sh "$HOME/systemd-minimal-s390x.tar.gz" | cut -f1)
echo -e "${GREEN}✓ Minimal systemd built successfully!${NC}"
echo -e "${GREEN}Total size: $TOTAL_SIZE${NC}"
echo -e "${GREEN}Tarball size: $TARBALL_SIZE${NC}"
echo -e "${GREEN}Tarball location: $HOME/systemd-minimal-s390x.tar.gz${NC}"
echo ""
echo "To transfer back to your local system:"
echo "scp -i zvm.pem linux1@148.100.77.9:~/systemd-minimal-s390x.tar.gz output/"