.\" Man page generated from reStructuredText. . . .nr rst2man-indent-level 0 . .de1 rstReportMargin \\$1 \\n[an-margin] level \\n[rst2man-indent-level] level margin: \\n[rst2man-indent\\n[rst2man-indent-level]] - \\n[rst2man-indent0] \\n[rst2man-indent1] \\n[rst2man-indent2] .. .de1 INDENT .\" .rstReportMargin pre: . RS \\$1 . nr rst2man-indent\\n[rst2man-indent-level] \\n[an-margin] . nr rst2man-indent-level +1 .\" .rstReportMargin post: .. .de UNINDENT . RE .\" indent \\n[an-margin] .\" old: \\n[rst2man-indent\\n[rst2man-indent-level]] .nr rst2man-indent-level -1 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]] .in \\n[rst2man-indent\\n[rst2man-indent-level]]u .. .TH "LIVEMEDIA-CREATOR" "1" "Dec 21, 2021" "36.5" "Lorax" .SH NAME livemedia-creator \- Live Media Creator Documentation .INDENT 0.0 .TP .B Authors Brian C. Lane <\fI\%bcl@redhat.com\fP> .UNINDENT .sp livemedia\-creator uses \fI\%Anaconda\fP, \fI\%kickstart\fP and \fI\%Lorax\fP to create bootable media that use the same install path as a normal system installation. It can be used to make live isos, bootable (partitioned) disk images, tarfiles, and filesystem images for use with virtualization and container solutions like libvirt, docker, and OpenStack. .sp The general idea is to use qemu with kickstart and an Anaconda boot.iso to install into a disk image and then use the disk image to create the bootable media. .sp livemedia\-creator \-\-help will describe all of the options available. At the minimum you need: .sp \fB\-\-make\-iso\fP to create a final bootable .iso or one of the other \fB\-\-make\-*\fP options. .sp \fB\-\-iso\fP to specify the Anaconda install media to use with qemu. .sp \fB\-\-ks\fP to select the kickstart file describing what to install. .sp To use livemedia\-creator with virtualization you will need to have qemu installed. .sp If you are going to be using Anaconda directly, with \fB\-\-no\-virt\fP mode, make sure you have the anaconda\-tui package installed. .sp Conventions used in this document: .sp \fBlmc\fP is an abbreviation for livemedia\-creator. .sp \fBbuilder\fP is the system where livemedia\-creator is being run .sp \fBimage\fP is the disk image being created by running livemedia\-creator .SH LIVEMEDIA-CREATOR CMDLINE ARGUMENTS .sp Create Live Install Media .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C usage: livemedia\-creator [\-h] (\-\-make\-iso | \-\-make\-disk | \-\-make\-fsimage | \-\-make\-appliance | \-\-make\-ami | \-\-make\-tar | \-\-make\-tar\-disk | \-\-make\-pxe\-live | \-\-make\-ostree\-live | \-\-make\-oci | \-\-make\-vagrant) [\-\-iso ISO] [\-\-iso\-only] [\-\-iso\-name ISO_NAME] [\-\-ks KS] [\-\-image\-only] [\-\-no\-virt] [\-\-proxy PROXY] [\-\-anaconda\-arg ANACONDA_ARGS] [\-\-armplatform ARMPLATFORM] [\-\-location LOCATION] [\-\-logfile LOGFILE] [\-\-lorax\-templates LORAX_TEMPLATES] [\-\-tmp TMP] [\-\-resultdir RESULT_DIR] [\-\-macboot] [\-\-nomacboot] [\-\-extra\-boot\-args EXTRA_BOOT_ARGS] [\-\-disk\-image DISK_IMAGE] [\-\-keep\-image] [\-\-fs\-image FS_IMAGE] [\-\-image\-name IMAGE_NAME] [\-\-tar\-disk\-name TAR_DISK_NAME] [\-\-fs\-label FS_LABEL] [\-\-image\-size\-align IMAGE_SIZE_ALIGN] [\-\-image\-type IMAGE_TYPE] [\-\-qemu\-arg QEMU_ARGS] [\-\-qcow2] [\-\-qcow2\-arg QEMU_ARGS] [\-\-compression COMPRESSION] [\-\-compress\-arg COMPRESS_ARGS] [\-\-app\-name APP_NAME] [\-\-app\-template APP_TEMPLATE] [\-\-app\-file APP_FILE] [\-\-ram MEMORY] [\-\-vcpus VCPUS] [\-\-vnc VNC] [\-\-arch ARCH] [\-\-kernel\-args KERNEL_ARGS] [\-\-ovmf\-path OVMF_PATH] [\-\-virt\-uefi] [\-\-no\-kvm] [\-\-with\-rng WITH_RNG] [\-\-dracut\-conf DRACUT_CONF] [\-\-dracut\-arg DRACUT_ARGS] [\-\-live\-rootfs\-size LIVE_ROOTFS_SIZE] [\-\-live\-rootfs\-keep\-size] [\-\-oci\-config OCI_CONFIG] [\-\-oci\-runtime OCI_RUNTIME] [\-\-vagrant\-metadata VAGRANT_METADATA] [\-\-vagrantfile VAGRANTFILE] [\-\-project PROJECT] [\-\-releasever RELEASEVER] [\-\-volid VOLID] [\-\-squashfs\-only] [\-\-timeout TIMEOUT] [\-V] .ft P .fi .UNINDENT .UNINDENT .SS options .INDENT 0.0 .TP .B \-\-make\-iso Build a live iso .sp Default: False .TP .B \-\-make\-disk Build a partitioned disk image .sp Default: False .TP .B \-\-make\-fsimage Build a filesystem image .sp Default: False .TP .B \-\-make\-appliance Build an appliance image and XML description .sp Default: False .TP .B \-\-make\-ami Build an ami image .sp Default: False .TP .B \-\-make\-tar Build a tar of the root filesystem .sp Default: False .TP .B \-\-make\-tar\-disk Build a tar of a partitioned disk image .sp Default: False .TP .B \-\-make\-pxe\-live Build a live pxe boot squashfs image .sp Default: False .TP .B \-\-make\-ostree\-live Build a live pxe boot squashfs image of Atomic Host .sp Default: False .TP .B \-\-make\-oci Build an Open Container Initiative image .sp Default: False .TP .B \-\-make\-vagrant Build a Vagrant Box image .sp Default: False .TP .B \-\-iso Anaconda installation .iso path to use for qemu .TP .B \-\-iso\-only Remove all iso creation artifacts except the boot.iso, combine with \-\-iso\-name to rename the boot.iso .sp Default: False .TP .B \-\-iso\-name Name of output iso file for \-\-iso\-only. Default is boot.iso .TP .B \-\-ks Kickstart file defining the install. .TP .B \-\-image\-only Exit after creating fs/disk image. .sp Default: False .TP .B \-\-no\-virt Run anaconda directly on host instead of using qemu .sp Default: False .TP .B \-\-proxy proxy URL to use for the install .TP .B \-\-anaconda\-arg Additional argument to pass to anaconda (no\-virt mode). Pass once for each argument .TP .B \-\-armplatform the platform to use when creating images for ARM, i.e., highbank, mvebu, omap, tegra, etc. .TP .B \-\-location location of iso directory tree with initrd.img and vmlinuz. Used to run qemu with a newer initrd than the iso. .TP .B \-\-logfile Name and path for primary logfile, other logs will be created in the same directory. .sp Default: ./livemedia.log .TP .B \-\-lorax\-templates Path to mako templates for lorax .TP .B \-\-tmp Top level temporary directory .sp Default: /var/tmp .TP .B \-\-resultdir Directory to copy the resulting images and iso into. Defaults to the temporary working directory .TP .B \-\-macboot Make the iso bootable on UEFI based Mac systems .sp Default: True .TP .B \-\-nomacboot Do not create a Mac bootable iso .sp Default: False .TP .B \-\-extra\-boot\-args Extra arguments to add to the bootloader kernel cmdline in the templates .sp Default: "" .TP .B \-\-project substituted for @PROJECT@ in bootloader config files .sp Default: "Linux" .TP .B \-\-releasever substituted for @VERSION@ in bootloader config files .sp Default: "36" .TP .B \-\-volid volume id .TP .B \-\-squashfs\-only Use a plain squashfs filesystem for the runtime. .sp Default: False .TP .B \-\-timeout Cancel installer after X minutes .TP .B \-V show program\(aqs version number and exit .UNINDENT .SS disk/fs image arguments .INDENT 0.0 .TP .B \-\-disk\-image Path to existing disk image to use for creating final image. .TP .B \-\-keep\-image Keep raw disk image after .iso creation .sp Default: False .TP .B \-\-fs\-image Path to existing filesystem image to use for creating final image. .TP .B \-\-image\-name Name of output file to create. Used for tar, fs and disk image. Default is a random name. .TP .B \-\-tar\-disk\-name Name of the archive member for make\-tar\-disk. .TP .B \-\-fs\-label Label to set on fsimage, default is \(aqAnaconda\(aq .sp Default: "Anaconda" .TP .B \-\-image\-size\-align Create a disk image with a size that is a multiple of this value in MiB. .sp Default: 0 .TP .B \-\-image\-type Create an image with qemu\-img. See qemu\-img \-\-help for supported formats. .TP .B \-\-qemu\-arg Arguments to pass to qemu\-img. Pass once for each argument, they will be used for ALL calls to qemu\-img. .sp Default: [] .TP .B \-\-qcow2 Create qcow2 image instead of raw sparse image when making disk images. .sp Default: False .TP .B \-\-qcow2\-arg Arguments to pass to qemu\-img. Pass once for each argument, they will be used for ALL calls to qemu\-img. .sp Default: [] .TP .B \-\-compression Compression binary for make\-tar. xz, lzma, gzip, and bzip2 are supported. xz is the default. .sp Default: "xz" .TP .B \-\-compress\-arg Arguments to pass to compression. Pass once for each argument .sp Default: [] .UNINDENT .SS appliance arguments .INDENT 0.0 .TP .B \-\-app\-name Name of appliance to pass to template .TP .B \-\-app\-template Path to template to use for appliance data. .TP .B \-\-app\-file Appliance template results file. .sp Default: "appliance.xml" .UNINDENT .SS qemu arguments .INDENT 0.0 .TP .B \-\-ram Memory to allocate for installer in megabytes. .sp Default: 2048 .TP .B \-\-vcpus Passed to qemu \-smp command .TP .B \-\-vnc Passed to qemu \-display command. eg. vnc=127.0.0.1:5, default is to choose the first unused vnc port. .TP .B \-\-arch System arch to build for. Used to select qemu\-system\-* command. Defaults to qemu\-system\- .TP .B \-\-kernel\-args Additional argument to pass to the installation kernel .TP .B \-\-ovmf\-path Path to OVMF firmware .sp Default: "/usr/share/edk2/ovmf/" .TP .B \-\-virt\-uefi Use OVMF firmware to boot the VM in UEFI mode .sp Default: False .TP .B \-\-no\-kvm Skip using kvm with qemu even if it is available. .sp Default: False .TP .B \-\-with\-rng RNG device for QEMU (none for no RNG) .sp Default: "/dev/random" .UNINDENT .SS dracut arguments: (default: ) .INDENT 0.0 .TP .B \-\-dracut\-conf Path to a dracut.conf file to use instead of the default arguments. See the dracut.conf(5) manpage. .TP .B \-\-dracut\-arg Argument to pass to dracut when rebuilding the initramfs. Pass this once for each argument. NOTE: this overrides the defaults. .UNINDENT .SS pxe to live arguments .INDENT 0.0 .TP .B \-\-live\-rootfs\-size Size of root filesystem of live image in GiB .sp Default: 0 .TP .B \-\-live\-rootfs\-keep\-size Keep the original size of root filesystem in live image .sp Default: False .UNINDENT .SS OCI arguments .INDENT 0.0 .TP .B \-\-oci\-config config.json OCI configuration file .TP .B \-\-oci\-runtime runtime.json OCI configuration file .UNINDENT .SS Vagrant arguments .INDENT 0.0 .TP .B \-\-vagrant\-metadata optional metadata.json file .TP .B \-\-vagrantfile optional vagrantfile .UNINDENT .SH QUICKSTART .sp Run this to create a bootable live iso: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C sudo livemedia\-creator \-\-make\-iso \e \-\-iso=/extra/iso/boot.iso \-\-ks=./docs/fedora\-livemedia.ks .ft P .fi .UNINDENT .UNINDENT .sp You can run it directly from the lorax git repo like this: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C sudo PATH=./src/sbin/:$PATH PYTHONPATH=./src/ ./src/sbin/livemedia\-creator \e \-\-make\-iso \-\-iso=/extra/iso/boot.iso \e \-\-ks=./docs/fedora\-livemedia.ks \-\-lorax\-templates=./share/ .ft P .fi .UNINDENT .UNINDENT .sp You can observe the installation using vnc. The logs will show what port was chosen, or you can use a specific port by passing it. eg. \fB\-\-vnc vnc:127.0.0.1:5\fP .sp This is usually a good idea when testing changes to the kickstart. lmc tries to monitor the logs for fatal errors, but may not catch everything. .SH HOW ISO CREATION WORKS .sp There are 2 stages, the install stage which produces a disk or filesystem image as its output, and the boot media creation which uses the image as its input. Normally you would run both stages, but it is possible to stop after the install stage, by using \fB\-\-image\-only\fP, or to skip the install stage and use a previously created disk image by passing \fB\-\-disk\-image\fP or \fB\-\-fs\-image\fP .sp When creating an iso qemu boots using the passed Anaconda installer iso and installs the system based on the kickstart. The \fB%post\fP section of the kickstart is used to customize the installed system in the same way that current spin\-kickstarts do. .sp livemedia\-creator monitors the install process for problems by watching the install logs. They are written to the current directory or to the base directory specified by the \-\-logfile command. You can also monitor the install by using a vnc client. This is recommended when first modifying a kickstart, since there are still places where Anaconda may get stuck without the log monitor catching it. .sp The output from this process is a partitioned disk image. kpartx can be used to mount and examine it when there is a problem with the install. It can also be booted using kvm. .sp When creating an iso the disk image\(aqs / partition is copied into a formatted filesystem image which is then used as the input to lorax for creation of the final media. .sp The final image is created by lorax, using the templates in /usr/share/lorax/live/ or the live directory below the directory specified by \fB\-\-lorax\-templates\fP\&. The templates are written using the Mako template system with some extra commands added by lorax. .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 The output from \-\-make\-iso includes the artifacts used to create the boot.iso; the kernel, initrd, the squashfs filesystem, etc. If you only want the boot.iso you can pass \fB\-\-iso\-only\fP and the other files will be removed. You can also name the iso by using \fB\-\-iso\-name my\-live.iso\fP\&. .UNINDENT .UNINDENT .SH KICKSTARTS .sp The docs/ directory includes several example kickstarts, one to create a live desktop iso using GNOME, and another to create a minimal disk image. When creating your own kickstarts you should start with the minimal example, it includes several needed packages that are not always included by dependencies. .sp Or you can use existing spin kickstarts to create live media with a few changes. Here are the steps I used to convert the Fedora XFCE spin. .INDENT 0.0 .IP 1. 4 Flatten the xfce kickstart using ksflatten .IP 2. 4 Add zerombr so you don\(aqt get the disk init dialog .IP 3. 4 Add clearpart \-\-all .IP 4. 4 Add swap partition .IP 5. 4 bootloader target .IP 6. 4 Add shutdown to the kickstart .IP 7. 4 Add network \-\-bootproto=dhcp \-\-activate to activate the network This works for F16 builds but for F15 and before you need to pass something on the cmdline that activate the network, like sshd: .INDENT 4.0 .INDENT 3.5 \fBlivemedia\-creator \-\-kernel\-args="sshd"\fP .UNINDENT .UNINDENT .IP 8. 4 Add a root password: .INDENT 4.0 .INDENT 3.5 .sp .nf .ft C rootpw rootme network \-\-bootproto=dhcp \-\-activate zerombr clearpart \-\-all bootloader \-\-location=mbr part swap \-\-size=512 shutdown .ft P .fi .UNINDENT .UNINDENT .IP 9. 4 In the livesys script section of the %post remove the root password. This really depends on how the spin wants to work. You could add the live user that you create to the %wheel group so that sudo works if you wanted to. .INDENT 4.0 .INDENT 3.5 \fBpasswd \-d root > /dev/null\fP .UNINDENT .UNINDENT .IP 10. 4 Remove /etc/fstab in %post, dracut handles mounting the rootfs .sp \fBcat /dev/null > /dev/fstab\fP .sp Do this only for live iso\(aqs, the filesystem will be mounted read only if there is no /etc/fstab .IP 11. 4 Don\(aqt delete initramfs files from /boot in %post .IP 12. 4 When creating live iso\(aqs you need to have, at least, these packages in the %package section:: dracut\-config\-generic dracut\-live \-dracut\-config\-rescue grub2\-efi syslinux .UNINDENT .SS User created repositories .sp If you are using your own repositories and installing groups (eg. @core) make sure you create the repodata with groups like this \fBcreaterepo \-g /path/to/groups.xml /path/to/rpms\fP .SS Using a Proxy with repos .sp One drawback to using qemu is that it pulls the packages from the repo each time you run it. To speed things up you either need a local mirror of the packages, or you can use a caching proxy. When using a proxy you pass it to livemedia\-creator like this: .INDENT 0.0 .INDENT 3.5 \fB\-\-proxy=http://proxy.yourdomain.com:3128\fP .UNINDENT .UNINDENT .sp You also need to use a specific mirror instead of mirrormanager so that the packages will get cached, so your kickstart url would look like: .INDENT 0.0 .INDENT 3.5 \fBurl \-\-url="http://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/x86_64/os/"\fP .UNINDENT .UNINDENT .sp You can also add an update repo, but don\(aqt name it updates. Add \-\-proxy to it as well. You can use all of the \fI\%kickstart commands\fP in your kickstart. Make sure there is only one \fBurl\fP command, other repos have to use the \fBrepo\fP command and cannot be named \fBupdates\fP which is reserved for Anaconda\(aqs use. eg.: .INDENT 0.0 .INDENT 3.5 .sp .nf .ft C url \-\-url=PRIMARY\-REPO\-URL \-\-proxy=PROXY\-URL repo \-\-name="repo1" \-\-baseurl=FIRST\-REPO\-URL \-\-proxy=PROXY\-URL repo \-\-name="repo2" \-\-baseurl=SECOND\-REPO_URL \-\-proxy=PROXY\-URL .ft P .fi .UNINDENT .UNINDENT .SH ANACONDA IMAGE INSTALL (NO-VIRT) .sp You can create images without using qemu by passing \fB\-\-no\-virt\fP on the cmdline. This will use Anaconda\(aqs directory install feature to handle the install. There are a couple of things to keep in mind when doing this: .INDENT 0.0 .IP 1. 3 It will be most reliable when building images for the same release that the host is running. Because Anaconda has expectations about the system it is running under you may encounter strange bugs if you try to build newer or older releases. .IP 2. 3 It may totally trash your host. So far I haven\(aqt had this happen, but the possibility exists that a bug in Anaconda could result in it operating on real devices. I recommend running it in a virt or on a system that you can afford to lose all data from. .UNINDENT .sp The logs from anaconda will be placed in an ./anaconda/ directory in either the current directory or in the directory used for \-\-logfile .sp Example cmdline: .sp \fBsudo livemedia\-creator \-\-make\-iso \-\-no\-virt \-\-ks=./fedora\-livemedia.ks\fP .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 Using no\-virt to create a partitioned disk image (eg. \-\-make\-disk or \-\-make\-vagrant) will only create disks usable on the host platform (BIOS or UEFI). You can create BIOS partitioned disk images on UEFI by using virt. .UNINDENT .UNINDENT .sp \fBNOTE:\fP .INDENT 0.0 .INDENT 3.5 As of version 30.7 SELinux can be set to Enforcing. The current state is logged for debugging purposes and if there are SELinux denials they should be reported as a bug. .UNINDENT .UNINDENT .SH AMI IMAGES .sp Amazon EC2 images can be created by using the \-\-make\-ami switch and an appropriate kickstart file. All of the work to customize the image is handled by the kickstart. The example currently included was modified from the cloud\-kickstarts version so that it would work with livemedia\-creator. .sp Example cmdline: .sp \fBsudo livemedia\-creator \-\-make\-ami \-\-iso=/path/to/boot.iso \-\-ks=./docs/fedora\-livemedia\-ec2.ks\fP .sp This will produce an ami\-root.img file in the working directory. .sp At this time I have not tested the image with EC2. Feedback would be welcome. .SH APPLIANCE CREATION .sp livemedia\-creator can now replace appliance\-tools by using the \-\-make\-appliance switch. This will create the partitioned disk image and an XML file that can be used with virt\-image to setup a virtual system. .sp The XML is generated using the Mako template from /usr/share/lorax/appliance/libvirt.xml You can use a different template by passing \fB\-\-app\-template