Untitled

 avatar
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