initial commit
This commit is contained in:
commit
3a38c7a21c
1 changed files with 119 additions and 0 deletions
119
create.sh
Executable file
119
create.sh
Executable file
|
@ -0,0 +1,119 @@
|
|||
#!/bin/sh
|
||||
|
||||
# the problem with this approach is: while it allows to multiboot a kernel and
|
||||
# initrd, it will pick the rootfs from the first partition always
|
||||
|
||||
set -e
|
||||
|
||||
mkdir -p isomount
|
||||
mkdir -p extmount
|
||||
mkdir -p mainmount
|
||||
|
||||
cleanup() {
|
||||
sudo umount isomount
|
||||
sudo umount extmount
|
||||
sudo umount mainmount
|
||||
}
|
||||
|
||||
trap cleanup 1 2 15
|
||||
|
||||
PATH=$PATH:/sbin:/usr/sbin
|
||||
TMP=.
|
||||
|
||||
bs=512
|
||||
|
||||
# the size of the first partition
|
||||
mainsize=1024
|
||||
|
||||
echo " ++ creating main partition"
|
||||
|
||||
main="$TMP"/main
|
||||
fallocate -l $((mainsize*bs)) "$main"
|
||||
mke2fs -F "$main" > /dev/null 2>&1
|
||||
sudo mount "$main" mainmount > /dev/null 2>&1
|
||||
sudo mkdir mainmount/extlinux
|
||||
sudo extlinux --install mainmount/extlinux > /dev/null 2>&1
|
||||
sudo cp /usr/lib/syslinux/chain.c32 /usr/lib/syslinux/menu.c32 mainmount/extlinux
|
||||
echo "UI menu.c32" | sudo tee mainmount/extlinux/extlinux.conf > /dev/null 2>&1
|
||||
|
||||
# the first partition to boot from is the first logical one
|
||||
count=5
|
||||
|
||||
sum=0
|
||||
# first we check how much space each iso content needs in an ext2 filesystem
|
||||
for iso in *.iso; do
|
||||
echo " ++ processing $iso"
|
||||
b="$TMP"/`basename "$iso" .iso`.ext2
|
||||
# get the size of the iso
|
||||
size=`stat -c %s "$iso"`
|
||||
# create an image of that size +20% for safety margin
|
||||
size10=$(((size*120)/100))
|
||||
fallocate -l $size10 "$b"
|
||||
mke2fs -F "$b" > /dev/null 2>&1
|
||||
#fuse-ext2 -o rw+ "$b" extmount
|
||||
#fuse-ext2 -v -o rw,force "$b" extmount -o debug > log 2>&1 &
|
||||
sudo mount "$b" extmount
|
||||
#fuseiso "$iso" isomount
|
||||
sudo mount "$iso" isomount > /dev/null 2>&1
|
||||
sudo cp -r isomount/. extmount
|
||||
sudo mv extmount/isolinux extmount/extlinux
|
||||
sudo mv extmount/extlinux/isolinux.cfg extmount/extlinux/extlinux.conf
|
||||
sudo extlinux --install extmount/extlinux > /dev/null 2>&1
|
||||
sudo cp /usr/lib/syslinux/chain.c32 /usr/lib/syslinux/menu.c32 extmount/extlinux
|
||||
#fusermount -u extmount
|
||||
sudo umount extmount
|
||||
#fusermount -u isomount
|
||||
sudo umount isomount
|
||||
e2fsck -yf "$b" > /dev/null 2>&1
|
||||
resize2fs -M "$b" > /dev/null 2>&1
|
||||
newsize=`stat -c %s "$b"`
|
||||
sectorcount=$((newsize/bs+3))
|
||||
sum=$((sum+sectorcount*bs))
|
||||
sudo tee -a mainmount/extlinux/extlinux.conf > /dev/null << EOF
|
||||
LABEL $count
|
||||
MENU LABEL $iso
|
||||
COM32 chain.c32
|
||||
APPEND hd0 $count
|
||||
EOF
|
||||
count=$((count+1))
|
||||
done
|
||||
|
||||
sudo umount mainmount
|
||||
|
||||
echo " ++ creating disk image"
|
||||
|
||||
# create the final image
|
||||
root="$TMP"/root.img
|
||||
fallocate -l $((sum+bs*(mainsize+2))) "$root"
|
||||
|
||||
# create the initial disk layout
|
||||
parted -s -- "$root" mklabel msdos > /dev/null 2>&1
|
||||
parted -s -- "$root" mkpart primary ext2 1s ${mainsize}s > /dev/null 2>&1
|
||||
parted -s -- "$root" set 1 boot on > /dev/null 2>&1
|
||||
parted -s -- "$root" mkpart extended $((mainsize+1))s -1s > /dev/null 2>&1
|
||||
|
||||
dd if="$main" of="$root" obs=$bs seek=1 conv=notrunc > /dev/null 2>&1
|
||||
rm "$main"
|
||||
|
||||
# create partitions for all isos
|
||||
start=$((mainsize+2))
|
||||
for ext2 in "$TMP"/*.ext2; do
|
||||
echo " ++ filling with $ext2"
|
||||
size=`stat -c %s "$ext2"`
|
||||
ssize=$((size/bs+1))
|
||||
parted -s -- "$root" mkpart logical ext2 ${start}s $((start+ssize))s > /dev/null 2>&1
|
||||
# copy ext2 fs to newly created partition
|
||||
offset=`/sbin/parted -m "$root" unit s print | tail -1 | sed 's/^[0-9]\+:\([^:s]\+\)s:.*/\1/'`
|
||||
dd if="$ext2" of="$root" obs=$bs seek=$offset conv=notrunc > /dev/null 2>&1
|
||||
rm "$ext2"
|
||||
start=$((start+ssize+2))
|
||||
done
|
||||
|
||||
# make the whole thing bootable
|
||||
dd conv=notrunc bs=440 count=1 if=/usr/lib/extlinux/mbr.bin of="$root" > /dev/null 2>&1
|
||||
|
||||
rm -df extmount
|
||||
rm -df isomount
|
||||
rm -df mainmount
|
||||
|
||||
echo " ++ success! The result is stored in $root"
|
Loading…
Reference in a new issue