164 lines
5.5 KiB
Bash
164 lines
5.5 KiB
Bash
#!/bin/sh
|
|
|
|
USED_RELEASE="13.2-RELEASE"
|
|
ZFS_MOUNTPOINT_JAILS="/srv/jails"
|
|
ZFS_DATASET="zroot"
|
|
ZFS_DATASET_JAILS="${ZFS_DATASET}/jails"
|
|
ZFS_DATASET_RELEASES="${ZFS_DATASET_JAILS}/releases"
|
|
ZFS_DATASET_TEMPLATES="${ZFS_DATASET_JAILS}/templates"
|
|
ZFS_USED_RELEASE="${ZFS_DATASET_RELEASES}/${USED_RELEASE}"
|
|
|
|
# Variables para habilitar o deshabilitar la descarga y extracción de lib32 y ports
|
|
lib32="N" # Cambiar a "N" si no se desea descargar y extraer lib32
|
|
ports="N" # Cambiar a "N" si no se desea descargar y extraer ports
|
|
|
|
# Crear dataset si no existe
|
|
create_dataset_if_not_exists() {
|
|
local dataset=$1
|
|
local mountpoint=$2
|
|
|
|
if ! zfs list "${dataset}" >/dev/null 2>&1; then
|
|
echo "Creating ${dataset} dataset"
|
|
zfs create -o mountpoint="${mountpoint}" "${dataset}"
|
|
else
|
|
echo "Dataset ${dataset} already exists"
|
|
fi
|
|
}
|
|
|
|
# Descargar y extraer un archivo
|
|
download_and_extract_file() {
|
|
local url=$1
|
|
local destination=$2
|
|
|
|
fetch "${url}" -o /tmp/file.tar.gz
|
|
tar -xvf /tmp/file.tar.gz -C "${destination}"
|
|
}
|
|
|
|
# Copiar archivos
|
|
move_files() {
|
|
local source=$1
|
|
local destination=$2
|
|
|
|
mv "${source}" "${destination}"
|
|
}
|
|
|
|
# Crear snapshot
|
|
create_snapshot() {
|
|
local snapshot=$1
|
|
|
|
zfs snapshot "${snapshot}"
|
|
}
|
|
|
|
# Crear clon de snapshot
|
|
create_clone() {
|
|
local snapshot=$1
|
|
local clone=$2
|
|
|
|
zfs clone "${snapshot}" "${clone}"
|
|
}
|
|
|
|
# Crear enlace simbólico
|
|
create_symlink() {
|
|
local source=$1
|
|
local target=$2
|
|
|
|
ln -s "${source}" "${target}"
|
|
}
|
|
|
|
# Actualizar sistema base
|
|
update_base_system() {
|
|
local release=$1
|
|
|
|
env UNAME_r="${release}" freebsd-update -b "${ZFS_MOUNTPOINT_JAILS}/releases/${release}" fetch install
|
|
}
|
|
|
|
# Configurar resolv.conf y localtime
|
|
configure_files() {
|
|
local release=$1
|
|
|
|
cp /etc/resolv.conf "${ZFS_MOUNTPOINT_JAILS}/releases/${release}/etc/resolv.conf"
|
|
cp /etc/localtime "${ZFS_MOUNTPOINT_JAILS}/releases/${release}/etc/localtime"
|
|
}
|
|
|
|
# Ejecutar acciones de postinstalación
|
|
post_installation() {
|
|
# Detener servicios de jail
|
|
service jail stop db
|
|
|
|
# Modificar base por la nueva release en /usr/local/jails/jail.fstab.d/
|
|
|
|
# Iniciar servicios de jail
|
|
service jail start db
|
|
|
|
# Actualizar paquetes en el jail
|
|
pkg -j db update
|
|
pkg -j db upgrade
|
|
}
|
|
|
|
# Crear datasets
|
|
create_dataset_if_not_exists "${ZFS_DATASET_JAILS}"
|
|
create_dataset_if_not_exists "${ZFS_DATASET_RELEASES}" "${ZFS_MOUNTPOINT_JAILS}/releases"
|
|
create_dataset_if_not_exists "${ZFS_DATASET_TEMPLATES}" "${ZFS_MOUNTPOINT_JAILS}/templates"
|
|
|
|
# Descargar y extraer archivos base, lib32 y ports
|
|
if [ ! -d "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}" ]; then
|
|
create_dataset_if_not_exists "${ZFS_USED_RELEASE}" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}"
|
|
download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/base.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}"
|
|
fi
|
|
# Descargar y extraer lib32 si la variable lib32 es "Y"
|
|
if [ "${lib32}" = "Y" ]; then
|
|
download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/lib32.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}"
|
|
fi
|
|
|
|
# Descargar y extraer ports si la variable ports es "Y"
|
|
if [ "${ports}" = "Y" ]; then
|
|
download_and_extract_file "ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/${USED_RELEASE}/ports.txz" "${ZFS_MOUNTPOINT_JAILS}/releases/${USED_RELEASE}"
|
|
fi
|
|
|
|
|
|
# Actualizar sistema base
|
|
update_base_system "${USED_RELEASE}"
|
|
|
|
# Configurar archivos
|
|
configure_files "${USED_RELEASE}"
|
|
|
|
# Crear snapshot
|
|
create_snapshot "${ZFS_DATASET_RELEASES}/${USED_RELEASE}@p0"
|
|
|
|
# Crear clon del snapshot como template base
|
|
create_clone "${ZFS_DATASET_RELEASES}/${USED_RELEASE}@p0" "${ZFS_DATASET_TEMPLATES}/base-${USED_RELEASE}"
|
|
|
|
# Crear dataset skeleton si no existe
|
|
if ! zfs list "${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE}" >/dev/null 2>&1; then
|
|
echo "Creating ${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE} dataset"
|
|
zfs create "${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE}"
|
|
else
|
|
echo "Dataset ${ZFS_DATASET_TEMPLATES}/skeleton-${USED_RELEASE} already exists"
|
|
fi
|
|
|
|
# Crear directorio skeleton y enlaces simbólicos
|
|
if [ "${ports}" = "Y" ]; then
|
|
mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/usr/ports/distfiles"
|
|
fi
|
|
mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/home"
|
|
mkdir -p "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/portsbuild"
|
|
|
|
move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/etc" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/etc"
|
|
move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/tmp" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/tmp"
|
|
chflags noschg ${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/var/empty
|
|
move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/var" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/var"
|
|
move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/root" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/root"
|
|
move_files "${ZFS_MOUNTPOINT_JAILS}/templates/base-${USED_RELEASE}/usr/local" "${ZFS_MOUNTPOINT_JAILS}/templates/skeleton-${USED_RELEASE}/usr/local"
|
|
|
|
# Crear enlaces simbólicos
|
|
cd ${ZFS_MOUNTPOINT_JAILS}/templates/base-$USED_RELEASE
|
|
mkdir skeleton
|
|
create_symlink "skeleton/etc" "etc"
|
|
create_symlink "skeleton/home" "home"
|
|
create_symlink "skeleton/root" "root"
|
|
create_symlink "../skeleton/usr/local" "usr/local"
|
|
if [ "${ports}" = "Y" ]; then
|
|
create_symlink "skeleton/usr/ports/distfiles" "usr/ports/distfiles"
|
|
fi
|
|
create_symlink "skeleton/tmp" "tmp"
|
|
create_symlink "skeleton/var" "var" |