12b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo#!/bin/bash 22b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Copyright (C) 2015 The Android Open Source Project 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Licensed under the Apache License, Version 2.0 (the "License"); 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# you may not use this file except in compliance with the License. 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# You may obtain a copy of the License at 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# http://www.apache.org/licenses/LICENSE-2.0 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# Unless required by applicable law or agreed to in writing, software 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# distributed under the License is distributed on an "AS IS" BASIS, 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# See the License for the specific language governing permissions and 16aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# limitations under the License. 17aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo# 182b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 1904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# This script generates some sample images used in unittests and packages them 2004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# in the sample_images.tar.bz2 file. The list of generated images and their 2104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# options are described in the main() function. You need to manually run this 2204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# script to update the generated images whenever you modify this script. 2304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 242b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymoset -e 252b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 262b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo# cleanup <path> 272b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo# Unmount and remove the mountpoint <path> 282b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymocleanup() { 292b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo if ! sudo umount "$1" 2>/dev/null; then 302b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo if mountpoint -q "$1"; then 312b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sync && sudo umount "$1" 322b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo fi 332b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo fi 342b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo rmdir "$1" 352b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo} 362b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 372e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# add_files_default <mntdir> <block_size> 382e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# Add several test files to the image mounted in <mntdir>. 392e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymoadd_files_default() { 402e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir="$1" 412e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_size="$2" 422b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 432b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo ### Generate the files used in unittest with descriptive names. 442b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo touch "${mntdir}"/empty-file 452b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 462b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # regular: Regular files. 472b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "small file" | sudo dd of="${mntdir}"/regular-small status=none 482b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo dd if=/dev/zero bs=1024 count=16 status=none | tr '\0' '\141' | 492b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/regular-16k status=none 502b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd if=/dev/zero of="${mntdir}"/regular-32k-zeros bs=1024 count=16 \ 512b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo status=none 522b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 532b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "with net_cap" | sudo dd of="${mntdir}"/regular-with_net_cap status=none 542b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo setcap cap_net_raw=ep "${mntdir}"/regular-with_net_cap 552b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 562b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # sparse_empty: Files with no data blocks at all (only sparse holes). 572b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=10240 "${mntdir}"/sparse_empty-10k 582b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=$(( block_size * 2 )) "${mntdir}"/sparse_empty-2blocks 592b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 602b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # sparse: Files with some data blocks but also sparse holes. 612b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo -n "foo" | 622b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/sparse-16k-last_block bs=1 \ 632b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo seek=$(( 16 * 1024 - 3)) status=none 642b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 652b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # ext2 inodes have 12 direct blocks, one indirect, one double indirect and 662b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # one triple indirect. 10000 should be enough to have an indirect and double 672b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # indirect block. 682b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo -n "foo" | 692b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/sparse-10000blocks bs=1 \ 702b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo seek=$(( block_size * 10000 )) status=none 712b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 722b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=16384 "${mntdir}"/sparse-16k-first_block 732b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "first block" | sudo dd of="${mntdir}"/sparse-16k-first_block status=none 742b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 752b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo truncate --size=16384 "${mntdir}"/sparse-16k-holes 762b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "a" | sudo dd of="${mntdir}"/sparse-16k-holes bs=1 seek=100 status=none 772b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "b" | sudo dd of="${mntdir}"/sparse-16k-holes bs=1 seek=10000 status=none 782b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 792b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # link: symlinks and hardlinks. 802b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln -s "broken-link" "${mntdir}"/link-short_symlink 812b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln -s $(dd if=/dev/zero bs=256 count=1 status=none | tr '\0' '\141') \ 822b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo "${mntdir}"/link-long_symlink 832b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo ln "${mntdir}"/regular-16k "${mntdir}"/link-hard-regular-16k 842b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 852b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # Directories. 862b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo mkdir -p "${mntdir}"/dir1/dir2/dir1 872b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "foo" | sudo tee "${mntdir}"/dir1/dir2/file >/dev/null 882b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "bar" | sudo tee "${mntdir}"/dir1/file >/dev/null 892b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 90990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang # FIFO 91990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang sudo mkfifo "${mntdir}"/fifo 92990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang 93990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang # character special file 94990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang sudo mknod "${mntdir}"/cdev c 2 3 95990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang 962b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo # removed: removed files that should not be listed. 972b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo echo "We will remove this file so it's contents will be somewhere in the " \ 982b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo "empty space data but it won't be all zeros." | 992b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo dd of="${mntdir}"/removed conv=fsync status=none 1002b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo sudo rm "${mntdir}"/removed 1012e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo} 1022e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 1032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# add_files_ue_settings <mntdir> <block_size> 1042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# Add the update_engine.conf settings file. This file contains the 1052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymoadd_files_ue_settings() { 1062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir="$1" 1072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 1082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo mkdir -p "${mntdir}"/etc >/dev/null 1092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo tee "${mntdir}"/etc/update_engine.conf >/dev/null <<EOF 1102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoPAYLOAD_MINOR_VERSION=1234 1112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF 1122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo # Example of a real lsb-release file released on link stable. 1132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo tee "${mntdir}"/etc/lsb-release >/dev/null <<EOF 1142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_AUSERVER=https://tools.google.com/service/update2 1152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_BOARD_APPID={F26D159B-52A3-491A-AE25-B23670A66B32} 1162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_CANARY_APPID={90F229CE-83E2-4FAF-8479-E368A34938B1} 1172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_DEVSERVER= 1182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_APPID={F26D159B-52A3-491A-AE25-B23670A66B32} 1192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BOARD=link-signed-mp-v4keys 1202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BRANCH_NUMBER=63 1212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_NUMBER=6946 1222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_BUILD_TYPE=Official Build 1232e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_CHROME_MILESTONE=43 1242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_DESCRIPTION=6946.63.0 (Official Build) stable-channel link 1252e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_NAME=Chrome OS 1262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_PATCH_NUMBER=0 1272e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_TRACK=stable-channel 1282e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoCHROMEOS_RELEASE_VERSION=6946.63.0 1292e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoGOOGLE_RELEASE=6946.63.0 1302e9533be9eb2e022d653400f47a354a7f06bf9dbAlex DeymoEOF 1312e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo} 1322e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 133cbc2274c4160805bf726df872390112654816ca7Alex Deymoadd_files_postinstall() { 134cbc2274c4160805bf726df872390112654816ca7Alex Deymo local mntdir="$1" 135cbc2274c4160805bf726df872390112654816ca7Alex Deymo 136cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo mkdir -p "${mntdir}"/bin >/dev/null 137cbc2274c4160805bf726df872390112654816ca7Alex Deymo 138cbc2274c4160805bf726df872390112654816ca7Alex Deymo # A postinstall bash program. 139cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo tee "${mntdir}"/bin/postinst_example >/dev/null <<EOF 140cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh 141cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "I'm a postinstall program and I know how to write to stdout" 142cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "My call was $@" 143cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0 144cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF 145cbc2274c4160805bf726df872390112654816ca7Alex Deymo 146cbc2274c4160805bf726df872390112654816ca7Alex Deymo # A symlink to another program. This should also work. 147cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo ln -s "postinst_example" "${mntdir}"/bin/postinst_link 148cbc2274c4160805bf726df872390112654816ca7Alex Deymo 149cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo tee "${mntdir}"/bin/postinst_fail3 >/dev/null <<EOF 150cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh 151cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 3 152cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF 153cbc2274c4160805bf726df872390112654816ca7Alex Deymo 154cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo tee "${mntdir}"/bin/postinst_fail1 >/dev/null <<EOF 155cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh 156cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 1 157cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF 158cbc2274c4160805bf726df872390112654816ca7Alex Deymo 159d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo # A program that succeeds if it is suspended during the first 5 minutes. 160d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo sudo tee "${mntdir}"/bin/postinst_suspend >/dev/null <<EOF 161d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo#!/etc/../bin/sh 162d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymotrap "{ echo Got a SIGCONT; exit 0; }" CONT 163d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# Signal that we are ready to receive the signal by redirecting our stdin to 164d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# /dev/zero, the test can detect that. 165d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoexec </dev/zero 166d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo# Allow the signal handler to run every 100 ms. 167d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoi=3000 168d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymowhile [ \$i -ge 0 ]; do 169d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo sleep 0.1 170d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo i=\$((i-1)) 171d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymodone 172d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymoexit 1 173d15c546ed794293d0a63770467a0f3c4c84c6214Alex DeymoEOF 174d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo 1750d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo # A program that reports back progress. 1760d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo sudo tee "${mntdir}"/bin/postinst_progress >/dev/null <<EOF 1770d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo#!/etc/../bin/sh 1780d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo# These values have exact representation in IEEE 754 so we avoid rounding 1790d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo# errors. 1800d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 0.25 >&3 1810d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 0.5 >&3 1820d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoecho global_progress 1.0 >&3 1830d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoexit 0 1840d29854cf5bb05a22cf161b50052539aa420a36eAlex DeymoEOF 1850d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo 186cbc2274c4160805bf726df872390112654816ca7Alex Deymo # A postinstall bash program. 187cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo tee "${mntdir}"/bin/self_check_context >/dev/null <<EOF 188cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh 189cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "This is my context:" 190cbc2274c4160805bf726df872390112654816ca7Alex Deymols -lZ "\$0" | grep -F ' u:object_r:postinstall_file:s0 ' || exit 5 191cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0 192cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF 193cbc2274c4160805bf726df872390112654816ca7Alex Deymo 194cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo tee "${mntdir}"/postinst >/dev/null <<EOF 195cbc2274c4160805bf726df872390112654816ca7Alex Deymo#!/etc/../bin/sh 196cbc2274c4160805bf726df872390112654816ca7Alex Deymoecho "postinst" 197cbc2274c4160805bf726df872390112654816ca7Alex Deymoexit 0 198cbc2274c4160805bf726df872390112654816ca7Alex DeymoEOF 199cbc2274c4160805bf726df872390112654816ca7Alex Deymo 200cbc2274c4160805bf726df872390112654816ca7Alex Deymo sudo chmod +x "${mntdir}"/postinst "${mntdir}"/bin/* 201cbc2274c4160805bf726df872390112654816ca7Alex Deymo} 202cbc2274c4160805bf726df872390112654816ca7Alex Deymo 2032e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo# generate_fs <filename> <kind> <size> [block_size] [block_groups] 2042e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymogenerate_fs() { 2052e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local filename="$1" 2062e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local kind="$2" 2072e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local size="$3" 2082e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_size="${4:-4096}" 2092e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local block_groups="${5:-}" 2102e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2112e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mkfs_opts=( -q -F -b "${block_size}" -L "ROOT-TEST" -t ext2 ) 2122e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo if [[ -n "${block_groups}" ]]; then 2132e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo mkfs_opts+=( -G "${block_groups}" ) 2142e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo fi 2152e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2162e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo local mntdir=$(mktemp --tmpdir -d generate_ext2.XXXXXX) 2172e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo trap 'cleanup "${mntdir}"; rm -f "${filename}"' INT TERM EXIT 2182e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2192e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo # Cleanup old image. 2202e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo if [[ -e "${filename}" ]]; then 2212e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo rm -f "${filename}" 2222e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo fi 2232e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo truncate --size="${size}" "${filename}" 2242e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2252e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo mkfs.ext2 "${mkfs_opts[@]}" "${filename}" 2262e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo sudo mount "${filename}" "${mntdir}" -o loop 2272e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo 2282e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo case "${kind}" in 229d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo unittest) 2302e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo add_files_ue_settings "${mntdir}" "${block_size}" 231cbc2274c4160805bf726df872390112654816ca7Alex Deymo add_files_postinstall "${mntdir}" "${block_size}" 2322e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo ;; 2332e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo default) 2342e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo add_files_default "${mntdir}" "${block_size}" 2352e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo ;; 236c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo empty) 237c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo ;; 2382e9533be9eb2e022d653400f47a354a7f06bf9dbAlex Deymo esac 2392b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 2402b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo cleanup "${mntdir}" 2412b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo trap - INT TERM EXIT 2422b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo} 2432b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 24404ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoOUTPUT_DIR=$(dirname "$0") 24504ef2078a1c17733b363971394dacad5f5f5b524Alex DeymoIMAGES=() 24604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 24704ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo# generate_image <image_name> [<image args> ...] 24804ef2078a1c17733b363971394dacad5f5f5b524Alex Deymogenerate_image() { 24904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo echo "Generating image $1.img" 25004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo IMAGES+=( "$1.img" ) 25104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo generate_fs "${OUTPUT_DIR}/$1.img" "${@:2}" 25204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo} 2532b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 25404ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain() { 25504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo # Add more sample images here. 256990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang generate_image disk_ext2_1k default $((1024 * 1024)) 1024 257990c27b0df5bd77ca804479922a62ba0ee9266baSen Jiang generate_image disk_ext2_4k default $((1024 * 4096)) 4096 258c90be63117cdad2622694b6f9ac2aec65fa80bf0Alex Deymo generate_image disk_ext2_4k_empty empty $((1024 * 4096)) 4096 259d15c546ed794293d0a63770467a0f3c4c84c6214Alex Deymo generate_image disk_ext2_unittest unittest $((1024 * 4096)) 4096 26004ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo 26104ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo # Generate the tarball and delete temporary images. 26204ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo echo "Packing tar file sample_images.tar.bz2" 26304ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo tar -jcf "${OUTPUT_DIR}/sample_images.tar.bz2" -C "${OUTPUT_DIR}" \ 264a3553e42ce7255034044f364f72516b29417bbdcAlex Deymo --sparse "${IMAGES[@]}" 26504ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo cd "${OUTPUT_DIR}" 26604ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo rm "${IMAGES[@]}" 26704ef2078a1c17733b363971394dacad5f5f5b524Alex Deymo} 2682b19cfbcdb1aa8c5d1f338d19312fe14b6734bd5Alex Deymo 26904ef2078a1c17733b363971394dacad5f5f5b524Alex Deymomain 270