Não é sempre que preciso fazer dessas coisas, mas recentemente precisei mexer num disco de livecd do Ubuntu que estava em formato iso pra alterar algumas coisa.

Então aqui fica receita de como fazer isso (dependendo do que deseja fazer, claro).

Primeiro eu tenho dois diretórios que uso pra montagem dos filesystems.  Os /cdrom e /mnt.  Como já uso desse forma faz anos, não sei se são criados por padrão no Ubuntu ou outro sistemas.  Então se for copiar o que descrevo aqui, tenha certeza que esses diretórios existem.  Outro ponto importante é que rodo todos os comandos como root.

Então o começo de tudo é montar a imagem do Ubuntu no diretório desejado.

root@goosfraba /# mount -t iso9660 -o loop ubuntu-20.04.03-desktop-amd64.iso /cdrom

Esse conteúdo precisa ser copiado  pra um diretório temporário.

root@goosfraba /# mkdir /tmp/temp-cdrom
root@goosfraba /# cd /tmp/temp-cdrom
root@goosfraba /t/temp-cdrom# tar cvf - -C /cdrom . | tar xvf -

Existe o arquivo casper/filesystem.squashfs que é o filesystem do livecd.  Você pode montar esse disco com o seguinte comando (e aqui entra o /mnt que comentei antes):

root@goosfraba /t/temp-cdrom# mount -t squashfs -o loop /tmp/temp-cdrom/casper/filesystem.squashfs /mnt

mas esse disco é apenas read-only.  Pra modificar é preciso usar a ferramenta unsquashfs que faz parte do pacote squashfs-tools.

root@goosfraba /t/temp-cdrom# mkdir /tmp/squashfs
root@goosfraba /t/temp-cdrom# cd /tmp/squashfs
root@goosfraba /t/squashfs# unsquashfs /tmp/temp-cdrom/casper/filesystem.squashfs
Parallel unsquashfs: Using 8 processors
185020 inodes (205968 blocks) to write
[=================================================================================================================================================================/] 205968/205968 100%
created 155722 files
created 19319 directories
created 29184 symlinks
created 8 devices
created 0 fifos

root@goosfraba /t/squashfs# ls squashfs-root/
bin@  boot/  dev/  etc/  home/  lib@  lib32@  lib64@  libx32@  media/  mnt/  opt/  proc/  root/  run/  sbin@  snap/  srv/  sys/  tmp/  usr/  var/

Daí sim fazer as modificações desejadas.

Ao terminar é preciso gerar a imagem no formato squashfs novamente, agora usando o mksquashfs.  Prepare-se pra ir fazer um café ou assistir um filme pois o processo demora bastante nesse passo.

root@goosfraba /t/squashfs# mksquashfs squashfs-root /tmp/temp-cdrom/casper/filesystem.squashfs -b 1024k -comp xz -Xbcj x86 -e boot
Parallel mksquashfs: Using 8 processors
Creating 4.0 filesystem on /tmp/temp-cdrom/casper/filesystem.squashfs, block size 1048576. [=================================================================================================================================================================/] 149629/149629 100%

Exportable Squashfs 4.0 filesystem, xz compressed, data block size 1048576
        compressed data, compressed metadata, compressed fragments,
        compressed xattrs, compressed ids
        duplicates are removed
Filesystem size 1695376.64 Kbytes (1655.64 Mbytes)
        32.81% of uncompressed filesystem size (5167137.40 Kbytes)
Inode table size 1550743 bytes (1514.40 Kbytes)
        20.75% of uncompressed inode table size (7473067 bytes)
Directory table size 1819524 bytes (1776.88 Kbytes)
        36.53% of uncompressed directory table size (4981005 bytes)
Xattr table size 98 bytes (0.10 Kbytes)
        81.67% of uncompressed xattr table size (120 bytes)
Number of duplicate files found 18577
Number of inodes 204220
Number of files 155715
Number of fragments 2275
Number of symbolic links  29180
Number of device nodes 8
Number of fifo nodes 0
Number of socket nodes 0
Number of directories 19317
Number of ids (unique uids + gids) 37
Number of uids 15
        root (0)
        ntp (126)
        dnsmasq (112)
        saned (119)
        speech-dispatcher (114)
        systemd-timesync (100)
        _apt (105)
        rtkit (118)
        messagebus (106)
        man (6)
        postfix (125)
        whoopsie (109)
        sshd (121)
        sddm (122)
        syslog (104)
Number of gids 28
        root (0)
        dip (30)
        shadow (42)
        lpadmin (113)
        rtkit (126)
        mysql (131)
        nogroup (65534)
        lp (7)
        audio (29)
        systemd-timesync (102)
        utmp (43)
        tty (5)
        geoclue (105)
        _ssh (118)
        input (106)
        mail (8)
        staff (50)
        avahi (120)
        man (12)
        pulse-access (125)
        whoopsie (116)
        munin (130)
        saned (127)
        pulse (124)
        uuidd (111)
        systemd-journal (101)
        adm (4)
        messagebus (110)

E o último passo é gerar o disco bootável.  Pra isso eu usei o genisoimage:

root@goosfraba /tmp# genisoimage -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -r -J -o /tmp/ubuntu-20.04.03-modificado-desktop-amd64.iso /tmp/temp-cdrom

Com isso a image iso ubuntu-20.04.03-modificado-desktop-amd64.iso é gerada.