summaryrefslogtreecommitdiff
path: root/iso/mkiso.sh
blob: 84a9782efbce8b545d4f7e48594185b0462e932f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#!/bin/sh

ISO_NAME="xilinux-$(date -u +%Y%m%d)"
ISO_LABEL="XILINUX"
PUBLISHER="davidovski"
SYSLINUX_VER=6.04-pre1

XI_ARGS="-yq"

WORKDIR=/tmp/xiiso

chroot=$WORKDIR/chroot
isoroot=$WORKDIR/iso
iso_pkgs="linux linux-firmware base dracut grub mksh xipkg squashfs-tools lvm2 cryptsetup networkmanager stty xitui neofetch vim nano gnupg dosfstools"

cmdline="splash console=tty0 console=ttyS0,9600 root=live:CDLABEL=$ISO_LABEL rd.live.dir=/ rd.live.squashimg=filesystem.squashfs rd.live.debug=1 quiet"

grub_mod="all_video disk part_gpt part_msdos linux normal configfile search search_label efi_gop fat iso9660 cat echo ls test true help gzio"

mkdir -p $WORKDIR

create_basesystem () {
    xi $XI_ARGS sync
    xi $XI_ARGS -r "$chroot" bootstrap
    xi $XI_ARGS -r "$chroot" install "$iso_pkgs"
}

configure_system() {

    cat > $chroot/etc/resolv.conf << EOF
nameserver 80.80.80.80
EOF

    hostname=xilinux
    echo xilinux > $chroot/etc/hostname

    cat > $chroot/etc/hosts << EOF
127.0.0.1   localhost
::1         localhost
127.0.1.1   $hostname.local $hostname
EOF

    cp -r ./root $chroot/

    cat > $chroot/etc/conf.d/agetty << EOF
agetty_options="--autologin root --noclear"
EOF

    xichroot $chroot rc-update add networkmanager
    
}

build_initramfs () {
    kernel_version=$(ls $chroot/usr/lib/modules | tail -1)
    export kernel_version

    mkdir -p "$chroot"/var/tmp
    xichroot "$chroot" dracut --nomdadmconf --nolvmconf --xz --add dmsquash-live --add bash --add convertfs --add pollcdrom --force --kver $kernel_version

}

create_isoroot() {
    mkdir -p $isoroot/
    cp $chroot/boot/vmlinuz-** $isoroot/vmlinuz
    cp $chroot/boot/initramfs-** $isoroot/initrd.img

    mkdir -p $isoroot/isolinux
}

install_syslinux () {
    curl https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/Testing/$(echo $SYSLINUX_VER | cut -d'-' -f1)/syslinux-$SYSLINUX_VER.tar.xz > syslinux-$SYSLINUX_VER.tar.xz

    tar -C $WORKDIR -xf syslinux-$SYSLINUX_VER.tar.xz
    #cp syslinux-$SYSLINUX_VER
    cp $WORKDIR/syslinux-$SYSLINUX_VER/bios/core/isolinux.bin $isoroot/isolinux/isolinux.bin
    cp $WORKDIR/syslinux-$SYSLINUX_VER/bios/com32/elflink/ldlinux/ldlinux.c32 $isoroot/isolinux/ldlinux.c32

    cat > $isoroot/isolinux/isolinux.cfg << EOF
default 1

label 1
    kernel /vmlinuz
    append initrd=/initrd.img $cmdline
EOF

}

build_grub_efi () {
    mkdir -p $isoroot/boot/grub
    cat > $isoroot/boot/grub/grub.cfg << EOF
    set timeout_style=hidden
    set timeout=0
    menuentry "XiLinux" {
        linux	/vmlinuz $cmdline
        initrd	/initrd.img
    }
EOF
    cksum=$(md5sum $isoroot/boot/grub/grub.cfg | cut -d' ' -f1)

    mkdir -p $isoroot/efi/boot

    cat > $WORKDIR/grub_early.$cksum.cfg << EOF
	search --no-floppy --set=root --label "$ISO_LABEL"
	set prefix=(\$root)/boot/grub
EOF

    grub-mkimage \
		--config="$WORKDIR/grub_early.$cksum.cfg" \
		--prefix="/boot/grub" \
		--output="$isoroot/efi/boot/bootx64.efi" \
		--format="x86_64-efi" \
		--compression="xz" \
        $grub_mod

    mformat -i $isoroot/boot/grub/efi.img -C -f 1440 -N 0 ::
    mcopy -i $isoroot/boot/grub/efi.img -s $isoroot/efi ::
}

build_iso () {
    mksquashfs $chroot $isoroot/filesystem.squashfs -noappend -no-progress -e "/proc/*" -e "/dev/*" -e "/sys/*" 
    xorrisofs -output ${ISO_NAME}.iso \
            -joliet \
            -rational-rock \
            -sysid LINUX \
            -volid "$ISO_LABEL" \
            -eltorito-boot isolinux/isolinux.bin \
            -eltorito-catalog isolinux/boot.cat \
            -no-emul-boot \
            -boot-load-size 4 \
            -boot-info-table \
            -eltorito-alt-boot \
            -e boot/grub/efi.img \
            -no-emul-boot \
            -isohybrid-gpt-basdat \
            -follow-links \
            $isoroot


    printf "ISO written to $ISO_NAME.iso\n"
}


[ "$#" = 0 ] && {
    steps="
    create_basesystem
    configure_system
    build_initramfs
    create_isoroot
    install_syslinux 
    build_grub_efi 
    build_iso
    "
} || {
    steps="$*"
}

for step in $steps; do
    $step || {
        printf "%s\n" "${RED}An error occured!"
        exit 1
    }
done