mkarchiso 7.07 KB
Newer Older
1
#! /bin/bash
2
3
4
5

PKGLIST=""
QUIET="y"
FORCE="n"
6
MOUNTFILE="$(pwd)/mounts"
Aaron Griffin's avatar
Aaron Griffin committed
7
IMG_TYPE="iso"
8
9
10
11
12
13
14
15
16

APPNAME=$(basename "${0}")

# usage: usage <exitvalue>
usage ()
{
    echo "usage ${APPNAME} [options] command <command options>"
    echo " general options:"
    echo "    -f               Force overwrite of working files/squashfs image/bootable image"
17
    echo "    -p PACKAGE(S)    Additional package(s) to install, can be used multiple times"
18
19
20
    echo "    -v               Enable verbose output."
    echo "    -h               This message."
    echo " commands:"
21
22
23
24
25
26
27
    echo "   create <dir>"
    echo "      create a base directory layout to work with"
    echo "      includes all specified packages"
    echo "   iso -p <bootloader> <dir> <image name>"
    echo "      build an iso image from the working dir"
    echo "   usb -p <bootloader> <dir> <image name>"
    echo "      build an iso image from the working dir"
28
29
30
31
32
33
34
35
36
37
38
39
40
    exit $1
}

while getopts 'i:P:p:a:t:fvh' arg; do
    case "${arg}" in
        p) PKGLIST="${PKGLIST} ${OPTARG}" ;;
        f) FORCE="y" ;;
        v) QUIET="n" ;;
        h|?) usage 0 ;;
        *) echo "invalid argument '${arg}'"; usage 1 ;;
    esac
done

41
42
43
#trim spaces
PKGLIST="$(echo $PKGLIST)"

44
45
46
47
48
49
50
51
52
53
shift $(($OPTIND - 1))
echo "ARGS: $@"

# do UID checking here so someone can at least get usage instructions
if [ "$EUID" != "0" ]; then
    echo "error: This script must be run as root."
    exit 1
fi

command_name="${1}"
54
55
56
work_dir=""
imgname=""

57
case "${command_name}" in
58
59
60
    create) work_dir="${2}"; imgname="none" ;;
    iso) work_dir="${2}"; imgname="${3}" ;;
    usb) work_dir="${2}"; imgname="${3}" ;;
61
62
63
    *) echo "invalid command name '${command_name}'"; usage 1 ;;
esac

64
65
[ "x${imgname}" = "x" ] && (echo "Image name must be specified" && usage 1)
[ "x${work_dir}" = "x" ] && (echo "Please specify a working directory" && usage 1)
66

67
68
69
70
71
echo "${APPNAME} : Configuration Settings"
echo "        working directory:   ${work_dir}"
echo "               image name:   ${imgname}"
echo "               image type:   ${IMG_TYPE}"

72
73
74
75
76
# usage: _pacman <packages>...
_pacman ()
{
    local ret
    if [ "${QUIET}" = "y" ]; then
77
        mkarchroot -f ${work_dir} $* 2>&1 >/dev/null
78
79
        ret=$?
    else
80
        mkarchroot -f ${work_dir} $*
81
82
        ret=$?
    fi
83
84
85
86

    # Cleanup
    find "${work_dir}" -name *.pacnew -name *.pacsave -name *.pacorig -delete

87
88
89
90
91
    if [ $ret -ne 0 ]; then
        exit 1
    fi
}

92
93
94
95
96
97
98
99
100
command_create () {
    echo "====> Creating working directory: ${work_dir}"
    mkdir -p "${work_dir}/iso/"
    mkdir -p "${work_dir}/root-image/"
    echo "# archiso isomounts file
# img - location of image/directory to mount relative to addons directory
# arch - architecture of this image
# mount point - absolute location on the post-initrd root
# type - either 'bind' or 'squashfs' for now
101

102
# syntax: <img> <arch> <mount point> <type>
103

104
105
root-image.sqfs i686 / squashfs
#root-image-x86_64.sqfs x86_64 / squashfs" > "${work_dir}/isomounts"
106

107
    echo "README for this archiso created directory
108

109
110
111
All directories in this dir, except for 'iso' will be squashed
with squashfs and put into the iso dir as iso/<dirname>.sqfs
This should be reflected in the isomounts file
112

113
114
The iso dir is later used to build the actual bootable iso.
...TODO..." > "${work_dir}/README"
115

116
117
118
    if [ "${PKGLIST}" != "" ]; then
        echo "====> Installing packages to '${work_dir}/root-image/'"
        _pacman "${PKGLIST}"
119

120
121
122
123
        echo "Cleaning up what we can"
        if [ -d "${work_dir}/root-image/boot/" ]; then
            # remove the initcpio images that were generated for the host system
            find "${work_dir}/root-image/boot" -name *.img -delete
124
125
        fi

126
127
128
129
130
131
132
133
134
135
136
137
138
139
        #TODO is this needed? do it at the Makefile level?
        if [ -d "${work_dir}/root-image/home/" ]; then
            echo "Creating default home directory"
            install -d -o1000 -g100 -m0755 "${work_dir}/root-image/home/arch"
        fi

        # delete a lot of unnecessary cache/log files
        kill_dirs="var/abs var/cache/man var/cache/pacman var/lib/pacman/sync var/log/* var/mail tmp/* initrd"
        for x in ${kill_dirs}; do
            if [ -e "${work_dir}/root-image/${x}" ]; then
                rm -rf "${work_dir}/root-image/${x}"
            fi
        done
    fi
140
}
141

142
# command_squash path image
143
command_squash () {
144
145
    echo "====> Generating SquashFS image ${imgname}"
    if [ -e "${imgname}" ]; then
146
147
        if [ "${FORCE}" = "y" ]; then
            echo -n "Removing old SquashFS image..."
148
            rm "${imgname}"
149
150
            echo "done."
        else
151
            echo "error: SquashFS image '${imgname}' already exists, aborting."
152
153
154
155
            exit 1
        fi
    fi

156
    echo "Creating SquashFS image. This may take some time..."
157
158
    start=$(date +%s)
    if [ "${QUIET}" = "y" ]; then
159
        mksquashfs "${work_dir}" "${imgname}" -noappend >/dev/null
160
    else
161
        mksquashfs "${work_dir}" "${imgname}" -noappend
162
163
164
    fi
    minutes=$(echo $start $(date +%s) | awk '{ printf "%0.2f",($2-$1)/60 }')
    echo "Image creation done in $minutes minutes."
165
}
166

167
command_image () {
168
169
170
171
172
173
174
175
176
177
178
    echo "====> Making bootable image"
    if [ -e "${imgname}" ]; then
        if [ "${FORCE}" = "y" ]; then
            echo "Removing existing bootable image..."
            rm -rf "${imgname}"
        else
            echo "error: Image '${imgname}' already exists, aborting."
            exit 1
        fi
    fi

Aaron Griffin's avatar
Aaron Griffin committed
179
180
181
182
183
184
    if [ ! -e "${MOUNTFILE}" ]; then
        echo "error: mount file '${MOUNTFILE}' does not exist, aborting."
        exit 1
    fi
    cp "${MOUNTFILE}" "${work_dir}/mounts"

185
    bootflags=""
Aaron Griffin's avatar
Aaron Griffin committed
186
187
188
    if [ "$PKGLIST" = "grub" -o "$PKGLIST" = "grub-gfx" ]; then
        #test for either (eww, gross)
        tst=0
189
        pacman -Qi grub >/dev/null 2>&1
Aaron Griffin's avatar
Aaron Griffin committed
190
        tst=$(($tst + $?))
191
        pacman -Qi grub-gfx >/dev/null 2>&1
Aaron Griffin's avatar
Aaron Griffin committed
192
193
194
195
196
197
        tst=$(($tst + $?))
        if [ $tst -ge 2 ]; then
            echo "grub or grub-gfx not found on host system. Cannot install!"
            exit 1
        fi

198
199
200
201
        if [ ! -e "${work_dir}/boot/grub/stage2_eltorito" ]; then
            echo "error: grub stage files not found in '${work_dir}/boot/grub"
            exit 1
        fi
Aaron Griffin's avatar
Aaron Griffin committed
202
203

        bootflags="-b boot/grub/stage2_eltorito"
Aaron Griffin's avatar
Aaron Griffin committed
204
    elif [ "$PKGLIST" = "syslinux" ]; then
205
        if ! pacman -Qi $PKGLIST >/dev/null 2>&1; then
Aaron Griffin's avatar
Aaron Griffin committed
206
207
            echo "$PKGLIST not found on host system. Cannot install!"
            exit 1
208
        fi
Aaron Griffin's avatar
Aaron Griffin committed
209

210
211
212
213
        if [ ! -e "${work_dir}/boot/isolinux/isolinux.bin" ]; then
            echo "error: isolinux bin file not found in '${work_dir}/boot/isolinux"
            exit 1
        fi
Aaron Griffin's avatar
Aaron Griffin committed
214
215

        bootflags="-b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat"
216
    else
Aaron Griffin's avatar
Aaron Griffin committed
217
218
219
220
        echo "No bootloader specified. Use the -p flag to specify"
        echo "  Supported Bootloaders:"
        echo "     grub"
        echo "     grub-gfx"
Aaron Griffin's avatar
Aaron Griffin committed
221
        echo "     syslinux"
Aaron Griffin's avatar
Aaron Griffin committed
222
        exit 1
223
    fi
224

225
226
# Go through the main commands in order. If 'all' was specified, then we want
# to do everything. Start with 'install'.
227
if [ "${command_name}" = "install"  ]; then
228
229
    command_install
fi
230
if [ "${command_name}" = "squash" ]; then
231
232
    command_squash
fi
233
234
if [ "${command_name}" = "image" ]; then
    command_image
235
236
237
fi

# vim:ts=4:sw=4:et: