制作RAMDISK in KERNEL的NetBSD微系统ZT

发表于:2007-06-09来源:作者:点击数: 标签:
看精华里面光有作FreeBSD的,转来做NetBSD的吧: [quote:12a53ada13] 制作RAMDISKinKERNEL的NetBSD微系统 Matthew(黑夜编码人)matthew@cnfug.org 前言 在前面我们已经讲过如何制作软盘上运行的FreeBSD和OpenBSD系统,现在我们来看看如何制作一个运行在软盘上

看精华里面光有作FreeBSD的,转来做NetBSD的吧:
[quote:12a53ada13]
制作RAMDISK in KERNEL的NetBSD微系统 

Matthew(黑夜编码人) <matthew@cnfug.org> 

前言 

在前面我们已经讲过如何制作软盘上运行的FreeBSD和OpenBSD系统,现在我们来看看如何制作一个运行在软盘上的NetBSD系统。同软盘中的OpenBSD系统一样,我们还是将系统中的所有配制文件及程序全部存放到NetBSD的内核中,这样整个系统看起来就是一个文件。下面让我们具体来看看如何完成这样一个微系统的制作。 

0、NetBSD的启动过程 

当硬盘MBR中的引导程序接过启动之后,MBR中的程序将读入硬盘NetBSD分区中的引导程序,引导程序默认情况下会加载/boot,然后由boot载入内核.netbsd,此时内核开始检测一些硬件和做一些初始化。初始化完成后kernel将mount root device,然后启动系统初始化进程/sbin/init,init将根据/etc/rc中的设置来进行初始化等。 

1、定制RAMDISK内核 

要使用RAMDISK in KERNEL就必须在内核配制文件中加入以下选项: 


options MEMORY_DISK_HOOKS 
options MEMORY_DISK_IS_ROOT # force root on memory disk 
options MEMORY_DISK_SERVER=0 
options MEMORY_DISK_ROOT_SIZE=10000 # size of memory disk, in blocks 
options MEMORY_RBFLAGS=0x00 # boot in to multi-user mode 
pseudo-device md 1 # memory disk device (ramdisk) 


以上的内核参数意义如下: 

MEMORY_DISK_ROOT_SIZE : 内存磁盘大小,以块为单位 
MEMORY_RBFLAGS=0x00 : 启动到多用户模式 

以下是在我机器上使用的一个内核配制文件 


include "arch/i386/conf/std.i386" 

#options INCLUDE_CONFIG_FILE # embed config file in kernel binary 

makeoptions COPTS="-Os" # Optimise for space. Implies -O2 

# Enable the hooks used for initializing the root memory-disk. 
options MEMORY_DISK_HOOKS 
options MEMORY_DISK_IS_ROOT # force root on memory disk 
options MEMORY_DISK_SERVER=1 # 0 readonly 1 writable 
options MEMORY_DISK_ROOT_SIZE=10000 # size of memory disk, in blocks 
options MEMORY_RBFLAGS=0x00 # boot in to multi-user mode 

maxusers 48 # estimated number of users 

# CPU support. At least one is REQUIRED. 
options I386_CPU 
options I686_CPU 

# CPU-related options. 
options MATH_EMULATE # floating point emulation 

# This option allows you to force a serial console at the specified 
# I/O address. 
#options CONSDEVNAME="\"com\"",CONADDR=0x3f8,CONSPEED=9600 

# Avoid irq 5 and 7, the most likely cause of problems on modern laptops. 
options PCIC_ISA_INTR_ALLOC_MASK=0xff5f 

# Standard system options 

options INSECURE # disable kernel security levels 

options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT 
#options NTP # NTP phase/frequency locked loop 

options USERCONF # userconf(4) support 
options PIPE_SOCKETPAIR # smaller, but slower pipe(2) 
options MALLOC_NOINLINE # Not inlining MALLOC saves memory 

# File systems 
file-system FFS # UFS 
file-system MFS # memory file system 
file-system MSDOSFS # MS-DOS file system 
file-system KERNFS # /kern 

options VNODE_OP_NOINLINE # Not inlining vnode op calls saves mem 

# Networking options 
options GATEWAY # packet forwarding 
options INET # IP + ICMP + TCP + UDP 
#options PFIL_HOOKS # pfil(9) packet filter hooks 

# builtin terminal emulations 
options WSEMUL_VT100 # VT100 / VT220 emulation 
# different kernel output - see dev/wscons/wsdisplayvar.h 
options WS_KERNEL_FG=WSCOL_BLACK 
options WS_KERNEL_BG=WSCOL_WHITE 
# compatibility to other console drivers 
#options WSDISPLAY_COMPAT_PCVT # emulate some ioctls 
#options WSDISPLAY_COMPAT_SYSCONS # emulate some ioctls 
#options WSDISPLAY_COMPAT_USL # VT handling 
#options WSDISPLAY_COMPAT_RAWKBD # can get raw scancodes 
# see dev/pckbc/wskbdmap_mfii.c for implemented layouts 
#options PCKBD_LAYOUT="(KB_DE | KB_NODEAD)" 
# allocate a number of virtual screens at autoconfiguration time 
#options WSDISPLAY_DEFAULTSCREENS=4 
# use a large software cursor that doesn't blink 
options PCDISPLAY_SOFTCURSOR 
# modify the screen type of the console; defaults to "80x25" 
#options VGA_CONSOLE_SCREENTYPE="\"80x24\"" 

# Kernel root file system and dump configuration. 
config netbsd root on ? type ? 
#config netbsd root on sd0a type ffs 
#config netbsd root on ? type nfs 


# Device configuration 


mainbus0 at root 

cpu* at mainbus? 

apm0 at mainbus0 # Advanced power management 


# Basic Bus Support 

# PCI bus support 
pci* at mainbus? bus ? 
pci* at pchb? bus ? 
pci* at ppb? bus ? 

# PCI bridges 
pchb* at pci? dev ? function ? # PCI-Host bridges 
pceb* at pci? dev ? function ? # PCI-EISA bridges 
pcib* at pci? dev ? function ? # PCI-ISA bridges 
ppb* at pci? dev ? function ? # PCI-PCI bridges 
# XXX 'puc's aren't really bridges, but there's no better place for them here 
puc* at pci? dev ? function ? # PCI "universal" comm. cards 

# ISA bus support 
isa0 at mainbus? 
isa0 at pceb? 
isa0 at pcib? 

# ISA Plug-and-Play bus support 
isapnp0 at isa? 

# Coprocessor Support 

# Math Coprocessor support 
npx0 at isa? port 0xf0 irq 13 # x86 math coprocessor 


# Console Devices 

# ISA console 
#pc0 at isa? port 0x60 irq 1 # pclearcase/" target="_blank" >ccons generic PC console driver 

# wscons 
pckbc0 at isa? # pc keyboard controller 
pckbd* at pckbc? # PC keyboard 
#pms* at pckbc? # PS/2 mouse for wsmouse 
vga0 at isa? 
vga* at pci? dev ? function ? 
pcdisplay0 at isa? # CGA, MDA, EGA, HGA 
wsdisplay* at vga? console ? 
wsdisplay* at pcdisplay? console ? 
wskbd* at pckbd? console ? 
#wsmouse* at pms? mux 0 

pcppi0 at isa? 
sysbeep0 at pcppi? 

# Serial Devices 

# PCI serial interfaces 
com* at puc? port ? # 16x50s on "universal" comm boards 
#cy* at pci? dev ? function ? # Cyclades Cyclom-Y serial boards 

# ISA Plug-and-Play serial interfaces 
com* at isapnp? # Modems and serial boards 

# ISA serial interfaces 
#options COM_HAYESP # adds Hayes ESP serial board support 
com0 at isa? port 0x3f8 irq 4 # Standard PC serial ports 
com1 at isa? port 0x2f8 irq 3 
com2 at isa? port 0x3e8 irq 5 
#com3 at isa? port 0x2e8 irq 9 
#ast0 at isa? port 0x1a0 irq 5 # AST 4-port serial cards 
#com* at ast? slave ? 
#boca0 at isa? port 0x100 irq 5 # BOCA 8-port serial cards 
#com* at boca? slave ? 
#tcom0 at isa? port 0x100 irq 7 # TC-800 8-port serial cards 
#com* at tcom? slave ? 
#rtfps0 at isa? port 0x1230 irq 10 # RT 4-port serial cards 
#com* at rtfps? slave ? 
#cy0 at isa? iomem 0xd4000 irq 12 # Cyclades serial cards 

# Miscellaneous mass storage devices 

# Network Interfaces 

# PCI network interfaces 
fxp* at pci? dev ? function ? # Intel EtherExpress PRO 10+/100B 
le* at pci? dev ? function ? # PCnet-PCI Ethernet 
pcn* at pci? dev ? function ? # AMD PCnet-PCI Ethernet 
rtk* at pci? dev ? function ? # Realtek 8129/8139 

amhphy* at mii? phy ? # AMD 79c901 Ethernet PHYs 
urlphy* at mii? phy ? # Realtek RTL8150L internal PHYs 
ukphy* at mii? phy ? # generic unknown PHYs 

# Pseudo-Devices 

# disk/mass storage pseudo-devices 
pseudo-device md 1 # memory disk device (ramdisk) 
#pseudo-device vnd 4 # disk-like interface to files 

# network pseudo-devices 
pseudo-device bpfilter 8 # Berkeley packet filter 
pseudo-device ipfilter # IP filter (firewall) and NAT 
pseudo-device loop # network loopback 
pseudo-device ppp 2 # Point-to-Point Protocol 
pseudo-device pppoe 3 

# miscellaneous pseudo-devices 
pseudo-device pty 2 # pseudo-terminals (Sysinst needs two) 
# wscons pseudo-devices 
pseudo-device wsmux # mouse & keyboard multiplexor 
#pseudo-device wsfont 



2、制作ramdisk镜像 


# dd if=/dev/zero of=/ramdisk bs=512 count=9000 
# vnconfig -c /dev/vnd0d /ramdisk 
# disklabel -r -w /dev/vnd0d rdroot 
# newfs -m 0 -S 512 -i 4096 /dev/vnd0a 
# mount /dev/vnd0a /mnt 
# mkdir /mnt/{dev,bin,sbin,etc} 
# cp /dev/MAKEDEV /mnt/dev 
# cp /bin/{sh,ls} /mnt/bin 
# cp /sbin/init /mnt/sbin 
# cd /mnt/dev/ && ./MAKEDEV ramdisk 
# echo 'echo "This is my minibsd all in kernel" && /bin/sh' > /mnt/etc/rc 
# sync && umount /mnt 
# sync && vnconfig -u vnd0d && sync 


3、将ramdisk写入kernel 


# mdsetroot /minibsd ramdisk 


4、压缩kernel大小 


# gzip -9 -c /minibsd > /minibsd.gz 

5、制作目标软盘 

因为系统需要使用/boot(/usr/mdec/boot)来加载kernel,所以我们需要在软盘上放置boot文件。 


# disklabel -B -w -r /dev/fd0a fd1440 
# newfs -m 0 -S 512 /dev/fd0a 
# mount /dev/fd0a /mnt 
# cp /usr/mdec/boot /mnt 
# cp /minibsd.gz /mnt/netbsd 


现在你的ramdisk in kernel的mininetbsd系统就已经做好了。 

注:任何转载或摘抄请保留作者信息和注明文章出处(中文FreeBSD用户组 http://www.cnfug.org) 

[/quote:12a53ada13]

原文转自:http://www.ltesting.net