ufs2 и фат рядом

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
hryamzik
рядовой
Сообщения: 40
Зарегистрирован: 2007-12-05 20:38:48

ufs2 и фат рядом

Непрочитанное сообщение hryamzik » 2008-04-23 3:09:02

Есть у френзи такой волшебный скриптец, который создает 2 раздела, ufs2 под свой образ и фат на все оставшееся место. Я сколько в него не глядел, так и не понял как он работает. Используется dd, стандартные енеджеры партиций очевидно творят какую-то херню.

Код: Выделить всё

#!/bin/sh
#
# Name    : Frenzy USB Flash installer
# Version : 0.2 RC
# Author  : Elisey Savateev (b3k@mail.ru)
#

. l10n.sh
. dialog_common.sh

MODID="install2flash"
VERSION="0.2 RC"

msg_instsrc=`gettext -s "Installation source"`
msg_chsrc=`gettext -s "Choose an installation source"`
msg_nodev=`gettext -s "No flash disk found.\\nTry again?"`
msg_flash=`gettext -s "Flash disk"`
msg_chflash=`gettext -s "Choose flash disk for installation"`
msg_chiso=`gettext -s "Choose an ISO image"`
msg_start=`gettext -s "Installation started at"`
msg_end=`gettext -s "Installation ended at"`
msg_init=`gettext -s "Initializing flash disk"`
msg_initerr=`gettext -s "initializing"`
msg_params=`gettext -s "The following parameters selected"`
msg_srctype=`gettext -s "Source type"`
msg_destr=`gettext -s "All information on flash disk will be destroyed"`
msg_noentry=`gettext -s "doesn't contain entry for"`
msg_part=`gettext -s "Creating partition table"`
msg_parterr=`gettext -s "create partition table"`
msg_label=`gettext -s "Creating label on"`
msg_labelerr=`gettext -s "create label on"`
msg_boot=`gettext -s "Installing boot manager on"`
msg_booterr=`gettext -s "install boot manager on"`
msg_data=`gettext -s "Installing data"`
msg_dataerr=`gettext -s "install data"`

# Variables (command line arguments)
DEV=""		# Flash device
LOG=""		# Full path to the log file
SRC=""		# Installation source (cdrom device, mountpoint or iso)
NONINTER=0	# Non-interactive mode
NOWARN=0	# Do not display warning messages

# Variables that will be set automatically
SRCTYPE=""	# Source type
SECTSIZE=""	# Flash disk sector size
SRCSIZE=""	# Source size
SRCUMNT=0	# Do we need to unmount source when finish?

# Constants
FSTAB="/etc/fstab"			# Full path to fstab file
CDMNT="/Frenzy/boot"		# Frenzy Live CD mountpoint
SRCMNT="/tmp/frenzy.src"	# Source mountpoint
DSTMNT="/tmp/frenzy.dst"	# Flash mountpoint
MDUNIT=10					# md unit number (when SRCTYPE="ISO")
PARTOFFSET=32				# First partition offset in sectors
SRCADD=16348				# Addition to source size in kilobytes

select_dev()
{
	local dev_list=""
	local flash_list=""

	while [ $? -eq 0 ]; do
		dev_list=`ls /dev | grep '^da[0-9]$'`
		if [ -z "$dev_list" ]; then 
			yesno "$msg_error" "$msg_nodev" "6 40"
		else
			break
		fi
	done

	if [ $? -ne 0 ]; then exit 0; fi

	if [ `echo "$dev_list" | wc -l` -eq 1 ]; then
		DEV="/dev/$dev_list"
		return 0
	fi

	for i in $dev_list; do
		flash_list="${flash_list} \"$i\" \"$msg_flash ${i#da}\""
	done

	menu "$msg_flash" "$msg_chflash" "10 40 3" "$flash_list"
	if [ -z "$RESULT" ]; then exit 0; fi

	DEV="/dev/$RESULT"
}

error()
{
	if [ $NONINTER -eq 0 ]; then
		msgbox "$msg_error" "$1" "6 50"
	else
		echo "$MODID: $1" >&2
	fi
}

info()
{
	if [ $NONINTER -eq 0 ]; then
		infobox "$1" "3 50"
	else
		echo "$1"
	fi
}

log_init()
{
	if [ -z "$LOG" ]; then LOG="/tmp/${MODID}.log"; fi

	touch "$LOG" >/dev/null 2>&1
	if [ $? -ne 0 -o -d "$LOG" ]; then 
		error "$msg_create $LOG"
		exit 1
	fi
	
	echo "$msg_start `date`" >"$LOG"
}

flash_init()
{
	echo "$msg_init $DEV..." >>"$LOG"
	info "$msg_init $DEV..."

	SECTSIZE=`diskinfo $DEV | cut -f 2` && \
	dd if=/dev/zero of=$DEV bs=$SECTSIZE count=$PARTOFFSET >>"$LOG" 2>&1 && \
	fdisk -BI "$DEV" >>"$LOG" 2>&1
	if [ $? -ne 0 ]; then
		error "$msg_error $msg_initerr $DEV. $msg_log."
		exit 1
	fi
}

select_source()
{
	menu "$msg_instrc" "$msg_chsrc" "10 40 3" \
	"\"CDROM\" \"Frenzy Live CD\" \
	\"ISO\" \"Frenzy ISO\""

	if [ "$RESULT" = "CDROM" ]; then
		SRC=$CDMNT
	elif [ "$RESULT" = "ISO" ]; then
		fselect "$msg_chiso" "./" "10 50"
		if [ -z "$RESULT" ]; then exit 0; fi

		SRC=$RESULT
	elif [ -z "$RESULT" ]; then
		exit 0
	fi
}

check_source()
{
	if [ -n "`echo $SRC | grep '^/dev/'`" ]; then
		if [ ! -c "$SRC" ]; then
			error "$msg_file $SRC $msg_notfound $msg_or $msg_notdev."
			exit 1
		fi

		SRCTYPE="DEV"
	elif [ -n "`echo $SRC | grep '\.iso$'`" ]; then
		if [ ! -f "$SRC" ]; then
			error "$msg_file $SRC $msg_notfound."
			exit 1
		fi

		SRCTYPE="ISO"
	else
		if [ ! -d "$SRC" ]; then
			error "$msg_file $SRC $msg_notfound $msg_or $msg_notdir."
			exit 1
		fi

		SRCTYPE="MNTPT"
	fi
}

confirm()
{
	yesno "$msg_warn" "$msg_params: \n\
	$msg_instsrc: $SRC\n\
	$msg_srctype: $SRCTYPE\n\
	$msg_flash: $DEV\n\n\
	$msg_destr. $msg_confirm"\
	"13 50"
	if [ $? -ne 0 ]; then exit 0; fi
}

usage()
{
	echo "$msg_usage: $MODID [-nfh] [-s source] [-l log] [disk]"
	exit 1
}

# FIXME: Implement this
help()
{
	usage
}

mount_source()
{
	echo "$msg_mounting $SRC..." >>"$LOG"
	info "$msg_mounting $SRC..."

	if [ "$SRCTYPE" != "ISO" ]; then
		mount "$SRC" >>"$LOG" 2>&1
	else
		mdconfig -a -t vnode -f "$SRC" -u $MDUNIT >>"$LOG" 2>&1 && \
		mount_cd9660 /dev/md$MDUNIT "$SRCMNT" >>"$LOG" 2>&1

		SRC=$SRCMNT
	fi

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_mount $SRC. $msg_log."
		exit 1
	fi

	SRCUMNT=1
}

prepare_source()
{
	local tmp=""

	if [ "$SRCTYPE" = "MNTPT" ]; then
		if [ -n "`mount | grep "$SRC"`" ]; then return; fi
	elif [ "$SRCTYPE" = "ISO" ]; then
		if [ ! -d "$SRCMNT" ]; then
			mkdir -p "$SRCMNT" >/dev/null 2>&1
			if [ $? -ne 0 ]; then
				error "$msg_create $SRCMNT."
				exit 1
			fi
		fi
	else
		if [ -z "`mount | grep "$SRC"`" ]; then
			tmp=`grep "$SRC" "$FSTAB" | tr -s '\t' ' ' | cut -d ' ' -f 2`
			if [ -z "$tmp" ]; then
				error "$FSTAB $msg_noentry $SRC."
				exit 1
			fi
			
			SRC=$tmp
		fi
	fi

	mount_source
}

clean_source()
{
	echo "$msg_umounting $SRC..." >>"$LOG"
	info "$msg_umounting $SRC..."

	if [ "$SRCTYPE" != "ISO" ]; then
		umount "$SRC" >>"$LOG" 2>&1
	else
		umount "$SRC" >>"$LOG" 2>&1 && \
		mdconfig -d -u $MDUNIT >>"$LOG" 2>&1
	fi

	if [ $? -ne 0 ]; then error "$msg_unable $msg_umount $SRC. $msg_log."; fi
}

flash_mkpart()
{
	local srcsize=`du -kd0 "$SRC" | cut -f 1`
	# FIXME: Maybe this can be done in better way (awk is not good)?
	local flashsize=`diskinfo $DEV | cut -f 4`
	local cyls=`diskinfo $DEV | cut -f 5`
	local heads=`diskinfo $DEV | cut -f 6`
	local sectors=`diskinfo $DEV | cut -f 7`

	# FIXME: Better calculation of start offset and size of partitions
   	# to avoid errors when fdisk can't adjust bad values
	srcsize=$(((srcsize + SRCADD) * (1024 / SECTSIZE)))
	local table=\
"g c$cyls h$heads s$sectors\n\
p 1 0 0 0\n\
p 2 0 0 0\n\
p 3 0 0 0\n\
p 4 0 0 0\n\
p 1 11 $PARTOFFSET $((flashsize - srcsize - $PARTOFFSET))\n\
p 2 165 $((flashsize - srcsize)) $srcsize\n\
a 2"

	echo "$msg_part..." >>"$LOG"
	info "$msg_part..."
	
	echo -e "$table" | fdisk -f - "$DEV" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_parterr. $msg_log."
		exit 1
	fi
}

flash_formatpart()
{
	local part1="${DEV}s1"
	local part2="${DEV}s2"
	local tmp=`mktemp -q /tmp/frenzy.XXXXX`

	echo "$msg_label $part2..." >>"$LOG"
	info "$msg_label $part2..."

	dd if=/dev/zero of=$part2 bs=$SECTSIZE count=32 >>"$LOG" 2>&1 && \
	bsdlabel -w -B $part2 >>"$LOG" 2>&1 && \
	bsdlabel $part2 | sed -e '/a:/s/unused/4.2BSD/' >$tmp && \
	bsdlabel -R $part2 $tmp >>"$LOG" 2>&1 && \
	rm -f $tmp

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_labelerr $part2. $msg_log."
		exit 1
	fi

	echo "$msg_formatting ${part2}a..." >>"$LOG"
	info "$msg_formatting ${part2}a..."

	newfs -n -m 0 -b $((SECTSIZE * 8)) -f $SECTSIZE -i $((SECTSIZE * 16)) "${part2}a" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_format ${part2}a. $msg_log."
		exit 1
	fi

	echo "$msg_formatting $part1..." >>"$LOG"
	info "$msg_formatting $part1..."

	# FIXME: Additional tuning for FAT depending on flash disk geometry
	newfs_msdos -F 32 "$part1" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_format $part1. $msg_log."
		exit 1
	fi
}

flash_boot()
{
	echo "$msg_boot $DEV..." >>"$LOG"
	info "$msg_boot $DEV..."

	boot0cfg -B -o noupdate -s 2 "$DEV" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_booterr $DEV. $msg_log."
		exit 1
	fi
}

install_data()
{
	local part="${DEV}s2a"

	if [ ! -d "$DSTMNT" ]; then
		mkdir -p "$DSTMNT" >/dev/null 2>&1
		if [ $? -ne 0 ]; then
			error "$msg_create $DSTMNT."
			exit 1
		fi
	fi

	echo "$msg_mounting $part..." >>"$LOG"
	info "$msg_mounting $part..."

	mount "$part" "$DSTMNT" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_mount $part. $msg_log."
		exit 1
	fi

	# FIXME: Display intallation progress with tar + bar + cdialog --gauge
	echo "$msg_data..." >>"$LOG"
	info "$msg_data..."

	cp -R "$SRCMNT"/* "$DSTMNT" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then
		error "$msg_unable $msg_dataerr. $msg_log."
		exit 1
	fi

	echo "$msg_umounting $part..." >>"$LOG"
	info "$msg_umounting $part..."

	umount "$part" >>"$LOG" 2>&1

	if [ $? -ne 0 ]; then 
		error "$msg_unable $msg_umount $part. $msg_log."
		exit 1
   	fi
}

while getopts nfhs:l: OPT >/dev/null 2>&1; do
	case $OPT in
		n) NONINTER=1 ;;
		f) NOWARN=1 ;;
		h) help ;;
		s) SRC=$OPTARG ;;
		l) LOG=$OPTARG ;;
		\?) echo "$MODID: $msg_badargs" >&2; usage ;;
	esac
done

shift $((OPTIND - 1))
if [ $# -eq 1 -a "$OPT" != "no" ]; then DEV=$1; fi
	
if [ $NONINTER -eq 0 ]; then
	dialog_init
	if [ $? -ne 0 ]; then
		echo "$MODID: cdialog $msg_notfound" >&2
		exit 1
	fi
fi

if [ -z "$SRC" ]; then
	if [ $NONINTER -eq 0 ]; then
		select_source
	else
		SRC=$CDMNT
	fi
fi

check_source

if [ -z "$DEV" ]; then
	if [ $NONINTER -eq 0 ]; then
		select_dev
	else
		DEV="/dev/da0"
	fi
fi

if [ $NONINTER -eq 0 -a $NOWARN -eq 0 ]; then confirm; fi

log_init

if [ `id -u` -ne 0 -a $NONINTER -eq 0 ]; then
	echo "$msg_su"
	su root -c "$0 -fs "$SRC" -l "$LOG" "$DEV""
	exit $?
fi

prepare_source

flash_init
flash_mkpart
flash_formatpart
flash_boot

install_data

if [ $SRCUMNT -eq 1 ]; then clean_source; fi

echo "$msg_end `date`" >>"$LOG"
exit 0
А мне надо бы свои размеры, да по-больше партиций, да с лейблами. В общем понять, что происходит, и импровизировать. (Нужен ufs2 раздел, ext3, фат и еще в логических 2: линуксовский своп и еще один фат).
Пробовал и тут все клепать, и в партишн меджике, и в диск утилити, и в линуховом гномовском партишеноре, криво получается, ох не зря тут в скрипте дд используется...

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: ufs2 и фат рядом

Непрочитанное сообщение manefesto » 2008-04-23 6:07:20

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

Суть такова, что берется размер диска, и разбивается fdisk'ом на необходимое количество частей.

Код: Выделить всё

man fdisk
man bsdlabel
тебе хватит с лихвой....
Ну и на всякий случай по написанию скриптов http://www.lissyara.su/?id=1075

PS: И вообще....чем тебе sysinstall не нравиться ?
я такой яростный шо аж пиздеЦ
Изображение

hryamzik
рядовой
Сообщения: 40
Зарегистрирован: 2007-12-05 20:38:48

Re: ufs2 и фат рядом

Непрочитанное сообщение hryamzik » 2008-04-23 18:05:42

Сисинталл не может сделать партицию на "а" слайсе, бсдлейбел и ньюфс это да, но. Все это тоже делает стандартные партиции, и фат в итоге получается корявым, например может не видеться в виндах или на маке. Вот скриптец все очень толково делает, но я в нем пока не разобрался.

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: ufs2 и фат рядом

Непрочитанное сообщение manefesto » 2008-04-23 18:15:21

Как говорит наш комрад Raven2000:
Если хочешь разобраться... Так иди и разбирайся!
я такой яростный шо аж пиздеЦ
Изображение

hryamzik
рядовой
Сообщения: 40
Зарегистрирован: 2007-12-05 20:38:48

Re: ufs2 и фат рядом

Непрочитанное сообщение hryamzik » 2008-04-23 18:58:47

Код: Выделить всё

flash_formatpart()
{
   local part1="${DEV}s1"
   local part2="${DEV}s2"
   local tmp=`mktemp -q /tmp/frenzy.XXXXX`

   echo "$msg_label $part2..." >>"$LOG"
   info "$msg_label $part2..."

   dd if=/dev/zero of=$part2 bs=$SECTSIZE count=32 >>"$LOG" 2>&1 && \
   bsdlabel -w -B $part2 >>"$LOG" 2>&1 && \
   bsdlabel $part2 | sed -e '/a:/s/unused/4.2BSD/' >$tmp && \
   bsdlabel -R $part2 $tmp >>"$LOG" 2>&1 && \
   rm -f $tmp

   if [ $? -ne 0 ]; then
      error "$msg_unable $msg_labelerr $part2. $msg_log."
      exit 1
   fi

   echo "$msg_formatting ${part2}a..." >>"$LOG"
   info "$msg_formatting ${part2}a..."

   newfs -n -m 0 -b $((SECTSIZE * 8)) -f $SECTSIZE -i $((SECTSIZE * 16)) "${part2}a" >>"$LOG" 2>&1
...
}
Мне это все не очень понятно, но однако же очевидно что не просто на партиции флешка бьется, а еще и льется туда 32 бита. Почему так, я не знаю.

Аватара пользователя
manefesto
Группенфюррер
Сообщения: 6934
Зарегистрирован: 2007-07-20 8:27:30
Откуда: Пермь
Контактная информация:

Re: ufs2 и фат рядом

Непрочитанное сообщение manefesto » 2008-04-24 6:03:13

Код: Выделить всё

dd if=/dev/zero of=$part2 bs=$SECTSIZE count=32
забивает на устройство part2="${DEV}s2" нулями...блоками по 32 бита

Код: Выделить всё

   bsdlabel -w -B $part2 >>"$LOG" 2>&1 && \
   bsdlabel $part2 | sed -e '/a:/s/unused/4.2BSD/' >$tmp && \
   bsdlabel -R $part2 $tmp >>"$LOG" 2>&1 && \
разбивает на слайсы(мне так кажется)

Код: Выделить всё

newfs -n -m 0 -b $((SECTSIZE * 8)) -f $SECTSIZE -i $((SECTSIZE * 16)) "${part2}a" >>"$LOG" 2>&1
Создает файловую систему(ufs)

Может я в каких то моментах и ошибаюсь так как я ни одного мана по данным утилитам не прочитал, а только статейки....но суть приблизительно верна
я такой яростный шо аж пиздеЦ
Изображение