Chapter 19. 各式各样的作业

Table of Contents
19.1. 建立 i386 的开机磁盘
19.2. 烧录 CD-ROM
19.3. 同步系统时钟
19.4. 安装开机管理者
19.5. 删除 disklabel
19.6. 扬声器
19.7. 忘了 root 密码?
19.8. 增加新硬盘
19.9. Password file is busy?
19.10. 如何重建 /dev

这一章搜集了一些常见的主题,而在前面的章节中没有提到的。

19.1. 建立 i386 的开机磁盘

这一段(建立 i386 的开机磁盘)是由 Eric Delcamp 所提供的

首先,在你执行的核心中,必须支持 vnd 虚拟装置(这在 GENERIC 核心中为默认值)。

  1. 第一步,你必须建立一个合法的核心来将它放至磁盘上,让我们称 它为 FLOPPY。这个核心必须由 INSTALL 核心设定档而来。接着, 你必须有一个合法的 /sys/arch/i386/compile/FLOPPY/netbsd 档案。

  2. 进入 /usr/src/distrib/i386/floppies/ramdisk 并执行

    # make
            

    这将会在该目录建立 ramdisk.fs 档案。

  3. 进入 /usr/src/distrib/i386/floppies/fdset 并执行

    # make KERN=/sys/arch/i386/compile/FLOPPY/netbsd

    这将会建立一或两个(视核心大小而定)档案,名为 boot1.fsboot2.fs

  4. 使用以下指令将这些档案传送到磁盘上

    # dd if=boot1.fs of=/dev/fd0a bs=36b
    # dd if=boot2.fs of=/dev/fd0a bs=36b
          
  5. 将第一片磁盘置入软盘机中并重开机!

19.2. 烧录 CD-ROM

要烧录数据 CD-ROM,可以使用 mkisofscdrecord 程序: SCSI 和 IDE 烧录机都被支援。被 NetBSD 支援的 IDE/ATAPI 烧录机并 不需要模拟层,因为烧录机可以直接接受 ATAPI 命令,真是简单又漂亮 的方法。

要烧录 CD 需要两个步骤:首先必须使用 mkisofs 程序在硬盘上建立 CD 的 ISO 映像档。接着,必须使用 cdrecord 将映像档写入 CD。 以下我们将使用一台被 cdrecord 支持的 IDE/ATAPI 烧录机作为范例。 这是 dmesg 输出:

cd1 at atapibus1 drive 0: <HP CD-Writer Plus 8100> type 5 cdrom removable
    

Note: 在烧录 CD 时,执行的速度是个关键:流向烧录机的数据必须是 连续不断的而不能有暂停;烧录机的资料 buffer 绝对不能空白。 这是指要烧录 CD 时,最好在系统为待机或近乎待机状态时(当你 执行 cdrecord 时,不要重编核心或压缩 MP3...)

19.2.1. 建立 ISO 映像档

因为 ISO 映像档会相当的大,最好检查硬盘上是否有足够的空间来建立数据 (最多 700MB)。要建立映像文件,假设数据是在 mydata 和它的子目录下,键入以下指令:

# mkisofs -aflrTv -o cdimage mydata/
      

cdimage 档被建立了以后,它可以像 一般的档案系统一样地被检查和浏览,在烧录在 CD 之前先检查 是否有错误。例如:

# ls -l cdimage
-rw-rw-r--  1 auser     user  284672 Dec  1 11:58 cdimage
# vnconfig -v vnd0 cdimage 512/556/1/1
# mount -r -t cd9660 /dev/vnd0c /mnt
  ... browsing su /mnt ...
# umount /mnt
# vnconfig -u vnd0
      

数值 556 表示 cdimage 档案的大小。

烧录共生的 CD: mkisofs 可以使用 Joliet 格式烧录 CD;这样的 CD 将可以 在 Microsoft 系统底下读取。它也能烧录共生的 CD,同时 具有 RockRidge 和 Joliet 延伸,可以在 Unix 和 Windows 系统底下读取。例如:

$ mkisofs -l -J -R -o cd.iso mydata/
	

查看 mkisofs 在线手册可以得到更详细的说明。

19.2.2. 将映像档烧录到 CD

第二步是利用以下指令将映像文件烧录到 CD:

# cdrecord -v speed=2 dev=/dev/rcd1d cdimage
      

Note: 对 ATAPI 烧录机而言,必须使用 rcd#d, 因为 a 装置并不接受 ATAPI 的命令。

在烧录映像档之前,最好先执行测试,先关掉雷射:只要增加 -dummy-nofix 选项 到命令列即可。例如:

# cdrecord -v -dummy -nofix speed=2 dev=/dev/rcd1d cdimage
      

经由这两个步骤,建立并烧录了映像档,也可以结合成单一的指令, 而不需要建立一个(大的)暂存盘到硬盘上。像这样:

# (nice -18 mkisofs -aflrT mydata/) | cdrecord -v fs=16m speed=2 dev=/dev/rcd1d -
      

选项 fs=16m 被用来配置一个较大的 fifo,避免 cdrecord 出现 buffer underflow 的 错误(这表示 cdrecord 没有数据可以写入)。

19.2.3. 复制 CD

要直接复制 CD,在 cdrecord 指令中可以 加上 -isosize 选项。例如:

# cdrecord -v fs=16m -isosize speed=2 dev=/dev/rcd1d /dev/rcd0d
      

Note: 如果你使用两台 IDE/ATAPI CD(-RW),最好将它们连接到两个不同的 IDE 控制器上(一个接到 primary 另一个接到 secondary 上)因为 这可以使数据获得较佳的传输。这里有一个设定的范例:

wd0: hard disk, IDE primary master
cd0: CD reader, IDE primary slave
cd1: CD writer, IDE secondary master
      

19.2.4. 烧录可开机的 CD

烧录可开机的 CD 只需要将一个用来开机的二进制档案放到 CD 上: 这个开机文件用来仿真磁盘片。可以使用 mkisofs 加上 -b 选项。例如:

# mkisofs -avr -b boot.fs -o cdimage mydata/
      

boot.fs 是 CD 上的开机档。请注意, boot.fs 的路径必须指向 mydata/ 目录。

19.3. 同步系统时钟

我们经常会发现系统时钟是错误的,常会误差几分钟:因为一些奇怪 的原因,似乎是计算机的时钟并不是非常准确。最糟的问题是,如果你 是许多网络主机的管理者:保持时间同步的工作常常是一场恶梦。要 解决这个问题,NTP 协议(版本 3)可以达成 我们的目的:这个协议可以经由一台或多台 NTP 服务器来同步工作站 网络的时钟。

感谢有了 NTP 协议,它不但能修正单一工作站的时钟,还包含了整个 网络。NTP 协议相当的复杂,定义了一个阶层式的主从架构,并分成 数层:第一层 server,也就是最上层,连结到一个外部的时钟(例如, 一台原子钟)来保持极高的精确度。接下来的第二层 server 则使它的 时钟和第一层同步,以此类推。所以越低等级的层级,其精确度也越低。 阶层式的架构避免造成当所有主机都参考相同(少数)第一层级 server 时,所造成的拥挤。例如,你想要同步一个网络的时钟,你不必将所有的 主机,都连结到相同的公共的第一层 server 上。取而代之的是,建立 建立一台区域主机,连结到主要的 server,而使其它的主机的时钟和 这台区域主机同步即可。

幸运的是,要使用 NTP 工具,你不必了解协议的实际运作过程(如果 你有兴趣,请参阅 RFC 1305)而你只需知道如何设定和启动某些程序。 NetBSD 的基本系统里已经包含了必要的工具,来利用这个协议(我们 也将看到其它和时间有关的协议),可以使用 xntp 来执行。这一段描述了一个简单的 方法,使我们总是有一个正确的系统时间。

首先,必须找到公共的 NTP server 来当作参考;详细的列表在 http://www.eecis.udel.edu/~mills/ntp/servers.html。 举例来说,在意大利有两个第一层的 server 可以使用,即 tempo.cstv.to.cnr.it 和 time.ien.it。

接着,用 root 身份执行以下指令来修正系统时钟:

# ntpdate -b tempo.cstv.to.cnr.it time.ien.it
      
将 server 名称换成你实际上所使用的。选项 -b 告诉 ntpdate 使用 settimeofday 系统呼叫来 设定系统时间,而不是用 adjtime(默认值)来调整它。当区域时间 的差异不小的时候,建议使用这个选项。

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 并不难以使用。下一步骤是要自动地启动它,而不必 总是要动手修正时间。如果你是经常性地连结到 Internet,你可以在开机 时启动它。在 /etc/rc.conf 中加入这一行设定:

ntpdate=YES      ntpdate_hosts="time.ien.it"
      
NTP server 的名称必须指定在 ntpdate_hosts 变量中;如果没有设定, 则开机 script 将试着从 /etc/ntp.conf 档中 取得名称。

如果你不是经常性地连结到 Internet(例如,你利用调制解调器拨接到 ISP),你可以从 ip-up script 中启动 ntpdate,如 Chapter 9 中所述。在这个情况, 将以下这一行加到 ip-up script 中:

/usr/sbin/ntpdate -s -b time.ien.it
      
(路径必须提供否则 script 可能不能找到可执行档。) 选项 -s 将登入的讯息从标准输出(默认值)转到 系统的 syslog(3) 机制,这表示 ntpdate 的讯息将会出现在 /var/log/messages 中。

除了 ntpdate 之外,还有其它有用的 NTP 指令。我们也可以将区域的 主机转变成一台 NTP server,来替网络上其它的主机服务。这台区域的 server 将使它的时钟和公共的 server 同步。关于这种设定的类型,你 必须使用 xntpd 常驻程序并建立 /etc/ntp.conf 设定档。例如:

server time.ien.it
server tempo.cstv.to.cnr.it
      

Xntpd 也可以使用相关选项从 rc.conf 中启动:

xntpd=YES
      

如果你想要同步网络时间,NTP 不是你唯一的选择:你也可以使用 timed 常驻程序,这是由 4.3BSD 发 展出来的。Timed 也使用主从式的架构:当在一台主机上启动了以后, timed 会要求网络时间和主机同步,并准确地调整区域的时钟。一个 混用的结构,同时使用 timed 和 xntpd。一台区域主机从公共的 NTP server 获得正确的时间,而在它上面执行的 timed 则管理了其余 的网络主机,其余的网络主机都成为它的 client 并且使用 timed 来 同步它们的时钟。这表示这台区域主机必须同时执行 NTP 和 timed; 要留意不要让它们互相妨碍(timed 必须加上 -F hostname 选项来启动,使它不会试着去修正区域的时钟)。

19.4. 安装开机管理者

NetBSD 的安装程序 Sysinst,可以安装 NetBSD 的开机管理者到 硬盘上。如果需要的话,开机管理者也可以稍后再安装或重新设定, 我们可以利用 fdisk 指令来执行,例如:

# fdisk -B wd0
    

如果 NetBSD 不能从硬盘上开机,你可以从安装磁盘开机并启动在 硬盘上的核心。置入安装磁盘并在开机提示符号中,键入以下指令:

> boot wd0a:netbsd
    

这会启动在硬盘上的核心(使用正确的装置,例如 SCSI 硬盘机 为 sd0a。)

Note: 有时候 fdisk -B 不能得到我们想要的结果( 至少发生在我身上),可能是如果你安装/遗除了其它的操作系统, 像是 Windows 95。在这种情况中,试着在 DOS 中执行 fdisk /mbr 并在 NetBSD 中,在执行一次 fdisk

19.5. 删除 disklabel

虽然这不是一项你需要常常执行的作业,但它是有用的且让你知道 如何在需要的时候执行它。在执行这类型的作业之前,请确定你知道 你在做什么。例如:

# dd if=/dev/zero of=/dev/rwd0c bs=8k count=1
    

上述的指令删除了 disklabel(不是 MBR 分割表)。要完全删除整个 硬盘,必须使用 wd0d 装置。例如:

# dd if=/dev/zero of=/dev/rwd0d bs=8k
    

19.6. 扬声器

我从 mailing list 上获得这项情报(我不记得作者是谁了。) 要从扬声器发出声音(例如在一支很长的 script 的结尾),可以使用核心 的 spkr 装置,而它对应到 /dev/speaker。例如:

echo 'BPBPBPBPBP' > /dev/speaker
    

Note: spkr 装置在 generic 核心中并没有设定; 你需要个人化的核心。

19.7. 忘了 root 密码?

如果你忘了 root 的密码,别担心,没有任何资料会损失,而且 你仍然可以使用以下步骤来"恢复"系统:开机进入 单人模式,挂上 / 并更改 root 的密码。 详细步骤如下:

  1. 开机进入单人模式:当出现提示符号并开始倒数五秒时, 键入以下指令:

    > boot -s
    	  

  2. 在以下的提示符号中

    Enter pathname of shell or RETURN for sh:
    	  
    按下 Enter。

  3. 键入以下指令:

    # fsck -y /
    # mount -u /
    # fsck -y /usr
    # mount /usr
    	  

  4. 使用 passwd 更改 root 的密码。

  5. 使用 exit 指令进入多人模式。

19.8. 增加新硬盘

这一段描述如何增加一颗新的硬盘到现有的的 NetBSD 系统上。 在以下的范例中,我们将增加一颗连接到 SCSI 控制器的新硬盘。 如果你不需要新的控制器,就跳过相关的部份并直接到硬盘的设定。 IDE 硬盘的安装过程是相同的;只是装置的名称会不一样,将 (sd# 改为 wd#)。

在购买新的硬件之前,记得要查看 NetBSD 兼容的硬件清单,并且 确定新的装置被系统所支持。

当 SCSI 控制器实际地被安装在系统上,并且新硬盘也被接上之后, 就可以重新启动计算机并检查装置是否被正确地侦测,可以利用 dmesg 指令来查看。这里是 NCR-875 控制器 的相关讯息:

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
      
如果装置并没有出现,则检查它是否被你正在使用的核心所支持; 如果需要的话,编译一个个人化的核心(参考 Chapter 7。)

现在可以使用 fdisk 指令建立分割区了。 首先,检查硬盘目前的状态:

# 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>
    

在此例中,硬盘已经包含了一个 DOS 分割区,将可以用来删除并置换成 一个 NetBSD 分割区。fdisk -u sd0 指令允许你 进行交谈式地修改分割区。经过修改的数据,只有在离开程序之后才会 写回硬盘,而且在离开时, fdisk 会要求确认,所以你可以放心地 工作。

要建立 BIOS 分割区,必须使用 fdisk -u 指令;结果显示在下:

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>
      

现在可以为 NetBSD 分割区建立 disklabel 了。 正确的步骤如下:

# disklabel sd0 > tempfile
# vi tempfile
# disklabel -R -r sd0 tempfile
      

现在我们建立一些 disklabel 分割区,编辑 tempfile 作为模板。结果为:

#      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*)
      

Note: 在建立了 disklabel 以后,现在可以研究 newfs -n /dev/sd0a 指令的输出讯息了, 它会有警告讯息关于在最后一个 disklabel 分割区所存在的未 配置的扇区数。这个由 newfs 所回报的值可以经由一个交谈式的 过程,来调整分割区的大小。

最后的作业是为新定义的分割区 (ae) 建立档案系统。

# newfs /dev/sd0a
# newfs /dev/sd0e
      
硬盘现在已经可以使用了,而且两个分割区也可以挂上。例如:
# mount /dev/sd0a /mnt
      

19.9. Password file is busy?

如果你试着修改密码而你得到一个奇怪的讯息 "Password file is busy",这可能是指 /etc/ptmp 还没有从系统上删除。这是一个 暂存的复制档,由 /etc/master.passwd 而来: 检查你是否有遗失重要的信息然后便删除它 (ptmp,不是 master.passwd

Note: 如果 /etc/ptmp 存在的话,你也会在 系统启动时接收到一个警告的讯息。例如:

root: password file may be incorrect - /etc/ptmp exists
	

19.10. 如何重建 /dev

这一段是由 Reinoud Koornstra 所贡献的

首先要进入单人使用模式,分割区仍然要以 "rw" (可擦写)状态挂上;当你在多人使用模式时,可以键入 shutdown now,或是重新开机并使用 -s 选项并使 //dev 成为可擦写的。

# mount -u /
# mount -u /dev
    

然后:

# mkdir /nudev
# cd /nudev
# cp /dev/MAKEDEV* .
# sh ./MAKEDEV all
# cd /
# mv dev odev
# mv nudev dev
# rm -r odev
    

或是如果你取得所有的原始码在 /usr/src

# mkdir /nudev
# cd /nudev
# cp /usr/src/etc/MAKEDEV.local .
# cp /usr/src/etc/etc.$arch/MAKEDEV .
# sh ./MAKEDEV all
# cd /
# mv dev odev; mv nudev dev
# rm -r odev
    

你可以由以下指令来决定 $arch

# uname -m
    

or

# sysctl hw.machine_arch
    

使用第二种方法,即从原始码中复制新的 MAKEDEV,将会增加一些 在 i386 架构上最新的装置。例如,现在它可以有 16 的分割区而不是 8 个。如果你使用在原先 /dev 目录中 "旧的" MAKEDEV,将不会建立新的装置。