[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