Compare commits

..

6 Commits

3 changed files with 137 additions and 36 deletions

View File

@@ -1,15 +1,15 @@
#!/bin/bash
set -euo pipefail
clear-apt-snaps () {
zfs list -t snapshot | grep 'apt-' | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
}
REGEX='apt-'
if [ -z "$1" ]; then
exit 1
fi
if ! [ -z "$1" ] && [ "$1" == "upgrades" ]; then
if [ -n "$1" ] && [ "$1" == "upgrades" ]; then
shift
while getopts "r:" opt; do
case "$opt" in
r) REGEX=${OPTARG};;
@@ -17,9 +17,5 @@ if ! [ -z "$1" ] && [ "$1" == "upgrades" ]; then
esac
done
if [ -z "$REGEX" ]; then
clear-apt-snaps
else
zfs list -t snapshot | grep "${REGEX}" | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
fi
zfs list -t snapshot | grep "${REGEX}" | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
fi

12
zfs/zfs-media-drive.help Normal file
View File

@@ -0,0 +1,12 @@
This script allows the creation of ZFS pool specifically for the purpose of media.
This pool is divided into datasets that allow useful storage management of that media.
Subcommands for this script are: init, enc, and link. The first creates the filesystem
structure for the ZFS-formatted drive. The second allows specifying encrypted datasets.
The last creates cross-dataset symbolic links at their corresponding paths.
-k Option to provide a custom path to the key for the encrypted filesystem. Equivalent to 'keylocation' option in ZFS pool creation.
-f Opton to provide a custom format for the aforementioned key. Equivalnt to 'keyformat' option in ZFS pool creation.
-c Option to specify custom ZFS compression algorithm for ZFS pool. Equivalent to 'compression' option in ZFS pool creation.
-v Option to specify custom ZFS version for compatibility purposes. Equivalent to 'compatibility' option in ZFS pool creation.
-p Option to provide a custom name for the created ZFS pool.
-d Specify the storage device, volume or partition to be given a pool.

View File

@@ -1,8 +1,9 @@
#!/bin/bash
set -euo pipefail
SCRIPT_ROOT=$(dirname "$0")
# @TODO: Implement more soft-coding and interactivity to this script
ZFS_POOL_NAME="media"
ZFS_POOL_NAME="medialib"
ZFS_COMPAT="openzfs-2.1-linux"
ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key"
ZFS_KEY_FORMAT="passphrase"
@@ -28,47 +29,80 @@ create_zpool () {
/dev/disk/by-id/"${1}"
}
mkdataset () {
mkdir -p "$1"
sudo zfs create -v -o mountpoint="$1" "$2"
}
create_datasets () {
DATASET=("${HOME}/Documents/.calibre" "${1}/LITERATURE")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
read -r -p "Provide custom datasets? (y/n): " CUSTOMIZE_DATASETS
DATASET=("${HOME}/Videos" "${1}/FILM")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
if [[ "$CUSTOMIZE_DATASETS" =~ [Nn]* ]]; then
DATASET=("${HOME}/Documents/.calibre" "${1}/LITERATURE")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${1}/STEAMGAMES")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/Videos" "${1}/FILM")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${1}/STEAMGAMES")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/Games" "${1}/GAMES")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
ln -s "${HOME}/.var/app/com.valvesoftware.Steam" "${DATASET[0]}/Steam"
ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdir -p "${DATASET[0]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/Games" "${1}/GAMES")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
ln -s "${HOME}/.var/app/com.valvesoftware.Steam" "${DATASET[0]}/Steam"
ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro"
DATASET=("${HOME}/.XXX" "${1}/XXX")
mkdir -p "${DATASET[0]}"
sudo zfs create -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdataset "${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.XXX" "${1}/XXX")
mkdir -p "${DATASET[0]}"
sudo zfs create -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
elif [[ "$CUSTOMIZE_DATASETS" =~ [Yy]* ]]; then
while true; do
read -r -a DATASET -p "Define a mount path and its corresponding dataset name or route, in that order: "
if [ ${#DATASET[@]} -eq 2 ]; then
mkdataset "${DATASET[0]}" "${1}"/"${DATASET[1]}"
read -r -p "Create another ZFS dataset? (y/n): " ANOTHER_DATASET
if [[ "$ANOTHER_DATASET" =~ [Yy]* ]]; then
continue
elif [[ "$ANOTHER_DATASET" =~ [Nn]* ]]; then
break
fi
else
printf "Error: must provide 2 arguments (i.e., mount path and dataset name or route)."
read -r -p "Try again? (y/n): " RETRY_PROMPT
if [[ "$RETRY_PROMPT" =~ [Yy]* ]]; then
continue
elif [[ "$RETRY_PROMPT" =~ [Nn]* ]]; then
break
fi
fi
done
else
exit 1
fi
}
print_menu () {
echo "Placeholder content"
printf "%s" "$(<"${SCRIPT_ROOT}"/zfs-media-drive.help)"
}
if [ -z "$1" ]; then
printf "Subcommand must be provided"
exit 1
fi
if ! [ -z "$1" ] && [ "$1" == "init" ]; then
if [ -n "$1" ] && [ "$1" == "init" ]; then
shift
while getopts "d:p:k:f:c:v:" opt; do
case $opt in
k) ZFS_KEY_LOC="${OPTARG}";;
@@ -82,12 +116,71 @@ if ! [ -z "$1" ] && [ "$1" == "init" ]; then
done
if [ -z "$ZFS_TARGET_DRIVE" ]; then
echo "It is necessary to argue a -d option."
printf "Error: It is necessary to argue a -d option."
exit 1
fi
export ZFS_POOL_NAME
create_zpool "$ZFS_TARGET_DRIVE" "$ZFS_POOL_NAME" "$ZFS_COMPAT" "$ZFS_KEY_LOC" "$ZFS_KEY_FORMAT" "$ZFS_COMPRESSION"
printf "Following pool has been created: \n"
zpool list -v | grep "$ZFS_POOL_NAME"
create_datasets "$ZFS_POOL_NAME"
printf "Following datasets have been created: \n"
zfs list | grep "$ZFS_POOL_NAME"
elif [ -n "$1" ] && [ "$1" == "enc" ]; then
while true; do
read -r -a DATASET -p "Define a mount path and its corresponding dataset name or route, in that order: "
if [ ${#DATASET[@]} -eq 2 ]; then
mkdir -p "${DATASET[0]}"
sudo zfs create -v -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${ZFS_POOL_NAME}"/"${DATASET[1]}"
read -r -p "Create another ZFS dataset? (y/n): " ANOTHER_DATASET
if [[ "$ANOTHER_DATASET" =~ [Yy]* ]]; then
continue
elif [[ "$ANOTHER_DATASET" =~ [Nn]* ]]; then
break
fi
else
printf "Error: must provide 2 arguments (i.e., mount path and dataset name or route)."
read -r -p "Try again? (y/n): " RETRY_PROMPT
if [[ "$RETRY_PROMPT" =~ [Yy]* ]]; then
continue
elif [[ "$RETRY_PROMPT" =~ [Nn]* ]]; then
break
fi
fi
done
elif [ -n "$1" ] && [ "$1" == "link" ]; then
while true; do
read -r -a LINKAGE -p "Define a symbolic link source path and destination dataset: "
if [ ${#LINKAGE[@]} -eq 2 ]; then
if ! [ -d "${LINKAGE[0]}" ]; then
mkdir -p "${LINKAGE[0]}"
fi
ln -s "${LINKAGE[0]}" "${ZFS_POOL_NAME}"/"${LINKAGE[1]}"
read -r -p "Create another symbolic link? (y/n): " ANOTHER_LINKAGE
if [[ "$ANOTHER_LINKAGE" =~ [Yy]* ]]; then
continue
elif [[ "$ANOTHER_LINKAGE" =~ [Nn]* ]]; then
break
fi
else
printf "Error: must provide 2 arguments (i.e., source path and destination path)."
read -r -p "Try again? (y/n): " RETRY_PROMPT
if [[ "$RETRY_PROMPT" =~ [Yy]* ]]; then
continue
elif [[ "$RETRY_PROMPT" =~ [Nn]* ]]; then
break
fi
fi
done
else
while getopts "h" flag; do
case "$flag" in