ebeveyn
f696480681
işleme
5a6f30ec0f
@ -0,0 +1,5 @@ |
||||
.vagrant |
||||
*.bz2 |
||||
*.qcow2 |
||||
*.tmp |
||||
authorized_keys |
@ -0,0 +1,24 @@ |
||||
YYYYMMDD := $(shell date +%Y%m%d)
|
||||
|
||||
default: gen |
||||
|
||||
clean: |
||||
rm -f *.bz2 *.qcow2 *.tmp authorized_keys
|
||||
|
||||
setup: clean |
||||
./detect-mirror.sh > ubuntu-mirror.tmp
|
||||
cp $(HOME)/.ssh/id_rsa.pub ./authorized_keys
|
||||
|
||||
gen: setup |
||||
./gen.sh
|
||||
|
||||
upload: |
||||
rsync -avzP ./*.qcow2 \
|
||||
$(KVM_REMOTE_HOST):/storage/images/
|
||||
|
||||
sync: clean |
||||
rsync -avP \
|
||||
--exclude=/.git \
|
||||
--exclude=/.vagrant \
|
||||
./ \
|
||||
$(KVM_REMOTE_HOST):/storage/buildimage/
|
@ -0,0 +1,53 @@ |
||||
# KVM Ubuntu Image Builder |
||||
|
||||
This is a Vagrant-based qcow2 image builder to build root images for |
||||
KVM/qemu. |
||||
|
||||
Supports: |
||||
|
||||
* Ubuntu 12.04 precise amd64 |
||||
* Ubuntu 13.10 saucy amd64 |
||||
|
||||
# Assumptions |
||||
|
||||
This will use whatever `~/.ssh/id_rsa.pub` is found on the host build system |
||||
as the `/root/.ssh/authorized_keys` inside the image being built. |
||||
|
||||
The root password is set to 'root', but ssh password logins are disabled, so |
||||
it only works at the console. |
||||
|
||||
The mirror in the image is set to `http://mirror.localservice/ubuntu`. It |
||||
is expected that the VM environment you are using will make this resolve |
||||
appropriately and point at a local reverse proxy or full mirror. |
||||
|
||||
# Requires |
||||
|
||||
## Common |
||||
|
||||
* curl |
||||
* jq |
||||
|
||||
## OSX |
||||
|
||||
* Vagrant |
||||
|
||||
## Linux |
||||
|
||||
* root |
||||
* kpartx |
||||
* debootstrap |
||||
* lvm2 |
||||
* qemu-utils |
||||
|
||||
# todo |
||||
|
||||
* support 12.04 (precise) or 12.10 (quantal) (chef server!) |
||||
* refactor local modifications/packages out of base build |
||||
|
||||
# local changes todo |
||||
|
||||
* remove whoopsie |
||||
* remove libwhoopsie0 |
||||
* remove popcon / popularity-contest |
||||
* remove landscape stuff |
||||
* switch ssh to systemd invoked service |
@ -0,0 +1,73 @@ |
||||
# -*- mode: ruby -*- |
||||
# vi: set ft=ruby : |
||||
|
||||
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing! |
||||
VAGRANTFILE_API_VERSION = "2" |
||||
|
||||
SETUP_BASE = <<-EOF |
||||
#!/bin/bash |
||||
set -e |
||||
|
||||
# byobu lags login in this vm for some reason? |
||||
test -e /etc/profile.d/Z97-byobu.sh && rm /etc/profile.d/Z97-byobu.sh |
||||
|
||||
echo "UseDNS no" >> /etc/ssh/sshd_config |
||||
service ssh restart |
||||
|
||||
echo "exec sudo -i" >> /home/vagrant/.bashrc |
||||
|
||||
function set_apt_mirror () { |
||||
CN="$(lsb_release -c -s)" |
||||
RPS="main restricted multiverse universe" |
||||
echo "deb $1 $CN $RPS" > /etc/apt/sources.list.new |
||||
for P in updates backports security ; do |
||||
echo "deb $1 $CN-$P $RPS" >> /etc/apt/sources.list.new |
||||
done |
||||
mv /etc/apt/sources.list.new /etc/apt/sources.list |
||||
} |
||||
|
||||
export UBUNTU_MIRROR_URL="`cat /vagrant/ubuntu-mirror.tmp`" |
||||
|
||||
if [[ ! -z "$UBUNTU_MIRROR_URL" ]]; then |
||||
set_apt_mirror "$UBUNTU_MIRROR_URL" |
||||
fi |
||||
|
||||
if [[ "$(lsb_release -s -c)" == "saucy" ]]; then |
||||
dpkg --remove-architecture i386 |
||||
else |
||||
rm /etc/dpkg/dpkg.cfg.d/multiarch |
||||
fi |
||||
apt-get update |
||||
apt-get -y install kpartx debootstrap lvm2 qemu-utils |
||||
|
||||
DISTS="precise saucy" |
||||
|
||||
for DIST in $DISTS; do |
||||
export KEYFILE="/vagrant/authorized_keys" |
||||
/vagrant/buildimage.sh $DIST || exit $? |
||||
mv /tmp/*64.qcow2 /vagrant/ |
||||
exit 0 # FIXME |
||||
done |
||||
|
||||
EOF |
||||
|
||||
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| |
||||
config.vm.box = "ubuntu-12.04" |
||||
config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/precise/" + \ |
||||
"current/precise-server-cloudimg-amd64-vagrant-disk1.box" |
||||
config.cache.auto_detect = true if Vagrant.has_plugin?("vagrant-cachier") |
||||
|
||||
# bridge to my actual local lan instead of the private vagrant |
||||
# network so that avahi discover will work right to find my mirror |
||||
# osx requires it to be the full descriptive name, mine is e.g. |
||||
# "en4: Display Ethernet" (tb display wired ethernet) |
||||
if ENV['VAGRANT_BRIDGE_DEVICE'] |
||||
config.vm.network "public_network", |
||||
:bridge => ENV['VAGRANT_BRIDGE_DEVICE'] |
||||
end |
||||
|
||||
config.vm.provision "shell", inline: SETUP_BASE |
||||
config.vm.provider :virtualbox do |vb| |
||||
vb.customize ["modifyvm", :id, "--memory", "2048"] |
||||
end |
||||
end |
@ -0,0 +1,385 @@ |
||||
#!/bin/bash |
||||
set -e |
||||
set -v |
||||
set -x |
||||
|
||||
SAVESPACE=1 |
||||
WITHCHEF=1 |
||||
ORGNAME="eeqj" |
||||
DSIZE="25G" # disk size |
||||
|
||||
# releases we support right now |
||||
SUPPORTED="precise saucy" |
||||
|
||||
if [[ $# -ne 1 ]]; then |
||||
echo "usage: $0 <codename>" > /dev/stderr |
||||
echo "supported ubuntu releases: $SUPPORTED" > /dev/stderr |
||||
exit 127 |
||||
fi |
||||
R="$1" # release |
||||
if ! [[ "$SUPPORTED" =~ "$R" ]] ; then |
||||
echo "$0: unsupported ubuntu release $R, sorry." > /dev/stderr |
||||
exit 127 |
||||
fi |
||||
|
||||
MR="/tmp/kvmbuild-${R}" |
||||
RI="/tmp/kvmbuild-${R}.img" # raw image |
||||
VGN="vmvg0" # volume group name |
||||
DATE="$(date -u +%Y%m%d)" |
||||
LONGDATE="$(date -u +%Y-%m-%dT%H:%M:%S%z)" |
||||
LOOPDEV="$(losetup -f)" |
||||
LDBASE="$(basename $LOOPDEV)" |
||||
ROOTPW="root" |
||||
|
||||
if [[ -e /dev/$VGN ]]; then |
||||
echo "$0: error, vg $VGN already exists" > /dev/stderr |
||||
exit 127 |
||||
fi |
||||
|
||||
if [[ -e "$MR" ]]; then |
||||
echo "$0: error, chroot dir $MR already exists" > /dev/stderr |
||||
exit 127 |
||||
fi |
||||
|
||||
if [[ -e "$RI" ]]; then |
||||
echo "$0: error, intermediate image file $RI already exists" > /dev/stderr |
||||
exit 127 |
||||
fi |
||||
|
||||
function detect_local_mirror () { |
||||
TF="${UBUNTU_MIRROR_URL}/dists/${R}/Release" |
||||
MOK="$(curl -m 1 --head ${TF} 2>&1 | grep '200 OK' | wc -l)" |
||||
if [ $MOK -gt 0 ]; then |
||||
echo "$UBUNTU_MIRROR_URL" |
||||
else |
||||
echo "http://archive.ubuntu.com/ubuntu/" |
||||
fi |
||||
} |
||||
|
||||
UM="$(detect_local_mirror)" |
||||
|
||||
# create sparse file and partition it |
||||
dd if=/dev/zero of=$RI bs=1 count=0 seek=$DSIZE |
||||
parted -s $RI mklabel msdos |
||||
parted -a optimal $RI mkpart primary 0% 200MiB |
||||
parted -a optimal $RI mkpart primary 200MiB 100% |
||||
parted $RI set 1 boot on |
||||
losetup $LOOPDEV $RI |
||||
kpartx -av $LOOPDEV |
||||
BOOTPARTLOOP="$(losetup -f)" |
||||
losetup $BOOTPARTLOOP /dev/mapper/${LDBASE}p1 |
||||
|
||||
# make boot filesystem: |
||||
if [[ "$R" == "saucy" ]]; then |
||||
FSTYPE="ext4" |
||||
else |
||||
FSTYPE="ext3" |
||||
fi |
||||
|
||||
mkfs.${FSTYPE} -L BOOT $BOOTPARTLOOP |
||||
tune2fs -c -1 $BOOTPARTLOOP |
||||
|
||||
# create root vg and filesystem: |
||||
pvcreate /dev/mapper/${LDBASE}p2 |
||||
vgcreate $VGN /dev/mapper/${LDBASE}p2 |
||||
lvcreate -l 100%FREE -n root $VGN |
||||
mkfs.${FSTYPE} -L ROOT /dev/$VGN/root |
||||
|
||||
# mount stuff |
||||
mkdir -p $MR |
||||
MR="$(readlink -f $MR)" |
||||
mount /dev/$VGN/root $MR |
||||
mkdir $MR/boot |
||||
mount $BOOTPARTLOOP $MR/boot |
||||
|
||||
# install base: |
||||
echo "*** installing base $R system from $UM..." |
||||
debootstrap --arch amd64 $R $MR $UM |
||||
|
||||
# temporary config for install: |
||||
RPS="main restricted multiverse universe" |
||||
echo "deb $UM $R $RPS" > $MR/etc/apt/sources.list |
||||
for P in updates backports security ; do |
||||
echo "deb $UM $R-$P $RPS" >> $MR/etc/apt/sources.list |
||||
done |
||||
|
||||
# disable apt installation exuberance |
||||
cat > $MR/etc/apt/apt.conf.d/99-vm-no-extras-please <<EOF |
||||
APT::Install-Recommends "false"; |
||||
APT::Install-Suggest "false"; |
||||
EOF |
||||
|
||||
# use build system resolver settings for now temporarily |
||||
cp /etc/resolv.conf $MR/etc/resolv.conf |
||||
|
||||
cat > $MR/etc/environment <<EOF |
||||
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" |
||||
LANGUAGE="en_US:en" |
||||
LANG="en_US.UTF-8" |
||||
ROOT_IMAGE_BUILD_DAY="$DATE" |
||||
ROOT_IMAGE_BUILD_DATE="$LONGDATE" |
||||
ROOT_IMAGE_BUILD_ORG="$ORGNAME" |
||||
EOF |
||||
|
||||
chroot $MR locale-gen en_US.UTF-8 |
||||
chroot $MR dpkg-reconfigure locales |
||||
|
||||
echo 'cd /dev && MAKEDEV generic 2>/dev/null' | chroot $MR |
||||
|
||||
BUUID="$(blkid -s UUID -o value $BOOTPARTLOOP)" |
||||
RUUID="$(blkid -s UUID -o value /dev/${VGN}/root)" |
||||
|
||||
# this has to come before packages: |
||||
cat > $MR/etc/fstab <<EOF |
||||
proc /proc proc defaults 0 0 |
||||
/dev/mapper/$VGN-root / $FSTYPE noatime,errors=remount-ro 0 1 |
||||
UUID=$BUUID /boot $FSTYPE noatime 0 2 |
||||
none /tmp tmpfs defaults 0 0 |
||||
none /var/tmp tmpfs defaults 0 0 |
||||
EOF |
||||
|
||||
cat > $MR/etc/network/interfaces <<EOF |
||||
auto lo |
||||
iface lo inet loopback |
||||
|
||||
auto eth0 |
||||
iface eth0 inet dhcp |
||||
EOF |
||||
|
||||
cat > $MR/etc/hosts <<EOF |
||||
127.0.0.1 localhost |
||||
::1 localhost ip6-localhost ip6-loopback |
||||
fe00::0 ip6-localnet |
||||
ff00::0 ip6-mcastprefix |
||||
ff02::1 ip6-allnodes |
||||
ff02::2 ip6-allrouters |
||||
ff02::3 ip6-allhosts |
||||
EOF |
||||
|
||||
#### install and update packages |
||||
|
||||
mount --bind /proc $MR/proc |
||||
mount --bind /dev $MR/dev |
||||
mount --bind /sys $MR/sys |
||||
|
||||
# this file keeps stuff from starting up right now |
||||
# when first installed in the chroot. |
||||
cat > $MR/usr/sbin/policy-rc.d <<EOF |
||||
#!/bin/bash |
||||
exit 101 |
||||
EOF |
||||
chmod +x $MR/usr/sbin/policy-rc.d |
||||
|
||||
# banish i386 forevermore, saucy |
||||
if [[ "$R" == "saucy" ]]; then |
||||
chroot $MR dpkg --remove-architecture i386 |
||||
fi |
||||
|
||||
# i386 banishment for precise |
||||
if [[ -e $MR/etc/dpkg/dpkg.cfg.d/multiarch ]] ; then |
||||
rm $MR/etc/dpkg/dpkg.cfg.d/multiarch |
||||
fi |
||||
|
||||
chroot $MR <<EOF |
||||
export DEBIAN_FRONTEND=noninteractive |
||||
apt-get -y update |
||||
|
||||
# acpid is to receive shutdown events from kvm |
||||
# accurate time (ntp) is essential for certificate verification to work |
||||
# parted is to resize partitions on disk expansion |
||||
PACKAGES=" |
||||
linux-image-server |
||||
lvm2 |
||||
acpid |
||||
openssh-server |
||||
ntp |
||||
parted |
||||
grub-pc |
||||
" |
||||
RUNLEVEL=1 apt-get -y install \$PACKAGES |
||||
EOF |
||||
|
||||
if [[ $WITHCHEF ]]; then |
||||
# install chef and ohai for provisioning later |
||||
chroot $MR <<EOF |
||||
set -e |
||||
export DEBIAN_FRONTEND=noninteractive |
||||
export RUNLEVEL=1 |
||||
apt-get install -y \ |
||||
ruby ruby-dev build-essential wget libruby rubygems |
||||
gem update --no-rdoc --no-ri |
||||
gem install ohai --no-rdoc --no-ri --verbose |
||||
gem install chef --no-rdoc --no-ri --verbose |
||||
EOF |
||||
fi |
||||
|
||||
chroot $MR <<EOF |
||||
grep -v ^server /etc/ntp.conf > /etc/ntp.conf.new |
||||
mv /etc/ntp.conf.new /etc/ntp.conf |
||||
EOF |
||||
|
||||
# tell ntp not to try to sync to anything |
||||
# if an ntp server comes from the dhcp server then it will use that |
||||
cat >> $MR/etc/ntp.conf <<EOF |
||||
server 127.127.1.0 |
||||
fudge 127.127.1.0 stratum 10 |
||||
broadcastclient |
||||
EOF |
||||
|
||||
# set some sane grub defaults for kvm guests |
||||
echo "GRUB_CMDLINE_LINUX_DEFAULT=\"text serial=tty0 console=ttyS0\"" \ |
||||
>> $MR/etc/default/grub |
||||
# FIXME i think this is bogus, test changing it |
||||
echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=9600 --stop=1\"" \ |
||||
>> $MR/etc/default/grub |
||||
if [[ "$R" == "saucy" ]]; then |
||||
echo "GRUB_TERMINAL=\"serial\"" >> $MR/etc/default/grub |
||||
fi |
||||
echo "GRUB_GFXPAYLOAD=\"text\"" >> $MR/etc/default/grub |
||||
|
||||
# set root password (only useful at console, ssh password login is disabled) |
||||
chroot $MR /bin/bash -c "echo \"root:$ROOTPW\" | chpasswd" |
||||
|
||||
chroot $MR grub-mkconfig -o /boot/grub/grub.cfg 2> /dev/null |
||||
cat > $MR/boot/grub/device.map <<EOF |
||||
(hd0) ${LOOPDEV} |
||||
(hd0,1) ${BOOTPARTLOOP} |
||||
EOF |
||||
chroot $MR grub-install ${LOOPDEV} 2> /dev/null |
||||
|
||||
# get rid of temporary device.map after grub is installed |
||||
rm $MR/boot/grub/device.map |
||||
|
||||
# remove initramfs entirely: |
||||
chroot $MR update-initramfs -d -k all |
||||
|
||||
# for some stupid reason, -k all doesn't work on gen after removing: |
||||
KERN="$(cd $MR/boot && ls vmlinuz*)" |
||||
VER="${KERN#vmlinuz-}" |
||||
chroot $MR update-initramfs -c -k $VER |
||||
|
||||
# start a getty on the serial port for kvm console login |
||||
if [[ "$R" == "saucy" ]]; then |
||||
cat > $MR/etc/init/ttyS0.conf <<EOF |
||||
# ttyS0 - getty |
||||
# run a getty on the serial console |
||||
start on stopped rc or RUNLEVEL=[12345] |
||||
stop on runlevel [!12345] |
||||
respawn |
||||
exec /sbin/getty -L 115200 ttyS0 vt102 |
||||
EOF |
||||
fi |
||||
|
||||
# update all packages on the system |
||||
chroot $MR /bin/bash -c \ |
||||
"DEBIAN_FRONTEND=noninteractive RUNLEVEL=1 apt-get -y upgrade" |
||||
|
||||
# remove file that keeps installed stuff from starting up |
||||
rm $MR/usr/sbin/policy-rc.d |
||||
|
||||
##################################################### |
||||
### Local Modifications |
||||
##################################################### |
||||
|
||||
cat > $MR/etc/dhcp/dhclient-exit-hooks.d/hostname <<EOF |
||||
hostname \$new_host_name |
||||
EOF |
||||
|
||||
# install ssh key |
||||
mkdir -p $MR/root/.ssh |
||||
cp "${KEYFILE}" $MR/root/.ssh/authorized_keys |
||||
chmod 600 $MR/root/.ssh/authorized_keys |
||||
|
||||
# key auth only |
||||
echo "PasswordAuthentication no" >> $MR/etc/ssh/sshd_config |
||||
# in case dns is broken, don't lag logins |
||||
echo "UseDNS no" >> $MR/etc/ssh/sshd_config |
||||
|
||||
# clean apt cache |
||||
rm $MR/var/cache/apt/archives/*.deb |
||||
|
||||
# set dist apt source: |
||||
RPS="main restricted multiverse universe" |
||||
MURL="http://archive.ubuntu.com/ubuntu" |
||||
echo "deb $MURL $R $RPS" > $MR/etc/apt/sources.list |
||||
for P in updates backports security ; do |
||||
echo "deb $MURL $R-$P $RPS" >> $MR/etc/apt/sources.list |
||||
done |
||||
|
||||
# remove instance ssh host keys |
||||
rm $MR/etc/ssh/*key* |
||||
rm $MR/var/lib/dhcp/*.leases |
||||
|
||||
# remove temporary resolver, dhcp will fix it: |
||||
rm $MR/etc/resolv.conf |
||||
|
||||
# if there is an /etc/hostname then it won't |
||||
# pick up the right hostname from dhcp |
||||
test -e $MR/etc/hostname || rm $MR/etc/hostname |
||||
|
||||
mkdir $MR/lib/eeqjvmtools |
||||
|
||||
cat > $MR/lib/eeqjvmtools/expandroot.sh <<EOF |
||||
#!/bin/bash |
||||
parted -- /dev/vda resizepart 2 -1s |
||||
partprobe /dev/vda |
||||
pvresize /dev/vda2 |
||||
lvresize -l +100%FREE /dev/vmvg0/root || true |
||||
resize2fs /dev/vmvg0/root |
||||
EOF |
||||
chmod +x $MR/lib/eeqjvmtools/expandroot.sh |
||||
|
||||
# regenerate them on first boot |
||||
cat > $MR/etc/rc.local <<EOF |
||||
#!/bin/bash |
||||
|
||||
# if no ssh host keys, generate them |
||||
test -f /etc/ssh/ssh_host_dsa_key || dpkg-reconfigure openssh-server |
||||
|
||||
# if the drive has gotten bigger since last time, grow the fs: |
||||
test -x /lib/eeqjvmtools/expandroot.sh && /lib/eeqjvmtools/expandroot.sh |
||||
|
||||
exit 0 |
||||
EOF |
||||
chmod +x $MR/etc/rc.local |
||||
|
||||
echo "******************************************************" |
||||
echo "*** Almost done. Cleaning up..." |
||||
echo "******************************************************" |
||||
|
||||
umount $MR/proc |
||||
umount $MR/sys |
||||
|
||||
# udev insists on sticking around, kill it: |
||||
if [[ "$R" == "saucy" ]]; then |
||||
fuser -m $MR -k |
||||
sleep 1 |
||||
fi |
||||
umount $MR/dev |
||||
|
||||
if [[ $SAVESPACE ]]; then |
||||
# zero space on boot: |
||||
dd if=/dev/zero of=$MR/boot/zerofile bs=1M || true |
||||
sync |
||||
rm $MR/boot/zerofile |
||||
# zero space on root |
||||
dd if=/dev/zero of=$MR/zerofile bs=1M || true |
||||
sync |
||||
rm $MR/zerofile |
||||
fi |
||||
|
||||
umount $MR/boot |
||||
umount $MR |
||||
sync |
||||
|
||||
rmdir $MR |
||||
|
||||
vgchange -a n $VGN |
||||
losetup -d $BOOTPARTLOOP |
||||
kpartx -dv $LOOPDEV |
||||
losetup -d $LOOPDEV |
||||
sync |
||||
|
||||
OF="/tmp/${DATE}-${ORGNAME}-${R}64.qcow2" |
||||
|
||||
qemu-img convert -f raw -O qcow2 $RI $OF && rm $RI |
@ -0,0 +1,35 @@ |
||||
#!/bin/bash |
||||
|
||||
# feel free to set MY_LOCAL_UBUNTU_MIRROR |
||||
# to make this try your local/lan copy first |
||||
|
||||
TRY=" |
||||
$MY_LOCAL_UBUNTU_MIRROR |
||||
http://mirror.localservice/ubuntu |
||||
http://mirror.hetzner.de/ubuntu |
||||
" |
||||
|
||||
CC="$( |
||||
curl -w 1 -s https://freegeoip.net/json/ | |
||||
jq -r .country_code 2>/dev/null |
||||
)" |
||||
|
||||
if [[ ! -z "$CC" ]]; then |
||||
TRY+=" http://$CC.archive.ubuntu.com/ubuntu" |
||||
fi |
||||
|
||||
TRY+=" http://archive.ubuntu.com/ubuntu" |
||||
|
||||
for TRYMIRROR in $TRY ; do |
||||
TF="${TRYMIRROR}/dists/saucy/Release" |
||||
MOK="$(curl -m 1 --head ${TF} 2>&1 | grep '200 OK' | wc -l)" |
||||
if [ $MOK -gt 0 ]; then |
||||
echo "$TRYMIRROR" |
||||
exit 0 |
||||
fi |
||||
done |
||||
|
||||
# give this one even if it failed above, it's not our fault |
||||
# you don't have internet access... |
||||
echo "http://archive.ubuntu.com/ubuntu" |
||||
exit 0 |
@ -0,0 +1,46 @@ |
||||
#!/bin/bash |
||||
|
||||
if [[ $(uname) == Darwin ]]; then |
||||
vagrant destroy -f |
||||
vagrant up |
||||
exit 0 |
||||
fi |
||||
|
||||
if [[ $(uname) == Linux ]]; then |
||||
cd /tmp |
||||
export KEYFILE="${HOME}/.ssh/id_rsa.pub" |
||||
export UBUNTU_MIRROR_URL="$(cat $OLDPWD/ubuntu-mirror.tmp)" |
||||
for CN in precise saucy ; do |
||||
$OLDPWD/buildimage.sh $CN |
||||
if [[ $? -ne 0 ]]; then |
||||
set -x |
||||
set -v |
||||
BD="/tmp/kvmbuild-${CN}" |
||||
IM="/tmp/kvmbuild-${CN}.img" |
||||
umount "$BD/dev" |
||||
umount "$BD/proc" |
||||
umount "$BD/sys" |
||||
umount "$BD/boot" |
||||
umount "$BD" |
||||
vgchange -an vmvg0 |
||||
for LODEV in /dev/loop* ; do |
||||
losetup -d $LODEV 2> /dev/null |
||||
done |
||||
for LODEV in /dev/mapper/loop*p1 ; do |
||||
S=${LODEV#/dev/mapper/} |
||||
S=${S%p1} |
||||
kpartx -dv /dev/$S |
||||
losetup -d /dev/$S |
||||
unset S |
||||
done |
||||
for LODEV in /dev/loop* ; do |
||||
losetup -d $LODEV 2> /dev/null |
||||
done |
||||
rm "$IM" |
||||
rmdir "$BD" |
||||
exit 127 |
||||
fi |
||||
mv /tmp/*${CN}64.qcow2 $OLDPWD |
||||
done |
||||
exit 0 |
||||
fi |
Yükleniyor…
Yeni konuda referans