Compare commits

...

6 Commits

3 changed files with 137 additions and 36 deletions

View File

@@ -1,15 +1,15 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
clear-apt-snaps () { REGEX='apt-'
zfs list -t snapshot | grep 'apt-' | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
}
if [ -z "$1" ]; then if [ -z "$1" ]; then
exit 1 exit 1
fi fi
if ! [ -z "$1" ] && [ "$1" == "upgrades" ]; then if [ -n "$1" ] && [ "$1" == "upgrades" ]; then
shift
while getopts "r:" opt; do while getopts "r:" opt; do
case "$opt" in case "$opt" in
r) REGEX=${OPTARG};; r) REGEX=${OPTARG};;
@@ -17,9 +17,5 @@ if ! [ -z "$1" ] && [ "$1" == "upgrades" ]; then
esac esac
done done
if [ -z "$REGEX" ]; then zfs list -t snapshot | grep "${REGEX}" | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
clear-apt-snaps
else
zfs list -t snapshot | grep "${REGEX}" | sed 's| .*$||g' | head -n -5 | xargs -d '\n' -I {} sudo zfs destroy {}
fi
fi 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 #!/bin/bash
set -euo pipefail set -euo pipefail
SCRIPT_ROOT=$(dirname "$0")
# @TODO: Implement more soft-coding and interactivity to this script # @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_COMPAT="openzfs-2.1-linux"
ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key" ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key"
ZFS_KEY_FORMAT="passphrase" ZFS_KEY_FORMAT="passphrase"
@@ -28,47 +29,80 @@ create_zpool () {
/dev/disk/by-id/"${1}" /dev/disk/by-id/"${1}"
} }
mkdataset () {
mkdir -p "$1"
sudo zfs create -v -o mountpoint="$1" "$2"
}
create_datasets () { create_datasets () {
DATASET=("${HOME}/Documents/.calibre" "${1}/LITERATURE") read -r -p "Provide custom datasets? (y/n): " CUSTOMIZE_DATASETS
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}/Videos" "${1}/FILM") DATASET=("${HOME}/Videos" "${1}/FILM")
mkdir -p "${DATASET[0]}" mkdataset "${DATASET[0]}" "${DATASET[1]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${1}/STEAMGAMES") DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${1}/STEAMGAMES")
mkdir -p "${DATASET[0]}" mkdataset "${DATASET[0]}" "${DATASET[1]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES") DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdir -p "${DATASET[0]}" mkdataset "${DATASET[0]}" "${DATASET[1]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/Games" "${1}/GAMES") DATASET=("${HOME}/Games" "${1}/GAMES")
mkdir -p "${DATASET[0]}" mkdataset "${DATASET[0]}" "${DATASET[1]}"
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/com.valvesoftware.Steam" "${DATASET[0]}/Steam" ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro"
ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro"
DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES") DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${1}/RARCHGAMES")
mkdir -p "${DATASET[0]}" mkdataset "${DATASET[0]}" "${DATASET[1]}"
sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}"
DATASET=("${HOME}/.XXX" "${1}/XXX") DATASET=("${HOME}/.XXX" "${1}/XXX")
mkdir -p "${DATASET[0]}" mkdir -p "${DATASET[0]}"
sudo zfs create -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${DATASET[1]}" 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 () { print_menu () {
echo "Placeholder content" printf "%s" "$(<"${SCRIPT_ROOT}"/zfs-media-drive.help)"
} }
if [ -z "$1" ]; then if [ -z "$1" ]; then
printf "Subcommand must be provided"
exit 1 exit 1
fi fi
if ! [ -z "$1" ] && [ "$1" == "init" ]; then if [ -n "$1" ] && [ "$1" == "init" ]; then
shift
while getopts "d:p:k:f:c:v:" opt; do while getopts "d:p:k:f:c:v:" opt; do
case $opt in case $opt in
k) ZFS_KEY_LOC="${OPTARG}";; k) ZFS_KEY_LOC="${OPTARG}";;
@@ -82,12 +116,71 @@ if ! [ -z "$1" ] && [ "$1" == "init" ]; then
done done
if [ -z "$ZFS_TARGET_DRIVE" ]; then 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 exit 1
fi fi
export ZFS_POOL_NAME
create_zpool "$ZFS_TARGET_DRIVE" "$ZFS_POOL_NAME" "$ZFS_COMPAT" "$ZFS_KEY_LOC" "$ZFS_KEY_FORMAT" "$ZFS_COMPRESSION" 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" 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 else
while getopts "h" flag; do while getopts "h" flag; do
case "$flag" in case "$flag" in