Untitled
unknown
plain_text
13 days ago
10 kB
144
No Index
in a year
#!/bin/sh
#============================================================================#
#=================================================================#
#=======================================================#
LINK_KERNEL="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.19.6.tar.xz"
LINK_BUSYBOX="https://busybox.net/downloads/busybox-1.35.0.tar.bz2"
LINK_ZFS="https://github.com/openzfs/zfs/releases/download/zfs-2.4.1/zfs-2.4.1.tar.gz"
DYNAMIC_LIB_PATH="/usr/lib/x86_64-linux-gnu"
DYNAMIC_LIBS_SUFFICIENT_FOR_ZFS="libcrypto.so* libc.so* libm.so* libkrb5.so.3* libblkid.so* libgssapi_krb5.so.2* ld-linux-x86-64.so* libcrypt.so.1* libtirpc.so.3* libk5crypto.so.3* libudev.so* libz.so.1* libresolv.so* libkrb5support.so.0* libuuid.so* libkeyutils.so.1* libdl.so* libcom_err.so.2* libpthread.so*"
PREFIX="# "
CONFIG_KERNEL="CONFIG_LOCALVERSION=\"-yadro\" CONFIG_LOCALVERSION_AUTO=y CONFIG_DEFAULT_HOSTNAME=\"station\" CONFIG_SYSFB_SIMPLEFB=y CONFIG_DRM_SIMPLEDRM=n CONFIG_DRM_I915=y CONFIG_DRM_I915_FORCE_PROBE=\"!0116\" CONFIG_FB=y CONFIG_FB_EFI=y CONFIG_FB_SIMPLE=y CONFIG_FB_VESA=y CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y CONFIG_FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER=n"
CONFIG_BUSYBOX="CONFIG_STATIC=y CONFIG_FDISK=y CONFIG_FDISK_SUPPORT_LARGE_DISKS=y CONFIG_FEATURE_SUN_LABEL=y CONFIG_FEATURE_GPT_LABEL=y CONFIG_PREFIX=\"./build\""
TARGET_DIR_KERNEL="cross-compiled-mods"
TARGET_DIR_ZFS="cross-compiled-zfs"
#=======================================================#
#=================================================================#
#============================================================================#
custom_config () {
STATUS=$IFS
if [ "$1" = "KERNEL" ]
then
CONFIG="$CONFIG_KERNEL"
else
CONFIG="$CONFIG_BUSYBOX"
fi
WRK="$(pwd)"
POOL=$(cat "$WRK/.config")
OUTPUT=""
NEXT=0
IFS='
'
for LINE in $POOL ; do
IFS=' '
for SEARCH_KEY in $CONFIG ; do
if [ "$(printf %s "$LINE" | grep -F -- "${SEARCH_KEY%${SEARCH_KEY#*=}*}" 2>/dev/null)" != "" ] || [ "$(printf %s "$LINE" | grep -F -- "$PREFIX${SEARCH_KEY%??} is not" 2>/dev/null)" != "" ]
then
TMP="$OUTPUT$SEARCH_KEY\n"
OUTPUT="$TMP"
REBUILD=""
for EXCLUDE in $CONFIG ; do
if [ "$EXCLUDE" != "$SEARCH_KEY" ]
then
TMP="$REBUILD$EXCLUDE "
REBUILD="$TMP"
fi
done
CONFIG="$REBUILD"
NEXT=1
break
fi
done
if [ $NEXT -eq 1 ]
then
if [ "$CONFIG" = "" ]
then
break
else
echo "arguments left to insert: $CONFIG"
fi
NEXT=0
IFS='
'
continue
fi
TMP="$OUTPUT$LINE\n"
OUTPUT="$TMP"
IFS='
'
done
echo "$OUTPUT" > "$WRK/.config"
if [ "$CONFIG" != "" ]
then
echo "The following options weren't found in the file and will be appended: $CONFIG"
APPEND=""
IFS=' '
for ITEM in $CONFIG ; do
TMP="$APPEND$ITEM\n"
APPEND="$TMP"
done
echo "$APPEND" >> "$WRK/.config"
fi
IFS="$STATUS"
}
mkdir yadro ; cd yadro
DIR="$(pwd)"
CURRENT="$(pwd)"
mkdir lib64 ; cd lib64
CURRENT="$(pwd)"
for I in $DYNAMIC_LIBS_SUFFICIENT_FOR_ZFS; do
RANGE=$(ls "$DYNAMIC_LIB_PATH"/$I 2>/dev/null)
for K in $RANGE; do
while [ -L "$K" ]; do
LINK_EXTERN=$(basename "$K")
LINK=$(basename $(readlink "$K"))
TMP=$(readlink "$K")
if [ "$(echo "$TMP" | grep -o "/")" != "" ]
then
K="$TMP"
else
K="$DYNAMIC_LIB_PATH"/"$LINK"
fi
ln -sf "$LINK" "$LINK_EXTERN"
done
cp -L "$K" "$CURRENT"
done
done
cd "$DIR"
CURRENT="$(pwd)"
apt install -y build-essential libncurses-dev libelf-dev libssl-dev flex bison
KERNEL_GOOD=0
wget "$CURRENT" $LINK_KERNEL
tar -xf $(ls | grep tar | grep linux)
KERNEL_HEADERS="$CURRENT/$(ls | grep -v tar | grep linux)"
cd "$KERNEL_HEADERS" && mkdir "$TARGET_DIR_KERNEL"
CURRENT="$(pwd)"
make x86_64_defconfig
custom_config "KERNEL"
make olddefconfig
make -j 3 && make modules && make INSTALL_MOD_PATH="$CURRENT/$TARGET_DIR_KERNEL" modules_install
KERNEL_MODULES_PATH="$CURRENT/$TARGET_DIR_KERNEL"
if [ -e "$CURRENT/arch/x86_64/boot/bzImage" ]
then
KERNEL_GOOD=1
fi
#===================
if [ $KERNEL_GOOD -ne 1 ] ; then echo "Error making kernel" ; exit 1 ; fi
cd "$DIR"
CURRENT="$(pwd)"
ZFS_GOOD=0
wget "$CURRENT" "$LINK_ZFS"
tar xf $(ls | grep tar | grep zfs)
cd $(ls | grep -v tar | grep zfs) && mkdir "$TARGET_DIR_ZFS"
CURRENT="$(pwd)"
TARGET_PATH_ZFS="$CURRENT/$TARGET_DIR_ZFS"
"$CURRENT/configure" --with-linux="$KERNEL_HEADERS" && make && make install DESTDIR="$TARGET_PATH_ZFS" INSTALL_MOD_PATH="$TARGET_PATH_ZFS"
if [ -e "$CURRENT/$TARGET_DIR_ZFS/usr/local/sbin/zfs" ]
then
ZFS_GOOD=1
fi
#===================
if [ $ZFS_GOOD -ne 1 ] ; then echo "Error making zfs" ; exit 2 ; fi
cd "$DIR"
CURRENT="$(pwd)"
BUSYBOX_GOOD=0
wget "$CURRENT" "$LINK_BUSYBOX"
tar -xjf $(ls | grep tar | grep busybox)
cd $(ls | grep -v tar | grep busybox)
CURRENT="$(pwd)"
#make menuconfig
#make allyesconfig
#make BUSYBOX_CONFIG_FILE=".config"
#make silentoldconfig
make defconfig
custom_config "BUSYBOX"
yes "" | make oldconfig
make && make install
cd "$CURRENT/build/bin"
CURRENT="$(pwd)"
chmod +x "$CURRENT/busybox"
BIN=$(ls "$CURRENT")
for E in $BIN; do
ln -sf "./busybox" "$E"
chmod +x "$CURRENT/$E"
done
cd ../sbin
CURRENT="$(pwd)"
SBIN=$(ls "$CURRENT")
for D in $SBIN; do
ln -sf "../bin/busybox" "$D"
chmod +x "$CURRENT/$D"
done
cd ..
CURRENT="$(pwd)"
TARGET_DIR_BUSYBOX="$CURRENT"
if [ -e "$CURRENT/bin/busybox" ]
then
BUSYBOX_GOOD=1
fi
#===================
if [ $BUSYBOX_GOOD -ne 1 ] ; then echo "Error making busybox" ; exit 3 ; fi
cd "$DIR"
CURRENT="$(pwd)"
mkdir -p "$CURRENT/out/initramfs/target/etc/init.d"
cd "$CURRENT/out/initramfs"
CURRENT="$(pwd)"
mkdir proc ; mkdir sys ; mkdir dev
mkdir mnt ; mkdir lib64
mkdir -p "$CURRENT/usr/local/sbin" && mkdir -p "$CURRENT/usr/local/bin" && mkdir -p "$CURRENT/usr/local/lib"
#optional for userspace:
mkdir home ; mkdir var ; mkdir opt
#
cp -a -r "$DIR/lib64" "$CURRENT"
cp -a -r "$TARGET_DIR_BUSYBOX"/* "$CURRENT"
cp -a -r "$KERNEL_MODULES_PATH"/* "$CURRENT"
cp -a -r "$TARGET_PATH_ZFS/lib" "$CURRENT"
cp -a -r "$TARGET_PATH_ZFS/usr/local/bin" "$CURRENT/usr/local"
cp -a -r "$TARGET_PATH_ZFS/usr/local/sbin" "$CURRENT/usr/local"
cp -a -r "$TARGET_PATH_ZFS/sbin/"* "$CURRENT/usr/local/sbin"
cp -a -r "$TARGET_PATH_ZFS/usr/local/lib"/*.so* "$CURRENT/usr/local/lib"
cp -a -r "$TARGET_PATH_ZFS/etc" "$CURRENT"
cat << 'EOF' > "$CURRENT/init"
#!/bin/sh
###
#
# NOTE: this init expects rpool/root to be available on a device
#
# NOTE: make sure /usr is mounted before going switch_root and after sys, proc, dev
#
###
#ROOTFS_PART_UUID="57B04513-220F-4E33-B915-D83FDEE0643D"
NO_RPOOL_FOUND=1
MOUNTPOINTS="/etc /usr"
RAM_ROOT_MOUNTPOINT="/mnt"
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
sleep 2
#udevadm settle
#mkdir -p /dev/pts
#mount -t devpts none /dev/pts
export PATH=$PATH:/bin/:/sbin/:/usr/local/bin/:/usr/local/sbin/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/lib64/
modprobe zfs
echo "Begin zpool import..."
zpool import rpool
STATUS=$?
if [ $STATUS -eq $NO_RPOOL_FOUND ]
then
echo "No zfs pool found, falling back to busybox shell now..."
exec /bin/sh
fi
echo "Finished zpool import, mounting root fs..."
#zfs mount -l rpool/root
STATUS=$(zpool get -H -o value feature@encryption rpool)
if [ "$STATUS" = "active" ]
then
zfs load-key rpool
fi
ROOT_MOUNTPOINT=$(zfs get -H -o value mountpoint rpool/root)
if [ $ROOT_MOUNTPOINT != "/" ]
then
echo "changing the root dataset's mountpoint from $ROOT_MOUNTPOINT to /"
zfs set -u mountpoint=/ rpool/root
fi
mount -t zfs rpool/root $RAM_ROOT_MOUNTPOINT
STATUS=$?
if [ $STATUS -ne 0 ]
then
echo "Couldn't mount rpool with exit code $STATUS, falling back to busybox shell for maintenance"
exec /bin/sh
fi
for C in $MOUNTPOINTS; do
zfs get guid rpool$C > /dev/null 2>&1
STATUS=$?
if [ $STATUS -ne 0 ]
then
echo "Couldn't access the rpool$C dataset, falling back to busybox shell for maintenance...tip: the amount of the datasets required could be reduced in the MOUNTPOINTS variable."
exec /bin/sh
fi
done
for I in $MOUNTPOINTS; do
if [ $(zfs get -H -o value mountpoint rpool$I) != $I ]
then echo "The $I mountpoint property wasn't set yet, setting to $I ..."
zfs set -u mountpoint=$I rpool$I
fi
mount -t zfs rpool$I $RAM_ROOT_MOUNTPOINT$I
STATUS=$?
if [ $STATUS -ne 0 ]
then
echo "Mounting $I returned with exit code $STATUS, falling back to busybox shell for maintenance..."
exec /bin/sh
fi
done
if [ ! -e $RAM_ROOT_MOUNTPOINT/sbin/init ]
then
echo "Root filesystem was found, but it looks empty. Make sure it's r/w and populate it: zfs set readonly=off rpool/root && zfs set readonly=off rpool/usr"
printf %s'\n'%s'\n'%s'\n' "1) mount the boot containing initramfs image: mkdir /boot && mount /dev/sdX /boot" "2) copy the image, decompress it and unpack inside the root: cp -a /boot/initramfs.img /mnt/initramfs.gz && cd /mnt && gzip -d /mnt/initramfs.gz && cpio -id < initramfs && rm initramfs" "3) reboot and see if it works"
exec /bin/sh
fi
mount -t devtmpfs none /mnt/dev
mount -t proc none /mnt/proc
mount -t sysfs none /mnt/sys
sleep 2
echo "Mounting finished, going for switch_root..."
exec switch_root $RAM_ROOT_MOUNTPOINT /sbin/init
EOF
chmod +x "$CURRENT/init"
cat << 'EOF' > "$CURRENT/target/etc/profile"
#!/bin/sh
export PATH=$PATH:/bin:/sbin:/usr/local/bin:/usr/local/sbin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/lib64
zfs mount -l -a
mount
echo "/etc/profile hello!"
EOF
chmod +x "$CURRENT/target/etc/profile"
cat << 'EOF' > "$CURRENT/target/etc/init.d/rcS"
#!/bin/sh
echo "$(pwd)$0 hello!"
EOF
chmod +x "$CURRENT/target/etc/init.d/rcS"
find . | cpio -H newc -o | gzip > ../initramfs.img
if [ $? -ne 0 ]; then echo "Error building initramfs" ; exit 4 ; fi
cd .. && rm -r ./initramfs
#===================
CURRENT="$(pwd)"
cp -a -r "$KERNEL_HEADERS/arch/x86/boot/bzImage" "$CURRENT"
printf %s' '%s'\n'%s'\n' "ls" $(pwd) $(ls)
Editor is loading...
Leave a Comment