Vine42-i386.iso を同梱して、 USB ブートな Vine Linux 4.2 インストーラーを作成してみた

いや、これは、もうやっつけなんです。手元に CD-R が無くなってしまったので、これくらいしか思いつきませんでした。

次期 Vine Linux 5.0 のインストーラーは、たぶん USB ブート対応になるだろうと思いますので、賞味期限が短いやっつけスクリプトです。

Ubuntu 向けに作られた USB メモリからブートするスクリプトと同じやつを、そのまま拝借して、 Vine42-i386.iso を同梱しただけです。オリジナルのは http://kiwilinux.org/public/isotostick.sh です。

下記のスクリプトを仮に vl42isotostick.sh という名前で保存すると、手順は以下のようになります。

参考: http://wiki.eeeuser.com/ubuntu

# sudo mkfs.vfat -F 32 -n vine /dev/sdX1
# sudo parted /dev/sdX set 1 boot on
# sudo bash /some/where/vl42isotostick.sh /some/where/Vine42-i386.iso /dev/sdX1
# sudo syslinux /dev/sdX1

どうでもいいけど、日本語入力システム anthy の名前の由来って、 Utena Girl Revolution Anthy - 少女革命アンシー 輪舞 - Revolution から来てたのね。

次の入力システムの名前は、つかさ (らき☆すた) とかアイマスの春香とかハルヒとか言われているらしいよ。

#!/bin/bash

# Convert an Ubuntu live CD iso so that it's bootable off of a USB stick
# Copyright 2007  Red Hat, Inc.
# Jeremy Katz <katzj@redhat.com>
# Jani Monoses <jani@ubuntu.com> (slightly adapted to Ubuntu LiveCD)
# Christer Edwards <christer.edwards@gmail.com> (some minor code cleanups)
# 
# 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; 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 Library 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.


export PATH=/sbin:/usr/sbin:$PATH

usage () {
    echo "$0 [--reset-mbr] [--noverify] <isopath> <usbstick device>"
    exit 1
}

cleanup () {
    [ -d "$CDMNT" ] && umount $CDMNT && rmdir $CDMNT
    [ -d "$USBMNT" ] && umount $USBMNT && rmdir $USBMNT
}

exitclean () {
    echo "Cleaning up to exit..."
    cleanup
    exit 1
}

getdisk () {
    DEV=$1

    p=$(udevinfo -q path -n $DEV)
    if [ -e /sys/$p/device ]; then
	    device=$(basename /sys/$p)
    else
	    device=$(basename $(readlink -f /sys/$p/../))
    fi

    if [[ ! -e /sys/block/$device || ! -e /dev/$device ]]; then
	echo "Error finding block device of $DEV.  Aborting!"
	exitclean
    fi

    device="/dev/$device"
}

resetMBR () {
    getdisk $1
    cat /usr/lib/syslinux/mbr.bin > $device
}

checkMBR () {
    getdisk $1

    bs=$(mktemp /tmp/bs.XXXXXX)
    dd if=$device of=$bs bs=512 count=1 2>/dev/null || exit 2
    
    mbrword=$(hexdump -n 2 $bs |head -n 1|awk {'print $2;'})
    rm -f $bs
    if [ "$mbrword" = "0000" ]; then
	echo "MBR appears to be blank."
	echo "Do you want to replace the MBR on this device?"
	echo "Press Enter to continue or ctrl-c to abort"
	read
	resetMBR $1
    fi

    return 0
}

checkPartActive () {
    dev=$1
    getdisk $dev
    
    # if we're installing to whole-disk and not a partition, then we 
    # don't need to worry about being active
    if [ "$dev" = "$device" ]; then
	return
    fi

    if [ "$(/sbin/fdisk -l $device 2>/dev/null |grep $dev |awk {'print $2;'})" != "*" ]; then
	echo "Partition isn't marked bootable!"
	echo "You can mark the partition as bootable with "
        echo "    # /sbin/parted $device"
	echo "    (parted) toggle N boot"
	echo "    (parted) quit"
	exitclean
    fi
}

checkFilesystem () {
    dev=$1

    USBFS=$(/lib/udev/vol_id -t $dev)
    if [[ "$USBFS" != "vfat" && "$USBFS" != "msdos" && "$USBFS" != "ext2" && "$USBFS" != "ext3" ]]; then
	echo "USB filesystem must be vfat or ext[23]"
	exitclean
    fi

    USBLABEL=$(/lib/udev/vol_id -u $dev)
    if [ -n "$USBLABEL" ]; then 
	    USBLABEL="UUID=$USBLABEL" ; 
    else
	    USBLABEL=$(/lib/udev/vol_id -l $dev)
	if [ -n "$USBLABEL" ]; then 
	    USBLABEL="LABEL=$USBLABEL" 
	else
	    echo "Need to have a filesystem label or UUID for your USB device"
	    if [ "$USBFS" = "vfat" -o "$USBFS" = "msdos" ]; then
		    echo "Label can be set with /sbin/dosfslabel"
	    elif [ "$USBFS" = "ext2" -o "$USBFS" = "ext3" ]; then
		    echo "Label can be set with /sbin/e2label"
	    fi
	    exitclean
	fi
    fi
}

checkSyslinux () {
    if [ ! -x /usr/bin/syslinux ]; then
	echo "You need to have syslinux installed to run this script"
	exit 1
    fi

    #if ! syslinux 2>&1 | grep -qe -d; then
	SYSLINUXPATH=""
    #else
	#    SYSLINUXPATH="syslinux"
	#menu texts are trimmed when syslinux is not in / no idea why
	#SYSLINUXPATH=""
    #fi
}

if [ $(id -u) != 0 ]; then 
    echo "You need to be root to run this script"
    exit 1
fi

while [ $# -gt 2 ]; do
    case $1 in
	--noverify)
	    noverify=1
	    ;;
	--reset-mbr|--resetmbr)
	    resetmbr=1
	    ;;
	*)
	    usage
	    ;;
    esac
    shift
done

ISO=$1
USBDEV=$2

if [[ -z "$ISO" || ! -e "$ISO" ]]; then
    usage
fi

if [[ -z "$USBDEV" || ! -b "$USBDEV" ]]; then
    usage
fi

if [ -z "$noverify" ]; then
    # verify the image
    echo "Not verifying image... (no checkisomd5 in Ubuntu so skipping)!"
    #checkisomd5 --verbose $ISO
    #if [ $? -ne 0 ]; then
	#echo "Are you SURE you want to continue?"
	#echo "Press Enter to continue or ctrl-c to abort"
	#read
    #fi
fi

# do some basic sanity checks.  
checkSyslinux 
checkFilesystem $USBDEV
checkPartActive $USBDEV
checkMBR $USBDEV
[ -n $resetmbr ] && resetMBR $USBDEV

# FIXME: would be better if we had better mountpoints
CDMNT=$(mktemp -d /media/cdtmp.XXXXXX)
mount -o loop $ISO $CDMNT || exitclean
USBMNT=$(mktemp -d /media/usbdev.XXXXXX)
mount $USBDEV $USBMNT || exitclean

trap exitclean SIGINT SIGTERM

if [ -d $USBMNT/casper ]; then
    echo "Already set up as live image.  Deleting old in fifteen seconds..."
    sleep 15

    rm -rf $USBMNT/casper
fi

echo "Copying live image to USB stick"
if [ ! -d $USBMNT/$SYSLINUXPATH ]; then 
    mkdir $USBMNT/$SYSLINUXPATH
fi

# for file in \
# 	 README.diskdefines md5sum.txt \
# 	.disk casper pool dists preseed install;do
# 	cp -a $CDMNT/$file $USBMNT/ 2>/dev/null
# done
## <Vine>
for file in \
	.discinfo RELEASE-NOTES RELEASE-NOTES.euc RELEASE-NOTES.ja \
	docs images Vine;do
	cp -a $CDMNT/$file $USBMNT/ 2>/dev/null
done
cp $ISO $USBMNT/
## </Vine>

cp $CDMNT/isolinux/* $USBMNT/$SYSLINUXPATH

echo "Installing boot loader"
if [[ "$USBFS" = "vfat" || "$USBFS" = "msdos" ]]; then
    # syslinux expects the config to be named syslinux.cfg 
    # and has to run with the file system unmounted
    mv $USBMNT/$SYSLINUXPATH/isolinux.cfg $USBMNT/$SYSLINUXPATH/syslinux.cfg
    cleanup
    if [ -n "$SYSLINUXPATH" ]; then
    	syslinux -d $SYSLINUXPATH $USBDEV
    else
	    syslinux $USBDEV
    fi

elif [[ "$USBFS" = "ext2" || "$USBFS" = "ext3" ]]; then
    # extlinux expects the config to be named extlinux.conf
    # and has to be run with the file system mounted
    mv $USBMNT/$SYSLINUXPATH/isolinux.cfg $USBMNT/$SYSLINUXPATH/extlinux.conf
    extlinux -i $USBMNT/syslinux
    cleanup
fi

echo "USB stick set up as live image!"