archiso-zfs/init

187 lines
4.7 KiB
Plaintext
Raw Normal View History

2020-05-01 16:19:33 +02:00
#!/bin/bash
# This script load zfs kernel module for any archiso.
# github.com/eoli3n
2020-05-05 22:25:47 +02:00
# Thanks to CalimeroTeknik on #archlinux-fr, FFY00 on #archlinux-projects, JohnDoe2 on #regex
2020-05-01 16:19:33 +02:00
2020-05-06 12:51:53 +02:00
set -e
### Functions
2020-05-01 16:19:33 +02:00
print () {
2020-05-06 12:55:53 +02:00
echo -e "\n\033[1m> $1\033[0m"
2020-05-01 16:19:33 +02:00
}
2020-05-06 10:49:19 +02:00
get_running_kernel_version () {
# Returns running kernel version
# Get running kernel version
2020-05-06 11:21:39 +02:00
kernel_version=$(LANG=C pacman -Qi linux | sed -n 's/^Version\s*: //p')
2020-05-06 10:49:19 +02:00
print "Current kernel version is $kernel_version"
}
get_iso_build_date () {
# Returns running kernel build date formated as 'YYYY/MM/DD'
# Get running kernel build date
2020-05-06 11:21:39 +02:00
kernel_date=$(date +%Y/%m/%d -d "$(LANG=C pacman -Qi linux |sed -n 's/^Install Date\s*: //p')")
2020-05-06 10:49:19 +02:00
}
init_archzfs () {
print "Adding archzfs repo"
cat >> /etc/pacman.conf <<"EOF"
[archzfs]
Server = http://archzfs.com/archzfs/x86_64
Server = http://mirror.sum7.eu/archlinux/archzfs/archzfs/x86_64
Server = https://mirror.biocrafting.net/archlinux/archzfs/archzfs/x86_64
EOF
2020-05-06 12:51:53 +02:00
pacman-key --recv-keys F75D9D76 &>/dev/null
pacman-key --lsign-key F75D9D76 &>/dev/null
2020-05-06 12:44:14 +02:00
pacman -Sy > /dev/null
2020-05-06 10:49:19 +02:00
}
init_archlinux_archive () {
# $1 is date formated as 'YYYY/MM/DD'
# Returns False if repo does not exists
# Set repo
repo="Server=https://archive.archlinux.org/repos/$1/\$repo/os/\$arch"
2020-05-06 12:38:52 +02:00
pacman -Syy --quiet
2020-05-06 10:49:19 +02:00
# If repo exists, set it, if not, return False
2020-05-06 10:53:38 +02:00
curl -s "$repo" && echo "$repo" > /etc/pacman.d/mirrorlist || return 1
2020-05-06 10:49:19 +02:00
2020-05-06 10:53:38 +02:00
return 0
2020-05-06 10:49:19 +02:00
}
search_package () {
# $1 is package name to search
# $2 is version to match
# Set regex to match package
2020-05-06 12:34:39 +02:00
local regex='href="\K(?![^"]*\.sig)'"$1"'-(?=\d)[^"]*'"$2"'[^"]*x86_64[^"]*'
# href=" # match href="
# \K # don't return anything matched prior to this point
2020-05-06 12:34:39 +02:00
# (?![^"]*\.sig) # remove .sig matches
# '"$1"'-(?=\d) # find me '$package-' escaped by shell and ensure that after "-" is a digit
# [^"]* # match anything between '"'
2020-05-06 10:49:19 +02:00
# '"$2"' # match version escaped by shell
2020-05-06 12:34:39 +02:00
# [^"]* # match anything between '"'
# x86_64 # now match architecture
2020-05-06 12:34:39 +02:00
# [^"]* # match anything between '"'
# Set archzfs URLs list
local urls="http://archzfs.com/archzfs/x86_64/ http://archzfs.com/archive_archzfs/"
# Loop search
for url in $urls
do
print "Searching on $url..."
# Query url and try to match package
local package=$(curl -s "$url" | grep -Po "$regex" | tail -n 1)
# If a package is found
2020-05-06 10:26:44 +02:00
if [[ -n $package ]]
then
2020-05-06 12:59:13 +02:00
print "Package \"$package\" found"
# Build package url
package_url="$url$package"
2020-05-06 11:48:34 +02:00
# Break loop
break
fi
done
}
download_package () {
# $1 is package url to download in tmp
2020-05-06 10:49:19 +02:00
# It returns downloaded file path
2020-05-06 11:24:39 +02:00
local filename="${1##*/}"
# Download package in tmp
2020-05-06 12:44:14 +02:00
wget "$1" --quiet -P /tmp
# Set out file
package_file="/tmp/$filename"
2020-05-06 11:38:22 +02:00
print "Downloading to $package_file ..."
}
2020-05-06 10:49:19 +02:00
### Main
2020-05-01 18:34:14 +02:00
print "Testing if archiso is running"
2020-05-01 16:19:33 +02:00
2020-05-05 22:47:18 +02:00
grep archiso /proc/cmdline > /dev/null
2020-05-01 16:19:33 +02:00
2020-05-05 22:25:47 +02:00
print "Increasing cowspace to half of RAM"
mount -o remount,size=50% /run/archiso/cowspace
2020-05-06 10:53:38 +02:00
# Init archzfs repository
init_archzfs
2020-05-06 10:49:19 +02:00
# Search kernel package
2020-05-05 23:33:32 +02:00
# https://github.com/archzfs/archzfs/issues/337#issuecomment-624312576
2020-05-06 11:21:39 +02:00
get_running_kernel_version
2020-05-06 10:26:44 +02:00
kernel_version_fixed="${kernel_version//-/\.}"
2020-05-01 16:19:33 +02:00
2020-05-06 10:49:19 +02:00
# Search zfs-linux package matching running kernel version
search_package "zfs-linux" "$kernel_version_fixed"
2020-05-06 11:45:11 +02:00
zfs_linux_url="$package_url"
2020-05-05 22:25:47 +02:00
# If a package is found
2020-05-06 11:45:11 +02:00
if [[ -n $zfs_linux_url ]]
then
2020-05-05 22:25:47 +02:00
# Download package
2020-05-06 11:45:11 +02:00
download_package $zfs_linux_url
zfs_linux_package="$package_file"
2020-05-05 22:45:57 +02:00
print "Extracting $zfs_linux_package"
2020-05-05 22:25:47 +02:00
2020-05-06 10:49:19 +02:00
# Extract package
2020-05-06 11:23:06 +02:00
mkdir -p /tmp/extract
2020-05-06 11:45:33 +02:00
tar xvf "$zfs_linux_package" -C /tmp/extract > /dev/null
2020-05-05 22:25:47 +02:00
2020-05-06 12:59:13 +02:00
print "Searching zfs-utils"
2020-05-05 22:25:47 +02:00
2020-05-06 10:49:19 +02:00
# Get zfs-utils dependency version
2020-05-06 10:26:44 +02:00
zfs_utils_version=$(grep 'depend = zfs-utils' /tmp/extract/.PKGINFO | grep -o '[[:digit:]].*')
2020-05-06 10:49:19 +02:00
# Clean extracted dir
rm -Rf /tmp/extract
2020-05-01 16:19:33 +02:00
2020-05-06 10:49:19 +02:00
# Search zfs-utils package matching zfs-linux package dependency
search_package "zfs-utils" "$zfs_utils_version"
2020-05-06 11:45:11 +02:00
zfs_utils_url="$package_url"
2020-05-05 22:45:57 +02:00
2020-05-06 11:45:11 +02:00
if [[ -n $zfs_utils_url ]]
2020-05-06 10:26:44 +02:00
then
2020-05-05 22:45:57 +02:00
2020-05-06 12:55:28 +02:00
print "Installing zfs-utils and zfs-linux"
2020-05-05 22:45:57 +02:00
2020-05-06 12:44:14 +02:00
# Install packages
2020-05-06 12:54:16 +02:00
pacman -U "$zfs_utils_url" --noconfirm &> /dev/null
2020-05-06 12:41:08 +02:00
pacman -U "$zfs_linux_package" --noconfirm > /dev/null && zfs=1
2020-05-06 10:26:44 +02:00
fi
2020-05-06 11:41:46 +02:00
fi
# Load kernel module
if [[ "$zfs" == "1" ]]
then
2020-05-06 13:00:20 +02:00
modprobe zfs && echo -e "\n\e[32mZFS is ready\n"
2020-05-06 11:41:46 +02:00
2020-05-05 22:45:57 +02:00
else
2020-05-06 11:41:46 +02:00
print "No ZFS module found"
2020-05-05 22:45:57 +02:00
fi