Не получается сделать загрузку с initramfs.

Хочу сделать загрузку с помощью initramfs.(fbsplash; возможно, корень перенесу на lvm)
Делал по этим статьям:
http://jootamam.net/howto-initramfs-image.htm
http://www.sourcemage.org/HowTo/Initramfs
http://en.gentoo-wiki.com/wiki/Initramfs

busybox не юзал, все пихал сам.

вот мой init:

#!/bin/sh

PATH="/bin:/sbin:/usr/bin:/usr/sbin"
SHELL="/bin/sh"
REC_PARAM="recovery"

# Defaults
NEW_ROOT="/dev/sda2"
NEW_ROOT_INIT="/sbin/init"
NEW_ROOT_PATH="/mnt/newroot"
INIT_ARGS=

# Function for executing shell.
shell () {
	echo ''
	echo 'Rescue shell.'
	echo 'Exit shell to continue booting.'
	$SHELL
}

# Function for parsing params from command line.
get_param () {
	echo "$@" | cut -d "=" -f 2
}

echo 'Checking basic directories'
for dir in /proc /sys /dev $NEW_ROOT_PATH
do
	[ -d $dir ] || mkdir $dir
done

echo 'Mount /proc'
mount -t proc none /proc
echo 'Mount /sys'
mount -t sysfs none /sys
echo 'Populate /dev'
mdev -s

# Drop to shell if "recovery" was passed as kernel param.
grep -q $REC_PARAM /proc/cmdline && shell

#Process command line options
for param in $(cat /proc/cmdline); do
	case $param in
		root/=*)
			NEW_ROOT=$(get_param $param)
			;;
		init/=*)
			NEW_ROOT_INIT=$(get_param $param)
			;;
	esac
done

# Get the args to pass to init.
INIT_ARGS="$(awk '{gsub(/[[:graph:]]+=[[:graph:]]+/,""); print}' /proc/cmdline)"
# Removing initramfs args.
INIT_ARGS="$(echo $INIT_ARGS | awk '{gsub(/$REC_PARAM/,""); print}')"

# Mounting root FS.
if [ ! mount -o ro "$NEW_ROOT" "$NEW_ROOT_PATH" ] then
	echo
	echo "Couldn't mount root!"
	shell
else
	echo "Root succesfuly mounted."
fi

echo "Searching for $NEW_ROOT_INIT ..."
if [ ! -e "$NEW_ROOT_PATH/$NEW_ROOT_INIT" ] then
	echo
	echo "No $NEW_ROOT_INIT found!"
	shell
else
	echo "$NEW_ROOT_INIT found."
fi

echo "Unmounting /proc"
umount /proc
exco "Umounting /sys"
umount /sys

echo "Change to the new root partition."
if [ ! exec switch_root "$NEW_ROOT_PATH" "$NEW_ROOT_INIT" $INIT_ARGS ] then
	echo 
	echo "Couldn't switch root!"
	echo 'Mount /proc'
	mount -t proc none /proc
	echo 'Mount /sys'
	mount -t sysfs none /sys
	shell
fi

в grub.conf:

title Gentoo
root(hd0,0)
kernel /base
initrd /initramfs.cpio.gz

---------------------------------
И что то не выходит ничего ((
1)Независимо от того, что у меня в init, gentoo грузится с /dev/sda2. о_0
Т.е. даже если у меня /dev/sda2 затерт, а корень я перенес на /dev/sda4 (в init NEW_ROOT="/dev/sda4"), то все равно gentoo пытается загрузиться с /dev/sda2.
У меня такое ощущение, что initramfs вообще не запускается. Я прописал в нем для теста вывод в /mnt/newroot/initlog, но он ничего в него не записал. Закоментил строчку с switch_root, ось все равно загрузилась. о_0
Хотя если в init ошибка, то загрузка приостанавливается.
2)Следующий вопрос: как передать init параметры? Я правильно понимаю, что так:

title Gentoo
root(hd0,0)
kernel /base root=/dev/mapper/vgnt-root init=/sbin/init recovery
initrd /initramfs.cpio.gz

?
3)Если так правильно, то у меня почему то не выбрасывает в shell с параметром recovery..
4)Ну и последний вопрос: как передать через параметры уровни запуска? по аналогии с этим:

title Автономное использование Gentoo Linux
root (hd0,0)
kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline

---------------------------------
Вот. Перерыл весь гугль, ничего толкового не нашел. Жду вашей помощи.. [особенно 1-ый вопрос волнует]

по1. если не юзал busybox ,

по1.

если не юзал busybox , то откуда возьмется /bin/sh ?

exco "Umounting /sys"

юзай вим, что ли.
уверен в наличии в /bin/sh оператора [ ? .

kernel /base
initrd /initramfs.cpio.gz

при таком раскладе будет грузится с раздела, где оно лежало :)

как пихали, вкратце расскажите. почему именно инитрамфс а не инитрд ? чем пожато ?на чем вылетает ?

2) какие такие init параметры ?

RC системы всех дистрибов парсят /proc/cmdline и в зависимости от него действуют. это же ответ и на п.4

P.S По многолетней традиции линух части рунета по ссылкам не ходил

Compute:
Bosch M2.8.1 -> custom Bosch M2.8.3 clone from Russia.
Speed about 260 km,Ram 2 pers.,HDD - 70 kg,210 FLOPS ;)

>если не юзал busybox , то

>если не юзал busybox , то откуда возьмется /bin/sh ?
а разве

cp /bin/sh /usr/src/initramfs/bin/
ldd /bin/sh
..смотрю нужные библиотеки, их тоже копирую

не покатит? я так со всем делал.

exco "Umounting /sys"

ой, это я ошибся:

echo "Umounting /sys"

И, кстати, не ругется! 0_о

Пихаю так:

find . | cpio -H newc -o | gzip > ../ramfs.gz

>уверен в наличии в /bin/sh оператора [ ?
в примерах он используется(именно на sh), я тестил - все ок.

>на чем вылетает ?
да не вылетает, я бы хоть увидел, что оно вообще работает ((

>при таком раскладе будет грузится с раздела, где оно лежало :)
что будет грузиться? initramfs?
ну да.. c /dev/sda1 - с boot'a
а потом по идее switch_root в /dev/sda2 или в /dev/mapper/vgnt-root. Но дело в том, что у меня ось грузится с /dev/sda2 независимо от того, что у меня в init ((

>RC системы всех дистрибов парсят /proc/cmdline и в зависимости от него действуют. это же ответ и на п.4
я правильно понял, что параметры, которые я передал в grub в строчке

kernel (hd0,0)/kernel-2.4.25 root=/dev/hda3 softlevel=offline

будут обработаны /sbin/init когда я сделаю switch_root ?

а что тогда за параметры передаются /sbin/init ? ($INIT_ARGS)

exec switch_root "$NEW_ROOT_PATH" "$NEW_ROOT_INIT" $INIT_ARGS

в туторе их получали из /proc/cmdline: исключали параметры вида [что-то]=[что-то] и параметры, предназначенные для initramfs (у меня это параметр recovery).

почему initramfs? ну, зачем повторяться: есть много статей, где написано, почему initramfs лучше, чем initrd ))
----------------------------------
вообще основная проблема в том, что ось ВСЕГДА грузится с /dev/sda2 и на initramfs никак не реагирует ((

kerm написал(а): Хочу сделать

kerm написал(а):
Хочу сделать загрузку с помощью initramfs.(fbsplash; возможно, корень перенесу на lvm)

Я не большой спец по initrd, но для fbsplash это всё очень сложно — файл с темой создаётся одной командой и прописывается в загрузчик.

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

ну так у меня и не initrd

ну так у меня и не initrd ))
как уже писал, мне хотя бы увидеть, что оно работает... с fbsplash потом разберусь.

Почитал по ссылкам, проверил

Почитал по ссылкам, проверил — у меня всё-таки initramfs (-:E

Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.

Все )))

Проблема решена ))
Дело было в неправильной упаковке initramfs.
Делал так:

initramfs.make:

#!/bin/sh
find initramfs | cpio -H newc -o | gzip > ramfs.gz

(лежал скрипт в /usr/src, делал быстро, не думая совсем)
Вот он мне и паковал систему как /initramfs/bin /initramfs/lib ...
При загрузке ядро от всего этого совсем охриневало и грузило ось с /dev/sda2(видимо последняя удачная загрузка с него была)
Теперь так:

initramfs.make:

#!/bin/sh
cd /usr/src/initramfs
find . | cpio -H newc -o | gzip > /usr/src/initramfs.cpio.gz

Вот.
Все же интересно, что за параметры:

# Get the args to pass to init.
INIT_ARGS="$(awk '{gsub(/[[:graph:]]+=[[:graph:]]+/,""); print}' /proc/cmdline)"
# Removing initramfs args.
INIT_ARGS="$(echo $INIT_ARGS | awk '{gsub(/$REC_PARAM/,""); print}')"
.
.
.
switch_root "$NEW_ROOT_PATH" "$NEW_ROOT_INIT" $INIT_ARGS

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".