Multi-distro LiveUSB - ParabolaWiki

# Multi-distro LiveUSB

## Introduction

This howto shows how to create a liveusb that can:

- contains more than one iso.
- contain other partitions

## Howto

This howto was tested on qemu, adapt it for real hardware.

- convert The isos to be able to run on a partition

    # isohybrid --partok trisquel_6.0.1_i686.iso

parabola-2013.09.01-dual.iso seems to be already converted.

- create the image, I used qemu for testing so I created a loop file.

    # qemu-img create -f raw ./usd.img 3780M

- find the isos size with size.sh

    # ./size.sh trisquel_6.0.1_i686.iso
    +708608K

- create partitions with fdisk, for example:

    # fdisk ./usd.img

    Welcome to fdisk (util-linux 2.25).
    Changes will remain in memory only, until you decide to write them.
    Be careful before using the write command.

    Device does not contain a recognized partition table.
    Created a new DOS disklabel with disk identifier 0xb94f94ec.

    Command (m for help): n
    Partition type
       p   primary (0 primary, 0 extended, 4 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (1-4, default 1):
    First sector (2048-7741439, default 2048):
    Last sector, +sectors or +size{K,M,G,T,P} (2048-7741439, default 7741439): +32M

    Created a new partition 1 of type 'Linux' and of size 32 MiB.

    Command (m for help): p
    Disk ./usd.img: 3.7 GiB, 3963617280 bytes, 7741440 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0xb94f94ec

    Device     Boot Start   End Sectors Size Id Type
    ./usd.img1       2048 67583   65536  32M 83 Linux

    Command (m for help): n
    Partition type
       p   primary (1 primary, 0 extended, 3 free)
       e   extended (container for logical partitions)
    Select (default p):

    Using default response p.
    Partition number (2-4, default 2):
    First sector (67584-7741439, default 67584):
    Last sector, +sectors or +size{K,M,G,T,P} (67584-7741439, default 7741439): +708608K

    Created a new partition 2 of type 'Linux' and of size 692 MiB.

    Command (m for help): p
    Disk ./usd.img: 3.7 GiB, 3963617280 bytes, 7741440 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0xb94f94ec

    Device     Boot Start     End Sectors  Size Id Type
    ./usd.img1       2048   67583   65536   32M 83 Linux
    ./usd.img2      67584 1484799 1417216  692M 83 Linux

    Command (m for help): n
    Partition type
       p   primary (2 primary, 0 extended, 2 free)
       e   extended (container for logical partitions)
    Select (default p): p
    Partition number (3,4, default 3):
    First sector (1484800-7741439, default 1484800):
    Last sector, +sectors or +size{K,M,G,T,P} (1484800-7741439, default 7741439): +481280K

    Created a new partition 3 of type 'Linux' and of size 470 MiB.

    Command (m for help): p
    Disk ./usd.img: 3.7 GiB, 3963617280 bytes, 7741440 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0xb94f94ec

    Device     Boot   Start     End Sectors  Size Id Type
    ./usd.img1         2048   67583   65536   32M 83 Linux
    ./usd.img2        67584 1484799 1417216  692M 83 Linux
    ./usd.img3      1484800 2447359  962560  470M 83 Linux

    Command (m for help): n
    Partition type
       p   primary (3 primary, 0 extended, 1 free)
       e   extended (container for logical partitions)
    Select (default e): p

    Selected partition 4
    First sector (2447360-7741439, default 2447360):
    Last sector, +sectors or +size{K,M,G,T,P} (2447360-7741439, default 7741439):

    Created a new partition 4 of type 'Linux' and of size 2.5 GiB.

    Command (m for help):

    Command (m for help): p

    Disk ./usd.img: 3.7 GiB, 3963617280 bytes, 7741440 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: dos
    Disk identifier: 0xb94f94ec

    Device     Boot   Start     End Sectors  Size Id Type
    ./usd.img1         2048   67583   65536   32M 83 Linux
    ./usd.img2        67584 1484799 1417216  692M 83 Linux
    ./usd.img3      1484800 2447359  962560  470M 83 Linux
    ./usd.img4      2447360 7741439 5294080  2.5G 83 Linux

    Command (m for help): w
    The partition table has been altered.
    Syncing disks.

- check if there is already some dm-mapper loop partitions

    # ls -l /dev/mapper/loop*
    ls: cannot access /dev/mapper/loop*: No such file or directory

If there is none, you're good

- Then add the partitions mapping

    kpartx -a usd.img

- check if it worked:

    ls -l /dev/mapper/loop*

    # ls -l /dev/mapper/loop*
    lrwxrwxrwx 1 root root 7 Sep  7 12:54 /dev/mapper/loop0p1 -> ../dm-7
    lrwxrwxrwx 1 root root 7 Sep  7 12:54 /dev/mapper/loop0p2 -> ../dm-8
    lrwxrwxrwx 1 root root 7 Sep  7 12:54 /dev/mapper/loop0p3 -> ../dm-9
    lrwxrwxrwx 1 root root 8 Sep  7 12:54 /dev/mapper/loop0p4 -> ../dm-10

- install grub on the boot partition:

    # mkfs.ext4 /dev/mapper/loop0p1
    mount /dev/mapper/loop0p1 /mnt
    cp -a /boot/grub/ /mnt/
    umount /mnt
    mount /dev/mapper/loop0p1 /boot
    grub-install ./usd.img
    umount /boot

- Add the isos:

    ddrescue trisquel_6.0.1_i686.iso /dev/mapper/loop0p2 -f
    ddrescue parabola-2013.09.01-dual.iso /dev/mapper/loop0p3 -f

- Add the data partition:

    mkfs.ext4 /dev/mapper/loop0p4

    # kpartx -d ./usd.img
    # dmsetup remove /dev/mapper/loop0p4
    # dmsetup remove /dev/mapper/loop0p3
    # dmsetup remove /dev/mapper/loop0p2
    # dmsetup remove /dev/mapper/loop0p1
    # sync

Now you have the image ready, I tested with qemu like that:

    qemu-system-i386 -enable-kvm -serial stdio -m 2047M -hda ./usd.img

Then in grub I did:

    set root=hd0,msdos2
    syslinux_configfile /isolinux/isolinux.cfg

And the trisquel menu appeared. I then could boot trisquel

## grub.cfg

    menuentry 'Trisquel' {
            set root=hd0,msdos2
            syslinux_configfile /isolinux/isolinux.cfg
    }

    menuentry 'Parabola' {

    }

Categories:

- LiveImage Maker
- Actual source code
- Software