製作軟盤上執行的FreeBSD系統(轉)

gugu99發表於2007-08-11
製作軟盤上執行的FreeBSD系統(轉)[@more@]

  “簡單的東西不容易出問題。”

  至理名言!事實上,削減作業系統中那些對你沒用的功能是一件非常重要的事情。這不僅僅意味著一個更小的作業系統,佔用更少的磁碟空間(現在的硬碟少說也有幾十GB,幾兆的空間根本就是九牛一毛),而且意味著你被攻擊的可能性也更低——簡而言之,你不需要擔心作業系統中沒有安裝的模組存在問題會對你造成影響。

  這篇文章中,我們將一起對FreeBSD-i386的核心進行最佳化配置。這篇文章是針對FreeBSD4.7-STABLE寫的,並且,FreeBSD 4.x的配置不會和這篇文章有太大出入。如果你要最佳化FreeBSD 5或FreeBSD 2/3的核心的話,則需要仔 細參考它們的LINT檔案了(後面將會提到)。

  [注意:FreeBSD 5.0預定將於2002年11月20日釋出。FreeBSD的開發組非常重視發行版本的質量,並認為這比發行版本的計劃還重要,但由於同樣的原因,我們往往會發現FreeBSD實際發行的版本比預定計劃晚一些,通常在半個月之內。FreeBSD 5.0作為FreeBSD近期最為重要的發行版本,很可能也會延後發表,但筆者個人認為無論如何我們在今年年底之前肯定是可以看到最終的發行版本的。FreeBSD 5.0對系統進行了大量的修改,這一系列的文章將在FreeBSD 5.0釋出當天發表針對5.0的修訂版本,而現有版本將保留,但進入維護階段,不再引入新的內容。]

  FreeBSD的原始碼可以直接從中央cvsup伺服器同步,也可以作為系統的一部分在安裝的時候一兵裝上。前面已經說過如何同步原始碼,在此不再贅述。FreeBSD的原始碼(通常在/usr/src)包含建造基本系統的全部程式碼,而在/usr/src/sys中則有若干個目錄,對應不同的計算機體系結構(4.x只支援i386和alpha)。i386是一個泛指的名字,包含了與Intel 80386相容的所有機器,並不是特指80386。

  簡單介紹一下FreeBSD的核心檔案。在4.x系統中,/kernel這個檔案是預設的核心,通常正常啟動使用的就是它。 /kernel.GENERIC這個檔案是相容性較強的核心,如果/kernel無法引導系統, 就得靠這個檔案來引導。/kernel.old是本次make kernel之前的核心,通常如果你的kernel壞掉, 也可以考慮使用/kernel.old來引導系統。

  /modules/是核心的模組,而/modules.old/是對應/kernel.old的模組。這些檔案在每次替換kernel的時候都會同時替換。

  在5.0中,核心以及核心的模組都被儲存在/boot/kernel中。

  在/usr/src/sys/i386/conf中有兩個配置檔案,GENERIC和LINT。其中GENERIC是make kernel的預設配置檔案,直接make kernel生成的是GENERIC核心,但安裝時命名為/kernel。系統在安裝時會安裝一個kernel.GENERIC,以後,這個檔案不會跟隨系統的make kernel更新,因此,如果你認為這個檔案有必要更新的話,需要手工make kernel,並把/kernel改名為kernel.GENERIC。當然,通常並不需要這樣做。

  LINT是包括幾乎所有核心編譯配置詳細資訊的檔案。這個配置並不是用來真正建立kernel的,他的主要用途是向使用者展示可用的核心編譯配置。在修改核心編譯配置時,最好先參考這個檔案。

  為了配置自己的核心,應將GENERIC複製為一個另外的檔案。習慣上這個檔案和主機名相同。例如,我把自己的這臺Web機器命名為apache.intranet.frontfree.net,就把配置檔案命名為APACHE:

  cd /usr/src/sys/i386/conf

  cp GENERIC APACHE

  隨後,用ee APACHE編輯它。我們拿一個實際的GENERIC檔案來說明。

  為了節省篇幅,這個檔案頭上的註釋被刪掉了一部分。

  machine i386         # 體系模型為i386

cpu I386_CPU         # 支援80386

cpu I486_CPU         # 支援80486

cpu I586_CPU         # 支援Pentium

cpu I686_CPU         # 支援Pentium Pro以及更高

ident GENERIC        # 核心檔案的名字

maxusers 0          # 自動檢測同時允許的最大使用者數

#makeoptions DEBUG=-g # 包含除錯符號。通常只有current版本開啟

options MATH_EMULATE #支援協處理器模擬

options INET     #支援網際網路

options INET6     #IPv6通訊協議

options FFS      #伯克利快速檔案系統

options FFS_ROOT   #FFS作為根裝置[必須保留]

options SOFTUPDATES  #開啟FFS soft updates支援

options UFS_DIRHASH  #提高大型目錄的支援

options MFS      #記憶體檔案系統

options MD_ROOT    #MD作為根裝置

options NFS      #Network Filesystem

options NFS_ROOT   #NFS作為根裝置(需要NFS)

options MSDOSFS    #MSDOS檔案系統

options CD9660    #ISO 9660檔案系統(光碟)

options CD9660_ROOT  #CD-ROM作為根裝置(需要CD9660)

options PROCFS    #程式檔案系統

options COMPAT_43   #相容4.3BSD[必須保留]

options SCSI_DELAY=15000 #檢測SCSI裝置前的延時(ms)

options UCONSOLE   #使用者可以奪取控制檯

options USERCONFIG  #boot -c編輯器 editor

options VISUAL_USERCONFIG #選單式boot -c編輯器

options KTRACE    #ktrace(1)支援

options SYSVSHM    #SYSV-風格的共享記憶體

options SYSVMSG    #SYSV-風格的訊息佇列

options SYSVSEM    #SYSV-風格的訊號量(semaphores)

options P1003_1B   #Posix P1003_1B實時擴充套件

options _KPOSIX_PRIORITY_SCHEDULING

options ICMP_BANDLIM #對惡意ICMP請求進行限制

options KBD_INSTALL_CDEV # 在/dev安裝一個CDEV裝置

# 下面兩項在製作對稱多處理器(SMP)核心時需要

#options SMP     #對稱多處理器核心

#options APIC_IO   #對稱(APIC) I/O

device isa

device eisa

device pci

# 軟碟機

device fdc0 at isa? port IO_FD1 irq 6 drq 2

device fd0 at fdc0 drive 0

device fd1 at fdc0 drive 1

#

# 如果使用東芝Libretto以及他的Y-E Y-E Data PCMCIA軟碟機

# 不要使用上面的fdc0,而應使用

#device fdc0

# ATA以及ATAPI裝置

device ata0 at isa? port IO_WD1 irq 14

device ata1 at isa? port IO_WD2 irq 15

device ata

device atadisk # ATA 磁碟驅動器(IDE硬碟)

device atapicd # ATAPI 光碟機

device atapifd # ATAPI 軟碟機

device atapist # ATAPI 磁帶機

options ATA_STATIC_ID #靜態裝置編號

# SCSI控制器

device ahb # EISA AHA1742 family

device ahc # AHA2940 板載AIC7xxx裝置

device amd # AMD 53C974 (Tekram DC-390(T))

device isp # Qlogic family

device ncr # NCR/Symbios Logic

device sym # NCR/Symbios Logic (較新的晶片組)

options SYM_SETUP_LP_PROBE_MAP=0x40

# 使用ncr可以在配置了sym和ncr的情況下掛接舊的NCR裝置

device adv0 at isa?

device adw

device bt0 at isa?

device aha0 at isa?

device aic0 at isa?

device ncv # NCR 53C500

device nsp # Workbit Ninja SCSI-3

device stg # TMC 18C30/18C50

# SCSI 外設

device scbus # SCSI 匯流排(如果使用SCSI裝置,必須有)

device da # Direct Access (硬碟)

device sa # Sequential Access (磁帶,等等)

device cd # CD

device pass # Passthrough device (直接 SCSI 訪問)

# 透過SCSI子系統介面的RAID控制器

device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID

device dpt # DPT Smartcache - See LINT for options!

device iir # Intel Integrated RAID

device mly # Mylex AcceleRAID/eXtremeRAID

device ciss # Compaq SmartRAID 5* series

# RAID控制器

device aac # Adaptec FSA RAID, Dell PERC2/PERC3

device aacp # SCSI passthrough for aac (requires CAM)

device ida # Compaq Smart RAID

device amr # AMI MegaRAID

device mlx # Mylex DAC960 family

device twe # 3ware Escalade

# atkbdc0 控制鍵盤和PS/2滑鼠

device atkbdc0 at isa? port IO_KBD

device atkbd0 at atkbdc? irq 1 flags 0x1

device psm0 at atkbdc? irq 12

device vga0 at isa?

# 啟動畫面和螢幕保護程式

pseudo-device splash

# syscons 是預設的控制檯驅動,類似SCO控制檯

device sc0 at isa? flags 0x100

# 對於pcvt vt220控制檯,啟用這個和PCVT_FREEBSD

#device vt0 at isa?

#options XSERVER # 在vt控制檯支援X伺服器

#options FAT_CURSOR # 使用大游標

# 如果你是用ThinkPad,將下面的一行和其他PCVT相關裝置的註釋去掉

#options PCVT_SCANSET=2 # IBM使用非標準鍵盤

# 浮點運算支援 - 請勿禁用

device npx0 at nexus? port IO_NPX irq 13

# 電源管理支援

device apm0 at nexus? disable flags 0x20 # Advanced Power Management

# PCCARD (PCMCIA) 支援

device card

device pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000

device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable

# 串列埠(COM)

device sio0 at isa? port IO_COM1 flags 0x10 irq 4

device sio1 at isa? port IO_COM2 irq 3

device sio2 at isa? disable port IO_COM3 irq 5

device sio3 at isa? disable port IO_COM4 irq 9

# 並口

device ppc0 at isa? irq 7

device ppbus # 並口匯流排 (所有並口裝置都需要)

device lpt  # 印表機

device plip # 並口TCP/IP

device ppi  # 並口介面裝置

#device vpo # 需要scbus和da

# PCI 乙太網介面卡

device de # DEC/Intel DC21x4x (``Tulip'')

device em # Intel PRO/1000 adapter Gigabit Ethernet Card (``Wiseman'')

device txp # 3Com 3cR990 (``Typhoon'')

device vx # 3Com 3c590, 3c595 (``Vortex'')

# 使用公共的MII匯流排控制器程式碼的PCI乙太網介面卡

# 注意:一定要保留'device miibus'以確保可用

device miibus # MII匯流排支援

device dc # DEC/Intel 21143 and various workalikes

device fxp # Intel EtherExpress PRO/100B (82557, 82558)

device pcn # AMD Am79C97x PCI 10/100 NICs

device rl # RealTek 8129/8139

device sf # Adaptec AIC-6915 (``Starfire'')

device sis # Silicon Integrated Systems SiS 900/SiS 7016

device ste # Sundance ST201 (D-Link DFE-550TX)

device tl # Texas Instruments ThunderLAN

device tx # SMC EtherPower II (83c170 ``EPIC'')

device vr # VIA Rhine, Rhine II

device wb # Winbond W89C840F

device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')

device bge # Broadcom BCM570x (``Tigon III'')

# ISA乙太網介面卡

# 'device ed' 需要 'device miibus'

device ed0 at isa? port 0x280 irq 10 iomem 0xd8000

device ex

device ep

device fe0 at isa? port 0x300

# Xircom Ethernet

device xe

# PRISM I IEEE 802.11b wireless NIC.

device awi

# WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really

# exists only as a PCMCIA device, so there is no ISA attachment needed

# and resources will always be dynamically assigned by the pccard code.

device wi

# Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will

# work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP

# mode (the factory default). If you set the switches on your ISA

# card for a manually chosen I/O address and IRQ, you must specify

# those parameters here.

device an

# The probe order of these is presently determined by i386/isa/isa_compat.c.

device ie0 at isa? port 0x300 irq 10 iomem 0xd0000

#device le0 at isa? port 0x300 irq 5 iomem 0xd0000

device lnc0 at isa? port 0x280 irq 10 drq 0

device cs0 at isa? port 0x300

device sn0 at isa? port 0x300 irq 10

# 偽裝置 - 數字表示分配多少個

pseudo-device loop # 環回網路

pseudo-device ether # 乙太網支援

pseudo-device sl 1 # 核心級SLIP

pseudo-device ppp 1 # 核心級PPP

pseudo-device tun  # 資料包隧道

pseudo-device pty  # 偽-tty(telnet等等)

pseudo-device md  # 記憶體虛擬盤

pseudo-device gif  # IPv6和IPv4隧道

pseudo-device faith 1 # IPv6-to-IPv4轉發(翻譯)

# `bpf'偽裝置將啟用伯克利資料包過濾器。

# 小心由此帶來的管理問題

pseudo-device bpf #Berkeley packet filter

# USB支援

device uhci # UHCI PCI->USB interface

device ohci # OHCI PCI->USB interface

device usb # USB Bus (required)

device ugen # Generic

device uhid # "Human Interface Devices"

device ukbd # Keyboard

device ulpt # Printer

device umass # Disks/Mass storage - Requires scbus and da

device ums # Mouse

device uscanner # Scanners

device urio # Diamond Rio MP3 Player

# USB 乙太網,需要mii

device aue # ADMtek USB ethernet

device cue # CATC USB ethernet

device kue # Kawasaki LSI USB ethernet

  測試平臺:FreeBSD 4.5 Release (i386)

  大家可能見到過很多在軟盤上執行的Linux系統,可在軟盤上執行的FreeBSD反而比較少,雖然有PICOBSD,然而很多時候PICOBSD並不能滿足我們的需要,那麼可不可以自己製作一個在軟盤上執行的FreeBSD系統呢?答案是肯定的。我在維護著一個Floppy Firewall的Project,它是一個基於FreeBSD和IPFilter的執行在軟盤上的防火牆系統,很多網友在使用了Floppy Firewall之後發郵件來詢問如何使FreeBSD執行在一張小小的軟盤上。但由於前段時間事情太多一直沒有時間,今天終於找到時間,所以把製作在軟盤上執行的FreeBSD的過程寫出來與大家分享,有錯誤之處,還請大家指教。

  1、FreeBSD的啟動過程簡介

  當BIOS讀入MBR之後,MBR中的程式讀入硬碟FreeBSD Slice(FreeBSD分割槽)中的載入程式,載入程式預設情況下會載入/boot/loader,然後loader將載入/kernel,此時kernel開始檢測一些硬體和做一些初始化。初始化完成後kernel將mount root device,然後啟動系統初始化程式/sbin/init,init將根據/etc/rc中的設定來進行初始化等。

  可以看出我們需要解決的部分就是:載入程式 -> /boot/loader -> /kernel -> /sbin/init -> /etc/rc

  在瞭解了啟動過程之後和問題所在之後,我們便可以開始製作軟盤上的FreeBSD了。

  2、初始化軟盤

  首先要做的就是要將軟盤初始化,包括設定disklabel和建立檔案系統(格式化成ufs格式)。

  bsd# disklabel -r -w fd0a fd1440

  接下來是安裝載入程式。

  bsd# disklabel -B fd0a

  現在軟盤已經能夠引導了,但因為我們要在它上面放置程式,所以要建立檔案系統。

  bsd# newfs fd0a

  剛才已經做好了載入程式,因為載入程式會載入/boot/loader,所以我們還需要將系統中的/boot/loader複製到軟盤中。

  bsd# mkdir /fd

  bsd# mount /dev/fd0a /fd

  bsd# mkdir /fd/boot

  bsd# cp /boot/loader /fd/boot/loader

  根據FreeBSD的啟動過程,現在我們已經準備好了載入程式和loader,接下來就要準備核心了。

  3、定製核心

  軟盤的空間有限,所以我們需要定製一個小核心,而不能直接使用系統原來的核心。

  由於我們只使用軟盤,所以核心中的關於scsi、ata、atapi和raid等這些東西都應該刪除,因為我們不需要IPv6所以INET6也應該刪除,具體留下些什麼要看自己的用途了,這沒有什麼標準。不過有幾樣是必須的:

  options MFS      # 記憶體檔案系統支援

  options MD_ROOT    # 使用MD(記憶體磁碟)裝置做root

  options UFS      # UFS檔案系統支援

  options UFS_ROOT    # UFS ROOT

  pseudo-device md    # MD裝置支援

  下面是我使用的一個核心配製檔案:

  #

  # GENERIC -- Generic kernel configuration file for FreeBSD/i386

  #

  #

  # $FreeBSD: src/sys/i386/conf/GENERIC,v 1.246.2.38 2002/01/25 17:41:40 murray Exp $

  machine          i386

  cpu            I386_CPU

  cpu            I486_CPU

  cpu            I586_CPU

  cpu            I686_CPU

  ident           "MINI-KERNEL"

  maxusers  0   #maxusers最好讓系統自動分配,如果設得過大,會佔用過多的記憶體。

  options  INET    #InterNETworking

  options  FFS     #Berkeley Fast Filesystem

  options  FFS_ROOT  #FFS usable as root device [keep this!]

  options  MFS     #Memory Filesystem

  options        MD_ROOT    #MD is a potential root device

  options        COMPAT_43   #Compatible with BSD 4.3 [KEEP THIS!]

  options        NO_SWAPPING  #Disable swap

device  isa

  device  pci

# Floppy drives

  device       fdc0 at isa? port IO_FD1 irq 6 drq 2

  device       fd0 at fdc0 drive 0

# atkbdc0 controls both the keyboard and the PS/2 mouse

  device          atkbdc0  at  isa?  port  IO_KBD

  device          atkbd0   at  atkbdc?  irq 1  flags 0x1

device          vga0    at  isa?

# syscons is the default console driver, resembling an SCO console

  device          sc0     at  isa?  flags 0x100

# Floating point support - do not disable.

  device          npx0    at  nexus?  port IO_NPX  irq 13

# PCI Ethernet NICs that use the common MII bus controller code.

  # NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!

  device          miibus    # MII bus support

  device          fxp     # Intel EtherExpress PRO/100B (82557, 82558)

  device          rl        # RealTek 8129/8139

  device          xl       # 3Com 3c90x

  device          lnc0  at  isa?  port 0x280  irq 10  drq 0  #   VMware Nic

# Pseudo devices - the number indicates how many units to allocate.

  pseudo-device    loop      # Network loopback

  pseudo-device    ether      # Ethernet support

  pseudo-device    md       # Memory "disks"

  上面的核心基本上是一個系統要執行的最小配製了,當然如果你的機器不同具體也不同,大家按自己的情況來定,我的機器配製是:

  CPU: Pentium III 733Mhz

  MotherBoard: Via 693A Chipset

  NIC: Realtek 8139c

  當配製好之後就是編譯核心了,建議大家使用config的方式來編譯,注意,最後不要使用make install,否則你原來的核心會被替換。

  bsd# cd /sys/i386/conf

  bsd# config MINI

  bsd# cd ../../compile/MINI

  bsd# make depend && make kernel

  編譯完成後就會成生kernel這個檔案,這時它的體積還是比較大,不過現在不用管它,後面將會介紹如何處理它。

  4、編譯系統程式

  現在就要準備系統所需要的基本程式了,首先最基本的是init和sh,init是所有程式的父程式,它負責進行一些初始化工作,它將是kernel引導完成後要執行的第一個使用者程式,而sh用於解釋/etc/rc中的命令。

  在UNIX中大部程式都使用了共享庫,這有利減少磁碟空間的佔用,這對於使用硬碟是非常有用的,然而對於軟盤就不太適用了,因為單一個大部分程式都要使用的庫libc.so就有500多K,加上其它的庫軟盤根本就裝不下。

  我們可以發現,大部分時候一個程式只是用到了庫中的某個函式,但同樣也要載入整個庫,所以我們可以使用靜態編譯來使程式只包含它使用的那部分函式,這樣可以減少程式的大小。

  不過這樣問題同樣存在,如果只有少數程式這到沒有什麼,一旦程式很多時,那麼空間問題同樣存在。如果會C語言的朋友都知道,其實每一個程式中有很大一部分函式是相同的,比如printf,這個函式在大部分程式中都會用到,如果每個程式都包含一段printf的程式碼,那麼如果有100個程式的話,就會包含100個這樣的程式碼,然而這些程式碼都是相同的,實際上有99個都是浪費了空間,那麼可不可以讓一些程式在靜態編譯的情況下也能夠共享一些函式呢?要知道答案,往下接著看。

  幸好,PICOBSD為我們提供了這樣的一個機制,使得程式即不用載入標準庫也可以利用其它程式中的相同函式,這就是crunch(crunch好像是世界頂級駭客高手John Draper的網名,不知道這與他有沒有關係。^_^)。

  crunch是將所有需要的軟體編譯在一個檔案中即crunch,然後當中的程式透過symbol link的方式link到它上面,這樣便可以使用相應的程式(類似於linux中的busybox),同時又節約了空間。PICOBSD為我們提供了一個自己定製crunch的機會,在FreeBSD4.5 Release(注:4.8 Release中的crunch無法定製,至少我沒有找到,所以建議大家使用4.5)中,crunch的配製檔案是/usr/src/release/picobsd/custom/crunch1/crunch.conf,編輯它以選擇你需要哪些軟體,下面以一個例子來說明它的用法。

  # $FreeBSD: src/release/picobsd/router/crunch.conf,v 1.1.2.2 2001/02/20 02:53:35 luigi Exp $

  #

  # NOTE: the string "/usr/src" will be automatically replaced with the

  # correct value set in 'build' script - you should change it there

# Default build options

  buildopts -DNOPAM -DRELEASE_CRUNCH -DNOSECURE -DNOCRYPT -DNONETGRAPH -DNOIPSEC

# other sources

  srcdirs /usr/src/bin

  srcdirs /usr/src/sbin/i386

  srcdirs /usr/src/sbin

  srcdirs /usr/src/usr.bin

  srcdirs /usr/src/usr.sbin

  srcdirs /usr/src/gnu/usr.bin

  srcdirs /usr/src/gnu/usr.sbin

  srcdirs /usr/src/libexec

  # sources for ns & vm

  srcdirs /usr/src/release/picobsd/tinyware

  # 以下為你所需要在crunch包含的程式列表,以空格分隔。

  progs dmesg ping ifconfig route hostname

  progs cp rm ls cat test mkdir less

  progs uname sysctl

  progs init sh reboot

  # ln是表示建立一個別名,如ln less more,表示當執行more的時候實際上是執行lessln less more

  # 以下是指定編譯時需要的庫

  libs -lncurses -lmytinfo -lipx

  libs -lz -lpcap -lalias

  libs -ledit -lutil -lmd -lcrypt -lmp -lgmp -lm -lkvm

  libs -lgnuregex -ltelnet

  當編輯好crunch.conf之後,你就可以開始編譯crunch了:

  bsd# make

  這時會生成一個名為crunch1的程式,我們要的就是它了。

  5、建立記憶體磁碟

  大家可以看到crunch1加上我們剛才編譯的核心和loader程式,已經超出了軟盤的容量,同時為了加速程式的執行我們需要使用MD(記憶體磁碟)來解決這個問題,MD將作為系統的根檔案系統和用來存放系統程式。對於記憶體磁碟的大小一般不易太大,因為這樣會佔用過多的記憶體,下面我們就以建立一個3M的記憶體磁碟為例說明如何建立記憶體磁碟:

  bsd# cd /root

  bsd# dd if=/dev/zero of=bsd bs=1k count=3072    # 生成一個3M的檔案,用來做MD

  bsd# vnconfig -c -s labels vn0c bsd  # 使用bsd來建立一個vn設定,以便在其中存放程式

  bsd# disklabel -w -r vn0c auto    # 建立disklabel

  bsd# disklabel -B vn0c        # 安裝啟動程式碼

  bsd# newfs vn0c # 建立UFS檔案系統

  bsd# mount /dev/vn0c /mnt # 將vn0c即bsd mount到/mnt

  下來要做的就是建立目錄結構,具體建立哪些目錄這要視需要決定,本例中需要建立如下目錄:

  bsd# mkdir /mnt/etc

  bsd# mkdir /mnt/sbin

  bsd# mkdir /mnt/bin

  bsd# mkdir /mnt/dev

  然後將crunch1複製到/mnt/sbin中,再將剛才編譯進crunch1中的那些命令分別做上symbol link:

  bsd# cp /usr/src/release/picobsd/custom/crunch1/crunch1 /mnt/sbin

  bsd# cd /mnt/sbin

  bsd# ln -s ./crunch1 init    # init必須在/mnt/sbin目錄中

  bsd# ln -s ./crunch1 reboot

  bsd# ln -s ./crunch1 sysctl

  bsd# ln -s ./crunch1 ifconfig

  bsd# ln -s ./crunch1 route

  bsd# ln -s ./crunch1 ping

  bsd# ln -s ./crunch1 dmesg

  bsd# cd /mnt/bin

  bsd# ln -s ../sbin/crunch1 sh    # sh必須在/mnt/bin目錄中

  bsd# ln -s ../sbin/crunch1 hostname

  bsd# ln -s ../sbin/crunch1 cp

  bsd# ln -s ../sbin/crunch1 rm

  bsd# ln -s ../sbin/crunch1 ls

  bsd# ln -s ../sbin/crunch1 cat

  bsd# ln -s ../sbin/crunch1 test

  bsd# ln -s ../sbin/crunch1 mkdir

  bsd# ln -s ../sbin/crunch1 less

  bsd# ln -s ../sbin/crunch1 uname

  bsd# ln -s ../sbin/crunch1 more

  6、編寫啟動指令碼

  因為我們的系統只是為了測試在軟盤上執行FreeBSD,因而這裡的啟動指令碼非常簡單只是讓系統可以工作,沒有做其它的工作,其內容如下:

  #!/bin/sh

  # Floppy BSD init script

PATH=/sbin:/bin

  HOME=/

  export PATH HOME

echo

  echo "Hello, it's my Floppy BSD"

  echo

  # 因為沒有使用登入驗證,所以這裡只是簡單的一直執行shell

    while : ; do

  /bin/sh

  done

  7、建立裝置檔案

  現在需要建立一些基本的裝置檔案,我們使用/dev/MAKEDEV來完成這些操作:

  bsd# cd /mnt/dev

  bsd# cp /dev/MAKEDEV .

  bsd#./MAKEDEV std # 建立標準裝置

  bsd# rm MAKEDEV

  8、最後工作

  到目前為止,我們的啟動部分,Kernel和記憶體磁碟都已經準備好了,下面就開始整合它們了。

  因為init啟動的時候會查詢login class中的daemon這個類別,如果沒有則會出現錯誤提示,為了使init不報錯,我們還需要複製/etc/login.conf到/mnt/etc中:

  bsd# cp /etc/login.conf /mnt/etc/login.conf

  因為loader支援直接載入gzip壓縮格式的檔案,這為我們節約磁空提供了方便,同時也解決了我們空間不夠的問題,現在壓縮kernel和記憶體磁碟bsd:

  bsd# cd /root

  bsd# cp /sys/compile/MINI/kernel .

  bsd# gzip -9 kernel    # 使用最大壓縮率,將生成檔案kernel.gz

  bsd# umount /mnt

  bsd# gzip -9 bsd      # 使用最大壓縮率,將生成檔案bsd.gz

  然後編輯loader的配製檔案:

  bsd# cd /fd/boot

  bsd# vi loader.rc

  輸入:

  load kernel

  load -t mfs_root bsd    # 表示將bsd.gz以md的方式載入,並且成為root device

  存檔退出,將kernel.gz和bsd.gz複製到軟盤中:

  bsd# cd /root

  bsd# cp kernel.gz /fd

  bsd# cp bsd.gz /fd

  bsd# umount /fd

  現在用你的這張軟盤就可以啟動你的機器,如果一切正常的話,你將看到"Hello, it's my Floppy BSD"的提示,並且看到可愛的shell符"#"了,是不是很有滿足感呢?:)

  到此為止一個基本的BSD系統已經完成了,如果你想繼續擴充套件Floppy BSD的功能,那就按照上面的方法自己做吧!

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-944364/,如需轉載,請註明出處,否則將追究法律責任。

相關文章