Table of Contents
This chapter collects various topics, in sparse order, which didn't find a place in the previous chapters.
Sometimes you may want to create your own boot/install floppies for i386 instead use the precompiled ones, or tailor the ones built by the NetBSD build system. This section outlines the steps to do so.
The overall idea is to have a filesystem with some tools (sysinst, ls, whatever), and embed this filesystem as some sort of ramdisk into a NetBSD kernel. The kernel needs to include the "md" pseudo device to be able to hold a ramdisk. The kernel with the ramdisk can then be put on
To perform the following steps, you need to be running a kernel with the vnd pseudo device enabled (this is the default for a GENERIC kernel).
First, you must create a valid kernel to put on your floppies, e.g. INSTALL. This kernel must include the "md" pseudo device, which allows embedding a ramdisk later. See Chapter 28, Compiling the kernel for kernel building instructions.
The next step is to create the ramdisk that gets embedded
into the kernel. The ramdisk contains a filesystem with
whatever tools are needed, usually init(8) and some
tools like sysinst, ls(1), etc. To create the standard
ramdisk, go to
/usr/src/distrib/i386/floppies/ramdisk-big
and run make.
This will create the
ramdisk.fs
file in the directory. If
you want to customize the contents of the filesystem,
customize the list
file.
Now, the ramdisk gets inserted into the kernel, producing a
new kernel which includes the ramdisk, all in one file. To
do so, change into the
/usr/src/distrib/i386/floppies/instkernel
directory and run make.
The next step is to make one or more floppy images,
depending on the size of the kernel (including the ramdisk).
This is done by changing into
/usr/src/distrib/i386/floppies/bootfloppy-big
,
and running make again.
This will create one or two (depending on the size of kernel)
files named boot1.fs
and
boot2.fs
Last, transfer these files to the floppies with the commands
#
dd if=boot1.fs of=/dev/fd0a bs=36b
#
dd if=boot2.fs of=/dev/fd0a bs=36b
Put the first floppy in the drive and power on!
It is not unusual to find that the system clock is wrong, often by several minutes: for some strange reason it seems that computer clocks are not very accurate. The problem gets worse if you administer many networked hosts: keeping the clocks in sync can easily become a nightmare. To solve this problem, the NTP protocol (version 3) comes to our aid: this protocol can be used to synchronize the clocks of a network of workstations using one or more NTP servers.
Thanks to the NTP protocol it is possible to adjust the clock of a single workstation but also to synchronize an entire network. The NTP protocol is quite complex, defining a hierarchical master-slave structure of servers divided in strata: the top of the hierarchy is occupied by stratum 1 servers, connected to an external clock (ex. a radio clock) to guarantee a high level of accuracy. Underneath, stratum 2 servers synchronize their clocks with stratum 1, and so on. The accuracy decreases as we proceed towards lower levels. This hierarchical structure avoids the congestion which could be caused by having all hosts refer to the same (few) stratum 1 servers. If, for example, you want to synchronize a network, you don't connect all the hosts to the same public stratum 1 server. Instead, you create a local server which connects to the main server and the remaining hosts synchronize their clocks with the local server.
Fortunately, to use the NTP tools you don't need to understand the details of the protocol and of its implementation (if you are interested, refer to RFC 1305) and you only need to know how to configure and start some programs. The base system of NetBSD already contains the necessary tools to utilize this protocol (and other time related protocols, as we'll see), derived from the xntp implementation. This section describes a simple method to always have a correct system time.
First, it is necessary to find the address of the public NTP servers to use as a reference; a detailed listing can be found at http://ntp.isc.org/bin/view/Servers/WebHome. As an example, for Italy the two stratum 1 servers ntp1.ien.it and ntp2.ien.it can be used.
Next, to adjust the system clock give the following command as root:
#
ntpdate -b
ntp1.ien.it
ntp2.ien.it
(substitute the names of the servers in the example with the
ones that you are actually using.
Option -b
tells ntpdate
to set the system time with the settimeofday system call,
instead of slewing it with adjtime (the default).
This option is suggested when the difference between the local
time and the correct time can be considerable.
As you've seen, ntpdate is not difficult to use.
The next step is to start it automatically, in order to always
have the correct system time.
If you have a permanent connection to the Internet, you can start
the program at boot with the following line of
/etc/rc.conf
:
ntpdate=YES ntpdate_hosts="ntp1.ien.it
"
The name of the NTP server to use is specified in the
ntpdate_hosts
variable; if you leave this
field empty, the boot script will try to extract the name from
the /etc/ntp.conf
file.
If you don't have a permanent Internet connection (ex. you
have a dial-up modem connection through an ISP) you can start
ntpdate from the ip-up
script, as
explained in Chapter 21, Setting up TCP/IP on NetBSD in practice.
In this case add the following line to the
ip-up
script:
/usr/sbin/ntpdate -s -b ntp1.ien.it
(the path is mandatory or the script will probably not find
the executable).
Option -s
diverts logging output from the
standard output (this is the default) to the system syslog(3)
facility, which means that the messages from ntpdate will
usually end up in /var/log/messages
.
Besides ntpdate there are other useful NTP commands.
It is also possible to turn one of the local hosts into an
NTP server for the remaining hosts of the network.
The local server will synchronize its clock with a public
server.
For this type of configuration you must use the
ntpd daemon and create the
/etc/ntp.conf
configuration file.
For example:
serverntp1.ien.it
serverntp2.ien.it
ntpd can be started too from rc.conf
,
using the relevant option:
ntpd=YES
NTP is not your only option if you want to synchronize your network: you can also use the timed daemon or the rdate(8) command as well. timed was developed for 4.3BSD.
Timed too uses a master-slave hierarchy: when started on a
host, timed asks the network time to a master and adjusts the
local clock accordingly. A mixed structure, using both timed
and ntpd can be used. One of the local hosts gets the correct
time from a public NTP server and is the timed master for the
remaining hosts of network, which become its clients and
synchronize their clocks using timed. This means that the local
server must run both NTP and timed; care must be taken that they
don't interfere with each other (timed must be started with the
-F hostname
option so that it doesn't try to
adjust the local clock).
Finally, rdate(8) can be used to
synchronize once against a given host, much like
ntpdate(8). The host in question must have the "time"
service (port 37) enabled in
/etc/inetd.conf
.
Sysinst, the NetBSD installation program usually installs the NetBSD boot manager on the hard disk. The boot manager can also be installed or reconfigured at a later time, if needed, with the fdisk command. For example:
#
fdisk -B wd0
If NetBSD doesn't boot from the hard disk, you can boot it from the installation floppy and start the kernel on the hard disk. Insert the installation disk and, at the boot prompt, give the following command:
>
boot wd0a:netbsd
This boots the kernel on the hard disk (use the correct device, for example sd0a for a SCSI disk).
Sometimes fdisk -B doesn't give the expected result (at least it happened to me), probably if you install/remove other operating systems like Windows 95 or Linux with LILO. In this case, try running fdisk -i (which is known as fdisk /mbr from DOS) and then run again fdisk from NetBSD.
Though this is not an operation that you need to perform frequently, it can be useful to know how to do it in case of need. Please be sure to know exactly what you are doing before performing this kind of operation. For example:
#
dd if=/dev/zero of=/dev/rwd0c bs=8k count=1
The previous command deletes the disklabel (not the MBR partition
table).
To completely delete the disk, the wd0d
device must be used.
For example:
#
dd if=/dev/zero of=/dev/rwd0d bs=8k
I found this tip on a mailing list (I don't remember the author).
To output a sound from the speaker (for example at the end of a
long script) the spkr driver can be used in
the kernel config, which is mapped on
/dev/speaker
. For example:
echo 'BPBPBPBPBP' > /dev/speaker
The spkr device is not enabled in the generic kernel; a customized kernel is needed.
If you forget root's password, not all is lost and you can still “recover” the system with the following steps: boot single user, mount / and change root's password. In detail:
Boot single user: when the boot prompt appears and the five seconds countdown starts, give the following command:
>
boot -s
At the following prompt
Enter pathname of shell or RETURN for sh:
press Enter.
Write the following commands:
#
fsck -y /
#
mount -u /
#
fsck -y /usr
#
mount /usr
Change root's password:
#
passwd root
Changing local password for root. New password:(not echoed)
Retype new password:(not echoed)
#
Exit the shell to go to multiuser mode.
#
exit
This section describes how to add a new hard disk to an
already working NetBSD system. In the following example a
new SCSI controller and a new hard disk, connected to the
controller, will be added. If you don't need to add a new
controller, skip the relevant part and go to the hard disk
configuration. The installation of an IDE hard disk is
identical; only the device name will be different
(wd#
instead of
sd#
).
As always, before buying new hardware, consult the hardware compatibility list of NetBSD and make sure that the new device is supported by the system.
When the SCSI controller has been physically installed in the system and the new hard disk has been connected, it's time to restart the computer and check that the device is correctly detected, using the dmesg command. This is the sample output for an NCR-875 controller:
ncr0 at pci0 dev 15 function 0: ncr 53c875 fast20 wide scsi ncr0: interrupting at irq 10 ncr0: minsync=12, maxsync=137, maxoffs=16, 128 dwords burst, large dma fifo ncr0: single-ended, open drain IRQ driver, using on-chip SRAM ncr0: restart (scsi reset). scsibus0 at ncr0: 16 targets, 8 luns per target sd0(ncr0:2:0): 20.0 MB/s (50 ns, offset 15) sd0: 2063MB, 8188 cyl, 3 head, 172 sec, 512 bytes/sect x 4226725 sectors
If the device doesn't appear in the output, check that it is supported by the kernel that you are using; if necessary, compile a customized kernel (see Chapter 28, Compiling the kernel).
Now the partitions can be created using the fdisk command. First, check the current status of the disk:
#
fdisk sd0
NetBSD disklabel disk geometry: cylinders: 8188 heads: 3 sectors/track: 172 (516 sectors/cylinder) BIOS disk geometry: cylinders: 524 heads: 128 sectors/track: 63 (8064 sectors/cylinder) Partition table: 0: sysid 6 (Primary 'big' DOS, 16-bit FAT (> 32MB)) start 63, size 4225473 (2063 MB), flag 0x0 beg: cylinder 0, head 1, sector 1 end: cylinder 523, head 127, sector 63 1: <UNUSED> 2: <UNUSED> 3: <UNUSED>
In this example the hard disk already contains a DOS partition, which will be deleted and replaced with a native NetBSD partition. The command fdisk -u sd0 allows to modify interactively the partitions. The modified data will be written on the disk only before exiting and fdisk will request a confirmation before writing, so you can work relaxedly.
To create the BIOS partitions the command fdisk -u must be used; the result is the following:
Partition table: 0: sysid 169 (NetBSD) start 63, size 4225473 (2063 MB), flag 0x0 beg: cylinder 0, head 1, sector 1 end: cylinder 523, head 127, sector 63 1: <UNUSED> 2: <UNUSED> 3: <UNUSED>
Now it's time to create the disklabel for the NetBSD partition. The correct steps to do this are:
#
disklabel sd0 > tempfile
#
vi tempfile
#
disklabel -R -r sd0 tempfile
Now we create some disklabel partitions, editing the
tempfile
as already explained. The
result is:
# size offset fstype [fsize bsize cpg] a: 2048004 63 4.2BSD 1024 8192 16 # (Cyl. 0*- 3969*) c: 4226662 63 unused 0 0 # (Cyl. 0*- 8191*) d: 4226725 0 unused 0 0 # (Cyl. 0 - 8191*) e: 2178658 2048067 4.2BSD 1024 8192 16 # (Cyl. 3969*- 8191*)
When the disklabel has been created it is possible to optimize it studying the output of the command newfs -N /dev/sd0a, which warns about the existence of unallocated sectors at the end of a disklabel partition. The values reported by newfs can be used to adjust the sizes of the partitions with an iterative process.
The final operation is the creation of the file systems for the newly defined partitions (a and e).
#
newfs /dev/sd0a
#
newfs /dev/sd0e
The disk is now ready for usage, and the two partitions can be mounted. For example:
#
mount /dev/sd0a /mnt
If this succeeds, you may want to put an entry for the partition
into /etc/fstab
.
If you try to modify a password and you get the mysterious
message “Password file is busy”, it probably
means that the file /etc/ptmp
has not
been deleted from the system. This file is a temporary copy
of the /etc/master.passwd
file: check
that you are not loosing important information and then
delete it:
#
rm /etc/ptmp
If the file /etc/ptmp
exists you can
also receive a warning message at system startup. For
example:
root: password file may be incorrect - /etc/ptmp exists
First shutdown to single user, partitions still mounted
“rw”
(read-write); You can do that by just typing shutdown
now while you are in multi user mode, or reboot with
the -s
option and make /
and /dev
read-writable by doing.
#
mount -u /
#
mount -u /dev
Then:
#
mkdir /newdev
#
cd /newdev
#
cp /dev/MAKEDEV* .
#
sh ./MAKEDEV all
#
cd /
#
mv dev olddev
#
mv newdev dev
#
rm -r olddev
Or if you fetched all the sources in
/usr/src
:
#
mkdir /newdev
#
cd /newdev
#
cp /usr/src/etc/MAKEDEV.local .
#
( cd /usr/src/etc ; make MAKEDEV )
#
cp /usr/src/etc/obj*/MAKEDEV .
#
sh ./MAKEDEV all
#
cd /
#
mv dev olddev; mv newdev dev
#
rm -r olddev
You can determine $arch by
#
uname -m
or
#
sysctl hw.machine_arch