pkvlm-create
changeset 7 ab661ceed4dc
parent 4 bf9d63195f9d
child 8 ba98eb53344a
equal deleted inserted replaced
6:8ed4a750d133 7:ab661ceed4dc
     1 #!/bin/bash
     1 #!/bin/bash
     2 
     2 
     3 ### Parameters
     3 ### Initialize 
     4 ## Options
     4 set -u
     5 _MOCK=${_MOCK:0}
     5 set -e
     6 _ACK=${_ACK:0}
     6 
     7 
     7 TESTING=
       
     8 
       
     9 DO_VIRTINSTALL=
       
    10 
       
    11 scripts=$(dirname $0)/scripts
       
    12 . $scripts/lib.sh
       
    13 
       
    14 ### Command-line input
       
    15 ## Command-line options
       
    16 function _help () {
       
    17     cat <<END
       
    18 Usage: $1 [options] [param=value [...]]
       
    19 
       
    20 Options:
       
    21     -h      Show this help text
       
    22 
       
    23     -D      Debug
       
    24     -v      Verbose
       
    25     -q      Quiet
       
    26 
       
    27     -N      Mock command execution
       
    28     -P      Skip command prompts
       
    29 
       
    30     -I      Do a virt-install
       
    31 
       
    32     -T      Just testing..
       
    33 
       
    34 Parameters are given as:
       
    35 
       
    36     NAME=value-{FOO}
       
    37 
       
    38 END
       
    39 }
       
    40 
       
    41 while getopts "hDvqNPTI" opt; do
       
    42     case "$opt" in
       
    43         h)
       
    44             _help $0
       
    45 
       
    46             exit 0
       
    47             ;;
       
    48 
       
    49         D)
       
    50             LOG_DEBUG=y
       
    51             LOG_CMD=y
       
    52 
       
    53             ;;
       
    54 
       
    55         v)
       
    56             LOG_CMD=y
       
    57 
       
    58             log_debug "log: Commands"
       
    59             ;;
       
    60 
       
    61         q)
       
    62             LOG_CMD=
       
    63             LOG_INFO=
       
    64             
       
    65             log_debug "log: Quiet"
       
    66             ;;
       
    67 
       
    68         N)
       
    69             log_info "Mock-executing commands (this will break functionality..)"
       
    70 
       
    71             CMD_MOCK=y
       
    72             ;;
       
    73 
       
    74         P)
       
    75             log_info "Skipping command confirmations"
       
    76 
       
    77             CMD_PROMPT=
       
    78             ;;
       
    79 
       
    80         T)
       
    81             log_info "Just testing.."
       
    82 
       
    83             TESTING=y
       
    84             ;;
       
    85 
       
    86         I)
       
    87             log_info "Do virt-install"
       
    88 
       
    89             DO_VIRTINSTALL=y
       
    90             ;;
       
    91         ?)
       
    92             _help $0
       
    93 
       
    94             exit 1
       
    95             ;;
       
    96     esac
       
    97 done
       
    98 
       
    99 # forget them
       
   100 shift $(( $OPTIND - 1 ))
       
   101 
       
   102 ## Command-line arguments
       
   103 log_info "Processing ${#@} arguments"
       
   104 for param in "$@"; do
       
   105     name=${param%=*}
       
   106     value=${param##*=}
       
   107 
       
   108     # evaluate
       
   109     value=$(expand_line "$value")
       
   110 
       
   111     log_debug " $name = $value"
       
   112 
       
   113     eval "opt_${name}=${value}"
       
   114 done
       
   115 
       
   116 ### State
     8 ## Guest info
   117 ## Guest info
     9 GUEST_NAME=$1
   118 GUEST_NAME=$opt_name
    10 
   119 
    11 # Basic params
   120 # Basic params
    12 GUEST_RAM=1G
   121 GUEST_RAM=${opt_ram:-1G}
    13 GUEST_VCPUS=2
   122 GUEST_VCPUS=${opt_cpus:-2}
    14 
   123 
    15 # OS variant (for virt-install)
   124 # OS variant (for virt-install)
    16 GUEST_OS_VARIANT=debiansqueeze
   125 GUEST_OS_VARIANT=${opt_os:-debiansqueeze}
    17 
   126 
    18 ## Disk
   127 ## Disk
    19 # Size of LV to create
   128 # Size of LV to create
    20 DISK_SIZE=10G
   129 DISK_SIZE=${opt_disk_size:-10G}
    21 
   130 
    22 # LVM vg to use
   131 # LVM vg to use
    23 DISK_VG=pvl
   132 DISK_VG=${opt_disk_vg:-pvl}
    24 
   133 
    25 # LVM lv to use
   134 # LVM lv to use
    26 DISK_NAME=${GUEST_NAME}
   135 DISK_NAME=${opt_disk_lv:-${GUEST_NAME}}
    27 
   136 
    28 # Path to disk block device
   137 # Path to disk block device
    29 DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME}
   138 DISK_PATH=/dev/mapper/${DISK_VG}-${DISK_NAME}
    30 DISK_BUS=virtio
   139 DISK_BUS=${opt_disk_bus:-virtio}
    31 GUEST_DISK=/dev/vda
   140 GUEST_DISK=${opt_guest_disk:-/dev/vda}
    32 
   141 
    33 ## Network
   142 ## Network
    34 NET_HOSTNAME=${GUEST_NAME}
   143 NET_HOSTNAME=${opt_hostname:-${GUEST_NAME}}
    35 NET_BRIDGE=br-lan
   144 NET_BRIDGE=${opt_bridge:-br-lan}
    36 NET_IPADDR=194.197.235.36
   145 NET_IPADDR=${opt_ip:-194.197.235.36}
    37 
   146 
    38 ## Installation image
   147 ## Installation image
    39 # Original Debian Installer image (iso)
   148 # Original Debian Installer image (iso)
    40 INSTALLER_NAME="debian-6.0.3-amd64"
   149 INSTALLER_NAME="debian-6.0.3-amd64"
    41 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
   150 INSTALLER_ISO="iso-in/${INSTALLER_NAME}-netinst.iso"
    48 # Customized image content
   157 # Customized image content
    49 INSTALL_TREE="images/${INSTALL_NAME}"
   158 INSTALL_TREE="images/${INSTALL_NAME}"
    50 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
   159 INSTALL_ISO="iso-out/${INSTALL_NAME}.iso"
    51 
   160 
    52 # Preseed output file in install tree
   161 # Preseed output file in install tree
    53 INSTALL_PRESEED_NAME="preseed.cfg"
       
    54 INSTALL_PRESEED_FILE="${INSTALL_TREE}/${INSTALL_PRESEED_NAME}"
       
    55 INSTALL_PRESEED_CHECKSUM= # set later
       
    56 
   162 
    57 # Preseed source template
   163 # Preseed source template
    58 PRESEED_TEMPLATE="preseed/preseed.cfg"
   164 PRESEED_NAME="preseed.cfg"
       
   165 PRESEED_TEMPLATE="preseed/${PRESEED_NAME}"
       
   166 PRESEED_FILE="${INSTALL_TREE}/${PRESEED_NAME}"
    59 PRESEED_ISOLINUX="preseed/isolinux.cfg"
   167 PRESEED_ISOLINUX="preseed/isolinux.cfg"
    60 PRESEED_INCLUDES=("preseed/passwords.cfg" "preseed/host.cfg")
   168 PRESEED_INCLUDES=("preseed/passwords.cfg" "preseed/host.cfg")
       
   169 
       
   170 PRESEED_CHECKSUM= # set later
    61 
   171 
    62 ## External progs
   172 ## External progs
    63 # Bootable .iso for Debian isolinux-based installer CDs
   173 # Bootable .iso for Debian isolinux-based installer CDs
    64 GENISOIMAGE=/usr/bin/genisoimage
   174 GENISOIMAGE=/usr/bin/genisoimage
    65 GENISOIMAGE_OPTS="-r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat"
   175 GENISOIMAGE_OPTS="-r -J -no-emul-boot -boot-load-size 4 -boot-info-table -b isolinux/isolinux.bin -c isolinux/boot.cat"
    83 
   193 
    84 ## SELinux?
   194 ## SELinux?
    85 #SEMANAGE=/usr/sbin/semanage
   195 #SEMANAGE=/usr/sbin/semanage
    86 #RESTORECON=/sbin/restorecon
   196 #RESTORECON=/sbin/restorecon
    87 
   197 
    88 ### Functions
   198 ### Prepare
    89 set -u
   199 cat <<END
    90 set -e
   200 Guest:
    91 
   201     Name:       $GUEST_NAME
    92 scripts=$(dirname $0)/scripts
   202     CPUs:       $GUEST_VCPUS
    93 . $scripts/lib.sh
   203     RAM:        $GUEST_RAM
       
   204     OS:         $GUEST_OS_VARIANT
       
   205 
       
   206     Disk:       $GUEST_DISK
       
   207 
       
   208 Disk:
       
   209     Method:     LVM
       
   210     Size:       $DISK_SIZE
       
   211     LVM:
       
   212         VG:     $DISK_VG
       
   213         LV:     $DISK_NAME
       
   214 
       
   215     Path:       $DISK_PATH
       
   216     Bus:        $DISK_BUS
       
   217 
       
   218 Net:
       
   219     Hostname:   $NET_HOSTNAME
       
   220     Method:     Bridge
       
   221     IP:         $NET_IPADDR
       
   222 
       
   223     Bridge:
       
   224         Name:   $NET_BRIDGE
       
   225 
       
   226 Installer:
       
   227     Name:       $INSTALLER_NAME
       
   228     ISO:        $INSTALLER_ISO
       
   229     Tree:       $INSTALLER_TREE
       
   230 
       
   231 Install:
       
   232     Name:       $INSTALL_NAME
       
   233     Tree:       $INSTALL_TREE
       
   234     ISO:        $INSTALL_ISO
       
   235 
       
   236 Preseed:
       
   237     Name:       $PRESEED_NAME
       
   238     Template:   $PRESEED_TEMPLATE
       
   239     Target:     $PRESEED_FILE
       
   240     Isolinux:   $PRESEED_ISOLINUX
       
   241     Includes:   $PRESEED_INCLUDES
       
   242 
       
   243 END
       
   244 
       
   245 
       
   246 [ $TESTING ] && exit 0
    94 
   247 
    95 ### Check
   248 ### Check
    96 # VM exists?
   249 # VM exists?
    97 if cmd virsh domid ${GUEST_NAME} 2> /dev/null; then
   250 if cmd virsh domid ${GUEST_NAME} 2> /dev/null; then
    98     die "Virtual machine already exists: ${GUEST_NAME}"
   251     die "Virtual machine already exists: ${GUEST_NAME}"
   101 # Installer exists?
   254 # Installer exists?
   102 if cmd test ! -f ${INSTALLER_ISO}; then
   255 if cmd test ! -f ${INSTALLER_ISO}; then
   103     die "Installer not found: ${INSTALLER_ISO}"
   256     die "Installer not found: ${INSTALLER_ISO}"
   104 fi
   257 fi
   105 
   258 
   106 ### Go!
   259 ### Prepare install
   107 # Extract .iso
   260 ## Extract .iso
   108 if [ -f ${INSTALLER_FLAG} ]; then
   261 if [ -f ${INSTALLER_FLAG} ]; then
   109     echo "Installer already unpacked: ${INSTALLER_TREE}"
   262     log_info "Installer already unpacked: ${INSTALLER_TREE}"
   110 
   263 
   111 else
   264 else
   112     echo "Unpacking installer: ${INSTALLER_ISO}"
   265     log_info "Unpacking installer: ${INSTALLER_ISO}"
   113     cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
   266     cmd extract_iso ${INSTALLER_ISO} ${INSTALLER_TREE}
   114     cmd touch ${INSTALLER_FLAG}
   267     cmd touch ${INSTALLER_FLAG}
   115 fi
   268 fi
   116 
   269 
   117 # Copy to customized tree
   270 # Copy to customized tree
   118 cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE}
   271 cmd cp -r ${INSTALLER_TREE} ${INSTALL_TREE}
   119 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
   272 cmd chmod -R u=rwX,og=rX ${INSTALL_TREE}
   120 
   273 
   121 # XXX: Customize preseed
   274 log_info "Installer extracted: $INSTALL_TREE"
   122 cmd expand_template ${PRESEED_TEMPLATE} ${INSTALL_PRESEED_FILE}
   275 
       
   276 ## Customize preseed
       
   277 cmd expand_template ${PRESEED_TEMPLATE} ${PRESEED_FILE}
   123 
   278 
   124 # md5sum
   279 # md5sum
   125 INSTALL_PRESEED_CHECKSUM=$(my_md5sum $INSTALL_PRESEED_FILE)
   280 PRESEED_CHECKSUM=$(my_md5sum $PRESEED_FILE)
   126 
   281 
   127 # Isolinux .cfg
   282 # Isolinux .cfg
   128 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
   283 cmd expand_template ${PRESEED_ISOLINUX} ${INSTALL_TREE}/isolinux/isolinux.cfg
   129 
   284 
   130 # Others
   285 # Others
   132     name=$(basename $file)
   287     name=$(basename $file)
   133 
   288 
   134     cmd expand_template $file ${INSTALL_TREE}/${name}
   289     cmd expand_template $file ${INSTALL_TREE}/${name}
   135 done
   290 done
   136 
   291 
   137 # Create .iso
   292 log_info "Preseed generated: $PRESEED_FILE"
       
   293 
       
   294 ## Create .iso
   138 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
   295 [ -f ${INSTALL_ISO} ] && cmd rm -f ${INSTALL_ISO}
   139 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} ${GENISOIMAGE_OPTS} ${INSTALL_TREE}
   296 
   140 
   297 # generates a lot of output
   141 [ $_ACK ] && read -p "Continue..."
   298 cmd ${GENISOIMAGE} -o ${INSTALL_ISO} -quiet ${GENISOIMAGE_OPTS} ${INSTALL_TREE} 
   142 
   299 
   143 ## LVM
   300 log_info "Install ISO generated: $INSTALL_ISO"
   144 # Create LV (unless it already exists)
   301 
   145 [ -e $DISK_PATH ] || cmd sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG
   302 ### Create virtual machine
   146 
   303 if [ $DO_VIRTINSTALL ]; then
   147 ## SELinux?
   304     ## Disk
   148 #$SEMANAGE fcontext -a -t virt_image_t $DISK
   305     # Create LV (unless it already exists)
   149 #$RESTORECON -v $DISK
   306     [ -e $DISK_PATH ] || cmd_confirm sudo $LVM lvcreate -L $DISK_SIZE -n $DISK_NAME $DISK_VG
   150 
   307 
   151 ## virt-install
   308     ## SELinux?
   152 cmd $VIRT_INSTALL \
   309     #$SEMANAGE fcontext -a -t virt_image_t $DISK
   153         --connect $LIBVIRT \
   310     #$RESTORECON -v $DISK
   154         --name $GUEST_NAME \
   311 
   155         --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \
   312     ## virt-install
   156         --cdrom "$INSTALL_ISO" \
   313     cmd_confirm $VIRT_INSTALL \
   157         --os-variant $GUEST_OS_VARIANT \
   314             --connect $LIBVIRT \
   158         --disk path=$DISK_PATH,bus=$DISK_BUS \
   315             --name $GUEST_NAME \
   159         --network bridge:$NET_BRIDGE \
   316             --ram $(expand_MB $GUEST_RAM) --vcpus $GUEST_VCPUS \
   160         --vnc \
   317             --cdrom "$INSTALL_ISO" \
   161         --virt-type $LIBVIRT_TYPE \
   318             --os-variant $GUEST_OS_VARIANT \
   162         --accelerate --hvm \
   319             --disk path=$DISK_PATH,bus=$DISK_BUS \
   163         --serial pty
   320             --network bridge:$NET_BRIDGE \
   164 
   321             --vnc \
       
   322             --virt-type $LIBVIRT_TYPE \
       
   323             --accelerate --hvm \
       
   324             --serial pty
       
   325 fi
       
   326