Не получается сделать загрузку с 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 ?
юзай вим, что ли.
уверен в наличии в /bin/sh оператора [ ? .
при таком раскладе будет грузится с раздела, где оно лежало :)
как пихали, вкратце расскажите. почему именно инитрамфс а не инитрд ? чем пожато ?на чем вылетает ?
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 ?
а разве
не покатит? я так со всем делал.
ой, это я ошибся:
И, кстати, не ругется! 0_о
Пихаю так:
>уверен в наличии в /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 в строчке
будут обработаны /sbin/init когда я сделаю switch_root ?
а что тогда за параметры передаются /sbin/init ? ($INIT_ARGS)
в туторе их получали из /proc/cmdline: исключали параметры вида [что-то]=[что-то] и параметры, предназначенные для initramfs (у меня это параметр recovery).
почему initramfs? ну, зачем повторяться: есть много статей, где написано, почему initramfs лучше, чем initrd ))
----------------------------------
вообще основная проблема в том, что ось ВСЕГДА грузится с /dev/sda2 и на initramfs никак не реагирует ((
kerm написал(а): Хочу сделать
Я не большой спец по initrd, но для fbsplash это всё очень сложно — файл с темой создаётся одной командой и прописывается в загрузчик.
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
ну так у меня и не initrd
ну так у меня и не initrd ))
как уже писал, мне хотя бы увидеть, что оно работает... с fbsplash потом разберусь.
Почитал по ссылкам, проверил
Почитал по ссылкам, проверил — у меня всё-таки initramfs (-:E
Текстовый редактор vi имеет два режима работы: в первом он пищит, а во втором — всё портит.
Все )))
Проблема решена ))
Дело было в неправильной упаковке initramfs.
Делал так:
(лежал скрипт в /usr/src, делал быстро, не думая совсем)
Вот он мне и паковал систему как /initramfs/bin /initramfs/lib ...
При загрузке ядро от всего этого совсем охриневало и грузило ось с /dev/sda2(видимо последняя удачная загрузка с него была)
Теперь так:
Вот.
Все же интересно, что за параметры:
# 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