summaryrefslogtreecommitdiffstats
path: root/sbin/disklabel
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>2000-10-31 07:07:39 +0000
committerjkh <jkh@FreeBSD.org>2000-10-31 07:07:39 +0000
commitc99208647479c0b824d2424b1192f105dabace2b (patch)
tree8fec587868519dff571a9bc9340e8aa4a963d37f /sbin/disklabel
parent7f3f30a6781f4feda57bd393fff125a6f56d2880 (diff)
downloadFreeBSD-src-c99208647479c0b824d2424b1192f105dabace2b.zip
FreeBSD-src-c99208647479c0b824d2424b1192f105dabace2b.tar.gz
Add support for virgin disklabels
Submitted by: dillon
Diffstat (limited to 'sbin/disklabel')
-rw-r--r--sbin/disklabel/disklabel.8168
-rw-r--r--sbin/disklabel/disklabel.c15
2 files changed, 149 insertions, 34 deletions
diff --git a/sbin/disklabel/disklabel.8 b/sbin/disklabel/disklabel.8
index 936618f..5a1871b 100644
--- a/sbin/disklabel/disklabel.8
+++ b/sbin/disklabel/disklabel.8
@@ -48,7 +48,7 @@
.Nm disklabel
.Fl w
.Op Fl r
-.Ar disk Ar disktype
+.Ar disk Ar disktype/auto
.Oo Ar packid Oc
.Nm disklabel
.Fl e
@@ -69,7 +69,7 @@
.Fl s Ar boot2
.Oc
.Ar disk
-.Oo Ar disktype Oc
+.Oo Ar disktype/auto Oc
.Nm disklabel
.Fl w
.Fl B
@@ -77,7 +77,7 @@
.Fl b Ar boot1
.Fl s Ar boot2
.Oc
-.Ar disk Ar disktype
+.Ar disk Ar disktype/auto
.Oo Ar packid Oc
.Nm disklabel
.Fl R
@@ -87,7 +87,7 @@
.Fl s Ar boot2
.Oc
.Ar disk Ar protofile
-.Oo Ar disktype Oc
+.Oo Ar disktype/auto Oc
.Sh DESCRIPTION
.Nm Disklabel
installs, examines or modifes the label on a disk drive or pack. When writing
@@ -116,15 +116,23 @@ is described under each command.
All
.Nm disklabel
forms require a disk device name, which should always be the raw
-.if t ``complete'' (or ``c'')
-.if n "complete" (or "c")
-partition, for example
-.Pa /dev/da0c .
+device name representing the disk or slice. For example
+.Pa da0
+represents the entire disk irregardless of any DOS partitioning,
+and
+.Pa da0s1
+represents a slice. Some devices, most notably
+.Ar ccd ,
+require that the
+.if t ``whole-disk'' (or ``c'')
+.if n "whole-disk" (or "c")
+partition be specified. For example
+.Pa ccd0c .
+You do not have to include the
+.Pa /dev/
+path prefix when specifying the device.
.Nm
-understands the abbreviation
-.Pa da0 ,
-which it converts internally to
-.Pa /dev/da0c .
+will automatically prepend it.
.Ss Reading the disk label
.Pp
To examine or save the label on a disk drive, use
@@ -151,7 +159,9 @@ If the
.Fl r
flag is given,
.Nm
-reads the label from the raw disk and displays it.
+reads the label from the raw disk and displays it. Both versions are usually
+identical except in the case where a label has not yet been initialized or
+is corrupt.
.Ss Writing a standard label
.Pp
To write a standard label, use the form
@@ -159,9 +169,15 @@ To write a standard label, use the form
.Nm disklabel
.Fl w
.Op Fl r
-.Ar disk Ar disktype
+.Ar disk Ar disktype/auto
.Oo Ar packid Oc
.Pp
+.Nm disklabel
+.Fl w
+.Op Fl r
+.Ar disk
+auto
+.Pp
The required arguments to
.Nm
are the drive to be labeled and the drive type as described in the
@@ -202,6 +218,20 @@ disk is the only supported operation, and the
.Ar disk
itself must be provided as the canonical name, i.e. not as a full
path name.
+.Pp
+PC-based systems have special requirements in order for the BIOS to properly
+recognize a FreeBSD disklabel. Older systems may require what is known as
+a ``dangerously dedicated''
+disklabel, which creates a fake DOS partition to work around problems older
+BIOSes have with modern disk geometries. On newer systems you generally want
+to create a normal DOS slice using
+.Ar fdisk
+and then create a FreeBSD disklabel within that slice. This is described
+later on in this page.
+.Pp
+Installing a new disklabel does not in of itself allow your system to boot
+a kernel using that label. You must also install boot blocks, which is
+described later on in this manual page.
.Ss Editing an existing disk label
.Pp
To edit an existing disk label, use the form
@@ -262,7 +292,16 @@ command
.Pp
The final three forms of
.Nm
-are used to install bootstrap code:
+are used to install bootstrap code. If you are creating a
+``dangerously-dedicated'' partition for compatibility with older PC systems,
+you generally want to specify the raw disk name such as
+.Pa da0.
+If you are creating a label within an existing DOS slice, you should specify
+the slice name such as
+.Pa da0s1 .
+Making a partition bootable can be tricky. If you are using a normal DOS
+slice you typically install (or leave) a standard MBR on the base disk and
+then install the FreeBSD bootblocks in the slice.
.Pp
.Nm disklabel
.Fl B
@@ -274,6 +313,11 @@ are used to install bootstrap code:
.Oo Ar disktype Oc
.Pp
This form installs the bootstrap only. It does not change the disk label.
+You should never use this command on a base disk unless you intend to create
+a ``dangerously-dedicated'' disk, such as
+.Ar da0 .
+This command is typically run on a slice such as
+.Ar da0s1 .
.Pp
.Nm disklabel
.Fl w
@@ -288,6 +332,8 @@ This form installs the bootstrap only. It does not change the disk label.
.if t This form corresponds to the ``write label'' command described above.
.if n This form corresponds to the "write label" command described above.
In addition to writing a new volume label, it also installs the bootstrap.
+If run on a base disk this command will create a ``dangerously-dedicated''
+label. This command is normally run on a slice rather then a base disk.
.Pp
.Nm disklabel
.Fl R
@@ -302,6 +348,8 @@ In addition to writing a new volume label, it also installs the bootstrap.
.if t This form corresponds to the ``restore label'' command described above.
.if n This form corresponds to the "restore label" command described above.
In addition to restoring the volume label, it also installs the bootstrap.
+If run on a base disk this command will create a ``dangerously-dedicated''
+label. This command is normally run on a slice rather then a base disk.
.Pp
The bootstrap commands always access the disk directly, so it is not necessary
to specify the
@@ -343,6 +391,49 @@ and
for the standard stage1 and stage2 boot images (details may vary
on architectures like the Alpha, where only a single-stage boot is used).
.El
+.Ss Initializing/Formatting a bootable disk from scratch
+.Pp
+To initialize a disk from scratch the following sequence is recommended.
+Please note that this will wipe everything that was previously on the disk,
+including any non-FreeBSD slices.
+.Bl -enum
+.It
+Use
+.Ar fdisk
+to initialize the DOS partition table, creating a real whole-disk slice to
+hold the FreeBSD disklabel, and installing a master boot record.
+.It
+Use
+.Ar disklabel
+to initialize a virgin FreeBSD disklabel and install FreeBSD boot blocks .
+.It
+Use
+.Ar disklabel
+to edit your newly created label, addiing appropriate partitions.
+.It
+Finally newfs the filesystem partitions you created in the label. A typical
+disklabel partiioning scheme would be to have an ``a'' partition
+of approximately 128MB to hold the root filesystem, a ``b'' partition for
+swap, a ``d'' partition for /var (usually 128MB), an ``e'' partition
+for /var/tmp (usually 128MB), an ``f'' partition for /usr (usually around 2G),
+and finally a ``g'' partition for /home (usally all remaining space).
+Your mileage may vary.
+.El
+.Pp
+.Nm fdisk -BI da0
+.Pp
+.Nm disklabel
+.Fl w
+.Fl r
+.Fl B
+.Ar da0s1
+auto
+.Pp
+.Pp
+.Nm disklabel
+.Fl e
+.Ar da0s1
+.Pp
.Sh FILES
.Bl -tag -width Pa -compact
.It Pa /etc/disktab
@@ -445,63 +536,67 @@ cylinder boundary.
.Dl disklabel da0
.Pp
Display the in-core label for
-.Pa da0
+.Pa da0s1
as obtained via
-.Pa /dev/da0c .
+.Pa /dev/da0s1 .
+When reading a label, FreeBSD will allow you to specify the base disk name
+even if the label resides on a slice. However, to be proper you should
+specify the base disk name only if you are using a ``dangerously-dedicated''
+label. Normally you specify the slice.
.Pp
-.Dl disklabel da0 > savedlabel
+.Dl disklabel da0s1 > savedlabel
.Pp
Save the in-core label for
-.Pa da0
+.Pa da0s1
into the file
.Pa savedlabel .
This file can be used with the
.Fl R
flag to restore the label at a later date.
.Pp
-.Dl disklabel -w -r /dev/da0c da2212 foo
+.Dl disklabel -w -r /dev/da0s1 da2212 foo
.Pp
Create a label for
-.Pa da0
+.Pa da0s1
based on information for
.if t ``da2212'' found in
.if n "da2212" found in
.Pa /etc/disktab .
Any existing bootstrap code will be clobbered.
.Pp
-.Dl disklabel -e -r da0
+.Dl disklabel -e -r da0s1
.Pp
Read the on-disk label for
-.Pa da0 ,
+.Pa da0s1 ,
edit it and reinstall in-core as well as on-disk. Existing bootstrap code is
unaffected.
.Pp
-.Dl disklabel -r -w da0 auto
+.Dl disklabel -r -w da0s1 auto
.Pp
Try to auto-detect the required information from
-.Pa da0 ,
+.Pa da0s1 ,
and write a new label to the disk. Use another disklabel -e command to edit the
partitioning and file system information.
.Pp
-.Dl disklabel -R da0 savedlabel
+.Dl disklabel -R da0s1 savedlabel
.Pp
Restore the on-disk and in-core label for
-.Pa da0
+.Pa da0s1
from information in
.Pa savedlabel .
Existing bootstrap code is unaffected.
.Pp
-.Dl disklabel -B da0
+.Dl disklabel -B da0s1
.Pp
Install a new bootstrap on
-.Pa da0 .
+.Pa da0s1 .
The boot code comes from
.Pa /boot/boot1
and possibly
.Pa /boot/boot2 .
On-disk and in-core labels are unchanged.
.Pp
-.Dl disklabel -w -B /dev/da0c -b newboot1 -s newboot da2212
+.Dl disklabel -w -B /dev/da0s1 -b newboot1 -s newboot da2212
.Pp
Install a new label and bootstrap.
.if t The label is derived from disktab information for ``da2212'' and
@@ -511,6 +606,19 @@ The bootstrap code comes from the files
.Pa /boot/newboot1
and
.Pa /boot/newboot2 .
+.Pp
+.Dl dd if=/dev/zero of=/dev/da0 bs=512 count=32
+.Dl fdisk -BI da0
+.Dl dd if=/dev/zero of=/dev/da0s1 bs=512 count=32
+.Dl disklabel -w -r -B da0s1 auto
+.Dl disklabel -e da0s1
+.Pp
+Completely wipe any prior information on the disk, creating a new bootable
+disk with a DOS partition table containing one ``whole-disk'' slice. Then
+initialize the slice, then edit it to your needs. The
+.Pa dd
+commands are optional, but may be necessary for some BIOSes to properly
+recognize the disk.
.Sh SEE ALSO
.Xr disklabel 5 ,
.Xr disktab 5 ,
diff --git a/sbin/disklabel/disklabel.c b/sbin/disklabel/disklabel.c
index a3fc788..484f073 100644
--- a/sbin/disklabel/disklabel.c
+++ b/sbin/disklabel/disklabel.c
@@ -1346,10 +1346,17 @@ getvirginlabel(void)
warn("cannot open %s", namebuf);
return (NULL);
}
- if (ioctl(f, DIOCGDINFO, &lab) < 0) {
- warn("ioctl DIOCGDINFO");
- close(f);
- return (NULL);
+
+ /*
+ * Try to use the new get-virgin-label ioctl. If it fails,
+ * fallback to the old get-disdk-info ioctl.
+ */
+ if (ioctl(f, DIOCGDVIRGIN, &lab) < 0) {
+ if (ioctl(f, DIOCGDINFO, &lab) < 0) {
+ warn("ioctl DIOCGDINFO");
+ close(f);
+ return (NULL);
+ }
}
close(f);
lab.d_boot0 = NULL;
OpenPOWER on IntegriCloud