Chapter 25. FreeBSD 內部

Table of Contents
25.1. FreeBSD 之啟動程序
25.2. DMA: What it is and How it Works
25.3. The FreeBSD VM System
25.4. IPv6/IPsec Implementation

25.1. FreeBSD 之啟動程序

Contributed by Poul-Henning Kamp . v1.1, April 26th.

啟動 FreeBSD 需要三個步驟: 載入 kernel, 測定root所在的檔案系統,以及初始化一些關於使用者方面的東西。

25.1.1. 載入 kernel

我們現在介紹以下三種載入 kernel 的基本方法: 它們全部都會給 kernel 一些資訊,幫助 kernel 決定接下來要做什麼。

Biosboot

Biosboot 是我們的 ``bootblocks''。 它由兩個檔案組成。這兩個檔案會被安裝在軟碟或硬碟中用來啟動的 slice 之第一個 8K bytes 的地方。

Biosboot 可以從一個 FreeBSD 的檔案系統載入 kernel。

從 Dos 啟動(Dosboot)

Dosboot 是由 DI. Christian Gusenbauer 撰寫的, 可惜現在很不幸地有一小部份的程式碼與 FreeBSD本身並不相容, 因為這些程式碼是寫給 Microsoft compilers 的。

Dosboot 可以從一個 MS-DOS 的檔案或是磁碟上的一個 FreeBSD file system partiton 來啟動FreeBSD。 它嘗試去克服隱藏在 MS/DOS 系統的 high memory 中多種奇怪的 memory manglers,結果通常都能騙過它們以繼續動作。

網路啟動(Netboot)

Netboot 會嘗試去尋找所支援的 Ethernet 網路卡, 並且用 BOOTP、TFTP 和 NFS 去找到 kernel 檔案來啟動 FreeBSD。

25.1.2. 決定根目錄所在的檔案系統

從 kernel 被載入,啟動程式跳到 kernel,kernel就開始初始化, 嘗試判定現在有什麼樣的硬體等等, 之後它需要找到根目錄所在的檔案系統。

我們現有支援以下幾種 root filesystems:

UFS

這是最普通的一種 root filesystem。它可以用在軟碟或硬碟上。

MSDOS

這只是技術上可行,實際上並不實用,因為 FAT 的檔案系統不能產生 links、 device nodes 和一些 ``UNIXisms'' (譯注:與 UNIX 相關的產物)。

MFS

這是一個被編譯在 kernel 內部的 UFS 檔案系統。代表了 kernel 不真正需要任何的硬碟/軟碟或是其他的硬體來動作。

CD9660

拿 CD-ROM 來當作 root filesystem 時用。

NFS

Root filesystem 放在檔案伺服器上, 基本上是用於一台沒有硬碟的機器。

25.1.3. 初始化使用者所屬的東西

要令使用者方面的東西執行,是在 kernel 結束初始化後, 它將會產生一個 pid == 1 的 process, 在 root filesystem 上執行一個程式,一般這個程式就是 /sbin/init

你可以以任何程式取代 /sbin/init, 只要你記住:

這裡沒有 stdin/out/err 除非你自己打開。 如果你離開,機器會 panics。並會對 pid == 1 產生的訊號作處理。

在安裝磁碟上的 /stand/sysinstall 就是一個例子。

25.1.4. 有趣的組合範例

啟動 kernel,在 MFS 裡有一個特別的 /sbin/init 它會...

A -- 使用 DOS

  • 把您的 C: 掛在 /C:

  • C:/freebsd.fs 設定成 /dev/vn0

  • /dev/vn0 掛到 /rootfs

  • 做一些 symlinks /rootfs/bin -> /bin /rootfs/etc -> /etc /rootfs/sbin -> /sbin (etc...)

現在你跑 FreeBSD 而不用重新分割你的硬碟...

B -- 使用 NFS

用 NFS 把 server:~you/FreeBSD 掛在 /nfs,把 root 位置改變成 /nfs 並在那堸鶡 /sbin/init

現在你不用磁碟而可以跑 FreeBSD, 就算你沒有 NFS server 的控制權...

C -- 執行 X-server

現在你有一個 X 終端機,這總比你在 windows 下跑 X 視窗模擬器好,不但速度快很多,也省下不少硬體的錢。

D -- 使用 tape

製作一份 /dev/rwd0 的拷貝並寫到遠端的磁帶機或是檔案伺服器。

這樣你終於能夠做一份你應該在一年之前就做好的備份...

E -- 充當 firewall/web-server/隨便你嘛...

這是十分有趣的,當你從防寫的軟碟啟動後, 仍然可以寫入你的 root filesystem...