Commit 1bfadf3e authored by nl6720's avatar nl6720
Browse files

Support EROFS

EROFS, like Squashfs, is a read-only file system. It can be used to store airootfs in an image file.
Its advantage is the support for POSIX ACLs. EROFS downside is that currently it only supports LZ4 compression (LZMA support is not yet fully implemented).

A difference from Squashfs is that, EROFS stores change time (ctime) not modification time (mtime). The reverse is true for Squashfs.

Implements archlinux/archiso#59
parent d13c747c
...@@ -81,12 +81,36 @@ _mnt_sfs() { ...@@ -81,12 +81,36 @@ _mnt_sfs() {
_mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults" _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 # args: device, mountpoint, flags, opts
_mnt_dev() { _mnt_dev() {
local dev="${1}" local dev="${1}"
local mnt="${2}" local mnt="${2}"
local flg="${3}" local flg="${3}"
local opts="${4}" local opts="${4}"
local fstype="${5:-auto}"
mkdir -p "${mnt}" mkdir -p "${mnt}"
...@@ -99,7 +123,7 @@ _mnt_dev() { ...@@ -99,7 +123,7 @@ _mnt_dev() {
launch_interactive_shell launch_interactive_shell
done done
if mount -o "${opts}" "${flg}" "${dev}" "${mnt}"; then if mount -t "${fstype}" -o "${opts}" "${flg}" "${dev}" "${mnt}"; then
msg ":: Device '${dev}' mounted successfully." msg ":: Device '${dev}' mounted successfully."
else else
echo "ERROR; Failed to mount '${dev}'" echo "ERROR; Failed to mount '${dev}'"
...@@ -120,8 +144,9 @@ _verify_checksum() { ...@@ -120,8 +144,9 @@ _verify_checksum() {
_verify_signature() { _verify_signature() {
local _status local _status
local sigfile="${1}"
cd "/run/archiso/bootmnt/${archisobasedir}/${arch}" || exit 1 cd "/run/archiso/bootmnt/${archisobasedir}/${arch}" || exit 1
gpg --homedir /gpg --status-fd 1 --verify airootfs.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG' gpg --homedir /gpg --status-fd 1 --verify "${sigfile}" 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
_status=$? _status=$?
cd -- "${OLDPWD}" || exit 1 cd -- "${OLDPWD}" || exit 1
return ${_status} return ${_status}
...@@ -160,6 +185,7 @@ run_hook() { ...@@ -160,6 +185,7 @@ run_hook() {
# args: /path/to/newroot # args: /path/to/newroot
archiso_mount_handler() { archiso_mount_handler() {
local newroot="${1}" local newroot="${1}"
local sigfile
if ! mountpoint -q "/run/archiso/bootmnt"; then if ! mountpoint -q "/run/archiso/bootmnt"; then
_mnt_dev "${archisodevice}" "/run/archiso/bootmnt" "-r" "defaults" _mnt_dev "${archisodevice}" "/run/archiso/bootmnt" "-r" "defaults"
...@@ -190,15 +216,20 @@ archiso_mount_handler() { ...@@ -190,15 +216,20 @@ archiso_mount_handler() {
# defined via initcpio's parse_cmdline() # defined via initcpio's parse_cmdline()
if [ "${verify}" = "y" ]; then if [ "${verify}" = "y" ]; then
if [ -f "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs.sig" ]; 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..." msg -n ":: Signature verification requested, please wait..."
if _verify_signature; then if _verify_signature "${sigfile}"; then
msg "done. Signature is OK, continue booting." msg "done. Signature is OK, continue booting."
else else
echo "ERROR: one or more files are corrupted" echo "ERROR: one or more files are corrupted"
launch_interactive_shell launch_interactive_shell
fi fi
else else
echo "ERROR: verify=y option specified but ${archisobasedir}/${arch}/airootfs.sfs.sig not found" echo "ERROR: verify=y option specified but GPG signature not found in ${archisobasedir}/${arch}/"
launch_interactive_shell launch_interactive_shell
fi fi
fi fi
...@@ -221,7 +252,11 @@ archiso_mount_handler() { ...@@ -221,7 +252,11 @@ archiso_mount_handler() {
mkdir -p "/run/archiso/cowspace/${cow_directory}" mkdir -p "/run/archiso/cowspace/${cow_directory}"
chmod 0700 "/run/archiso/cowspace/${cow_directory}" chmod 0700 "/run/archiso/cowspace/${cow_directory}"
_mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/airootfs" 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 if [ -f "/run/archiso/airootfs/airootfs.img" ]; then
_mnt_dmsnapshot "/run/archiso/airootfs/airootfs.img" "${newroot}" "/" _mnt_dmsnapshot "/run/archiso/airootfs/airootfs.img" "${newroot}" "/"
else else
......
...@@ -39,6 +39,7 @@ _curl_get() { ...@@ -39,6 +39,7 @@ _curl_get() {
archiso_pxe_http_mount_handler () { archiso_pxe_http_mount_handler () {
newroot="${1}" newroot="${1}"
local img_type="sfs"
msg ":: Mounting /run/archiso/httpspace (tmpfs) filesystem, size='${archiso_http_spc}'" msg ":: Mounting /run/archiso/httpspace (tmpfs) filesystem, size='${archiso_http_spc}'"
mkdir -p "/run/archiso/httpspace" mkdir -p "/run/archiso/httpspace"
...@@ -46,7 +47,12 @@ archiso_pxe_http_mount_handler () { ...@@ -46,7 +47,12 @@ archiso_pxe_http_mount_handler () {
# shellcheck disable=SC2154 # shellcheck disable=SC2154
# defined via initcpio's parse_cmdline() # defined via initcpio's parse_cmdline()
_curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.sfs" "/${arch}" if ! curl -L -f -o /dev/null -s -r 0-0 "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.sfs"; then
if curl -L -f -o /dev/null -s -r 0-0 "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.erofs"; then
img_type="erofs"
fi
fi
_curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.${img_type}" "/${arch}"
# shellcheck disable=SC2154 # shellcheck disable=SC2154
# defined via initcpio's parse_cmdline() # defined via initcpio's parse_cmdline()
...@@ -56,7 +62,7 @@ archiso_pxe_http_mount_handler () { ...@@ -56,7 +62,7 @@ archiso_pxe_http_mount_handler () {
# shellcheck disable=SC2154 # shellcheck disable=SC2154
# defined via initcpio's parse_cmdline() # defined via initcpio's parse_cmdline()
if [ "${verify}" = "y" ]; then if [ "${verify}" = "y" ]; then
_curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.sfs.sig" "/${arch}" _curl_get "${archiso_http_srv}${archisobasedir}/${arch}/airootfs.${img_type}.sig" "/${arch}"
fi fi
mkdir -p "/run/archiso/bootmnt" mkdir -p "/run/archiso/bootmnt"
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment