Frequently Asked Questions for FreeBSD 2.X : Installation : I'm having lots of trouble trying to disklabel a new SCSI drive.
Previous: When I install the boot manager and try to boot FreeBSD for the first time, it just comes back with the boot manager prompt again.
Next: I have an IDE drive with lots of bad blocks on it and FreeBSD doesn't seem to install properly.

3.10. I'm having lots of trouble trying to disklabel a new SCSI drive.

I have made an entry in /etc/disktab, but when I try to label the drive the following happens:

            mips# disklabel -w /dev/sd1 sea32550N
            disklabel: ioctl DIOCWDINFO: Operation not supported by device
          
What am I doing wrong?

Answer:
Doing this using disklabel (and fdisk) is probably harder than using sysinstall. The following should work to put FreeBSD-2.0.5 on the whole of an empty disk assuming that the disktab entry is correct.

            disklabel -r -w /dev/rsd1 sea32550N
                      ^^         ^
          
The first -r is essential for writing new labels and using the raw device instead of the block device is good technique. To be ``empty'' the disk should have 0's at critical points on the first two sectors. In particular, the 2 byte signature at the end of the first sector must not be 0xaa55 or the disk will be interpreted as having a slice (partition) table and it will be difficult to write to it where you want unless the slice table is initialized correctly. All bootable hard disks will have the 0xaa55 signature so they won't be empty. Empty disks may be created by copying zeros over the first 2 sectors:

            dd if=/dev/zero of=/dev/rsd1 bs=1k count=1
          

Note that this will (appear to) destroy all data on the disk.

The above is not the best method. Normally you will have a slice table or a label that you want to preserve or modify slightly. This can be done using

            fdisk -u /dev/rsd1              # install or change slice table
            disklabel -r -w sd1 sea32550N   # install label
                            ^no /dev/r
          

fdisk is unintuitive and has poor error handling so it is difficult to change slice tables using it. However, to install a new slice table on an empty drive you just have to accept all the defaults except for ``n'' to write at the end.

Note that the sd1 drive in the above is different from /dev/rsd1. disklabel modifies path names that don't start with a slash by prefixing /dev/r and suffixing the ``raw'' partition letter. sd1 thus means /dev/rsd1c, i.e., the ``c'' partition on the first BSD slice on drive sd1, i.e., the whole of the first BSD slice on drive sd1, while /dev/rsd1 is the whole of drive sd1. Thus ``disklabel ... sd1'' will fail if there is no FreeBSD slice, while ``disklabel /dev/rsd1'' will print the in-core label for the whole drive. Oops, this assumes that slices are enabled by the 0xaa55 signature. If slices aren't enabled, then /dev/rsd1c means the whole drive. In practice, slices have to be enabled to make the disk bootable.

If there are no BSD slices, then /dev/rsd1c will be empty instead of unconfigured and attempts to label sd1 will fail with a bogus error message about /dev/rsd1c not existing.

/dev/sd1 didn't exist in previous versions of FreeBSD or 386BSD so your ``disklabel -w /dev/sd1 ...'' would have printed a less confusing error message before failing.

The disklabel I'm trying is
sea32550N|Seagate 32550N:\
       :ty=winchester:dt=SCSI:se#512:nc#3510:nt#11:ns#108:\
       :rm#7200:\
       :pa#2433024:oa#0:ta=4.2BSD:\
       :pc#4169880:oc#0:
          
Note that ns has to be < 64 in the slice table. I would use nt#22:ns#54. This only matters if you don't accept fdisk's default (bogus) slice table. You have to use a valid table if you want multiple slices, or the first slice starting at a nonzero offset. Starting a nonempty slice at offset 0 is invalid so sysinstall doesn't support creating such slices.


Frequently Asked Questions for FreeBSD 2.X : Installation : I'm having lots of trouble trying to disklabel a new SCSI drive.
Previous: When I install the boot manager and try to boot FreeBSD for the first time, it just comes back with the boot manager prompt again.
Next: I have an IDE drive with lots of bad blocks on it and FreeBSD doesn't seem to install properly.