免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6241 | 回复: 12
打印 上一主题 下一主题

[NetBSD] 制作RAMDISK in KERNEL的NetBSD微系统ZT [复制链接]

论坛徽章:
2
丑牛
日期:2013-09-29 09:47:222015七夕节徽章
日期:2015-08-21 11:06:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-31 15:36 |只看该作者 |倒序浏览
看精华里面光有作FreeBSD的,转来做NetBSD的吧:
制作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 # pccons 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)

论坛徽章:
0
2 [报告]
发表于 2006-11-12 20:11 |只看该作者
3、将ramdisk写入kernel
# mdsetroot /minibsd ramdisk

没有这个命令。。。怎么生成minibsd哦?进行不下去了。。。

[ 本帖最后由 肥肠 于 2006-11-12 20:12 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-11-12 20:39 |只看该作者
 

一看到标题就想起 cnfug.org 了

CN F U G
FreeBSD 中文用户组,哈哈

原帖由 肥肠 于 2006-11-12 20:11 发表
3、将ramdisk写入kernel
# mdsetroot /minibsd ramdisk

没有这个命令。。。怎么生成minibsd哦?进行不下去了。。。


检查 rdsetroot 命令,呵呵
还有 elfrdsetroot

[ 本帖最后由 langue 于 2006-11-12 20:49 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-11-12 20:43 |只看该作者
那边好象不能用,只好在这边问了。。。

论坛徽章:
0
5 [报告]
发表于 2006-11-12 20:53 |只看该作者
原帖由 肥肠 于 2006-11-12 20:43 发表
那边好象不能用,只好在这边问了。。。


我已经回答了。这个是在 src.tgz 里的呀。

要是实在没有,直接编译一个:
http://mirror.sg.depaul.edu/pub/OpenBSD/src/distrib/common/

论坛徽章:
0
6 [报告]
发表于 2006-11-12 20:59 |只看该作者
我本来猜可能是源码里的,翻来翻去都没找到,原来是OpenBSD里,我晕

论坛徽章:
0
7 [报告]
发表于 2006-11-12 21:04 |只看该作者
原帖由 肥肠 于 2006-11-12 20:59 发表
我本来猜可能是源码里的,翻来翻去都没找到,原来是OpenBSD里,我晕


谁都知道 NetBSD 和 OpenBSD 的结合是多么完美
  言下之义:我用 OpenBSD,rdsetroot 呵呵
对于 matthew 的这篇文章,我想有必要进行适当的加工,以适合更多的人

[ 本帖最后由 langue 于 2006-11-12 21:07 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2006-11-12 21:17 |只看该作者
应该要修改一下,后面做软盘时,netbsd里disklabel和newfs命令跟本文有点不同
elfrdsetroot.c编译不通过。。。rdsetroot.c编译通过却好象不适用。。。

[ 本帖最后由 肥肠 于 2006-11-12 21:18 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2006-11-12 21:30 |只看该作者
在NETBSD下的命令应该是mdsetimage。不太清楚其变革历史。
当初我看这篇文章的时候,也是找不到这个命令。只好停止。

论坛徽章:
0
10 [报告]
发表于 2006-11-12 21:32 |只看该作者
我看看用openbsd能编译么,等绝望了再决定停不停,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP