It's a giant bash script that builds Linux From Scratch.
Pronounce it in whatever way seems best to you.
If you don't know what this is, or haven't built Linux From Scratch on your own before, you should go through the LFS book before using this script.
Ubuntu 20.04.6 - passed
Ubuntu 22.04.2 - failed => Reason: losetup: /home/user/Documents/MyLFS/lfs.img: failed to set up loop device: Device or resource busy
Ubuntu 23.10 - passed
Debian 12.0.0 - passed
Gentoo 2023-06-25 - passed
EndeavourOS Cassini Nova - failed => Reason: losetup: /home/user/Documents/MyLFS/lfs.img: failed to set up loop device: Device or resource busy
Arch Linux - failed => Reason: losetup: /home/user/Documents/MyLFS/lfs.img: failed to set up loop device: Device or resource busy init failed.
More distro will be tested whether they have passed or failed.
Basically, just run sudo ./mylfs.sh --build-all
and then stare at your terminal for several hours. Maybe meditate on life or something while you wait. Or maybe clean your room or do your dishes finally. I don't know. Do whatever you want. Maybe by the end of the script, you'll realize why you love linux so much: you love it because it is hard. Just like going to the moon, god dammit.
Welcome to MyLFS.
WARNING: Most of the functionality in this script requires root privileges,
and involves the partitioning, mounting and unmounting of device files. Use at
your own risk.
If you would like to build Linux From Scratch from beginning to end, just
run the script with the '--build-all' command. Otherwise, you can build LFS one step
at a time by using the various commands outlined below. Before building anything
however, you should be sure to run the script with '--check' to verify the
dependencies on your system. If you want to install the IMG file that this
script produces onto a storage device, you can specify '--install /dev/<devname>'
on the command line. Be careful with that last one - it WILL destroy all partitions
on the device you specify.
options:
-v|--version Print the LFS version this build is based on, then exit.
-V|--verbose The script will output more information where applicable
(careful what you wish for).
-e|--check Output LFS dependency version information, then exit.
It is recommended that you run this before proceeding
with the rest of the build.
-b|--build-all Run the entire script from beginning to end.
-x|--extend Pass in the path to a custom build extension. See the
'example_extension' directory for reference.
-d|--download-packages Download all packages into the 'packages' directory, then
exit.
-i|--init Create the .img file, partition it, setup basic directory
structure, then exit.
-p|--start-phase
-a|--start-package Select a phase and optionally a package
within that phase to start building from.
These options are only available if the preceding
phases have been completed. They should really only
be used when something broke during a build, and you
don't want to start from the beginning again.
-o|--one-off Only build the specified phase/package.
-k|--kernel-config Optional path to kernel config file to use during linux
build.
-m|--mount Mount the disk image to the filesystem, then exit.
You should ensure to unmount prior to running any part of
the build, as the image will be automatically mounted
and then unmounted at the end.
-u|--umount Unmount the disk image from the filesystem, then exit.
You should ensure to unmount prior to running any part of
the build, as the image will be automatically mounted
and then unmounted at the end.
-n|--install Specify the path to a block device on which to install the
fully built img file.
-c|--clean This will unmount and delete the image, and clear the
logs.
--chroot Enter the chroot environment within the LFS build.
This option will run the build steps inside the chroot
environment, providing an isolated environment for the
Linux From Scratch build process. It sets up necessary
environment variables, enters the chroot, and configures
the shell prompt.
-h|--help Show this message.
The script builds LFS by completing the following steps:
-
Download package source code and save to the
./packages/
directory. -
Create a 10 gigabyte IMG file called
lfs.img
. This will serve as a virtual hard drive on which to build LFS. -
"Attach" the IMG file as a loop device using
losetup
. This way, the host machine can operate on the IMG file as if it were a physical storage device. -
Partition the IMG file via the loop device we've created, put an ext4 filesystem on it, then add a basic directory structure and some config files (such as /boot/grub/grub.cfg etc).
-
Build initial cross compilation tools. This corresponds to chapter 5 in the LFS book.
-
Begin to build tools required for minimal chroot environment. (chapter 6)
-
Enter chroot environment, and build remaing tools needed to build the entire LFS system. (chapter 7)
-
Build the entire LFS system from within chroot envirnment, including the kernel, GRUB, and others. (chapter 8)
That's it.
If something breaks over the course of the build, you can examine the build logs in the aptly named logs
directory. If you discover the source of the breakage and manage to fix it, you can start the script up again from where you left off using the --start-phase <phase-number>
and --start-package <package-name>
commands.
For example, say the GRUB build in phase 4 broke:
sudo ./mylfs.sh --start-phase 4 --start-package grub
This will start the script up again at the phase 4 GRUB build, and continue on to the remaining packages.
Another example. Say you just changed your kernel config file a bit and need to recompile:
sudo ./mylfs.sh --start-phase 4 --start-package linux --one-off
The --one-off
flag tells the script to exit once the starting package has been completed.
The real magic of MyLFS is that you can apply "extensions" to the script in order to automatically customize your LFS system.
sudo ./mylfs.sh --build-all --extend ./example_extension
Details on how extensions work can be found in example_extension/README
.
If you want to poke around inside the image file without booting into it, you can simply use the --mount
command like so:
sudo ./mylfs.sh --mount
This will mount the root partition of the IMG file under ./mnt/lfs
(i.e. not /mnt
under the root directory). When you're done, you can unmount with the following:
sudo ./mylfs.sh --umount
If you want to install the LFS IMG file onto a drive of some kind, use:
sudo ./mylfs.sh --install /dev/<devname>
To enter the chroot environment within the LFS build, use the following command:
sudo ./mylfs.sh --chroot
This option will run the build steps inside the chroot environment, providing an isolated environment for the Linux From Scratch build process. It sets up necessary environment variables, enters the chroot, and configures the shell prompt.
Finally, to clean your workspace:
sudo ./mylfs.sh --clean
This will unmount the IMG file (if it is mounted), delete it, and delete the logs under ./logs/
. It will not delete the cached package archives under ./packages/
, but if you really want to do that you can easily rm -f ./packages/*
.
So far, I have managed to boot the IMG file using QEMU (see the runqemu.sh script) and on bare metal using a flash drive. I have not been able to boot it up on a VM yet.