|
|
#!/usr/bin/bash
|
|
|
#
|
|
|
# Author: Dmitry Razumov <asmeron@ublinux.com>
|
|
|
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
|
|
|
#
|
|
|
# SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
#
|
|
|
# Initial script for Linux UBLinux
|
|
|
# This script are launching before starting init from initrd script
|
|
|
# Current dir allways must be set to root (/)
|
|
|
# All system path must be relative, except initrd dirs
|
|
|
|
|
|
ENABLED=no
|
|
|
[[ ${ENABLED} == "yes" ]] || { return 0 2>/dev/null && return 0 || exit 0; }
|
|
|
|
|
|
PATH=.:/:/usr/bin:/usr/local/bin:/usr/local/sbin
|
|
|
DEBUGMODE=no
|
|
|
|
|
|
[[ -d /usr/lib/ublinux ]] && { ROOTFS= ; CMD_CHROOT= ; } || { [[ -d /sysroot ]] && ROOTFS="/sysroot" || ROOTFS="."; CMD_CHROOT="chroot ${ROOTFS}"; }
|
|
|
#SOURCE=${ROOTFS}/usr/lib/ublinux/scripts/liblinuxlive; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
SOURCE=${ROOTFS}/usr/lib/ublinux/functions; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
SOURCE=${ROOTFS}/usr/lib/ublinux/default; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null || exit 0
|
|
|
debug_mode "$0" "$@"
|
|
|
|
|
|
SYSCONF="${ROOTFS}${SYSCONF}"
|
|
|
SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
SOURCE=${SYSCONF}/mount; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
|
|
|
|
|
|
##############################################################
|
|
|
## TODO: Need to test
|
|
|
##############################################################
|
|
|
|
|
|
[[ ${MNT_BLOCK} == "yes" ]] && chmod 600 /mnt
|
|
|
|
|
|
[[ -z ${PARTITIONSMOUNTUID} ]] && PARTITIONSMOUNTUID=500
|
|
|
FSCKFLAG=0
|
|
|
[ $(cmdline_parameter fsck) ] && FSCKFLAG=2
|
|
|
|
|
|
exec_tmp_fstab(){
|
|
|
#Creating partitions in /etc/fstab
|
|
|
if [[ ${TMPFS} == "no" ]]; then
|
|
|
ln -sf /dev/null ${ROOTFS}/etc/systemd/system/tmp.mount
|
|
|
fi
|
|
|
if [[ ${VARTMPFS} == "no" && -h ${ROOTFS}/var/tmp ]]; then
|
|
|
rm -f ${ROOTFS}/var/tmp 2>/dev/null
|
|
|
mkdir -m 1777 ${ROOTFS}/var/tmp
|
|
|
elif [[ ${VARTMPFS} != "no" && ! -h ${ROOTFS}/var/tmp ]]; then
|
|
|
rm -fr ${ROOTFS}/var/tmp 2>/dev/null
|
|
|
ln -s ../tmp ${ROOTFS}/var/tmp
|
|
|
fi
|
|
|
[[ $(< ${ROOTFS}/etc/fstab) =~ "tmpfs /media tmpfs" ]] || echo "tmpfs /media tmpfs size=1M 0 0 # AutoUpdate" >> ${ROOTFS}/etc/fstab
|
|
|
}
|
|
|
|
|
|
exec_partautomount(){
|
|
|
get_name(){
|
|
|
for GEN_NUM in "" $(seq 2 64); do
|
|
|
grep -q " /media/$1${GEN_NUM} " ${ROOTFS}/etc/fstab || break
|
|
|
done
|
|
|
echo $1${GEN_NUM}
|
|
|
}
|
|
|
fs_options(){
|
|
|
## TODO
|
|
|
true
|
|
|
}
|
|
|
if [[ ${PARTITIONSAUTOMOUNT} == "yes" ]]; then
|
|
|
sed -i /PARTITIONSAUTOMOUNT/d ${ROOTFS}/etc/fstab
|
|
|
while IFS= read -ru3 SELECT_DEVICE; do
|
|
|
[[ $(< ${ROOTFS}/etc/fstab) =~ (^|$'\n')"${SELECT_DEVICE} "]] && continue
|
|
|
if [[ $(< /proc/mounts) =~ (^|$'\n')"${SELECT_DEVICE} " ]]; then
|
|
|
grep -m1 "^${SELECT_DEVICE} " /proc/mounts | grep /memory | sed s/$/" #PARTITIONSAUTOMOUNT=yes"/ >> ${ROOTFS}/etc/fstab
|
|
|
else
|
|
|
DEVTYPE=$(blkid ${SELECT_DEVICE} | awk -FTYPE=\" '{print $2}'| sed s/\".*// )
|
|
|
if [[ ${DEVTYPE} != "" && ${DEVTYPE} != "swap" && ${DEVTYPE} != "udf" && ${DEVTYPE} != "iso9660" ]]; then
|
|
|
DEVLABEL=$(blkid ${SELECT_DEVICE} | awk -FLABEL=\" '{print $2}'| sed s/\".*// | tr -d [:cntrl:][:space:])
|
|
|
[[ -z ${DEVLABEL} ]] && DEVLABEL=$(get_name disk)
|
|
|
[[ -d "${ROOTFS}/media/${DEVLABEL}" ]] && DEVLABEL=$(get_name ${DEVLABEL})
|
|
|
tr ',;' ' ' <<< " ${PARTITIONSNOMOUNT} " | grep -q " ${DEVLABEL} " && continue
|
|
|
DEVOPTS=$(fs_options ${SELECT_DEVICE} fstab)
|
|
|
[[ ${DEVTYPE} == "vfat" || ${DEVTYPE} = "ntfs" ]] && DEVOPTS="${DEVOPTS},uid=${PARTITIONSMOUNTUID}"
|
|
|
echo "${SELECT_DEVICE} /media/${DEVLABEL} ${DEVTYPE} ${DEVOPTS} 0 ${FSCKFLAG} #PARTITIONSAUTOMOUNT=yes" >> ${ROOTFS}/etc/fstab
|
|
|
[[ -d "${ROOTFS}/media/${DEVLABEL}" ]] || mkdir -p ${ROOTFS}/media/${DEVLABEL}
|
|
|
elif [[ ${DEVTYPE} == "swap" ]]; then
|
|
|
[[ $(< ${ROOTFS}/etc/fstab) =~ (^|$'\n')"${SELECT_DEVICE} none swap" ]] || echo "${SELECT_DEVICE} none swap defaults 0 0 #PARTITIONSAUTOMOUNT=yes" >> ${ROOTFS}/etc/fstab
|
|
|
fi
|
|
|
fi
|
|
|
done 3< <(blkid | grep -Ev "loop|/dev/ram" | grep /dev/ | awk -F: '{ print $1 }')
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
exec_connect_win_swap(){
|
|
|
#Find and use swap partition. If not, use window$ swapfile.
|
|
|
if [[ -n $(cmdline_parameter findswap) ]]; then
|
|
|
sed -i /FINDSWAP/d ${ROOTFS}/etc/fstab
|
|
|
debug_log "Find linux native patitions"
|
|
|
FSWAP=$(blkid -t TYPE="swap" -l | awk -F: '{print $1}')
|
|
|
if [[ ${FSWAP} ]]; then
|
|
|
echo "${FSWAP} none swap defaults 0 0 #FINDSWAP" >> ${ROOTFS}/etc/fstab
|
|
|
else
|
|
|
debug_log "Capturing windows swapfile"
|
|
|
FSWAP=$(find_in_computer /pagefile.sys /${UNION}/mnt/windows)
|
|
|
if [[ -n ${FSWAP} ]]; then
|
|
|
if [[ -f ${FSWAP} ]]; then
|
|
|
mkswap ${FSWAP}
|
|
|
DSWAP=$(dirname ${FSWAP})
|
|
|
DEV=$(grep /${UNION}/mnt/windows /proc/mounts | awk '{ print $1 }')
|
|
|
DEVTYPE=$(blkid ${DEV} -s TYPE | awk -F\" '{print $2}' )
|
|
|
if [[ ${DSWAP} == "/${UNION}/mnt/windows" -a -b "${DEV}" ]]; then
|
|
|
DEVOPTS=$(fs_options ${DEV} fstab),uid=${PARTITIONSMOUNTUID}
|
|
|
echo "${DEV} /mnt/windows ${DEVTYPE} ${DEVOPTS} 0 ${FSCKFLAG} # FINDSWAP" >> ${ROOTFS}/etc/fstab
|
|
|
umount /${UNION}/mnt/windows 2>/dev/null
|
|
|
fi
|
|
|
echo "${FSWAP} none swap defaults 0 0 # FINDSWAP" | sed s-/$UNION-- >> ${ROOTFS}/etc/fstab
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
exec_compcache(){
|
|
|
#Enable compcache if it is needed
|
|
|
[[ $(< ${ROOTFS}/etc/fstab) =~ " swap " || ${SERVICESNOSTART} =~ "compcache" ]] || ${CMD_CHROOT} chkconfig --add compcache >/dev/null 2<&1
|
|
|
}
|
|
|
|
|
|
exec_partitions_shared_nfs(){
|
|
|
#Exporting partitions
|
|
|
if [[ -n ${PARTITIONS_SHARED_NFS} ]]; then
|
|
|
for SELECT_POINT in $(grep " /media/" ${ROOTFS}/etc/fstab | awk '{print $2}' | sed s:/media/::); do
|
|
|
[[ $(< ${ROOTFS}/etc/exports) =~ (^|$'\n')"/media/${SELECT_POINT} " ]] && continue
|
|
|
[[ ${PARTITIONS_NOSHARE_NFS} =~ (^|,|;)"${SELECT_POINT}"(,|;|$) ]] && continue
|
|
|
echo "/media/${SELECT_POINT} ${PARTITIONS_SHARED_NFS}(all_squash,anonuid=500,anongid=100,async,secure,no_subtree_check,rw)" >> ${ROOTFS}/etc/exports
|
|
|
done
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
exec_link(){
|
|
|
if [[ -d /mnt/livemedia/ublinux-data && ! -d /mnt/livedata ]]; then
|
|
|
ln -sf livemedia ${ROOTFS}/mnt/livedata
|
|
|
fi
|
|
|
}
|
|
|
|
|
|
|
|
|
################
|
|
|
##### MAIN #####
|
|
|
################
|
|
|
|
|
|
# Если файл подключен как ресурс с функциями, то выйти
|
|
|
return 0 2>/dev/null && return 0
|
|
|
if [[ -z $@ ]]; then
|
|
|
while read -r FUNCTION; do
|
|
|
$"${FUNCTION##* }"
|
|
|
done < <(declare -F | grep "declare -f exec_")
|
|
|
else
|
|
|
FUNCTION=
|
|
|
while [[ $# -gt 0 ]]; do
|
|
|
[[ -z ${1} ]] || { declare -f "${1}" &>/dev/null && FUNCTION+="; ${1}" || FUNCTION+=" '${1//\'/}'"; }
|
|
|
shift
|
|
|
done
|
|
|
eval ${FUNCTION#*; }
|
|
|
fi
|