From Fedora Project Wiki

(→‎Merge overlay into new image: add code to reload the root filesystem with newly merged 'mirror' image.)
(116 intermediate revisions by 4 users not shown)
Line 5: Line 5:
Fedora has developed [[wikipedia:Live CD|Live CD]] [[wikipedia:Live USB|USB]] DVD images for their GNU/Linux operating system. Since the image file systems are stored in the /LiveOS folder of the image, this is the name we'll use to reference the product.
Fedora has developed [[wikipedia:Live CD|Live CD]] [[wikipedia:Live USB|USB]] DVD images for their GNU/Linux operating system. Since the image file systems are stored in the /LiveOS folder of the image, this is the name we'll use to reference the product.


This page shares some information about the LiveOS design that helps users take better advantage of their disc resources.
This page shares some critical information about the LiveOS design that helps users take better advantage of their more-limited-than-usual filesystem storage resources.
 
{{admon/note|Take note:|It is very easy to get lost and confused while working with the software supporting LiveOS installation and booting.  It helps to recognize that the product was developed first using the Device Mapper snapshot style of overlay for write support on a read-only base filesystem. Later new kernel technologies and application options were grafted into the code, like [https://www.kernel.org/doc/Documentation/device-mapper/thin-provisioning.txt Device Mapper thin provisioning] and yet later [https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt OverlayFS union mounts]. This evolution has produced a classic example of [[wikipedia:Spaghetti_code|Spaghetti code]], where independent technologies and sometimes overlapping configuration options all share a monolithic code base by means of a tangled web of conditional statements and code blocks.
 
Furthermore, all the potential data storage locations, types, & styles multiply the complexity of the subject and code base.
One must be very careful to separate one's thinking about options and features to only those that apply to a particular technology.}}


==References==
==References==


* [http://git.fedorahosted.org/git/?p=hosted/livecd;a=blob;f=tools/livecd-iso-to-disk.sh;hb=HEAD livecd-iso-to-disk] (Usage instructions are on the first pages.)
* ''[https://github.com/livecd-tools/livecd-tools/blob/main/tools/livecd-iso-to-disk.sh livecd-iso-to-disk]'' Usage instructions are on the first pages (or on the [https://github.com/livecd-tools/livecd-tools/blob/main/docs/livecd-iso-to-disk.pod manual page]).
* [https://github.com/dracut-ng/dracut-ng/blob/main/man/dracut.cmdline.7.asc#booting-live-images Booting live images] - from the ''dracut'' initramfs command line manual.
* [[FedoraLiveCD]]
* [[FedoraLiveCD]]
* [[How to create and use a Live CD]]
* [[How to create and use Live USB]]


==Storage==
==Multi Live Image boot installations==
When a Live CD or Live DVD (a LiveOS image on read-only disc media) is booted, temporary storage is prepared for the system in RAM on each boot by [http://git.kernel.org/?p=boot/dracut/dracut.git;a=blob;f=modules.d/90dmsquash-live/dmsquash-live-root.sh;hb=HEAD /sbin/dmsquash-live-root] in initrd0, the initial ram disk filesystem. An in-memory, copy-on-write, system overlay is used (see [[#File Systems|File Systems]] below).
With large capacity USB/SD disc drives readily available, it is convenient to install multiple images on one device.


The Fedora LiveOS system allows for persistent storage in 3 locations:
The {{code|livecd-iso-to-disk --multi}} option allows one to install more than one LiveOS image on a single device. Version 24.2 or greater of {{Package|livecd-tools}} will offer to configure the device bootloader to give a Multi Live Image Boot Menu for the device if the target device contains an existing LiveOS image.


# An all-purpose, persistent overlay - a write-once, fixed-size file space that will save updates and changes to the LiveOS image (Activities, operating system changes, anything written in the LiveOS file space).
The first live image is installed by default in the device's {{code|/LiveOS}} directory. Subsequent images are installed in sister directories with randomly assigned, 4 character names, such as {{code|/sYBm}}The target directory may be optionally specified by the [--livedir <dir>] option of ''livecd-iso-to-disk''.
# Persistent home folder - a re-writable, re-sizable (with difficulty), uncompressed, optionally-encryptable, file space for anything that goes in the user's /home/ folderA persistent home folder is an option that may be selected at the time of installation of the LiveOS image (although with some effort, one could manually create a home.img filesystem in /LiveOS/ and move the /home/ folder to it). This installation option is only available through the script, '[[livecd-iso-to-disk]]'. The Windows and Fedora 'Live USB Creator' installers do not provide this option at present.
# Host device file space - this is the USB stick or SD card file system that is outside of the LiveOS file tree, but which is accessible through the /mnt/live or /run/initramfs/live (since Fedora 17) mount point of a booted LiveOS installation.  There, one finds the boot configuration files and anything else one had on the device before loading the LiveOS image.  One may save files here without consuming the other, limited file spaces. (This file space is limited by the device capacity).


The all-purpose, persistent overlay is needed for operating system changes and updates.
The ''livecd-iso-to-disk'' installation script allows one to install from and to a booted LiveOS device and to select any of the installed images as the source for a new installation by using its directory path as the source parameter, for example, {{code|/run/initramfs/live/sYBm}}.  The booted LiveOS image can be sourced by the source shortcut 'live' and the booted LiveOS device can be targeted by the target shortcut 'live'.


The file systems are prepared on each boot by the [http://git.fedorahosted.org/git/?p=spin-kickstarts.git;a=blob;f=fedora-live-base.ks;hb=HEAD#l63 /etc/rc.d/init.d/livesys script].
==Storage==


===Home filesystem===
When a Live CD or Live DVD (a LiveOS image on read-only disc media) is booted, '''temporary storage''' is prepared for the system in RAM on each boot by [https://github.com/dracut-ng/dracut-ng/blob/main/modules.d/90dmsquash-live/dmsquash-live-root.sh /sbin/dmsquash-live-root] in initrd.img, the initial ramdisk filesystem. By default, a 32 GiB, in-memory, copy-on-write, system overlay in a [[wikipedia:Sparse file|sparse file]] is prepared (see [[#File Systems|File Systems]] below).  The {{Code|rd.live.overlay.size}} kernel command line option may be used to set a different, temporary, overlay size.  Since the temporary overlay is a sparse file in a tmpfs, a large size, even larger than available memory, may be specified and only what is needed will be allocated as needed.
One may find many advantages to installing the LiveOS, with a persistent, home folder (using the --home-size-mb NN --delete-home options), which will hold all the user files and documents one wishes and, perhaps later, throw away&mdash;all without consuming the write-once overlay, which can be consumed very quickly (and overlay file space is not normally reusable).


===Device filesystem===
When the {{Code|rd.live.overlay}} kernel command line option is provided on boot, such as with a Live USB device, the ''dmsquash-live-root.sh'' script will search for a persistent overlay file to use for storage of root filesystem changes. See [https://github.com/dracut-ng/dracut-ng/blob/main/man/dracut.cmdline.7.asc#booting-live-images Booting live images] in the ''dracut'' package.
Additionally, keeping some storage space on the device disc outside of the LiveOS system will let you copy, carry, and delete large resource files, such as image.iso files, or anything you might want to use or share.


===Installation options===
LiveOS device users should take note of their overlay status.  See [[#Overlay allocation status]], below, for a way to monitor overlay consumption to anticipate and avoid overlay Overflow or Invalidation.
Fedora 17 Live Desktop may be installed on a 1 GB USB device using the following options with '''[[livecd-iso-to-disk]]''' (on a single, terminal or console command line, even though the wiki may wrap the following text to accommodate your browser window size):


:{{Code|./livecd-iso-to-disk --reset-mbr --overlay-size-mb '''200''' --home-size-mb '''140''' --delete-home --unencrypted-home /path/to/source/iso/or/device /dev/sd'''?'''1}}
With Fedora 24 (kernel 4.3+), if the overlay storage space is filled, the overlay will enter a 'Overflow' state and the root file system will continue to operate in a read-only mode.  There will not be an explicit warning or signal when this happens, but applications may begin reporting errors due to the restriction.  See the instructions at [[LiveOS image/overlay#Overlay recovery]] for how one may then enlarge and attempt to repair and merge the overlay.


:: where '{{Code|'''?'''}}' in the final parameter represents the target bootable device node, such as {{Code|sd'''b'''1}} or {{Code|sd'''c'''1}}, etc.
:'''Note:''' In systems built before Fedora 24, should the overlay storage space, whether temporary or persistent, be totally consumed, the filesystem will be flagged 'Invalid' and the system will crash with Input/output or Bus errors. Achieving a reboot will require a hard reset since attempting a software initiated reboot on the Invalid filesystem will fail with more Input/output or Bus errors. If such a crash occurs while using temporary storage space for the overlay, a simple reboot will rectify the situation.  With persistent storage, the situation is more dire.  One can attempt to enlarge and repair the overlay using instructions at [[LiveOS image/overlay#Overlay recovery]]. Or one can vacate all changes to the root file system by appending the option {{Code|rd.live.overlay.reset}} (formerly, {{Code|reset_overlay}}) to the kernel command line on boot-up.  A persistent home filesystem, if used, will be unaffected by an overlay reset.


The above configuration would allow space for the home folder, the operating system, and a little on the device root.
===Structure of LiveOS file systems===
Live Operating System, '''LiveOS''', file systems are found within disk image '''.img''' files.


But with a larger capacity device, one may allocate the resources to suit the anticipated use, as described above.
====Live.iso====
If one mounts a Fedora-Workstation-Live.iso file or Live CD, the file system will list folders such as the following:
/EFI
/images
/isolinux
/LiveOS
    |- squashfs.img
   
  (Systems before Fedora 24 also had these files
    |- livecd-iso-to-disk  -  a Bash script for installing the LiveOS image onto a USB device
    |- osmin.img  -  a minimized OS image formerly used to aid installation to a hard disk


==File Systems==
====squashfs.img====
The squashfs.img is a [[wikipedia:SquashFS|SquashFS]] compressed, read-only, file system holding the Fedora operating system root file system inside another /LiveOS folder containing a rootfs.img file.
Mounting the squashfs.img file and listing its file system will show this hierarchy:
/LiveOS
    |- rootfs.img    (This contains a filesystem of type ext4. Before F-24 it was named ext3fs.img.)
Mounting the rootfs.img file will finally reveal the Fedora operating system root file system.
====Live.iso + squashfs.img====
Here is a summary of the whole structure:
'''Fedora-Workstation-Live.iso'''
  ''!(mount)''
  /EFI
  /image
  /isolinux
  /LiveOS
      |- '''squashfs.img'''
            ''!(mount)''
            /LiveOS
                |- '''rootfs.img'''
                    ''!(mount)''
                    /bin -> usr/bin
                    /boot
                    /dev
                    /etc
                    /home
                    /lib -> usr/lib
                    /lib64 -> usr/lib64
                    /lost+found
                    /media
                    /mnt
                    /opt
                    /proc
                    /root
                    /run
                    /sbin -> usr/sbin
                    /srv
                    /sys
                    /tmp
                    /usr
                    /var


The Fedora LiveOS uses the [[wikipedia:Device mapper|Device-mapper]] service of the Linux kernel to manage the file stores on the device.  This is the same service that is used by [[wikipedia:Logical Volume Manager (Linux)|Logical Volume Manager]] to provide disc partition services.
====Installed LiveUSB/SD device====
When the LiveOS image is loaded onto a USB or SD disk, the {{Code|/isolinux}} folder is copied into a {{Code|/syslinux}} folder.


One limitation, mentioned above, is that the LiveOS persistent overlay is a write-once file space.  This is related to its use of ''device mapper'' snapshots to combine a read-only file system image (copied from the compressed SquashFS.img on the read-only LiveCD or installation .iso file) with a [[wikipedia:Copy-on-write|Copy-on-write]] service that tracks only changed blocks of data in the snapshot (overlay) file and then re-referencing file pointers to the updated blocks.<ref>http://people.gnome.org/~markmc/code/merge-dm-snapshot.c</ref><ref>http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=drivers/md/dm-snap-persistent.c;hb=HEAD</ref> Any changes to the operating system files are stored as differences from the base. As such, "deletions" of files are saved as additional difference references, and the originals are hidden.  With this mechanism, physical storage space is consumed in the write-once file space rather than recovered.
If persistence is requested with the {{Code|--overlay-size-mb NNN}} option, a Device-mapper overlay file for the root file system is created in {{Code|/LiveOS}}.


Consumption of the space allocated for persistent storage in the snapshot overlay file may be tracked with the ''device mapper'' {{Code|dmsetup status}} report.
If a separate home file system is requested with the {{Code|--home-size-mb NNN}} option, an ext4 formatted {{Code|'''home.img'''}} file system is created.


Several developments in the LiveOS design may be considered to maximize the endurance of the LiveOS image.
The structure is then as follows:
'''Fedora-Workstation-Live USB/SD device'''
  ''!(mounted on /run/initramfs/live)'' (Before Fedora 17 the mount point is /mnt/live in the root file system.)
  /syslinux
  /LiveOS
      |- '''home.img'''
            ''!(mounted on /home)''      (This occurs during boot up by the /etc/rc.d/init.d/livesys script.)
            /liveuser
                /Desktop
                /Documents
                /Downloads
                ...
            /lost+found
      |- livecd-iso-to-disk
      |- '''overlay-NAME-XXXX-XXXX'''    (Where NAME is the device partition name and XXXX are hex numerals.)
      |- '''squashfs.img'''
            ''!(mount)''                (At boot up by the /usr/sbin/dmsquash-live-root.sh script in the initramfs.)
            /LiveOS
                |- '''rootfs.img'''
                    ''!(mounted on '/')''    (This occurs during boot up by the dmsquash-live-root.sh script.)
                    /bin -> usr/bin
                    /boot
                    /dev
                    /etc
                    /home                (If there is a '''home.img''', then this is its mount point directory.)


===Avoid persistent overlay consumption===
====Uncompressed LiveUSB/SD installation====
If the {{Code|--skipcompress}} option is used during loading with ''livecd-iso-to-disk'', the '''squashfs.img''' compressed image will be expanded.  The structure is then as follows:
'''Fedora-Workstation-Live USB/SD device'''
  ''!(mounted on /run/initramfs/live)''
  /syslinux
  /LiveOS
      |- '''home.img'''
            ''!(mounted on /home)''
            /liveuser
                /...
      |- livecd-iso-to-disk
      |- '''overlay-NAME-XXXX-XXXX'''
      |- '''rootfs.img'''
            ''!(mounted on '/')''         
            /bin -> usr/bin
            /boot
            /dev
            /etc
            /home
            ...


* Use a persistent /home folder (discussed above).
====Flattened squashfs.img====
*: This is a very effective method to avoid consumption and will also make the user files more available for sharing and backup purposes.
For OverlayFS mount overlays, the '''squashfs.img''' structure may also be a direct compression of the root filesystem:
* Move the root user's home to /home/root in a persistent home.img
(Booting this structure is supported in ''dracut'' version 049 available in Fedora 30.)
*: This would avoid some consumption, but would compromise the root user account if there was a boot problem and the /home folder was not mounted.
* Mount more folders onto temporary, in-memory filesystems (like /var/cache/yum, /var/tmp, & /tmp are now).
** /var/lib/NetworkManager (holds a timestamps file that is deleted and refreshed quite often, every 5 minutes)
** /var/log/audit (holds the SELinux audit.log that records a great many file accesses.)
** /var/spool/abrt (holds often large, error reports and core dumps).  Users could be advised to act on any abrt reports in the current session or copy the reports to other permanent storage, such as in /home/ or external storage.
** there may be other good candidates...


===Merge overlay into new image===
squashfs.img          |  SquashFS from LiveCD .iso
    !(mount)
    /bin              |  Live filesystem
    /boot              |
    /dev              |
    ...                |


A new root filesystem image can be constructed by using some Device-mapper tools.
===Persistent storage===


If one has sufficient free disk space available, typically on an attached hard drive, one can copy (and uncompress) the current filesystem to a working folder. (This may require, for example, 4.3 GiB of free space for Fedora 17 Live Desktop.)
The Fedora LiveOS system allows for persistent storage in 3 locations:


Device-mapper's mirror target allows one to create a 'mirror' image of the LiveOS root filesystem (the snapshot based on the SquashFS and overlay device).  The mirror image can be then be recompressed, and if one has an additional 660 MiB or more of free space (depending on how much software or other root filesystem files have been added) on your LiveOS device filesystem (the USB/SD card filesystem), one can delete the old SquashFS image and replace it with the recompressed version.
#* By default, an all-purpose, persistent, Device-mapper snapshot overlay-based file space that saves all updates and changes to the root LiveOS filesystem. This storage '''space is limited''' by its allocate-once, fixed-sized design, and deserves some caution (see [[#File Systems|File Systems]] below).
#* Or an OverlayFS based special mount of the root filesystem invoked by the {{Code|--overlayfs}} option to ''[https://github.com/livecd-tools/livecd-tools/blob/main/docs/livecd-iso-to-disk.pod livecd-iso-to-disk]'' (see '''[https://github.com/dracut-ng/dracut-ng/blob/main/man/dracut.cmdline.7.asc#booting-live-images Booting Live Images]''' and [[#OverlayFS_based_overlay|OverlayFS based overlay]] below).
# Persistent home filesystem - a re-writable, re-sizable (with difficulty), uncompressed, optionally-encryptable, file space for anything that goes in the users /home/ folderA persistent home filesystem is an option that may be selected at the time of installation of the LiveOS image (although with some effort, one could manually create a {{Code|home.img}} filesystem in {{Code|/LiveOS/}} and move the {{Code|/home/}} folder to it). This installation option is only available through the script, ''[[livecd-iso-to-disk]]''. The Windows and Fedora ''Fedora Media Writer/Live USB Creator'' installers do not provide this option at present.
# Host device file space - this is the underlying USB stick or SD card file system that is outside of the LiveOS file tree, but which is accessible through the {{Code|/run/initramfs/live}} or {{Code|/mnt/live}} (before Fedora 17) mount point of a booted LiveOS installation.  There, one finds the boot configuration files and anything else one had on the device before loading the LiveOS image.  One may save files here without consuming the other, limited file spaces. (This file space is limited only by the device capacity).
/run/initramfs/live
                  /LiveOS
                      |- home.img
                      |- livecd-iso-to-disk
                      |- overlay-NAME-XXXX-XXXX
                      |- squashfs.img
                  /syslinux


The snapshot overlay can then be reset before rebooting the LiveOS device.
The all-purpose, persistent overlay is needed for keeping operating system changes and updates between boots.


The following Bash script demonstrates the process, where the {{Code|$1}} parameter is a working folder and {{Code|$2}} is the LiveOS device node name (such as, {{Code|/run/initramfs/livedev}}, for the currently booted LiveOS image, or {{Code|/dev/sdc1}}, for example, for an attached LiveOS device):
The file systems are registered on each boot by the [https://pagure.io/livesys-scripts/blob/main/f/libexec/livesys/livesys-main /usr/libexec/livesys/livesys-main script].
{{admon/warning|Test and practice the following script!|This procedure will delete the LiveOS filesystem before replacing it with a recompressed merged version. Be sure to verify that you will have sufficient space for the replacement before running the full script.  (You could comment out the deletion, and squash into a directory on a large working drive to determine the new filesystem size.)}}
<pre>
#!/bin/bash


set -o errexit
===Home filesystem===
set -o pipefail
One may find many advantages to installing the LiveOS, with a persistent, home filesystem (using the {{Code|--home-size-mb NNN}} option), which will hold all the user files and documents one wishes and, perhaps later, throw away&mdash;all without consuming storage space in the overlay, which can be depleted very quickly.


t0=$(date +%s)
===Device filesystem===
Additionally, keeping some storage space on the device disc outside of the LiveOS system will let you copy, carry, and delete large resource files, such as image.iso files, or anything you might want to use or share.


getloopdev () {
===Installation options===
    # Return the loop device associated with a backing file.
Fedora 24 Live Workstation may be installed on a 2 GB USB device using the following options with '''''[[livecd-iso-to-disk]]''''' (on a single, terminal or console command line):
    local loopdev=$(losetup -j "$1")
    echo ${loopdev%%:*}
}


TMPDIR=$1
:{{Code|./livecd-iso-to-disk --reset-mbr --overlay-size-mb '''300''' --home-size-mb '''200''' --unencrypted-home /path/to/source/iso/or/device /dev/sd'''?'''1}}
[[ ! -d $TMPDIR/LiveOS ]] && mkdir $TMPDIR/LiveOS 2>/dev/null


# Mount the source device and SquashFS.
:: where '{{Code|'''?'''}}' in the final parameter represents the target bootable device node, such as {{Code|sd'''b'''1}} or {{Code|sd'''c'''1}}, etc.
SRCMNT=$(mktemp -d /media/XXXXXX)
mount $2 $SRCMNT


# >= Fedora 17
The above configuration would allow space for the home folder, the operating system, and a minimal amount on the device root.
LiveOSMNT=/run/initramfs/live
# < Fedora 17
[[ -d /mnt/live/LiveOS ]] && LiveOSMNT=/mnt/live


if [[ -e $SRCMNT/LiveOS/squashfs.img ]]; then
But with a larger capacity device, one may allocate the resources to suit the anticipated use, as described above.
    SQUASHMNT=$(mktemp -d /media/XXXXXX)
    mount $SRCMNT/LiveOS/squashfs.img $SQUASHMNT --read-only
    ORIGFS=$SQUASHMNT/LiveOS/ext3fs.img
else
    ORIGFS=$SRCMNT/LiveOS/ext3fs.img
fi


# Prepare temporary devices for the Device-mapper mirror target.
==File Systems==
FSTYPE=$(blkid -s TYPE -o value $ORIGFS || :)
{{admon/note|Take note:|It is important to realize that because the LiveOS root filesystem normally resides in a compressed SquashFS image, the standard estimates of free disc space, such as those reported by {{Code|df}} and graphical file managers, will report '''"apparent" file space''' (as if the filesystem were not compressed), thus, such estimates are usually '''vast overestimates of the actual free space''' physically available to the root filesystem.  The embedded rootfs.img filesystem partition is often sized to just fit the distributed operating system at the time of its creation.
FSLABEL=$(blkid -s LABEL -o value $ORIGFS || :)
: For example, the Fedora-Workstation-Live-x86_64-28-1.1.iso contains an apparent 6.4 GiB ext4 root filesystem that has been sparsed and compressed into under 1.6 GiB of actual disc space in the .iso file (or on a LiveOS installed device file system).  {{Code|df -h}} on an untouched mounting of the root filesystem will report that 4.9G is used and 1.5G is available space out of a total size of 6.4G.
stinfo=($(stat -c '%b %B %o' $ORIGFS || :))
The actually available and allocated physical disc space for the root filesystem is determined by the size of the ''device-mapper'' overlay file and can only be queried by the {{Code|dmsetup status}} command (see below).
BLOCKS=${stinfo[0]}
: For example, one may add, and then delete, a large file in the root filesystem and see (the apparent virtual) used space go up, and then down, when checking with {{Code|df}}, but the {{Code|dmsetup status live-rw}} allocation report will only ever show an increase&mdash;even though allocated overlay sectors are available for reuse if an added file has been deleted (see discussion below).}}
BLOCKSZ=${stinfo[1]}
Fedora LiveOS uses the [[wikipedia:Device mapper|Device-mapper]] service of the Linux kernel to manage the file stores on the device.  This is the same service that is used by [[wikipedia:Logical Volume Manager (Linux)|Logical Volume Manager]] to provide disc partition services.
IOBLKSZ=${stinfo[2]}


NEWFS=$TMPDIR/LiveOS/ext3fs.img
===Overlay allocation status===
dd if=/dev/null of=$NEWFS count=1 bs=$BLOCKSZ seek=$BLOCKS
One critical limitation, mentioned above, is that the LiveOS persistent overlay is an allocate-once, fixed size, file space. This is related to its use of ''device mapper'' snapshots to combine a read-only file system image (copied from the compressed SquashFS.img on the read-only LiveCD or installation .iso file) with a [[wikipedia:Copy-on-write|Copy-on-write]] service that tracks only changed blocks of data in the snapshot (overlay) file and then re-referencing file pointers to the updated blocks.<ref>http://people.gnome.org/~markmc/code/merge-dm-snapshot.c</ref><ref>http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=blob;f=drivers/md/dm-snap-persistent.c;hb=HEAD</ref> Only changed sectors in files are stored in the overlay.  "Deletions" of any original files in the base filesystem are recorded by changes in the index metadata so that the original file blocks are hidden.  With this mechanism, no physical storage space of the read-only, base filesystem can be reused. The apparent free space in the virtual root filesystem as reported by the {{Code|df}} command will increase, but this additional space is not physically available; however, when a new or changed file is deleted, the new or changed sectors only (in the overlay) are available for reuse, but, unfortunately, the count of allocated sectors does not change, so one cannot be certain of the availability of free physical space after arbitrary changes to the root filesystem.
mkfs.$FSTYPE -F -L $FSLABEL -m 1 -b $IOBLKSZ $NEWFS
tune2fs -c0 -i0 -Odir_index -ouser_xattr,acl $NEWFS
NEWFSDEV=$(losetup -f --show $NEWFS)


roORIGFSDEV=$(losetup -f --show $ORIGFS --read-only)
With Fedora 24 (kernel 4.3+), if the overlay storage space is filled, the overlay will enter an 'Overflow' state and the root file system will continue to operate in a read-only mode.  See the instructions at [[LiveOS image/overlay]] for how one may then enlarge and attempt to repair and merge the overlay.
OVERLAY=/LiveOS/$(basename $SRCMNT/LiveOS/overlay-*)
OVDEV=$(losetup -f --show $SRCMNT$OVERLAY --read-only)


dmsetup create ori --readonly <<< "0 $BLOCKS snapshot $roORIGFSDEV $OVDEV P 8"
The status of the space allocated for persistent storage in the snapshot overlay file may be tracked with the ''device mapper'' {{Code|dmsetup status}} report.
# Invoke mirror target device.
mirror="0 $BLOCKS mirror core 2 32 sync 2 /dev/mapper/ori 0 $NEWFSDEV 0"
dmsetup create mir <<< "$mirror"


# Wait for mirror completion.
For example, {{Code|dmsetup status live-rw}} may return
while state=$(dmsetup status mir)
state=${state#*mirror 2 * * }
alloc=${state%/*}
size=${state#*/}
size=${size%% *}
[[ $alloc != $size ]]; do
    percent=$(dc <<< "8k 10 0.05 100 $alloc $size /*+*p")
    percent=$(dc <<< "1k $percent 10 /p")
    printf '\r  Mirroring %5.1f %% complete.  ' $percent
    printf '\b|'
    sleep 0.5
    printf '\b/'
    sleep 0.5
    printf '\b-'
    sleep 0.5
    printf '\b\'
    sleep 0.5
done
printf '\r  Mirroring 100 %% complete.    \n'


# Remove outdated osmin.img.
live-rw: 0 8388608 snapshot 42296/1048576 176
if [[ -e $SRCMNT/LiveOS/osmin.img ]]; then
    dmsetup remove live-osimg-min
    losetup -d $(getloopdev /osmin)
    losetup -d $(getloopdev '/osmin.img (deleted)')
    rm $SRCMNT/LiveOS/osmin.img
fi


# Clean up.
where the fraction after {{command|snapshot}} is the number of 512-byte sectors allocated in the overlay over the total number available in the overlay. (The final number is the metadata sectors allocated, and the number before {{command|snapshot}} is the apparent size of the virtual filesystem.)
dmsetup remove mir ori
sync


dt=$(($(date +%s)-t0))
: (For systems built before Fedora 24 that exhaust the overlay to an 'Invalid' state, last-ditch [[LiveOS image/overlay#Overlay recovery|recovery of a persistent overlay]] for the failed root filesystem may be attempted from a separate boot of a working system.)
h=$((dt/3600))
m=$((dt%3600/60))
s=$((dt%60))
printf '\nTime elaspsed: %02d:%02d:%02d hh:mm:ss\n' $h $m $s


# Replace SquashFS or uncompressed root filesystem image.
===OverlayFS based overlay===
if [[ -e $SRCMNT/LiveOS/squashfs.img ]]; then
When installation of large software packages is expected or long-term usage of a LiveOS image is anticipated, an alternate overlay strategy is advised. If storage or memory resources are available, one may take advantage of the {{Code|--overlayfs}} option to ''[https://github.com/livecd-tools/livecd-tools/blob/main/docs/livecd-iso-to-disk.pod livecd-iso-to-disk]''. This option applies a specialized OverlayFS mount to the root filesystem, which allows one to escape from the limitation of the partition size of the embedded rootfs.img (see '''[https://github.com/dracut-ng/dracut-ng/blob/main/man/dracut.cmdline.7.asc#booting-live-images Booting Live Images]''').
    umount -l $SQUASHMNT
    rm $SRCMNT/LiveOS/squashfs.img
    mksquashfs $TMPDIR/LiveOS $SRCMNT/LiveOS/squashfs.img -comp xz -keep-as-directory
else
    if [[ -x /usr/bin/rsync ]]; then
        rsync --inplace --progress $NEWFS $SRCMNT/LiveOS
    else
        cp $NEWFS $SRCMNT/LiveOS
    fi
fi


# Clean up.
Another option for non-persistent storage is to use the {{Code|rd.writable.fsimg}} (see also [https://github.com/dracut-ng/dracut-ng/blob/main/man/dracut.cmdline.7.asc#booting-live-images Booting Live Images]).
losetup -d $OVDEV $NEWFSDEV $roORIGFSDEV
origOVDEV=$(getloopdev $OVERLAY)
OVDEV=$(losetup -f --show $SRCMNT$OVERLAY)


# Reset overlay.
===Flash-Friendly File System (F2FS)===
dd if=/dev/zero of=$OVDEV bs=64k count=1 conv=notrunc,fsync


# If we are processing a booted LiveOS device's root filesystem, then
An update to ''[https://github.com/livecd-tools/livecd-tools/pull/176 livecd-iso-to-disk]'' has enabled the formatting and booting of a LiveUSB device with the [[wikipedia:F2FS|Flash-Friendly File System]].  The package {{Package|f2fs-tools}} must be installed in order to format and check F2FS filesystems for errors.  It is not needed to read or write data from or to existing F2FS filesystems.
if [[ $(mountpoint -x $2) == $(mountpoint -dq $LiveOSMNT) ]]; then
    # The new merged filesystem will be made active.
    origSQUASHDEV=$(blkid -o device -t TYPE=squashfs)
    origFSDEV=$(dmsetup table live-rw)
    origFSDEV=${origFSDEV#*:}
    origFSDEV=/dev/loop${origFSDEV%% *}
    if [[ -e $SRCMNT/LiveOS/squashfs.img ]]; then
        mount $SRCMNT/LiveOS/squashfs.img $SQUASHMNT --read-only
        NEWFS=$SQUASHMNT/LiveOS/ext3fs.img
    else
        NEWFS=$SRCMNT/LiveOS/ext3fs.img
    fi
    NEWFSDEV=$(losetup -f --show $NEWFS)
    sync
    echo 3 > /proc/sys/vm/drop_caches
    dmsetup suspend live-rw
    dmsetup reload live-rw <<< "0 $BLOCKS snapshot $NEWFSDEV $OVDEV P 8"
    dmsetup resume live-rw
    losetup -d $origOVDEV
    losetup -d $origFSDEV
    losetup -d $origSQUASHDEV
else
    losetup -d $OVDEV
fi


# Clean up.
There are currently a few booting issues to appreciate when choosing this format:
umount -l $SRCMNT
# SYSLINUX-EXTLINUX does not support F2FS booting.
rmdir $SRCMNT
# Stock Fedora images have not included an F2FS module in their GNU GRUB EFI binaries until Fedora 35 Rawhide in June 2021.
dt=$(($(date +%s)-t0))
# GRUB's F2FS module has not been updated to read systems formatted with the extra_attr, compression, and perhaps other newer features.  See this [https://savannah.gnu.org/bugs/?59976 bug report].
h=$((dt/3600))
m=$((dt%3600/60))
s=$((dt%60))
printf '\nTotal time elaspsed: %02d:%02d:%02d hh:mm:ss\n' $h $m $s
</pre>


The Device-mapper snapshot-merge target also allows one to merge changes in a persistent snapshot into the original filesystem (See notes from [[{{TALKPAGENAMEE}}|Andrew Gilmore]]).
The second issue can be addressed by building a GRUB EFI boot loader binary that includes the F2FS module. The subpackage {{code|grub2-efi-x64-modules}} to {{Package|grub2}} can be installed and {{Code|grub2-mkimage}} can be called with the appropriate options for the x86_64 architecture. Other architectures would require additional building.
{| class="collapsible collapsed"
|-
! Merge overlay with snapshot-merge
|-
|<pre>#!/bin/bash
t0=$(date +%s)


# Prepare working directory.
The third issue can be addressed by bypassing GRUB and using {{Package|dracut}} with its {{code|--UEFI}} option to build an [https://www.kernel.org/doc/html/latest/admin-guide/efi-stub.html EFI Boot Stub], which serves as a boot loader.  ''objcopy'', in the dependency package {{Package|binutils}}, is required on the host for this solution.
TMPDIR=$1
:An EFI Boot Stub boot loader is somewhat less convenient than GRUB because altering or entering kernel command line options requires rebuilding the EFI Boot Stub or employing {{Package|efibootmgr}} with its -@ | --append-binary-args option on each system rather than within a configuration file in the image for use by any system booting the LiveUSB device.
mkdir $TMPDIR/LiveOS 2>/dev/null
:If the extra_attr, compression, or another newer feature of F2FS is significant for a particular use, then an EFI Boot Stub may be a reasonable compromise in convenience for the benefit of utility.


# Mount source device, SquashFS, if needed.
The ''livecd-iso-to-disk'' script will test for the availability of the x86_64 architecture dependencies and guide the user to formatting and configuring a Fedora image to boot from an F2FS-formatted LiveUSB device.
SRCMNT=$(mktemp -d /media/XXXXXX)
mount $2 $SRCMNT
if [[ -e $SRCMNT/LiveOS/squashfs.img ]]; then
    SQUASHMNT=$(mktemp -d /media/XXXXXX)
    mount $SRCMNT/LiveOS/squashfs.img $SQUASHMNT --read-only
    ORIGFS=$SQUASHMNT/LiveOS/ext3fs.img
else
    ORIGFS=$SRCMNT/LiveOS/ext3fs.img
fi
NEWFS=$TMPDIR/LiveOS/ext3fs.img


printf '\nCopying original root filesystem.\n'
==Kernel updates for images with a persistent overlay==
if [[ -x /usr/bin/rsync ]]; then
If you have sufficient overlay space to accommodate a kernel update on a Live USB installation, the kernel and initramfs will be installed to the /boot directory. To put these into service they must be moved to the /syslinux directory of the installation partition. This is accessible from the running Live USB filesystem at the /run/initramfs/live mount point. The new initramfs (such as initramfs-4.17.7-200.fc28.x86_64.img) and kernel (such as vmlinuz-4.17.7-200.fc28.x86_64) should be moved to replace the /run/initramfs/live/syslinux/initrd.img and /run/initramfs/live/syslinux/vmlinuz files, respectively.
    rsync --inplace --progress $ORIGFS $NEWFS
else
    cp $ORIGFS $NEWFS
fi


# Prepare temporary devices for Device-mapper snapshot-merge.
'''Note:''' The initial RAM filesystem builder, dracut, no longer includes the dmsquash-live module by default. Starting with Fedora 19, dracut defaults to the hostonly="yes" option, which itself precludes the dmsquash-live module.
BLOCKS=$(stat -c '%b' $ORIGFS || :)
The following command will show what arguments were used in building a given initialramfs:
NEWFSDEV=$(losetup -f --show $NEWFS)
<pre>
OVDEV=$(losetup -f --show $SRCMNT/LiveOS/overlay-*)
lsinitrd <path to initrd.img file> usr/lib/dracut/build-parameter.txt
</pre>
For Fedora-Workstation-Live-x86_64-39-1.5.iso the arguments are
<pre>
--nomdadmconf --nolvmconf --xz --add 'livenet dmsquash-live dmsquash-live-ntfs convertfs pollcdrom qemu qemu-net' --no-hostonly --debug --no-early-microcode --force
</pre>


# Invoke snapshot-merge target device.
So, one can add a dracut config file, as root, before updating the kernel (or rebuild the initialramfs by calling dracut):
dmsetup create merge <<< "0 $BLOCKS snapshot-merge $NEWFSDEV $OVDEV P 8"
<pre>
 
echo 'mdadmconf="no"
# Wait for merge completion.
lvmconf="no"
while state=$(dmsetup status merge)
squash_compress="xz"
state=${state#*snapshot-merge }
add_dracutmodules+=" livenet dmsquash-live dmsquash-live-ntfs convertfs pollcdrom qemu qemu-net "
meta=${state#* }
hostonly="no"
alloc=${state%/*}
early_microcode="no"
[[ $alloc != $meta ]]; do
' > /etc/dracut.conf.d/01-liveos.conf
    printf '/'
</pre>
    sleep 0.5
    printf '\b-'
    sleep 0.5
    printf '\b\'
    sleep 0.5
    printf '\b|'
    sleep 0.5
done
printf '\n'
 
# Clean up from merge.
dmsetup remove merge
sync
 
dt=$(($(date +%s)-t0))
h=$((dt/3600))
m=$((dt%3600/60))
s=$((dt%60))
printf '\nTime elaspsed: %02d:%02d:%02d hh:mm:ss\n' $h $m $s
 
# Replace original image
if [[ -e $SRCMNT/LiveOS/squashfs.img ]]; then
    umount $SQUASHMNT
    rmdir $SQUASHMNT
    rm $SRCMNT/LiveOS/squashfs.img
    mksquashfs $TMPDIR/LiveOS $SRCMNT/LiveOS/squashfs.img -comp xz -keep-as-directory
else
    if [[ -x /usr/bin/rsync ]]; then
        rsync --inplace --progress $NEWFS $SRCMNT/LiveOS
    else
        cp $NEWFS $SRCMNT/LiveOS
    fi
fi
 
# Reset overlay.
dd if=/dev/zero of=$OVDEV bs=64k count=1 conv=notrunc,fsync
 
# Clean up.
sleep 2
losetup -d $OVDEV $NEWFSDEV
sleep 2
umount $SRCMNT
rmdir $SRCMNT
 
dt=$(($(date +%s)-t0))
h=$((dt/3600))
m=$((dt%3600/60))
s=$((dt%60))
printf '\nTotal time elaspsed: %02d:%02d:%02d hh:mm:ss\n' $h $m $s</pre>
|}
The mirror method copies and merges in one pass, while the snapshot-merge method copies the original filesystem first and then merges in the changes. I've found the mirror method to be about 15% faster.
 
===Overlay recovery===
{{admon/warning|Test and practice the following|This procedure is not thoroughly validated, and may destroy your data.}}
If one 'exhausts' the limited storage capacity of a LiveOS overlay, Device-mapper will mark the filesystem as 'Invalid', as shown by the {{Code|dmsetup status}} command executed in Terminal or a console (if you haven't crashed):
# dmsetup status
live-osimg-min: 0 8388608 snapshot 2464/2464 24
live-rw: 0 8388608 snapshot Invalid
The invalid bit is 00 at byte 5 of the overlay.  You might try to recover the overlay by switching it to 01 with the following command line:
# echo $'\x01' | dd of=/path/to/overlay-file bs=1 count=1 seek=4 conv=notrunc
where /path/to/overlay may be /mnt/live/LiveOS/overlay-devicename-discUUID or<br>/media/devicename/LiveOS/overlay-devicename-discUUID for an attached device.
 
Follow this by registering the LiveOS image with Device-mapper:
# mount /media/devicename/LiveOS/squashfs.img /mnt/some_mountpoint
# losetup /dev/loop1 /mnt/some_mountpoint/LiveOS/ext3fs.img -r
# losetup /dev/loop2 /media/devicename/LiveOS/overlay-devicename-discUUID
# dmsetup create devicename --table "0 8388608 snapshot 7:1 7:2 P 8"
* devicename in the last line may be any string.
* loop1 and loop2 (and the corresponding 7:1 7:2) may be any free loop devices; just substitute the appropriate numbers.
* 8388608 is the size of the ext3fs.img file in 512 byte units.  This can be read by the following command:
# blockdev -q --getsz /dev/loop1
Execute
# dmsetup status
to check the the virtual filesystem has been configured.
 
Then try to repair any damage with the following command:
# e2fsck -f -y /dev/mapper/devicename
where devicename is the string you used in the dmsetup create command.
 
Run a second check,
# e2fsck -p /dev/mapper/devicename
to verify if the filesystem could be repaired.
At this point you will want to enlarge the overlay, or backup or rebuild the image.


Remove the virtual filesystem registration,
===Refresh kernel and initial RAM filesystem with editliveos===
# dmsetup remove devicename
[https://github.com/livecd-tools/livecd-tools/pull/214 This update to editliveos] available in version 30+ of the {{Package|livecd-tools}} package will detect when a new kernel has been installed, build a new initrd.img, and copy these to the appropriate directories of a refreshable Live USB installation and the new .iso image distribution file. Save the above {{Code|/etc/dracut.conf.d/01-liveos.conf}} to your host computer before running editliveos. (A future version of editliveos will automatically mimic the configuration in the existing initrd.img.)
Determine the size of the overlay file:
# blockdev -q --getsz /dev/loop2
# losetup -d /dev/loop2
# losetup -d /dev/loop1
  # dd if=/dev/zero of=/path/to/overlay-file seek=overlay_size count=size_increase
where overlay_size and size_increase are now 512 byte units.


Once you have a working filesystem, you should proceed to merge your overlay into the original filesystem as describe [[#Image recompression and overlay refreshment|above]].
==References==
==References==
<references />
<references />
:: See this [http://thread.gmane.org/gmane.linux.kernel.device-mapper.devel/14644 dm-devel thread].
:: See this [https://dm-devel.redhat.narkive.com/T17cpxYK/persistent-overlay-cow-full-flipped-the-invalid-bit-in-a-hexdump-how-do-i-grow-it-now dm-devel thread].
* [[LiveOS image/overlay]]

Revision as of 13:59, 10 May 2024


Introduction

Fedora has developed Live CD USB DVD images for their GNU/Linux operating system. Since the image file systems are stored in the /LiveOS folder of the image, this is the name we'll use to reference the product.

This page shares some critical information about the LiveOS design that helps users take better advantage of their more-limited-than-usual filesystem storage resources.

Take note:
It is very easy to get lost and confused while working with the software supporting LiveOS installation and booting. It helps to recognize that the product was developed first using the Device Mapper snapshot style of overlay for write support on a read-only base filesystem. Later new kernel technologies and application options were grafted into the code, like Device Mapper thin provisioning and yet later OverlayFS union mounts. This evolution has produced a classic example of Spaghetti code, where independent technologies and sometimes overlapping configuration options all share a monolithic code base by means of a tangled web of conditional statements and code blocks.

Furthermore, all the potential data storage locations, types, & styles multiply the complexity of the subject and code base.

One must be very careful to separate one's thinking about options and features to only those that apply to a particular technology.

References

Multi Live Image boot installations

With large capacity USB/SD disc drives readily available, it is convenient to install multiple images on one device.

The livecd-iso-to-disk --multi option allows one to install more than one LiveOS image on a single device. Version 24.2 or greater of livecd-tools will offer to configure the device bootloader to give a Multi Live Image Boot Menu for the device if the target device contains an existing LiveOS image.

The first live image is installed by default in the device's /LiveOS directory. Subsequent images are installed in sister directories with randomly assigned, 4 character names, such as /sYBm. The target directory may be optionally specified by the [--livedir <dir>] option of livecd-iso-to-disk.

The livecd-iso-to-disk installation script allows one to install from and to a booted LiveOS device and to select any of the installed images as the source for a new installation by using its directory path as the source parameter, for example, /run/initramfs/live/sYBm. The booted LiveOS image can be sourced by the source shortcut 'live' and the booted LiveOS device can be targeted by the target shortcut 'live'.

Storage

When a Live CD or Live DVD (a LiveOS image on read-only disc media) is booted, temporary storage is prepared for the system in RAM on each boot by /sbin/dmsquash-live-root in initrd.img, the initial ramdisk filesystem. By default, a 32 GiB, in-memory, copy-on-write, system overlay in a sparse file is prepared (see File Systems below). The rd.live.overlay.size kernel command line option may be used to set a different, temporary, overlay size. Since the temporary overlay is a sparse file in a tmpfs, a large size, even larger than available memory, may be specified and only what is needed will be allocated as needed.

When the rd.live.overlay kernel command line option is provided on boot, such as with a Live USB device, the dmsquash-live-root.sh script will search for a persistent overlay file to use for storage of root filesystem changes. See Booting live images in the dracut package.

LiveOS device users should take note of their overlay status. See #Overlay allocation status, below, for a way to monitor overlay consumption to anticipate and avoid overlay Overflow or Invalidation.

With Fedora 24 (kernel 4.3+), if the overlay storage space is filled, the overlay will enter a 'Overflow' state and the root file system will continue to operate in a read-only mode. There will not be an explicit warning or signal when this happens, but applications may begin reporting errors due to the restriction. See the instructions at LiveOS image/overlay#Overlay recovery for how one may then enlarge and attempt to repair and merge the overlay.

Note: In systems built before Fedora 24, should the overlay storage space, whether temporary or persistent, be totally consumed, the filesystem will be flagged 'Invalid' and the system will crash with Input/output or Bus errors. Achieving a reboot will require a hard reset since attempting a software initiated reboot on the Invalid filesystem will fail with more Input/output or Bus errors. If such a crash occurs while using temporary storage space for the overlay, a simple reboot will rectify the situation. With persistent storage, the situation is more dire. One can attempt to enlarge and repair the overlay using instructions at LiveOS image/overlay#Overlay recovery. Or one can vacate all changes to the root file system by appending the option rd.live.overlay.reset (formerly, reset_overlay) to the kernel command line on boot-up. A persistent home filesystem, if used, will be unaffected by an overlay reset.

Structure of LiveOS file systems

Live Operating System, LiveOS, file systems are found within disk image .img files.

Live.iso

If one mounts a Fedora-Workstation-Live.iso file or Live CD, the file system will list folders such as the following:

/EFI
/images
/isolinux
/LiveOS
    |- squashfs.img
    
  (Systems before Fedora 24 also had these files
    |- livecd-iso-to-disk  -  a Bash script for installing the LiveOS image onto a USB device
    |- osmin.img  -  a minimized OS image formerly used to aid installation to a hard disk

squashfs.img

The squashfs.img is a SquashFS compressed, read-only, file system holding the Fedora operating system root file system inside another /LiveOS folder containing a rootfs.img file. Mounting the squashfs.img file and listing its file system will show this hierarchy:

/LiveOS
    |- rootfs.img    (This contains a filesystem of type ext4. Before F-24 it was named ext3fs.img.)

Mounting the rootfs.img file will finally reveal the Fedora operating system root file system.

Live.iso + squashfs.img

Here is a summary of the whole structure:

Fedora-Workstation-Live.iso
  !(mount)
  /EFI
  /image
  /isolinux
  /LiveOS
      |- squashfs.img
           !(mount)
           /LiveOS
               |- rootfs.img
                    !(mount)
                    /bin -> usr/bin
                    /boot
                    /dev
                    /etc
                    /home
                    /lib -> usr/lib
                    /lib64 -> usr/lib64
                    /lost+found
                    /media
                    /mnt
                    /opt
                    /proc
                    /root
                    /run
                    /sbin -> usr/sbin
                    /srv
                    /sys
                    /tmp
                    /usr
                    /var

Installed LiveUSB/SD device

When the LiveOS image is loaded onto a USB or SD disk, the /isolinux folder is copied into a /syslinux folder.

If persistence is requested with the --overlay-size-mb NNN option, a Device-mapper overlay file for the root file system is created in /LiveOS.

If a separate home file system is requested with the --home-size-mb NNN option, an ext4 formatted home.img file system is created.

The structure is then as follows:

Fedora-Workstation-Live USB/SD device
  !(mounted on /run/initramfs/live) (Before Fedora 17 the mount point is /mnt/live in the root file system.)
  /syslinux
  /LiveOS
      |- home.img
           !(mounted on /home)      (This occurs during boot up by the /etc/rc.d/init.d/livesys script.)
           /liveuser
               /Desktop
               /Documents
               /Downloads
               ...
           /lost+found
      |- livecd-iso-to-disk
      |- overlay-NAME-XXXX-XXXX     (Where NAME is the device partition name and XXXX are hex numerals.)
      |- squashfs.img
           !(mount)                 (At boot up by the /usr/sbin/dmsquash-live-root.sh script in the initramfs.)
           /LiveOS
               |- rootfs.img
                    !(mounted on '/')    (This occurs during boot up by the dmsquash-live-root.sh script.)
                    /bin -> usr/bin
                    /boot
                    /dev
                    /etc
                    /home                (If there is a home.img, then this is its mount point directory.)

Uncompressed LiveUSB/SD installation

If the --skipcompress option is used during loading with livecd-iso-to-disk, the squashfs.img compressed image will be expanded. The structure is then as follows:

Fedora-Workstation-Live USB/SD device
  !(mounted on /run/initramfs/live)
  /syslinux
  /LiveOS
      |- home.img
           !(mounted on /home)
           /liveuser
               /...
      |- livecd-iso-to-disk
      |- overlay-NAME-XXXX-XXXX
      |- rootfs.img
           !(mounted on '/')          
           /bin -> usr/bin
           /boot
           /dev
           /etc
           /home
           ...

Flattened squashfs.img

For OverlayFS mount overlays, the squashfs.img structure may also be a direct compression of the root filesystem: (Booting this structure is supported in dracut version 049 available in Fedora 30.)

squashfs.img          |  SquashFS from LiveCD .iso
   !(mount)
   /bin               |  Live filesystem
   /boot              |
   /dev               |
   ...                |

Persistent storage

The Fedora LiveOS system allows for persistent storage in 3 locations:

    • By default, an all-purpose, persistent, Device-mapper snapshot overlay-based file space that saves all updates and changes to the root LiveOS filesystem. This storage space is limited by its allocate-once, fixed-sized design, and deserves some caution (see File Systems below).
    • Or an OverlayFS based special mount of the root filesystem invoked by the --overlayfs option to livecd-iso-to-disk (see Booting Live Images and OverlayFS based overlay below).
  1. Persistent home filesystem - a re-writable, re-sizable (with difficulty), uncompressed, optionally-encryptable, file space for anything that goes in the users /home/ folder. A persistent home filesystem is an option that may be selected at the time of installation of the LiveOS image (although with some effort, one could manually create a home.img filesystem in /LiveOS/ and move the /home/ folder to it). This installation option is only available through the script, livecd-iso-to-disk. The Windows and Fedora Fedora Media Writer/Live USB Creator installers do not provide this option at present.
  2. Host device file space - this is the underlying USB stick or SD card file system that is outside of the LiveOS file tree, but which is accessible through the /run/initramfs/live or /mnt/live (before Fedora 17) mount point of a booted LiveOS installation. There, one finds the boot configuration files and anything else one had on the device before loading the LiveOS image. One may save files here without consuming the other, limited file spaces. (This file space is limited only by the device capacity).
/run/initramfs/live
                  /LiveOS
                      |- home.img
                      |- livecd-iso-to-disk
                      |- overlay-NAME-XXXX-XXXX
                      |- squashfs.img
                  /syslinux

The all-purpose, persistent overlay is needed for keeping operating system changes and updates between boots.

The file systems are registered on each boot by the /usr/libexec/livesys/livesys-main script.

Home filesystem

One may find many advantages to installing the LiveOS, with a persistent, home filesystem (using the --home-size-mb NNN option), which will hold all the user files and documents one wishes and, perhaps later, throw away—all without consuming storage space in the overlay, which can be depleted very quickly.

Device filesystem

Additionally, keeping some storage space on the device disc outside of the LiveOS system will let you copy, carry, and delete large resource files, such as image.iso files, or anything you might want to use or share.

Installation options

Fedora 24 Live Workstation may be installed on a 2 GB USB device using the following options with livecd-iso-to-disk (on a single, terminal or console command line):

./livecd-iso-to-disk --reset-mbr --overlay-size-mb 300 --home-size-mb 200 --unencrypted-home /path/to/source/iso/or/device /dev/sd?1
where '?' in the final parameter represents the target bootable device node, such as sdb1 or sdc1, etc.

The above configuration would allow space for the home folder, the operating system, and a minimal amount on the device root.

But with a larger capacity device, one may allocate the resources to suit the anticipated use, as described above.

File Systems

Take note:
It is important to realize that because the LiveOS root filesystem normally resides in a compressed SquashFS image, the standard estimates of free disc space, such as those reported by df and graphical file managers, will report "apparent" file space (as if the filesystem were not compressed), thus, such estimates are usually vast overestimates of the actual free space physically available to the root filesystem. The embedded rootfs.img filesystem partition is often sized to just fit the distributed operating system at the time of its creation.
For example, the Fedora-Workstation-Live-x86_64-28-1.1.iso contains an apparent 6.4 GiB ext4 root filesystem that has been sparsed and compressed into under 1.6 GiB of actual disc space in the .iso file (or on a LiveOS installed device file system). df -h on an untouched mounting of the root filesystem will report that 4.9G is used and 1.5G is available space out of a total size of 6.4G.

The actually available and allocated physical disc space for the root filesystem is determined by the size of the device-mapper overlay file and can only be queried by the dmsetup status command (see below).

For example, one may add, and then delete, a large file in the root filesystem and see (the apparent virtual) used space go up, and then down, when checking with df, but the dmsetup status live-rw allocation report will only ever show an increase—even though allocated overlay sectors are available for reuse if an added file has been deleted (see discussion below).

Fedora LiveOS uses the Device-mapper service of the Linux kernel to manage the file stores on the device. This is the same service that is used by Logical Volume Manager to provide disc partition services.

Overlay allocation status

One critical limitation, mentioned above, is that the LiveOS persistent overlay is an allocate-once, fixed size, file space. This is related to its use of device mapper snapshots to combine a read-only file system image (copied from the compressed SquashFS.img on the read-only LiveCD or installation .iso file) with a Copy-on-write service that tracks only changed blocks of data in the snapshot (overlay) file and then re-referencing file pointers to the updated blocks.[1][2] Only changed sectors in files are stored in the overlay. "Deletions" of any original files in the base filesystem are recorded by changes in the index metadata so that the original file blocks are hidden. With this mechanism, no physical storage space of the read-only, base filesystem can be reused. The apparent free space in the virtual root filesystem as reported by the df command will increase, but this additional space is not physically available; however, when a new or changed file is deleted, the new or changed sectors only (in the overlay) are available for reuse, but, unfortunately, the count of allocated sectors does not change, so one cannot be certain of the availability of free physical space after arbitrary changes to the root filesystem.

With Fedora 24 (kernel 4.3+), if the overlay storage space is filled, the overlay will enter an 'Overflow' state and the root file system will continue to operate in a read-only mode. See the instructions at LiveOS image/overlay for how one may then enlarge and attempt to repair and merge the overlay.

The status of the space allocated for persistent storage in the snapshot overlay file may be tracked with the device mapper dmsetup status report.

For example, dmsetup status live-rw may return

live-rw: 0 8388608 snapshot 42296/1048576 176

where the fraction after snapshot is the number of 512-byte sectors allocated in the overlay over the total number available in the overlay. (The final number is the metadata sectors allocated, and the number before snapshot is the apparent size of the virtual filesystem.)

(For systems built before Fedora 24 that exhaust the overlay to an 'Invalid' state, last-ditch recovery of a persistent overlay for the failed root filesystem may be attempted from a separate boot of a working system.)

OverlayFS based overlay

When installation of large software packages is expected or long-term usage of a LiveOS image is anticipated, an alternate overlay strategy is advised. If storage or memory resources are available, one may take advantage of the --overlayfs option to livecd-iso-to-disk. This option applies a specialized OverlayFS mount to the root filesystem, which allows one to escape from the limitation of the partition size of the embedded rootfs.img (see Booting Live Images).

Another option for non-persistent storage is to use the rd.writable.fsimg (see also Booting Live Images).

Flash-Friendly File System (F2FS)

An update to livecd-iso-to-disk has enabled the formatting and booting of a LiveUSB device with the Flash-Friendly File System. The package f2fs-tools must be installed in order to format and check F2FS filesystems for errors. It is not needed to read or write data from or to existing F2FS filesystems.

There are currently a few booting issues to appreciate when choosing this format:

  1. SYSLINUX-EXTLINUX does not support F2FS booting.
  2. Stock Fedora images have not included an F2FS module in their GNU GRUB EFI binaries until Fedora 35 Rawhide in June 2021.
  3. GRUB's F2FS module has not been updated to read systems formatted with the extra_attr, compression, and perhaps other newer features. See this bug report.

The second issue can be addressed by building a GRUB EFI boot loader binary that includes the F2FS module. The subpackage grub2-efi-x64-modules to grub2 can be installed and grub2-mkimage can be called with the appropriate options for the x86_64 architecture. Other architectures would require additional building.

The third issue can be addressed by bypassing GRUB and using dracut with its --UEFI option to build an EFI Boot Stub, which serves as a boot loader. objcopy, in the dependency package binutils, is required on the host for this solution.

An EFI Boot Stub boot loader is somewhat less convenient than GRUB because altering or entering kernel command line options requires rebuilding the EFI Boot Stub or employing efibootmgr with its -@ | --append-binary-args option on each system rather than within a configuration file in the image for use by any system booting the LiveUSB device.
If the extra_attr, compression, or another newer feature of F2FS is significant for a particular use, then an EFI Boot Stub may be a reasonable compromise in convenience for the benefit of utility.

The livecd-iso-to-disk script will test for the availability of the x86_64 architecture dependencies and guide the user to formatting and configuring a Fedora image to boot from an F2FS-formatted LiveUSB device.

Kernel updates for images with a persistent overlay

If you have sufficient overlay space to accommodate a kernel update on a Live USB installation, the kernel and initramfs will be installed to the /boot directory. To put these into service they must be moved to the /syslinux directory of the installation partition. This is accessible from the running Live USB filesystem at the /run/initramfs/live mount point. The new initramfs (such as initramfs-4.17.7-200.fc28.x86_64.img) and kernel (such as vmlinuz-4.17.7-200.fc28.x86_64) should be moved to replace the /run/initramfs/live/syslinux/initrd.img and /run/initramfs/live/syslinux/vmlinuz files, respectively.

Note: The initial RAM filesystem builder, dracut, no longer includes the dmsquash-live module by default. Starting with Fedora 19, dracut defaults to the hostonly="yes" option, which itself precludes the dmsquash-live module. The following command will show what arguments were used in building a given initialramfs:

lsinitrd <path to initrd.img file> usr/lib/dracut/build-parameter.txt

For Fedora-Workstation-Live-x86_64-39-1.5.iso the arguments are

--nomdadmconf --nolvmconf --xz --add 'livenet dmsquash-live dmsquash-live-ntfs convertfs pollcdrom qemu qemu-net' --no-hostonly --debug --no-early-microcode --force

So, one can add a dracut config file, as root, before updating the kernel (or rebuild the initialramfs by calling dracut):

echo 'mdadmconf="no"
lvmconf="no"
squash_compress="xz"
add_dracutmodules+=" livenet dmsquash-live dmsquash-live-ntfs convertfs pollcdrom qemu qemu-net "
hostonly="no"
early_microcode="no"
' > /etc/dracut.conf.d/01-liveos.conf

Refresh kernel and initial RAM filesystem with editliveos

This update to editliveos available in version 30+ of the livecd-tools package will detect when a new kernel has been installed, build a new initrd.img, and copy these to the appropriate directories of a refreshable Live USB installation and the new .iso image distribution file. Save the above /etc/dracut.conf.d/01-liveos.conf to your host computer before running editliveos. (A future version of editliveos will automatically mimic the configuration in the existing initrd.img.)

References

See this dm-devel thread.