10 cache_dir="${work_dir}/cache"
11 out_dir="${work_dir}/out"
12 script_path=$(readlink -f ${0%/*})
13 channels_dir="${script_path}/channels"
15 mirror="http://ftp.jaist.ac.jp/pub/Linux/ubuntu/"
19 iso_label="${os_name}_${codename}_${arch}"
20 iso_publisher='Fascode Network <https://fascode.net>'
21 iso_application="${os_name} Live/Rescue CD"
22 iso_version="${codename}-$(date +%Y.%m.%d)"
23 iso_filename="${iso_name}-${iso_version}-${arch}.iso"
26 # Show an INFO message
30 "${script_path}/echo_color" -t 36 "[LUBS Core]" /! -t 32 "INFO:" "/#${_msg}"
33 # Show an ERROR message then exit with status
34 # _msg_error <message> <exit code>
38 "${script_path}/echo_color" -t 36 "[LUBS Core]" /! -t 31 "ERROR:" "/#${_msg}" >&2
39 if [[ ! ${_error} = 0 ]]; then
45 _msg_info "make ${1} is starting."
49 _msg_info "make ${1} was done!"
52 # Helper function to run make_*() only one time.
55 if [[ "run_out" == "$1" ]]; then
61 if [[ ! -e "${work_dir}/build.${name}" ]]; then
62 if [[ "run_out" == "$1" ]]; then
68 touch "${work_dir}/build.${name}"
73 "${script_path}/lubs-chroot" "${work_dir}/airootfs" ${@}
83 run_cmd apt-get --yes install ${@}
90 if [[ ${EUID} -ne 0 ]]; then
91 _msg_error "This script must be run as root." 1
94 [[ ! -d "${work_dir}" ]] && mkdir -p "${work_dir}"
97 for mount in $(mount | awk '{print $3}' | grep $(realpath ${work_dir}) | sort -r); do
98 _msg_info "Unmounting ${mount}"
108 _msg_start "${job_name}"
110 if [[ ! -d "${cache_dir}/${codename}" ]]; then
111 _msg_info "Installing Ubuntu to '${cache_dir}/${codename}'..."
112 mkdir -p "${cache_dir}/${codename}"
113 debootstrap --arch=${arch} --include=linux-image-generic --verbose --merged-usr "${codename}" "${cache_dir}/${codename}" ${mirror}
114 _msg_info "${codename} installed successfully!"
116 _msg_info "${codename} cache is found."
119 rm -rf "${work_dir}/airootfs" && mkdir -p "${work_dir}/airootfs"
120 _msg_info "copy base files from '${cache_dir}/${codename}' to '${work_dir}/airootfs'..."
121 rsync -au "${cache_dir}/${codename}/" "${work_dir}/airootfs"
122 echo 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${PATH}' >> "${work_dir}/airootfs/etc/bash.bashrc"
123 run_cmd apt-get update
124 # run_cmd apt-get upgrade
126 _msg_end "${job_name}"
131 job_name="sourcelist"
132 _msg_start "${job_name}"
134 cp ${script_path}/source.list.d/${codename}/* ${work_dir}/airootfs/etc/apt
136 _msg_end "${job_name}"
142 _msg_start "${job_name}"
144 _apt_install systemd-sysv
145 run_cmd dbus-uuidgen > /etc/machine-id
146 run_cmd ln -fs /etc/machine-id /var/lib/dbus/machine-id
148 _msg_end "${job_name}"
154 _msg_start "${job_name}"
156 run_cmd apt-get update
157 installpkglist=($(grep -h -v ^'#' ${script_path}/packages.x86_64))
158 run_cmd sudo -i apt-get --yes install ${installpkglist[@]}
160 _msg_end "${job_name}"
166 _msg_start "${job_name}"
169 run_cmd env -i bash -c 'DEBIAN_FRONTEND=noninteractive LANG=en_US.UTF-8 LC_ALL=C LANGUAGE=en_US.UTF-8 dpkg-reconfigure locales'
172 run_cmd env -i bash -c 'DEBIAN_FRONTEND=noninteractive dpkg-reconfigure resolvconf'
175 cp ${channels_dir}/share/airootfs/etc/NetworkManager/NetworkManager.conf ${work_dir}/airootfs/etc/NetworkManager/NetworkManager.conf
178 #run_cmd echo -ne "UTC" > '/etc/timezone'
179 #run_cmd dpkg-reconfigure -f noninteractive tzdata
181 run_cmd env -i bash -c 'DEBIAN_FRONTEND=noninteractive dpkg-reconfigure network-manager'
182 run_cmd truncate -s 0 /etc/machine-id
184 _msg_end "${job_name}"
187 make_customize_airootfs() {
189 job_name="customize airootfs"
190 _msg_start "${job_name}"
192 # Overwrite airootfs with customize_airootfs.
193 cp -af "${channels_dir}/share/airootfs" "${work_dir}"
195 if [[ -f "${work_dir}/airootfs/root/customize_airootfs.sh" ]]; then
196 chmod 755 "${work_dir}/airootfs/root/customize_airootfs.sh"
197 run_cmd "/root/customize_airootfs.sh"
200 _msg_end "${job_name}"
206 _msg_start "${job_name}"
208 run_cmd apt-get clean
209 run_cmd apt-get --yes autoremove
210 run_cmd rm -rf "/tmp/* ~/.bash_history"
212 _msg_end "${job_name}"
217 job_name="boot files"
218 _msg_start "${job_name}"
220 run_cmd update-initramfs -c -k all
221 _apt_install memtest86+
222 mkdir -p ${out_dir}/{casper,isolinux,install}
223 cp ${work_dir}/airootfs/boot/vmlinuz-*-*-generic ${out_dir}/casper/vmlinuz
224 cp ${work_dir}/airootfs/boot/initrd.img-*-*-generic ${out_dir}/casper/initrd
225 cp ${work_dir}/airootfs/boot/memtest86+.bin ${out_dir}/install/memtest86+
227 if [[ ! -f "${cache_dir}/memtest86-usb.zip" ]]; then
228 wget -O ${cache_dir}/memtest86-usb.zip https://www.memtest86.com/downloads/memtest86-usb.zip
231 (unzip -p ${cache_dir}/memtest86-usb.zip memtest86-usb.img > ${out_dir}/install/memtest86)
233 _msg_end "${job_name}"
239 _msg_start "${job_name}"
241 touch "${out_dir}/ubuntu"
242 cat <<EOF > ${out_dir}/isolinux/grub.cfg
244 search --set=root --file /ubuntu
251 menuentry "Try Ubuntu FS without installing" {
252 linux /casper/vmlinuz boot=casper quiet splash ---
253 initrd /casper/initrd
256 menuentry "Install Ubuntu FS" {
257 linux /casper/vmlinuz boot=casper only-ubiquity quiet splash ---
258 initrd /casper/initrd
261 menuentry "Check disc for defects" {
262 linux /casper/vmlinuz boot=casper integrity-check quiet splash ---
263 initrd /casper/initrd
266 menuentry "Test memory Memtest86+ (BIOS)" {
267 linux16 /install/memtest86+
270 menuentry "Test memory Memtest86 (UEFI, long load time)" {
272 insmod search_fs_uuid
274 loopback loop /install/memtest86
275 chainloader (loop,gpt1)/efi/boot/BOOTX64.efi
279 _msg_end "${job_name}"
285 _msg_start "${job_name}"
287 run_cmd dpkg-query -W --showformat='${Package} ${Version}\n' | tee ${out_dir}/casper/filesystem.manifest
288 cp -v ${out_dir}/casper/filesystem.manifest "${out_dir}/casper/filesystem.manifest-desktop"
289 sed -i '/ubiquity/d' "${out_dir}/casper/filesystem.manifest-desktop"
290 sed -i '/casper/d' "${out_dir}/casper/filesystem.manifest-desktop"
291 sed -i '/discover/d' "${out_dir}/casper/filesystem.manifest-desktop"
292 sed -i '/laptop-detect/d' "${out_dir}/casper/filesystem.manifest-desktop"
293 sed -i '/os-prober/d' "${out_dir}/casper/filesystem.manifest-desktop"
295 _msg_end "${job_name}"
301 _msg_start "${job_name}"
303 mksquashfs "${work_dir}/airootfs" "${out_dir}/casper/filesystem.squashfs"
304 printf $(du -sx --block-size=1 "${work_dir}/airootfs" | cut -f1) > ${out_dir}/casper/filesystem.size
306 _msg_end "${job_name}"
312 _msg_start "${job_name}"
314 cat <<EOF > ${out_dir}/README.diskdefines
315 #define DISKNAME Ubuntu from scratch
326 _msg_end "${job_name}"
332 _msg_start "${job_name}"
335 --format=x86_64-efi \
336 --output=isolinux/bootx64.efi \
339 "boot/grub/grub.cfg=isolinux/grub.cfg"
342 dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
343 sudo mkfs.vfat efiboot.img && \
344 LC_CTYPE=C mmd -i efiboot.img efi efi/boot && \
345 LC_CTYPE=C mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
349 --output=isolinux/core.img \
350 --install-modules="linux16 linux normal iso9660 biosdisk memdisk search tar ls" \
351 --modules="linux16 linux normal iso9660 biosdisk search" \
354 "boot/grub/grub.cfg=isolinux/grub.cfg"
355 cat /usr/lib/grub/i386-pc/cdboot.img isolinux/core.img > isolinux/bios.img
357 _msg_end "${job_name}"
363 _msg_start "${job_name}"
365 /bin/bash -c "(find . -type f -print0 | xargs -0 md5sum | grep -v "\./md5sum.txt" > md5sum.txt)"
367 _msg_end "${job_name}"
373 _msg_start "${job_name}"
378 -full-iso9660-filenames \
379 -volid "${iso_label}" \
380 -appid "${iso_application}" \
381 -publisher "${iso_publisher}" \
382 -preparer "prepared by LUBS" \
383 -eltorito-boot boot/grub/bios.img \
387 --eltorito-catalog boot/grub/boot.cat \
389 --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
393 -append_partition 2 0xef isolinux/efiboot.img \
394 -output "../${iso_filename}" \
397 /boot/grub/bios.img=isolinux/bios.img \
398 /EFI/efiboot.img=isolinux/efiboot.img
400 _msg_end "${job_name}"
405 run_once make_sourcelist
406 run_once make_systemd
407 run_once make_packages
409 run_once make_customize_airootfs
411 run_once make_bootfiles
412 run_once make_grubcfg
413 run_once make_manifest
414 run_once make_squashfs
415 run_once make_deifnes
416 run_once run_out make_isolinux
417 run_once run_out make_md5sum
418 run_once run_out make_iso