LINUX.ORG.RU

initramfs&chroot


0

1

Мой init:

#!/bin/busybox sh
init() {
...
busybox mount -t devtmpfs none /dev
...
}

clear() {
...
busybox umount /dev
...
}

init
...
clear
exec busybox switch_root /mnt/root /sbin/init

1. Как правильно сделать chroot в root раздел? У меня после switch_root зависает система.
2. Где можно посмотреть, какие устройства создает devtmpfs? setfont из busybox ругается на отсутсвие tty.
Заранее спасибо.

Здесь корневой раздел монтируется исходя из параметра root=UUID или LABEL

#!/bin/busybox sh
rescue_shell() {
    echo "Something went wrong. Dropping you to a shell."
    busybox --install -s
    exec /bin/sh
}
mini_udev() {
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
}
uuidlabel_root() {
    for cmd in $(cat /proc/cmdline) ; do
        case $cmd in
        root=*)
            type=$(echo $cmd | cut -d= -f2)
            if [ $type == "LABEL" ] || [ $type == "UUID" ] ; then
                uuid=$(echo $cmd | cut -d= -f3)
                mount -o ro $(findfs "$type"="$uuid") /mnt/root
            else
                mount -o ro $(echo $cmd | cut -d= -f2) /mnt/root
            fi
            ;;
        esac
    done
}
# Mount the /proc and /sys filesystems.
mount -t proc none /proc
mount -t sysfs none /sys
# Launch mdev (mini_udev)
mini_udev
# Do your stuff here.
#echo "This script mounts rootfs and boots it up, nothing more!"
# Mount the root filesystem.
#mount -o ro /dev/sda1 /mnt/root
uuidlabel_root || rescue_shell
# Clean up.
umount /proc
umount /sys
# Boot the real thing.
exec switch_root /mnt/root /sbin/init

kostik87 ★★★★★ ()
Ответ на: комментарий от kostik87

Хм.. В sh из busybox команды сами схватываются, и не надо писать перед ними ``busybox"? А я тормозил, писал везде...
За рабочий init спасибо, сейчас попробую.

kermzyxer ()
Ответ на: комментарий от kostik87

Заменил devtmpfs на mdev, убрал busybox из команд, не помогло. Да, стоит Gentoo, busybox собран с флагами static и mdev. Вот кусок init:

#!/bin/busybox sh
init() {
  mount -t proc none /proc
  mount -t sysfs none /sys
  echo /sbin/mdev > /proc/sys/kernel/hotplug
  mdev -s
}

clean() {
  umount /proc
  umount /sys
}

printmsg() {echo "Initramfs: $1"; }

# init
printmsg init
init

...
тут я подключаю lvm том, монтирую root раздел в /mnt/root, ошибок нет.
...

# cleaning
printmsg clean
clean

# chroot
printmsg "switching to a root"
exec switch_root /mnt/root /sbin/init \
 || printmsg "failed switch to a root"
Вот, что пишет:
Initramfs: init
setfont: can't open '/dev/tty': No such device or adress
Initramfs: failed to set cool console font
  Reading all physical volumes. This may take a while...
Synaptics Touchpad, model: 1, fw: 8.0, id: 0x1e2b1, caps: 0xd001a3/0x940300/0x120c00
serio: Synaptics pass-through port atisa0060/serio1/input0
usv 1-1.4: new full speed USB devices using ehci_hcd and adress 4
  Found volume group "thinkpad" using metadata lvm2
input: SunPS/2 Synaptics Touchpad as /devices/platform/i8042/serio1/input/input6
  4 logical volume(s) in volume group "thinkpad" now active
Initramfs: mounting root
usb 1-1.6: new high speed USB device using ehci_hcd and adress 5
EXT4-fs (dm-1): mounted filesystem with ordered data mode. Opts: (null)
Initramfs: clean
Initramfs: switching to a root

тут виснет. пишет сообщения от ядра - например, если вставить флешку.

IBM Trackpoint firmware 0x0e, buttons: 3/3
input: TPPS/2 IBM TrackPoint as /devices/platform/i8042/serio1/serio2/input/input7

kermzyxer ()
Ответ на: комментарий от kermzyxer

Попробуйте перегенерировать образ initrd, скопировав туда файлы устройств: /dev/tty /dev/tty0 /dev/zero /dev/console /dev/zero /dev/null

kostik87 ★★★★★ ()
Ответ на: комментарий от kostik87

Удалил все из /usr/src/initramfs/dev, кроме папки mapper. Скопировал устройства null, console, tty, tty0, zero командой `cp -a'. Не помогло, setfont все так же ругается на отсутствие tty.

kermzyxer ()
Ответ на: комментарий от kermzyxer

давеча монтировал devfs вручную перед mdev -s и ждал, пока /dev окончательно популейтнится (ждал флеш накопителя)

#!/bin/busybox sh

BB="/bin/busybox"

${BB} mount -t proc proc /proc
${BB} mount -t sysfs sys /sys
${BB} mount -t tmpfs dev /dev

${BB} echo "/bin/mdev" > /proc/sys/kernel/hotplug
${BB} mdev -s

${BB} echo " * Waiting 3 secongs for /dev..."
${BB} sleep 3

UUID=`${BB} cat /proc/cmdline | ${BB} awk '{print $1}' | ${BB} cut -d= -f3`
${BB} mount -o ro `${BB} findfs UUID=${UUID}` /newroot

${BB} mount --bind /proc /newroot/proc
${BB} mount --bind /sys /newroot/sys
${BB} mount --bind /dev /newroot/dev

exec ${BB} switch_root /newroot /init
x0r ★★★★★ ()
Ответ на: комментарий от kostik87

нет, то же самое.
я вот думаю: может такой трабл быть из-за того, что я
1. не обновился после распаковки тарбола
2. удалил какую-то важную опцию в конфиге ядра

kermzyxer ()

Вот рабочий init с поддержкой plymouth:

#!/bin/sh

export PATH=/bin:/sbin:/usr/bin

mount proc /proc -t proc
mount sysfs /sys -t sysfs
mount devtmpfs /dev -t devtmpfs
[ -d /dev/pts ] || mkdir /dev/pts
mount devpts /dev/pts -t devpts
mount tmpfs /run -t tmpfs

INIT=/sbin/init
ROOT=
PLYMOUTH=1

for arg in `cat /proc/cmdline`; do
	case "$arg" in
		init=*)
			INIT="${arg#init=}"
			;;
		root=*)
			ROOT="${arg#root=}"
			;;
		plymouth.enable=0)
			PLYMOUTH=
			;;
	esac
done

if [ -n "$PLYMOUTH" ]; then
	chvt 7
	plymouthd --mode=boot --pid-file=/run/plymouth/pid --tty=tty7
	plymouth --show-splash
fi

[ -z "$ROOT" ] && exit 1
mount "$ROOT" /newroot
plymouth --newroot=/newroot
mount --move /proc /newroot/proc
mount --move /sys /newroot/sys
mount --move /dev /newroot/dev
mount --move /run /newroot/run
exec switch_root /newroot "$INIT" "$@"
Киллер-фича в том, что /proc и /sys не размонтируются, а переносятся.

Где можно посмотреть, какие устройства создает devtmpfs?

'ls -l /dev', очевидно.

gentoo_root ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.