Вы здесь

[РЕШЕНО]FlashStick и Gentoo[ЧАСТИЧНО]

Доброго времени суток. Решил установить себе на флешку gentoo. Разбил диск на два раздела :
/dev/sdb1 1400MB- vfat
/dev/sdb2 600MB - ext2.
Через catalyst сделал свою сборку Livecd, настроил и закинул на флешку. Ядро собрал через genkernel. Вот grub.conf:

title Load Gentoo On the Flash ( GentooOF =) ) 
root (hd0,1)
kernel /boot/kernel-genkernel-x86-2.6.27-gentoo-r10 vga=0x317 real_root=/dev/sdb2 ramdisk_size=8192 root=/dev/ram0 ro splash=verbose console=tty1 quiet
initrd /boot/initramfs-genkernel-x86-2.6.27-gentoo-r10

Вкомпилил нужное в ядро(рамдиск, фс). Вот fstab, хотя он здесь не при чём:
/dev/sdb2 / ext2 noatime 0 1
/dev/cdrom /mnt/cdrom auto noauto,ro 0 0
shm /dev/shm tmpfs nodev,nosuid,noexec 0 0

Теперь в чём проблема. Проблема самая насущная :
Device /dev/sdb2 is not a valid root device. - Раз !(5)!
Could not find any root device in . - Следом !(5)!

Неспав пару ночей и перелопатив все возможные форумы нашёл след.:
http://eee-pc.ru/forum/viewtopic.php?id=617&p=2. На этом форуме один человек(как бы мне хотелось чем-то заменить это слово) нашёл решение. initramfs монтирует rootfs до того как ядро его определит. Он всё сделал, исправил, настроил, оно всё заработало, но решение не выложил.

Рылся в init скрипте. Нашёл то что нужно. Возможно смог бы что-то исправить да только после даже тривиальных изменений в init-скрипте при передаче его ядру через init=/linuxrc(положил его в корень /dev/sdb2) ядро никак не реагирует. Очень прошу помощи. Заранее спасибо.
Ах да : если после !(5)! ввести /dev/sdb2 всё нормально грузится.

Что нет никаких идей ? Никто никогда не передавал ядру свой init-скрипт ?

Вообщем как всегда... По этому документу http://en.gentoo-wiki.com/wiki/Initramfs научился создавать свой образ ramfs. Взял за основу проблемный образ. Всё что нужно это правильно подправить init-скрипт(пробовал изменять - работает). Вот этот скрипт: http://pastebin.com/m1a0a37d8
Наивно конечно с моей стороны, но всё же эта секция # Determine root device
отвечает за root device. Где-то там проблема...

#Спустя какое-то время(минут15)

В том скрипте sleep 15 добавил я. Это решает проблему. Конечно надо его уменьшить до необходимого,нужного и желаемого времени. Но всё же хотелось бы решить проблему иным путём. Хотя тот факт что ядро ещё не загрузило необходимый код иным путём может решить и нельзя.
PS::.. Напишите хоть кто-то что-нибудь, а то я сомневаюсь что кто-то читает.

Выкладываю здесь содержимое init-скрипта(остальные инструкции можно получить прочитав топик):

#!/bin/sh

. /etc/initrd.defaults
. /etc/initrd.scripts

splash() {
	return 0
}

[ -e /etc/initrd.splash ] && . /etc/initrd.splash

# Clean input/output
exec >${CONSOLE} <${CONSOLE} 2>&1

if [ "$$" != '1' ]
then
	echo '/linuxrc has to be run as the init process as the one'
	echo 'with a PID of 1. Try adding init="/linuxrc" to the'
	echo 'kernel command line or running "exec /linuxrc".'
	exit 1
fi

mount -t proc proc /proc >/dev/null 2>&1
mount -o remount,rw / >/dev/null 2>&1

# Set up symlinks
/bin/busybox --install -s

if [ "$0" = '/init' ]
then
	[ -e /linuxrc ] && rm /linuxrc
	 
	if [ -e /bin/lvm ]
	then
		ln -s /bin/lvm /bin/vgscan
		ln -s /bin/lvm /bin/vgchange
	fi
fi

quiet_kmsg

CMDLINE=`cat /proc/cmdline`
# Scan CMDLINE for any specified real_root= or cdroot arguments
REAL_ROOT=''
FAKE_ROOT=''
REAL_ROOTFLAGS=''
CRYPT_SILENT=0
for x in ${CMDLINE}
do
	case "${x}" in
		real_root\=*)
			REAL_ROOT=`parse_opt "${x}"`
		;;
		root\=*)
			FAKE_ROOT=`parse_opt "${x}"`
		;;
		subdir\=*)
			SUBDIR=`parse_opt "${x}"`
		;;
		real_init\=*)
			REAL_INIT=`parse_opt "${x}"`
		;;
		init_opts\=*)
			INIT_OPTS=`parse_opt "${x}"`
		;;
		# Livecd options
		cdroot)
			CDROOT=1
		;;
		cdroot\=*)
			CDROOT=1
			CDROOT_DEV=`parse_opt "${x}"`
		;;
		cdroot_type\=*)
			CDROOT_TYPE=`parse_opt "${x}"`
		;;
		# Start livecd loop, looptype options
		loop\=*)
			LOOP=`parse_opt "${x}"`
		;;
		looptype\=*)
			LOOPTYPE=`parse_opt "${x}"`
		;;
		# Start Volume manager options 
		dolvm)
			USE_LVM_NORMAL=1
		;;
		dolvm2)
			bad_msg 'Using dolvm2 is deprecated, use dolvm, instead.'
			USE_LVM_NORMAL=1
		;;
		domdadm)
			USE_MDADM=1
		;;
		dodmraid)
			USE_DMRAID_NORMAL=1
		;;
		dodmraid\=*)
			DMRAID_OPTS=`parse_opt "${x}"`
			USE_DMRAID_NORMAL=1
		;;
		doevms)
			USE_EVMS_NORMAL=1
		;;
		doevms2)
			bad_msg 'Using doevms2 is deprecated, use doevms, instead.'
			USE_EVMS_NORMAL=1
		;;
		# Debug Options
		debug)
			DEBUG='yes'
		;;
		# Scan delay options 
		scandelay\=*)
			SDELAY=`parse_opt "${x}"`
		;;
		scandelay)
			SDELAY=10
		;;
		# Module no-loads
		doload\=*)
			MDOLIST=`parse_opt "${x}"`
			MDOLIST="`echo ${MDOLIST} | sed -e 's/,/ /g'`"
		;;
		nodetect)
			NODETECT=1
		;;
		noload\=*)
			MLIST=`parse_opt "${x}"`
			MLIST="`echo ${MLIST} | sed -e 's/,/ /g'`"
			export MLIST
		;;
		# Redirect output to a specific tty
		CONSOLE\=*\|console\=*)
			CONSOLE=`parse_opt "${x}"`
			exec >${CONSOLE} <${CONSOLE} 2>&1
		;;
		# /dev/md
		lvmraid\=*)
			RAID_DEVICES="`parse_opt ${x}`"
			RAID_DEVICES="`echo ${RAID_DEVICES} | sed -e 's/,/ /g'`"
		;;
		part\=*)
			MDPART=`parse_opt "${x}"`
		;;
		# NFS
		ip\=*)
			IP=`parse_opt "${x}"`
		;;
		nfsroot\=*)
			NFSROOT=`parse_opt "${x}"`
		;;
		crypt_root\=*)
			CRYPT_ROOT=`parse_opt "${x}"`
		;;
		crypt_swap\=*)
			CRYPT_SWAP=`parse_opt "${x}"`
		;;
		root_key\=*)
			CRYPT_ROOT_KEY=`parse_opt "${x}"`
		;;
		root_keydev\=*)
			CRYPT_ROOT_KEYDEV=`parse_opt "${x}"`
		;;
		swap_key\=*)
			CRYPT_SWAP_KEY=`parse_opt "${x}"`
		;;
		swap_keydev\=*)
			CRYPT_SWAP_KEYDEV=`parse_opt "${x}"`
		;;
		real_resume\=*)
			REAL_RESUME=`parse_opt "${x}"`
		;;
		noresume)
			NORESUME=1
		;;
		crypt_silent)
			CRYPT_SILENT=1
		;;
		real_rootflags\=*)
			REAL_ROOTFLAGS=`parse_opt "${x}"`
		;;
		keymap\=*)
			keymap=`parse_opt "${x}"`
		;;
	esac
done

if [ -z "${REAL_ROOT}" -a \( "${CDROOT}" -eq 0 \)  -a \( "${FAKE_ROOT}" != "/dev/ram0" \) ]
then
	REAL_ROOT="${FAKE_ROOT}"	
fi

splash 'init'

detect_sbp2_devices
cmdline_hwopts

# Mount sysfs
mount_sysfs

# Setup hotplugging for firmware loading
setup_hotplug

# Load modules listed in MY_HWOPTS if /lib/modules exists for the running kernel
if [ -z "${DO_modules}" ]
then
	good_msg 'Skipping module load; disabled via commandline'
elif [ -d "/lib/modules/${KV}" ]
then
	good_msg 'Loading modules'
	# Load appropriate kernel modules
	if [ "${NODETECT}" != '1' ]
	then
		for modules in ${MY_HWOPTS}
		do
			modules_scan ${modules}
		done
	fi
	# Always eval doload=...
	modules_load ${MDOLIST}
else
	good_msg 'Skipping module load; no modules in the initrd!'
fi

# Delay if needed for USB hardware
sdelay

# Start device manager
start_dev_mgr

# Setup md device nodes if they dont exist
setup_md_device

# Scan volumes
startVolumes

setup_keymap

# Initialize LUKS root device except for livecd's
if [ "${CDROOT}" != 1 ]
then
	startLUKS
	if [ "${NORESUME}" != '1' ] && [ -n "${REAL_RESUME}" ]
	then
		swsusp_resume
#		suspend_resume
		tuxonice_resume
	fi
fi

mkdir -p "${NEW_ROOT}"
CHROOT="${NEW_ROOT}"

# Run debug shell if requested
rundebugshell

if [ "${CDROOT}" = '1' ]
then
	good_msg "Making tmpfs for ${NEW_ROOT}"
	mount -t tmpfs tmpfs "${NEW_ROOT}"
	
	for i in dev mnt mnt/cdrom mnt/livecd mnt/key tmp tmp/.initrd mnt/gentoo sys
	do
		mkdir -p "${NEW_ROOT}/${i}"
		chmod 755 "${NEW_ROOT}/${i}"
	done
	[ ! -e "${NEW_ROOT}/dev/null" ] && mknod "${NEW_ROOT}"/dev/null c 1 3
	[ ! -e "${NEW_ROOT}/dev/console" ] && mknod "${NEW_ROOT}"/dev/console c 5 1

	# For SGI LiveCDs ...
	if [ "${LOOPTYPE}" = "sgimips" ]
	then
		[ ! -e "${NEW_ROOT}/dev/sr0" ] && mknod "${NEW_ROOT}/dev/sr0" b 11 0
		[ ! -e "${NEW_ROOT}/dev/loop0" ] && mknod "${NEW_ROOT}/dev/loop0" b 7 0
	fi

	# Required for splash to work.  Not an issue with the initrd as this
	# device isn't created there and is not needed.
	if [ -e /dev/tty1 ]
	then
		[ ! -e "${NEW_ROOT}/dev/tty1" ] && mknod "${NEW_ROOT}/dev/tty1" c 4 1
	fi

	if [ "${REAL_ROOT}" != "/dev/nfs" ] && [ "${LOOPTYPE}" != "sgimips" ]
	then
		bootstrapCD
	fi

	if [ "${REAL_ROOT}" = '' ]
	then
		echo -n -e "${WARN}>>${NORMAL}${BOLD} No bootable medium found. Waiting for new devices"
		
		COUNTER=0
		while [ ${COUNTER} -lt 3 ]; do
			sleep 3
			echo -n '.'
			let COUNTER=${COUNTER}+1
		done

		sleep 1
		echo -e "${NORMAL}"
		bootstrapCD
	fi

	if [ "${REAL_ROOT}" = '' ]
	then
		# Undo stuff
		umount  "${NEW_ROOT}/dev" 2>/dev/null
		umount  "${NEW_ROOT}/sys" 2>/dev/null
		umount /sys 2>/dev/null

		umount  "${NEW_ROOT}"
		rm -rf  "${NEW_ROOT}/*"

		bad_msg 'Could not find CD to boot, something else needed!'
		CDROOT=0
	fi
fi

# Determine root device
good_msg 'Determining root device...Sleeping 15 sec first =)'
while true
do
	sleep 15
	while [ "${got_good_root}" != '1' ]
	do
		case "${REAL_ROOT}" in
			LABEL\=*|UUID\=*)
			
				ROOT_DEV=""
				retval=1
				
				if [ "${retval}" -ne '0' ]; then
					ROOT_DEV=`findfs "${REAL_ROOT}" 2>/dev/null`
					retval=$?
				fi
				
				if [ "$retval" -ne '0' ]; then
					ROOT_DEV=`busybox findfs "${REAL_ROOT}" 2>/dev/null`
					retval=$?
				fi
				
				if [ "${retval}" -ne '0' ]; then
					ROOT_DEV=`blkid -t "${REAL_ROOT}" | cut -d ":" -f 1 2>/dev/null`
					retval=$?
				fi
				
				if [ "${retval}" -eq '0' ] && [ -n "${ROOT_DEV}" ]; then
					good_msg "Detected real_root=${ROOT_DEV}"
					REAL_ROOT="${ROOT_DEV}"
				else
					whereis "REAL_ROOT" "root block device"
					got_good_root=0
					continue
				fi
				;;
		esac
				
		if [ "${REAL_ROOT}" = '' ]
		then
			# No REAL_ROOT determined/specified. Prompt user for root block device.
			whereis "REAL_ROOT" "root block device"
			got_good_root=0

		# Check for a block device or /dev/nfs
		elif [ -b "${REAL_ROOT}" ] || [ "${REAL_ROOT}" = "/dev/nfs" ]
		then
			got_good_root=1

		else
			bad_msg "Block device ${REAL_ROOT} is not a valid root device..."
			REAL_ROOT=""
			got_good_root=0
		fi
	done


	if [ "${CDROOT}" = 1 -a "${got_good_root}" = '1' -a "${REAL_ROOT}" != "/dev/nfs" ]
	then
		# CD already mounted; no further checks necessary
		break
	elif [ "${LOOPTYPE}" = "sgimips" ]
	then
		# sgimips mounts the livecd root partition directly
		# there is no isofs filesystem to worry about
		break
	else
		good_msg "Mounting root..."

		# Try to mount the device as ${NEW_ROOT}
		if [ "${REAL_ROOT}" = '/dev/nfs' ]; then
			findnfsmount
		else
			# mount ro so fsck doesn't barf later
			if [ "${REAL_ROOTFLAGS}" = '' ]; then
				mount -o ro ${REAL_ROOT} ${NEW_ROOT}
			else
				good_msg "Using mount -o ro,${REAL_ROOTFLAGS}"
				mount -o ro,${REAL_ROOTFLAGS} ${REAL_ROOT} ${NEW_ROOT}
			fi
		fi
		
		# If mount is successful break out of the loop 
		# else not a good root and start over.
		if [ "$?" = '0' ]
		then
			if [ -d ${NEW_ROOT}/dev -a -x ${NEW_ROOT}/sbin/init ]
			then
				break
			else
				bad_msg "The filesystem mounted at ${REAL_ROOT} does not appear to be a valid /, try again"
				got_good_root=0
				REAL_ROOT=''
			fi
		else
			bad_msg "Could not mount specified ROOT, try again"
			got_good_root=0
			REAL_ROOT=''
		fi
	fi
done
# End determine root device

#verbose_kmsg

# If CD root is set determine the looptype to boot
if [ "${CDROOT}" = '1' ]
then
	good_msg 'Determining looptype ...'
	cd "${NEW_ROOT}"

	# Find loop and looptype
	[ -z "${LOOP}" ] && find_loop
	[ -z "${LOOPTYPE}" ] && find_looptype

	cache_cd_contents

	# If encrypted, find key and mount, otherwise mount as usual
	if [ -n "${CRYPT_ROOT}" ] 
	then
		CRYPT_ROOT_KEY="$(head -n 1 ${NEW_ROOT}/mnt/cdrom/livecd)"
		CRYPT_ROOT='/dev/loop0'
		good_msg 'You booted an encrypted livecd' "${CRYPT_SILENT}"

		losetup /dev/loop0 "${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP}"
		test_success 'Preparing loop filesystem'

		startLUKS

		case ${LOOPTYPE} in
			normal)
				MOUNTTYPE="ext2"
				;;
			*)
				MOUNTTYPE="${LOOPTYPE}"
				;;
		esac
		mount -t "${MOUNTTYPE}" -o ro /dev/mapper/root "${NEW_ROOT}/mnt/livecd"
		test_success 'Mount filesystem'
		FS_LOCATION='mnt/livecd'
	# Setup the loopback mounts, if unencrypted
	else
		if [ "${LOOPTYPE}" = 'normal' ]
		then
			good_msg 'Mounting loop filesystem'
			mount -t ext2 -o loop,ro "${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP}" "${NEW_ROOT}/mnt/livecd"
			test_success 'Mount filesystem'
			FS_LOCATION='mnt/livecd'
		elif [ "${LOOPTYPE}" = 'squashfs' ]
		then
			good_msg 'Mounting squashfs filesystem'
			mount -t squashfs -o loop,ro "${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP}" "${NEW_ROOT}/mnt/livecd"
			test_success 'Mount filesystem'
			FS_LOCATION='mnt/livecd'
		elif [ "${LOOPTYPE}" = 'gcloop' ]
		then
			good_msg 'Mounting gcloop filesystem'
			echo ' ' | losetup -E 19 -e ucl-0 -p0 "${NEW_ROOT}/dev/loop0" "${NEW_ROOT}/mnt/cdrom/${LOOPEXT}${LOOP}"
			test_success 'losetup the loop device'

			mount -t ext2 -o ro "${NEW_ROOT}/dev/loop0" "${NEW_ROOT}/mnt/livecd"
			test_success 'Mount the losetup loop device'
			FS_LOCATION='mnt/livecd'
		elif [ "${LOOPTYPE}" = 'zisofs' ]
		then
			FS_LOCATION="mnt/cdrom/${LOOPEXT}${LOOP}"
		elif [ "${LOOPTYPE}" = 'noloop' ]
		then
			FS_LOCATION='mnt/cdrom'
		elif [ "${LOOPTYPE}" = 'sgimips' ]
		then
			# getdvhoff finds the starting offset (in bytes) of the squashfs
			# partition on the cdrom and returns this offset for losetup
			#
			# All currently supported SGI Systems use SCSI CD-ROMs, so
			# so we know that the CD-ROM is usually going to be /dev/sr0.
			#
			# We use the value given to losetup to set /dev/loop0 to point
			# to the liveCD root partition, and then mount /dev/loop0 as
			# the LiveCD rootfs
			good_msg 'Locating the SGI LiveCD Root Partition'
			echo ' ' | \
				losetup -o $(getdvhoff "${NEW_ROOT}${REAL_ROOT}" 0) \
					"${NEW_ROOT}${CDROOT_DEV}" \
					"${NEW_ROOT}${REAL_ROOT}"
			test_success 'losetup /dev/sr0 /dev/loop0'
	
			good_msg 'Mounting the Root Partition'
			mount -t squashfs -o ro "${NEW_ROOT}${CDROOT_DEV}" "${NEW_ROOT}/mnt/livecd"
			test_success 'mount /dev/loop0 /'
			FS_LOCATION='mnt/livecd'
		fi
	fi

	# Unpacking additional packages from NFS mount
	# This is useful for adding kernel modules to /lib
	# We do this now, so that additional packages can add whereever they want.
	if [ "${REAL_ROOT}" = '/dev/nfs' ]
	then
		if [ -e "${CHROOT}/mnt/cdrom/add" ]
		then
				for targz in `ls ${CHROOT}/mnt/cdrom/add/*.tar.gz`
				do	
					tarname=`basename ${targz}`
					good_msg "Adding additional package ${tarname}"
					(cd ${CHROOT} ; /bin/tar -xzf ${targz})
				done
		fi
	fi

	
	good_msg "Copying read-write image contents to tmpfs"
	# Copy over stuff that should be writable
	(cd "${NEW_ROOT}/${FS_LOCATION}"; cp -a ${ROOT_TREES} "${NEW_ROOT}")

	# Now we do the links.
	for x in ${ROOT_LINKS}
	do
		if [ -L "${NEW_ROOT}/${FS_LOCATION}/${x}" ]
		then
			ln -s "`readlink ${NEW_ROOT}/${FS_LOCATION}/${x}`" "${x}" 2>/dev/null
		else
			# List all subdirectories of x
			find "${NEW_ROOT}/${FS_LOCATION}/${x}" -type d 2>/dev/null | while read directory
			do
				# Strip the prefix of the FS_LOCATION
				directory="${directory#${NEW_ROOT}/${FS_LOCATION}/}"

				# Skip this directory if we already linked a parent directory
				if [ "${curent_parrent}" != '' ]; then
					var=`echo "${directory}" | grep "^${curent_parrent}"`
					if [ "${var}" != '' ]; then
						continue
					fi
				fi
				# Test if the directory exists already
				if [ -e "/${NEW_ROOT}/${directory}" ]
				then
					# It does exist, link all the individual files
					for file in `ls /${NEW_ROOT}/${FS_LOCATION}/${directory}`
					do
					if [ ! -d "/${NEW_ROOT}/${FS_LOCATION}/${directory}/${file}" ] && [ ! -e "${NEW_ROOT}/${directory}/${file}" ]; then
							ln -s "/${FS_LOCATION}/${directory}/${file}" "${directory}/${file}" 2> /dev/null
						fi
					done
				else
					# It does not exist, make a link to the livecd
					ln -s "/${FS_LOCATION}/${directory}" "${directory}" 2>/dev/null
					current_parent="${directory}"
				fi
			done
		fi
	done

	if [ "${DO_slowusb}" ] || [ "${FORCE_slowusb}" ]
	then
		sleep 10
	fi
	mkdir initrd proc tmp sys 2>/dev/null
	chmod 1777 tmp

	#UML=`cat /proc/cpuinfo|grep UML|sed -e 's|model name.*: ||'`
	#if [ "${UML}" = 'UML' ]
	#then
	#	# UML Fixes
	#	good_msg 'Updating for uml system'
	#fi

	# Let Init scripts know that we booted from CD
	export CDBOOT
	CDBOOT=1
	check_slowusb
	if [ "${DO_slowusb}" ] || [ "${FORCE_slowusb}" ]
	then
		sleep 10
	fi
fi

# Execute script on the cdrom just before boot to update things if necessary
cdupdate

if [ "${SUBDIR}" != '' -a -e "${CHROOT}/${SUBDIR}" ]
then
	good_msg "Entering ${SUBDIR} to boot"
	CHROOT="${CHROOT}/${SUBDIR}"
fi

verbose_kmsg

# There used to be some initrd/2.4 code here, but it's gone now :
echo -ne "${GOOD}>>${NORMAL}${BOLD} Booting (initramfs)${NORMAL}"
if [ ! -e "${CHROOT}/dev/console" ] || [ ! -e "${CHROOT}/dev/null" ]
then
	echo -ne "${BAD}>>${NORMAL}${BOLD} ERROR: your /dev is missing files required to boot (console and null)${NORMAL}"
elif [ -e /etc/initrd.splash -a ! -e "${CHROOT}/dev/tty1" ]
then
	echo -ne "${BAD}>>${NORMAL}${BOLD} ERROR: your /dev is missing tty1, which is required for splash${NORMAL}"
fi

cd "${CHROOT}"
mkdir "${CHROOT}/proc" "${CHROOT}/sys" 2>/dev/null
echo -ne "${BOLD}.${NORMAL}"
umount /sys || echo '*: Failed to unmount the initrd /sys!'
umount /proc || echo '*: Failed to unmount the initrd /proc!'
echo -e "${BOLD}.${NORMAL}"

exec switch_root -c "/dev/console" "${CHROOT}" "${REAL_INIT:-/sbin/init}" "${INIT_OPTS}"

# If we get here, something bad has happened
splash 'verbose'

echo 'A fatal error has probably occured since /sbin/init did not'
echo 'boot correctly. Trying to open a shell...'
echo
exec /bin/bash
exec /bin/sh
exec /bin/ash
exec sh

НИКТО НИКОГДА НЕ ОСТАВЛЯЙТЕ РЕШЕННЫЕ ПРОБЛЕМЫ БЕЗ ПРИМЕРОВ ИЛИ ОТВЕТОВ(как сделал один товарищ). И даже намерения типа : "Предлагаю создать статью на вики по этой проблеме всем дружно" или "Могу прикрепить если надо" не устоят перед зыбким песком времени =). Когда кому-то будет надо - будет просто поздно уже и т.д.

Я читаю, но умного посоветовать не могу пока (-:Е

Разве что вот монтировать устройство по uuid или метке тома. Поможет ли проблеме, не знаю (хотя возможно), но лучше будет точно. Мало ли как устройства определятся

—

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

Дело то не в определении устройств. Самый первый пост: "если потом снова ввести тоже имя /dev/sdb2 всё работает..." - в этом духе.
Про uuid и label другая история. Хочу так сделать, только вот образ у меня маленький, busybox там, mdev вместо udev и диски не определяются по этим параметрам.

а если при загрузке флешка определяется, как /dev/sda2, а не /dev/sdb2?.

То она не загрузится, в целом ошибка такая же, но по сути определённо другая. В 1-ом случае ядро не загрузило нужный код, во втором не верно указан раздел. Чтобы использовать UUID, LABEL и т.д., я хочу попробовать mkinitcpio из Arch'a.

Кто-нибудь его в Gentoo встречал ?

Вообще, думется, вполне можно написать ебилд по Арховому PKGBUILD'у.

—

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

Копания в пакетах Acrh'a, установка "eдва живого" mkinitcpio ни к чему не привели. Эх, если б как-нибудь udev засунуть в initramfs - проблема была б решена.

Вообще вроде можно. Судя по тому, что гугль вываливает в ответ на "gentoo udev initramfs"
Вот тут какая-то подобная штука вроде делается: http://ru.gentoo-wiki.com/wiki/HOWTO_Multipath_boot_support

По-моему, udev в initrd на gentoo-дисках водится...

Сейчас не могу разрыть свои мысли, бежать пора, так что вывалил "в сыром виде" (-:Е

—

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

Спасибо, находил такое. С первого взгляда это штука немного для другого. Но теперь уж разбирусь с ней полностью, после вашего совета.

Да, конечно, для другого. Но мне кажется, оттуда можно почерпнуть косвенной информации.

И поразбираться, как делается initrd для MinimalCD, мне кажется, стоит.

—

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

Согласен. Так же разберу по кусочкам mkinitcpio, там поддержка udev заявлена как одна из достоинств над initramfs. Делать initrd и initramfs не сложно. Есть соответсвующие статьи - одна на opennet.ru, вторая на en.gentoo-wiki.com. Я уже засовывал udev в initramfs, но по-быстрому в надежде на удачу. Не знаю даже как его инициализировать(вдруг кто-то подскажет как) и зависит ли он от каких-либо либ.

Оказалось гораздо проще. Хоть я и разобрался почти с mkinitcpio(там всё на bash'e и к тому же по модулям разбито: udev..base..etc).
Чтобы включить поддержку UUID, LABEL у genkernel, точнее у initramfs достаточно добавить опцию --disklabe genkernel'y(это включит в initramfs файл blkid, что и поможет определить LABEL, UUID) ТЧК

И теперь монтируется правильно? Проблема, описанная в заголовке темы, решена? Я немного запутался (-:Е

—

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

Да, теперь монтируется по real_root=LABEL={LABEL}.
Но вот проблема с init скриптом, которому нужен перед монтированием `sleep 3` решена частично, ибо думаю что должен быть более разумный способ.

А не знаете ли, как можно включить файл blkid в самопальный initramfs?
Я не пользуюсь genkernel, а собираю ядра "вручную", в .config не
нашёл такого файла, где сие сокровище лежит? Хотелось бы в grub'е
прописать root по UUID'у. С самосборным ведром такого сделать мне
не удалось.

Вы же используете initramfs или initrd ? Без них не выйдет. И нужен ещё скрипт init для initramfs или ... из genkernel'a(он его генерирует). Можно просто запустить genkernel --no-clean --disklabel initrd. Получить образ с blkid. Добавить поддержку ramfs в ядро и готово.

И разве такого монтированию по дефолту нет(не работает) ?

Использую initramfs, который я создал сам, благодаря Вашей ссылке:
http://en.gentoo-wiki.com/wiki/Initramfs
Поддержка ramfs в ядре у меня всегда.
Вот только blkid как получить в моём initramfs - не знаю.
Подозреваю, что нужно удава запускать в образе, хотя
mini_udev в init прописан. Пока мне больше ничего сказать.
Буду пробовать методом "ненаучного тыка" ;)
Добавлено:
Вопрос снят, initramfs с mini-udev определяет диски по UUID,
система загрузилась. Виной всему была просто опечатка в init-скрипте
образа. Теперь передо мной "мрачной тенью" всаёт вопрос:
как переделать скрипт splash_geninitramfs, чтобы он создавал
вменяемые загрузочные образа, или добавить сплаш-картинку в
своё творение, для "кульной" загрузки :D

Покапайтесь в содержимом splash_ge*. Возможно надо просто скомпоновать его с образом initramfs(так они оба образы ramfs). Вообще всё это делается командой genkernel --splash=THEME --splash-res=THEME_RES --disk-label --no-clean initrd и добавить в образ темы другие, если нужно. Поддержка будет не только LABEL, но и UUID. Ядро компилиться не будет, genkernel пакет маленький.

Всё получилось, спасибо Вам за статью и помощь.
Добавил картинку с помощью splash_geninitramfs в свой загрузочный образ.
Загрузка теперь "кулль", root грузится по UUID, осталось скрипт наваять,
чтобы "вдрючную" это не делать каждый раз, ибо - быстро надоест и забудется ;)
Чтож, буду пробовать, хотя в bash-скриптинге я - полный НОЛЬ... почти :)
Если получится что - выложу.

А что с Arch?
http://muhas.ru/?p=2 - вот здесь все доходчиво. Я уже сделал. Правда при загрузке на что-то ругается, но быстро идет дальше.

—

Моя мечта:
#emerge комьютер с генту

>>А что с Arch?
Классный вопрос. Действительно, а что с ним ?
Одна проблема в том что я не использую arch. Находил и перечитал гораздо больше материала по теме. Ставил с горем пополам arch'евский mkinitcpio - запорол x86 систему в chroot'e.
Не всё так просто как хотелось бы. И мне не нужно чтобы на что-то ругалось.

Ну как тебе сказать, просто я не знаю что такое "attamping" - в общем то это даже не "ругается", а что-то пытается сказать, но я такого слова просто не знаю. А может и ругается.

—

Моя мечта:
#emerge комьютер с генту

Простите, вы сейчас в адекватном состоянии души и тела ? По последнему посту сложилось впечатление что ты пишешь не в тот топик.