
Ubuntu日本語フォーラム

ログインしていません。
. :D :D :D :D
Ubuntu Tips / USBデバイスへのインストール / の
UbuntuをUSBメモリに全自動インストールするには
を御覧下さい。
:D :D :D :D
「 Ubuntu 8.04.1 」 をC&P法でUSBメモリにインストールし、それを起動する「ブートCD」の自動的作成法です。
以下の5つの作業が1つのシェルスクリプトを実行するだけで自動的に行われます。
1. USBメモリのパーティション分割
2. 必要なパッケージのインストール
3. 新しいinitrd.gzの作成
4. Ubuntuのインストール
5. 「ブートCD」イメージの作成
1. USBメモリ上に作成されるパーティション
USBメモリの容量が大きくなり、便利なfat16の 「 storageパーティション 」 を先頭に作れるようになったので、そのパーティションの
有無で分割が2通りになります。
(1) 「 storageパーティション 」 の無い場合 : ( USBメモリ容量が2Gb以下:推奨 )
接続デバイス 名 称 サイズ ファイルシステム
/dev/sd*1 起動パーティション 700Mb fat16
/dev/sd*2 データパーティション 残り全部 ext2
(2) 「 storageパーティション 」 の有る場合 : ( USBメモリ容量が4Gb以上:推奨 )
接続デバイス 名 称 サイズ ファイルシステム
/dev/sd*1 storageパーティション 任意 fat16
/dev/sd*2 起動パーティション 700Mb fat16
/dev/sd*3 データパーティション 残り全部 ext2
下のシェルスクリプトでは、「 storageパーティション 」 の容量をその引数として加えた場合に 「 storageパーティション 」 が自動的
に作成されます。
2. パーティション分割・インストール・「ブートCD」イメージの作成
1. 「 Ubuntu 8.04.1 日本語ローカライズ版 Desktop CD 」 をCDに焼き、それでPCを起動する。
2. USBメモリをPCに接続し(必ず、以下の作業の直前に接続する。PC起動の前に接続してはならない。)、その上に現存する
パーティションがファイル・ブラウザで開かれたら、全て閉じる。アンマウントする必要はない。
3. /home/ubuntu に スクリプトファイル install_usb.sh を作成し、以下の228行 ( 「exit 0」まで ) を書き込んで保存する。
$ gedit install_usb.sh
#!/bin/sh
#
# Ubuntu Desktop CD USB Drive Installer
# (C) 2006-2007 Jun Kobayashi 2008 modified by moz
[ -n "$DEBUG" ] && set -x
DEVICE_FILE=
PARTITION=
PARTITION2=
MOUNT_POINT="mnt"
yesno() {
[ -n "$1" ] && echo -n "$1"
while read ANS; do
if [ x"$ANS" = xyes ] || [ x"$ANS" = xy ]; then
return 0
elif [ x"$ANS" = xno ] || [ x"$ANS" = xn ]; then
return 1
else
echo -n "Answer 'yes' or 'no': "
fi
done
return 1
}
abort() {
[ -n "$1" ] && echo "$1"
[ -n $MOUNT_POINT ] && umount $MOUNT_POINT > /dev/null 2>&1
exit 1
}
#
# Main Routine
#
if [ `whoami` != "root" ]; then
sudo $0 $@
exit
fi
cd `dirname $0`
DEVICE_FILE=`sfdisk -s | grep /dev | tail -n 1 | cut -d: -f1`
if [ ! -e ${DEVICE_FILE} ]; then
echo "${DEVICE_FILE} doesn't exist."
exit 1
fi
if [ ! -b ${DEVICE_FILE} ]; then
echo "${DEVICE_FILE} isn't block special file."
exit 1
fi
echo "\nUSBメモリ上にある全てのパーティションをアンマウントします。\n"
i=1
while [ $i -le 9 ]; do
part=`grep -q '${DEVICE_FILE}$i' /etc/mtab`
if [ -n $part ]; then
umount ${DEVICE_FILE}$i 2>/dev/null
fi
i=`expr $i + 1`
done
DEVICE_DIR=/sys/block/`basename ${DEVICE_FILE}`/device
VENDOR="(不明)"
MODEL="(不明)"
if [ -f ${DEVICE_DIR}/vendor ]; then
VENDOR=`cat ${DEVICE_DIR}/vendor`
fi
if [ -f ${DEVICE_DIR}/model ]; then
MODEL=`cat ${DEVICE_DIR}/model`
fi
echo "!!!注意!!!"
echo "間違ったデバイスを指定した場合、ハードディスクの内容を壊してしまう\n可能性があります。"
echo "内容を消去して良いUSBメモリが指定されていることを確認してください。\n"
echo "[選択されたデバイスの情報]"
echo "\tデバイスファイル: $DEVICE_FILE\n\t\tベンダ: $VENDOR\n\t\tモデル: $MODEL\n"
echo "パーティション分割を開始します。"
echo "既存のパーティションは全て削除され、その上のデータは全て失われます。"
echo "先頭に 「storageパーティション」 を作成するかどうか確認してください。"
yesno "処理を続行してよろしいですか?(yes/no) " || abort
echo ""
num=`parted ${DEVICE_FILE} print | grep -c '^ [1-9]'`
a=1
while [ $a -le $num ]; do
parted ${DEVICE_FILE} rm $a
a=`expr $a + 1`
done
sync; sleep 2
unit=`sfdisk -l ${DEVICE_FILE} | grep ユニット | cut -f3 -d" "`
if [ -z "$1" ]; then
pcy=`expr 700 \* 1000000 / $unit`
sfdisk -q ${DEVICE_FILE} << EOF
,$pcy,6
,,83
EOF
sync; sleep 5
PARTITION=${DEVICE_FILE}1; PARTITION2=${DEVICE_FILE}2; INDEX=1
umount ${PARTITION} 2>/dev/null; umount ${PARTITION2} 2>/dev/null
sleep 2
fi
if [ -n "$1" ]; then
pcy1=`expr $1 \* 1000000 / $unit`
pcy2=`expr 700 \* 1000000 / $unit`
sfdisk -q ${DEVICE_FILE} << EOF
,$pcy1,6
,$pcy2,6
,,83
EOF
sync; sleep 5
PARTITION=${DEVICE_FILE}2; PARTITION2=${DEVICE_FILE}3; INDEX=2
umount ${DEVICE_FILE}1 2>/dev/null; umount ${PARTITION} 2>/dev/null; umount ${PARTITION2} 2>/dev/null
sleep 2
mkdosfs -F 16 -n storage ${DEVICE_FILE}1
sync; sleep 2
fi
echo "パーティション分割が完了しました。\n"
yesno "新たに開かれたファイル・ブラウザを閉じて、yes と入力して下さい。(yes) " || abort
echo "${PARTITION}にブートフラグを設定します。"
sfdisk $DEVICE_FILE -A$INDEX || abort "失敗しました。"
echo "完了しました。\n"
echo "${PARTITION}にファイルシステムを作成します。"
mkdosfs $PARTITION || abort "失敗しました。"
sync; sleep 2
echo "完了しました。\n"
if [ -n "$PARTITION2" ]; then
echo "\n${PARTITION2}にファイルシステムを作成します。"
mkfs.ext2 -b 4096 -L casper-rw ${PARTITION2} || abort "失敗しました。"
sync; sleep 2
echo "完了しました。\n"
fi
if [ ! -f /usr/bin/mtools ] || [ ! -f /usr/bin/ms-sys ] || [ ! -f /usr/bin/syslinux ]; then
echo "必要なパッケージをダウンロードします..."
ur1="http://ubuntu.secs.oakland.edu/pool"
ur2="http://lug.mtu.edu/ubuntu/pool"
mtl="main/m/mtools/mtools_3.9.11-0ubuntu1_i386.deb"
mss="universe/m/ms-sys/ms-sys_2.1.0-1_i386.deb"
sys="main/s/syslinux/syslinux_3.53-1ubuntu2_i386.deb"
wget $ur1/$mtl || wget $ur2/$mtl || abort "失敗しました。インターネット接続を有効にしてから再実行してください。"
wget $ur1/$mss || wget $ur2/$mss || abort "失敗しました。インターネット接続を有効にしてから再実行してください。"
wget $ur1/$sys || wget $ur2/$sys || abort "失敗しました。インターネット接続を有効にしてから再実行してください。"
fi
if [ -f ms-sys*.deb ] && [ -f syslinux*.deb ] && [ -f mtools*.deb ]; then
echo "必要なパッケージをインストールします。\n"
sudo dpkg -i *.deb || abort "インストールに失敗しました。"
fi
echo "\nパッケージのインストールが完了しました。\n"
echo "新しい initrd.gz を作成します。\n"
mkdir init || abort "失敗しました。"
cd init || abort "失敗しました。"
if [ -f /cdrom/casper/initrd.gz ]; then
gzip -dc /cdrom/casper/initrd.gz | cpio -i || abort "失敗しました。"
sync
sed -i 's/,mode=755//' scripts/casper || abort "失敗しました。"
sync
find . | cpio -o -H newc | gzip > ../initrd.gz || abort "失敗しました。"
sync; sleep 1
fi
cd .. || abort "失敗しました。"
echo "\n新しい initrd.gz が作成できました。\n"
echo "${DEVICE_FILE}にMBRをインストールします。"
ms-sys -f -s $DEVICE_FILE || abort "失敗しました。"
sleep 1
echo "完了しました。\n"
echo "syslinux をインストールします。"
syslinux $PARTITION
sleep 1
echo "完了しました。\n"
mkdir mnt || abort "失敗しました。"
echo "$PARTITION を `pwd`/${MOUNT_POINT} にマウントしています。"
mount -t vfat $PARTITION $MOUNT_POINT || abort "失敗しました。"
sync
sleep 1
echo "完了しました。\n"
echo "ファイルをコピーしています。(時間がかかります)"
cp -rf /cdrom/.disk /cdrom/isolinux/* /cdrom/casper/vmlinuz ./*.gz $MOUNT_POINT/ || abort "失敗しました。"
sync
mkdir $MOUNT_POINT/casper/ || abort "失敗しました。"
cp -f /cdrom/casper/filesystem.* $MOUNT_POINT/casper/ || abort "失敗しました。"
sync
cp -f /cdrom/isolinux/isolinux.cfg $MOUNT_POINT/syslinux.cfg || abort "失敗しました。"
sync
if [ -n "$PARTITION2" ]; then
sed -i -e '8,23d' -e 's/\/cdrom\///' -e 's/Try Ubuntu without any change to your computer/Start Ubuntu on USB Memory/' -e 's/\/casper\///' -e 's/300/100/' -e 's/utc=no --/utc=no persistent --/' $MOUNT_POINT/syslinux.cfg
sync
fi
echo "完了しました。\n"
echo "「ブートCD」のイメージを作成します。"
mkdir bootcd || abort "失敗しました。"
cp -rf /cdrom/.disk /cdrom/isolinux/* /cdrom/casper/vmlinuz ./*.gz bootcd/ || abort "失敗しました。"
cp -f $MOUNT_POINT/syslinux.cfg bootcd/isolinux.cfg || abort "失敗しました。"
sync
genisoimage -R -b isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o bootcd.iso bootcd || abort "失敗しました。"
sync
echo "\n「ブートCD」のイメージができました。"
echo "`pwd`/${MOUNT_POINT} をアンマウントしています。"
umount $MOUNT_POINT || abort "失敗しました。"
rm -rf mnt bootcd initrd.gz *.deb init || abort "失敗しました。"
echo "完了しました。"
echo "\nすべての処理が正常に終了しました。\n"
exit 0
4. 次のコマンドでインストールし、「ブートCD」イメージを作成する。
(1) 先頭に 「storageパーティション」 を作成しない場合:
$ sudo sh ./install_usb.sh
(2) 先頭に 「storageパーティション」 を作成する場合は、そのパーティション容量 (Mb) を半角数字 xxxx で、引数として
付け加える。
$ sudo sh ./install_usb.sh xxxx
5. /home/ubuntu に出来ている bootcd.iso を、CD-R(W) に焼く。
** **
≪ ファイアウォールを有効にする ≫
「 Ubuntu 8.04.1 」 に入っている 「ufw (Uncomplicated Firewall)」 を起動することで、簡単な Firewall を有効にします。
次のコマンドを実行して2行目の応答があれば起動され、次回からUbuntu起動時に自動的に有効になります。
$ sudo ufw enable
Firewall started and enabled on system startup
( 「データパーティション」へのデータ保存機能に関して、セキュリティに未解決の問題があります。ご注意下さい。)
≪ 参考 と お願い ≫
1. USBメモリ上のUbuntuを使うのに、「USBメモリ上のUbuntuを快適に使うには」 を参考にして下さい。 幾つかの項目が加えら
れましたので、初めての方に限らず是非御覧下さい。
2. 不具合がありましたら、是非お知らせ下さい。
.
最後の編集者: moz (2008-11-21 11:40:51)
オフライン
※規約違反により追放されたユーザの投稿は、ログインユーザにのみ表示されます。
オフライン
1日平均250を越えるアクセスを頂きありがとうございます。
インストールの自動化で唯一残されていた 「 USBメモリのデバイスファイルの自動獲得 」 を含めた、謂わば完全自動版を実現することが
でき、上のシェルスクリプトを書き換えました。
「シェルスクリプトの前に何やら難しいことが書いてあり分かりにくい」 との御批判をweb上で複数の方から頂き、もう少し便利にできないか
と工夫を凝らしてきました。 御期待に添えたかどうかは定かではありませんが、まずは一段落というところです。
「Ubuntu 8.10」 からはWikiのTipsをふくめ全てこの方法にする方針です。
不具合がありましたら是非お寄せ下さい。
** **
余談になりますが、「Ubuntu 8.10」 では 「Ubuntu 8.04」 のような initrd.gz の編集が不要なので、シェルスクリプトは幾分短くなり
ますが、起動に関するファイル群 ( isolinux.cfg、syslinux.cfg など ) がかなり短縮され、代わりに複数のファイルが追加されるので、
その部分ではシェルスクリプトの編集が必要です。
.
最後の編集者: moz (2008-10-27 20:40:30)
オフライン