forked from mirrored-repos/manjaro-tools
aa84e639a3
* Correction for a faulty condition The current condition works for checking existence of the .sfs files on the local file system. The proposed condition checks for the existence of the .sfs files on a remote server. * Correction for NFS & NBD & HTTP boot By default, Calamares searches for the .sfs files in the "bootmnt" directory. When "copytoram==y" (relevant for NFS & NBD & HTTP boot), the .sfs files are stored in the "copytoram" directory. The proposed code binds the "copytoram" dir with "bootmnt" so Calamares can "see" the .sfs. files.
245 lines
9.2 KiB
Bash
245 lines
9.2 KiB
Bash
# args: source, newroot, mountpoint
|
|
_mnt_dmsnapshot() {
|
|
local img="${1}"
|
|
local mnt="${2}"
|
|
local img_fullname="${img##*/}";
|
|
local img_name="${img_fullname%%.*}"
|
|
local dm_snap_name="${dm_snap_prefix}_${img_name}"
|
|
local ro_dev ro_dev_size rw_dev
|
|
|
|
ro_dev=$(losetup --find --show --read-only "${img}")
|
|
echo ${ro_dev} >> /run/miso/used_block_devices
|
|
ro_dev_size=$(blockdev --getsz ${ro_dev})
|
|
|
|
if [[ "${cow_persistent}" == "P" ]]; then
|
|
if [[ -f "/run/miso/cowspace/${cow_directory}/${img_name}.cow" ]]; then
|
|
msg ":: Found '/run/miso/cowspace/${cow_directory}/${img_name}.cow', using as persistent."
|
|
else
|
|
msg ":: Creating '/run/miso/cowspace/${cow_directory}/${img_name}.cow' as persistent."
|
|
truncate -s "${cow_spacesize}" "/run/miso/cowspace/${cow_directory}/${img_name}.cow"
|
|
fi
|
|
else
|
|
if [[ -f "/run/miso/cowspace/${cow_directory}/${img_name}.cow" ]]; then
|
|
msg ":: Found '/run/miso/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
|
|
rm -f "/run/miso/cowspace/${cow_directory}/${img_name}.cow"
|
|
fi
|
|
msg ":: Creating '/run/miso/cowspace/${cow_directory}/${img_name}.cow' as non-persistent."
|
|
truncate -s "${cow_spacesize}" "/run/miso/cowspace/${cow_directory}/${img_name}.cow"
|
|
fi
|
|
|
|
rw_dev=$(losetup --find --show "/run/miso/cowspace/${cow_directory}/${img_name}.cow")
|
|
echo ${rw_dev} >> /run/miso/used_block_devices
|
|
|
|
dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}"
|
|
|
|
_mnt_dev "/dev/mapper/${dm_snap_name}" "${mnt}" "-w" "defaults"
|
|
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/miso/used_block_devices
|
|
}
|
|
|
|
# args: source, newroot, mountpoint
|
|
_mnt_overlayfs() {
|
|
local src="${1}"
|
|
local newroot="${2}"
|
|
local mnt="${3}"
|
|
local work_dir="/run/miso/overlay_root/work"
|
|
local upper_dir="/run/miso/overlay_root/upper"
|
|
|
|
mkdir -p "${upper_dir}" "${work_dir}"
|
|
|
|
mount -t overlay overlay -o lowerdir="${src}",upperdir="${upper_dir}",workdir="${work_dir}" "${newroot}${mnt}"
|
|
}
|
|
|
|
# args: /path/to/image_file, mountpoint
|
|
_mnt_sfs() {
|
|
local img="${1}"
|
|
local mnt="${2}"
|
|
local img_fullname="${img##*/}"
|
|
local sfs_dev
|
|
|
|
if [[ "${copytoram}" == "y" ]]; then
|
|
msg -n ":: Copying squashfs image to RAM..."
|
|
if ! cp "${img}" "/run/miso/copytoram/${img_fullname}" ; then
|
|
echo "ERROR: while copy '${img}' to '/run/miso/copytoram/${img_fullname}'"
|
|
launch_interactive_shell
|
|
fi
|
|
img="/run/miso/copytoram/${img_fullname}"
|
|
msg "done."
|
|
fi
|
|
sfs_dev=$(losetup --find --show --read-only "${img}")
|
|
echo ${sfs_dev} >> /run/miso/used_block_devices
|
|
_mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults"
|
|
}
|
|
|
|
# args: device, mountpoint, flags, opts
|
|
_mnt_dev() {
|
|
local dev="${1}"
|
|
local mnt="${2}"
|
|
local flg="${3}"
|
|
local opts="${4}"
|
|
|
|
mkdir -p "${mnt}"
|
|
|
|
msg ":: Mounting '${dev}' to '${mnt}'"
|
|
|
|
while ! poll_device "${dev}" 30; do
|
|
echo "ERROR: '${dev}' device did not show up after 30 seconds..."
|
|
echo " Falling back to interactive prompt"
|
|
echo " You can try to fix the problem manually, log out when you are finished"
|
|
launch_interactive_shell
|
|
done
|
|
|
|
if mount -o "${opts}" "${flg}" "${dev}" "${mnt}"; then
|
|
msg ":: Device '${dev}' mounted successfully."
|
|
else
|
|
echo "ERROR; Failed to mount '${dev}'"
|
|
echo " Falling back to interactive prompt"
|
|
echo " You can try to fix the problem manually, log out when you are finished"
|
|
launch_interactive_shell
|
|
fi
|
|
}
|
|
|
|
_verify_checksum() {
|
|
local _status
|
|
cd "/run/miso/bootmnt/${misobasedir}/${arch}"
|
|
md5sum -c $1.md5 > /tmp/checksum.log 2>&1
|
|
_status=$?
|
|
cd "${OLDPWD}"
|
|
return ${_status}
|
|
}
|
|
|
|
_verify_signature() {
|
|
local _status
|
|
cd "/run/miso/bootmnt/${misobasedir}/${arch}"
|
|
gpg --homedir /gpg --status-fd 1 --verify $1.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
|
|
_status=$?
|
|
cd "${OLDPWD}"
|
|
return ${_status}
|
|
}
|
|
|
|
run_hook() {
|
|
[[ -z "${arch}" ]] && arch="$(uname -m)"
|
|
[[ -z "${copytoram_size}" ]] && copytoram_size="75%"
|
|
[[ -z "${misobasedir}" ]] && misobasedir="manjaro"
|
|
|
|
[[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="arch"
|
|
[[ -z "${misodevice}" ]] && misodevice="/dev/disk/by-label/${misolabel}"
|
|
[[ -z "${cow_spacesize}" ]] && cow_spacesize="256M"
|
|
[[ -z "${overlay_root_size}" ]] && overlay_root_size="75%"
|
|
|
|
if [[ -n "${cow_label}" ]]; then
|
|
cow_device="/dev/disk/by-label/${cow_label}"
|
|
[[ -z "${cow_persistent}" ]] && cow_persistent="P"
|
|
elif [[ -n "${cow_device}" ]]; then
|
|
[[ -z "${cow_persistent}" ]] && cow_persistent="P"
|
|
else
|
|
cow_persistent="N"
|
|
fi
|
|
|
|
[[ -z "${cow_flags}" ]] && cow_flags="defaults"
|
|
[[ -z "${cow_directory}" ]] && cow_directory="persistent_${misolabel}/${arch}"
|
|
[[ -z "${cow_chunksize}" ]] && cow_chunksize="8"
|
|
|
|
# set mount handler for miso
|
|
mount_handler="miso_mount_handler"
|
|
}
|
|
|
|
# This function is called normally from init script, but it can be called
|
|
# as chain from other mount handlers.
|
|
# args: /path/to/newroot
|
|
miso_mount_handler() {
|
|
local newroot="${1}"
|
|
|
|
if ! mountpoint -q "/run/miso/bootmnt"; then
|
|
_mnt_dev "${misodevice}" "/run/miso/bootmnt" "-r" "defaults"
|
|
if [[ "${copytoram}" != "y" ]]; then
|
|
echo $(readlink -f ${misodevice}) >> /run/miso/used_block_devices
|
|
fi
|
|
fi
|
|
|
|
if [[ "${checksum}" == "y" ]]; then
|
|
for fs in rootfs desktopfs mhwdfs livefs;do
|
|
if [[ -f "/run/miso/bootmnt/${misobasedir}/${arch}/${fs}.sfs" ]]; then
|
|
if [[ -f "/run/miso/bootmnt/${misobasedir}/${arch}/${fs}.md5" ]]; then
|
|
msg -n ":: Self-test requested, please wait..."
|
|
if _verify_checksum "${fs}"; then
|
|
msg "done. Checksum is OK, continue booting."
|
|
else
|
|
echo "ERROR: one or more files are corrupted"
|
|
echo "see /tmp/checksum.log for details"
|
|
launch_interactive_shell
|
|
fi
|
|
else
|
|
echo "ERROR: checksum=y option specified but ${misobasedir}/${arch}/${fs}.md5 not found"
|
|
launch_interactive_shell
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ "${verify}" == "y" ]]; then
|
|
for fs in rootfs desktopfs mhwdfs livefs;do
|
|
if [[ -f "/run/miso/bootmnt/${misobasedir}/${arch}/${fs}.sfs" ]]; then
|
|
if [[ -f "/run/miso/bootmnt/${misobasedir}/${arch}/${fs}.sfs.sig" ]]; then
|
|
msg -n ":: Signature verification requested, please wait..."
|
|
if _verify_signature "${fs}"; then
|
|
msg "done. Signature is OK, continue booting."
|
|
else
|
|
echo "ERROR: one or more files are corrupted"
|
|
launch_interactive_shell
|
|
fi
|
|
else
|
|
echo "ERROR: verify=y option specified but ${misobasedir}/${arch}/${fs}.sfs.sig not found"
|
|
launch_interactive_shell
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ "${copytoram}" == "y" ]]; then
|
|
msg ":: Mounting /run/miso/copytoram (tmpfs) filesystem, size=${copytoram_size}"
|
|
mkdir -p /run/miso/copytoram
|
|
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/miso/copytoram
|
|
fi
|
|
|
|
if [[ -n "${cow_device}" ]]; then
|
|
_mnt_dev "${cow_device}" "/run/miso/cowspace" "-r" "${cow_flags}"
|
|
echo $(readlink -f ${cow_device}) >> /run/miso/used_block_devices
|
|
mount -o remount,rw "/run/miso/cowspace"
|
|
else
|
|
msg ":: Mounting /run/miso/cowspace (tmpfs) filesystem, size=${cow_spacesize}..."
|
|
mkdir -p /run/miso/cowspace
|
|
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/miso/cowspace
|
|
fi
|
|
mkdir -p -m 0700 "/run/miso/cowspace/${cow_directory}"
|
|
|
|
msg -n ":: Mounting overlay root (tmpfs) filesystem, size=${overlay_root_size}..."
|
|
mkdir -p /run/miso/overlay_root
|
|
mount -t tmpfs -o "size=${overlay_root_size}",mode=0755 overlay_root /run/miso/overlay_root
|
|
|
|
local src="/run/miso/bootmnt/${misobasedir}/${arch}"
|
|
local dest_sfs="/run/miso/sfs" dest_img="/run/miso/img"
|
|
local lower_dir
|
|
|
|
for sfs in livefs mhwdfs desktopfs rootfs;do
|
|
if [[ -f "${src}/${sfs}.sfs" ]]; then
|
|
_mnt_sfs "${src}/${sfs}.sfs" "${dest_sfs}/${sfs}"
|
|
if [[ -f "${dest_sfs}/${sfs}/${sfs}.img" ]]; then
|
|
mkdir -p ${dest_img}
|
|
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_img}/${sfs}"
|
|
_mnt_dmsnapshot "${dest_sfs}/${sfs}/${sfs}.img" "${dest_img}/${sfs}"
|
|
else
|
|
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_sfs}/${sfs}"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
_mnt_overlayfs "${lower_dir}" "${newroot}" "/"
|
|
|
|
if [[ "${copytoram}" == "y" ]]; then
|
|
umount -d /run/miso/bootmnt
|
|
mkdir -p /run/miso/bootmnt/${misobasedir}/${arch}
|
|
mount -o bind /run/miso/copytoram /run/miso/bootmnt/${misobasedir}/${arch}
|
|
fi
|
|
}
|
|
|
|
# vim:ft=sh:ts=4:sw=4:et:
|