上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Linux 起動用initスクリプトver.7

Linux 起動用initスクリプトver.6にWubiでインストールされたUbuntuを起動する機能を付け加えたものです。

ただし、作者の鈴木清は、Wubiを今まで一度も使ったことがありません。
無茶苦茶です。
うまく起動する可能性は低いです。
これを使ってWubiを起動させようとして失敗しても、鈴木清は一切補償しません。

<2010/8/8追記:PuppyLinux4.31日本語版とWineという特殊な組み合わせで、Windowsを一切使わずにWubiでntfsパーティションにUbuntu10.04をインストールしました。それをここに記した方法で正常に起動することができました。>

使い方は、Linux 起動用initスクリプトver.6と同じです。

WubiでUbuntuをインストールしたパーティションを選んだ直後に
y
をタイプすると、
今までのバージョンのものと同様、/boot/grub/grub.cfgや/menu.lstなどが存在すると検出されて、それを使って起動するためのメニューが表示されますが、
それらを抜け(3とタイプす)ると、
/ubuntu/disks/root.disk
が検出されるはずです。

置き換えるべきinitの内容は以下の横線で囲まれた範囲です。「#!/bin/sh」が1行目になるようにしてください。


#!/bin/sh

[ -d /dev ] || mkdir -m 0755 /dev
[ -d /root ] || mkdir -m 0700 /root
[ -d /sys ] || mkdir /sys
[ -d /proc ] || mkdir /proc
[ -d /tmp ] || mkdir /tmp
mkdir -p /var/lock
mount -t sysfs -o nodev,noexec,nosuid none /sys
mount -t proc -o nodev,noexec,nosuid none /proc

grep -q '\<quiet\>' /proc/cmdline || echo "Loading, please wait..."

# Note that this only becomes /dev on the real filesystem if udev's scripts
# are used; which they will be, but it's worth pointing out
if ! mount -t devtmpfs -o mode=0755 none /dev; then
mount -t tmpfs -o mode=0755 none /dev
mknod -m 0600 /dev/console c 5 1
mknod /dev/null c 1 3
fi
mkdir /dev/pts
mount -t devpts -o noexec,nosuid,gid=5,mode=0620 none /dev/pts || true
> /dev/.initramfs-tools
mkdir /dev/.initramfs

# Export the dpkg architecture
export DPKG_ARCH=
. /conf/arch.conf

# Set modprobe env
export MODPROBE_OPTIONS="-qb"

# Export relevant variables
export ROOT=
export ROOTDELAY=
export ROOTFLAGS=
export ROOTFSTYPE=
export IPOPTS=
export HWADDR=
export break=
export init=/sbin/init
export quiet=n
export readonly=y
export rootmnt=/root
export debug=
export panic=
export blacklist=
export resume_offset=

# Bring in the main config
. /conf/initramfs.conf
. /scripts/functions

if [ -z "${noresume}" ]; then
export resume=${RESUME}
else
export noresume
fi

[ -n "${netconsole}" ] && modprobe netconsole netconsole=${netconsole}

# export BOOT variable value for compcache,
# so we know if we run from casper
export BOOT

# Don't do log messages here to avoid confusing usplash
run_scripts /scripts/init-top

log_begin_msg "Loading essential drivers..."
load_modules
log_end_msg

[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/init-premount"
run_scripts /scripts/init-premount
[ "$quiet" != "y" ] && log_end_msg

[ -d /mnt ] || mkdir -m 0755 /mnt
echo ==========================
echo "Please wait until all the device you want to boot is recognized and then push ENTER key."
echo ==========================
read a
deviceslist=$(blkid|cut -d: -f1)
okdeviceslist=""
for a in $deviceslist
do
umount -l /mnt 2>/dev/null
mount -t $(blkid $a|sed -e "s/.*TYPE=\"//"|sed -e "s/\".*//") $a /mnt 2>/dev/null || continue
okdeviceslist="${okdeviceslist} $a"
umount -l /mnt 2>/dev/null
done
i=0
echo ==========================
echo "The device file names and information of partitions will be recognized and are shown below."
echo
for a in ${okdeviceslist}
do
echo $i":"$(blkid|grep "${a}:")
i=$(expr $i + 1)
done
echo
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the device file name of the root partition of Ubuntu you want to boot."
panipani () {
echo "DAMESSU! I will try to make you use terminal"
PS1='(kiyoChelp) ' /bin/sh -i </dev/console >/dev/console 2>&1
echo "Please reboot by pressing CTRL+ALT+DEL or ATL+SysRq+R,S,E,I,U,B"
exec run-init ${rootmnt} ${init} "$@" <${rootmnt}/dev/console >${rootmnt}/dev/console 2>&1
panic "Could not execute run-init."
}
readloop () {
while [ a = a ]
do
read a
if [ $a -ge 0 ]
then
if [ $? = 1 ]
then
echo "Please type number"
continue
elif [ $a -lt "$(echo $*|tr ' ' '\n'|wc -l)" ]
then
break
else
echo "Please type number smaller than $(echo $*|tr ' ' '\n'|wc -l)"
continue
fi
echo "Please type number larger than 0 or 0"
fi
done
}
readloop "${okdeviceslist}"
device=$(echo ${okdeviceslist}|cut -d" " -f $(expr $a + 1))
echo "You selected $a:$device"
mount -t $(blkid $device|sed -e "s/.*TYPE=\"//"|sed -e "s/\".*//") $device /mnt
echo "If you want to search Grub settings, please type y"
echo "If you want to get into busybox, please type zzz"
read aa
if [ -n "$(echo $aa|grep y)" ]
then
fakemore () {
step=$1
num=1
ln=$(wc -l $2 |sed "s/^[^0-9]*//"|sed "s/[^0-9]*$//")
while [ $num -lt $ln ]
do
sed -n "$num,$(expr $num + $step) p" $2
read -p "## Please enter q to quit displaying: " b
if [ a"$b" = "aq" ]
then
break
fi
num=$(expr $num + $step + 1)
done
return
}
settingchange () {
while [ a = a ]
do
echo "kernel is: $kernel"
if [ -z "$(echo $initrd|tr -d " ")" ]
then
echo "initrd line is not set."
else
echo "initrd is: $initrd"
fi
echo "kernel option is: $kernelopts"
read -p "Do you want to boot with the above settings? (nothing:yes, c:edit settings, any other: quit selecting this menuentry) : " q
if [ "a$q" = "a" -o "a$q" = "ay" -o "a$q" = "ayes" ]
then
if [ "a$initrd" = "a" ]
then
kexec -l /mnt${kernel} --append="${kernelopts}"
else
kexec -l /mnt${kernel} --initrd=/mnt${initrd} --append="${kernelopts}"
fi
kexec -e
sleep 10
panipani
elif [ "a$q" = "ac" ]
then
read -p "Type the kernel file in full path (nothing:unchanged): " q
if [ "a$q" != "a" ]; then kernel=$q;fi
read -p "Type the initrd file in full path (nothing:unchanged. to delete, type \"d\"): " q
if [ "a$q" = "ad" ]
then
initrd=""
elif [ "a$q" != "a" ]
then
initrd=$q
fi
read -p "Type the kernel option (nothing:unchanged): " q
if [ "a$q" != "a" ]; then kernelopts=$q;fi
else
break
fi
done
}
if [ -e /mnt/boot/grub/grub.cfg -o -e /mnt/grub/grub.cfg ]
then
[ -e /mnt/boot/grub/grub.cfg ]&& c="/boot"||c=""
echo "$c/grub/grub.cfg (GRUB2 settings file)is found."
while [ a = a ]
do
echo -n "? 1) show $c/grub/grub.cfg, 2) select menuentry, 3)end this function : "
read a
if [ "$a" = 1 ]
then
fakemore 10 /mnt$c/grub/grub.cfg
elif [ "$a" = 2 ]
then
grep menuentry /mnt$c/grub/grub.cfg | sed -e "s/^[^A-z0-9#]*menuentry *//" > /tmp/menuentries
i=0
num=$(wc -l /tmp/menuentries|tr -s " "|sed -e "s/ *//"|cut -d" " -f1)
while [ $i -lt $num ]
do
i=$(expr $i + 1)
echo $(expr $i - 1):$(sed -n -e "${i}p" /tmp/menuentries)
done
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the menu you want to look inside"
readloop "$(cat /tmp/menuentries|tr -d ' ')"
echo "=========================================="
echo "The contents is:"
echo
num=$(grep -A15 -e "$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt$c/grub/grub.cfg|grep -n ^}|sed -n -e 1p|cut -d: -f1)
if [ -n "$num" ]
then
num=$(expr $num - 1)
else
num=15
fi
grep -A $num -e "$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt$c/grub/grub.cfg > /tmp/grubcfg1
cat /tmp/grubcfg1
kernelline=$(grep ^[^A-z0-9#]*linux /tmp/grubcfg1|sed -n -e 1p)
initrdline=$(grep ^[^A-z0-9#]*initrd /tmp/grubcfg1|sed -n -e 1p)
kernel=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*linux *//"|cut -f1 -d" ")
kernelopts=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*linux *//"|sed -e "s/$(echo $kernel|sed -e 's/\//\\\//g')//"|tr -s " ")
initrd=$(echo $initrdline|sed -e "s/^[^A-z0-9#]*initrd *//"|cut -f1 -d" ")
settingchange
elif [ "$a" = 3 ]
then
break
fi
done
fi
if [ -e /mnt/boot/grub/menu.lst -o -e /mnt/grub/menu.lst ]
then
[ -e /mnt/boot/grub/menu.lst ]&& c="/boot"||c=""
echo "GRUB legacy settings file $c/grub/menu.lst is found."
while [ a = a ]
do
echo -n "? 1) show $c/grub/menu.lst, 2) select title, 3)end this function : "
read a
if [ "$a" = 1 ]
then
fakemore 10 /mnt$c/grub/menu.lst
elif [ "$a" = 2 ]
then
grep title /mnt$c/grub/menu.lst | sed -e "s/^[^A-z0-9#]*title *//" > /tmp/menuentries
i=0
num=$(wc -l /tmp/menuentries|tr -s " "|sed -e "s/^ *//"|cut -d" " -f1)
while [ $i -lt $num ]
do
i=$(expr $i + 1)
echo $(expr $i - 1):$(sed -n -e "${i}p" /tmp/menuentries)
done
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the menu you want to look inside"
readloop "$(cat /tmp/menuentries|tr -d ' ')"
echo "=========================================="
echo "The contents is:"
echo
num=$(grep -A15 -e "$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt$c/grub/menu.lst|grep -n ^[^A-z0-9#]*title|sed -n -e "2p"|cut -d: -f1)
if [ -n "$num" ]
then
num=$(expr $num - 2)
else
num=15
fi
grep -A $num -e "^[^A-z0-9#]*title *$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt$c/grub/menu.lst > /tmp/grubcfg1
cat /tmp/grubcfg1
kernelline=$(grep ^[^A-z0-9#]*kernel /tmp/grubcfg1|sed -n -e 1p)
initrdline=$(grep ^[^A-z0-9#]*initrd /tmp/grubcfg1|sed -n -e 1p)
kernel=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*kernel *//"|cut -f1 -d" ")
kernelopts=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*kernel *//"|sed -e "s/$(echo $kernel|sed -e 's/\//\\\//g')//"|tr -s " ")
initrd=$(echo $initrdline|sed -e "s/^[^A-z0-9#]*initrd *//"|cut -f1 -d" ")
settingchange
elif [ "$a" = 3 ]
then
break
fi
done
fi
if [ -e /mnt/menu.lst ]
then
echo "GRUB legacy settings file /menu.lst is found."
while [ a = a ]
do
echo -n "? 1) show /menu.lst, 2) select title, 3)end this function : "
read a
if [ "$a" = 1 ]
then
fakemore 10 /mnt/menu.lst
elif [ "$a" = 2 ]
then
grep title /mnt/menu.lst | sed -e "s/^[^A-z0-9#]*title *//" > /tmp/menuentries
i=0
num=$(wc -l /tmp/menuentries|tr -s " "|sed -e "s/^ *//"|cut -d" " -f1)
while [ $i -lt $num ]
do
i=$(expr $i + 1)
echo $(expr $i - 1):$(sed -n -e "${i}p" /tmp/menuentries)
done
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the menu you want to look inside"
readloop "$(cat /tmp/menuentries|tr -d ' ')"
echo "=========================================="
echo "The contents is:"
echo
num=$(grep -A15 -e "$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt/menu.lst|grep -n ^[^A-z0-9#]*title|sed -n -e 2p|cut -d: -f1)
if [ -n "$num" ]
then
num=$(expr $num - 2)
else
num=15
fi
grep -A $num -e "^[^A-z0-9#]*title *$(sed -n -e $(expr $a + 1)p /tmp/menuentries)$" /mnt/menu.lst > /tmp/grubcfg1
cat /tmp/grubcfg1
kernelline=$(grep ^[^A-z0-9#]*kernel /tmp/grubcfg1|sed -n -e 1p)
initrdline=$(grep ^[^A-z0-9#]*initrd /tmp/grubcfg1|sed -n -e 1p)
kernel=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*kernel *//"|cut -f1 -d" ")
kernelopts=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*kernel *//"|sed -e "s/$(echo $kernel|sed -e 's/\//\\\//g')//"|tr -s " ")
initrd=$(echo $initrdline|sed -e "s/^[^A-z0-9#]*initrd *//"|cut -f1 -d" ")
settingchange
elif [ "$a" = 3 ]
then
break
fi
done
fi
if [ -e /mnt/boot/syslinux/syslinux.cfg -o -e /mnt/syslinux/syslinux.cfg -o -e /mnt/syslinux.cfg ]
then
[ -e /mnt/boot/syslinux/syslinux.cfg ]&& c="/boot/syslinux"
[ -e /mnt/syslinux/syslinux.cfg ]&& c="/syslinux"
[ -e /mnt/syslinux.cfg ]&& c="/"
echo "SYSLINUX settings file $c/syslinux.cfg is found."
syslinuxfiles="/mnt$c/syslinux.cfg"
addsyslinuxconf () {
aaa=$(grep -i -e "include" $1|sed -e "s/include//")
if [ -z "$aaa" ];then return;fi
for bb in $aaa
do
if [ "a$(file /mnt$c/$bb|grep -i ASCII|grep -i text)" != "a" ]
then
syslinuxfiles="$syslinuxfiles /mnt$c/$bb"
addsyslinuxconf /mnt$c/$bb
fi
done
}
addsyslinuxconf /mnt$c/syslinux.cfg
echo "$syslinuxfiles is/are found as configuration file(s)."
while [ a = a ]
do
echo -n "? 1) show syslinux configuration file(s), 2) select menuentry, 3)end this function : "
read a
if [ "$a" = 1 ]
then
for a in $syslinuxfiles
do
fakemore 10 $a
done
elif [ "$a" = 2 ]
then
grep -H -i ^[^A-z0-9#]*label\ * $syslinuxfiles > /tmp/menuentries
i=0
num=$(wc -l /tmp/menuentries|tr -s " "|sed -e "s/^ *//"|cut -d" " -f1)
while [ $i -lt $num ]
do
i=$(expr $i + 1)
echo $(expr $i - 1):$(sed -n -e "${i}p" /tmp/menuentries)
done
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the menu you want to look inside"
readloop "$(cat /tmp/menuentries|tr -d ' ')"
echo "=========================================="
echo "The contents is:"
echo
num=$(grep -A15 -e "$(sed -n -e $(expr $a + 1)p /tmp/menuentries|cut -d: -f2)$" "$(sed -n -e $(expr $a + 1)p /tmp/menuentries|cut -d: -f1)"|grep -i -n ^[^A-z0-9#]*label\ *|sed -n -e 2p|cut -d: -f1)
if [ -n "$num" ]
then
num=$(expr $num - 2)
else
num=15
fi
grep -i -A $num -e "^[^A-z0-9#]*$(sed -n -e $(expr $a + 1)p /tmp/menuentries|cut -d: -f2)$" "$(sed -n -e $(expr $a + 1)p /tmp/menuentries|cut -d: -f1)" > /tmp/grubcfg1
# the above line has problem when label line contains ":" or file name contains ":".
cat /tmp/grubcfg1
kernelline=$(grep -i ^[^A-z0-9#]*kernel /tmp/grubcfg1|sed -n -e 1p)
# linux or LINUX line should be taken into account.
initrdline=$(grep -i ^[^A-z0-9#]*initrd /tmp/grubcfg1|sed -n -e 1p)
kernel=$(echo $kernelline|sed -e "s/^[^A-z0-9#]*kernel *//"|cut -f1 -d" ")
kernelopts=$(grep -i ^[^A-z0-9#]*append /tmp/grubcfg1|sed -e "s/^[^A-z0-9#]*append *//"|sed -e "s/^[^A-z0-9#]*APPEND *//"|tr -s " ")
if [ "a$(echo $kernelopts|grep -i initrd=)" = "a" ]
then
initrd=$(echo $initrdline|sed -e "s/^[^A-z0-9#]*initrd *//"|cut -f1 -d" ")
else
initrd=$(echo $kernelopts|sed -e "s/.*initrd=//"|cut -d" " -f1)
fi
settingchange
elif [ "$a" = 3 ]
then
break
fi
done
fi
if [ -f /mnt/ubuntu/disks/root.disk ]
then
echo "/ubuntu/disks/root.disk is found. Maybe this is WUBI file."
device=$(grep " /mnt " /proc/mounts|cut -d" " -f1)
mkdir /mntroot
umount $device
mount -t $(blkid $device|sed -e "s/.*TYPE=\"//"|sed -e "s/\".*//") $device /mntroot
mount -o loop /mntroot/ubuntu/disks/root.disk /mnt
if [ $? = 0 ]
then
kernel="/vmlinuz"
initrd="/initrd.img"
kernelopts="root=UUID=$(blkid $device|sed -e 's/^.*UUID=\"//'|sed -e 's/\".*//') loop=/ubuntu/disks/root.disk ro"
settingchange
else
echo "$device /ubuntu/disks/root.disk is failed to be mounted."
fi
fi
fi
if [ -n "$(echo $aa|grep zzz)" ]
then
PS1='(kiyoChelp) ' /bin/sh -i </dev/console >/dev/console 2>&1
fi
echo "======================================"
echo "The following kernels seems to be available."
kernels1=$(ls /mnt/boot/ -1|grep vmlinuz)
kernels=""
i=0
for a in $kernels1
do
if [ -n "$(ls -1 /mnt/boot/initrd*$(echo $a|cut -c9-))*" ]
then
echo $i":"$(echo $kernels1|cut -d" " -f $(expr $i + 1))
i=$(expr $i + 1)
kernels="$kernels $a"
fi
done
echo "You can look upper by pushing SHIFT and PageUp keys at the same time."
echo "Please type the number of the kernel you want to boot."
readloop "${kernels}"
kernel=$(echo ${kernels}|cut -d" " -f $(expr $a + 1))
echo "You selected $a:$kernel"
echo "The following option is suggested to pass to the kernel:"
echo "root=UUID=$(blkid|grep "$device:"|sed -e "s/^.*UUID=\"//"|sed -e "s/\".*//") ro"
echo ""
echo "Please enter commandline parameter to pass to kernel."
echo "If you accept the suggested option, please type nothing."
read a
if [ -n "$a" ]
then
kexec -l /mnt/boot/$kernel --append="$a" --initrd=$(ls /mnt/boot/initrd*$(echo $kernel|cut -c9-)*|tail -n1)
kexec -e
else
kexec -l /mnt/boot/$kernel --append="root=UUID=$(blkid|grep "$device:"|sed -e "s/^.*UUID=\"//"|sed -e "s/\".*//") ro" --initrd=$(ls /mnt/boot/initrd*$(echo $kernel|cut -c9-)*|tail -n1)
kexec -e
fi
umount -l /mnt
panipani



2010/8/22追記:

今までに、以下のディストリを起動できることを確認しています。
デフォルトってのは数字でパーティションを選んで、そのままENTERで、カーネルを数字で選んでそのままENTERの場合です。

Ubuntu10.04
 内蔵HDDのパーティションへのインストールーデフォルト&yによるgrub.cfg
 USB-HDDのパーティションへのインストール(BIOSがUSB-HDDからの起動に対応していない場合もOK)ーデフォルト&yによるgrub.cfg
 Wubiーyによる
 USBスタートアップディスクの作成により作成されたものーyによるsyslinux

DebianLenny
 内蔵HDDのパーティションへのインストールーデフォルト&yによるmenu.lst

DebianSid
 内蔵HDDのパーティションへのインストールーデフォルト&yによるgrub.cfg

PuppyLinux4.31日本語版
 内蔵HDDのパーティションへのFullインストールーyによるmenu.lst
 内蔵HDDのパーティションへのFrugalInstallーyによるmenu.lst

OpenSUSE11.2
 内蔵HDDのパーティションへのインストールーyによるmenu.lst

VineLinux5.1
 内蔵HDDのパーティションへのインストールーyによるmenu.lst

Fedora13
 内蔵HDDのパーティションへのインストールーyによるmenu.lst

PCLinuxOS-gnome-2010.07
 内蔵HDDのパーティションへのインストールーyによるmenu.lst(ただし、cで編集して(hd*,*)ってのを消す必要があります。)

Slackware13.1
 内蔵HDDのパーティションへのインストールーzzzで
kexec -l /mnt/boot/vmlinuz --append="root=/dev/デバイスファイル名"
kexec -e

LinuxMint9
 内蔵HDDのパーティションへのインストールーデフォルト&yによるgrub.cfg

Mandriva2010
 内蔵HDDのパーティションへのインストールーyによるmenu.lst(ただし、cで編集して(hd*,*)ってのを消す必要があります。)

Gentoo
 内蔵HDDのパーティションへのインストールーyによるmenu.lst(ただし、CLIのみ・・・そもそもGentooをGUIで鈴木がまともに起動できていないので)

====================
注意事項:

・CentOSなどELFに分類されるカーネルではinitramfsを利用できず、起動できません。

・zzzでmountやkexecを利用できます。
関連記事

テーマ : Linux
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

プロフィール

kiyoshi

Author:kiyoshi
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
since 2011/9/25
現在の閲覧者数:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。