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,將不會建立新的裝置。