File: 100-build-iso

package info (click to toggle)
python-diskimage-builder 3.37.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 5,572 kB
  • sloc: sh: 7,380; python: 6,444; makefile: 37
file content (187 lines) | stat: -rwxr-xr-x 6,522 bytes parent folder | download | duplicates (2)
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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/bin/bash
#
# Copyright 2014 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

# dib-lint: disable=safe_sudo

if [ ${DIB_DEBUG_TRACE:-1} -gt 0 ]; then
    set -x
fi
set -eu
set -o pipefail

function build_efiboot_img() {
    # Signed bootloader files are saved at tmp/bootloader_files during
    # post-install stage needs to copy them into image.
    # Signed bootloader packages used are:-
    # Ubuntu: grub-efi-amd64-signed and shim-signed
    # Fedora: grub2-efi and shim

    if [[ $DISTRO_NAME = "fedora" ]] ; then
        cp $TMP_BOOTLOADER_DIR/shim.efi $TMP_BUILD_DIR/bootx64.efi
        cp $TMP_BOOTLOADER_DIR/grubx64.efi $TMP_BUILD_DIR/grubx64.efi
    elif [[ $DISTRO_NAME = "centos" ]] ; then
        cp $TMP_BOOTLOADER_DIR/shimx64-centos.efi $TMP_BUILD_DIR/bootx64.efi
        cp $TMP_BOOTLOADER_DIR/grubx64.efi $TMP_BUILD_DIR/grubx64.efi
    elif [[ $DISTRO_NAME = "ubuntu" || $DISTRO_NAME = "debian" ]] ; then
        cp $TMP_BOOTLOADER_DIR/shimx64.efi.signed $TMP_BUILD_DIR/bootx64.efi
        cp $TMP_BOOTLOADER_DIR/grubx64.efi.signed $TMP_BUILD_DIR/grubx64.efi
    else
        cp $TMP_BOOTLOADER_DIR/shim.efi.signed $TMP_BUILD_DIR/bootx64.efi
        cp $TMP_BOOTLOADER_DIR/grubx64.efi.signed $TMP_BUILD_DIR/grubx64.efi
    fi

    dd if=/dev/zero of=$TMP_BUILD_DIR/efiboot.img bs=1K count=5760
    mkdosfs -F 12 $TMP_BUILD_DIR/efiboot.img

    # Create a temporary mount point:
    MOUNTPOINT=$TMP_BUILD_DIR/tmpmount
    mkdir $MOUNTPOINT
    sudo mount -o loop $TMP_BUILD_DIR/efiboot.img $MOUNTPOINT
    sudo mkdir -p $MOUNTPOINT/EFI/BOOT
    sudo cp $TMP_BUILD_DIR/bootx64.efi $MOUNTPOINT/EFI/BOOT
    sudo cp $TMP_BUILD_DIR/grubx64.efi $MOUNTPOINT/EFI/BOOT
    sudo umount $MOUNTPOINT
    rmdir $MOUNTPOINT
    cp $TMP_BUILD_DIR/efiboot.img $TMP_IMAGE_DIR/isolinux
}

function build_iso() {

    KERNEL=$1
    INITRD=$2
    KERNEL_CMDLINE_ARGS=$3
    OUTPUT_FILENAME=$4

    SCRIPTNAME=$(basename $0)
    SCRIPTDIR=$(dirname $0)
    MKISOFS="/usr/bin/mkisofs"
    if [ $DISTRO_NAME = "fedora" ]; then
        EXTRA_KERNEL_PARAMS="usbcore.autosuspend=-1"
    #centos
    elif [ $DISTRO_NAME = "centos" ]; then
        EFI_BOOT_DIR="EFI/centos"
        EXTRA_KERNEL_PARAMS=""
    #debian
    elif [ $DISTRO_NAME = "debian" ]; then
        EXTRA_KERNEL_PARAMS=""
    #ubuntu:
    else
        EXTRA_KERNEL_PARAMS=""
    fi

    # Create a temporary build directory for holding the contents of iso
    TMP_IMAGE_DIR="$TMP_BUILD_DIR/image"
    echo "Creating temporary directory $TMP_IMAGE_DIR"
    mkdir -p "$TMP_IMAGE_DIR"

    # Copy isolinux bin to the isolinux directory
    mkdir -p "$TMP_IMAGE_DIR/isolinux"
    echo "Copying isolinux.bin"

    ISOLINUX_BIN=$TMP_BOOTLOADER_DIR/isolinux.bin
    LDLINUX_BIN=$TMP_BOOTLOADER_DIR/ldlinux.c32

    cp $ISOLINUX_BIN "$TMP_IMAGE_DIR/isolinux"

    # Starting from SYSLINUX 5.00, the isolinux.bin is dependent
    # on ldlinux.c32.
    # http://www.syslinux.org/wiki/index.php/Library_modules
    if [ -f "$LDLINUX_BIN" ]; then
        cp $LDLINUX_BIN "$TMP_IMAGE_DIR/isolinux"
    fi

    # Copy initrd, kernel
    echo "Copying kernel to $TMP_IMAGE_DIR/vmlinuz"
    cp $KERNEL "$TMP_IMAGE_DIR/vmlinuz"

    echo "Copying initrd to $TMP_IMAGE_DIR/initrd"
    cp $INITRD "$TMP_IMAGE_DIR/initrd"

    # Generate isolinux.cfg for default booting
    echo "Generating isolinux.cfg"
    cat > "$TMP_IMAGE_DIR/isolinux/isolinux.cfg" << END_CONFIG
DEFAULT install
LABEL install
menu label "Install image"
    kernel /vmlinuz
    append initrd=/initrd $KERNEL_CMDLINE_ARGS --
TIMEOUT 5
PROMPT 0
END_CONFIG

    echo "Creating EFI/ubuntu directory"
    mkdir -p "$TMP_IMAGE_DIR/$EFI_BOOT_DIR"

    # Generate grub.cfg for default booting
    echo "Generating grub.cfg"
    cat > "$TMP_IMAGE_DIR/$EFI_BOOT_DIR/grub.cfg" << END_CONFIG
set default="0"
set timeout="5"
set hidden_timeout_quiet=false

menuentry "install" {
    search --set=root --label VMEDIA_BOOT_ISO
    linuxefi /vmlinuz  $EXTRA_KERNEL_PARAMS $KERNEL_CMDLINE_ARGS --
    initrdefi /initrd
}
END_CONFIG

    build_efiboot_img

    # Create the ISO
    echo "Generating the ISO"
    $MKISOFS -r -V "VMEDIA_BOOT_ISO" -cache-inodes -J -l \
    -b isolinux/isolinux.bin  -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -eltorito-alt-boot -e isolinux/efiboot.img \
    -no-emul-boot -o $OUTPUT_FILENAME $TMP_IMAGE_DIR

}

IMAGE_NAME=${IMAGE_NAME:-'image'}

if echo $IMAGE_ELEMENT | grep -q '\bramdisk\b'; then
    EMITTED_KERNEL=$IMAGE_NAME.kernel
    EMITTED_RAMDISK=$IMAGE_NAME.initramfs
    DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS=${DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS:-}
    EMITTED_KERNEL_CMDLINE_ARGS="boot_method=vmedia $DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS"
    EMITTED_ISO_FILENAME=$IMAGE_NAME.iso
elif echo $IMAGE_ELEMENT | grep -q '\bironic-python-agent\b'; then
    EMITTED_KERNEL=$IMAGE_NAME.vmlinuz
    EMITTED_RAMDISK=$IMAGE_NAME.initramfs
    DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS=${DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS:-}
    EMITTED_KERNEL_CMDLINE_ARGS="boot_method=vmedia $DIB_DEPLOY_ISO_KERNEL_CMDLINE_ARGS"
    EMITTED_ISO_FILENAME=$IMAGE_NAME.iso
elif echo $IMAGE_ELEMENT | grep -q '\bbaremetal\b'; then
    EMITTED_KERNEL=${IMAGE_NAME}.vmlinuz
    EMITTED_RAMDISK=${IMAGE_NAME}.initrd
    EMITTED_KERNEL_CMDLINE_ARGS="root=LABEL=${DIB_BOOT_LABEL}"
    DIB_BOOT_ISO_KERNEL_CMDLINE_ARGS=${DIB_BOOT_ISO_KERNEL_CMDLINE_ARGS:-}
    if [ -n "$DIB_BOOT_ISO_KERNEL_CMDLINE_ARGS" ]; then
        EMITTED_KERNEL_CMDLINE_ARGS="$EMITTED_KERNEL_CMDLINE_ARGS $DIB_BOOT_ISO_KERNEL_CMDLINE_ARGS"
    fi
    export EMITTED_ISO_FILENAME="$IMAGE_NAME-boot.iso"
else
    echo "Cannot find the kernel/ramdisk to build the iso image. "
    echo "Please use 'iso' element with either 'baremetal' or 'ramdisk' elements"
fi

export TMP_BOOTLOADER_DIR=$TARGET_ROOT/tmp/bootloader_files
build_iso "$EMITTED_KERNEL" "$EMITTED_RAMDISK" "$EMITTED_KERNEL_CMDLINE_ARGS" \
    "$EMITTED_ISO_FILENAME"

# Clean-up the bootloaders directory
sudo rm -fr $TMP_BOOTLOADER_DIR