[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[RFC] Add support for fake ATA RAID (dmraid)



Attached a set of patches split into 3 sets that add very basic support 
for dmraid to D-I. Although the support as a whole is very experimental, 
the changes to existing udebs are fairly small and relatively clean.

Although there are still some issues, I think the current code is ready to 
be committed and used as an experimental feature. I feel it is a good 
basis to improve support later. Current code has been tested fairly 
extensively (also on non-dmraid installs).

Some characteristics:
- dmraid support is only enabled if 'disk-detect/dmraid/enable=true' or
  the alias 'dmraid=true' are passed at the boot prompt
- dialogs and error handling still need some work
- partman will:
  - not show the physical disks that make up the fake RAID device
  - show the device-mapper device corresponding to the fake RAID device
    with below that its partitions; this can be partitioned, but can not
    be used to set "usage" information (file system, mount point)
  - show separate device-mapper devices for each partition with below
    that the usage information for that partition
  - changes in partitioning for the fake RAID device need to be committed
    "manually" using a separate menu item
- os-prober will skip physical disks that are part of a fake RAID device;
  as the fake RAID itself is not supported, that effectively means no
  os-probing support
- grub is supported as bootloader, but as grub-install can not be used,
  grub-installer effectively installs grub manually to the MBR of the
  fake RAID

The patches are as follows:
- other udebs:
  - hw-detect: add dmraid support in disk-detect is enabled at boot prompt
  - preseed: add alias for disk-detect enable option
  - base-installer: create device-mapper devices and load dmraid in target
  - os-prober: skip disks that are part of fake RAID
  - grub-installer: add semi-manual support to install grub on fake RAID
- partman-dmraid:
  - new component with dmraid-specific support bits
  - during init.d a flag is set for the "whole disk" fake RAID device,
    which is used in other places
  - in choose-partitions.d the menu item is added to commit partitioning
    changes to the fake RAID device
- other partman:
  - partman-base: basic recognition and display of fake RAID devices; skip
    the physical disks that make up the fake RAID
  - others: avoid "using" anything on the fake RAID device itself

Issues
------
Main issue is that partman should handle the dmraid devices better and 
present them as a single unit instead of the current hackish way of 
dealing with them.
Current solution also results in a wrong display of the first dmraid 
partition (the one that has grub installed on it as "free space".

For the grub installation I currently assume that the installation is to 
the fake RAID device and that the grub root is the first partition. I 
plan to work on this a bit more before committing.

ToDo
----
- the dialogs still need some work
- some error checking could probably be added in current code
- modify grub-installer to support installation to other partitions
  than the first
- modify grub-installer to support having the grub root on a different
  device than the fake RAID
- add real support in partman and grub

Comments welcome.

Cheers,
FJP

Index: hw-detect/debian/changelog
===================================================================
--- hw-detect/debian/changelog	(revision 47287)
+++ hw-detect/debian/changelog	(working copy)
@@ -1,5 +1,6 @@
 hw-detect (1.54) UNRELEASED; urgency=low
 
+  [ Joey Hess ]
   * Remove cruft left over from the days of pcmcia-cs.
     - pcmciautils doesn't create a cardmgr.pid, so stop looking for it to
       determine if pcmcia is started. Look for the pcmcia_core module being
@@ -11,8 +12,12 @@
     - Only modify config.opts in /target if pcmcia_resources is preseeded.
   * Remove workaround for long fixed cdebconf bug.
 
- -- Joey Hess <joeyh@debian.org>  Sun, 27 May 2007 01:53:09 -0400
+  [ Frans Pop ]
+  * disk-detect: detect fake (ata) RAID devices using dmraid if requested
+    by setting disk-detect/dmraid/enable at the boot prompt.
 
+ -- Frans Pop <fjp@debian.org>  Thu, 14 Jun 2007 19:55:28 +0200
+
 hw-detect (1.53) unstable; urgency=low
 
   [ Joey Hess ]
Index: hw-detect/debian/disk-detect.templates
===================================================================
--- hw-detect/debian/disk-detect.templates	(revision 47287)
+++ hw-detect/debian/disk-detect.templates	(working copy)
@@ -24,3 +24,9 @@
  No partitionable media were found.
  .
  Please check that a hard disk is attached to this machine.
+
+Template: disk-detect/dmraid/enable
+Type: boolean
+Default: false
+Description: for internal use; can be preseeded
+ Check for the presence of fake (ata) RAID (dmraid) devices?
Index: hw-detect/disk-detect.sh
===================================================================
--- hw-detect/disk-detect.sh	(revision 47287)
+++ hw-detect/disk-detect.sh	(working copy)
@@ -114,7 +114,7 @@
 
 		db_get disk-detect/module_select
 		if [ "$RET" = "continue with no disk drive" ]; then
-			break
+			exit 0
 		elif [ "$RET" != "none of the above" ]; then
 			module="$RET"
 			if [ -n "$module" ] && is_not_loaded "$module" ; then
@@ -147,3 +147,21 @@
 	fi
 	db_capb
 done
+
+# Activate fake (ata) raid devices
+db_get disk-detect/dmraid/enable
+if [ $RET = true ]; then
+	if anna-install dmraid-udeb; then
+		# Device mapper support is required to run dmraid
+		if is_not_loaded dm-mod; then
+			module_probe dm-mod
+		fi
+
+		if [ "$(dmraid -c -s)" != "No RAID disks" ]; then
+			anna-install partman-dmraid
+
+			# Activate devices
+			log-output -t disk-detect dmraid -ay
+		fi
+	fi
+fi
Index: preseed/debian/changelog
===================================================================
--- preseed/debian/changelog	(revision 47287)
+++ preseed/debian/changelog	(working copy)
@@ -1,3 +1,9 @@
+preseed (1.30) UNRELEASED; urgency=low
+
+  * Add alias 'dmraid' to enable fake RAID support.
+
+ -- Frans Pop <fjp@debian.org>  Mon, 18 Jun 2007 10:02:03 +0200
+
 preseed (1.29) unstable; urgency=low
 
   [ Colin Watson ]
Index: preseed/preseed_aliases
===================================================================
--- preseed/preseed_aliases	(revision 47287)
+++ preseed/preseed_aliases	(working copy)
@@ -13,3 +13,4 @@
 suite	mirror/suite
 modules	anna/choose_modules
 tasks	tasksel:tasksel/first
+dmraid	disk-detect/dmraid/enable
Index: base-installer/debian/postinst
===================================================================
--- base-installer/debian/postinst	(revision 47287)
+++ base-installer/debian/postinst	(working copy)
@@ -340,6 +340,18 @@
 				minor="$(dmsetup -c --noheadings info $rootnode | cut -d':' -f3)"
 				mknod /target/dev/mapper/$rootnode b $major $minor
 			fi
+
+			# Create device nodes for fake (ata) RAID devices
+			if type dmraid >/dev/null 2>&1; then
+				for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+					for frdev in $(ls /dev/mapper/$frdisk* 2>/dev/null); do
+						frnode=$(basename $frdev)
+						major="$(dmsetup -c --noheadings info $frnode | cut -d':' -f2)"
+						minor="$(dmsetup -c --noheadings info $frnode | cut -d':' -f3)"
+						mknod /target/dev/mapper/$frnode b $major $minor
+					done
+				done
+			fi
 		fi
 
 		# We can't check the root node directly as is done above because
@@ -349,6 +361,12 @@
 			apt-install cryptsetup
 		fi
 
+		if type dmraid >/dev/null 2>&1; then
+			if [ "$(dmraid -s -c | grep -v "No RAID disks")" ]; then
+				apt-install dmraid
+			fi
+		fi
+
 		if pvdisplay | grep -iq "physical volume ---"; then
 			apt-install lvm2
 			in-target vgscan --mknodes || true
Index: base-installer/debian/changelog
===================================================================
--- base-installer/debian/changelog	(revision 47287)
+++ base-installer/debian/changelog	(working copy)
@@ -1,10 +1,15 @@
 base-installer (1.81) UNRELEASED; urgency=low
 
+  [ Otavio Salvador ]
   * Provides installed-base. This is need to be able to use alternative
     ways of installing Debian.
 
- -- Otavio Salvador <otavio@ossystems.com.br>  Sun, 17 Jun 2007 10:02:39 -0300
+  [ Frans Pop ]
+  * Load dmraid if needed; create device nodes in /target for fake (ata)
+    RAID devices.
 
+ -- Frans Pop <fjp@debian.org>  Fri, 15 Jun 2007 15:07:17 +0200
+
 base-installer (1.80) unstable; urgency=low
 
   [ Frans Pop ]
Index: os-prober/debian/changelog
===================================================================
--- os-prober/debian/changelog	(revision 47287)
+++ os-prober/debian/changelog	(working copy)
@@ -1,13 +1,18 @@
 os-prober (1.19) UNRELEASED; urgency=low
 
+  [ Joey Hess ]
   * Make the microsoft OS test completely case-insensative in the file and
     directory named it looks for. This is reportedly needed at least for
     Vista (Boot/BCD vs boot/bcd), and was already done on an ad-hoc basis
     for 2000/XP/NT4.0.
   * Patch from VMiklos to add support for recognising Frugalware.
 
- -- Joey Hess <joeyh@debian.org>  Sun, 03 Jun 2007 11:54:59 -0400
+  [ Frans Pop ]
+  * Skip partitions that are on a disk that is part of a fake (ata) RAID
+    device.
 
+ -- Frans Pop <fjp@debian.org>  Sat, 16 Jun 2007 10:05:46 +0200
+
 os-prober (1.18) unstable; urgency=low
 
   * Add detection for Dell Utility partition (can be chainloaded).
Index: os-prober/os-prober
===================================================================
--- os-prober/os-prober	(revision 47287)
+++ os-prober/os-prober	(working copy)
@@ -3,10 +3,22 @@
 
 . /usr/share/os-prober/common.sh
 
+on_fakeraid () {
+	type dmraid >/dev/null 2>&1 || return 1
+	local parent=${1%/*}
+	local device=/dev/${parent##*/}
+	if dmraid -r -c | grep -q $device; then
+		return 0
+	fi
+	return 1
+}
+
 partitions () {
+	# Exclude partitions that are on devices that are part of a fake
+	# (ata) RAID device. TODO: add support for the fake RAID itself.
 	if [ -d /sys/block ]; then
 		for part in /sys/block/*/*[0-9]; do
-			if [ -f "$part/start" ]; then
+			if [ -f "$part/start" ] && ! on_fakeraid $part; then
 				name="$(echo "${part##*/}" | sed 's,[!.],/,g')"
 				if [ -e "/dev/$name" ]; then
 					echo "/dev/$name"
Index: arch/i386/grub-installer/debian/isinstallable
===================================================================
--- arch/i386/grub-installer/debian/isinstallable	(revision 47287)
+++ arch/i386/grub-installer/debian/isinstallable	(working copy)
@@ -13,6 +13,17 @@
 	mount | grep "on /target${1%/} " | cut -d' ' -f5
 }
 
+is_fakeraid () {
+	if type dmraid >/dev/null 2>&1; then
+		for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+			if echo "$1" | grep "/$frdisk[0-9]\+"; then
+				return 0
+			fi
+		done
+	fi
+	return 1
+}
+
 ARCH="$(archdetect)"
 
 case $ARCH in
@@ -36,8 +47,10 @@
 # Check for the control file to work around lvdisplay refusal to work with
 # certian lvm device names.
 if lvdisplay "$bootfs" | grep -q 'LV Name' 2>/dev/null || [ -e "$(dirname $bootfs)/control" ]; then
-	log "/boot is a lvm volume ($bootfs), cannot install grub"
-	exit 1
+	if ! is_fakeraid $bootfs; then
+		log "/boot is a lvm volume ($bootfs), cannot install grub"
+		exit 1
+	fi
 fi
 
 bootfstype=$(findfstype /boot)
Index: arch/i386/grub-installer/debian/changelog
===================================================================
--- arch/i386/grub-installer/debian/changelog	(revision 47287)
+++ arch/i386/grub-installer/debian/changelog	(working copy)
@@ -9,8 +9,11 @@
   * When installing with GRUB 2, adjust otheros entry writing to the
     interface provided by new update-grub.  (Closes: #423393)
 
- -- Robert Millan <rmh@aybabtu.com>  Sun, 17 Jun 2007 20:48:50 +0200
+  [ Frans Pop ]
+  * Fix incorrect detection of fake RAID devices (dmraid) as LVM volumes.
 
+ -- Frans Pop <fjp@debian.org>  Mon, 18 Jun 2007 10:06:45 +0200
+
 grub-installer (1.24) unstable; urgency=low
 
   * Fix syntax error in grub-installer script.
Index: arch/i386/grub-installer/debian/grub-installer.templates
===================================================================
--- arch/i386/grub-installer/debian/grub-installer.templates	(revision 47287)
+++ arch/i386/grub-installer/debian/grub-installer.templates	(working copy)
@@ -23,6 +23,22 @@
  that operating system temporarily unbootable, though GRUB can be manually
  configured later to boot it.
 
+Template: grub-installer/fakeraid
+Type: boolean
+Default: true
+Description: Install the GRUB boot loader to the fake RAID disk?
+ Installation of GRUB on a fake (ata) RAID disk is not really
+ supported, but it is possible. The installation is currently experimental
+ and will always be done on the MBR of the fake RAID disk.
+ .
+ Choose <Go Back> to cancel this operation.
+
+Template: grub-installer/fakeraid
+Type: error
+Description: Configuration not supported
+ The installer has detected the presence of multiple fake RAID disks, which
+ is currently not supported.
+
 Template: grub-installer/install_to_xfs
 Type: boolean
 Default: false
Index: arch/i386/grub-installer/grub-installer
===================================================================
--- arch/i386/grub-installer/grub-installer	(revision 47287)
+++ arch/i386/grub-installer/grub-installer	(working copy)
@@ -237,6 +237,9 @@
 	/dev/md)
 		disc_offered_devfs="$bootfs"
 	;;
+	/dev/mapper)
+		disc_offered_devfs="$bootfs"
+	;;
 	/dev/[hs]d[a-z]|/dev/cciss/c[0-9]d[0-9]|/dev/ida/c[0-9]d[0-9])
 		disc_offered_devfs="$prefix"
 	;;
@@ -383,6 +386,16 @@
 	state=1
 fi
 
+nr_frdisks="$(dmraid -s -c | grep -v "No RAID disks" | wc -l)"
+if [ $nr_frdisks -eq 1 ]; then
+	q=grub-installer/fakeraid
+	frdisk=$(dmraid -s -c)
+elif [ $nr_frdisks -gt 1 ]; then
+	db_input critical grub-installer/fakeraid-unsupported || [ $? -eq 30 ]
+	db_go || true
+	exit 1
+fi
+
 db_progress STEP 1
 db_progress INFO grub-installer/progress/step_bootdev
 
@@ -433,31 +446,65 @@
 
 update_mtab
 
-# Install grub on each space separated disk in the list
-bootdevs="$bootdev"
-for bootdev in $bootdevs; do
-	if ! is_floppy "$bootdev"; then
-		if $chroot $ROOT grub-install -h 2>&1 | grep -q no-floppy; then
-			info "grub-install supports --no-floppy"
-			floppyparam="--no-floppy"
+if [ -z "$frdisk" ]; then
+
+	# Install grub on each space separated disk in the list
+	bootdevs="$bootdev"
+	for bootdev in $bootdevs; do
+		if ! is_floppy "$bootdev"; then
+			if $chroot $ROOT grub-install -h 2>&1 | grep -q no-floppy; then
+				info "grub-install supports --no-floppy"
+				floppyparam="--no-floppy"
+			else
+				info "grub-install does not support --no-floppy"
+			fi
+		fi
+	
+		info "Running $chroot $ROOT grub-install --recheck $floppyparam \"$bootdev\""
+		if log-output -t grub-installer $chroot $ROOT grub-install --recheck $floppyparam "$bootdev"; then
+			info "grub-install ran successfully"
 		else
-			info "grub-install does not support --no-floppy"
+			error "Running 'grub-install --recheck $floppyparam \"$bootdev\"' failed."
+			db_subst grub-installer/grub-install-failed BOOTDEV "$bootdev"
+			db_input critical grub-installer/grub-install-failed || [ $? -eq 30 ]
+			db_go || true
+			db_progress STOP
+			exit 1
 		fi
-	fi
+	done
 
-	info "Running $chroot $ROOT grub-install --recheck $floppyparam \"$bootdev\""
-	if log-output -t grub-installer $chroot $ROOT grub-install --recheck $floppyparam "$bootdev"; then
-		info "grub-install ran successfully"
-	else
-		error "Running 'grub-install --recheck $floppyparam \"$bootdev\"' failed."
-		db_subst grub-installer/grub-install-failed BOOTDEV "$bootdev"
-		db_input critical grub-installer/grub-install-failed || [ $? -eq 30 ]
-		db_go || true
-		db_progress STOP
+else
+
+	# Semi-manual grub setup for a fake (ata) RAID disk
+	case $(archdetect) in
+	    i386/*)
+		stagedir=i386-pc ;;
+	    amd64/*)
+		stagedir=x86_64-pc ;;
+	    *)
+	    	error "Unsupported architecture for fake RAID installation"
 		exit 1
+		;;
+	esac
+	if [ ! -d $ROOT/usr/lib/grub/$stagedir/ ]; then
+		error "Grub stage files not available"
+		exit 1
 	fi
-done
+	mkdir -p /target/boot/grub
+	cp $ROOT/usr/lib/grub/$stagedir/* $ROOT/boot/grub
 
+	# TODO: Check for errors during this process!
+	TERM=linux $chroot $ROOT \
+        grub --device-map=/dev/null >/var/log/grub-dmraid.log 2>&1 </dev/null <<EOF
+device (hd0,0) /dev/mapper/${frdisk}1
+device (hd0) /dev/mapper/$frdisk
+root (hd0,0)
+setup (hd0,0)
+quit
+EOF
+
+fi
+
 db_progress STEP 1
 db_progress INFO grub-installer/progress/step_config_loader
 
Index: partman/partman-dmraid/debian/control
===================================================================
--- partman/partman-dmraid/debian/control	(revision 0)
+++ partman/partman-dmraid/debian/control	(revision 0)
@@ -0,0 +1,13 @@
+Source: partman-dmraid
+Section: debian-installer
+Priority: standard
+Maintainer: Debian Install System Team <debian-boot@lists.debian.org>
+Uploaders: Frans Pop <fjp@debian.org>
+Build-Depends: debhelper (>= 4.2.0), po-debconf (>= 0.5.0)
+XS-Vcs-Svn: svn://svn.debian.org/d-i/trunk/packages/partman/partman-dmraid
+
+Package: partman-dmraid
+XC-Package-Type: udeb
+Architecture: all
+Depends: ${misc:Depends}, partman-base, di-utils (>= 1.14), dmraid-udeb, dmsetup-udeb
+Description: Adds support for fake (ata) RAID (dmraid) to partman
Index: partman/partman-dmraid/debian/compat
===================================================================
--- partman/partman-dmraid/debian/compat	(revision 0)
+++ partman/partman-dmraid/debian/compat	(revision 0)
@@ -0,0 +1 @@
+4
Index: partman/partman-dmraid/debian/changelog
===================================================================
--- partman/partman-dmraid/debian/changelog	(revision 0)
+++ partman/partman-dmraid/debian/changelog	(revision 0)
@@ -0,0 +1,9 @@
+partman-dmraid (1) UNRELEASED; urgency=low
+
+  * Initial version.
+
+ -- Frans Pop <fjp@debian.org>  Fri, 15 Jun 2007 13:00:24 +0200
+
+Local Variables:
+coding: utf-8
+End:
Index: partman/partman-dmraid/debian/copyright
===================================================================
--- partman/partman-dmraid/debian/copyright	(revision 0)
+++ partman/partman-dmraid/debian/copyright	(revision 0)
@@ -0,0 +1,6 @@
+Authors: Frans Pop
+
+Copyright 2007 Frans Pop <elendil@planet.nl>
+
+This package is under the GNU General Public License, version 2, which can
+usually be found in /usr/share/common-licenses/GPL-2 on Debian systems.
Index: partman/partman-dmraid/debian/install-rc
===================================================================
--- partman/partman-dmraid/debian/install-rc	(revision 0)
+++ partman/partman-dmraid/debian/install-rc	(revision 0)
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+set -e
+
+# PACKAGE is exported from debian/rules
+partman=debian/${PACKAGE}/lib/partman
+
+install -d $partman/$1
+
+cp -r $1/* $partman/$1/
+
+# Remove any SVN dirs that were copied along
+rm -rf `find $partman/$1/ -name .svn`
+
+if [ -f $partman/$1/_numbers ]; then
+    numbers=$(cat $partman/$1/_numbers)
+    rm $partman/$1/_numbers
+    echo "$numbers" |
+    while read number name; do
+	set -e
+	mv $partman/$1/$name $partman/$1/${number}${name}
+    done
+fi
+

Property changes on: partman/partman-dmraid/debian/install-rc
___________________________________________________________________
Name: svn:executable
   + *

Index: partman/partman-dmraid/debian/rules
===================================================================
--- partman/partman-dmraid/debian/rules	(revision 0)
+++ partman/partman-dmraid/debian/rules	(revision 0)
@@ -0,0 +1,38 @@
+#!/usr/bin/make -f
+# Sample debian/rules that uses debhelper.
+# GNU copyright 1997 to 1999 by Joey Hess.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+export PACKAGE = partman-dmraid
+
+build:
+# Ye olde no-op.
+
+clean:
+	dh_testdir
+	dh_testroot
+	rm -f `find . -name '*~'`
+	dh_clean
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k
+	debian/install-rc choose_partition
+	debian/install-rc init.d
+
+binary-indep: build install
+	dh_testdir
+	dh_testroot
+	dh_installdebconf
+	dh_fixperms
+	dh_installdeb
+	dh_gencontrol
+	dh_builddeb
+
+binary-arch: build install
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install

Property changes on: partman/partman-dmraid/debian/rules
___________________________________________________________________
Name: svn:executable
   + *

Index: partman/partman-dmraid/debian/source.lintian-overrides
===================================================================
--- partman/partman-dmraid/debian/source.lintian-overrides	(revision 0)
+++ partman/partman-dmraid/debian/source.lintian-overrides	(revision 0)
@@ -0,0 +1 @@
+no-standards-version-field
Index: partman/partman-dmraid/debian/partman-dmraid.templates
===================================================================
--- partman/partman-dmraid/debian/partman-dmraid.templates	(revision 0)
+++ partman/partman-dmraid/debian/partman-dmraid.templates	(revision 0)
@@ -0,0 +1,47 @@
+Template: partman-dmraid/menu/finish
+Type: text
+# Menu entry
+# Use infinitive form
+_Description: Finish
+
+Template: partman-dmraid/confirm
+Type: boolean
+Default: false
+#flag:translate!:4
+_Description: Write changes in fake raid partitioning to disk?
+ Any changes you have made in the partitioning of your fake (ata) RAID
+ devices need to be written to disk before the partitions can be used.
+ Any other pending changes will be written to disk as well. These changes
+ cannot be undone.
+ .
+ ${ITEMS}
+
+Template: partman-dmraid/confirm_nochanges
+Type: note
+_Description: No pending changes
+ There are no changes to commit.
+
+Template: partman-dmraid/commit_failed
+Type: error
+_Description: 
+ An error occurred while writing the changes to the disks.
+
+Template: partman-dmraid/progress/createfs/title
+Type: text
+_Description: Creating initial filesystem
+
+Template: partman-dmraid/progress/createfs/info
+Type: text
+_Description: Creating initial ext2 filesystem on ${DEVICE}...
+
+Template: partman-dmraid/text/commit_dmraid
+Type: text
+#  Main menu item
+# Use infinitive form
+_Description: Write changes in fake RAID partitioning to disk
+
+Template: debian-installer/partman-dmraid/title
+Type: text
+#  Main menu item
+# Use infinitive form
+_Description: Write changes in fake RAID partitioning to disk
Index: partman/partman-dmraid/debian/po/templates.pot
===================================================================
--- partman/partman-dmraid/debian/po/templates.pot	(revision 0)
+++ partman/partman-dmraid/debian/po/templates.pot	(revision 0)
@@ -0,0 +1,89 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: debian-boot@lists.debian.org\n"
+"POT-Creation-Date: 2007-06-18 20:27+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: text
+#. Description
+#. Menu entry
+#. Use infinitive form
+#: ../partman-dmraid.templates:1001
+msgid "Finish"
+msgstr ""
+
+#. Type: boolean
+#. Description
+#: ../partman-dmraid.templates:2001
+msgid "Write changes in fake raid partitioning to disk?"
+msgstr ""
+
+#. Type: boolean
+#. Description
+#: ../partman-dmraid.templates:2001
+msgid ""
+"Any changes you have made in the partitioning of your fake (ata) RAID "
+"devices need to be written to disk before the partitions can be used. Any "
+"other pending changes will be written to disk as well. These changes cannot "
+"be undone."
+msgstr ""
+
+#. Type: boolean
+#. Description
+#: ../partman-dmraid.templates:2001
+msgid "${ITEMS}"
+msgstr ""
+
+#. Type: note
+#. Description
+#: ../partman-dmraid.templates:3001
+msgid "No pending changes"
+msgstr ""
+
+#. Type: note
+#. Description
+#: ../partman-dmraid.templates:3001
+msgid "There are no changes to commit."
+msgstr ""
+
+#. Type: error
+#. Description
+#: ../partman-dmraid.templates:4001
+msgid "An error occurred while writing the changes to the disks."
+msgstr ""
+
+#. Type: text
+#. Description
+#: ../partman-dmraid.templates:5001
+msgid "Creating initial filesystem"
+msgstr ""
+
+#. Type: text
+#. Description
+#: ../partman-dmraid.templates:6001
+msgid "Creating initial ext2 filesystem on ${DEVICE}..."
+msgstr ""
+
+#. Type: text
+#. Description
+#. Main menu item
+#. Use infinitive form
+#. Type: text
+#. Description
+#. Main menu item
+#. Use infinitive form
+#: ../partman-dmraid.templates:7001 ../partman-dmraid.templates:8001
+msgid "Write changes in fake RAID partitioning to disk"
+msgstr ""
Index: partman/partman-dmraid/debian/po/output
===================================================================
--- partman/partman-dmraid/debian/po/output	(revision 0)
+++ partman/partman-dmraid/debian/po/output	(revision 0)
@@ -0,0 +1 @@
+2 utf8
Index: partman/partman-dmraid/debian/po/POTFILES.in
===================================================================
--- partman/partman-dmraid/debian/po/POTFILES.in	(revision 0)
+++ partman/partman-dmraid/debian/po/POTFILES.in	(revision 0)
@@ -0,0 +1 @@
+[type: gettext/rfc822deb] partman-dmraid.templates
Index: partman/partman-dmraid/init.d/fakeraid_flag
===================================================================
--- partman/partman-dmraid/init.d/fakeraid_flag	(revision 0)
+++ partman/partman-dmraid/init.d/fakeraid_flag	(revision 0)
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# This script sets the fakeraid flag for devices that are recognized by dmraid
+
+for dev in /var/lib/partman/devices/*; do
+	[ -d "$dev" ] || continue
+	cd $dev
+
+	[ -f device ] || continue
+	for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+		case $(cat device) in
+		    /dev/mapper/$frdisk)
+			>fakeraid
+			break
+			;;
+		esac
+	done
+done

Property changes on: partman/partman-dmraid/init.d/fakeraid_flag
___________________________________________________________________
Name: svn:executable
   + *

Index: partman/partman-dmraid/init.d/_numbers
===================================================================
--- partman/partman-dmraid/init.d/_numbers	(revision 0)
+++ partman/partman-dmraid/init.d/_numbers	(revision 0)
@@ -0,0 +1 @@
+50 fakeraid_flag
Index: partman/partman-dmraid/choose_partition/dmraid/do_option
===================================================================
--- partman/partman-dmraid/choose_partition/dmraid/do_option	(revision 0)
+++ partman/partman-dmraid/choose_partition/dmraid/do_option	(revision 0)
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+. /lib/partman/definitions.sh
+
+# TODO: Add error checking and error messages !!!!!!!!!!!!
+
+create_ext2 () {
+	frpart=${1##*/}
+	db_subst partman-dmraid/progress/createfs/info DEVICE $frpart
+	db_progress INFO partman-dmraid/progress/createfs/info
+	# TODO: check that ext2 is actually available
+	log-output -t partman-dmraid mkfs.ext2 -q $1
+}
+
+# Save status (including size) of current dmraid partitions
+DM_STATUS="$(dmsetup status --target linear)"
+
+# If a fake raid partition is in use as swap, it cannot be removed
+disable_swap
+
+# Remove existing fake raid partition devices
+# TODO: should probably umount partitions if device is in use
+for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+	for frpart in $(ls /dev/mapper/$frdisk* 2>/dev/null); do
+		[ $frpart != /dev/mapper/$frdisk ] || continue
+
+		# Remove pending actions on the partitions
+		devdir=$DEVICES/$(echo $frpart | sed 's:/:=:g')
+		if [ -d $devdir ]; then
+			rm -f $devdir/*/method
+			rm -f $devdir/*/format
+		fi
+
+		# Remove the device mapper node
+		dmsetup remove $frpart || exit 1
+	done
+done
+
+# Commit the changes
+confirm_changes "partman-dmraid" || exit 0
+for s in /lib/partman/commit.d/*; do
+	if [ -x $s ]; then
+		$s || {
+			db_input critical partman-dmraid/commit_failed || true
+			db_go || true
+			for s in /lib/partman/init.d/*; do
+				if [ -x $s ]; then
+					$s || exit 255
+				fi
+			done
+			exit 0
+		}
+	fi
+done
+
+# Refresh dmraid partition info
+log-output -t partman-dmraid dmraid -ay
+
+# Use number of linear devices as approximation of steps
+PB_MAX=$(dmsetup status --target linear | wc -l)
+db_progress START 0 $PB_MAX partman-dmraid/progress/createfs/title
+
+# Create an initial filesystem so new partitions are detected properly
+# HACKALERT: we assume that the size of the device is a sufficient indicator
+# that a partition was changed
+for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+	for frpart in $(ls /dev/mapper/$frdisk* 2>/dev/null); do
+		[ $frpart != /dev/mapper/$frdisk ] || continue
+		if oldstatus=$(echo $DM_STATUS | grep "^$frpart:"); then
+			oldsize=$(echo $oldstatus | cut -d" " -f 3)
+			newsize=$(dmsetup status $frpart | cut -d" " -f 3)
+			if [ $newsize -ne $oldsize ]; then
+				create_ext2 $frpart
+			fi
+		else
+			create_ext2 $frpart
+		fi
+		db_progress STEP 1
+	done
+done
+db_progress SET $PB_MAX
+db_progress STOP
+
+stop_parted_server
+
+restart_partman
+
+exit 0

Property changes on: partman/partman-dmraid/choose_partition/dmraid/do_option
___________________________________________________________________
Name: svn:executable
   + *

Index: partman/partman-dmraid/choose_partition/dmraid/choices
===================================================================
--- partman/partman-dmraid/choose_partition/dmraid/choices	(revision 0)
+++ partman/partman-dmraid/choose_partition/dmraid/choices	(revision 0)
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. /lib/partman/definitions.sh
+
+dev=$1
+id=$2
+
+cd $dev
+
+type dmraid >/dev/null 2>&1 || exit 0
+[ "$(dmraid -s -c | grep -v "No RAID disks")" ] || exit 0
+
+db_metaget partman-dmraid/text/commit_dmraid description
+
+printf "dmraid\t${RET}\n"

Property changes on: partman/partman-dmraid/choose_partition/dmraid/choices
___________________________________________________________________
Name: svn:executable
   + *

Index: partman/partman-dmraid/choose_partition/_numbers
===================================================================
--- partman/partman-dmraid/choose_partition/_numbers	(revision 0)
+++ partman/partman-dmraid/choose_partition/_numbers	(revision 0)
@@ -0,0 +1 @@
+10 dmraid
Index: partman/partman-base/debian/changelog
===================================================================
--- partman/partman-base/debian/changelog	(revision 47287)
+++ partman/partman-base/debian/changelog	(working copy)
@@ -1,14 +1,17 @@
 partman-base (109) UNRELEASED; urgency=low
 
   [ Otavio Salvador ]
-  * Remove partmap on clean
-  * Fix a compilation warning on partmap.c
+  * Remove partmap on clean.
+  * Fix a compilation warning on partmap.c.
 
   [ Colin Watson ]
   * Use MS-DOS label by default on PS3 systems.
 
- -- Otavio Salvador <otavio@ossystems.com.br>  Tue, 22 May 2007 13:45:01 -0300
+  [ Frans Pop ]
+  * Add support for fake (ata) RAID.
 
+ -- Frans Pop <fjp@debian.org>  Thu, 14 Jun 2007 23:16:59 +0200
+
 partman-base (108) unstable; urgency=low
 
   [ Martin Michlmayr ]
Index: partman/partman-base/debian/partman-base.templates
===================================================================
--- partman/partman-base/debian/partman-base.templates	(revision 47287)
+++ partman/partman-base/debian/partman-base.templates	(working copy)
@@ -285,6 +285,14 @@
 Type: text
 _Description: Encrypted volume (%s)
 
+Template: partman/text/dmraid_volume
+Type: text
+Description: Fake (ata) RAID %s (%s)
+
+Template: partman/text/dmraid_part
+Type: text
+Description: Fake (ata) RAID %s (partition #%s)
+
 Template: partman/text/lvm_lv
 Type: text
 _Description: LVM VG %s, LV %s
Index: partman/partman-base/definitions.sh
===================================================================
--- partman/partman-base/definitions.sh	(revision 47287)
+++ partman/partman-base/definitions.sh	(working copy)
@@ -709,13 +709,37 @@
 	    printf "$RET" ${type} ${device}
 	    ;;
 	/dev/mapper/*)
-	    # First of all, check if this is a dm-crypt device
 	    type=""
 	    if [ -x /sbin/dmsetup ]; then
 	        type=$(/sbin/dmsetup table "$1" | head -n 1 | cut -d " " -f3)
 	    fi
 
-	    if [ "$type" = crypt ]; then
+	    # First check for fake (ata) RAID devices
+	    if type dmraid >/dev/null 2>&1; then
+		for frdisk in $(dmraid -s -c | grep -v "No RAID disks"); do
+			device=${1#/dev/mapper/}
+			case "$1" in
+			    /dev/mapper/$frdisk)
+				type=fakeraid
+				superset=${device%_*}
+				desc=$(dmraid -s -c -c "$superset")
+				rtype=$(echo "$desc" | cut -d: -f4)
+				db_metaget partman/text/dmraid_volume description
+				printf "$RET" $device $rtype
+				;;
+			    /dev/mapper/$frdisk*)
+				type=fakeraid
+				part=${device#$frdisk}
+				db_metaget partman/text/dmraid_part description
+				printf "$RET" $device $part
+				;;
+			esac
+		done
+	    fi
+
+	    if [ "$type" = fakeraid ]; then
+		:
+	    elif [ "$type" = crypt ]; then
 	        mapping=${1#/dev/mapper/}
 	        db_metaget partman/text/dmcrypt_volume description
 	        printf "$RET" $mapping
@@ -1130,6 +1154,10 @@
 		if [ "$formatted_previously" = no ]; then
 			db_input critical $template/confirm_nochanges
 			db_go || true
+			if [ $template = partman-dmraid ]; then
+				# for dmraid, only a note is displayed
+				return 1
+			fi
 			db_get $template/confirm_nochanges
 			if [ "$RET" = false ]; then
 				db_reset $template/confirm_nochanges
Index: partman/partman-base/init.d/parted
===================================================================
--- partman/partman-base/init.d/parted	(revision 47287)
+++ partman/partman-base/init.d/parted	(working copy)
@@ -4,6 +4,18 @@
 
 . /lib/partman/definitions.sh
 
+ORIG_IFS="$IFS"
+
+part_of_fakeraid () {
+	local raiddev
+	for raiddev in $(dmraid -r -c); do
+		if [ "$(readlink -f $raiddev)" = $1 ]; then
+			return 0
+		fi
+	done
+	return 1
+}
+
 if [ ! -f /var/run/parted_server.pid ]; then
     [ -d /var/run ] || mkdir /var/run
     parted_server
@@ -27,8 +39,18 @@
 	    sed 's,^/dev/\(ide\|scsi\|[hs]d\),!/dev/\1,' | 
 	    sort | 
 	    sed 's,^!,,' ); do
+
 	IFS="$TAB"
 	set -- $partdev
+	IFS="$ORIG_IFS"
+
+	# Skip devices that are part of a dmraid device
+	if type dmraid >/dev/null 2>&1; then
+		if part_of_fakeraid $partdev; then
+			continue
+		fi
+	fi
+
 	dirname=$(echo $1 | sed 's:/:=:g')
 	dev=$DEVICES/$dirname
 	if [ -d /var/lib/partman/old_devices/$dirname ]; then
Index: partman/partman-basicfilesystems/debian/changelog
===================================================================
--- partman/partman-basicfilesystems/debian/changelog	(revision 47287)
+++ partman/partman-basicfilesystems/debian/changelog	(working copy)
@@ -2,6 +2,7 @@
 
   * Move deletion of SVN directories to install-rc script.
   * Improve the way install-rc is called.
+  * Don't autouse swap a partition if the parent device is fake (ata) RAID.
 
  -- Frans Pop <fjp@debian.org>  Sun, 13 May 2007 04:05:49 +0200
 
Index: partman/partman-basicfilesystems/init.d/autouse_swap
===================================================================
--- partman/partman-basicfilesystems/init.d/autouse_swap	(revision 47287)
+++ partman/partman-basicfilesystems/init.d/autouse_swap	(working copy)
@@ -8,6 +8,9 @@
 for dev in /var/lib/partman/devices/*; do
     [ -d "$dev" ] || continue
 
+    # Skip dmraid partitions
+    [ ! -e "$dev/fakeraid" ] || continue
+
     # Only run the first time each device is encountered.
     devbase="$(basename "$dev")"
     [ ! -f "/var/lib/partman/autoused_swap/$devbase" ] || continue
Index: partman/partman-partitioning/debian/changelog
===================================================================
--- partman/partman-partitioning/debian/changelog	(revision 47287)
+++ partman/partman-partitioning/debian/changelog	(working copy)
@@ -1,3 +1,9 @@
+partman-partitioning (51) UNRELEASED; urgency=low
+
+  * When creating a partition on a fake (ata) RAID device, do not use it.
+
+ -- Frans Pop <fjp@debian.org>  Fri, 15 Jun 2007 18:24:16 +0200
+
 partman-partitioning (50) unstable; urgency=low
 
   [ Colin Watson ]
Index: partman/partman-partitioning/free_space/new/do_option
===================================================================
--- partman/partman-partitioning/free_space/new/do_option	(revision 47287)
+++ partman/partman-partitioning/free_space/new/do_option	(working copy)
@@ -143,7 +143,10 @@
 	db_progress START 0 $numparts partman/text/please_wait
 	db_progress INFO partman-partitioning/new_state
 
-	if [ -n "$id" -a -f ../../ext3 ]; then
+	# Fake raid partitions cannot be used directly under the parent device
+	if [ -f fakeraid ]; then
+		:
+	elif [ -n "$id" -a -f ../../ext3 ]; then
 	    # make better defaults for the new partition
 	    [ -d $id ] || mkdir $id
 	    echo format >$id/method
Index: partman/partman-target/debian/changelog
===================================================================
--- partman/partman-target/debian/changelog	(revision 47287)
+++ partman/partman-target/debian/changelog	(working copy)
@@ -2,6 +2,7 @@
 
   * Move deletion of SVN directories to install-rc script.
   * Improve the way install-rc is called.
+  * Do not offer to set method for a fake (ata) RAID device.
 
  -- Frans Pop <fjp@debian.org>  Sun, 13 May 2007 04:04:58 +0200
 
Index: partman/partman-target/active_partition/method/choices
===================================================================
--- partman/partman-target/active_partition/method/choices	(revision 47287)
+++ partman/partman-target/active_partition/method/choices	(working copy)
@@ -6,6 +6,8 @@
 id=$2
 cd $dev
 
+[ ! -f fakeraid ] || exit 0
+
 if [ -f $id/method ]; then
     method=$(cat $id/method)
 else

Attachment: pgp9RCTLnvPKm.pgp
Description: PGP signature


Reply to: