Copyright © 1999, 2000, 2001, 2002 Federico Lupi
Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The NetBSD Foundation
Published: 2010/01/16 07:55:45
$NetBSD: netbsd.html,v 1.66 2010/02/25 18:31:26 snj Exp $
Table of Contents
List of Figures
List of Tables
List of Examples
This guide describes the installation and the configuration of the NetBSD operating system as well as the setup and administration of some of its subsystems. It primarily addresses people coming from other Unix-like operating systems, and aims to be a useful guide in the face of the many small problems one encounters when using a new tool.
This guide is not a Unix tutorial: basic knowledge of some concepts and tools is assumed. You should know, for example, what a file and a directory are, and how to use an editor. There are plenty of books explaining basic Unix and operating system concepts, and you should consult one if you need more background information. It is better to choose a general book and avoid titles like “Learning Unix-XYZ, version 1.2.3.4 in 10 days”, but this is a matter of personal taste.
Much work is still required to finish this introduction to NetBSD: some chapters are not finished (some are not even started) and some subjects need more testing. Corrections and additions are most certainly welcome.
This guide is currently maintained by the NetBSD www team
(<www@NetBSD.org>). Corrections and suggestions
should be sent to that address. See also Appendix B, Contributing to the NetBSD guide.
Table of Contents
Table of Contents
NetBSD is a free, fast, secure, and highly portable Unix-like Open Source operating system. It is available for many platforms, from 64-bit x86 servers and PC desktop systems to embedded ARM and MIPS based devices. Its clean design and advanced features make it excellent in both production and research environments, and it is user-supported with complete source. Many applications are easily available through pkgsrc, the NetBSD Packages Collection.
The first version of NetBSD (0.8) dates back to 1993 and springs from the 4.3BSD Lite operating system, a version of Unix developed at the University of California, Berkeley (BSD = Berkeley Software Distribution), and from the 386BSD system, the first BSD port to the Intel 386 CPU. In the following years, modifications from the 4.4BSD Lite release (the last release from the Berkeley group) were integrated into the system. The BSD branch of Unix has had a great importance and influence on the history of Unix-like operating systems, to which it has contributed many tools, ideas and improvements which are now standard: the vi editor, the C shell, job control, the Berkeley fast file system, reliable signals, support for virtual memory and TCP/IP, just to name a few. This tradition of research and development survives today in the BSD systems and, in particular, in NetBSD.
NetBSD operates on a vast range of hardware platforms and is very portable. The full source to the NetBSD kernel and userland is available for all the supported platforms; please see the details on the official site of the NetBSD Project.
A detailed list of NetBSD features can be found at: http://www.NetBSD.org/about/features.html.
The basic features of NetBSD are:
Code quality and correctness
Portability to a wide range of hardware
Secure defaults
Adherence to industry standards
Research and innovation
These characteristics bring also indirect advantages. For example, if you work on just one platform you could think that you're not interested in portability. But portability is tied to code quality; without a well written and well organized code base it would be impossible to support a large number of platforms. And code quality is the base of any good and solid software system, though surprisingly few people seem to understand it.
One of the key characteristics of NetBSD is that its developers are not satisfied with partial implementations. Some systems seem to have the philosophy of “If it works, it's right”. In that light NetBSD's philosophy could be described as “It doesn't work unless it's right”. Think about how many overgrown programs are collapsing under their own weight and “features” and you'll understand why NetBSD tries to avoid this situation at all costs.
NetBSD supports many platforms, including the popular PC platform (i386 and amd64), SPARC and UltraSPARC, Alpha, Amiga, Atari, and m68k and PowerPC based Apple Macintosh machines. Technical details for all of them can be found on the NetBSD site.
The NetBSD site states that: “The NetBSD Project provides a freely available and redistributable system that professionals, hobbyists, and researchers can use in whatever manner they wish”. It is also an ideal system if you want to learn Unix, mainly because of its adherence to standards (one of the project goals) and because it works equally well on the latest PC hardware as well as on hardware which is considered obsolete by many other operating systems. To learn and use Unix you don't need to buy expensive hardware; you can use that old PC or Mac in your attic. It is important to note that although NetBSD runs on old hardware, modern hardware is well supported and care has been taken to ensure that supporting old machines does not inhibit performance on modern hardware. In addition, if you need a Unix system which runs consistently on a variety of platforms, NetBSD is probably your best choice.
Aside from the standard Unix productivity tools, editors, formatters, C/C++ compilers and debuggers and so on that are included with the base system, there is a huge collection of packages (currently over 8,000) that can be installed both from source and in pre-compiled form. All the packages that you expect to find on a well configured system are available for NetBSD for free. The framework that makes this possible, pkgsrc, also includes a number of commercial applications. In addition, NetBSD provides binary emulation for various other *nix operating systems, allowing you to run non-native applications. Linux emulation is probably the most relevant example. You can run the Linux versions of
Firefox
the Adobe Flash player plugin
Acrobat Reader
many other programs
NetBSD is an Open Source operating system, and as such it is freely available for download from ftp.NetBSD.org and its mirrors.
There is no “official” supplier of NetBSD CD-ROMs but there are various resellers. You can find the most up to date list on the relevant page on the NetBSD site.
Table of Contents
Table of Contents
It is possible to install NetBSD together with other operating systems on one hard disk.
If there is already an operating system on the hard disk, think about how you can free some space for NetBSD; if NetBSD will share the disk with other operating systems you will probably need to create a new partition (which you will do with sysinst). Often times this will not be possible unless you resize an existing partition.
Unfortunately, it is not possible to resize an existing partition with sysinst, but there are some commercial products (like Partition Magic) and some free tools (GNU Parted, FIPS, pfdisk) available for this.
You can also install NetBSD on a separate hard disk.
Unless you are comfortable with setting up a partitioning scheme for two or more operating systems, and unless you understand the risk of data loss if you should make a mistake, it is recommended that you give NetBSD its own hard disk. This removes the risk of damage to the existing operating system.
It is possible to install and run NetBSD on top of other operating systems without having to worry about partitioning. Emulators or virtualization environments provide a quick and secure way to try out NetBSD. The host operating system remains unchanged, and the risk of damaging important data is minimized.
Information about NetBSD as a Xen host and guest system is available on the NetBSD/xen web page.
The NetBSD on emulated hardware web page provides detailed information about various emulators and the supported NetBSD platforms. It should also be noted that NetBSD runs as a VMware guest.
The first thing to do before installing NetBSD is to read the
release information and installation notes in one of the
INSTALL files: this is the official
description of the installation procedure, with platform-specific
information and important details. It is available in HTML, PostScript,
plain text, and an enhanced text format to be used with
more. These
files can be found in the root
directory of the NetBSD release (on the install CD or on the FTP
server). For example:
ftp://ftp.NetBSD.org/pub/NetBSD/NetBSD-5.0/port/INSTALL.html
The terminology used by NetBSD for partitioning is different from the typical DOS/Windows terminology; in fact, there are two partitioning schemes involved when running NetBSD on a typical PC. NetBSD installs in one of the four primary BIOS partitions (the partitions defined in the hard disk partition table).
Within a BIOS partition (also called slice) NetBSD defines its BSD partitions using a disklabel: these partitions can be seen only by NetBSD and are identified by lowercase letters (starting with “a”). For example, wd0a refers to the “a” partition of the first IDE disk (wd0) and sd0a refers to the “a” partition of the first SCSI disk. In Figure 2.1, “Partitions” there are two primary BIOS partitions, one used by DOS and the other by NetBSD. NetBSD describes the disk layout through the disklabel.
The meaning of partitions “c” and “d” is typical of the i386 port. On most other ports, “c” represents the whole disk.
If NetBSD shares the hard disk with another operating system (like in the previous example) you will want to install a boot manager, i.e., a program which lets you choose which OS to start at boot time. sysinst can do this for you and will ask if you want to install one. Unless you have specific reasons not to, you should let sysinst perform this step.
The exact amount of space required for a given NetBSD installation varies depending on the platform being used and which distribution sets are selected. In general, if you have 1GB of free space on your hard drive, you will have more than enough space for a full installation of the base system.
If you plan to fetch distribution sets over the network (not necessary if you downloaded a full-size install ISO) and do not use DHCP, write down your basic network settings. You will need:
Your IP address (example: 192.168.1.7)
the netmask (example: 255.255.255.0)
the IP address of your default gateway (example: 192.168.1.1)
the IP address of the DNS server you use (example: 145.253.2.75)
Before you begin the installation, make sure that you have a reliable backup of any operating systems and data on the used hard disk. Mistakes in partitioning your hard disk can lead to data loss. Existing operating systems may become unbootable. "Reliable backup" means that the backup and restore procedure is tested and works flawlessly!
The NetBSD installation system consists of two parts. The first part is the installation kernel. This kernel contains the NetBSD install program sysinst and it is booted from a CD (or DVD), memory card, USB flash drive, or floppy disk. The sysinst program will prepare the disk: it separates the disk space into partitions, makes the disk bootable and creates the necessary file systems.
The second part of the install system is made up of the binary distribution sets: the files of the NetBSD operating system. The installer needs to have access to the distribution sets. sysinst will usually fetch these files from the CD or DVD you burned, but it can also get them via FTP, NFS, or local filesystem.
The NetBSD Project provides complete install media for every
supported hardware architecture. This is usually in the form of
bootable CD images (.iso files). For example:
ftp://ftp.NetBSD.org/pub/NetBSD/iso/5.0/
Please see the list of mirrors and choose a local server near you for downloads
To use a bootable NetBSD install CD
download the iso file for your hardware
architecture and burn it to a CD or DVD. You will need to handle
this step alone, as burning programs vary widely. Ensure that
your computer is set up to boot from CD-ROM before hard drives,
insert the disc, and reboot the computer.
If you need to create installation floppies, you need to
copy floppy images to a diskette. The floppy images are available
on the NetBSD FTP servers or on a NetBSD install CD.
To perform this operation in DOS you can use the
rawrite program in the
i386/installation/misc directory. For
Windows, there's a version in rawr32.zip.
The image files are
i386/installation/floppy/boot1.fs and
i386/installation/floppy/boot2.fs for
installation of a “normal” PC.
The other floppies that are available are described in more detail
in the INSTALL document.
Before you write the boot images to floppies, you should always check that the floppies are good: this simple step is often overlooked, but can save you a lot of trouble!
The procedure to write floppies is:
Format the floppy.
Go to the I386\INSTALLATION\FLOPPY directory
of the CD-ROM.
Run the
..\MISC\RAWRITE
program (or extract ..\MISC\RAWR32.ZIP
if you're on a Windows system, and run the RAWRITE32 program
in that file). Usually the “Source file”s are
BOOT1.FS and
BOOT2.FS and the
“Destination drive” is A:
To create a boot floppy in a Unix environment, the dd command can be used: For example:
#cd i386/installation/floppy#dd if=boot.fs of=/dev/fd0a bs=36b
A 1440K floppy contains 1474560 bytes and is made up of 80
cylinders, 2 tracks, 18 sectors and 512 bytes per sector, i.e., 80 *
2 * 18 = 2880 blocks.
Thus bs=36b copies one cylinder (18 * 2 blocks) at
a time and repeats the operation 80 times instead of 2880.
This is the checklist about the things that should be clear and on-hand now:
Available disk space
Bootable medium with the install system
CD/DVD or server with the distribution sets
Your network information (only if you will be fetching distribution sets via the network and do not use DHCP)
A working backup
A printout of the INSTALL document
Table of Contents
This chapter will guide you through the installation process. The concepts presented here apply to all installation methods. The only difference is in the way the distribution sets are fetched by the installer. Some details of the installation differ depending on the NetBSD release: The examples from this chapter were created with NetBSD 5.0.
The following install screens are just examples. Do not simply copy them, as your hardware and configuration details may be different!
The installation process is divided logically in two parts. In the first part you create a partition for NetBSD and write the disklabel for that partition. In the second part you decide which distribution sets (subsets of the operating system) you want to install and then extract the files into the newly created partition(s).
The NetBSD install program sysinst allows you to change the keyboard layout during the installation. If for some reason this does not work for you, you can use the map in the following table.
| US | IT | DE | FR |
|---|---|---|---|
| - | ' | ß | ) |
| / | - | - | ! |
| = | ì | ' | - |
| : | ç | Ö | M |
| ; | ò | ö | m |
| # | £ | § | 3 |
| " | ° | Ä | % |
| * | ( | ( | 8 |
| ( | ) | ) | 9 |
| ) | = | = | 0 |
| ' | à | ä | ù |
| ` | \ | ^ | @ |
| \ | ù | # | ` |
To start the installation of NetBSD, insert your chosen boot media (CD/DVD, USB drive, floppy, etc.) and reboot the computer. The kernel on the installation medium will be booted and start displaying a lot of messages on the screen about hardware being detected.
When the kernel has booted you will find yourself in the NetBSD
installation program, sysinst, shown in
Figure 3.1, “Selecting the language”.
From here on you should follow the instructions displayed on the
screen, using the INSTALL document as a companion
reference. You will find the INSTALL document in various
formats in the root directory of the NetBSD release.
The sysinst screens all have more or less
the same layout: the upper part of the screen shows a short
description of the current operation or a short help message, and the
rest of the screen is made up of interactive menus and prompts.
To make a choice, use the cursor keys, the
“Ctrl+N” (next) and “Ctrl+P”
(previous) keys, or press one of the letters displayed left of
each choice. Confirm your choice by pressing the Return
key.
Start by selecting the language you prefer to use for the installation process.
The next screen Figure 3.2, “Selecting a keyboard type” will allow you to select a suitable keyboard type.
This will bring you to the main menu of the installation program (Figure 3.3, “The sysinst main menu”).
Choosing the “Install NetBSD to hard disk” option brings you to the next screen (Figure 3.4, “Confirming to install NetBSD”), where you need to confirm that you want to continue the installation.
After choosing “Yes” to continue, sysinst displays a list of one or more disks and asks which one you want to install NetBSD on. In the example given in Figure 3.5, “Choosing a hard disk”, there are two disks, and NetBSD will be installed on “wd0”, the first IDE disk found. If you use SCSI or external USB disks, the first will be named “sd0”, the second “sd1” and so on.
The installer will then ask whether you want to do a full, minimal or custom installation. NetBSD is broken into a collection of distributions sets. “Full installation” is the default and will install all sets; “Minimal installation” will only install a small core set, the minimum of what is needed for a working system. If you select “Custom installation” you can select which sets you would like to have installed. This step is shown in Figure 3.6, “Full or custom installation”.
If you choose to do a custom installation, sysinst will allow you to choose which distribution sets to install, as shown in Figure 3.7, “Selecting distribution sets”. At a minimum, you must select a kernel and the “Base” and “System (/etc)” sets.
The first important step of the installation has come: the partitioning of the hard disk. First, you need to specify whether NetBSD will use a partition (suggested choice) or the whole disk. In the former case it is still possible to create a partition that uses the whole hard disk (Figure 3.8, “Choosing the partitioning scheme”) so we recommend that you select this option as it keeps the BIOS partition table in a format which is compatible with other operating systems.
The next screen shows the current state of the MBR partition table on the hard disk before the installation of NetBSD. There are four primary partitions, and as you can see, this example disk is currently empty. If you do have other partitions you can leave them around and install NetBSD on a partition that is currently unused, or you can overwrite a partition to use it for NetBSD.
Deleting a partition is simple: after selecting the partition, a menu with options for that partition will appear (Figure 3.10, “Partition options”). Change the partition kind to “Delete partition” to remove the partition. Of course, if you want to use the partition for NetBSD you can set the partition kind to “NetBSD”.
You can create a partition for NetBSD by selecting the partition you want to install NetBSD to. The partition names “a” to “d” correspond to the four primary partitions on other operating systems. After selecting a partition, a menu with options for that partition will appear, as shown in Figure 3.10, “Partition options”.
To create a new partition, the following information must be supplied:
the type (kind) of the new partition
the first (start) sector of the new partition
the size of the new partition
Choose the partition type “NetBSD” for the new partition (using the “type” option). The installation program will try to guess the “start” position based on the end of the preceding partition. Change this value if necessary. The same thing applies to the “size” option; the installation program will try to fill in the space that is available until the next partition or the end of the disk (depending on which comes first). You can change this value if it is incorrect, or if you do not want NetBSD to use the suggested amount of space.
After you have chosen the partition type, start position, and size, it is a good idea to set the name that should be used in the boot menu. You can do this by selecting the “bootmenu” option and providing a label, e.g., “NetBSD”. It is a good idea to repeat this step for other bootable partitions so you can boot both NetBSD and a Windows system (or other operating systems) using the NetBSD bootselector. If you are satisfied with the partition options, confirm your choice by selecting “Partition OK”. Choose “Partition table OK” to leave the MBR partition table editor.
If you have made an error in partitioning (for example you have created overlapping partitions) sysinst will display a message and suggest that you go back to the MRB partition editor (but you are also allowed to continue). If the data is correct but the NetBSD partition lies outside the range of sectors which is bootable by the BIOS, sysinst will warn you and ask if you want to proceed anyway. Doing so may lead to problems on older PCs.
This is not a limitation of NetBSD. Some old BIOSes cannot boot a partition which lies outside the first 1024 cylinders. To fully understand the problem you should study the different type of BIOSes and the many addressing schemes that they use (physical CHS, logical CHS, LBA, ...). These topics are not described in this guide.
On modern computers (those with support for int13 extensions), it is possible to install NetBSD in partitions that live outside the first 8 GB of the hard disk, provided that the NetBSD boot selector is installed.
Next, sysinst will offer to install a boot selector on the hard disk. This screen is shown in Figure 3.11, “Installing the boot selector”.
At this point, the BIOS partitions (called slices on BSD systems) have been created. They are also called PC BIOS partitions, MBR partitions or fdisk partitions.
Do not confuse the slices or BIOS partitions with the BSD partitions, which are different things.
Some platforms, like PC systems (amd64 and i386), use DOS-style MBR partitions to separate file systems. The MBR partition you created earlier in the installation process is necessary to make sure that other operating systems do not overwrite the diskspace that you allocated to NetBSD.
NetBSD uses its own partition scheme, called a disklabel, which is stored at the start of the MBR partition. In the next few steps you will create a disklabel(5) and set the sizes of the NetBSD partitions, or use existing partition sizes, as shown in Figure 3.12, “Edit partitions?”.
When you choose to set the sizes of the NetBSD partitions you can define the partitions you would like to create. The installation program will generate a disklabel based on these settings. This installation screen is shown in Figure 3.13, “Setting partition sizes”.
The default partition scheme of just using a big
/ (root) file system (plus swap) works
fine with NetBSD, and there is little need to change this.
Figure 3.13, “Setting partition sizes” shows how to change the
size of the swap partition to 600 MB.
Changing /tmp to reside on a
RAM disk
(mfs(8)) for extra speed may be a good idea. Other partition
schemes may use separate partitions for
/var, /usr and/or
/home, but you should use your own
experience to decide if you need this.
The next step is to create the disklabel and edit its partitions, if necessary, using the disklabel editor (Figure 3.14, “The disklabel editor”). If you predefined the partition sizes in the previous step, the resulting disklabel will probably fit your wishes. In that case you can complete the process immediately by selecting “Partition sizes ok”.
There are two reserved partitions, “c”, representing the NetBSD partition, and “d”, representing the whole disk. You can edit all other partitions by using the cursor keys and pressing the return key. You can add a partition by selecting an unused slot and setting parameters for that partition. The partition editing screen is shown in Figure 3.15, “Disklabel partition editing”.
After defining the partitions in the new disklabel, the last item is to enter a name for the NetBSD disk as shown in Figure 3.16, “Naming the NetBSD disk”. This can be used later to distinguish between disklabels of otherwise identical disks.
The installer now has all the data it needs to prepare the disk. Nothing has been written to the disk at this point but, and now is your last chance to abort the installation process before actually writing data to the disk. Choose “no” to abort the installation process and return to the main menu, or continue by selecting “yes”.
After confirming that sysinst should prepare the disk, it will run disklabel(8) to create the NetBSD partition layout and newfs(8) to create the file systems on the disk.
After preparing the NetBSD partitions and their filesystems, the next question (shown in Figure 3.18, “Selecting bootblocks”) is which bootblocks to install. Usually you will choose the default of BIOS console, i.e., show boot messages on your computer's display.
If you run a farm of machines without monitor, it may be more convenient to use a serial console running on one of the serial ports. The menu also allows changing the serial port's baud rate from the default of 9600 baud, 8 data bits, no parity and one stopbit.
At this point, you have finished the first and most difficult part of the installation!
The second half of the installation process consists of populating the file systems by extracting the distribution sets that you selected earlier (base, compiler tools, games, etc). Before unpacking the sets, sysinst asks what information you would like to see during that process, as shown in Figure 3.19, “Choosing the verbosity of the extraction process”. You can choose between a progress bar, a display of the name of each extracted file, or nothing.
Now sysinst needs to find the NetBSD
sets and you must tell it where to find them. The menu offers several
choices, as shown in
Figure 3.20, “Installation media”. The options are explained in
detail in the INSTALL documents.
When selecting “CD-ROM / DVD”,
sysinst asks the name of the CD-ROM
or DVD device and the directory in which the set files are
stored, see Figure 3.21, “CD-ROM/DVD installation”. The device is usually
cd0 for the first CD-ROM or DVD drive,
regardless of whether it is IDE or SCSI (or even USB or FireWire).
If you don't know the name of the CD-ROM/DVD device, you can find by doing the following:
Press Ctrl-Z to pause sysinst and go to the shell prompt.
Type the command:
#dmesg
This will show the kernel startup messages, including the name of the CD-ROM device, for example cd0.
If the display scrolls too quickly, you can also use more:
#dmesg | more
Go back to the installation program with the command:
#fg
Figure 3.22, “Mounting a file system” shows the menu to install NetBSD from an unmounted file system. It is necessary to specify the device ("Device"), the file system of the device ("File system") and the path to the install sets ("Set directory"). The setting for the "Base directory" is optional and can be kept blank.
In the following example the install sets are stored on a MSDOS file system, on partition "e" on the device "sd0".
It is usually necessary to specify the device name and the partition. Figure 3.23, “Mounting a partition ” shows how to specify device "sd0" with partition "e".
In Figure 3.24, “Accessing a MSDOS file system” the file system type is specified. It is “msdos” but it could also be the NetBSD file system “ffs” or “ext2fs”, a Linux file system. The “Base directory” item is left blank and the binary sets are stored under “/sets”. Choosing “Continue” will start the extraction of the sets.
If you choose to install from a local network or the Internet via FTP, sysinst will configure the system's network connection, download the selected set files to a temporary directory, and then extract them.
NetBSD currently supports installation via ethernet, USB ethernet or wireless, and wireless LAN. Installation via DSL (PPP over Ethernet) is not supported during installation.
The first step shown in Figure 3.25, “Which network interface to configure” consists of selecting which network card to configure. sysinst will determine a list of available network interfaces, present them and ask which one to use.
The exact names of your network interfaces depend on the hardware you use. Example interfaces are “wm” for Intel Gigabit interfaces, “ne” for NE2000 and compatible ethernet cards, and “ath” for Atheros based wireless cards. This list is by no means complete, and NetBSD supports many more network devices.
To get a list of network interfaces available on your system, interrupt the installation process by pressing “Ctrl+Z”, then enter
#ifconfig -ane2: flags=8822<UP,BROADCAST,NOTRAILERS,SIMPLEX,MULTICAST> mtu 1500 address: 00:06:0d:c6:73:d5 media: Ethernet autoselect 10baseT full-duplex status: active inet 0.0.0.0 netmask 0xffffff00 broadcast 0.0.0.0 inet6 fe80::206:dff:fec6:73d5%ne2 prefixlen 64 scopeid 0x1 lo0: flags=8009<UP,LOOPBACK,MULTICAST> mtu 33196 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 ppp0: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 ppp1: flags=8010<POINTOPOINT,MULTICAST> mtu 1500 sl0: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 296 sl1: flags=c010<POINTOPOINT,LINK2,MULTICAST> mtu 296 strip0: flags=0 mtu 1100 strip1: flags=0 mtu 1100
To get more information about all the devices found during system startup, including network devices, type
#dmesg | more
You can return to the NetBSD installation by typing
#fg
Next, you have a chance to set your network medium.
It is unlikely that you will need to enter anything other than the default here. If you experience problems like very slow transfers or timeouts, you may, for example, force different duplex settings for ethernet cards. To get a list of supported media and media options for a given network device (ne2, for example), escape from sysinst by pressing “Ctrl+Z”, then enter:
#ifconfig -m ne2ne2: flags=8822<UP,BROADCAST,NOTRAILERS,SIMPLEX,MULTICAST> mtu 1500 address: 00:03:0d:c6:73:d5 media: Ethernet 10baseT full-duplex status: active supported Ethernet media: media 10baseT media 10baseT mediaopt full-duplex media 10base2 media autoselect
The various values printed after “media” may be of interest here, including keywords like “autoselect” but also including any “mediaopt” settings.
Return to the installation by typing:
#fg
The next question will be whether you want to perform DHCP autoconfiguration as shown in Figure 3.26, “Using DHCP for network configuration”. Answer “Yes” if you have a DHCP Dynamic Host Configuration Protocol (DHCP) running somewhere on your network, and sysinst will fetch a number of defaults from it. Answer “No” to enter all the values manually.
We will assume you answered “No” and go into all the questions asked in detail.
Figure 3.27, “Entering and configuring network data” shows the questions asked for the network configuration. The values to be entered are:
This is the name of the domain you are in.
The name by which other machines can usually address your computer. Not used during installation.
Enter your numerical Internet Protocol address in “dotted quad” notation here, for example, 192.168.1.3
The netmask for your network, either given as a hex value (“0xffffff00”) or in dotted-quad notation (“255.255.255.0”).
Your router's (or default gateway's) IP address. Do not use a hostname here!
Your (first) DNS server's IP address. Again, don't use a hostname.
After answering all of your network configuration info, it will be displayed, and you will have a chance to go back and make changes (Figure 3.28, “Confirming network parameters”).
sysinst will now run a few commands (not displayed in detail here) to configure the network: flushing the routing table, setting the default route, and testing if the network connection is operational.
Now that you have a functional network connection, you must tell the installer how to get the distribution sets, as shown in Figure 3.29, “Defining the FTP settings”.
When you are satisfied with your settings (the defaults work most of the time), choose “Get Distribution” to continue.
If you want to install NetBSD from a server in your local network, NFS is an alternative to FTP.
Using this installation method requires the ability to set up an NFS server, a topic which is not discussed here.
As shown in Figure 3.30, “NFS install screen”, you must specify the IP address of the NFS server with "Host", the "Base directory" that is exported by the NFS server, and the "Set directory", which contains the install sets.
Figure 3.31, “NFS example” shows an example: Host “192.168.1.50 ” is the NFS server that provides the directory “/home/username/Downloads” The NetBSD install sets are stored in the directory “/home/username/Downloads/sets” on the NFS server. Choose “Continue” to start the installation of the distribution sets.
After the method for obtaining distribution sets has been chosen, and (if applicable) after those sets have been transferred, they will be extracted into the new NetBSD file system.
After extracting all selected sets,
sysinst will create device nodes in
the /dev directory and then display a
message saying that everything went well.
Another message (see Figure 3.32, “Extraction of sets completed”) will let you know that the set extraction is now completed, and that you will have an opportunity to configure some essential things before finishing the NetBSD installation.
The first thing you can configure is your timezone. It is Universal Time Coordinated (UTC) by default, and you can use the two-level menu of continents/countries and cities shown in Figure 3.33, “Selecting the system's time zone” to select your timezone with the Return key. Next, press “x” followed by Return to exit timezone selection.
At this point, you are given the option to choose a password encryption scheme. While “DES” is the standard algorithm used on most Unix systems, “MD5”, “Blowfish”, and “SHA1” allow longer passwords than DES, which only uses the first eight characters of the password that is entered. DES is still useful for interoperability with other operating systems.
After choosing the password cipher you are asked if you want to set the root password. It is recommended to set a root password at this point for security reasons.
When you agree to set a root password, sysinst will run the passwd(1) utility for you. Please note that the password is not echoed.
The next menu allows you to choose which command line interpreter - also known as a “shell” - will be used for the root account. The default is the classic Bourne shell, sh(1). Other choices are the Korn shell (ksh(1)) and the C shell (csh(1)). If, upon reading this, you don't have some idea of which shell you prefer, simply use the default, as this is a highly subjective decision. Should you later change your mind, root's shell can always be changed.
At this point the installation is finished.
After passing the dialog that confirms the installation, sysinst will return to the main menu. Remove any installation media (CD, floppy, etc.) and choose “Reboot the computer” to boot your new NetBSD installation.
Table of Contents
This chapter describes the binary upgrade of a NetBSD system. To do the upgrade, you must have some form of bootable media (CD-ROM, USB drive, floppy, etc.) available and at least the base and kern distribution sets. Since files already installed on the system are overwritten in place, you only need additional free space for files which weren't previously installed or to account for growth of the sets between releases. Usually this is not more than a few megabytes.
Since upgrading involves replacing the kernel, boot blocks, and most of the system binaries, it has the potential to cause data loss. Before beginning, you are strongly advised to back up any important data on the NetBSD partition or on any other partitions on your disk.
The upgrade procedure is similar to an installation, but without
the hard disk partitioning. sysinst will
attempt to merge the settings stored in your /etc
directory with the new version of NetBSD. Also, file systems are checked
before unpacking the sets. Fetching the binary sets is done in the same
manner as in the installation procedure.
Before doing an upgrade it is essential to read the
release information and upgrading notes in one of the
INSTALL files: this is the official
description of the upgrade procedure, with platform specific
information and important details. It can be found in the root
directory of the NetBSD release (on the install CD or on the FTP
server)
It is advisable to print the INSTALL document out. It is available in four formats: .txt, .ps, .more, and .html
The following section provides an overview of the binary upgrade process. Most of the following sysinst dialogs are similar to those of the installation process. More verbose descriptions and explanations of the dialogs are available in Chapter 3, Example installation.
After selecting the installation language and the keyboard type, the main menu appears. Choosing option “b: Upgrade NetBSD on a hard disk” will start the the upgrade process.
The dialog in Figure 4.2, “Continuing the upgrade” will request permission to continue with the upgrade. At this point nothing has been changed yet and the upgrade can still be cancelled. This is a good time to ask yourself whether you have made a backup, and if you know for certain that you will be able to restore from it.
After choosing to continue with “Yes”, the next dialog will ask you to specify the hard disk with the NetBSD system that shall be upgraded. If more than one disk is available a list of the disks will be displayed.
The system used for the example has only one hard disk available: “wd0”.
The following dialog provides a menu to choose the installation type. The choices are “Full installation”, “Minimal installation”, or “Custom installation”.
At this point, sysinst will perform a check of the file system to ensure its integrity.
The next step is to choose which type of bootblocks to install.
The next dialog will ask how much information should be displayed during the extraction of the distribution sets.
The following dialog asks for the install method of choice and provides a list of possible options. The install medium contains the new NetBSD distribution sets. You will be prompted for different information depending on which option you choose. For example, a CD-ROM or DVD install requires you to specify which device to use and which directory the sets are in, while an FTP install requires you to configure your network and specify the hostname of an FTP server. More details can be found in Section 3.10, “Choosing the installation media”.
sysinst will now unpack the distribution
sets, replacing your old binaries. After unpacking these sets, it
runs the postinstall script to clean up
various things. If no problems occur, you are done. If
postinstall produces errors, you will have to
manually resolve the issues it brings up. See postinstall's man
page for more information.
You should also read the remarks in INSTALL about
upgrading, as specific compatibility issues are documented there.
When you are back at the main menu, remove the boot medium (if applicable) and reboot. Have fun with your new version of NetBSD!
Table of Contents
Table of Contents
After installing and rebooting, the computer will boot from the hard disk. If everything went well you'll be looking at the login prompt within a few seconds (or minutes, depending on your hardware). The system is not yet fully configured, but basic configuration is easy. You will see how to quickly configure some important things, and in doing so you will learn some basics about how the system works.
If the system does not boot it could be that the boot manager was not installed correctly or that there is a problem with the MBR (Master Boot Record). Boot the machine from your install medium (CD, DVD, floppy, etc.) and when you see the boot menu, select the option to drop to the boot prompt.
type "?" or "help" for help.>?commands are: boot [xdNx:][filename] [-12acdqsvxz] (ex. "hd0a:netbsd.old -s") ls [path] dev xd[N[x]]: consdev {pc|com[0123]|com[0123]kbd|auto} modules {enabled|disabled} load {path_to_module} multiboot [xdNx:][filename] [<args>] help|? quit>boot hd0a:netbsd
The system should now boot from the hard disk. If NetBSD boots correctly from the hard disk, there is probably a Master Boot Record problem. You can install the boot manager or modify its configuration with the fdisk -B command. See Section 22.1, “Installing the boot manager” for a detailed description.
If you or the installation software haven't done any configuration
of /etc/rc.conf
(sysinst normally will), the system will
drop you into single user mode and show the message
/etc/rc.conf is not configured. Multiuser boot aborted
When the system asks you to choose a shell, simply press
RETURN to get to a /bin/sh prompt. If you are
asked for a terminal type, respond with vt220
(or whatever is appropriate for your terminal type) and press RETURN.
You may need to type one of the following commands to get your delete
key to work properly, depending on your keyboard:
#stty erase '^h'#stty erase '^?'
At this point, you need to configure at least one file in the
/etc directory. However, the root file system
(/) is mounted read-only, so you will first need to
make it writable with:
#/sbin/mount -u -w /
Next, take a look at the /etc/rc.conf file.
Modify it to your tastes, making sure that you set
“rc_configured=YES ” so that you don't end
up in this position again. Default values for the various programs can be
found in /etc/defaults/rc.conf.
More complete documentation can be found in rc.conf(5).
When you have finished, type exit at the prompt to leave the single-user shell and continue with the multi-user boot.
If you have never used a Unix(-like) operating system before, your best friend is now the man command, which displays a manual page. The NetBSD manual pages are among the best and most detailed you can find, although they are very technical.
A good manual to read after booting a new NetBSD system is afterboot(8). It contains information about various necessary and useful configuration settings.
man name shows the man page of the
“name”
command and man -k name shows a list of man pages
dealing with “name” (you can also use the
apropos command).
To learn the basics of the man command, type:
#man man
Manual pages contain not only information about commands but also descriptions of some NetBSD features and structures. For example, take a look at the hier(7) man page, which describes in detail the layout of the filesystem used by NetBSD.
#man hier
Other similar pages are release(7) and pkgsrc(7).
#man 8 intro
Manual pages are divided in several sections, depending on what they document:
general commands (tools and utilities), see intro(1)
system calls and error numbers, see intro(2)
C libraries, see intro(3)
special files and hardware support, see intro(4)
file formats, see intro(5)
games, see intro(6)
miscellaneous information pages, see intro(7)
system maintenance and operation commands, see intro(8)
kernel internals, see intro(9)
A subject may appear in more than one section of the manual; to view a specific page, supply the section number as an argument to the man command. For example, time appears in section 1 (the time user command) and in section 3 (the time function of the C library). To see the man page for the time C function, write:
#man 3 time
To see all the available pages:
#man -w time#man -a time
Other than a shell, a text editor is the most essential tool for NetBSD system administration.
There are two provided in the base system
ed(1), a line orientated text editor.
ed is a very simplistic text editor.
It has a command mode (active when first started) and an input mode.
Its primary advantage is that it will work even without a correct
terminal type set. In an emergency, ed is
worth knowing, but note that vi(1) is now available in
/rescue, which brings us to...
vi(1), a screen orientated text editor. vi is the only screen editor available in the base install, and requires a valid terminal type to run. Refer to Chapter 6, Editing to learn more about NetBSD's default editor.
Before you continue you should know or learn how to open, edit and save files within vi. Make sure to read Chapter 6, Editing.
For the first login you will use the root
user, which is the only user defined at the end of the
installation.
At the password prompt type the password for root that you
set during the installation.
If you didn't set a password, just press Enter.
NetBSD/i386 (Amnesiac) (ttyE0)login:rootpassword:We recommend creating a non-root account and using su(1) for root access.#
If you did not set a password for root
during the installation, you should use the
/usr/bin/passwd command to do so now.
#/usr/bin/passwdChanging local password for root. New password: Retype new password:
Passwords are not displayed on the screen while you type.
Choose a password that has numbers, digits, and special characters (not space) as well as from the upper and lower case alphabet. Do not choose any word in any language. It is common for an intruder to use dictionary attacks.
For security reasons, it is bad practice to login as root during
regular use and maintenance of the system. Instead, administrators are
encouraged to add a regular user, add the user to the
wheel group, then use the su(1) command when
root privileges are required. NetBSD offers the useradd(8) utility
to create user accounts. For example, to create a new user:
#useradd -m joe
The defaults for the useradd command can be changed; see the useradd(8) man page.
User accounts that can su to root are required to be in the "wheel" group. This can be done when the account is created by specifying a secondary group:
#useradd -m -G wheel joe
As an alternative, the usermod(8) command can be used to add a user to an existing group:
#usermod -G wheel joe
In case you just created a user but forgot to set a password, you can still do that later using the passwd(1) command.
#passwd joe
You can edit /etc/group directly to add
users to groups, but do not edit
the /etc/passwd directly; use vipw(8).
Shadow passwords are enabled by default. What this means is that
all the passwords in /etc/passwd
are simply “*”; the encrypted passwords are stored in
a file that can only be read by root,
/etc/master.passwd.
When you start vipw(8) to edit the password file, the program
opens a copy of /etc/master.passwd; when you exit,
vipw checks the validity of the copy,
creates a new /etc/passwd and installs the
new /etc/master.passwd file.
Finally, vipw launches
pwd_mkdb(8), which creates the files
/etc/pwd.db and
/etc/spwd.db, two databases which are equivalent to
/etc/passwd and
/etc/master.passwd but faster to process.
It is very important to always use
vipw and the other tools for account
administration (chfn(1), chsh(1),
chpass(1), passwd(1)) and to
never directly modify
/etc/master.passwd or
/etc/passwd.
If you do not have a US layout keyboard, you will probably want to change keymaps. For example, to use an italian keyboard, enter the following command:
#wsconsctl -k -w encoding=itencoding -> it
To save the keyboard layout permanently, add the following line to the
/etc/wscons.conf file:
encoding it
See Section 8.1.2.1, “Keyboard mappings” for a list of available keymaps.
NetBSD, like all Unix systems, uses a system clock based on
Greenwich time (GMT) and this is what you should set your system
clock to.
If you want to keep the system clock set to the local time
(because, for example, you have a dual boot system with Windows
installed), you must notify NetBSD, adding
rtclocaltime=YES
to /etc/rc.conf:
#echo rtclocaltime=YES >> /etc/rc.conf#sh /etc/rc.d/rtclocaltime restart
The number of minutes west of GMT is calculated
automatically and is set in the kern.rtc_offset
sysctl variable.
To display the current setting of the
kern.rtc_offset variable:
#sysctl kern.rtc_offsetkern.rtc_offset = -60
This automatic configuration only works if you have set the proper
time zone with a symbolic link to /etc/localtime.
Normally this is done as part of the install procedure, but if for some
reason it wasn't, you can set it by creating a symbolic link from a
file in the /usr/share/zoneinfo directory to
/etc/localtime.
The following example sets the time zone to Eastern Europe Summer Time:
#ln -fs /usr/share/zoneinfo/Europe/Helsinki /etc/localtime
By default, all services are disabled in a fresh NetBSD
installation, and ssh(1) is no exception.
You may wish to enable it so you can log in to your system remotely.
Set sshd=YES in
/etc/rc.conf and then start the
server with the command
#/etc/rc.d/sshd start
The first time the server is started, it will generate a new
keypair, which will be stored inside the directory
/etc/ssh.
NetBSD uses /etc/rc.conf to determine what
will be executed when the system boots. Understanding this file is
important. The rc.conf(5) manual page contains a
detailed description of all available options.
The /etc/defaults/rc.conf file
contains the default values for most settings. To override a default
value, the new value must be put into /etc/rc.conf.
The definitions there override the ones in
/etc/defaults/rc.conf (which you should leave
unchanged).
#man rc.conf
The first modifications are:
Set “rc_configured=YES”
(this modification should already have been done by the
installation software.)
Set “dhclient=YES”
to configure your system's network using DHCP.
Define a hostname for your machine
(use a fully qualified hostname, i.e., one including domain).
If you have a standalone machine you can use any name (for
example, vigor3.your.domain).
If your machine is connected to a network, you should supply
the correct name.
If your are connected to a local network or the Internet through a
router, set the defaultroute variable to the IP
address of your router (sometimes called a
default gateway). For example,
“defaultroute=192.168.1.1”.
To resolve the names and IP addresses of remote hosts, the system
needs access to a (remote or local) DNS nameserver.
Tell the system which nameserver(s) to use by adding the IP address of one
or more nameservers to the /etc/resolv.conf file,
using the following as an example:
nameserver 145.253.2.75
To set the names of local hosts that are not available through DNS,
edit the /etc/hosts file, which has the form:
IP-addresshostnamehost
For example:
192.168.1.3vigor3.your.domainvigor3
New users are often surprised by the fact that although the installation program recognized and mounted their CD-ROM perfectly, the installed system seems to have “forgotten” how to use the CD-ROM. There is no special magic for using a CD-ROM; you can mount it like any other file system. All you need to know is the device name and some options to the mount(8) command. You can find the device name with the aforementioned dmesg(8) command. For example, if dmesg displays:
#dmesg | grep ^cdcd0 at atapibus0 drive 1: <ASUS CD-S400/A, , V2.1H> type 5 cdrom removable
the device name is cd0, and you can mount the
CD-ROM with the following commands:
#mkdir /cdrom#mount -t cd9660 -o ro /dev/cd0a /cdrom
To make things easier, you can add a line to the
/etc/fstab file:
/dev/cd0a /cdrom cd9660 ro,noauto 0 0
Without the need to reboot, you can now mount the CD-ROM with:
#mount /cdrom
When the CD-ROM is mounted you can't eject it manually; you will have to unmount it before you can do that:
#umount /cdrom
There is also a software command which unmounts the CD-ROM and ejects it:
#eject /dev/cd0a
To mount a floppy you must know the name of the floppy device and the file system type of the floppy. Read the fdc(4) manpage for more information about device naming, as this will differ depending on the exact size and kind of your floppy disk. For example, to read and write a floppy in MS-DOS format you use the following command:
#mount -t msdos /dev/fd0a /mnt
Instead of /mnt, you can use another
directory of your choice; you could, for example, create a
/floppy directory like you did for the CD-ROM.
If you do a lot of work with MS-DOS floppies, you will want to
install the mtools package, which enables you to
access a MS-DOS floppy (or hard disk partition) without the need
to mount it. It is very handy for quickly copying a file to or from a
floppy:
#mcopy foo bar a:#mcopy a:baz.txt baz#mcopy a:\*.jpg .
If you wish to install any of the software freely available for UNIX-like systems you are strongly advised to first check the NetBSD package system, pkgsrc. pkgsrc automatically handles any changes necessary to make the software run on NetBSD. This includes the retrieval and installation of any other packages on which the software may depend.
See the list of available packages
Precompiled binaries are available on the NetBSD FTP server
for some ports. To install them the PKG_PATH
variable needs to be adjusted in the following way
(under the sh(1) shell):
#export PKG_PATH="http://ftp.NetBSD.org/pub/pkgsrc/packages/NetBSD/<PORT>/<RELEASE-NUMBER>/All"#exportPKG_PATH
Where <RELEASE-NUMBER> needs to be
replaced by the release number of an existing NetBSD
release (for example, 5.0).
<PORT> needs to be replaced by
the Port name for the used architecture (for example, amd64)
Applications can now be installed by the superuser
root with the
pkg_add command:
#pkg_add -v perl#pkg_add -v apache#pkg_add -v firefox#pkg_add -v kde
The above commands will install the Perl programming language, Apache web server, Firefox web browser and the KDE desktop environment as well as all the packages they depend on.
Installed applications can be updated in the following way:
#pkg_add -uv firefox
The following command will force an update of firefox and all of its dependencies:
#pkg_add -fuuv firefox
All details about package management can be found in The pkgsrc guide
On many UNIX-like systems the directory structure under
/usr/local is reserved for applications and
files which are independent of the system's software management.
This convention is the reason why most software developers
expect their software to be installed under
/usr/local. NetBSD has no
/usr/local directory, but it can be
created manually if needed. NetBSD does not care about anything
installed under /usr/local, so this task is left to
you as the system administrator.
By the time that you have installed your system, it is quite likely that bugs in the release have been found. All significant and easily fixed problems will be reported at http://www.NetBSD.org/support/security/. It is recommended that you check this page regularly.
Use one of the following two shutdown commands to halt or reboot the system:
#shutdown -h now#shutdown -r now
Two other commands to perform the same tasks are:
#halt#reboot
halt, reboot and shutdown are not synonyms: the latter is more sophisticated. On a multiuser system you should really use shutdown, which allows you to schedule a shutdown time and notify users. It will also take care to stop processes properly. For more information, see the shutdown(8), halt(8) and reboot(8) manpages.
Table of Contents
It is not like the vi editor needs introducing to seasoned UNIX users. The vi editor, originally developed by Bill Joy of Sun Microsystems, is an endlessly extensible, easy to use light ASCII editor and the bane of the newbie existence. This section will introduce the vi editor to the newbie and perhaps toss in a few ideas for the seasoned user as well.
The first half of this section will overview editing, saving, yanking/putting and navigating a file within a vi session. The second half will be a step by step sample vi session to help get started.
This is intended as a primer for using the vi editor, it is not by any means a thorough guide. It is meant to get the first time user up and using vi with enough skills to make changes to and create files.
Using the vi editor really is not much different than any other terminal based software with one exception, it does not use a tab type (or curses if you will) style interface, although many versions of vi do use curses it does not give the same look and feel of the typical curses based interface. Instead it works in two modes, command and edit. While this may seem strange, it is not much different than windows based editing if you think about it. Take this as an example, if you are using say gedit and you take the mouse, highlight some text, select cut and then paste, the whole time you are using the mouse you are not editing (even though you can). In vi, the same action is done by simply deleting the whole line with dd in command mode, moving to the line you wish to place it below and hitting p in command mode. One could almost say the analogy is “mouse mode vs. command mode” (although they are not exactly identical, conceptually the idea is similar).
To start up a vi session, one simply begins the way they might with any terminal based software:
$vifilename
One important note to remember here is that when a file is edited, it is loaded into a memory buffer. The rest of the text will make reference to the buffer and file in their proper context. A file only changes when the user has committed changes with one of the write commands.
The vi editor sports a range of options one can provide at start up, for the time being we will just look at the default startup. When invoked as shown above, the editors default startup mode is command mode, so in essence you cannot commence to typing into the buffer. Instead you must switch out out of command mode to enter text. The following text describes edit start modes:
a Append after cursor.
A Append to end of line.
C Change the rest of current line.
cw Change the current word.
i Insert before cursor.
I Insert before first non blank line.
o Open a line below for insert
O Open a line above for insert.
Of course knowing the edit commands does not do much good if you can't switch back to command mode and save a file, to switch back simply hit the ESC key. To enter certain commands, the colon must be used. Write commands are one such set of commands. To do this, simply enter :.
Hitting the colon then will put the user at the colon (or command if you will) prompt at the bottom left corner of the screen. Now let us look at the save commands:
:w Write the buffer to file.
:wq Write the buffer to file and quit.
What good is an editor if you cannot manipulate blocks of text? Of course vi supports this feature as well and as with most of the vi commands it somewhat intuitive. To yank a line but not delete it, simply enter yy or Y in command mode and the current line will be copied into a buffer. To put the line somewhere, navigate to the line above where the line is to be put and hit the p key for the “put” command. To move a line, simply delete the whole line with the dd command, navigate and put.
Most vi primers or tutorials start off with navigation, however, not unlike most editors in order to navigate a file there must be something to navigate to and from (hence why this column sort of went in reverse). Depending on your flavor of vi (or if it even is vi and not say elvis, nvi or vim) you can navigate in both edit and command mode.
For the beginner I feel that switching to command mode and then navigating is a bit safer until one has practiced for awhile. The navigation keys for terminals that are not recognized or do not support the use of arrow keys are the following:
k Moves the cursor up one line.
j Moves the cursor down one line.
l Moves the cursor right one character.
h Moves the cursor left one character.
If the terminal is recognized and supports them, the arrow keys can be used to navigate the buffer in command mode.
In addition to simple “one spot navigation” vi supports jumping to a line by simply typing in the line number at the colon prompt. For example, if you wanted to jump to line 223 the keystrokes from editor mode would look like so:
ESC
:223
The vi editor supports searching using regular expression syntax, however, it is slightly different to invoke from command mode. One simply hits the / key in command mode and enters what they are searching for, as an example let us say I am searching for the expression foo:
/foo
That is it, to illustrate a slightly different expression, let us say I am looking for foo bar:
/foo bar
Searching and scrolling are not the only ways to navigate a vi buffer. Following is a list of succinct navigation commands available for vi:
0 Move to beginning of line.
$ Move to end of line.
b Back up one word.
w Move forward one word.
G Move to the bottom of the buffer.
H Move to the top line on the screen.
L Move to the last line on the screen.
M Move the cursor to the middle of the screen.
N Scan for next search match but opposite direction.
n Scan for next search match in the same direction.
Now that we have covered the basics, let us run a sample session using a couple of the items discussed so far. First, we open an empty file into the buffer from the command line like so:
#vi foo.txt
Next we switch to edit mode and enter two lines separated by an empty line, remember our buffer is empty so we hit the i key to insert before cursor and enter some text:
This is some text there we skipped a line ~ ~ ~ ~
Now hit the ESC key to switch back into command mode.
Now that we are in command mode, let us save the file. First, hit the : key, the cursor should be sitting in the lower left corner right after a prompt. At the : prompt enter w and hit the ENTER or RETURN key. The file has just been saved. There should have been a message to that effect, some vi editors will also tell you the name, how many lines and the size of the file as well.
It is time to navigate, the cursor should be sitting wherever it was when the file was saved. Try using the arrow keys to move around a bit. If they do not work (or you are just plain curious) try out the hjkl keys to see how they work.
Finally, let us do two more things, first, navigate up to the first line and then to the first character. Try out some of the other command mode navigation keys on that line, hit the following keys a couple of times:
$
0
$
0
The cursor should hop to the end of line, back to the beginning and then to the end again.
Next, search for an expression by hitting the / key and an expression like so:
/we
The cursor should jump to the first occurrence of we.
Now save the file and exit using write and quit:
:wq
The standard editor supplied with NetBSD is, needless to say, vi, the most loved and hated editor in the world. If you don't use vi, skip this section, otherwise read it before installing other versions of vi. NetBSD's vi (nvi) was written by Keith Bostic of UCB to have a freely redistributable version of this editor and has many powerful extensions worth learning while being still very compatible with the original vi. Nvi has become the standard version of vi for BSD.
Amongst the most interesting extensions are:
Extended regular expressions (egrep style), enabled with
option extended.
Tag stacks.
Infinite undo (to undo, press u; to continue undoing, press .).
Incremental search, enabled with the option
searchincr.
Left-right scrolling of lines, enabled with the option
leftright; the number of columns to scroll
is defined by the sidescroll option.
Command line history editing, enabled with the option
cedit.
Filename completion, enabled by the filec option.
Backgrounded screens and displays.
Split screen editing.
The following example shows a .exrc file
with some extended options enabled.
set showmode ruler set filec=^[ set cedit=^[
The first line enables the display of the cursor position (row and column) and of the current mode (Command, Insert, Append) on the status line. The second line (where ^[ is the ESC character) enables filename completion with the ESC character. The third line enables command line history editing (also with the ESC character.) For example, writing “:” and then pressing ESC opens a window with a list of the previous commands which can be edited and executed (pressing Enter on a command executes it.)
The source tarball
(src.tgz) contains a lot of useful
documentation on (n)vi and ex, in the
/usr/src/usr.bin/vi/docs directory.
For example:
Edit: A tutorial
Ex Reference Manual
Vi man page
An Introduction to Display Editing with Vi by William Joy and Mark Horton
Ex/Vi Reference Manual by Keith Bostic
Vi Command & Function Reference
Vi tutorial (beginner and advanced)
If you have never used vi, the “Vi tutorial” is a good starting point. It is meant to be read using vi and it gradually introduces the reader to all the vi commands, which can be tested while reading. An Introduction to Display Editing with Vi by William Joy and Mark Horton is also a very good starting point.
If you want to learn more about vi and the nvi extensions you should read the Ex/Vi Reference Manual by Keith Bostic which documents all the editor's commands and options.
This topic is not directly related to NetBSD but it can be useful, for example, for examining the kernel sources.
When you examine a set of sources in a tree of directories and subdirectories you can simplify your work using the tag feature of vi. The method is the following:
cd to the base directory of the sources.
$cd/path
Write the following commands:
$find . -name "*.[ch]" >filelist$catfilelist| xargs ctags
Add the following line to .exrc
set tags=/path/tags
(substitute the correct path instead of path.)
Table of Contents
NetBSD uses individual scripts for controlling services, similar to what System V and Linux use, but without runlevels. This chapter is an overview of the rc.d system and its configuration.
The system startup files reside in the /etc
directory. They are:
/etc/rc
/etc/rc.conf
/etc/rc.d/*
/etc/rc.lkm
/etc/rc.local
/etc/rc.shutdown
/etc/rc.subr
/etc/defaults/*
/etc/rc.conf.d/*
First, a look at controlling and supporting scripts (also documented in rc(8)).
After the kernel has initialized all devices at
startup, it starts init(8), which in turn runs
/etc/rc.
/etc/rc sorts the scripts in
/etc/rc.d using rcorder(8) and then
runs them in that order. See the rcorder(8)
man page for details of how the order of rc.d scripts is
determined.
/etc/rc.subr
contains common functions used by /etc/rc
and various rc.d scripts.
When shutting down the system with shutdown(8),
/etc/rc.shutdown is run, which runs the
scripts in /etc/rc.d in reverse
order (as defined by rcorder(8)). Note that if you shut
down the system using the halt(8) command, these scripts
will not be run.
Additional scripts outside of the rc.d
directory:
/etc/rc.lkm loads or unloads
Loadable Kernel Modules (LKMs). See modload(8) and
/etc/rc.d/lkm[123].
/etc/rc.local is almost the last
script called at boot up. This script can be edited by the
administrator to start local daemons that don't fit the
rc.d model.
rc.d scripts are controlled by a central configuration file,
/etc/rc.conf, which loads its default settings from
/etc/defaults/rc.conf. If you want to change a
default setting, do not edit /etc/defaults/rc.conf;
instead, override the setting in /etc/rc.conf.
It is a good idea to read the rc.conf(5) man page to learn about the services that are available to you.
The following example shows how to enable the SSH daemon, which is disabled by default:
#cd /etc; grep ssh defaults/rc.confsshd=NO sshd_flags=""#echo "sshd=YES" >> rc.conf
Now sshd(8) will be started automatically at system startup. The next section describes how to start and stop services at any time.
Last but not least, files can be created in the
/etc/rc.conf.d/ directory to override the behavior
of a given rc.d script without editing the script itself.
The actual scripts that control services are in
/etc/rc.d. These scripts are automatically
run at boot time, but they can be called manually if necessary.
The following example shows how to start the SSH daemon
that we enabled in the previous section:
#/etc/rc.d/sshd startStarting sshd.
Later, if you wish to stop the SSH daemon, run the following command:
#/etc/rc.d/sshd stopStopping sshd. Waiting for PIDS: 123.
The rc.d scripts take one of the following arguments:
start
stop
restart
status
Some scripts may support other arguments (e.g., “reload”), but every script will support at least the above commands.
As an example, after adding a new record to a named(8) database, the daemon can be told to reload its configuration files with the following command:
#/etc/rc.d/named reloadReloading named config files.
Note that all of the commands discussed above will only take action
if the particular service is is enabled in
/etc/rc.conf. It is possible to bypass this
requirement by prepending “one” to the command, as in:
#/etc/rc.d/httpd onestartStarting httpd.
The above command will allow you to start the httpd(8) service one time. To stop a service that has been started in this manner, pass “onestop” to the script.
The startup system of every Unix system determines, in one way
or another, the order in which services are started. On some Unix
systems this is done by numbering the files and/or putting them in
separate run level directories. Solaris relies on wildcards like
/etc/rc[23].d/S* being sorted numerically when
expanded. Some simply put all the commands that should be started
into a single monolithic script (this is the traditional BSD method,
and is what NetBSD did before the rc.d system). On modern NetBSD this
is done by the rc.d scripts and their contents. Please note that NetBSD
does not have multiple runlevels as found in SysV-style systems like
Solaris and Linux.
At the beginning of each rc.d script there is a series of commented out lines that have one of the following items in them:
REQUIRE
PROVIDE
BEFORE
KEYWORD
These describe the dependencies of that particular script and
allow rcorder to easily work either “up” or
“down” as the situation requires. As an example, here
is the ordering information contained in
/etc/rc.d/nfsd:
... PROVIDE: nfsd REQUIRE: rpcbind mountd ...
Here we can see that this script provides the “nfsd” service and that it requires “rpcbind” and “mountd” to be running first. The rcorder(8) utility is used at system startup time to read through all the rc.d scripts and determine the order in which they should be run.
Luke Mewburn, one of the principal designers of the rc.d system, gave a presentation on the system at USENIX 2001. It is available in PDF format.
Table of Contents
In NetBSD versions before 1.4 the user could choose between two different drivers for screen and keyboard, pccons (specific for i386) and pcvt. In NetBSD 1.4 the new wscons multiplatform driver appeared, which has substituted the previous drivers, of which pccons is still supported as it uses less system resources and is used for install floppies due to that.
Wscons is NetBSD's platform-independent workstation console driver. It handles complete abstraction of keyboards and mice. This means that you can plug in several keyboards or mice and they will be multiplexed onto a single terminal, but also that it can multiplex several virtual terminals onto one physical terminal.
The capabilities of wscons can vary depending on the port. Starting with NetBSD 4.0, almost all ports have full support for most capabilities wscons has to offer. If you are using a non-mainstream architecture, please see the port-specific FAQ if wscons seems to lack features.
Wscons support is enabled by default on most architectures. This
can be done manually by adding wscons=YES to your
/etc/rc.conf. Then configure the desired number
of virtual consoles as described in Section 8.1.1.1, “Virtual consoles”
and start wscons by entering
sh /etc/rc.d/wscons start followed by
sh /etc/rc.d/ttys restart. You can now switch
virtual consoles by pressing Ctrl+Alt+Fn or
similar, depending on the platform.
wscons comprises three subsystems: wsdisplay, wskbd and wsmouse. These subsystems handle abstraction for all display, keyboard and mouse devices respectively. The following sections discuss the configuration of wscons per subsystem.
This section will explain how to configure display and screen-related options.
The number of pre-allocated virtual console is controlled by the following option
options WSDISPLAY_DEFAULTSCREENS=4
Other consoles can be added by enabling the relevant lines in the
/etc/wscons.conf file: the comment mark (#) must
be removed from the lines beginning with screen x.
In the following example a fifth console is added to the four
pre-allocated ones:
# screens to create # idx screen emul #screen 0 - vt100 screen 1 - vt100 screen 2 - vt100 screen 3 - vt100 screen 4 - - #screen 4 80x25bf vt100 #screen 5 80x50 vt100
The rc.wscons script transforms each of the non
commented lines in a call to the wsconscfg command:
the columns become the parameters of the call. The
idx column becomes the index
parameter, the screen column becomes the
-t type parameter (which defines the type of screen:
rows and columns, number of colors, ...) and the
emul column becomes the -e emul
parameter, which defines the emulation. For example:
screen 3 - vt100
becomes a call to:
wsconscfg -e vt100 3
Please note that it is possible to have a (harmless)
conflict between the consoles
pre-allocated by the kernel and the consoles allocated at boot time
through /etc/wscons.conf.
If during boot the system tries to allocate an already allocated
screen, the following message will be displayed:
wsconscfg: WSDISPLAYIO_ADDSCREEN: Device busy
The solution is to comment out the offending lines in
/etc/wscons.conf.
Note that while it is possible to delete a screen and add it with different settings, it is, technically speaking, not possible to actually modify the settings of a screen.
screen 0 cannot be deleted if used as system console.
This implies that the setting of screen 0 cannot be
changed in a running system, if used as system console.
The virtual console must also be active in
/etc/ttys, so that NetBSD runs the
getty(8) program to ask for login. For example:
console "/usr/libexec/getty Pc" pc3 off secure ttyE0 "/usr/libexec/getty Pc" vt220 on secure ttyE1 "/usr/libexec/getty Pc" vt220 on secure ttyE2 "/usr/libexec/getty Pc" vt220 on secure ttyE3 "/usr/libexec/getty Pc" vt220 off secure ...
When starting up the X server, it will look for a virtual
console with no getty(8) program running, e.g. one console
should left as "off" in /etc/ttys. The
line
ttyE3 "/usr/libexec/getty Pc" vt220 off secure
of /etc/ttys is used by the X server
for this purpose. To use a screen different from number 4, a
parameter of the form vtn must be passed to
the X server, where n is the number of the
function key used to activate the screen for X.
For example, screen 7 could be enabled in
/etc/wscons.conf and X could be started with
vt8. If you use xdm you must
edit /etc/X11/xdm/Xserver. For
example:
:0 local /usr/X11R6/bin/X +kb dpms -bpp 16 dpms vt8
For xdm3d the path is different:
/usr/X11R6/share/xdm3d/Xservers.
This error message usually occurs when wsconscfg tries
to add a screen which already exists. One time this occurs
is if you have a screen 0 line in your
/etc/wscons.conf file, because the
kernel always allocates a screen 0 as the console device.
The error message is harmless in this case, and you can get
rid of it by deleting (or commenting out) the
screen 0 line.
A text mode with 50 lines can be used starting with version 1.4.1 of
NetBSD. This mode is activated in the
/etc/wscons.conf. The following line must be
uncommented:
font ibm - 8 ibm /usr/share/pcvt/fonts/vt220l.808
Then the following lines must be modified:
#screen 0 80x50 vt100 screen 1 80x50 vt100 screen 2 80x50 vt100 screen 3 80x50 vt100 screen 4 80x50 vt100 screen 5 80x50 vt100 screen 6 80x50 vt100 screen 7 80x50 vt100
This configuration enables eight screens, which can be accessed with
the key combination Ctrl-Alt-Fn (where
n varies from 1 to 8); the corresponding devices
are ttyE0..ttyE7. To enable them and get a login prompt,
/etc/ttys must be modified:
ttyE0 "/usr/libexec/getty Pc" vt220 on secure ttyE1 "/usr/libexec/getty Pc" vt220 on secure ttyE2 "/usr/libexec/getty Pc" vt220 on secure ttyE3 "/usr/libexec/getty Pc" vt220 on secure ttyE4 "/usr/libexec/getty Pc" vt220 on secure ttyE5 "/usr/libexec/getty Pc" vt220 on secure ttyE6 "/usr/libexec/getty Pc" vt220 on secure ttyE7 "/usr/libexec/getty Pc" vt220 on secure
screen 0 as system console can be set to another
screen type at boot time on VGA displays. This
is a kernel configuration option. If a non-80x25 setting
is selected, it must be made sure that a usable font is
compiled into the kernel, which would be an 8x8 one
for 80x50.
There is a problem with many ATI graphics cards which don't implement the standard VGA font switching logics: These need another kernel option to make a nonstandard console font work.
An example set of kernel configuration options might be:
options VGA_CONSOLE_SCREENTYPE="\"80x50\"" options VGA_CONSOLE_ATI_BROKEN_FONTSEL options FONT_VT220L8x8
On many architectures, there is only one type of screen mode: a graphical framebuffer mode. On machines with VGA graphics cards, there is a second mode: textmode. This is an optimized mode specially made for displaying text. Hence, this is the default console mode for GENERIC kernels on architectures where the graphics graphics card is typically a VGA card (i386, amd64).
However, you can enable a framebuffer on machines with VGA cards that support the VESA BIOS extension (VBE). To enable support for this mode, uncomment the following lines in the kernel configuration file:
# VESA framebuffer console options KVM86 # required for vesabios vesabios* at vesabiosbus? vesafb* at vesabios? options VESAFB_WIDTH=640 options VESAFB_HEIGHT=480 options VESAFB_DEPTH=8 options VESAFB_PM # power management support wsdisplay* at vesafb? console ?
If you happen to have a VIA Unichrome capable graphics card, you can enable the following instead:
# VIA Unichrome framebuffer console unichromefb* at pci? dev ? function ? wsdisplay* at unichromefb?
You can enable scrolling back on wscons consoles by compiling
the WSDISPLAY_SCROLLSUPPORT option into your
kernel. Make sure you don't have option
VGA_RASTERCONSOLE enabled at the same time
though! See Chapter 32, Compiling the kernel for instructions on
building a kernel.
When you have a kernel with options
WSDISPLAY_SCROLLSUPPORT running, you can
scroll up on the console by pressing LEFT SHIFT plus PAGE
UP/DOWN. Please note that this may not work on your system
console (ttyE0)!
It is possible to change the foreground and background color of kernel messages by setting the following options in kernel config files:
options WS_KERNEL_FG=WSCOL_xxx options WS_KERNEL_BG=WSCOL_xxx
The WSCOL_xxx color constants are defined in
src/sys/dev/wscons/wsdisplayvar.h.
Starting from NetBSD 3.0, you can easily customize many aspects of your display appearance: the colors used to print normal messages, the colors used to print kernel messages and the color used to draw a border around the screen.
All of these details can be changed either from kernel
options or through the wsconsctl(8) utility; the later
may be preferable if you don't want to compile your own
kernel, as the default options in GENERIC
are suitable to get this tip working.
The following options can be set through wsconsctl(8):
border: The color
of the screen border. Its respective kernel
option is WSDISPLAY_BORDER_COLOR.
msg.default.attrs: The attributes
used to print normal console messages. Its respective
kernel options are WS_DEFAULT_COLATTR
and WS_DEFAULT_MONOATTR (the former is used
in color displays, while the later is used in monochrome
displays).
msg.default.bg:
The background color used to print normal console
messages. Its respective kernel option is
WS_DEFAULT_BG.
msg.default.fg:
The foreground color used to print normal console
messages. Its respective kernel option is
WS_DEFAULT_FG.
msg.kernel.attrs:
The attributes used to print kernel messages and warnings.
Its respective kernel options are
WS_KERNEL_COLATTR and
WS_KERNEL_MONOATTR (the
former is used in color displays, while the later is used
in monochrome displays).
msg.kernel.bg:
The background color used to print kernel messages and
warnings. Its respective kernel option is
WS_KERNEL_BG.
msg.kernel.fg:
The foreground color used to print kernel messages and
warnings. Its respective kernel option is
WS_KERNEL_FG.
The values accepted as colors are: black, red, green, brown, blue, magenta, cyan and white. The attributes are a comma separated list of one or more flags, which can be: reverse, hilit, blink and/or underline.
For example, to emulate the look of one of those old Amstrad machines:
wsconsctl -d -w border=blue msg.default.bg=blue msg.default.fg=white msg.default.attrs=hilit
Or, to make your kernel messages appear red:
wsconsctl -d -w msg.kernel.fg=red
Note that, in older versions of NetBSD, only a subset of this functionality is available; more specifically, you can only change the kernel colors by changing kernel options, as explained above. Also note that not all drivers support these features, so you may not get correct results on all architectures.
NetBSD uses the termcap database to
tell applications what the current terminal's capabilities are.
For example, some terminals don't support colors, some don't
support underlining (PC VGA terminals don't, for example) etc.
The TERM environment variable tells the termcap
library the type of terminal. It then refers to its database
for the options.
The default setting for TERM can be
inspected by typing echo $TERM
on the terminal of interest. Usually this is something like
vt220. This terminal type doesn't support
colors. On a typical PC console with 25 lines, you can change
this value to wsvt25 instead, to get colors.
This is done in the C shell (csh) by entering:
setenv TERM wsvt25
In a Bourne-compatible shell (sh, ksh), you can enter:
export TERM=wsvt25
If this does not work for you, you can try the
ansi terminal type, which supports
ANSI color codes. However, other functionality may be
missing with this terminal type. You can have a look
at the file /usr/share/misc/termcap
to see if you can find a useful match for your
console type.
There are several fonts in
/usr/share/wscons/fonts
that can be loaded as console fonts. This can be done with the
wsfontload(8) command, for example:
wsfontload -N ibm -h 8 -e ibm /usr/share/wscons/fonts/vt220l.808.
This command loads the IBM-encoded (-e ibm)
font in the file vt2201.808 which has a height
of eight pixels (-h 8). Name it ibm for later
reference (-N ibm).
To actually display the font on the console, use the command
wsconsctl -dw font=ibm.
If you want to edit a font, you can use the old pcvt
utils that are available in the
sysutils/pcvt-utils
package.
Wscons also allows setting the keymap to map the keys on various national keyboards to the right characters. E.g. to set the keymap for an Italian keymap, run:
#wsconsctl -k -w encoding=itencoding -> it
This setting will last until the next reboot.
To make it permanent, add a encoding line to
/etc/wscons.conf: it will be executed
automatically the next time you reboot.
#cp /etc/wscons.conf /etc/wscons.conf.orig#echo encoding it >>/etc/wscons.conf
Please be careful and type two > characters.
If you type only one >, you will overwrite
the file instead of adding a line. But that's why we always
make backup files before touching critical files!
A full list of keyboard mappings can be found in
/usr/src/sys/dev/wscons/wsksymdef.h:
be - Belgian
de - German
dk - Danish
es - Spanish
fi - Finnish
fr - French
gr - Greek
hu - Hungarian
it - Italian
jp - Japanese
no - Norwegian
pl - Polish
pt - Portuguese
ru - Russian
sf - Swiss French
sg - Swiss German
sv - Swedish
ua - Ukrainian
uk - UK-English
us - US-English
There are also several "variants" that can be used to modify a map:
declk
dvorak
iopener
lk401
metaesc
nodead
swapctrlcaps
dvorak uses the Dvorak keyboard
layout. swapctrlcaps switches the functions of the
Caps Lock and Left Control keys. iopener
is for the nonstandard keyboard layout on the Netpliance
i-opener and makes F1 into Escape and F2 through F12 into F1
through F11.
These can be combined with another map by appending a dot
and then the variant name, for example,
us.iopener. Multiple variants can
be combined, such as
us.dvorak.swapctrlcaps. Note that not all
combinations are allowed.
You can change the compiled in kernel default by adding
options PCKBD_LAYOUT=KB_
where encoding is an uppercase entry
from the list above
(eg: encodingPCKBD_LAYOUT=KB_FR). Variants can be
bitwise or'd in
(eg: PCKBD_LAYOUT=KB_US|KB_SWAPCTRLCAPS).
Configuring the keyboard layout under X is described elsewhere.
If your favourite keymap is not supported, you can start
digging in src/sys/dev/wscons/wsksymdef.h
and src/sys/dev/pckbport/wskbdmap_mfii.c
to make your own. Be sure to send-pr a change-request PR with your work, so others can
make use of it!
You can test your keymap by using wsconsctl instead of directly hacking the keymaps into the keyboard mapping file. For example, to say keycode 51 without any modifiers should map to a comma, with shift it should map to a question mark, with alt it should map to a semicolon and with both alt and shift it should map to colon, issue the following command:
wsconsctl -w "map += keycode 51=comma question semicolon colon"
Keyboard repeat speed can be tuned using the
wsconsctl(8) utility.
There are two variables of interest:
repeat.del1, which specifies the delay before
character repetition starts, and repeat.deln,
which sets the delay between each character repetition (once
started).
Let's see an example, assuming you want to accelerate keyboard speed. You could do, from the command line:
wsconsctl -w repeat.del1=300 wsconsctl -w repeat.deln=40
Or, if you want this to happen automatically every time
you boot up the system, you could add the following lines to
/etc/wscons.conf:
setvar repeat.del1=300 setvar repeat.deln=40
The wsmouse device (part of wscons) does not directly support serial mice. The moused(8) daemon is provided to read serial mouse data, convert it into wsmouse events and inject them in wscons' event queue, so the mouse can be used through the abstraction layer provided by wsmouse.
A typical use can be: moused -p /dev/tty00.
This will try to determine the type of mouse connected to
the first serial port and start reading its data. The
moused(8) man page contains more examples.
It is possible to use the mouse on the wscons console to mark (cut) text with one mouse button, and insert (paste) it again with another button.
To do this, enable "wsmoused" in
/etc/rc.conf, and start it:
#echo wsmoused=yes >>/etc/rc.conf#sh /etc/rc.d/wsmoused start
After that you can use the mouse to mark text with the left
mouse button, and paste it with the right one. To tune the
behaviour of wsmoused(8) see its manpage, which also
describes the format of the wsmoused.conf(5) config file,
an example of which can be found in
/usr/share/examples/wsmoused.
This console driver doesn't offer virtual consoles and utility programs for configuration but takes up very little space. Due to this, it can be found on the i386 install floppy. It is only available for a handful of architectures, mostly i386 derivatives.
To enable it, put the following line in your kernel config file:
pc0 at isa? port 0x60 irq 1 # pccons generic PC console driver
You can also set one of several options to compile in a non-english keymap:
# Keyboard layout configuration for pccons #options FRENCH_KBD #options FINNISH_KBD #options GERMAN_KBD #options NORWEGIAN_KBD
Remove the comment character in front of one of this to enable the corresponding keymap, then follow the instructions in Chapter 32, Compiling the kernel to rebuild your kernel.
In general, you shouldn't need pccons though, and wscons should fit all your needs.
Table of Contents
NetBSD uses the X Window System to provide a graphical interface. In NetBSD 5.0, the amd64, i386, macppc, shark, sgimips, and sparc64 ports use X.Org and the rest use XFree86.
Please note that the X Window System is a rather bare bones framework. It acts as a base for modern desktop environments like GNOME or KDE, but they are not part of the X Window System. NetBSD ships with the X Window System, but it does not include these desktop environments; they must be added via pkgsrc.
When you start using X you'll find many new terms which you may find confusing at first. The basic elements are:
Video hardware, i.e., your video card.
An X server running on top of the hardware. The X server provides a standard way to display graphics (including fonts for text display) and get mouse/keyboard/other input. X is network-transparent, which means that you can run X clients on one machine, and the X server (i.e., the display, with video hardware) on another machine.
X clients. These are the programs you directly interact with. They run on top of the X server. A web browser like Firefox is an example of an X client.
A window manager running on top of the X server. The window manager is a special X client that is allowed to control the placement of windows. It can also “decorate” windows with standard “widgets” (usually these provide actions like window motion, resizing, iconifying, window killing, etc.).
A desktop environment such as GNOME or KDE. These are suites of integrated software designed to give you a well-defined range of software and a more or less common interface to each program. These typically include a window manager, file manager, web browser, email client, multimedia player, text editor, address book, help browser, etc. As you may have guessed, a desktop environment is not needed to use X, but many users will want to install one.
In some cases, you may be able to start using X without any
configuration at all, and startx will work just
fine. In many cases, however, some configuration of the X
server is required. Depending on the port you use, this configuration
file will be either /etc/X11/xorg.conf or
/etc/X11/XF86Config.
The structure of the configuration file is described formally
in xorg.conf(5) or XF86Config(5).
To generate an initial configuration file for your X server, run the command
#X -configure
This command should create a configuration file and place it in your home directory. To test the generated configuration file, run, e.g.,
#X -config ~/xorg.conf.new
If this succeeds, you should see a crosshatched background and a cursor in the shape of an X. Try moving the cursor around to verify that the mouse is functional. To quit, press Ctrl-Alt-Backspace.
If the above test was successful, move the file into place
(as either /etc/X11/xorg.conf or
/etc/X11/XF86Config) and you are ready to go.
The following sections may be of interest or use, but are not required
reading.
PS/2 and USB mice will normally be autodetected, and a configuration entry like the following will be generated:
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "wsmouse"
Option "Device" "/dev/wsmouse"
Option "ZAxisMapping" "4 5 6 7"
EndSection
For a serial mouse on the first serial port, try something like:
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/tty00"
EndSection
In this example. /dev/tty00 is the first
serial port. Use /dev/tty01 for the
second, and so on. Protocol "auto" will try to automatically
detect the protocol of your serial mouse. If this doesn't work,
try values like "Microsoft", "IntelliMouse" or "Logitech". See
mousedrv(4) for more information.
Even if you have already configured your keyboard for wscons (See Section 8.1, “wscons”), you need to configure it for X as well, at least if you want to use a non-US layout.
An easy solution is to use the XKB protocol to specify the keyboard type and layout.
Here is an example that shows how to use a German keyboard:
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "XkbRules" "xorg"
Option "XkbModel" "pc105"
Option "XkbLayout" "de"
Option "XkbOptions" "ctrl:nocaps"
EndSection
If you wish to change the repeat rate of your keyboard, you can set it with the “AutoRepeat” option, which takes two arguments: delay and rate, respectively. The following example sets the initial delay to 200 milliseconds and the repeat rate to 30 per second:
Option "AutoRepeat" "200 30"
If X is already running, the keyboard repeat rate can be changed with the xset(1) command:
$xset r 200 30
You can also run this command in your .xinitrc
file. See below (Section 9.8, “Customizing X”) for more
information.
If X does not run at the resolution you think it should, first run xrandr and see if the resolution you want is listed. If your preferred resolution is listed in that command's output, you can change resolutions with, e.g.,
$xrandr -s 1680x1050
If your preferred resolution is not listed, or you have issues with flickering, you may need to manually specify your monitor's horizontal and vertical frequencies. These can be set with the “HorizSync” and “VertRefresh” directives in the “Monitor” section. An example is provided below.
Section "Monitor"
Identifier "Monitor0"
VendorName "Monitor Vendor"
ModelName "Monitor Model"
HorizSync 30-83
VertRefresh 56-75
EndSection
Normally, your video card will be automatically detected. In the
event that this autodetection fails, all available drivers can be found
in /usr/X11R7/lib/modules/drivers. (Replace
“X11R7” with “X11R6” if you use a port that
has not yet switched to X.Org.) The driver can be set with the
“Driver” directive in the “Device” section,
as shown below.
Section "Device"
Identifier "Card0"
Driver "intel"
EndSection
You can start X with the following command:
$startx
If your basic X server configuration is correct, you are left in the X environment with the default window manager (twm). If you want a more advanced window manager or desktop environment, many are available in pkgsrc. See Section 9.9, “Other window managers or desktop environments” for information about adding and changing window managers.
One of the first things you will want to do is to change the
programs that run when X is first started. The easiest way to do this
is to copy the default .xinitrc file to your home
directory and modify it, or create a simple new one from scratch.
For example:
$cp /etc/X11/xinit/xinitrc ~/.xinitrc$vi ~/.xinitrc
The following example shows how to start the window manager
(twm) and open an instance of the
xclock and xterm programs.
The screen background color is set to “bisque4”, which is
defined in /usr/X11R7/lib/X11/rgb.txt.
... # start some nice programs xclock -geometry 50x50-1-1 & xsetroot -solid bisque4 & xterm -geometry 80x34-1+1 -bg OldLace & exec twm # no '&' here
With this type of setup, to quit X you must exit the window manager, which is usually done by selecting "exit" from its menu.
The above example is very simple, but illustrates the basics
of controlling the clients that are run when X is started. You can
run any number of commands from your .xinitrc,
including basic X configuration commands like
xset b off to turn off the bell.
If you don't like twm, which is a very
simple window manager, you can install another window manager or
a desktop environment from pkgsrc.
The following example uses the Openbox window manager, but there are
many others available in pkgsrc/wm.
Openbox can be installed via binary packages or compiled with pkgsrc. As always, assuming a properly set PKG_PATH, the binary package method is:
#pkg_add -v openbox
To build it with pkgsrc, run:
#cd /usr/pkgsrc/wm/openbox#make install
Openbox is now installed; to start it you must modify your
.xinitrc file:
substitute the line which calls twm with
a line which calls openbox.
For example:
# start some useful programs xclock -geometry 50x50-1-1 & # start window manager: exec openbox # no '&' here
The startx command will start the X11 session
with Openbox. As configured in the example .xinitrc
file above, choosing “Exit” or similar from the window
manager's menu will quit the window manager and end the X11 session.
Installing a desktop environment is almost as easy. The following example shows how to use the Xfce desktop environment.
#pkg_add -v xfce4#cp /usr/pkg/share/examples/rc.d/famd /etc/rc.d#cp /usr/pkg/share/examples/rc.d/dbus /etc/rc.d#cp /usr/pkg/share/examples/rc.d/hal /etc/rc.d#echo rpcbind=YES >> /etc/rc.conf#echo famd=YES >> /etc/rc.conf#echo dbus=YES >> /etc/rc.conf#echo hal=YES >> /etc/rc.conf#/etc/rc.d/rpcbind start#/etc/rc.d/famd start#/etc/rc.d/dbus start#/etc/rc.d/hal start
After running the above commands, edit your
.xinitrc as above and change
“openbox” (or “twm”) to
“xfce4-session”. The next time you run
startx the Xfce desktop environment will be
started.
If you always use X and the first thing you do after you log in is run startx, you can set up a graphical login to do this automatically. It is very easy:
Create the .xsession file in your home
directory. This file is similar to .xinitrc
and can, in fact, be a link to it.
$ln -s .xinitrc ~/.xsession
Modify /etc/rc.conf, adding the following
line:
xdm=YES # x11 display manager
Start xdm (or reboot your system, as this will be done automatically from now on):
#/etc/rc.d/xdm start
The configuration files for xdm
are in the /etc/X11/xdm
directory. The Xservers file specifies the
virtual console that X is started on. It defaults to
“vt05”, which is the console you reach via
“Ctrl+Alt+F5”. If you want to use a different virtual
console, change vt05 as desired. In order to avoid keyboard contention
between getty and xdm, be sure to start xdm on a virtual terminal
where getty is disabled. For example, if in
Xservers you have:
:0 local /usr/X11R6/bin/X :0 vt04
then in /etc/ttys you should have
ttyE3 "/usr/libexec/getty Pc" vt220 off secure
(Please note that vt04 corresponds to ttyE3; In
/etc/X11/xdm/Xservers, numbering starts at 1,
but in /etc/ttys, numbering starts at 0).
If you want to change the look of your xdm login screen, you can
modify the xdm configuration file.
For example, to change the background color you can add the
following line to the Xsetup_0 file:
xsetroot -solid SeaGreen
Table of Contents
The NetBSD port for i386, alpha, mac68k, macppc, and many others can execute a great number of native Linux programs, using the Linux emulation layer. Generally, when you think about emulation you imagine something slow and inefficient because, often, emulations must reproduce hardware instructions and even architectures (usually from old machines) in software. In the case of the Linux emulation this is radically different: it is only a thin software layer, mostly for system calls which are already very similar between the two systems. The application code itself is processed at the full speed of your CPU, so you don't get a degraded performance with the Linux emulation and the feeling is exactly the same as for native NetBSD applications.
This chapter explains how to configure the Linux emulation with an example: the installation of the well known Acrobat Reader version 7 program.
The installation of the Linux emulation is described in the compat_linux(8) man page; using the package system only two steps are needed.
Configuring the kernel.
Installing the Linux libraries.
Installing Linux applications like Acrobat Reader
If you use a GENERIC kernel you don't need to do anything because Linux compatibility is already enabled.
If you use a customized kernel, check that the following options are enabled:
option COMPAT_LINUX option EXEC_ELF32
or the following options if you are going to use 64-bit ELF binaries:
option COMPAT_LINUX option EXEC_ELF64
when you have compiled a kernel with the previous options you can start installing the necessary software.
Usually, applications are linked against shared libraries, and for Linux applications, Linux shared libraries are needed. You can get the shared libraries from any Linux distribution, provided it's not too old, but the suggested method is to use the package system and install the libraries automatically (which uses SUSE libraries). When you install the libraries, the following happens:
A secondary root directory is created
which will be used for Linux programs.
This directory is /emul/linux.
The Linux programs in emulation mode will use this directory
as their root directory and use files there. If a required
file is not found, it will be searched with
/ as root directory.
For example, if a Linux application opens
/etc/ld.so.conf, it will first be
searched in
/emul/linux/etc/ld.so.conf, and if
not found there in /etc/ld.so.conf.
The shared libraries for Linux are installed.
Most applications are linked dynamically and expect to find
the necessary libraries on the system.
For example, for Acrobat Reader,
if you go to the
/usr/pkgsrc/print/acroread7 and give the
make depends command, pkgsrc will fetch
and install all dependencies for Acrobat
Reader.
Both operations will be handled automatically by the package system, without the need of manual intervention from the user (we suppose that, by now, you have already begun to love the package system...). Note that this section describes manual installation of the Linux libraries.
To install the libraries, a program must be installed that
handles the RPM format: it is
rpm, which will be used to extract the
SUSE libraries. Execute make and
make install in the
/usr/pkgsrc/misc/rpm/ directory to
build and install rpm.
Next the suse100_base package must be
installed.
The SUSE RPM files can be downloaded by the package system or, if
you have a SUSE CD, you can copy them in the
/usr/pkgsrc/distfiles/suse100 directory and
then run make and make install
after going to the
/usr/pkgsrc/emulators/suse100_base
directory.
With the same method install suse100_compat
and suse100_x11.
The final configuration is:
#pkg_info -a | grep susesuse_base-10.0nb3 Linux compatibility package suse_compat-10.0nb1 Linux compatibility package with old shared libraries suse_x11-10.0nb2 Linux compatibility package for X11 binaries
Now everything is ready for the installation of the
Acrobat Reader program (or other Linux
programs).
Change to
/usr/pkgsrc/print/acroread7 and give the
usual commands.
#make#make install
To download and install Acrobat Reader you need to add the line
“ACCEPTABLE_LICENSES+=adobe-acrobat-license” to
/etc/mk.conf to accept the Acrobat Reader
license, simply follow the instructions given after
make.
If we examine the outcome of the installation of the Linux
libraries and programs we find that
/emul/linux is a symbolic link pointing to
/usr/pkg/emul/linux, where the following
directories have been created:
bin/
dev/
etc/
lib/
opt/
proc/
root/
sbin/
usr/
var/
Please always refer to /emul/linux and not
to /usr/pkg/emul/linux.
The latter is an implementation detail and may change in the
future.
How much space is required for the Linux emulation software? On one system we got the following figure:
#cd /usr/pkg/emul#du -k /emul/linux/... 127804 /emul/linux/
Acrobat Reader, the program, has been
installed in the usual directory for package binaries:
/usr/pkg/bin. It can be run just as any
other program:
$acroread netbsd.pdf
Some Linux programs rely on a Linux-like /proc
filesystem. The NetBSD procfs filesystem can emulate a
/proc filesystem that contains Linux-specific
pseudo-files. To accomplish this you can mount the procfs with
the “linux”-option:
#mount_procfs -o linux procfs /emul/linux/proc
In this example a Linux-like proc filesystem will be mounted to
the /emul/linux/proc directory. You can also
let NetBSD mount it automatically during the booting process of
NetBSD, by adding the following line to /etc/fstab:
procfs /emul/linux/proc procfs ro,linux
Linux plugins for Mozilla-based browsers can be used on native NetBSD Firefox builds through nspluginwrapper, a wrapper that translates between the native browser and a foreign plugin. At the moment, nspluginwrapper only works reliably on Mozilla-based browsers that link against GTK2+ (GTK1+ is not supported). nspluginwrapper can be installed through pkgsrc:
#cd /usr/pkgsrc/www/nspluginwrapper#make install
Plugins can then be installed in two steps: first, the plugin has to be installed on the system (e.g. through pkgsrc). After that the plugin should be registered with the nspluginwrapper by the users who want to use that plugin.
In this short example we will have a look at installing the Macromedia Flash plugin. We can fullfill the first step by installing the Flash plugin through pkgsrc:
#cd /usr/pkgsrc/multimedia/ns-flash#make install
After that an unprivileged user can register the Flash plugin:
$ nspluginwrapper -i /usr/pkg/lib/netscape/plugins/libflashplayer.so
The plugin should then be registered correctly. You can check this
by using the -l option of
nspluginwrapper
(nspluginwrapper -l). If the plugin is listed,
you can restart Firefox, and verify that the plugin was installed
by entering about:plugins in the location
bar.
The following articles may be of interest for further understanding Linux (and other) emulation:
Implementing Linux emulation on NetBSD . May 2004.
Irix binary compatibility, part 1 . Aug 2002.
Irix binary compatibility, part 2 . Aug 2002.
Irix binary compatibility, part 3 . Sep 2002.
Irix binary compatibility, part 4 . Oct 2002.
Irix binary compatibility, part 5 . Dec 2002.
Irix binary compatibility, part 6 . Apr 2003.
Table of Contents
This chapter is a short introduction to the usage of audio devices on NetBSD (who wants a dumb computer, anyway?)
In order to make audio work on your system you must know what audio card is installed. Sadly it is often not enough to know the brand and model of the card, because many cards use chipsets manufactured from third parties. Therefore knowing the chipset installed on the audio card can sometimes be useful. The NetBSD kernel can recognize many chipsets and a quick look at dmesg is enough most of the time.
Therefore, type the following command:
#dmesg | more
and look for the audio card and chipset. If you're lucky you won't need to do anything because NetBSD automatically detects and configures many audio cards.
Sometimes audio doesn't work because the card is not supported or because you need to do some work in order for the card to be detected by NetBSD. Many audio cards are nowadays very cheap, and it is worth considering buying a different card, but before doing this you can try some simple steps to make the card work with NetBSD.
This section is useful only to the owners of i386 PCs; on other architectures (e.g. Amiga) there are no such features. The most important thing to determine in order to use the audio card with NetBSD is the type of bus supported by the card.
The most common interfaces are ISA and PCI.
ISA Plug and Play cards are usually more tricky to configure mostly because of the interaction with the BIOS of the computer.
On the newer machines (those produced after 1997) there is a BIOS option which causes many headaches for the configuration of ISA Plug and Play audio cards (but not only audio cards): this option is usually named “PNP OS Installed” and is commonly found in the “PNP/PCI Configuration” (the names can be different in your BIOS.) As a general rule it is usually better to disable (i.e. set it to “NO”) this option for NetBSD.
On many systems everything works fine even if this option is enabled. This is highly system dependent.
During the installation of NetBSD the devices are created in
the /dev directory.
We are primarily interested in:
/dev/audio
/dev/sound
/dev/mixer
If they are not present they can be created like this:
#cd /dev#./MAKEDEV all
This command creates all the devices, including the audio devices.
The audio card is now probably ready to be used without further work.
You can make a quick test and send an audio file to the
device (audio files usually have the .au
extension), but if you don't have an audio file you can just
send a text or binary file (of course you won't hear anything
useful...).
Use /dev/audio or
/dev/sound:
#cat filename > /dev/audio
or
#cat filename > /dev/sound
If you hear something it means that the card is supported by NetBSD and was recognized and configured by the kernel at boot; otherwise you must configure the kernel settings for the audio device installed on the system (assuming the card/chipset is supported.)
NetBSD supports a wide range of audio cards and the GENERIC kernel already enables and configures most of them. Sometimes it is necessary to manually set up the IRQ and DMA for non-PnP ISA cards.
When you create a custom kernel it is better to work on a copy of the GENERIC file, as described in Chapter 32, Compiling the kernel.
If you still have problems you can try enabling all the devices, because some audio cards can be made to work only by emulating another card.
Many chipset make use of the SoundBlaster and OPL compatibility, but a great number of them work with the WSS emulation.
OPL is a MIDI synthesizer produced by Yamaha; there are many OPL variants (e.g. OPL2, OPL3SA, OPL3SA2, etc.). Many audio cards rely on this component or on a compatible one. For example, the chips produced by Crystal (and amongst them the very common CS423x) all have this chipset, and that's why they work with NetBSD.
WSS is not a microchip; it is the acronym of Windows Sound System. WSS is the name of the NetBSD kernel driver which supports the audio system of Microsoft Windows. Many audio cards work with Windows because they adhere to this standard (WSS) and the same holds for NetBSD.
Of the many audio cards that I tested with NetBSD, a good
number work only if opl* and
wss* are enabled in the kernel.
You should have no problem to get the Creative SoundBlaster cards to work with NetBSD: almost all of them are supported, including the Sound Blaster Live 1024!
When everything works you can disable in the kernel configuration file the devices that you don't need.
NetBSD comes with a number of commands that deal with audio devices. They are:
audioctl(1) made its appearance in NetBSD 1.3 and is used to manually set some variables regarding audio I/O, like the frequencies for playing and recording. The available parameters can be displayed with the following command:
#audioctl -a | more
For example, to listen to CD quality music you can use the following command.
#audioctl -w play=44100,2,16,slinear_le
This command sets the frequency to 44100Hz, 2 audio channels, 16 bit, slinear_le encoding.
You can see the supported encodings with:
#audioctl encodings
This command displays the list of all the encodings supported by the audio card on your system.
This command is used to configure the audio mixing and has an interface similar to that of audioctl(1).
With this command you can play audio files in simple formats like ULAW and WAV. For more sophisticated needs you might want to install one of the many programs available in the package system which let you play audio files in different formats (e.g. MP3, etc.)
Not unsurprisingly this command is used to record audio files.
Table of Contents
This chapter describes a simple configuration for printing,
using an HP Deskjet 690C printer connected to the first parallel port
and the lpd printing system that comes with NetBSD.
First, the system will be configured to print text documents, and
next the configuration will be extended to print PostScript
documents using the Ghostscript program
(print/ghostscript).
Please note that there are other, alternative printing systems
available from the
packages collection, like LPRng
(print/LPRng) and the
Common Unix Printing System (CUPS)
(print/cups)
which are not covered here.
After installation it is not yet possible to print, because the
lpd printer spooler daemon is not enabled.
To enable lpd, one line in the
/etc/rc.conf file must be changed from:
lpd=NO
to
lpd=YES
The change will come into effect at the next boot, but the daemon can be started manually now:
#sh /etc/rc.d/lpd start
To check if lpd is active, type the following command:
#ps ax | grep lpd179 ?? Is 0:00.01 lpd
If you don't see an entry for lpd in the output of the previous command, the daemon is not active.
The lpd system is configured via
/etc/printcap. Before configuring
/etc/printcap it is a good idea
to make a printer test, to check if the physical connection
between your computer and the printer is working.
The test sends out some data directly to the printer
device. Assuming you use a printer connected to the parallel
port, this is /dev/lpt0; if you use an USB
printer try /dev/ulpt0. Please check the
manpages of these devices (lpt(4), ulpt(4)) for more
information!
In our example we have a printer attached to the parallel port, so we run this:
#lptest 70 5 > /dev/lpt0
To see what the output should look like, try the same command without redirecting the output to the printer:
#lptest 70 5!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdef "#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefg #$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefgh $%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghi %&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij
A frequent problem is that the output on the printer is not correctly aligned in columns but has a “staircase” configuration. This usually means that the printer is configured to begin a new line at the left margin after receiving both a <CR> (carriage return, ASCII 13) character and a <LF> (line feed, ASCII 10) character. NetBSD only sends a <LF> character. You can fix this problem in two ways:
by changing the configuration of the printer
by using a simple printer filter (described later)
In the previous example the lpd
spooler is not involved because the program output is sent
directly to the printer device (/dev/lpt0)
and is not spooled.
This section explains how to configure the example printer to print text documents.
The printer must have an entry in the
/etc/printcap file; the entry contains the
printer id (the name of the printer) and the printer
description. The lp id is the default
used by many programs. Here is an example entry:
Example 12.1. /etc/printcap
lp|local printer|HP DeskJet 690C:\
:lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
:sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:The file format and options are described in detail in the printcap(5) manpage. Please note that an input filter has been specified (with the if option) which will take care of eliminating the staircase problem:
if=/usr/local/libexec/lpfilter
Example 12.1, “/etc/printcap” uses the lpa0 device (polled driver) for the printer, instead of the lpd0 (interrupt driven driver). Using interrupts there is a communication problem with some printers, and the HP Deskjet 690C is one of them: printing is very slow and one PostScript page can take hours. The problem is solved using the lpa driver. It is also possible to compile a custom kernel where lpt is polled.
The printcap entry for the printer also specifies a spool directory, which must be created; this directory will be used by the lpd daemon to accumulate the data to be printed:
#cd /var/spool/lpd#mkdir lp#chown daemon:daemon lp#chmod 770 lp
The only missing part is the
lpfilter input filter, which must be written.
The only task performed by this filter is to configure the printer for
the elimination of the staircase problem before sending the text to be
printed.
The printer used in this example requires the following initialization
string:
“<ESC>&k2G”.
Example 12.2. /usr/local/libexec/lpfilter
#!/bin/sh # Treat LF as CR+LF printf "\033&k2G" && cat && exit 0 exit 2
After saving this script into the name you used in
/etc/printcap, you need to make sure it's
executable:
#chmod 755 /usr/local/libexec/lpfilter*
There is another filter that can be used:
if=/usr/libexec/lpr/lpf:
This filter is much more complex than the one presented before.
It is written to process the output of nroff
and handles underline and overprinting, expands tab characters
and converts LF to CR + LF.
The source to this filter program can be found in
/usr/src/usr.sbin/lpr/filters/lpf.c.
After everything is in place now, the lptest command can be run again now, this time using the lpr command, which will first send the data to the lpd spooler, then runs the filter and sends the data off to the printer:
#lptest 70 5 | lpr -h
The lpr program prints text using the
spooler to send data to the printer; the -h
option turns off the printing of a banner page (not really
necessary, because of the sh option in
/etc/printcap). Users more familiar with
the System V printing system can also use the lp(1) command
that comes as an alternative to lpr(1).
Now that basic printing works, the functionality for printing PostScript files can be added. The simple printer used in this example does not support native printing of PostScript files; a program must be used which is capable of converting a PostScript document in a sequence of commands that the printer understands. The Ghostscript program, which can be found in packages collection, can be used to this purpose. This section explains how to configure lpd to use Ghostscript to print PostScript files on the HP Deskjet 690C.
A second id for the printer will be created in
/etc/printcap: this new id will use a different
input filter, which will call Ghostscript to perform the actual print
of the PostScript document.
Therefore, text documents will be printed on the
lp printer and PostScript documents on the
ps printer: both entries use the same physical
printer but have different printing filters.
The same result can be achieved using different configurations. For example, a single entry with only one filter could be used. For this, the filter should be able to automatically determine the format of the document being printed, and use the appropriate printing program. This approach is simpler but leads to a more complex filter; if you like it you should consider installing the magicfilter program from the packages collection: it does this and many other things automatically.
For our approach, the new /etc/printcap
file looks like this:
Example 12.3. /etc/printcap
lp|local printer|HP DeskJet 690C:\
:lp=/dev/lpa0:sd=/var/spool/lpd/lp:lf=/var/log/lpd-errs:\
:sh:pl#66:pw#80:if=/usr/local/libexec/lpfilter:
ps|Ghostscript driver:\
:lp=/dev/lpa0:sd=/var/spool/lpd/ps:lf=/var/log/lpd-errs:\
:mx#0:sh:if=/usr/local/libexec/lpfilter-ps:Option mx#0 is very important for printing PostScript
files because it eliminates size restrictions on the input file;
PostScript documents tend to be very big.
The if option points to the new filter.
There is also a new spool directory.
The next steps are the creation of the new spool directory and of the filter program. The procedure for the spool directory is the same as above:
#cd /var/spool/lpd#mkdir ps#chown daemon:daemon ps#chmod 770 ps
The filter program for PostScript output is more complex than
the text base one: the file to be printed is fed to the
interpreter which converts it into a sequence of
commands in the printer's control language, and then sends that
off to the printer. We have achieved to
transform a cheap color printer in a device suitable for
PostScript output, by virtue of the NetBSD operating system and
some powerful freeware packages. The options used to configure
Ghostscript are described in the
Ghostscript documentation: cdj550 is the
device used to drive the HP printer.
Example 12.4. /usr/local/libexec/lpfilter-ps
#!/bin/sh # Treat LF as CR+LF printf "\033&k2G" || exit 2 # Print the postscript file /usr/pkg/bin/gs -dSAFER -dBATCH -dQUIET -dNOPAUSE -q -sDEVICE=cdj550 \ -sOutputFile=- -sPAPERSIZE=a4 - && exit 0 exit 2
To summarize: two different printer names have been created on the system, which point to the same physical printer but use different options, different filters and different spool directories. Text files and PostScript files can be printed. To print PostScript files the Ghostscript package must be installed on the system.
This section lists some useful BSD commands for printer and print jobs administration. Besides the already mentioned lpr and lpd commands, we have:
examine the printer job queue.
delete jobs from the printer's queue.
check the printing system, enable/disable printers and printer features.
It is possible to configure the printing system in order to
print on a printer connected to a remote host.
Let's say that, for example, you work on the wotan
host and you want to print on the printer connected to the
loge host.
The /etc/printcap file of loge is the one
of Example 12.3, “/etc/printcap”.
From wotan it will be possible to print Postscript files using
Ghostscript on loge.
The first step is to accept the print jobs submitted
from the wotan host to the loge host.
To accomplish this, a line with the wotan host name must be added
to the /etc/hosts.lpd file on loge:
#hostnameloge#cat /etc/hosts.lpdwotan
The format of this file is very simple: each line contains the
name of a host which is permitted to print on the local system.
By default the lpd daemon only listens on UNIX domain sockets
for local connections, it won't accept any network connects.
To ensure the daemon also accepts incoming network traffic, the
following will need to be added to
/etc/rc.conf:
lpd_flags=""
Next, the /etc/printcap file on wotan
must be configured in order to send print jobs to loge.
For example:
lp|line printer on loge:\ :lp=:sd=/var/spool/lpd/lp:lf=/var/log/lp-errs:\ :rm=loge:rp=lp ps|Ghostscript driver on loge:\ :lp=:sd=/var/spool/lpd/ps:lf=/var/log/lp-errs:\ :mx#0:\ :rm=loge:rp=ps
There are four main differences between this configuration and the one of Example 12.3, “/etc/printcap”.
The definition of “lp” is empty.
The “rm” (remote machine) entry defines the name of the host to which the printer is connected.
The “rp” (remote printer) entry defines the name of the printer connected to the remote host.
It is not necessary to specify input filters because the definitions on the loge host will be used.
The spool directories must still be created locally on wotan:
#cd /var/spool/lpd#mkdir lp#chown daemon:daemon lp#chmod 770 lp#mkdir ps#chown daemon:daemon ps#chmod 770 ps
Now the print jobs for the “lp” and “ps” queues on wotan will be sent automatically to the printer connected to loge.
Table of Contents
PC-style floppy disks work mostly like other disk devices like hard disks, except that you need to low-level format them first. To use an common 1440 KB floppy in the first floppy drive, first (as root) format it:
# fdformat -f /dev/rfd0a
Then create a single partition on the disk using disklabel(8):
# disklabel -rw /dev/rfd0a floppy3
Creating a small filesystem optimized for space:
# newfs -m 0 -o space -i 16384 -c 80 /dev/rfd0a
Now the floppy disk can be mounted like any other disk. Or if you already have a floppy disk with an MS-DOS filesystem on it that you just want to access from NetBSD, you can just do something like this:
# mount -t msdos /dev/fd0a /mnt
However, rather than using floppies like normal (bigger) disks, it is often more convenient to bypass the filesystem altogether and just splat an archive of files directly to the raw device. E.g.:
# tar cvfz /dev/rfd0a file1 file2 ...
A variation of this can also be done with MS-DOS floppies using
the sysutils/mtools package which
has the benefit of not going through the kernel buffer cache
and thus not being exposed to the danger of the floppy being
removed while a filesystem is mounted on it.
See if your system has a ZIP drive:
#dmesg | grep -i zipsd0 at atapibus0 drive 1: <IOMEGA ZIP 100 ATAPI, , 14.A> type 0 direct removable
Seems it has one, and it's recognized as sd0, just like any SCSI disk. The fact that the ZIP here is an ATAPI one doesn't matter - a SCSI ZIP will show up here, too. The ZIP is marked as "removable", which means you can eject it with:
#eject sd0
Insert ZIP disk
Check out what partitions are on the ZIP:
#disklabel sd0#/dev/rsd0d: type: ATAPI ... 8 partitions:#size offset fstype [fsize bsize cpg] d: 196608 0 unused 0 0 # (Cyl. 0 - 95) h: 196576 32 MSDOS # (Cyl. 0*- 95) disklabel: boot block size 0 disklabel: super block size 0
is the whole disk, as usual on i386.
is what you want, and you can see it's a msdos filesystem even.
Hence, use /dev/sd0h to access the zip's partition.
Mount it:
#mount -t msdos /dev/sd0h /mnt
Access your files:
#ls -la /mnttotal 40809 drwxr-xr-x 1 root wheel 16384 Dec 31 1979 . drwxr-xr-x 28 root wheel 1024 Aug 2 22:06 .. -rwxr-xr-x 1 root wheel 1474560 Feb 23 1999 boot1.fs -rwxr-xr-x 1 root wheel 1474560 Feb 23 1999 boot2.fs -rwxr-xr-x 1 root wheel 548864 Feb 23 1999 boot3.fs -rwxr-xr-x 1 root wheel 38271173 Feb 23 1999 netbsd19990223.tar.gz
Unmount the ZIP:
#umount /mnt#
Eject the ZIP:
#eject sd0#
Data CDs can contain anything from programs, sound files (MP3, wav), movies (MP3, QuickTime) to source code, text files, etc. Before accessing these files, a CD must be mounted on a directory, much like hard disks are. Just as hard disks can use different filesystems (ffs, lfs, ext2fs, ...), CDs have their own filesystem, "cd9660". The NetBSD cd9660 filesystem can handle filesystems without and with Rockridge and Joliet extensions.
CD devices are named /dev/cd0a for both SCSI and IDE (ATAPI).
With this information, we can start:
See if your system has some CD drive:
#dmesg | grep ^cdcd0 at atapibus0 drive 0: <CD-R/RW RW8040A, , 1.12> type 5 cdrom removable cd0: 32-bit data port cd0: drive supports PIO mode 4, DMA mode 0 cd0(pciide0:1:0): using PIO mode 0, DMA mode 0 (using DMA data transfers)
We have one drive here, "cd0". It is an IDE/ATAPI drive, as it is found on atapibus0. Of course the drive (rather, its medium) is removable, i.e., you can eject it. See below.
Insert a CD
Mount the CD manually:
#mount -t cd9660 /dev/cd0a /mnt#
This command shouldn't print anything. It instructs the system to mount the CD found on /dev/cd0a on /mnt, using the "cd9660" filesystem. The mountpoint "/mnt" must be an existing directory.
Check the contents of the CD:
#ls /mntINSTALL.html INSTALL.ps TRANS.TBL boot.catalog INSTALL.more INSTALL.txt binary installation#
Everything looks fine! This is a NetBSD CD, of course. :)
Unmount the CD:
#umount /mnt#
If the CD is still accessed (e.g. some other shell's still "cd"'d into it), this will not work. If you shut down the system, the CD will be unmounted automatically for you, there's nothing to worry about there.
Making an entry in /etc/fstab:
If you don't want to type the full "mount" command each time, you can put most of the values into a line in /etc/fstab:
# Device mountpoint filesystem mount options /dev/cd0a /cdrom cd9660 ro,noauto
Make sure that the mountpoint,
/cdrom in our
example, exists:
#mkdir /cdrom#
Now you can mount the cd with the following command:
#mount /cdrom#
Access and unmount as before.
The CD is not mounted at boot time due to the "noauto" mount option - this is useful as you'll probably not have a CD in the drive all the time. See mount(8) and mount_cd9660(8) for some other useful options.
Eject the CD:
#eject cd0#
If the CD is still mounted, it will be unmounted if possible, before being ejected.
Use mscdlabel(8) to add all sessions to the CDs
disklabel, and
then use the appropriate device node to mount the session you want.
You might have to create the corresponding device nodes in
/dev manually.
For example:
#mscdlabel cd1track (ctl=4) at sector 142312 adding as 'a' track (ctl=4) at sector 0 adding as 'b'#ls -l /dev/cd1bls: /dev/cd1b: No such file or directory#cd /dev#ls -l cd1*brw-r----- 1 root operator 6, 8 Mar 18 21:55 cd1a brw-r----- 1 root operator 6, 11 Mar 18 21:55 cd1d#mknod cd1b b 6 9
to create /dev/cd1b.
Make sure you fix the permissions of any new device
nodes you create:
#ls -l cd1*brw-r----- 1 root operator 6, 8 Mar 18 21:55 cd1a brw-r--r-- 1 root wheel 6, 9 Mar 18 22:23 cd1b brw-r----- 1 root operator 6, 11 Mar 18 21:55 cd1d#chgrp operator cd1b#chmod 640 cd1b#ls -l cd1*brw-r----- 1 root operator 6, 8 Mar 18 21:55 cd1a brw-r----- 1 root operator 6, 9 Mar 18 22:24 cd1b brw-r----- 1 root operator 6, 11 Mar 18 21:55 cd1d
Now you should be able to mount it.
#mount /dev/cd1b /mnt
By default, NetBSD only allows "root" to mount a filesystem. If you want any user to be able to do this, perform the following steps:
Give groups and other the access rights to the device.
# chmod go+rw /dev/cd0a
Ask NetBSD to let users mounting filesystems.
# sysctl -w vfs.generic.usermount=1
Note that this works for any filesystem and device, not only for CDs with a ISO 9660 filesystem.
To perform the mount operation after these commands, the user must own the mount point. So, for example:
$cd $HOME$mkdir cdrom$mount -t cd9660 -o nodev,nosuid /dev/cd0a `pwd`/cdrom
The mount options nodev and
nosuid are mandatory from NetBSD 4.0 on. They are
not necessary on NetBSD 3.x systems.
Please also see mount(8) and as an alternative the
auto mount daemon amd(8), for which
example config files can be found in
/usr/share/examples/amd.
Sometimes, it is interesting to mount an ISO9660 image file before you burn the CD; this way, you can examine its contents or even copy files to the outside. If you are a Linux user, you should know that this is done with the special loop filesystem. NetBSD does it another way, using the vnode pseudo-disk.
We will illustrate how to do this with an example. Suppose you have an ISO image in your home directory, called "mycd.iso":
Start by setting up a new vnode, "pointing" to the ISO file:
#vnconfig -c vnd0 ~/mycd.iso
Now, mount the vnode:
#mount -t cd9660 /dev/vnd0a /mnt
Yeah, image contents appear under /mnt!
Go to that
directory and explore the image.
When you are happy, you have to umount the image:
#umount /mnt
And at last, deconfigure the vnode:
#vnconfig -u vnd0
Note that these steps can also be used for any kind of file that contains a filesystem, not just ISO images.
See the vnd(4) and vnconfig(8) man pages for more information.
To play MPEG Video streams as many DVD players can play them
under NetBSD, mount the CD as you would do with any normal (data)
CD (see Section 13.3, “Reading data CDs with NetBSD”), then use the
multimedia/xine-ui,
multimedia/mplayer or
multimedia/gmplayer
package to play the mpeg files stored on the CD.
There are two ways to handle audio CDs:
Tell the CD drive to play to the headphone or to a
soundcard, to which CDROMs are usually connected
internally. Use programs like cdplay(1),
audio/xmcd, "kscd"
from the
multimedia/kdemultimedia3 package, mixer
programs like mixerctl(1),
audio/xmix,
audio/xmmix,
the Curses based audio/cam,
or kmix, which is part of
multimedia/kdemultimedia3.
This usually works well on both SCSI and IDE (ATAPI) CDROMs, CDRW and DVD drives.
To read ("rip") audio tracks in binary form without going through digital->analog conversion and back. There are several programs available to do this:
For most ATAPI, SCSI and several proprietary
CDROM drives, the
audio/cdparanoia package can be
used. With cdparanoia the data can be saved to a file or
directed to standard output in WAV, AIFF, AIFF-C or raw
format. Currently the -g option is required by the NetBSD
version of cdparanoia. A hypothetical example of how to save
track 2 as a WAV file is as follows:
$cdparanoia -g /dev/rcd0d 2 track-02.wav
If you want to grab all files from a CD, cdparanoia's batch mode is useful:
$cdparanoia -g /dev/rcd0d -B
For ATAPI or SCSI CD-ROMs the
audio/cdd package can be
used. To extract track 2 with cdd, type:
#cdd -t 2 `pwd`
This will put a file called
track-02.cda
in the current directory.
For SCSI CD-ROMS the
audio/tosha package can be used.
To extract track 2 with tosha, you should be able to type:
#tosha -d-t 2 -o track-02.cdaCD-ROM-device
The data can then be post-processed e.g. by encoding it into MP3 streams (see Section 13.9, “Creating an MP3 (MPEG layer 3) file from an audio CD”) or by writing them to CD-Rs (see Section 13.11, “Using a CD-R writer to create audio CDs”).
The basic steps in creating an MPEG layer 3 (MP3) file from an audio CD (using software from the NetBSD packages collection) are:
Extract (rip) the audio data of the CD as shown in Section 13.8, “Using audio CDs with NetBSD”.
Convert the CD audio format file to WAV format. You only need to perform this job if your ripping program (e.g. tosha, cdd) didn't already do the job for you!
Using the audio/sox
package, type:
$ sox -s -w -c 2 -r 44100 -t cdr track-02.cda track-02.wav
This will convert track-02.cda
in raw CD format to
track-02.wav in WAV format,
using signed 16-bit
words with 2
channels at a sampling
rate of
44100kHz.
Encode the WAV file into MP3 format.
Using the audio/bladeenc
package, type:
$ bladeenc -128 -QUIT track-02.wav
This will encode track-02.wav into
track-02.mp3 in
MP3 format, using a bit rate if
128kBit/sec.
The documentation
for bladeenc describes bit-rates in more detail.
Using the audio/lame
package, type:
$ lame -p -o -v -V 5 -h track-02.wav track-02.mp3
You may wish to use a lower quality, depending on your taste and hardware.
The resultant MP3 file can be played with any of the
audio/gqmpeg,
audio/maplay,
audio/mpg123 or
audio/splay packages.
The process of writing a CD consists of two steps: First, a "image" of the data must be generated, which can then be written to CD-R in a second step.
Reading an pre-existing ISO image
#dd if=/dev/rcd0a of=filename.iso bs=2k#
Alternatively, you can create a new ISO image yourself:
Generating the ISO image
Put all the data you want to put on CD into one directory. Next you need to generate a disk-like ISO image of your data. The image stores the data in the same form as they're later put on CD, using the ISO 9660 format. The basic ISO9660 format only understands 8+3 filenames (max. eight letters for filename, plus three more for an extension). As this is not practical for Unix filenames, a so-called "Rockridge Extension" needs to be employed to get longer filenames. (A different set of such extension exists in the Microsoft world, to get their long filenames right; that's what's known as Joliet filesystem).
The ISO image is created using the mkisofs command,
which is part
of the sysutils/cdrtools
package.
Example: if you have your data in /usr/tmp/data, you can generate a ISO image file in /usr/tmp/data.iso with the following command:
$cd /usr/tmp$mkisofs -o data.iso -r data Using NETBS000.GZ;1 for data/binary/kernel/netbsd.INSTALL.gz (netbsd.INSTALL_TINY.gz) Using NETBS001.GZ;1 for data/binary/kernel/netbsd.GENERIC.gz (netbsd.GENERIC_TINY.gz) 5.92% done, estimate finish Wed Sep 13 21:28:11 2000 11.83% done, estimate finish Wed Sep 13 21:28:03 2000 17.74% done, estimate finish Wed Sep 13 21:28:00 2000 23.64% done, estimate finish Wed Sep 13 21:28:03 2000 ... 88.64% done, estimate finish Wed Sep 13 21:27:55 2000 94.53% done, estimate finish Wed Sep 13 21:27:55 2000 Total translation table size: 0 Total rockridge attributes bytes: 5395 Total directory bytes: 16384 Path table size(bytes): 110 Max brk space used 153c4 84625 extents written (165 Mb)$
Please see the mkisofs(8) man page for other options like noting publisher and preparer. The Bootable CD ROM How-To explains how to generate a bootable CD.
Writing the ISO image to CD-R
When you have the ISO image file,
you just need to write it on a
CD. This is done with the "cdrecord" command from the
sysutils/cdrtools package.
Insert a blank CD-R, and off we go:
#cdrecord -v dev=/dev/rcd0d data.iso...#
After starting the command, 'cdrecord' shows you a lot of information about your drive, the disk and the image you're about to write. It then does a 10 seconds countdown, which is your last chance to stop things - type ^C if you want to abort. If you don't abort, the process will write the whole image to the CD and return with a shell prompt.
Note that cdrecord(8) works on both SCSI and IDE (ATAPI) drives.
Test
Mount the just-written CD and test it as you would do with any "normal" CD, see Section 13.3, “Reading data CDs with NetBSD”.
If you want to make a backup copy of one of your audio CDs, you can do so by extracting ("ripping") the audio tracks from the CD, and then writing them back to a blank CD. Of course this also works fine if you only extract single tracks from various CDs, creating your very own mix CD!
The steps involved are:
Extract ("rip") the audio tracks as described as in Section 13.8, “Using audio CDs with NetBSD” to get a couple of .wav files.
Write the .wav files using cdrecord command from the
sysutils/cdrtools package:
#cdrecord -v dev=/dev/rcd0d -audio -pad *.wav
If you have converted all your audio CDs to MP3 and now want to make a mixed CD for your (e.g.) your car, you can do so by first converting the .mp3 files back to .wav format, then write them as a normal audio CD.
The steps involved here are:
Create .wav files from your .mp3 files:
$mpg123 -w foo.wav foo.mp3
Do this for all of the MP3 files that you want to have on your audio CD. The .wav filenames you use don't matter.
Write the .wav files to CD as described under Section 13.11, “Using a CD-R writer to create audio CDs”.
To copy an audio CD while not introducing any pauses as mandated by the CDDA standard, you can use cdrdao for that:
#cdrdao read-cd --device /dev/rcd0d data.toc#cdrdao write --device /dev/rcd1d data.toc
If you have both a CD-R and a CD-ROM drive in your machine, you can copy a data CD with the following command:
#cdrecord dev=/dev/rcd1d /dev/rcd0d
Here the CD-ROM (cd0) contains the CD you want to copy, and the CD-R
(cd1) contains the blank disk. Note that this only works with computer
disks that contain some sort of data, it does
not work with
audio CDs! In practice you'll also want to add something like
"speed=8" to make things a bit
faster.
You can treat a CD-RW drive like a CD-R drive (see Section 13.10, “Using a CD-R writer with data CDs”) in NetBSD, creating images with mkisofs(8) and writing them on a CD-RW medium with cdrecord(8).
If you want to blank a CD-RW, you can do this with cdrecord's
"blank" option:
#cdrecord dev=/dev/rcd0d blank=fast
There are several other ways to blank the CD-RW,
call cdrecord(8) with
"blank=help" for a list. See the cdrecord(8)
man page for more information.
Currently, NetBSD supports DVD media through the ISO 9660
also used for CD-ROMs. The new UDF filesystem also present on DVDs
has been supported since NetBSD 4.0. Information about mounting ISO 9660
and UDF filesystems can be found in the mount_cd9660(8) and
mount_udf(8) manual pages respectively.
DVDs, DivX and many avi files be played with multimedia/ogle
or multimedia/gmplayer.
For some hints on creating DVDs, see this postings about growisofs and this article about recording CDs and DVDs with NetBSD.
To create an ISO image and save the checksum do this:
#readcd dev=/dev/cd0d f=/tmp/cd.iso
Here is an alternative using dd(1):
#dd if=/dev/cd0d of=/tmp/cd.iso bs=2048
If the CD has errors you can recover the rest with this:
#dd if=/dev/cd0d of=/tmp/cd.iso bs=2048 conv=noerror
To create an ISO image from a mounted data CD first, mount the CD disk by:
#mount -t cd9660 -r /dev/cd0d /mnt/cdrom
Second, get the image:
#mkhybrid -v -l -J -R -o /tmp/my_cd.iso /mnt/cdrom/
You can read the volume data from an unmounted CD with this command:
#file -s /dev/cd0d
You can read the volume data from an ISO image with this command:
#isoinfo -d -i /tmp/my_cd.iso
You can get the unique disk number from an unmounted CD with this:
#cd-discid /dev/cd0d
You can read the table of contents of an unmounted CD with this command:
#cdrecord -v dev=/dev/cd0d -toc
Table of Contents
The cgd driver provides functionality
which allows you to use disks or partitions for encrypted storage.
After providing the appropriate key, the encrypted partition is
accessible using cgd pseudo-devices.
People often store sensitive information on their hard disks and are concerned about this information falling into the wrong hands. This is particularly relevant to users of laptops and other portable devices, or portable media, which might be stolen or accidentally misplaced.
File-oriented encryption tools like GnuPG are great for encrypting individual files, which can then be sent across untrusted networks as well as stored encrypted on disk. But sometimes they can be inconvenient, because the file must be decrypted each time it is to be used; this is especially cumbersome when you have a large collection of files to protect. Any time a security tool is cumbersome to use, there's a chance you'll forget to use it properly, leaving the files unprotected for the sake of convenience.
Worse, readable copies of the encrypted contents might still exist on the hard disk. Even if you overwrite these files (using rm -P) before unlinking them, your application software might make temporary copies you don't know about, or have been paged to swapspace - and even your hard disk might have silently remapped failing sectors with data still in them.
The solution is to simply never write the information unencrypted to the hard disk. Rather than taking a file-oriented approach to encryption, consider a block-oriented approach - a virtual hard disk, that looks just like a normal hard disk with normal filesystems, but which encrypts and decrypts each block on the way to and from the real disk.
The cgd device looks and behaves to the rest of
the operating system like any other disk driver. Rather than
driving real hardware directly, it provides a logical function
layered on top of another block device. It has a special
configuration program, cgdconfig, to create and
configure a cgd device and point it at the
underlying disk device that will hold the encrypted data.
NetBSD includes several other similar logical block devices, each
of which provides some other function where cgd
provides encryption. You can stack several of these logical block
devices together:
you can make an encrypted
raid to protect your encrypted data against
hard disk failure as well.
Once you have created a cgd disk, you can
use disklabel to divide it up into
partitions, swapctl to enable swapping to
those partitions or newfs to make
filesystems, then mount and use those
filesystems, just like any other new disk.
A number of components and tools work together to make the
cgd system effective.
To use cgd you need a kernel with support
for the cgd pseudo-device. Make sure the
following line is in the kernel configuration file:
pseudo-device cgd 4 # cryptographic disk driver
The number specifies how many cgd
devices may be configured at the same time. After configuring
the cgd pseudo-device you can recompile
the kernel and boot it to enable cgd
support.
The cgd driver provides the following
encryption algorithms:
Encryption Methods
aes-cbcAES (Rijndael). AES uses a 128 bit blocksize and accepts 128, 192 or 256 bit keys.
blowfish-cbcBlowfish uses a 64 bit blocksize and accepts 128 bit keys
3des-cbcTriple DES uses a 64 bit blocksize and accepts 192 bit keys (only 168 bits are actually used for encryption)
All three ciphers are used in CBC mode. This means each block is XORed with the previous encrypted block before encryption. This reduces the risk that a pattern can be found, which can be used to break the encryption.
Another aspect of cgd that needs some
attention are the verification methods
cgdconfig provides. These verification
methods are used to verify the passphrase is correct. The
following verification methods are available:
Verification Methods
noneno verification is performed. This can be dangerous,
because the key is not verified at all. When a wrong key
is entered cgdconfig configures the
cgd device as normal, but data
which was available on the volume will be destroyed
(decrypting blocks with a wrong key will result in
random data, which will result in a regeneration of the
disklabel with the current key).
disklabelcgdconfig scans for a valid disklabel. If a valid disklabel is found with the key that is provided authentication will succeed.
ffscgdconfig scans for a valid FFS file system. If a valid FFS file system is found with the key that is provided authentication will succeed.
This section works through a step-by-step example of converting
an existing system to use cgd,
performing the following actions:
Preparing the disk and partitions
Scrub off all data
Create the cgd
Adjust config-files
Restoring your backed-up files to the encrypted disk
First, decide which filesystems you want to move to an encrypted
device. You're going to need to leave at least the small root
(/) filesystem unencrypted, in order to load
the kernel and run init,
cgdconfig and the rc.d
scripts that configure your cgd. In this
example, we'll encrypt everything except the root
(/) filesystem.
We are going to delete and re-make partitions and filesystems, and will require a backup to restore the data. So make sure you have a current, reliable backup stored on a different disk or machine. Do your backup in single-user mode, with the filesystems unmounted, to ensure you get a clean dump. Make sure you back up the disklabel of your hard disk as well, so you have a record of the partition layout before you started.
With the system at single user, / mounted
read-write and everything else unmounted, use
disklabel to delete all the data partitions
you want to move into cgd.
Then make a single new partition in all the space you just
freed up, say, wd0e. Set the
partition type for this partition to ccd
(there's no code specifically for cgd, but
ccd is very similar. Though it doesn't
really matter what it is, it will help remind you that it's
not a normal filesystem later). When finished, label the disk
to save the new partition table.
We have removed the partition table information, but the
existing filesystems and data are still on disk. Even after
we make a cgd device, create filesystems,
and restore our data, some of these disk blocks might not yet
be overwritten and still contain our data in plaintext. This
is especially likely if the filesystems are mostly empty. We
want to scrub the disk before we go further.
We could use dd to copy
/dev/zero over the new
wd0e partition, but this will leave
our disk full of zeros, except where we've written encrypted
data later. We might not want to give an attacker any clues
about which blocks contain real data, and which are free
space, so we want to write "noise" into all the disk
blocks. So we'll create a temporary cgd,
configured with a random, unknown key.
First, we configure a cgd to use a random key:
#cgdconfig -s cgd0 /dev/wd0e aes-cbc 128 < /dev/urandom
Now we can write zeros into the raw partition of our
cgd (/dev/rcgd0d on
NetBSD/i386, /dev/rcgd0c on most other
platforms):
#dd if=/dev/zero of=/dev/rcgd0d bs=32k
The encrypted zeros will look like random data on disk. This might
take a while if you have a large disk. Once finished, unconfigure the
random-key cgd:
#cgdconfig -u cgd0
The cgdconfig program, which manipulates
cgd devices, uses parameters files to store
such information as the encryption type, key length, and a
random password salt for each cgd. These
files are very important, and need to be kept safe - without
them, you will not be able to decrypt the data!
We'll generate a parameters file and write it into the default
location (make sure the directory
/etc/cgd exists and is mode 700):
#cgdconfig -g -V disklabel -o /etc/cgd/wd0e aes-cbc 256
This creates a parameters file
/etc/cgd/wd0e describing a
cgd using the
aes-cbc cipher method, a key
verification method of disklabel,
and a key length of 256
bits. It will look something like this:
algorithm aes-cbc;
iv-method encblkno;
keylength 256;
verify_method disklabel;
keygen pkcs5_pbkdf2/sha1 {
iterations 6275;
salt AAAAgHTg/jKCd2ZJiOSGrgnadGw=;
};
Remember, you'll want to save this file somewhere safe later.
When creating the parameters file,
cgdconfig reads from
/dev/random to create the password
salt. This read may block if there is not enough collected
entropy in the random pool. This is unlikely, especially if
you just finished overwriting the disk as in the previous
step, but if it happens you can press keys on the console
and/or move your mouse until the
rnd device gathers enough
entropy.
Now it's time to create our cgd, for which
we'll need a passphrase. This passphrase needs to be entered
every time the cgd is opened, which is
usually at each reboot. The encryption key is derived from this
passphrase and the salt. Make sure you choose something you won't
forget, and others won't guess.
The first time we configure the cgd, there
is no valid disklabel on the logical device, so the validation
mechanism we want to use later won't work. We override it this
one time:
#cgdconfig -V re-enter cgd0 /dev/wd0e
This will prompt twice for a matching passphrase, just in case
you make a typo, which would otherwise leave you with a
cgd encrypted with a passphrase that's
different to what you expected.
Now that we have a new cgd, we need to
partition it and create filesystems. Recreate your previous
partitions with all the same sizes, with the same letter
names.
Remember to use the disklabel -I argument, because you're creating an initial label for a new disk.
Although you want the sizes of your new partitions to be the same as the old, unencrypted ones, the offsets will be different because they're starting at the beginning of this virtual disk.
Then, use newfs to create filesystems on
all the relevant partitions. This time your partitions will
reflect the cgd disk names, for example:
#newfs /dev/rcgd0h
We've moved several filesystems to another (logical) disk, and
we need to update /etc/fstab
accordingly. Each partition will have the same letter (in this
example), but will be on cgd0 rather than
wd0. So you'll have
/etc/fstab entries something like this:
/dev/wd0a / ffs rw 1 1 /dev/cgd0b none swap sw 0 0 /dev/cgd0b /tmp mfs rw,-s=132m 0 0 /dev/cgd0e /var ffs rw 1 2 /dev/cgd0f /usr ffs rw 1 2 /dev/cgd0h /home ffs rw 1 2
/tmp should be a separate filesystem,
either mfs or ffs,
inside the cgd, so that your temporary
files are not stored in plain text in the
/ filesystem.
Each time you reboot, you're going to need your
cgd configured early, before
fsck runs and filesystems are mounted.
Put the following line in
/etc/cgd/cgd.conf:
cgd0 /dev/wd0e
This will use /etc/cgd/wd0e as config
file for cgd0.
To finally enable cgd on each boot, put the following line
into /etc/rc.conf:
cgd=YES
You should now be prompted for
/dev/cgd0's passphrase whenever
/etc/rc starts.
Next, mount your new filesystems, and
restore your data into them. It often helps
to have /tmp mounted properly first, as
restore can use a fair amount of temporary
space when extracting a large dumpfile.
To test your changes to the boot configuration,
umount the filesystems and unconfigure the
cgd, so when you exit the single-user
shell, rc will run like on a clean boot,
prompting you for the passphrase and mounting your filesystems
correctly. Now you can bring the system up to multi-user, and
make sure everything works as before.
This section explains how to create and use encrypted CDs/DVDs with NetBSD (all I say about "CDs" here does also apply to "DVDs"). I assume that you have basic knowledge of cgd(4), so I will not explain what cgd is or what's inside it in detail. The same applies to vnd(4). One can make use of encrypted CDs after reading this howto, but for more detailed information about different cgd configuration options, please read Chapter 14, The cryptographic device driver (CGD) or the manpages.
cgd(4) provides highly secure encryption of whole partitions
or disks. Unfortunately, creating "normal" CDs is not
disklabeling something and running newfs on it. Neither can you
just put a CDR into the drive, configure cgd and assume it to
write encrypted data when syncing. Standard CDs contain at
least an ISO-9660 filesystem created with mkisofs(8) from the
sysutils/cdrtools package.
ISO images may not contain disklabels or
cgd partitions.
But of course CD reader/writer hardware doesn't care about filesystems at all. You can write raw data to the CD if you like - or an encrypted FFS filesystem, which is what we'll do here. But be warned, there is NO way to read this CD with any OS except NetBSD - not even other BSDs due to the lack of cgd.
The basic steps when creating an encrypted CD are:
Create an (empty) imagefile
Register it as a virtual disk using vnd(4)
Configure cgd inside the vnd disk
Copy content to the cgd
Unconfigure all (flush!)
Write the image on a CD
The first step when creating an encrypted CD is to create a single image file with dd. The image may not grow, so make it large enough to allow all CD content to fit into. Note that the whole image gets written to the CD later, so creating a 700 MB image for 100 MB content will still require a 700 MB write operation to the CD. Some info on DVDs here: DVDs are only 4.7 GB in marketing language. 4.7GB = 4.7 x 1024 x 1024 x 1024 = 5046586573 bytes. In fact, a DVD can only approximately hold 4.7 x 1000 x 1000 x 1000 = 4700000000 bytes, which is about 4482 MB or about 4.37 GB. Keep this in mind when creating DVD images. Don't worry for CDs, they hold "real" 700 MB (734003200 Bytes).
Invoke all following commands as root!
For a CD:
#dd if=/dev/zero of=image.img bs=1m count=700
or, for a DVD:
#dd if=/dev/zero of=image.img bs=1m count=4482
Now configure a vnd(4)-pseudo disk with the image:
#vnconfig vnd0 image.img
In order to use cgd, a so-called parameter file, describing
encryption parameters and a containing "password salt" must be
generated. We'll call it /etc/cgd/image
here. You can use one parameter file for several encrypted
partitions (I use one different file for each host and a
shared file image for all removable
media, but that's up to you).
I'll use AES-CBC with a keylength of 256 bits. Refer to cgd(4) and cgdconfig(8) for details and alternatives.
The following command will create the parameter file as
/etc/cgd/image. YOU DO NOT WANT
TO INVOKE THE FOLLOWING COMMAND AGAIN after you
burnt any CD, since a recreated parameter file is a lost
parameter file and you'll never access your encrypted CD again
(the "salt" this file contains will differ among each
call). Consider this file being HOLY, BACKUP
IT and BACKUP IT AGAIN! Use
switch -V to specify verification method "disklabel" for the CD
(cgd cannot detect whether you entered a valid password for the
CD later when mounting it otherwise).
#cgdconfig -g -V disklabel aes-cbc 256 > /etc/cgd/image
Now it's time to configure a cgd for our vnd drive. (Replace slice "d" with "c" for all platforms that use "c" as the whole disk (where "sysctl kern.rawpartition" prints "2", not "3"); if you're on i386 or amd64, "d" is OK for you):
#cgdconfig -V re-enter cgd1 /dev/vnd0d /etc/cgd/image
The "-V re-enter" option is necessary
as long as the
cgd doesn't have a disklabel yet so we can access and
configure
it. This switch asks for a password twice and uses it for
encryption.
Now it's time to create a disklabel inside the cgd. The defaults of the label are ok, so invoking disklabel with
#disklabel -e -I cgd1
and leaving vi with ":wq" immediately will do.
Let's create a filesystem on the cgd, and finally mount it somewhere:
#newfs /dev/rcgd1a#mount /dev/cgd1a /mnt
The cgd is alive! Now fill /mnt with
content. When finished, reverse the configuration process. The
steps are:
Unmounting the cgd1a:
#umount /mnt
Unconfiguring the cgd:
#cgdconfig -u cgd1
Unconfiguring the vnd:
#vnconfig -u vnd0
The following commands are examples to burn the images on CD
or DVD. Please adjust the dev= for
cdrecord or the /dev/rcd0d for
growisofs. Note the
"rcd0d"
is necessary with NetBSD. Growisofs is
available in the sysutils/dvd+rw-tools
package. Again, use "c" instead of
"d" if this is the raw partition on your
platform.
Finally, write the image file to a CD:
#cdrecord dev=/dev/rcd0d -v image.img
...or to a DVD:
#growisofs -dvd-compat -Z /dev/rcd0d=image.img
Congratulations! You've just created a really secure CD!
After creating an encrypted CD as described above, we're not
done yet - what about mounting it again? One might guess,
configuring the cgd on /dev/cd0d is
enough - no, it is not.
NetBSD cannot access FFS file systems on media that is not 512 bytes/sector format. It doesn't matter that the cgd on the CD is, since the CD's disklabel the cgd resides in has 2048 bytes/sector.
But the CD driver cd(4) is smart enough to grant "write" access to the (emulated) disklabel on the CD. So before configuring the cgd, let's have a look at the disklabel and modify it a bit:
#disklabel -e cd0# /dev/rcd0d: type: ATAPI disk: mydisc label: fictitious flags: removable bytes/sector: 2048# -- Change to 512 (= orig / 4)sectors/track: 100# -- Change to 400 (= orig * 4)tracks/cylinder: 1 sectors/cylinder: 100# -- Change to 400 (= orig * 4)cylinders: 164 total sectors: 16386# -- Change to value of slice "d" (=65544)rpm: 300 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 65544 0 4.2BSD 0 0 0 # (Cyl. 0 - 655+) d: 65544 0 ISO9660 0 0 # (Cyl. 0 - 655+)
If you don't want to do these changes every time by hand, you
can use Florian Stoehr's tool neb-cd512 which is (at time of writing
this) in pkgsrc-wip and will move to
sysutils/neb-cd512 soon.
You can also download the neb-cd512 source from
http://sourceforge.net/projects/neb-stoehr/ (be sure
to use neb-cd512, not neb-wipe!).
It is invoked with the disk name as parameter, by root:
#neb-cd512 cd0
Now as the disklabel is in 512 b/s format, accessing the CD is as easy as:
#cgdconfig cgd1 /dev/cd0d /etc/cgd/image#mount -o ro /dev/cgd1a /mnt
Note that the cgd MUST be mounted read-only or you'll get illegal command errors from the cd(4) driver which can in some cases make even mounting a CD-based cgd impossible!
Now we're done! Enjoy your secure CD!
#ls /mnt
Remember you have to reverse all steps to remove the CD:
#umount /mnt#cgdconfig -u cgd1#eject cd0
You now have your filesystems encrypted within a
cgd. When your machine is shut down, the data
is protected, and can't be decrypted without the passphrase.
However, there are still some dangers you should be aware of,
and more you can do with cgd. This section
documents several further suggestions and warnings that will
help you use cgd effectively.
Use multiple cgd's for different kinds of
data, one mounted all the time and others mounted only when
needed.
Use a cgd configured on top of a
vnd made from a file on a remote network
fileserver (NFS, SMBFS, CODA, etc) to safely store private data
on a shared system. This is similar to the procedure for
using encrypted CDs and DVDs described in Section 14.4, “Example: encrypted CDs/DVDs”.
You may want to use a dedicated random-key
cgd for swap space, regenerating the key
each reboot. The advantage of this is that once your machine
is rebooted, any sensitive program memory contents that may
have been paged out are permanently unrecoverable, because the
decryption key is never known to you.
We created a temporary cgd with a random
key when scrubbing the disk in the example above, using a
shorthand cgdconfig -s invocation to avoid
creating a parameters file.
The cgdconfig params file includes a “randomkey” keygen method. This is more appropriate for "permanent" random-key configurations, and facilitates the easy automatic configuration of these volumes at boot time.
For example, if you wanted to convert your existing
/dev/wd0b partition to a dedicated
random-key cgd1, use the following command to generate
/etc/cgd/wd0b:
# cgdconfig -g -o /etc/cgd/wd0b -V none -k randomkey blowfish-cbc
When using the randomkey keygen method, only verification
method "none" can be used, because the contents of the new
cgd are effectively random each time (the
previous data decrypted with a random key). Likewise, the new
disk will not have a valid label or partitions, and
swapctl will complain about configuring
swap devices not marked as such in a disklabel.
In order to automate the process of labeling the disk,
prepare an appropriate disklabel and save it to a file, for
example /etc/cgd/wd0b.disklabel. Please
refer to disklabel(8) for information about
how to use disklabel to set up a swap
partition.
On each reboot, to restore this saved label to the new
cgd, create the
/etc/rc.conf.d/cgd file as below:
swap_device="cgd1"
swap_disklabel="/etc/cgd/wd0b.disklabel"
start_postcmd="cgd_swap"
cgd_swap()
{
if [ -f $swap_disklabel ]; then
disklabel -R -r $swap_device $swap_disklabel
fi
}
The same technique could be extended to encompass using
newfs to re-create an
ffs filesystem for
/tmp if you didn't want to use
mfs.
Prevent cryptographic disasters by making sure you can always recover your passphrase and parameters file. Protect the parameters file from disclosure, perhaps by storing it on removable media as above, because the salt it contains helps protect against dictionary attacks on the passphrase.
Keeping the data encrypted on your disk is all very well, but what about other copies? You already have at least one other such copy (the backup we used during this setup), and it's not encrypted. Piping dump through file-based encryption tools like gpg can be one way of addressing this issue, but make sure you have all the keys and tools you need to decrypt it to restore after a disaster.
Like any form of software encryption, the
cgd key stays in kernel memory while the
device is configured, and may be accessible to privileged
programs and users, such as /dev/kmem
grovellers. Taking other system security steps, such as
running with elevated securelevel, is highly recommended.
Once the cgd volumes are mounted as normal
filesystems, their contents are accessible like any other
file. Take care of file permissions and ensure your running
system is protected against application and network security
attack.
Avoid using suspend/resume, especially for laptops with a BIOS
suspend-to-disk function. If an attacker can resume your
laptop with the key still in memory, or read it from the
suspend-to-disk memory image on the hard disk later, the whole
point of using cgd is lost.
The following resources contain more information on CGD:
[smackie-cgd] NetBSD CGD Setup.
[nycbug-cgd] I want my cgd aka: I want an encrypted pseudo-device on my laptop.
[elric-cgd] The original paper on The CryptoGraphic Disk Driver.
[biancuzzi-cgd] Inside NetBSD's CGD - an interview with CGD creator Roland Dowdeswell.
[hubertf-cgd] CryptoGraphicFile (CGF), or how to keep sensitive data on your laptop.
Table of Contents
The CCD driver allows the user to “concatenate” several physical disks into one pseudo volume. While RAIDframe (see Chapter 16, NetBSD RAIDframe) also allows doing this to create RAID level 0 sets, it does not allow you to do striping across disks of different geometry, which is where CCD comes in handy. CCD also allows for an “interleave” to improve disk performance with a gained space loss. This example will not cover that feature.
The steps required to setup a CCD are as follows:
Install physical media
Configure kernel support
Disklabel each volume member of the CCD
Configure the CCD conf file
Initialize the CCD device
Create a filesystem on the new CCD device
Mount the CCD filesystem
This example features a CCD setup on NetBSD/sparc 1.5. The CCD will reside on 4 SCSI disks in a generic external Sun disk pack chassis connected to the external 50 pin SCSI port.
This step is at your own discretion, depending on your platform and the hardware at your disposal.
From my DMESG:
Disk #1: probe(esp0:0:0): max sync rate 10.00MB/s sd0 at scsibus0 target 0 lun 0: <SEAGATE, ST32430N SUN2.1G, 0444> SCSI2 0/direct fixed sd0: 2049 MB, 3992 cyl, 9 head, 116 sec, 512 bytes/sect x 4197405 sectors Disk #2 probe(esp0:1:0): max sync rate 10.00MB/s sd1 at scsibus0 target 1 lun 0: <SEAGATE, ST32430N SUN2.1G, 0444> SCSI2 0/direct fixed sd1: 2049 MB, 3992 cyl, 9 head, 116 sec, 512 bytes/sect x 4197405 sectors Disk #3 probe(esp0:2:0): max sync rate 10.00MB/s sd2 at scsibus0 target 2 lun 0: <SEAGATE, ST11200N SUN1.05, 9500> SCSI2 0/direct fixed sd2: 1005 MB, 1872 cyl, 15 head, 73 sec, 512 bytes/sect x 2059140 sectors Disk #4 probe(esp0:3:0): max sync rate 10.00MB/s sd3 at scsibus0 target 3 lun 0: <SEAGATE, ST11200N SUN1.05, 8808 > SCSI2 0 sd3: 1005 MB, 1872 cyl, 15 head, 73 sec, 512 bytes/sect x 2059140 sectors
The following kernel configuration directive is needed to provide CCD device support. It is enabled in the GENERIC kernel:
pseudo-device ccd 4 # concatenated disk devices
In my kernel config, I also hard code SCSI ID associations
to /dev device entries to prevent bad
things from happening:
sd0 at scsibus0 target 0 lun ? # SCSI disk drives sd1 at scsibus0 target 1 lun ? # SCSI disk drives sd2 at scsibus0 target 2 lun ? # SCSI disk drives sd3 at scsibus0 target 3 lun ? # SCSI disk drives sd4 at scsibus0 target 4 lun ? # SCSI disk drives sd5 at scsibus0 target 5 lun ? # SCSI disk drives sd6 at scsibus0 target 6 lun ? # SCSI disk drives
Each member disk of the CCD will need a special file system established. In this example, I will need to disklabel:
/dev/rsd0c
/dev/rsd1c
/dev/rsd2c
/dev/rsd3c
Always remember to disklabel the character device,
not the block device, in
/dev/r{s,w}d*
On all platforms, the c slice is
symbolic of the entire NetBSD partition and is reserved.
You will probably want to remove any pre-existing disklabels on the disks in the CCD. This can be accomplished in one of two ways with the dd(1) command:
#dd if=/dev/zero of=/dev/rsd0c bs=8k count=1#dd if=/dev/zero of=/dev/rsd1c bs=8k count=1#dd if=/dev/zero of=/dev/rsd2c bs=8k count=1#dd if=/dev/zero of=/dev/rsd3c bs=8k count=1
If your port uses a MBR (Master Boot Record) to partition the disks so that the NetBSD partitions are only part of the overall disk, and other OSs like Windows or Linux use other parts, you can void the MBR and all partitions on disk by using the command:
#dd if=/dev/zero of=/dev/rsd0d bs=8k count=1#dd if=/dev/zero of=/dev/rsd1d bs=8k count=1#dd if=/dev/zero of=/dev/rsd2d bs=8k count=1#dd if=/dev/zero of=/dev/rsd3d bs=8k count=1
This will make all data on the entire disk inaccessible. Note
that the entire disk is slice d on i386
(and some other ports), and c elsewhere (e.g. on
sparc). See the “kern.rawpartition” sysctl - "3"
means "d", "2" means "c".
The default disklabel for the disk will look similar to this:
#disklabel -r sd0[...snip...] bytes/sector: 512 sectors/track: 116 tracks/cylinder: 9 sectors/cylinder: 1044 cylinders: 3992 total sectors: 4197405 [..snip...] 3 partitions: # size offset fstype [fsize bsize cpg] c: 4197405 0 unused 1024 8192 # (Cyl. 0 - 4020*)
You will need to create one “slice” on the NetBSD partition of the disk that consumes the entire partition. The slice must begin at least one cylinder offset from the beginning of the disk/partition to provide space for the special CCD disklabel. The offset should be 1x sectors/cylinder (see following note). Therefore, the “size” value should be “total sectors” minus 1x “sectors/cylinder”. Edit your disklabel accordingly:
#disklabel -e sd0
The offset of a slice of type “ccd” must be a multiple of the “sectors/cylinder” value.
Be sure to export EDITOR=[path to your favorite editor] before editing the disklabels.
The slice must be fstype ccd.
Because there will only be one slice on this partition,
you can recycle the c slice (normally
reserved for symbolic uses). Change your disklabel to
the following:
3 partitions: # size offset fstype [fsize bsize cpg] c: 4196361 1044 ccd # (Cyl. 1 - 4020*)
Optionally you can setup a slice other than
c to use, simply adjust accordingly
below:
3 partitions: # size offset fstype [fsize bsize cpg] a: 4196361 1044 ccd # (Cyl. 1 - 4020*) c: 4197405 0 unused 1024 8192 # (Cyl. 0 - 4020*)
Be sure to write the label when you have completed. Disklabel will object to your disklabel and prompt you to re-edit if it does not pass its sanity checks.
Once all disks are properly labeled, you will need to
generate a configuration file,
/etc/ccd.conf. The file does not exist by
default, and you will need to create a new one. The format
is:
#ccd ileave flags component devices
For the “ileave”, if a value of zero is used then the disks are concatenated, but if you use a value equal to the “sectors/track” number the disks are interleaved.
Example in this case:
#more /etc/ccd.confccd0 0 none /dev/sd0c /dev/sd1c /dev/sd2c /dev/sd3c
The CCD driver expects block device files as components. Be sure not to use character device files in the configuration.
Once you are confident that your CCD configuration is sane, you can initialize the device using the ccdconfig(8) command: Configure:
#ccdconfig -C -f /etc/ccd.conf
Unconfigure:
#ccdconfig -u -f /etc/ccd.conf
Initializing the CCD device will activate
/dev entries:
/dev/{,r}ccd#:
#ls -la /dev/{,r}ccd0*brw-r----- 1 root operator 9, 0 Apr 28 21:35 /dev/ccd0a brw-r----- 1 root operator 9, 1 Apr 28 21:35 /dev/ccd0b brw-r----- 1 root operator 9, 2 May 12 00:10 /dev/ccd0c brw-r----- 1 root operator 9, 3 Apr 28 21:35 /dev/ccd0d brw-r----- 1 root operator 9, 4 Apr 28 21:35 /dev/ccd0e brw-r----- 1 root operator 9, 5 Apr 28 21:35 /dev/ccd0f brw-r----- 1 root operator 9, 6 Apr 28 21:35 /dev/ccd0g brw-r----- 1 root operator 9, 7 Apr 28 21:35 /dev/ccd0h crw-r----- 1 root operator 23, 0 Jun 12 20:40 /dev/rccd0a crw-r----- 1 root operator 23, 1 Apr 28 21:35 /dev/rccd0b crw-r----- 1 root operator 23, 2 Jun 12 20:58 /dev/rccd0c crw-r----- 1 root operator 23, 3 Apr 28 21:35 /dev/rccd0d crw-r----- 1 root operator 23, 4 Apr 28 21:35 /dev/rccd0e crw-r----- 1 root operator 23, 5 Apr 28 21:35 /dev/rccd0f crw-r----- 1 root operator 23, 6 Apr 28 21:35 /dev/rccd0g crw-r----- 1 root operator 23, 7 Apr 28 21:35 /dev/rccd0h
You may now disklabel the new virtual disk device associated with your CCD:
#disklabel -e ccd0
Once again, there will be only one slice, so you may either
recycle the c slice or create a separate
slice for use.
#disklabel -r ccd0# /dev/rccd0c: type: ccd disk: ccd label: default label flags: bytes/sector: 512 sectors/track: 2048 tracks/cylinder: 1 sectors/cylinder: 2048 cylinders: 6107 total sectors: 12508812 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 # size offset fstype [fsize bsize cpg] c: 12508812 0 4.2BSD 1024 8192 16 # (Cyl. 0 - 6107*)
The filesystem will then need to be formatted:
#newfs /dev/rccd0cWarning: 372 sector(s) in last cylinder unallocated /dev/rccd0c: 12508812 sectors in 6108 cylinders of 1 tracks, 2048 sectors 6107.8MB in 382 cyl groups (16 c/g, 16.00MB/g, 3968 i/g) super-block backups (for fsck -b #) at: [...]
Once you have a created a file system on the CCD device,
you can then mount the file system against a mount point
on your system. Be sure to mount the slice labeled type
ffs or 4.2BSD:
#mount /dev/ccd0c /mnt
Then:
#export BLOCKSIZE=1024; dfFilesystem 1K-blocks Used Avail Capacity Mounted on /dev/sd6a 376155 320290 37057 89% / /dev/ccd0c 6058800 1 5755859 0% /mnt
Congratulations, you now have a working CCD. To configure
the CCD device at boot time, set
ccd=yes in
/etc/rc.conf. You can adjust
/etc/fstab to get the filesystem mounted at
boot:
/dev/ccd0c /home ffs rw 1 2
Table of Contents
NetBSD uses the CMU RAIDframe software for its RAID subsystem. NetBSD is the primary platform for RAIDframe development. RAIDframe can also be found in OpenBSD and older versions of FreeBSD. NetBSD also has another in-kernel RAID level 0 system in its ccd(4) subsystem (see Chapter 15, Concatenated Disk Device (CCD) configuration). You should possess some basic knowledge about RAID concepts and terminology before continuing. You should also be at least familiar with the different levels of RAID - Adaptec provides an excellent reference, and the raid(4) manpage contains a short overview too.
RAIDframe is a Software RAID implementation, as opposed to Hardware RAID. As such, it does not need special disk controllers supported by NetBSD. System administrators should give a great deal of consideration to whether software RAID or hardware RAID is more appropriate for their “Mission Critical” applications. For some projects you might consider the use of many of the hardware RAID devices supported by NetBSD. It is truly at your discretion what type of RAID you use, but it is recommend that you consider factors such as: manageability, commercial vendor support, load-balancing and failover, etc.
Depending on the RAID level used, RAIDframe does provide redundancy in the event of a hardware failure. However, it is not a replacement for reliable backups! Software and user-error can still cause data loss. RAIDframe may be used as a mechanism for facilitating backups in systems without backup hardware, but this is not an ideal configuration. Finally, with regard to "high availability", RAID is only a very small component to ensuring data availability.
Once more for good measure: Back up your data!
If you encounter problems using RAIDframe, you have several options for obtaining help.
Read the RAIDframe man pages: raid(4) and raidctl(8) thoroughly.
Search the mailing list archives. Unfortunately,
there is no NetBSD list dedicated to RAIDframe support.
Depending on the nature of the problem, posts tend to end up in
a variety of lists. At a very minimum, search netbsd-help,
netbsd-users@NetBSD.org,
current-users@NetBSD.org.
Also search the list for the NetBSD platform on which you are
using RAIDframe:
port-${ARCH}@NetBSD.org.
Because RAIDframe is constantly undergoing development, some information in mailing list archives has the potential of being dated and inaccurate.
Search the Problem Report database.
If your problem persists: Post to the mailing list
most appropriate (judgment call). Collect as much verbosely
detailed information as possible before posting: Include your
dmesg(8) output from
/var/run/dmesg.boot, your kernel config(8) , your
/etc/raid[0-9].conf, any relevant errors on
/dev/console,
/var/log/messages, or to
stdout/stderr of raidctl(8).
The output of raidctl -s (if available)
will be useful as well. Also
include details on the troubleshooting steps you've taken thus
far, exactly when the problem started, and any notes on recent
changes that may have prompted the problem to develop. Remember
to be patient when waiting for a response.
The use of RAID will require software and hardware configuration changes.
The GENERIC kernel already has support for RAIDframe. If you have built a custom kernel for your environment the kernel configuration must have the following options:
pseudo-device raid 8 # RAIDframe disk driver options RAID_AUTOCONFIG # auto-configuration of RAID components
The RAID support must be detected by the NetBSD kernel, which can be checked by looking at the output of the dmesg(8) command.
# dmesg|grep -i raid
Kernelized RAIDframe activated
Historically, the kernel must also contain static mappings between bus
addresses and device nodes in /dev. This
used to
ensure consistency of devices within RAID sets in the event of a
device failure after reboot. Since NetBSD 1.6, however, using
the auto-configuration features of RAIDframe has been
recommended over statically mapping devices. The
auto-configuration features allow drives to move around on the
system, and RAIDframe will automatically determine which
components belong to which RAID sets.
If your system has an Uninterruptible Power Supply (UPS), and/or if your system has redundant power supplies, you should consider enabling the read and write caches on your drives. On systems with redundant power, this will improve drive performance. On systems without redundant power, the write cache could endanger the integrity of RAID data in the event of a power loss.
The dkctl(8) utility to can be used for this on all kinds of disks that support the operation (SCSI, EIDE, SATA, ...):
#dkctlwd0getcache /dev/rwd0d: read cache enabled /dev/rwd0d: read cache enable is not changeable /dev/rwd0d: write cache enable is changeable /dev/rwd0d: cache parameters are not savable#dkctlwd0setcache rw#dkctlwd0getcache /dev/rwd0d: read cache enabled /dev/rwd0d: write-back cache enabled /dev/rwd0d: read cache enable is not changeable /dev/rwd0d: write cache enable is changeable /dev/rwd0d: cache parameters are not savable
This example explains how to setup RAID-1 root disk. With RAID-1 components are mirrored and therefore the server can be fully functional in the event of a single component failure. The goal is to provide a level of redundancy that will allow the system to encounter a component failure on either component disk in the RAID and:
Continue normal operations until a maintenance window can be scheduled.
Or, in the unlikely event that the component failure causes a system reboot, be able to quickly reconfigure the system to boot from the remaining component (platform dependant).
Because RAID-1 provides both redundancy and performance
improvements, its most practical application is on critical
"system" partitions such as /,
/usr, /var,
swap, etc., where read operations are more
frequent than write operations. For other file systems, such as
/home or
/var/,
other RAID levels might be considered (see the references above).
If one were simply creating a generic RAID-1 volume for a non-root
file system, the cookie-cutter examples from the man page could be
followed, but because the root volume must be bootable, certain
special steps must be taken during initial setup. {application}
This example will outline a process that differs only slightly between the i386 and sparc64 platforms. In an attempt to reduce excessive duplication of content, where differences do exist and are cosmetic in nature, they will be pointed out using a section such as this. If the process is drastically different, the process will branch into separate, platform dependant steps.
Although a much more refined process could be developed using a custom copy of NetBSD installed on custom-developed removable media, presently the NetBSD install media lacks RAIDframe tools and support, so the following pseudo process has become the de facto standard for setting up RAID-1 Root.
Install a stock NetBSD onto Disk0 of your system.
Use the installed system on Disk0/wd0 to setup a RAID Set composed of Disk1/wd1 only.
Reboot the system off the Disk1/wd1 with the newly created RAID volume.
Add / re-sync Disk0/wd0 back into the RAID set.
At present, the alpha, amd64, i386, pmax, sparc, sparc64, and vax NetBSD platforms support booting from RAID-1. Booting is not supported from any other RAID level. Booting from a RAID set is accomplished by teaching the 1st stage boot loader to understand both 4.2BSD/FFS and RAID partitions. The 1st boot block code only needs to know enough about the disk partitions and file systems to be able to read the 2nd stage boot blocks. Therefore, at any time, the system's BIOS / firmware must be able to read a drive with 1st stage boot blocks installed. On the i386 platform, configuring this is entirely dependant on the vendor of the controller card / host bus adapter to which your disks are connected. On sparc64 this is controlled by the IEEE 1275 Sun OpenBoot Firmware.
This article assumes two identical
IDE disks (/dev/wd)
which we are going to mirror (RAID-1). These disks are identified
as:{0,1}
# grep ^wd /var/run/dmesg.boot
wd0 at atabus0 drive 0: <WDC WD100BB-75CLB0>
wd0: drive supports 16-sector PIO transfers, LBA addressing
wd0: 9541 MB, 19386 cyl, 16 head, 63 sec, 512 bytes/sect x 19541088 sectors
wd0: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd0(piixide0:0:0): using PIO mode 4, Ultra-DMA mode 2 (Ultra/33) (using DMA data transfers)
wd1 at atabus1 drive 0: <WDC WD100BB-75CLB0>
wd1: drive supports 16-sector PIO transfers, LBA addressing
wd1: 9541 MB, 19386 cyl, 16 head, 63 sec, 512 bytes/sect x 19541088 sectors
wd1: drive supports PIO mode 4, DMA mode 2, Ultra-DMA mode 5 (Ultra/100)
wd1(piixide0:1:0): using PIO mode 4, Ultra-DMA mode 2 (Ultra/33) (using DMA data transfers)
If you are using SCSI, replace
/dev/{,r}wd{0,1} with
/dev/{,r}sd{0,1}
In this example, both disks are jumpered as Master on separate channels on the same controller. You would never want to have both disks on the same bus on the same controller; this creates a single point of failure. Ideally you would have the disks on separate channels on separate controllers. Some SCSI controllers have multiple channels on the same controller, however, a SCSI bus reset on one channel could adversely affect the other channel if the ASIC/IC becomes overloaded. The trade-off with two controllers is that twice the bandwidth is used on the system bus. For purposes of simplification, this example shows two disks on different channels on the same controller.
RAIDframe requires that all components be of the same size. Actually, it will use the lowest common denominator among components of dissimilar sizes. For purposes of illustration, the example uses two disks of identical geometries. Also, consider the availability of replacement disks if a component suffers a critical hardware failure.
Two disks of identical vendor model numbers could have different geometries if the drive possesses "grown defects". Use a low-level program to examine the grown defects table of the disk. These disks are obviously suboptimal candidates for use in RAID and should be avoided.
Perform a very generic installation onto your Disk0/wd0. Follow the INSTALL instructions for your platform. Install all the sets but do not bother customizing anything other than the kernel as it will be overwritten.
On i386, during the sysinst install, when prompted if you want to "use the entire disk for NetBSD", answer "yes".
Once the installation is complete, you should examine the disklabel(8) and fdisk(8) / sunlabel(8) outputs on the system:
# df
Filesystem 1K-blocks Used Avail %Cap Mounted on
/dev/wd0a 9487886 502132 8511360 5% /
On i386:
#disklabel -r wd0 type: unknown disk: Disk00 label: flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 19386 total sectors: 19541088 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 16 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19276992 63 4.2BSD 1024 8192 46568 # (Cyl. 0* - 19124*) b: 264033 19277055 swap # (Cyl. 19124* - 19385) c: 19541025 63 unused 0 0 # (Cyl. 0* - 19385) d: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)#fdisk /dev/rwd0d Disk: /dev/rwd0d NetBSD disklabel disk geometry: cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder) total sectors: 19541088 BIOS disk geometry: cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder) total sectors: 19541088 Partition table: 0: NetBSD (sysid 169) start 63, size 19541025 (9542 MB, Cyls 0-1216/96/1), Active 1: <UNUSED> 2: <UNUSED> 3: <UNUSED> Bootselector disabled. First active partition: 0
On Sparc64 the command / output differs slightly:
#disklabel -r wd0 type: unknown disk: Disk0 [...snip...] 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19278000 0 4.2BSD 1024 8192 46568 # (Cyl. 0 - 19124) b: 263088 19278000 swap # (Cyl. 19125 - 19385) c: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)#sunlabel /dev/rwd0c sunlabel> P a: start cyl = 0, size = 19278000 (19125/0/0 - 9413.09Mb) b: start cyl = 19125, size = 263088 (261/0/0 - 128.461Mb) c: start cyl = 0, size = 19541088 (19386/0/0 - 9541.55Mb)
Once you have a stock install of NetBSD on Disk0/wd0, you are ready to begin. Disk1/wd1 will be visible and unused by the system. To setup Disk1/wd1, you will use disklabel(8) to allocate the entire second disk to the RAID-1 set.
The best way to ensure that Disk1/wd1 is completely empty is to 'zero' out the first few sectors of the disk with dd(1) . This will erase the MBR (i386) or Sun disk label (sparc64), as well as the NetBSD disk label. If you make a mistake at any point during the RAID setup process, you can always refer to this process to restore the disk to an empty state.
On sparc64, use /dev/rwd1c instead of
/dev/rwd1d!
# dd if=/dev/zero of=/dev/rwd1d bs=8k count=1
1+0 records in
1+0 records out
8192 bytes transferred in 0.003 secs (2730666 bytes/sec)
Once this is complete, on i386, verify that both the MBR and NetBSD disk labels are gone. On sparc64, verify that the Sun Disk label is gone as well.
On i386:
#fdisk /dev/rwd1d fdisk: primary partition table invalid, no magic in sector 0 Disk: /dev/rwd1d NetBSD disklabel disk geometry: cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder) total sectors: 19541088 BIOS disk geometry: cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder) total sectors: 19541088 Partition table: 0: <UNUSED> 1: <UNUSED> 2: <UNUSED> 3: <UNUSED> Bootselector disabled.#disklabel -r wd1 [...snip...] 16 partitions: # size offset fstype [fsize bsize cpg/sgs] c: 19541025 63 unused 0 0 # (Cyl. 0* - 19385) d: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)
On sparc64:
#sunlabel /dev/rwd1c sunlabel: bogus label on `/dev/wd1c' (bad magic number)#disklabel -r wd1 [...snip...] 3 partitions: # size offset fstype [fsize bsize cpg/sgs] c: 19541088 0 unused 0 0 # (Cyl. 0 - 19385) disklabel: boot block size 0 disklabel: super block size 0
Now that you are certain the second disk is empty, on i386 you must establish the MBR on the second disk using the values obtained from Disk0/wd0 above. We must remember to mark the NetBSD partition active or the system will not boot. You must also create a NetBSD disklabel on Disk1/wd1 that will enable a RAID volume to exist upon it. On sparc64, you will need to simply disklabel(8) the second disk which will write the proper Sun Disk Label.
disklabel(8) will use your shell' s environment
variable $EDITOR variable to edit the
disklabel. The default is vi(1)
On i386:
#fdisk -0ua /dev/rwd1d fdisk: primary partition table invalid, no magic in sector 0 Disk: /dev/rwd1d NetBSD disklabel disk geometry: cylinders: 19386, heads: 16, sectors/track: 63 (1008 sectors/cylinder) total sectors: 19541088 BIOS disk geometry: cylinders: 1023, heads: 255, sectors/track: 63 (16065 sectors/cylinder) total sectors: 19541088 Do you want to change our idea of what BIOS thinks? [n] Partition 0: <UNUSED> The data for partition 0 is: <UNUSED> sysid: [0..255 default: 169] start: [0..1216cyl default: 63, 0cyl, 0MB] size: [0..1216cyl default: 19541025, 1216cyl, 9542MB] bootmenu: [] Do you want to change the active partition? [n] y Choosing 4 will make no partition active. active partition: [0..4 default: 0] 0 Are you happy with this choice? [n] y We haven't written the MBR back to disk yet. This is your last chance. Partition table: 0: NetBSD (sysid 169) start 63, size 19541025 (9542 MB, Cyls 0-1216/96/1), Active 1: <UNUSED> 2: <UNUSED> 3: <UNUSED> Bootselector disabled. Should we write new partition table? [n] y#disklabel -r -e -I wd1 type: unknown disk: Disk1 label: flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 19386 total sectors: 19541088 [...snip...] 16 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541025 63 RAID # (Cyl. 0*-19385) c: 19541025 63 unused 0 0 # (Cyl. 0*-19385) d: 19541088 0 unused 0 0 # (Cyl. 0 -19385)
On sparc64:
#disklabel -r -e -I wd1 type: unknown disk: Disk1 label: flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 16 sectors/cylinder: 1008 cylinders: 19386 total sectors: 19541088 [...snip...] 3 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541088 0 RAID # (Cyl. 0 - 19385) c: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)#sunlabel /dev/rwd1c sunlabel> P a: start cyl = 0, size = 19541088 (19386/0/0 - 9541.55Mb) c: start cyl = 0, size = 19541088 (19386/0/0 - 9541.55Mb)
On i386, the c: and d: slices are reserved. c: represents the NetBSD portion of the disk. d: represents the entire disk. Because we want to allocate the entire NetBSD MBR partition to RAID, and because a: resides within the bounds of c:, the a: and c: slices have same size and offset values and sizes. The offset must start at a track boundary (an increment of sectors matching the sectors/track value in the disk label). On sparc64 however, c: represents the entire NetBSD partition in the Sun disk label and d: is not reserved. Also note that sparc64's c: and a: require no offset from the beginning of the disk, however if they should need to be, the offset must start at a cylinder boundary (an increment of sectors matching the sectors/cylinder value).
Next we create the configuration file for the RAID set /
volume. Traditionally, RAIDframe configuration files belong in
/etc and would be read and initialized at
boot time, however, because we are creating a bootable RAID
volume, the configuration data will actually be written into the
RAID volume using the "auto-configure" feature. Therefore, files
are needed only during the initial setup and should not reside in
/etc.
# vi /var/tmp/raid0.conf
START array
1 2 0
START disks
absent
/dev/wd1a
START layout
128 1 1 1
START queue
fifo 100
Note that absent means a non-existing disk.
This will allow us to establish the RAID volume with a bogus
component that we will substitute for Disk0/wd0 at a later
time.
Next we configure the RAID device and initialize the serial
number to something unique. In this example we use a
"YYYYMMDDRevision" scheme. The format
you choose is entirely at your discretion, however the scheme you
choose should ensure that no two RAID sets use the same serial
number at the same time.
After that we initialize the RAID set for the first time, safely ignoring the errors regarding the bogus component.
#raidctl -v -C /var/tmp/raid0.conf raid0 Ignoring missing component at column 0 raid0: Component absent being configured at col: 0 Column: 0 Num Columns: 0 Version: 0 Serial Number: 0 Mod Counter: 0 Clean: No Status: 0 Number of columns do not match for: absent absent is not clean! raid0: Component /dev/wd1a being configured at col: 1 Column: 0 Num Columns: 0 Version: 0 Serial Number: 0 Mod Counter: 0 Clean: No Status: 0 Column out of alignment for: /dev/wd1a Number of columns do not match for: /dev/wd1a /dev/wd1a is not clean! raid0: There were fatal errors raid0: Fatal errors being ignored. raid0: RAID Level 1 raid0: Components: component0[**FAILED**] /dev/wd1a raid0: Total Sectors: 19540864 (9541 MB)#raidctl -v -I 2009122601 raid0#raidctl -v -i raid0 Initiating re-write of parity raid0: Error re-writing parity! Parity Re-write status:#tail -1 /var/log/messages Dec 26 00:00:30 /netbsd: raid0: Error re-writing parity!#raidctl -v -s raid0 Components: component0: failed /dev/wd1a: optimal No spares. component0 status is: failed. Skipping label. Component label for /dev/wd1a: Row: 0, Column: 1, Num Rows: 1, Num Columns: 2 Version: 2, Serial Number: 2009122601, Mod Counter: 7 Clean: No, Status: 0 sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1 Queue size: 100, blocksize: 512, numBlocks: 19540864 RAID Level: 1 Autoconfig: No Root partition: No Last configured as: raid0 Parity status: DIRTY Reconstruction is 100% complete. Parity Re-write is 100% complete. Copyback is 100% complete.
The root filesystem must begin at sector 0 of the RAID device. Else, the primary boot loader will be unable to find the secondary boot loader.
The RAID device is now configured and available. The RAID
device is a pseudo disk-device. It will be created with a default
disk label. You must now determine the proper sizes for disklabel
slices for your production environment. For purposes of
simplification in this example, our system will have 8.5 gigabytes
dedicated to / as
/dev/raid0a and the rest allocated to
swap as
/dev/raid0b.
This is an unrealistic disk layout for a production server; the NetBSD Guide can expand on proper partitioning technique. See Chapter 2, Installing NetBSD: Preliminary considerations and preparations
Note that 1 GB is 2*1024*1024=2097152 blocks (1 block is 512 bytes, or 0.5 kilobytes). Despite what the underlying hardware composing a RAID set is, the RAID pseudo disk will always have 512 bytes/sector.
In our example, the space allocated to the underlying
a: slice composing the RAID set differed
between i386 and sparc64, therefore the total sectors of the RAID
volumes differs:
On i386:
# disklabel -r -e -I raid0
type: RAID
disk: raid
label: fictitious
flags:
bytes/sector: 512
sectors/track: 128
tracks/cylinder: 8
sectors/cylinder: 1024
cylinders: 19082
total sectors: 19540864
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
# size offset fstype [fsize bsize cpg/sgs]
a: 19015680 0 4.2BSD 0 0 0 # (Cyl. 0 - 18569)
b: 525184 19015680 swap # (Cyl. 18570 - 19082*)
d: 19540864 0 unused 0 0 # (Cyl. 0 - 19082*)
On sparc64:
# disklabel -r -e -I raid0
[...snip...]
total sectors: 19539968
[...snip...]
3 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 19251200 0 4.2BSD 0 0 0 # (Cyl. 0 - 18799)
b: 288768 19251200 swap # (Cyl. 18800 - 19081)
c: 19539968 0 unused 0 0 # (Cyl. 0 - 19081)
Next, format the newly created /
partition as a 4.2BSD FFSv1 File System:
#newfs -O 1 /dev/rraid0a /dev/rraid0a: 9285.0MB (19015680 sectors) block size 16384, fragment size 2048 using 51 cylinder groups of 182.06MB, 11652 blks, 23040 inodes. super-block backups (for fsck -b #) at: 32, 372896, 745760, 1118624, 1491488, 1864352, 2237216, 2610080, 2982944, ...............................................................................#fsck -fy /dev/rraid0a ** /dev/rraid0a ** File system is already clean ** Last Mounted on ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Cyl groups 1 files, 1 used, 4679654 free (14 frags, 584955 blocks, 0.0% fragmentation)
The normal swap area in our case is on raid0b. In NetBSD 5.0 and newer raid0b can automatically be used for kernel dumps if raid0 is a RAID level 1 set.
In NetBSD versions prior
to 5.0 kernel dumps can only be
made to a real disk device. Since nothing stops us from
defining a dump area which overlaps with raid0b th trick
here is to calculate the correct start offset for our crash
dump area. This is dangerous and it is possible to destroy
valuable data if we make a mistake in these calculations!
Data corruption will happen when the kernel writes its memory
dump over a normal filesystem. So we must be extra careful
here. (The author destroyed his 100+ GB
/home with a kernel crash dump!)
First we need to take a look at the disklabel for swap (raid0b) and the real physical disk (wd1).
On i386:
#disklabel raid0 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19015680 0 4.2BSD 1024 8192 64 b: 525184 19015680 swap d: 19540864 0 unused 0 0 0#disklabel wd1 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541025 63 RAID c: 19541025 63 unused 0 0 d: 19541088 0 unused 0 0
Each component of a RAID set has a 64 block reserved area (see RF_PROTECTED_SECTORS in <dev/raidframe/raidframevar.h>) in the beginning of the component to store the internal RAID structures.
# dc
63 # offset of wd1a
64 # RF_PROTECTED_SECTORS
+
19015680 # offset of raid0b
+p
19015807 # offset of swap within wd1
q
We know now the real offset of the still-nonexisting wd1b is 19015807 and size is 525184. Next we need to add wd1b to wd1's disklabel.
#disklabel wd1 > disklabel.wd1#vi disklabel.wd1 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541025 63 RAID b: 525184 19015807 swap c: 19541025 63 unused 0 0 d: 19541088 0 unused 0 0
Next we install the new disklabel.
# disklabel -R -r wd1 disklabel.wd1
On sparc64:
On sparc64 (and sparc), all partitions must start on cylinder boundaries. Due to this, the start of the dump partition must be moved up to the next cylinder boundary, and the size shrunk by the difference that the start was moved:
#disklabel raid0 3 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19251200 0 4.2BSD 0 0 0 # (Cyl. 0 - 18799) b: 288768 19251200 swap # (Cyl. 18800 - 19081) c: 19539968 0 unused 0 0 # (Cyl. 0 - 19081)#disklabel wd1 ... sectors/cylinder: 1008 ... 3 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541088 0 RAID # (Cyl. 0 - 19385) c: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)
Like on i386, each component of a RAID set has a 64 block reserved area (see RF_PROTECTED_SECTORS in <dev/raidframe/raidframevar.h>) in the beginning of the component to store the internal RAID structures. This needs to be skipped, and then moved up to the next cylinder boundary as outlines above:
# dc
0 # offset of wd1a
64 # RF_PROTECTED_SECTORS
+
19251200 # offset of raid0b
+p
19251264 # offset of swap within wd1
sa la # Remember the new offset
1008 / # determine cylinder offset
1 + # move to next full cylinder boundary
1008 *p # convert back to sectors
19251792 # Our real, cylinder-aligned offset of wd1b
sb lb la -p # Determine how far the offset was moved
528
sc # Remember how many sectors we moved the start
288768 # Size of swap on raid0
lc -p
288240 # Our real, smaller swap/dump size of wd1b
q
We know now the real offset of the still-nonexisting wd1b is 19251792 and size is 288240. Next we need to add wd1b to wd1's disklabel.
#disklabel wd1 > disklabel.wd1#vi disklabel.wd1 8 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 19541088 0 RAID # (Cyl. 0 - 19385) b: 288240 19251792 swap c: 19541088 0 unused 0 0 # (Cyl. 0 - 19385)
Next we install the new disklabel.
# disklabel -R -r wd1 disklabel.wd1
Why isn't sizeof(raid0d) == (sizeof(wd1a) - RF_PROTECTED_SECTORS)? Size of raid0d is based on the largest multiple of the stripe size used for a RAID set. As an example, with stripe width of 128, size of raid0d is:
# dc
19541025 # size of wd1a
64 # RF_PROTECTED_SECTORS
-
128 # stripe width
/p
152663 # number of stripes
128 # number of blocks per stripe
*p
19540864 # size of raid0d
The new RAID filesystems are now ready for use. We mount
them under /mnt and copy all files from the
old system. This can be done using dump(8) or pax(1).
#mount /dev/raid0a /mnt#df -h /mnt Filesystem Size Used Avail %Cap Mounted on /dev/raid0a 8.9G 2.0K 8.5G 0% /mnt#cd /; pax -v -X -rw -pe . /mnt [...snip...]
The NetBSD install now exists on the RAID filesystem. We need
to fix the mount-points in the new copy of
/etc/fstab or the system will not come up
correctly. Replace instances of wd0 with
raid0.
Note that for NetBSD releases prior to 5.0 the kernel crash
dumps must not be saved on a RAID device but on a real
physical disk (wd0b). This dump area was created in the
previous chapter on the second disk (wd1b) but we will make
wd0 an identical copy of wd1 later so wd0b and wd1b will have
the same size and offset. If wd0 fails and is removed from the
server wd1 becomes wd0 after reboot and crash dumps will still
work as we are using wd0b in
/etc/fstab. The only fault in this
configuration is when the original, failed wd0 is replaces by
a new drive and we haven't initialized it yet with fdisk and
disklabel. In this short period of time we can not make crash
dumps in case of kernel panic. Note how the dump device has
the “dp” keyword on the 4th field.
# vi /mnt/etc/fstab
/dev/raid0a / ffs rw 1 1
/dev/raid0b none swap sw 0 0
/dev/wd0b none swap dp 0 0
kernfs /kern kernfs rw
procfs /proc procfs rw
The swap should be unconfigured upon shutdown to avoid
parity errors on the RAID device. This can be done with a simple,
one-line setting in /etc/rc.conf.
# vi /mnt/etc/rc.conf
swapoff=YES
Next the boot loader must be installed on Disk1/wd1. Failure to install the loader on Disk1/wd1 will render the system un-bootable if Disk0/wd0 fails making the RAID-1 pointless.
Because the BIOS/CMOS menus in many i386 based systems are misleading with regard to device boot order. I highly recommend utilizing the "-o timeout=X" option supported by the i386 1st stage boot loader. Setup unique values for each disk as a point of reference so that you can easily determine from which disk the system is booting.
Although it may seem logical to install the 1st
stage boot block into
/dev/rwd1
(which is historically correct with NetBSD 1.6.x
installboot(8) , this is no longer the case. If you make
this mistake, the boot sector will become irrecoverably damaged
and you will need to start the process over
again.{c,d}
On i386, install the boot loader into /dev/rwd1a
:
# /usr/sbin/installboot -o timeout=30 -v /dev/rwd1a /usr/mdec/bootxx_ffsv1
File system: /dev/rwd1a
Primary bootstrap: /usr/mdec/bootxx_ffsv1
Ignoring PBR with invalid magic in sector 0 of `/dev/rwd1a'
Boot options: timeout 30, flags 0, speed 9600, ioaddr 0, console pc
On sparc64, install the boot loader into
/dev/rwd1a as well, however the "-o" flag is
unsupported (and un-needed thanks to OpenBoot):
# /usr/sbin/installboot -v /dev/rwd1a /usr/mdec/bootblk
File system: /dev/rwd1a
Primary bootstrap: /usr/mdec/bootblk
Bootstrap start sector: 1
Bootstrap byte count: 5140
Writing bootstrap
Finally the RAID set must be made auto-configurable and the system should be rebooted. After the reboot everything is mounted from the RAID devices.
#raidctl -v -A root raid0 raid0: Autoconfigure: Yes raid0: Root: Yes#tail -2 /var/log/messages raid0: New autoconfig value is: 1 raid0: New rootpartition value is: 1#raidctl -v -s raid0 [...snip...] Autoconfig: Yes Root partition: Yes Last configured as: raid0 [...snip...]#shutdown -r now
Always use shutdown(8) when shutting down. Never simply use reboot(8). reboot(8) will not properly run shutdown RC scripts and will not safely disable swap. This will cause dirty parity at every reboot.
At this point, temporarily configure your system to boot Disk1/wd1. See notes in Section 16.3.11, “Testing Boot Blocks” for details on this process. The system should boot now and all filesystems should be on the RAID devices. The RAID will be functional with a single component, however the set is not fully functional because the bogus drive (wd9) has failed.
#egrep -i "raid|root" /var/run/dmesg.boot raid0: RAID Level 1 raid0: Components: component0[**FAILED**] /dev/wd1a raid0: Total Sectors: 19540864 (9541 MB) boot device: raid0 root on raid0a dumps on raid0b root file system type: ffs#df -h Filesystem Size Used Avail Capacity Mounted on /dev/raid0a 8.9G 196M 8.3G 2% / kernfs 1.0K 1.0K 0B 100% /kern#swapctl -l Device 1K-blocks Used Avail Capacity Priority /dev/raid0b 262592 0 262592 0% 0#raidctl -s raid0 Components: component0: failed /dev/wd1a: optimal No spares. component0 status is: failed. Skipping label. Component label for /dev/wd1a: Row: 0, Column: 1, Num Rows: 1, Num Columns: 2 Version: 2, Serial Number: 2009122601, Mod Counter: 65 Clean: No, Status: 0 sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1 Queue size: 100, blocksize: 512, numBlocks: 19540864 RAID Level: 1 Autoconfig: Yes Root partition: Yes Last configured as: raid0 Parity status: DIRTY Reconstruction is 100% complete. Parity Re-write is 100% complete. Copyback is 100% complete.
We will now add Disk0/wd0 as a component of the RAID. This will destroy the original file system structure. On i386, the MBR disklabel will be unaffected (remember we copied wd0's label to wd1 anyway) , therefore there is no need to "zero" Disk0/wd0. However, we need to relabel Disk0/wd0 to have an identical NetBSD disklabel layout as Disk1/wd1. Then we add Disk0/wd0 as "hot-spare" to the RAID set and initiate the parity reconstruction for all RAID devices, effectively bringing Disk0/wd0 into the RAID-1 set and "synching up" both disks.
#disklabel -r wd1 > /tmp/disklabel.wd1#disklabel -R -r wd0 /tmp/disklabel.wd1
As a last-minute sanity check, you might want to use diff(1) to ensure that the disklabels of Disk0/wd0 match Disk1/wd1. You should also backup these files for reference in the event of an emergency.
#disklabel -r wd0 > /tmp/disklabel.wd0#disklabel -r wd1 > /tmp/disklabel.wd1#diff /tmp/disklabel.wd0 /tmp/disklabel.wd1#fdisk /dev/rwd0 > /tmp/fdisk.wd0#fdisk /dev/rwd1 > /tmp/fdisk.wd1#diff /tmp/fdisk.wd0 /tmp/fdisk.wd1#mkdir /root/RFbackup#cp -p /tmp/{disklabel,fdisk}* /root/RFbackup
Once you are certain, add Disk0/wd0 as a spare component, and start reconstruction: