forked from archlinux/archiso
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Updated, Supports Systemd-Boot only for now.
- Loading branch information
1 parent
cd5fce1
commit 4965b79
Showing
19 changed files
with
872 additions
and
135 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
#!/bin/ash | ||
# | ||
# SPDX-License-Identifier: GPL-3.0-or-later | ||
|
||
# /oldroot depends on things inside /oldroot/run/archiso... | ||
mkdir /oldrun | ||
mount -n --move /oldroot/run /oldrun | ||
|
||
# Unmount all mounts now. | ||
umount "$(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)" | ||
|
||
# Remove all dm-snapshot devices. | ||
dmsetup remove_all | ||
|
||
# Remove all loopback devices. | ||
for _lup in $(grep ^/dev/loop /oldrun/archiso/used_block_devices | tac); do | ||
if ! losetup -d -- "${_lup}" 2> /dev/null; then | ||
umount -d -- "${_lup}" | ||
fi | ||
done | ||
|
||
# Unmount the space used to store *.cow. | ||
umount /oldrun/archiso/cowspace | ||
|
||
# Unmount boot device if needed (no copytoram=y used) | ||
if [ ! -d /oldrun/archiso/copytoram ]; then | ||
if [ -d /oldrun/archiso/img_dev ]; then | ||
umount /oldrun/archiso/img_dev | ||
else | ||
umount /oldrun/archiso/bootmnt | ||
fi | ||
fi | ||
|
||
# reboot / poweroff / halt, depending on the argument passed by init | ||
# if something invalid is passed, we halt | ||
case "$1" in | ||
reboot|poweroff|halt) "$1" -f ;; | ||
*) halt -f;; | ||
esac | ||
|
||
# vim: set ft=sh: |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,272 @@ | ||
#!/bin/ash | ||
# | ||
# SPDX-License-Identifier: GPL-3.0-or-later | ||
|
||
# args: source, newroot, mountpoint | ||
_mnt_dmsnapshot() { | ||
local img="${1}" | ||
local newroot="${2}" | ||
local mnt="${3}" | ||
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/archiso/used_block_devices | ||
ro_dev_size="$(blockdev --getsz "${ro_dev}")" | ||
|
||
if [ "${cow_persistent}" = "P" ]; then | ||
if [ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]; then | ||
msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow', using as persistent." | ||
else | ||
msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as persistent." | ||
truncate -s "${cow_spacesize}" "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" | ||
fi | ||
else | ||
if [ -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" ]; then | ||
msg ":: Found '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing." | ||
rm -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" | ||
fi | ||
msg ":: Creating '/run/archiso/cowspace/${cow_directory}/${img_name}.cow' as non-persistent." | ||
truncate -s "${cow_spacesize}" "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" | ||
fi | ||
|
||
rw_dev="$(losetup --find --show "/run/archiso/cowspace/${cow_directory}/${img_name}.cow")" | ||
echo "${rw_dev}" >> /run/archiso/used_block_devices | ||
|
||
dmsetup create "${dm_snap_name}" --table \ | ||
"0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}" | ||
|
||
if [ "${cow_persistent}" != "P" ]; then | ||
rm -f "/run/archiso/cowspace/${cow_directory}/${img_name}.cow" | ||
fi | ||
|
||
_mnt_dev "/dev/mapper/${dm_snap_name}" "${newroot}${mnt}" "-w" "defaults" | ||
readlink -f "/dev/mapper/${dm_snap_name}" >> /run/archiso/used_block_devices | ||
} | ||
|
||
# args: source, newroot, mountpoint | ||
_mnt_overlayfs() { | ||
local src="${1}" | ||
local newroot="${2}" | ||
local mnt="${3}" | ||
mkdir -p "/run/archiso/cowspace/${cow_directory}/upperdir" "/run/archiso/cowspace/${cow_directory}/workdir" | ||
mount -t overlay -o \ | ||
"lowerdir=${src},upperdir=/run/archiso/cowspace/${cow_directory}/upperdir,workdir=/run/archiso/cowspace/${cow_directory}/workdir" \ | ||
airootfs "${newroot}${mnt}" | ||
} | ||
|
||
|
||
# args: /path/to/image_file, mountpoint | ||
_mnt_sfs() { | ||
local img="${1}" | ||
local mnt="${2}" | ||
local img_fullname="${img##*/}" | ||
local sfs_dev | ||
|
||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ "${copytoram}" = "y" ]; then | ||
msg -n ":: Copying squashfs image to RAM..." | ||
if ! cp -- "${img}" "/run/archiso/copytoram/${img_fullname}" ; then | ||
echo "ERROR: while copy '${img}' to '/run/archiso/copytoram/${img_fullname}'" | ||
launch_interactive_shell | ||
fi | ||
img="/run/archiso/copytoram/${img_fullname}" | ||
msg "done." | ||
fi | ||
sfs_dev="$(losetup --find --show --read-only -- "${img}")" | ||
echo "${sfs_dev}" >> /run/archiso/used_block_devices | ||
_mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults" | ||
} | ||
|
||
# args: /path/to/image_file, mountpoint | ||
_mnt_erofs() { | ||
local img="${1}" | ||
local mnt="${2}" | ||
local img_fullname="${img##*/}" | ||
local erofs_dev | ||
|
||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ "${copytoram}" = "y" ]; then | ||
msg -n ":: Copying EROFS image to RAM..." | ||
if ! cp -- "${img}" "/run/archiso/copytoram/${img_fullname}" ; then | ||
echo "ERROR: while copy '${img}' to '/run/archiso/copytoram/${img_fullname}'" | ||
launch_interactive_shell | ||
fi | ||
img="/run/archiso/copytoram/${img_fullname}" | ||
msg "done." | ||
fi | ||
erofs_dev="$(losetup --find --show --read-only -- "${img}")" | ||
echo "${erofs_dev}" >> /run/archiso/used_block_devices | ||
_mnt_dev "${erofs_dev}" "${mnt}" "-r" "defaults" "erofs" | ||
} | ||
|
||
# args: device, mountpoint, flags, opts | ||
_mnt_dev() { | ||
local dev="${1}" | ||
local mnt="${2}" | ||
local flg="${3}" | ||
local opts="${4}" | ||
local fstype="${5:-auto}" | ||
|
||
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 -t "${fstype}" -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/archiso/bootmnt/${archisobasedir}/${arch}" || exit 1 | ||
sha512sum -c airootfs.sha512 > /tmp/checksum.log 2>&1 | ||
_status=$? | ||
cd -- "${OLDPWD}" || exit 1 | ||
return "${_status}" | ||
} | ||
|
||
_verify_signature() { | ||
local _status | ||
local sigfile="${1}" | ||
cd "/run/archiso/bootmnt/${archisobasedir}/${arch}" || exit 1 | ||
gpg --homedir /gpg --status-fd 1 --verify "${sigfile}" 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG' | ||
_status=$? | ||
cd -- "${OLDPWD}" || exit 1 | ||
return ${_status} | ||
} | ||
|
||
run_hook() { | ||
[ -z "${arch}" ] && arch="$(uname -m)" | ||
[ -z "${copytoram_size}" ] && copytoram_size="75%" | ||
[ -z "${archisobasedir}" ] && archisobasedir="arch" | ||
[ -z "${dm_snap_prefix}" ] && dm_snap_prefix="arch" | ||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
[ -z "${archisodevice}" ] && archisodevice="/dev/disk/by-label/${archisolabel}" | ||
[ -z "${cow_spacesize}" ] && cow_spacesize="256M" | ||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
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_${archisolabel}/${arch}" | ||
[ -z "${cow_chunksize}" ] && cow_chunksize="8" | ||
|
||
# set mount handler for archiso | ||
export mount_handler="archiso_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 | ||
archiso_mount_handler() { | ||
local newroot="${1}" | ||
local sigfile | ||
|
||
if ! mountpoint -q "/run/archiso/bootmnt"; then | ||
_mnt_dev "${archisodevice}" "/run/archiso/bootmnt" "-r" "defaults" | ||
if [ "${copytoram}" != "y" ]; then | ||
readlink -f "${archisodevice}" >> /run/archiso/used_block_devices | ||
fi | ||
fi | ||
|
||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ "${checksum}" = "y" ]; then | ||
if [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sha512" ]; then | ||
msg -n ":: Self-test requested, please wait..." | ||
if _verify_checksum; 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 ${archisobasedir}/${arch}/airootfs.sha512 not found" | ||
launch_interactive_shell | ||
fi | ||
fi | ||
|
||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ "${verify}" = "y" ]; then | ||
if [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs.sig" ]; then | ||
sigfile="airootfs.sfs.sig" | ||
elif [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.erofs.sig" ]; then | ||
sigfile="airootfs.erofs.sig" | ||
fi | ||
if [ -n "${sigfile}" ]; then | ||
msg -n ":: Signature verification requested, please wait..." | ||
if _verify_signature "${sigfile}"; 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 GPG signature not found in ${archisobasedir}/${arch}/" | ||
launch_interactive_shell | ||
fi | ||
fi | ||
|
||
if [ "${copytoram}" = "y" ]; then | ||
msg ":: Mounting /run/archiso/copytoram (tmpfs) filesystem, size=${copytoram_size}" | ||
mkdir -p /run/archiso/copytoram | ||
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/archiso/copytoram | ||
fi | ||
|
||
if [ -n "${cow_device}" ]; then | ||
_mnt_dev "${cow_device}" "/run/archiso/cowspace" "-r" "${cow_flags}" | ||
readlink -f "${cow_device}" >> /run/archiso/used_block_devices | ||
mount -o remount,rw "/run/archiso/cowspace" | ||
else | ||
msg ":: Mounting /run/archiso/cowspace (tmpfs) filesystem, size=${cow_spacesize}..." | ||
mkdir -p /run/archiso/cowspace | ||
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/archiso/cowspace | ||
fi | ||
mkdir -p "/run/archiso/cowspace/${cow_directory}" | ||
chmod 0700 "/run/archiso/cowspace/${cow_directory}" | ||
|
||
if [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" ]; then | ||
_mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/airootfs" | ||
elif [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.erofs" ]; then | ||
_mnt_erofs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.erofs" "/run/archiso/airootfs" | ||
fi | ||
if [ -f "/run/archiso/airootfs/airootfs.img" ]; then | ||
_mnt_dmsnapshot "/run/archiso/airootfs/airootfs.img" "${newroot}" "/" | ||
else | ||
_mnt_overlayfs "/run/archiso/airootfs" "${newroot}" "/" | ||
fi | ||
|
||
if [ "${copytoram}" = "y" ]; then | ||
umount -d /run/archiso/bootmnt | ||
rmdir /run/archiso/bootmnt | ||
fi | ||
} | ||
|
||
# vim: set ft=sh: |
45 changes: 45 additions & 0 deletions
45
configs/aarch64/airootfs/etc/initcpio/hooks/archiso_loop_mnt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
#!/bin/ash | ||
# | ||
# SPDX-License-Identifier: GPL-3.0-or-later | ||
|
||
run_hook () { | ||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
[ -n "${img_label}" ] && img_dev="/dev/disk/by-label/${img_label}" | ||
[ -z "${img_flags}" ] && img_flags="defaults" | ||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ -n "${img_dev}" ] && [ -n "${img_loop}" ]; then | ||
export mount_handler="archiso_loop_mount_handler" | ||
fi | ||
} | ||
|
||
archiso_loop_mount_handler () { | ||
newroot="${1}" | ||
|
||
local _dev_loop | ||
|
||
msg ":: Setup a loop device from ${img_loop} located at device ${img_dev}" | ||
_mnt_dev "${img_dev}" "/run/archiso/img_dev" "-r" "${img_flags}" | ||
# shellcheck disable=SC2154 | ||
# defined via initcpio's parse_cmdline() | ||
if [ "${copytoram}" != "y" ]; then | ||
readlink -f "${img_dev}" >> /run/archiso/used_block_devices | ||
fi | ||
|
||
if _dev_loop=$(losetup --find --show --read-only "/run/archiso/img_dev/${img_loop}"); then | ||
export archisodevice="${_dev_loop}" | ||
else | ||
echo "ERROR: Setting loopback device for file '/run/archiso/img_dev/${img_loop}'" | ||
launch_interactive_shell | ||
fi | ||
|
||
archiso_mount_handler "${newroot}" | ||
|
||
if [ "${copytoram}" = "y" ]; then | ||
losetup -d "${_dev_loop}" 2>/dev/null | ||
umount /run/archiso/img_dev | ||
fi | ||
} | ||
|
||
# vim: set ft=sh: |
Oops, something went wrong.