分享
 
 
 

制作软盘上运行的FreeBSD系统

王朝system·作者佚名  2008-05-21
窄屏简体版  字體: |||超大  

“简单的东西不容易出问题。”

至理名言!事实上,削减操作系统中那些对你没用的功能是一件非常重要的事情。这不仅仅意味着一个更小的操作系统,占用更少的磁盘空间(现在的硬盘少说也有几十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

# 体系模型为i386cpu I386_CPU

# 支持80386cpu I486_CPU

# 支持80486cpu I586_CPU

# 支持Pentiumcpu 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 Filesystemoptions 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编辑器 editoroptions 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_SCHEDULINGoptions ICMP_BANDLIM

#对恶意ICMP请求进行限制options KBD_INSTALL_CDEV # 在/dev安装一个CDEV设备# 下面两项在制作对称多处理器(SMP)内核时需要#options SMP

#对称多处理器内核#options APIC_IO

#对称(APIC) I/Odevice isadevice eisadevice pci# 软驱device fdc0 at isa? port IO_FD1 irq 6 drq 2device fd0 at fdc0 drive 0device 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 14device ata1 at isa? port IO_WD2 irq 15device atadevice atadisk # ATA 磁盘驱动器(IDE硬盘)device atapicd # ATAPI 光驱device atapifd # ATAPI 软驱device atapist # ATAPI 磁带机options ATA_STATIC_ID #静态设备编号# SCSI控制器device ahb # EISA AHA1742 familydevice ahc # AHA2940 板载AIC7xxx设备device amd # AMD 53C974 (Tekram DC-390(T))device isp # Qlogic familydevice ncr # NCR/Symbios Logicdevice sym # NCR/Symbios Logic (较新的芯片组)options SYM_SETUP_LP_PROBE_MAP=0x40# 使用ncr可以在配置了sym和ncr的情况下挂接旧的NCR设备device adv0 at isa?device adwdevice bt0 at isa?device aha0 at isa?device aic0 at isa?device ncv # NCR 53C500device nsp # Workbit Ninja SCSI-3device stg # TMC 18C30/18C50# SCSI 外设device scbus # SCSI 总线(如果使用SCSI设备,必须有)device da # Direct Access (硬盘)device sa # Sequential Access (磁带,等等)device cd # CDdevice pass # Passthrough device (直接 SCSI 访问)# 通过SCSI子系统接口的RAID控制器device asr # DPT SmartRAID V, VI and Adaptec SCSI RAIDdevice dpt # DPT Smartcache - See LINT for options!device iir # Intel Integrated RAIDdevice mly # Mylex AcceleRAID/eXtremeRAIDdevice ciss # Compaq SmartRAID 5* series# RAID控制器device aac # Adaptec FSA RAID, Dell PERC2/PERC3device aacp # SCSI passthrough for aac (requires CAM)device ida # Compaq Smart RAIDdevice amr # AMI MegaRAIDdevice mlx # Mylex DAC960 familydevice twe # 3ware Escalade# atkbdc0 控制键盘和PS/2鼠标device atkbdc0 at isa? port IO_KBDdevice atkbd0 at atkbdc? irq 1 flags 0x1device psm0 at atkbdc? irq 12device 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 carddevice pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable# 串口(COM)device sio0 at isa? port IO_COM1 flags 0x10 irq 4device sio1 at isa? port IO_COM2 irq 3device sio2 at isa? disable port IO_COM3 irq 5device sio3 at isa? disable port IO_COM4 irq 9# 并口device ppc0 at isa? irq 7device ppbus # 并口总线 (所有并口设备都需要)device lpt

# 打印机device plip

# 并口TCP/IPdevice 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 workalikesdevice fxp # Intel EtherExpress PRO/100B (82557, 82558)device pcn # AMD Am79C97x PCI 10/100 NICsdevice rl # RealTek 8129/8139device sf # Adaptec AIC-6915 (``Starfire'')device sis # Silicon Integrated Systems SiS 900/SiS 7016device ste # Sundance ST201 (D-Link DFE-550TX)device tl # Texas Instruments ThunderLANdevice tx # SMC EtherPower II (83c170 ``EPIC'')device vr # VIA Rhine, Rhine IIdevice wb # Winbond W89C840Fdevice 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 0xd8000device exdevice epdevice fe0 at isa? port 0x300# Xircom Ethernetdevice 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 0xd0000device lnc0 at isa? port 0x280 irq 10 drq 0device cs0 at isa? port 0x300device sn0 at isa? port 0x300 irq 10# 伪设备 - 数字表示分配多少个pseudo-device loop

# 环回网络pseudo-device ether # 以太网支持pseudo-device sl 1

# 核心级SLIPpseudo-device ppp 1 # 核心级PPPpseudo-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 interfacedevice ohci # OHCI PCI->USB interfacedevice usb # USB Bus (required)device ugen # Genericdevice uhid # "Human Interface Devices"device ukbd # Keyboarddevice ulpt # Printerdevice umass # Disks/Mass storage - Requires scbus and dadevice ums # Mousedevice uscanner # Scannersdevice urio # Diamond Rio MP3 Player# USB 以太网,需要miidevice aue # ADMtek USB ethernetdevice cue # CATC USB ethernetdevice 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 swapdevice

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 0x1device

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 scriptPATH=/sbin:/bin

HOME=/

export PATH HOMEecho

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的功能,那就按照上面的方法自己做吧

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有