[archiso] Add optional OverlayFS support
This is the first attemp to test overlayfs in archiso. The current dm-snapshot mode is keep and is enabled by default, while the new mode is enabled via "-s sfs" to mkarchiso. No new boot parameters are added, since archiso hooks detects if the .sfs file is for dm-snapshot (airootfs.img inside) or for overlayfs. Persistence is supported in overlayfs mode using the same options (cowlabel or cowdevice), but warning while in dm-snapshot mode, only one file is used (airootfs.cow), in overlayfs mode internal files for workdir/ and upperdir/ are allocated, so you can not use VFAT or NTFS. To test this, you need to enable [testing] in pacman.conf from releng profile and edit build.sh then add "-s sfs" in make_prepare() Look at: setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -D "${install_dir}" prepare Replace with: setarch ${arch} mkarchiso ${verbose} -w "${work_dir}" -s sfs -D "${install_dir}" prepare The build requires just half of space that the build for dm-snapshot, since there is no ext4 img ;) Just to remember: there is no space gain in .sfs (just about 2M) There is at least one thing during boot with machine-id service: Dec 24 03:31:39 archiso systemd-machine-id-commit[183]: Failed to unmount transient /etc/machine-id file in our private namespace: Invalid argument Signed-off-by: Gerardo Exequiel Pozzi <vmlinuz386@gmail.com>
This commit is contained in:
parent
fe29d5f334
commit
a637bdb857
@ -1,5 +1,5 @@
|
|||||||
# args: source, newroot, mountpoint
|
# args: source, newroot, mountpoint
|
||||||
_mnt_fs() {
|
_mnt_dmsnapshot() {
|
||||||
local img="${1}"
|
local img="${1}"
|
||||||
local newroot="${2}"
|
local newroot="${2}"
|
||||||
local mnt="${3}"
|
local mnt="${3}"
|
||||||
@ -37,6 +37,16 @@ _mnt_fs() {
|
|||||||
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/archiso/used_block_devices
|
echo $(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
|
# args: /path/to/image_file, mountpoint
|
||||||
_mnt_sfs() {
|
_mnt_sfs() {
|
||||||
local img="${1}"
|
local img="${1}"
|
||||||
@ -165,7 +175,11 @@ archiso_mount_handler() {
|
|||||||
mkdir -p "/run/archiso/cowspace/${cow_directory}"
|
mkdir -p "/run/archiso/cowspace/${cow_directory}"
|
||||||
|
|
||||||
_mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/sfs/airootfs"
|
_mnt_sfs "/run/archiso/bootmnt/${archisobasedir}/${arch}/airootfs.sfs" "/run/archiso/sfs/airootfs"
|
||||||
_mnt_fs "/run/archiso/sfs/airootfs/airootfs.img" "${newroot}" "/"
|
if [[ -f "/run/archiso/sfs/airootfs/airootfs.img" ]]; then
|
||||||
|
_mnt_dmsnapshot "/run/archiso/sfs/airootfs/airootfs.img" "${newroot}" "/"
|
||||||
|
else
|
||||||
|
_mnt_overlayfs "/run/archiso/sfs/airootfs" "${newroot}" "/"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "${copytoram}" == "y" ]]; then
|
if [[ "${copytoram}" == "y" ]]; then
|
||||||
umount /run/archiso/bootmnt
|
umount /run/archiso/bootmnt
|
||||||
|
@ -4,6 +4,7 @@ build() {
|
|||||||
add_module "cdrom"
|
add_module "cdrom"
|
||||||
add_module "loop"
|
add_module "loop"
|
||||||
add_module "dm-snapshot"
|
add_module "dm-snapshot"
|
||||||
|
add_module "overlay"
|
||||||
|
|
||||||
add_runscript
|
add_runscript
|
||||||
|
|
||||||
|
@ -16,6 +16,7 @@ iso_application="Arch Linux Live/Rescue CD"
|
|||||||
install_dir="arch"
|
install_dir="arch"
|
||||||
work_dir="work"
|
work_dir="work"
|
||||||
out_dir="out"
|
out_dir="out"
|
||||||
|
sfs_mode="img"
|
||||||
sfs_comp="xz"
|
sfs_comp="xz"
|
||||||
|
|
||||||
# Show an INFO message
|
# Show an INFO message
|
||||||
@ -87,6 +88,10 @@ _usage ()
|
|||||||
echo " Default: '${work_dir}'"
|
echo " Default: '${work_dir}'"
|
||||||
echo " -o <out_dir> Set the output directory"
|
echo " -o <out_dir> Set the output directory"
|
||||||
echo " Default: '${out_dir}'"
|
echo " Default: '${out_dir}'"
|
||||||
|
echo " -s <sfs_mode> Set SquashFS image mode (img or sfs)"
|
||||||
|
echo " img: prepare airootfs.sfs for dm-snapshot usage"
|
||||||
|
echo " sfs: prepare airootfs.sfs for overlayfs usage"
|
||||||
|
echo " Default: ${sfs_mode}"
|
||||||
echo " -c <comp_type> Set SquashFS compression type (gzip, lzma, lzo, xz)"
|
echo " -c <comp_type> Set SquashFS compression type (gzip, lzma, lzo, xz)"
|
||||||
echo " Default: '${sfs_comp}'"
|
echo " Default: '${sfs_comp}'"
|
||||||
echo " -v Enable verbose output"
|
echo " -v Enable verbose output"
|
||||||
@ -193,8 +198,8 @@ _cleanup () {
|
|||||||
_msg_info "Done!"
|
_msg_info "Done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Makes a filesystem from a source directory.
|
# Makes a ext4 filesystem inside a SquashFS from a source directory.
|
||||||
_mkairootfs () {
|
_mkairootfs_img () {
|
||||||
if [[ ! -e "${work_dir}/airootfs" ]]; then
|
if [[ ! -e "${work_dir}/airootfs" ]]; then
|
||||||
_msg_error "The path '${work_dir}/airootfs' does not exist" 1
|
_msg_error "The path '${work_dir}/airootfs' does not exist" 1
|
||||||
fi
|
fi
|
||||||
@ -224,6 +229,22 @@ _mkairootfs () {
|
|||||||
rm ${work_dir}/airootfs.img
|
rm ${work_dir}/airootfs.img
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Makes a SquashFS filesystem from a source directory.
|
||||||
|
_mkairootfs_sfs () {
|
||||||
|
if [[ ! -e "${work_dir}/airootfs" ]]; then
|
||||||
|
_msg_error "The path '${work_dir}/airootfs' does not exist" 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "${work_dir}/iso/${install_dir}/${arch}"
|
||||||
|
_msg_info "Creating SquashFS image, this may take some time..."
|
||||||
|
if [[ "${quiet}" = "y" ]]; then
|
||||||
|
mksquashfs "${work_dir}/airootfs" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress &> /dev/null
|
||||||
|
else
|
||||||
|
mksquashfs "${work_dir}/airootfs" "${work_dir}/iso/${install_dir}/${arch}/airootfs.sfs" -noappend -comp "${sfs_comp}" -no-progress
|
||||||
|
fi
|
||||||
|
_msg_info "Done!"
|
||||||
|
}
|
||||||
|
|
||||||
_mkchecksum () {
|
_mkchecksum () {
|
||||||
_msg_info "Creating checksum file for self-test..."
|
_msg_info "Creating checksum file for self-test..."
|
||||||
cd "${work_dir}/iso/${install_dir}/${arch}"
|
cd "${work_dir}/iso/${install_dir}/${arch}"
|
||||||
@ -292,7 +313,11 @@ command_prepare () {
|
|||||||
_show_config prepare
|
_show_config prepare
|
||||||
|
|
||||||
_cleanup
|
_cleanup
|
||||||
_mkairootfs
|
if [[ ${sfs_mode} == "sfs" ]]; then
|
||||||
|
_mkairootfs_sfs
|
||||||
|
else
|
||||||
|
_mkairootfs_img
|
||||||
|
fi
|
||||||
_mkchecksum
|
_mkchecksum
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -330,7 +355,7 @@ if [[ ${EUID} -ne 0 ]]; then
|
|||||||
_msg_error "This script must be run as root." 1
|
_msg_error "This script must be run as root." 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
while getopts 'p:r:C:L:P:A:D:w:o:c:vh' arg; do
|
while getopts 'p:r:C:L:P:A:D:w:o:s:c:vh' arg; do
|
||||||
case "${arg}" in
|
case "${arg}" in
|
||||||
p) pkg_list="${pkg_list} ${OPTARG}" ;;
|
p) pkg_list="${pkg_list} ${OPTARG}" ;;
|
||||||
r) run_cmd="${OPTARG}" ;;
|
r) run_cmd="${OPTARG}" ;;
|
||||||
@ -341,6 +366,7 @@ while getopts 'p:r:C:L:P:A:D:w:o:c:vh' arg; do
|
|||||||
D) install_dir="${OPTARG}" ;;
|
D) install_dir="${OPTARG}" ;;
|
||||||
w) work_dir="${OPTARG}" ;;
|
w) work_dir="${OPTARG}" ;;
|
||||||
o) out_dir="${OPTARG}" ;;
|
o) out_dir="${OPTARG}" ;;
|
||||||
|
s) sfs_mode="${OPTARG}" ;;
|
||||||
c) sfs_comp="${OPTARG}" ;;
|
c) sfs_comp="${OPTARG}" ;;
|
||||||
v) quiet="n" ;;
|
v) quiet="n" ;;
|
||||||
h|?) _usage 0 ;;
|
h|?) _usage 0 ;;
|
||||||
|
Loading…
Reference in New Issue
Block a user