live-custom-ubuntu-from-scr.../README.md

654 lines
16 KiB
Markdown
Raw Permalink Normal View History

2019-06-29 17:40:21 +00:00
# How to create a custom Ubuntu live from scratch
2019-06-26 17:26:09 +00:00
2020-06-22 08:11:10 +00:00
<p align="center">
<img src="images/live-boot.png">
</p>
2019-07-01 00:27:52 +00:00
This procedure shows how to create a **bootable** and **installable** Ubuntu Live (along with the automatic hardware detection and configuration) from scratch.
2019-06-29 17:35:10 +00:00
2019-06-26 17:26:09 +00:00
## Prerequisites (GNU/Linux Debian/Ubuntu)
Install applications we need to build the environment.
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 17:26:09 +00:00
sudo apt-get install \
2019-07-01 22:33:30 +00:00
binutils \
2019-06-26 17:26:09 +00:00
debootstrap \
squashfs-tools \
2019-06-28 12:54:09 +00:00
xorriso \
grub-pc-bin \
grub-efi-amd64-bin \
mtools
2019-06-26 17:26:09 +00:00
```
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 17:26:09 +00:00
mkdir $HOME/live-ubuntu-from-scratch
```
## Bootstrap and Configure Ubuntu
2019-06-29 17:35:10 +00:00
* Checkout bootstrap
2020-01-27 15:26:30 +00:00
```shell
2019-06-29 17:35:10 +00:00
sudo debootstrap \
--arch=amd64 \
--variant=minbase \
2020-06-22 02:02:10 +00:00
focal \
2019-06-29 17:35:10 +00:00
$HOME/live-ubuntu-from-scratch/chroot \
http://us.archive.ubuntu.com/ubuntu/
```
2020-01-27 15:26:30 +00:00
2019-06-29 17:35:10 +00:00
> **debootstrap** is used to create a Debian base system from scratch, without requiring the availability of **dpkg** or **apt**. It does this by downloading .deb files from a mirror site, and carefully unpacking them into a directory which can eventually be **chrooted** into.
* Configure external mount points
2020-01-27 15:26:30 +00:00
```shell
2019-06-29 17:35:10 +00:00
sudo mount --bind /dev $HOME/live-ubuntu-from-scratch/chroot/dev
sudo mount --bind /run $HOME/live-ubuntu-from-scratch/chroot/run
```
2020-01-27 15:26:30 +00:00
2019-07-01 00:27:52 +00:00
As we will be updating and installing packages (grub among them), these mount points are necessary inside the chroot environment, so we are able to finish the installation without errors.
2019-06-26 17:26:09 +00:00
2019-06-29 17:35:10 +00:00
## Define chroot environment
2019-06-26 17:26:09 +00:00
2019-07-01 00:27:52 +00:00
*A chroot on Unix operating systems is an operation that changes the apparent root directory for the current running process and its children. A program that is run in such a modified environment cannot name (and therefore normally cannot access) files outside the designated directory tree. The term "chroot" may refer to the chroot system call or the chroot wrapper program. The modified environment is called a chroot jail.*
2019-06-29 17:35:10 +00:00
> Reference: https://en.wikipedia.org/wiki/Chroot
2019-06-29 17:38:31 +00:00
1. **Access chroot environment**
2020-01-27 15:26:30 +00:00
```shell
2019-07-01 04:06:40 +00:00
sudo chroot $HOME/live-ubuntu-from-scratch/chroot
```
2019-06-26 17:26:09 +00:00
2019-06-29 17:40:21 +00:00
2. **Configure mount points, home and locale**
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
mount none -t proc /proc
2019-06-26 19:12:53 +00:00
2019-06-27 04:42:44 +00:00
mount none -t sysfs /sys
2019-06-26 19:12:53 +00:00
2019-06-27 04:42:44 +00:00
mount none -t devpts /dev/pts
2019-06-26 19:12:53 +00:00
2019-06-27 04:42:44 +00:00
export HOME=/root
2019-06-26 19:12:53 +00:00
2019-06-27 04:42:44 +00:00
export LC_ALL=C
```
2019-06-26 19:12:53 +00:00
2019-07-01 00:27:52 +00:00
These mount points are necessary inside the chroot environment, so we are able to finish the installation without errors.
2019-06-29 17:40:21 +00:00
2019-06-29 17:35:10 +00:00
3. **Set a custom hostname**
2020-01-27 15:26:30 +00:00
```shell
2019-06-29 19:41:47 +00:00
echo "ubuntu-fs-live" > /etc/hostname
2019-06-27 04:42:44 +00:00
```
2019-06-26 19:12:53 +00:00
2019-06-29 17:35:10 +00:00
4. **Configure apt sources.list**
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
cat <<EOF > /etc/apt/sources.list
2020-06-22 07:53:47 +00:00
deb http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
2019-06-26 19:12:53 +00:00
2020-06-22 07:53:47 +00:00
deb http://us.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
deb http://us.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ focal-updates main restricted universe multiverse
2019-06-27 04:42:44 +00:00
EOF
```
2019-06-26 19:45:45 +00:00
2019-07-01 04:43:08 +00:00
5. **Update indexes packages**
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
apt-get update
```
2019-06-26 19:45:45 +00:00
2019-07-01 04:43:08 +00:00
6. **Install systemd**
2020-01-27 15:26:30 +00:00
```shell
2020-06-22 07:53:47 +00:00
apt-get install -y libterm-readline-gnu-perl systemd-sysv
2019-06-27 04:42:44 +00:00
```
2020-01-27 15:26:30 +00:00
2019-06-29 17:35:10 +00:00
> **systemd** is a system and service manager for Linux. It provides aggressive parallelization capabilities, uses socket and D-Bus activation for starting services, offers on-demand starting of daemons, keeps track of processes using Linux control groups, maintains mount and automount points and implements an elaborate transactional dependency-based service control logic.
2019-06-26 19:45:45 +00:00
2019-07-01 04:43:08 +00:00
7. **Configure machine-id and divert**
2020-01-27 15:26:30 +00:00
```shell
2019-06-29 18:46:38 +00:00
dbus-uuidgen > /etc/machine-id
2019-06-26 19:45:45 +00:00
2019-06-29 18:46:38 +00:00
ln -fs /etc/machine-id /var/lib/dbus/machine-id
2019-06-29 17:35:10 +00:00
```
2020-01-27 15:26:30 +00:00
2019-06-29 17:35:10 +00:00
> The `/etc/machine-id` file contains the unique machine ID of the local system that is set during installation or boot. The machine ID is a single newline-terminated, hexadecimal, 32-character, lowercase ID. When decoded from hexadecimal, this corresponds to a 16-byte/128-bit value. This ID may not be all zeros.
2020-01-27 15:26:30 +00:00
```shell
2019-06-29 17:35:10 +00:00
dpkg-divert --local --rename --add /sbin/initctl
2019-06-28 12:54:09 +00:00
2019-06-29 17:35:10 +00:00
ln -s /bin/true /sbin/initctl
2019-06-27 04:42:44 +00:00
```
2020-01-27 15:26:30 +00:00
2019-06-29 17:35:10 +00:00
> **dpkg-divert** is the utility used to set up and update the list of diversions.
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
8. **Upgrade packages**
```shell
apt-get -y upgrade
```
9. **Install packages needed for Live System**
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
apt-get install -y \
ubuntu-standard \
casper \
lupin-casper \
discover \
laptop-detect \
os-prober \
network-manager \
2019-06-27 19:56:19 +00:00
resolvconf \
2019-06-27 04:42:44 +00:00
net-tools \
wireless-tools \
wpagui \
locales \
linux-generic
```
2019-06-29 19:37:11 +00:00
2019-07-01 00:27:52 +00:00
The next steps will appear, as a result of the packages that will be installed from the previous step, this will happen without anything having to be informed or executed.
2019-06-29 19:37:11 +00:00
1. Configure grub
<p align="center">
<img src="images/grub-configure-01.png">
</p>
2019-07-01 00:27:52 +00:00
2. Dont select any options
2019-06-29 19:37:11 +00:00
<p align="center">
<img src="images/grub-configure-02.png">
</p>
2019-07-01 00:27:52 +00:00
3. Only confirm “Yes”
2019-06-29 19:37:11 +00:00
<p align="center">
<img src="images/grub-configure-03.png">
</p>
2020-06-22 07:53:47 +00:00
10. **Graphical installer**
2020-01-27 15:26:30 +00:00
2020-06-22 07:53:47 +00:00
```shell
apt-get install -y \
2019-06-27 04:42:44 +00:00
ubiquity \
ubiquity-casper \
ubiquity-frontend-gtk \
ubiquity-slideshow-ubuntu \
ubiquity-ubuntu-artwork
2020-06-22 07:53:47 +00:00
```
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
The next steps will appear, as a result of the packages that will be installed from the previous step, this will happen without anything having to be informed or executed.
2019-07-01 00:27:52 +00:00
2020-06-22 07:53:47 +00:00
1. Configure keyboard
<p align="center">
<img src="images/keyboard-configure-01.png">
</p>
2019-06-29 19:37:11 +00:00
2020-06-22 07:53:47 +00:00
<p align="center">
<img src="images/keyboard-configure-02.png">
</p>
2019-06-29 19:37:11 +00:00
2020-06-22 07:53:47 +00:00
2. Console setup
<p align="center">
<img src="images/console-configure-01.png">
</p>
2019-06-29 19:37:11 +00:00
2020-06-22 07:53:47 +00:00
11. **Install window manager**
2020-01-27 15:26:30 +00:00
```shell
2019-07-01 04:43:52 +00:00
apt-get install -y \
plymouth-theme-ubuntu-logo \
ubuntu-gnome-desktop \
ubuntu-gnome-wallpapers
```
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
12. **Install useful applications**
2020-01-27 15:26:30 +00:00
```shell
2019-07-01 04:05:13 +00:00
apt-get install -y \
clamav-daemon \
terminator \
apt-transport-https \
curl \
vim \
nano \
less
```
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
13. **Install Visual Studio Code (optional)**
2019-06-26 19:45:45 +00:00
2020-01-27 15:26:30 +00:00
1. Download and install the key
```shell
2019-06-27 04:42:44 +00:00
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/
2020-01-27 15:26:30 +00:00
2019-06-27 04:42:44 +00:00
echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
rm microsoft.gpg
```
2019-06-26 19:45:45 +00:00
2019-06-29 17:35:10 +00:00
2. Then update the package cache and install the package using
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
apt-get update
2020-01-27 15:26:30 +00:00
2019-06-27 04:42:44 +00:00
apt-get install -y code
```
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
14. **Install Google Chrome (optional)**
2019-06-26 19:45:45 +00:00
2020-01-27 15:26:30 +00:00
1. Download and install the key
```shell
2019-06-27 04:42:44 +00:00
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
echo "deb http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list
```
2019-06-26 19:45:45 +00:00
2019-06-29 17:35:10 +00:00
2. Then update the package cache and install the package using
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
apt-get update
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
apt-get install google-chrome-stable
```
2019-06-26 19:45:45 +00:00
2020-06-22 07:53:47 +00:00
15. **Install Java JDK 8 (optional)**
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:45:45 +00:00
apt-get install -y \
openjdk-8-jdk \
openjdk-8-jre
```
2020-06-22 07:53:47 +00:00
16. **Remove unused applications (optional)**
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:45:45 +00:00
apt-get purge -y \
transmission-gtk \
transmission-common \
gnome-mahjongg \
gnome-mines \
gnome-sudoku \
aisleriot \
hitori
```
2020-06-22 07:53:47 +00:00
17. **Remove unused packages**
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:45:45 +00:00
apt-get autoremove -y
```
2020-06-22 07:53:47 +00:00
18. **Reconfigure packages**
2019-06-27 19:54:51 +00:00
2019-06-29 17:38:31 +00:00
1. Generate locales
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 19:54:51 +00:00
dpkg-reconfigure locales
```
2019-06-29 17:38:31 +00:00
1. *Select locales*
2019-06-29 17:35:10 +00:00
<p align="center">
<img src="images/locales-select.png">
</p>
2019-06-29 17:38:31 +00:00
2. *Select default locale*
2019-06-29 17:35:10 +00:00
<p align="center">
<img src="images/locales-default.png">
</p>
2019-06-29 17:38:31 +00:00
2. Reconfigure resolvconf
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 21:02:56 +00:00
dpkg-reconfigure resolvconf
2019-06-27 19:54:51 +00:00
```
2019-06-29 17:38:31 +00:00
1. *Confirm changes*
2019-06-29 17:35:10 +00:00
<p align="center">
<img src="images/resolvconf-confirm-01.png">
</p>
<p align="center">
<img src="images/resolvconf-confirm-02.png">
</p>
<p align="center">
<img src="images/resolvconf-confirm-03.png">
</p>
2019-06-29 17:38:31 +00:00
3. Configure network-manager
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 19:54:51 +00:00
cat <<EOF > /etc/NetworkManager/NetworkManager.conf
[main]
rc-manager=resolvconf
plugins=ifupdown,keyfile
dns=dnsmasq
2020-01-27 15:26:30 +00:00
2019-06-27 19:54:51 +00:00
[ifupdown]
managed=false
EOF
```
2019-06-29 17:38:31 +00:00
4. Reconfigure network-manager
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 19:54:51 +00:00
dpkg-reconfigure network-manager
```
2020-06-22 07:53:47 +00:00
19. **Cleanup the chroot environment**
2019-06-26 19:45:45 +00:00
1. If you installed software, be sure to run
2020-01-27 15:26:30 +00:00
```shell
truncate -s 0 /etc/machine-id
2019-06-27 04:42:44 +00:00
```
2019-06-26 19:45:45 +00:00
2. Remove the diversion
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
rm /sbin/initctl
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
dpkg-divert --rename --remove /sbin/initctl
```
2019-06-26 19:45:45 +00:00
3. Clean up
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 04:42:44 +00:00
apt-get clean
rm -rf /tmp/* ~/.bash_history
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
umount /proc
2020-01-27 15:26:30 +00:00
2019-06-27 04:42:44 +00:00
umount /sys
2020-01-27 15:26:30 +00:00
2019-06-27 04:42:44 +00:00
umount /dev/pts
2019-06-26 19:45:45 +00:00
2019-06-27 04:42:44 +00:00
export HISTSIZE=0
2020-01-27 15:26:30 +00:00
2019-06-27 04:42:44 +00:00
exit
```
2019-06-26 19:45:45 +00:00
## Unbind mount points
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:45:45 +00:00
sudo umount $HOME/live-ubuntu-from-scratch/chroot/dev
2019-06-26 19:12:53 +00:00
2019-06-26 19:45:45 +00:00
sudo umount $HOME/live-ubuntu-from-scratch/chroot/run
2019-06-26 19:12:53 +00:00
```
2019-06-26 19:27:43 +00:00
## Create the CD image directory and populate it
1. Access build directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:27:43 +00:00
cd $HOME/live-ubuntu-from-scratch
```
2. Create directories
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 19:27:43 +00:00
mkdir -p image/{casper,isolinux,install}
```
2020-01-27 15:26:30 +00:00
3. Copy kernel images
```shell
2019-06-26 19:36:21 +00:00
sudo cp chroot/boot/vmlinuz-**-**-generic image/casper/vmlinuz
2019-06-26 19:27:43 +00:00
2019-06-27 02:27:28 +00:00
sudo cp chroot/boot/initrd.img-**-**-generic image/casper/initrd
2019-06-26 19:27:43 +00:00
```
2020-01-27 15:26:30 +00:00
4. Copy memtest86+ binary (BIOS)
```shell
2019-06-30 16:54:56 +00:00
sudo cp chroot/boot/memtest86+.bin image/install/memtest86+
```
2020-01-27 15:26:30 +00:00
5. Download and extract memtest86 binary (UEFI)
```shell
2019-06-30 16:54:56 +00:00
wget --progress=dot https://www.memtest86.com/downloads/memtest86-usb.zip -O image/install/memtest86-usb.zip
2020-01-27 15:26:30 +00:00
2019-06-30 16:54:56 +00:00
unzip -p image/install/memtest86-usb.zip memtest86-usb.img > image/install/memtest86
2020-01-27 15:26:30 +00:00
2020-06-22 07:53:47 +00:00
rm -f image/install/memtest86-usb.zip
2019-06-26 19:27:43 +00:00
```
2019-06-27 02:27:28 +00:00
2019-06-28 12:54:09 +00:00
## Grub configuration
2019-06-27 02:27:28 +00:00
1. Access build directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 02:27:28 +00:00
cd $HOME/live-ubuntu-from-scratch
```
2019-07-01 00:27:52 +00:00
2019-07-01 00:30:58 +00:00
2. Create base point access file for grub
2020-01-27 15:26:30 +00:00
```shell
2019-07-01 00:27:52 +00:00
touch image/ubuntu
```
2020-01-27 15:26:30 +00:00
3. Create image/isolinux/grub.cfg
```shell
2019-06-28 12:54:09 +00:00
cat <<EOF > image/isolinux/grub.cfg
2019-06-27 02:27:28 +00:00
2019-06-28 12:54:09 +00:00
search --set=root --file /ubuntu
2019-06-27 02:27:28 +00:00
2019-06-28 12:54:09 +00:00
insmod all_video
set default="0"
set timeout=30
2019-07-01 02:56:37 +00:00
menuentry "Try Ubuntu FS without installing" {
2020-06-22 07:53:47 +00:00
linux /casper/vmlinuz boot=casper nopersistent toram quiet splash ---
2019-06-28 12:54:09 +00:00
initrd /casper/initrd
}
2019-07-01 02:56:37 +00:00
menuentry "Install Ubuntu FS" {
2019-06-28 12:54:09 +00:00
linux /casper/vmlinuz boot=casper only-ubiquity quiet splash ---
initrd /casper/initrd
}
menuentry "Check disc for defects" {
linux /casper/vmlinuz boot=casper integrity-check quiet splash ---
initrd /casper/initrd
}
2019-06-30 16:54:56 +00:00
menuentry "Test memory Memtest86+ (BIOS)" {
linux16 /install/memtest86+
}
2020-01-27 15:26:30 +00:00
2019-06-30 16:54:56 +00:00
menuentry "Test memory Memtest86 (UEFI, long load time)" {
2019-06-30 17:41:35 +00:00
insmod part_gpt
insmod search_fs_uuid
insmod chain
2019-06-30 16:54:56 +00:00
loopback loop /install/memtest86
2019-06-30 17:48:35 +00:00
chainloader (loop,gpt1)/efi/boot/BOOTX64.efi
2019-06-28 12:54:09 +00:00
}
2019-06-27 02:27:28 +00:00
EOF
```
2019-06-28 12:54:09 +00:00
2019-06-27 02:27:28 +00:00
## Create manifest
2020-01-27 15:26:30 +00:00
2019-07-01 00:27:52 +00:00
In the next steps the creation of the manifest is important because it tells us which version of each package installed in the Live version and which packages will be removed or maintained in the version that will be installed (persisted in the hard drive).
2019-06-27 02:27:28 +00:00
2019-06-26 22:13:38 +00:00
1. Access build directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 22:13:38 +00:00
cd $HOME/live-ubuntu-from-scratch
```
2019-06-27 02:27:28 +00:00
2. Generate manifest
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 02:27:28 +00:00
sudo chroot chroot dpkg-query -W --showformat='${Package} ${Version}\n' | sudo tee image/casper/filesystem.manifest
2019-06-26 22:13:38 +00:00
2019-06-27 02:27:28 +00:00
sudo cp -v image/casper/filesystem.manifest image/casper/filesystem.manifest-desktop
2019-06-26 22:13:38 +00:00
2019-06-27 14:49:19 +00:00
sudo sed -i '/ubiquity/d' image/casper/filesystem.manifest-desktop
2020-01-27 15:26:30 +00:00
2019-06-27 14:49:19 +00:00
sudo sed -i '/casper/d' image/casper/filesystem.manifest-desktop
2020-01-27 15:26:30 +00:00
2019-06-27 14:49:19 +00:00
sudo sed -i '/discover/d' image/casper/filesystem.manifest-desktop
2020-01-27 15:26:30 +00:00
2019-06-27 14:49:19 +00:00
sudo sed -i '/laptop-detect/d' image/casper/filesystem.manifest-desktop
2020-01-27 15:26:30 +00:00
2019-06-27 14:49:19 +00:00
sudo sed -i '/os-prober/d' image/casper/filesystem.manifest-desktop
2019-06-27 02:27:28 +00:00
```
2019-06-26 22:13:38 +00:00
2019-06-27 02:27:28 +00:00
## Compress the chroot
2020-01-27 15:26:30 +00:00
2019-07-01 00:27:52 +00:00
After everything has been installed and preconfigured in the **chrooted** environment, we need to generate an image of everything that was done by following the next steps.
2019-06-26 22:13:38 +00:00
1. Access build directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 22:13:38 +00:00
cd $HOME/live-ubuntu-from-scratch
```
2019-06-27 02:27:28 +00:00
2. Create squashfs
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 02:27:28 +00:00
sudo mksquashfs chroot image/casper/filesystem.squashfs
2019-06-26 22:13:38 +00:00
```
2019-07-01 00:29:12 +00:00
2020-01-27 15:26:30 +00:00
> **Squashfs** is a highly compressed read-only filesystem for Linux. It uses zlib compression to compress both files, inodes and directories. Inodes in the system are very small and all blocks are packed to minimize data overhead. Block sizes greater than 4K are supported up to a maximum of 64K.
2019-07-01 00:39:35 +00:00
> **Squashfs** is intended for general read-only filesystem use, for archival use (i.e. in cases where a .tar.gz file may be used), and in constrained block device/memory systems (e.g. **embedded systems**) where low overhead is needed.
2019-06-26 22:13:38 +00:00
2019-06-27 02:27:28 +00:00
3. Write the filesystem.size
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 02:27:28 +00:00
printf $(sudo du -sx --block-size=1 chroot | cut -f1) > image/casper/filesystem.size
2019-06-26 22:13:38 +00:00
```
2019-06-27 02:27:28 +00:00
## Create diskdefines
2020-01-27 15:26:30 +00:00
2019-07-01 00:27:52 +00:00
**README** file often found on Linux LiveCD installer discs, such as an Ubuntu Linux installation CD; typically named “**README.diskdefines**” and may be referenced during installation.
2019-06-26 22:13:38 +00:00
1. Access build directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-26 22:13:38 +00:00
cd $HOME/live-ubuntu-from-scratch
```
2019-06-27 02:27:28 +00:00
2. Create file image/README.diskdefines
2020-01-27 15:26:30 +00:00
```shell
2019-06-27 02:27:28 +00:00
cat <<EOF > image/README.diskdefines
#define DISKNAME Ubuntu from scratch
#define TYPE binary
#define TYPEbinary 1
#define ARCH amd64
#define ARCHamd64 1
#define DISKNUM 1
#define DISKNUM1 1
#define TOTALNUM 0
#define TOTALNUM0 1
EOF
```
2019-06-26 22:13:38 +00:00
2019-06-28 12:54:09 +00:00
## Create ISO Image for a LiveCD (BIOS + UEFI)
2019-06-26 22:13:38 +00:00
2019-06-28 12:54:09 +00:00
1. Access image directory
2020-01-27 15:26:30 +00:00
```shell
2019-06-28 12:54:09 +00:00
cd $HOME/live-ubuntu-from-scratch/image
2019-06-26 22:13:38 +00:00
```
2019-06-28 12:54:09 +00:00
2. Create a grub UEFI image
2020-01-27 15:26:30 +00:00
```shell
2019-06-28 12:54:09 +00:00
grub-mkstandalone \
--format=x86_64-efi \
--output=isolinux/bootx64.efi \
--locales="" \
--fonts="" \
2020-01-27 15:26:30 +00:00
"boot/grub/grub.cfg=isolinux/grub.cfg"
2019-06-26 22:13:38 +00:00
```
2020-01-27 15:26:30 +00:00
3. Create a FAT16 UEFI boot disk image containing the EFI bootloader
```shell
2019-06-28 12:54:09 +00:00
(
cd isolinux && \
dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
sudo mkfs.vfat efiboot.img && \
2020-04-13 00:52:57 +00:00
LC_CTYPE=C mmd -i efiboot.img efi efi/boot && \
LC_CTYPE=C mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
2019-06-28 12:54:09 +00:00
)
```
2019-06-27 02:27:28 +00:00
2020-01-27 15:26:30 +00:00
4. Create a grub BIOS image
```shell
2019-06-28 12:54:09 +00:00
grub-mkstandalone \
--format=i386-pc \
--output=isolinux/core.img \
2019-06-29 22:43:26 +00:00
--install-modules="linux16 linux normal iso9660 biosdisk memdisk search tar ls" \
--modules="linux16 linux normal iso9660 biosdisk search" \
2019-06-28 12:54:09 +00:00
--locales="" \
--fonts="" \
"boot/grub/grub.cfg=isolinux/grub.cfg"
```
2020-01-27 15:26:30 +00:00
5. Combine a bootable Grub cdboot.img
```shell
2019-06-28 12:54:09 +00:00
cat /usr/lib/grub/i386-pc/cdboot.img isolinux/core.img > isolinux/bios.img
```
2020-01-27 15:26:30 +00:00
6. Generate md5sum.txt
```shell
2020-06-22 07:53:47 +00:00
sudo /bin/bash -c "(find . -type f -print0 | xargs -0 md5sum | grep -v -e 'md5sum.txt' -e 'bios.img' -e 'efiboot.img' > md5sum.txt)"
2019-06-27 02:27:28 +00:00
```
2019-06-28 12:54:09 +00:00
7. Create iso from the image directory using the command-line
2020-01-27 15:26:30 +00:00
```shell
2019-06-28 12:54:09 +00:00
sudo xorriso \
-as mkisofs \
-iso-level 3 \
-full-iso9660-filenames \
-volid "Ubuntu from scratch" \
2019-06-29 18:09:21 +00:00
-eltorito-boot boot/grub/bios.img \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
--eltorito-catalog boot/grub/boot.cat \
2019-06-28 12:54:09 +00:00
--grub2-boot-info \
--grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
-eltorito-alt-boot \
2019-06-29 18:09:21 +00:00
-e EFI/efiboot.img \
-no-emul-boot \
2019-06-28 12:54:09 +00:00
-append_partition 2 0xef isolinux/efiboot.img \
-output "../ubuntu-from-scratch.iso" \
2020-06-22 07:53:47 +00:00
-m "isolinux/efiboot.img" \
-m "isolinux/bios.img" \
2019-06-28 12:54:09 +00:00
-graft-points \
2020-06-22 07:53:47 +00:00
"/EFI/efiboot.img=isolinux/efiboot.img" \
"/boot/grub/bios.img=isolinux/bios.img" \
"."
2019-06-27 14:02:56 +00:00
```
2019-06-30 00:12:15 +00:00
## Make a bootable USB image
It is simple and easy, using "dd"
2020-01-27 15:26:30 +00:00
```shell
2019-11-24 18:20:24 +00:00
sudo dd if=ubuntu-from-scratch.iso of=<device> status=progress oflag=sync
2019-06-30 16:54:56 +00:00
```