📄 create_disk_image
字号:
#!/bin/bash################################################################################### Copyright (C) International Business Machines Corp., 2005## Author(s): Daniel Stekloff <dsteklof@us.ibm.com>#### This program is free software; you can redistribute it and/or modify## it under the terms of the GNU General Public License as published by## the Free Software Foundation; under version 2 of the License.#### This program is distributed in the hope that it will be useful,## but WITHOUT ANY WARRANTY; without even the implied warranty of## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the## GNU General Public License for more details.#### You should have received a copy of the GNU General Public License## along with this program; if not, write to the Free Software## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA#################################################################################function cleanup(){ umount "$MNT" rm -Rf "$MNT"; if [ "$LOOPD" ]; then losetup -d $LOOPD fi if [ "$LOOPP" ]; then losetup -d $LOOPP fi if [ -e "$IMAGE" ]; then rm -f "$IMAGE" fi if [ -e "$LCONF" ]; then rm -f "$LCONF" fi}function die(){ cleanup echo "$@" exit 1}function usage(){ cat << EOUCommand creates a hvm guest disk image for xm-test. Usage: $0 [OPTIONS]OPTIONS: -d|--dvrdir <name> Directory where to find network driver to use for disk image. -i|--image <name> Image name to create. -k|--kernel <name> Kernel name to use for disk image. -n|--netdrv <name> Network driver name to use for disk image. -r|--rootfs <image> Rootfs image to use for disk image.This script defaults to using the 8139too.ko driver for network tests. If a dvrdir isn't added on the command-line, it will look in /lib/modules/ directory relating to the supplied kernel. If thenetwork driver is built into the kernel, you can specify the key word"builtin" with the -d option and the script will continue.Note: Many network drivers rely upon mii.ko. This script will lookfor that module in the same location as the network driver, eitherfor the kernel or the location used with the -d option.EOU}function check_dependencies(){ which lilo > /dev/null 2>&1 if [ $? -ne 0 ]; then die "$PROGNAME requires lilo version 22.7+ to be installed." fi local pass="$( lilo -V | cut -f3 -d " " | awk -F "." ' { if ($1 >= 22 && $2 >= 7) print "true" else print "false" }')" if [ $pass = "false" ]; then die "$PROGNAME requires lilo version 22.7+ to be installed." fi}function initialize_globals(){ PROGNAME="create_disk_image" IMAGE="disk.img" KERNEL="" DRVDIR="" NETDRV="8139too.ko" LCONF="lilo.conf" LOOPD="" # Loop device for entire disk image LOOPP="" # Loop device for ext partition ROOTFS="" MNT="/tmp/$PROGNAME-mnt" SIZE=8192 SECTORS=32 HEADS=8 CYLINDERS=$(($SIZE/$SECTORS/$HEADS*2)) BSIZE=$(($SIZE-$SECTORS)) OFFSET=$(($SECTORS*512))}function get_options(){ while [ $# -gt 0 ]; do case $1 in -d|--drvdir) shift DRVDIR=${1} shift ;; -i|--image) shift IMAGE=${1} shift ;; -k|--kernel) shift KERNEL=${1} shift ;; -n|--netdrv) shift NETDRV=${1} shift ;; -r|--rootfs) shift ROOTFS=${1} shift ;; *) usage exit 1 ;; esac done}function get_loopd(){ local loop for i in `seq 0 7`; do losetup /dev/loop$i > /dev/null 2>&1 if [ $? -ne 0 ]; then # found one echo $i return 0 fi done die "No free loopback devices."}function losetup_image(){ local loop=$1 shift # If offset, then associate with it if [ $# -eq 1 ]; then losetup -o $1 $loop $IMAGE else losetup $loop $IMAGE fi if [ $? -ne 0 ]; then die "Failed to losetup $IMAGE to $loop." fi echo "Associated $IMAGE with $loop"}function create_disk_image(){ dd bs=1024 count=$SIZE of=$IMAGE if=/dev/zero fdisk -b 512 -C $CYLINDERS -H $HEADS -S $SECTORS "$IMAGE" > /dev/null 2>&1 << EOFnp11a1wEOF}function makefs_image(){ mke2fs -N 24 -b 1024 $LOOPP $BSIZE if [ $? -ne 0 ]; then die "mke2fs $LOOPP failed." fi}function dd_rootfs_to_image(){ if [ ! "$ROOTFS" ]; then die "Must specify rootfs image to use." fi dd if="$ROOTFS" of="$LOOPP" > /dev/null 2>&1 if [ $? -ne 0 ]; then die "Failed to dd $ROOTFS to $LOOPP." fi # Resize fs to use full partition e2fsck -f $LOOPP resize2fs $LOOPP if [ $? -ne 0 ]; then die "Failed to resize rootfs on $LOOPP." fi}function get_kernel(){ # look in /boot for an existing kernel local -a kernels=( `ls /boot | grep vmlinuz` ) local k for k in ${kernels[@]}; do case "$k" in *xen*) continue ;; *) KERNEL="/boot/$k" echo "Using kernel $KERNEL" break ;; esac done}function copy_kernel_to_image(){ if [ ! "$KERNEL" ]; then get_kernel || die "Couldn't find a kernel to use." fi mkdir "$MNT/boot" cp "$KERNEL" "$MNT/boot"}function copy_netdriver_to_image(){ local kernel=`basename $KERNEL` local kversion=$( echo $kernel | sed 's/^vmlinuz-//' ) local fdir="/lib/modules/$kversion/kernel/drivers/net" mkdir "$MNT/lib/modules" if [ -e "$DRVDIR" ]; then if [ -e "$DRVDIR/$NETDRV" ]; then cp $DRVDIR/mii.ko $MNT/lib/modules cp $DRVDIR/$NETDRV $MNT/lib/modules else die "Failed to find $NETDRV at $DRVDIR." fi elif [ -e "$fdir/$NETDRV" ]; then cp $fdir/mii.ko $MNT/lib/modules cp $fdir/$NETDRV $MNT/lib/modules else die "Xm-test requires at minimum the 8139too.ko driver to run." fi # Make sure that modules will be installed if [ -e "$MNT/etc/init.d/rcS" ]; then echo "insmod /lib/modules/mii.ko" >> $MNT/etc/init.d/rcS echo "insmod /lib/modules/$NETDRV" >> $MNT/etc/init.d/rcS else die "Failed to add insmod command to rcS file on image." fi}function lilo_image(){ local kernel=`basename $KERNEL` ( cat <<EOCboot=$LOOPDdelay=10geometricmap=$MNT/boot/mapdisk=$LOOPD bios=0x80 sectors=$SECTORS heads=$HEADS cylinders=$CYLINDERS partition=$LOOPP start=$SECTORSimage=$MNT/boot/$kernel append="root=0301 console=tty0 console=ttyS0"# append="root=0301" label=Linux read-onlyEOC ) > "/$MNT/boot/$LCONF"}function install_lilo(){ lilo -C "$MNT/boot/$LCONF" if [ $? -ne 0 ]; then die "Failed to install $MNT/boot/$LCONF." fi}function add_getty_to_inittab(){ local itab=$MNT/etc/inittab if [ -e "$itab" ]; then echo "# Start getty on serial line" >> $itab echo "S0:12345:respawn:/sbin/getty ttyS0" >> $itab fi}# Main starts hereinitialize_globalscheck_dependenciesget_options "$@"create_disk_image# Get the first free loop deviceldev=$(get_loopd)LOOPD="/dev/loop$ldev"losetup_image $LOOPD# Now associate where the partition will goldev=$(get_loopd)LOOPP="/dev/loop$ldev"losetup_image $LOOPP $OFFSETmakefs_imagedd_rootfs_to_imageif [ -e "$MNT" ]; then rm -Rf "$MNT"fimkdir "$MNT";if [ $? -ne 0 ]; then die "Failed to create temporary mount point $MNT."fimount "$LOOPP" "$MNT";if [ $? -ne 0 ]; then die "Failed to mount $LOOPP on $MNT."ficopy_kernel_to_imageif [ ! "$DRVDIR" = "builtin" ]; then copy_netdriver_to_imagefi#add_getty_to_inittablilo_imageinstall_liloumount "$MNT"rm -Rf "$MNT";losetup -d $LOOPDlosetup -d $LOOPPexit 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -