[Midnightbsd-cvs] src: sbin/atacontrol: It's magic.

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Thu Nov 20 14:34:42 EST 2008


Log Message:
-----------
It's magic.

Modified Files:
--------------
    src/sbin/atacontrol:
        Makefile (r1.1.1.1 -> r1.2)
        atacontrol.8 (r1.1.1.2 -> r1.2)
        atacontrol.c (r1.2 -> r1.3)

-------------- next part --------------
Index: atacontrol.c
===================================================================
RCS file: /home/cvs/src/sbin/atacontrol/atacontrol.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -L sbin/atacontrol/atacontrol.c -L sbin/atacontrol/atacontrol.c -u -r1.2 -r1.3
--- sbin/atacontrol/atacontrol.c
+++ sbin/atacontrol/atacontrol.c
@@ -23,7 +23,8 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/sbin/atacontrol/atacontrol.c,v 1.36.2.4 2006/01/30 10:20:28 sos Exp $
+ * $MidnightBSD$
+ * $FreeBSD: src/sbin/atacontrol/atacontrol.c,v 1.43 2007/08/13 18:46:31 jhb Exp $
  */
 
 #include <sys/types.h>
@@ -528,30 +529,30 @@
 		exit(EX_OK);
 	}
 	if (!strcmp(argv[1], "status") && argc == 3) {
-		struct ata_ioc_raid_config config;
-		int i;
+		struct ata_ioc_raid_status status;
+		int i, lun, state;
 
-		if (!(sscanf(argv[2], "ar%d", &config.lun) == 1)) {
+		if (!(sscanf(argv[2], "ar%d", &status.lun) == 1)) {
 			fprintf(stderr,
 				"atacontrol: Invalid array %s\n", argv[2]);
 			usage();
 		}
-		if (ioctl(fd, IOCATARAIDSTATUS, &config) < 0)
+		if (ioctl(fd, IOCATARAIDSTATUS, &status) < 0)
 			err(1, "ioctl(IOCATARAIDSTATUS)");
 
-		printf("ar%d: ATA ", config.lun);
-		switch (config.type) {
+		printf("ar%d: ATA ", status.lun);
+		switch (status.type) {
 		case AR_RAID0:
-			printf("RAID0 stripesize=%d", config.interleave);
+			printf("RAID0 stripesize=%d", status.interleave);
 			break;
 		case AR_RAID1:
 			printf("RAID1");
 			break;
 		case AR_RAID01:
-			printf("RAID0+1 stripesize=%d", config.interleave);
+			printf("RAID0+1 stripesize=%d", status.interleave);
 			break;
 		case AR_RAID5:
-			printf("RAID5 stripesize=%d", config.interleave);
+			printf("RAID5 stripesize=%d", status.interleave);
 			break;
 		case AR_JBOD:
 			printf("JBOD");
@@ -559,15 +560,8 @@
 			printf("SPAN");
 			break;
 		}
-		printf(" subdisks: ");
-		for (i = 0; i < config.total_disks; i++) {
-			if (config.disks[i] >= 0)
-				printf("ad%d ", config.disks[i]);
-			else
-				printf("DOWN ");
-		}
-		printf("status: ");
-		switch (config.status) {
+		printf(" status: ");
+		switch (status.status) {
 		case AR_READY:
 			printf("READY\n");
 			break;
@@ -576,11 +570,30 @@
 			break;
 		case AR_READY | AR_DEGRADED | AR_REBUILDING:
 			printf("REBUILDING %d%% completed\n",
-				config.progress);
+				status.progress);
 			break;
 		default:
 			printf("BROKEN\n");
 		}
+		printf(" subdisks:\n");
+		for (i = 0; i < status.total_disks; i++) {
+			printf("  %2d ", i);
+			lun = status.disks[i].lun;
+			state = status.disks[i].state;
+			if (lun < 0)
+				printf("---- ");
+			else
+				printf("ad%-2d ", lun);
+			if (state & AR_DISK_ONLINE)
+				printf("ONLINE");
+			else if (state & AR_DISK_SPARE)
+				printf("SPARE");
+			else if (state & AR_DISK_PRESENT)
+				printf("OFFLINE");
+			else
+				printf("MISSING");
+			printf("\n");
+		}
 		exit(EX_OK);
 	}
 	usage();
Index: atacontrol.8
===================================================================
RCS file: /home/cvs/src/sbin/atacontrol/atacontrol.8,v
retrieving revision 1.1.1.2
retrieving revision 1.2
diff -L sbin/atacontrol/atacontrol.8 -L sbin/atacontrol/atacontrol.8 -u -r1.1.1.2 -r1.2
--- sbin/atacontrol/atacontrol.8
+++ sbin/atacontrol/atacontrol.8
@@ -23,9 +23,10 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\" $FreeBSD: src/sbin/atacontrol/atacontrol.8,v 1.26.2.2 2006/01/25 08:13:46 sos Exp $
+.\" $MidnightBSD$
+.\" $FreeBSD: src/sbin/atacontrol/atacontrol.8,v 1.28.2.1 2007/12/02 08:49:23 remko Exp $
 .\"
-.Dd August 16, 2005
+.Dd November 28, 2007
 .Dt ATACONTROL 8
 .Os
 .Sh NAME
@@ -221,6 +222,110 @@
 The new modes are set as soon as the
 .Nm
 command returns.
+.Pp
+The atacontrol command can also be used to create purely software
+RAID arrays in systems that do NOT have a "real" hardware RAID card
+such as a Highpoint or Promise card.
+A common scenario is a 1U server such as the HP DL320 G4 or G5.
+These servers contain a SATA controller that has 2 channels that can
+contain 2 disks per channel, but the servers are wired to only place
+a single SATA drive on each channel.
+These servers do have a "pseudo" RAID BIOS but it uses a proprietary
+format that is not compatible with the ata driver, and thus their
+RAID bios must be switched off.
+Another common scenario would be a Promise UDMA100 controller card
+that did not contain the Fasttrack RAID BIOS, but did contain 2
+UDMA channels.
+1 disk would be attached to one channel and the other disk would be
+attached to the other channel.
+It is NOT recommended to create such arrays on a primary/secondary
+pair on a SINGLE channel since the throughput of the mirror would be
+severely compromised, the ability to rebuild the array in the event
+of a disk failure would be greatly complicated, and if a disk
+controller electronics failed it could wedge the channel and take
+both disks in the mirror offline.
+(which would defeat the purpose of having a mirror in the first place)
+.Pp
+A quick and dirty way to create such a mirrored array on a new
+system is to boot off the FreeBSD install CD, do a minimal scratch
+install, abort out of the post install questions, and at the command
+line issue the command:
+.Pp
+.Dl "atacontrol create RAID1 ad4 ad6"
+.Pp
+then immediately issue a reboot and boot from the installation CD
+again, and during the installation, you will now see "ar0" listed
+as a disk to install on, and install on that instead of ad4, ad6, etc.
+.Pp
+To get information about the status of a RAID array in the system
+use the command line:
+.Pp
+.Dl "atacontrol status ar0"
+.Pp
+A typical output showing good health on a RAID array might be as
+follows:
+.Pp
+.Dl "ar0: ATA RAID1 subdisks: ad4 ad6 status: READY"
+.Pp
+If a disk drive in a RAID1 array dies the system will mark the disk
+in a DOWN state and change the array status to DEGRADED.
+This can ALSO happen in rare instances due to a power fluctuation or
+other event causing the system to not shutdown properly.
+In that case the output will look like the following:
+.Pp
+.Dl "ar0: ATA RAID1 subdisks: ad4 DOWN status: DEGRADED"
+.Pp
+For a mirrored RAID1 system the server WILL ALLOW you to remove a
+dead SATA disk drive (if the drive is in a hot-swap tray) without
+freezing up the system, so you can remove the disk and while you are
+obtaining a replacement the server can run from the active disk.
+The only caveat is that if the active disk is ad6, the system most
+likely will NOT be able to be rebooted since most systems only
+support booting from the first disk drive.
+.Pp
+To deactivate the DOWN disk ad6 to allow for it to be ejected, use
+the following:
+.Pp
+.Dl "atacontrol detach ata3"
+.Pp
+then eject or remove the disk.
+Note that this only works if the 2 disks in the mirror are on separate
+channels (which is the standard setup for 1-U servers like the HP DL320).
+When the new disk drive is obtained, make sure it is blank, then shut
+the system down.
+At this point, if the system has a RAID array card like a Highpoint or
+Promise controller, you may then boot it into the BIOS of the card and use
+the manufacturers RAID array rebuild utilities to rebuild the array.
+.Pp
+If the system has a pure software array and is not using a "real" ATA
+RAID controller, then shut the system down, make sure that the disk
+that was still working is moved to the bootable position (channel 0
+or whatever the BIOS allows the system to boot from) and the blank disk
+is placed in the secondary position, then boot the system into 
+single-user mode and issue the command:
+.Pp
+.Dl "atacontrol addspare ar0 ad6"
+.Dl "atacontrol rebuild ar0"
+.Pp
+If the disk drive did NOT fail and the RAID array became unmirrored due
+to a software glitch or improper shutdown, then a slightly different
+process must be followed.
+Begin by issuing the detach command (this shows the detach for disk ad6,
+the primary master on channel 3):
+.Pp
+.Dl "atacontrol detach ata3"
+.Pp
+then reboot the system into single-user mode.
+(don't just init the system, reboot it so that both disks get probed)
+You will probably see TWO mirrored RAID arrays appear during the boot
+messages, ar0 and ar1.
+Issue the command:
+.Pp
+.Dl "atacontrol delete ar1"
+.Dl "atacontrol addspare ar0 ad6"
+.Pp
+Now a status command will show the array rebuilding.
+.Pp
 .Sh SEE ALSO
 .Xr ata 4
 .Sh HISTORY
Index: Makefile
===================================================================
RCS file: /home/cvs/src/sbin/atacontrol/Makefile,v
retrieving revision 1.1.1.1
retrieving revision 1.2
diff -L sbin/atacontrol/Makefile -L sbin/atacontrol/Makefile -u -r1.1.1.1 -r1.2
--- sbin/atacontrol/Makefile
+++ sbin/atacontrol/Makefile
@@ -1,3 +1,4 @@
+# $MidnightBSD$
 #$FreeBSD: src/sbin/atacontrol/Makefile,v 1.8 2003/11/05 19:20:41 johan Exp $
 
 PROG=	atacontrol


More information about the Midnightbsd-cvs mailing list