在USB盘和内存里运行OpenBSD

OpenBSD的安装、升级、更新等日常问题。

版主: chenjun天地乾坤

回复
头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

在USB盘和内存里运行OpenBSD

帖子 leo » 2010-10-21 0:28

让OpenBSD运行在USB盘和内存里
来龙去脉:
wkx9dragon 写了:
leo 写了:瞧这意思,你想把OpenBSD生生折腾成无盘工作站。:)
我以前在网上还真看过这方面的讨论,不过一时想不起来在哪里了。

对呀!我就是想把OS整个放到内存里,反正内存也够,netbsd,openbsd也不大。现在没找到方法。

wkx9dragon总有一些好点子,我们在这里先称赞一下,以下是我从网上找到的文章,经测试(个别的地方还要修改,否则无法正常运行,例如 / 分区的属性,还有就是 /proto/dev 目录的大小等)可以运行。首先 / 分区不能动,因为系统启动要用,此外,我试着将X整合进内存,不太容易,因为X在 /usr 目录下,我还没有想到办法将 /usr 放进内存分区。另外一个不通用的地方是,原作者的思路是假设你用的是IDE的硬盘,也就是说你的usb盘,系统识别为sd0, 这样制作的usb上运行的OpenBSD系统只能运行在类似的环境中,例如在我的系统上,因为OpenBSD将一块大硬盘识别为5块scsi硬盘,(sd0,sd1,sd2,sd3,sd4),所以制作的系统为sd5, 这样拿到别的计算机上是无法应用的,要是能有一个方法制作为类似ram内核bsd.rd、或者live usb的就比较好一些了,继续google一下,也请有类似经验的朋友放开讨论。

原文摘自:
http://www.volkerroth.com/tecn-obsd-diskless.html
Running OpenBSD off a USB Stick

Introduction

This document describes how OpenBSD (obsd) can be installed and run off a USB stick without the need for a hard drive. Write operations to the USB stick are avoided.
We assume that the USB stick has a capacity of 512MB or more. In this case, the base installation fits well onto the stick and no pruning is required.
Installing

The easiest way to install obsd is to boot the OpenBSD installation CD on any computer with the USB stick plugged in. The installation script will show the available drives and the stick will be shown as sd0. By choosing this drive, the installation can be performed as any regular obsd installation. However, we must be careful not to touch the actual drive of the computer, which will show up as wd0.
The following partition layout should work fairly well:
PartitionMountMB512K a/4898304 d/var1632768 e/var/log1632768 f/tmp1632768 g/home1632768 h/usr** On a 512MB stick this should leave enough room in /usr for a basic (non-X) installation. With all non-X sets and the xbase40 set installed the /usr partition will be about 388 MB large. We do not want to swap to the drive and therefore we do not configure a swap partition either.
Mounting file systems

All file systems that reside on the stick shall be mounted read-only. All file systems that must be writable while obsd is running are copied to and mounted as memory file systems. The following file systems must be writable:

代码: 全选

/dev  /tmp  /var  /var/log
If a computer running obsd is available then these steps can be performed on the mounted drive. Otherwise, the computer should be booted from the drive.
First, we create a prototypical /dev directory, which we are going to populate with device nodes:

代码: 全选

/proto/dev
Next, copy the MAKEDEV script from /dev to /proto/dev and run it to create all device nodes. This is accomplished by:

代码: 全选

cd /proto/dev ; ./MAKEDEV all
The creation process takes a while. Next, we must adjust the fstab file using vi. This includes the following steps:
  • The noatime option is appended to all entries.
  • Access for all entries is limited to read-only.
  • Entries for writable file systems are commented out.
  • Entries for memory-mounted writable file systems are added.
The -P option of the mount_mfs command populates the mounted filesystem. This can be done from a directory or from a block device. In our case, we created separate partitions for /tmp, /var and /var/log, which leads to a clean and simple setup for their corresponding memory file systems.


The inode value for the population of the /dev memory file system should be small e.g., 128 since the device nodes are small and therefore many inodes are required. The number of sectors required can be estimated by running:

代码: 全选

ls /proto/dev | wc -l
and rounding this number up with a good safety margin added. My rationale is as follows: each device entry will occupy one sector. Additional blocks are needed for inodes.
The final fstab may look as given below:

代码: 全选

# cat /etc/fstab
/dev/sd0a / ffs ro,noatime 1 1
/dev/sd0g /home ffs ro,nodev,nosuid,noatime 1 2
/dev/sd0h /usr ffs ro,nodev,noatime 1 2
# /dev/sd0d /var ffs ro,nodev,nosuid,noatime 1 2
# /dev/sd0e /tmp ffs ro,nodev,nosuid,noatime 1 2
# /dev/sd0f /var/log ffs ro,nodev,nosuid,noatime 1 2
swap /var mfs rw,nosuid,noexec,nodev,-P=/dev/sd0d 0 0
swap /tmp mfs rw,nosuid,noexec,nodev,-P=/dev/sd0e 0 0
swap /var/log mfs rw,nosuid,noexec,nodev,-P=/dev/sd0f 0 0
swap /dev mfs rw,nosuid,noexec,-P=/proto/dev,-i=128,-s=2048 0 0
We simply commented out the partitions we wish to move to a memory file system. For each such partition, we added a memory file system entry that populates the file system from the corresponding partition. The only exception is /dev, which we populate from a directory in the root file system of the drive.
Notes

The /var file system is very small and will therefore fill up quickly as obsd sends reports to the root account by e-mail. However, since /var is a separate partition, no harm is done except that the operation fails and an occasional error message appears in the logs.

按照原作者的思路和方法(还要略作修改),经测试可以在U盘及内存上运行OpenBSD,但是我总觉得还是不完美(例如 /usr 和 X 的处理),希望大家集思广益。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

帖子 wkx9dragon » 2010-10-21 11:10

根目录是可以改的,不过没试过,晚上试试。参考(chroot) http://baike.baidu.com/view/2977396.htm ,/usr我还没想到方法。没有电脑给我折腾呀,郁闷。。。。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

帖子 wkx9dragon » 2010-10-22 20:56

找到方法了,懒的试试,没全看懂,没有家里的台机折腾呀,上班就懒了。这是网址,版主有空翻译一下,挺好的哦。
http://www.kernel-panic.it/openbsd/embe ... dded3.html

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

帖子 leo » 2010-10-22 21:06

wkx9dragon 写了:找到方法了,懒的试试,没全看懂,没有家里的台机折腾呀,上班就懒了。这是网址,版主有空翻译一下,挺好的哦。
http://www.kernel-panic.it/openbsd/embe ... dded3.html

原来还曾想想照着这个网站的内容建立一个OpenBSD下的nameserver, 但却一直没有时间,看来是躲不过去了,不过我还是将无盘这篇试翻一下,如果有错误的地方也请大家指正吧。

此外一楼的方法并不对硬盘产生任何操作,但是如果你机器上有重要的数据,还是不要试了,毕竟不是自己的东西,一旦误操作可能会有麻烦。

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

OpenBSD无盘安装

帖子 leo » 2010-10-22 21:22

翻译leo
原文出处:http://www.kernel-panic.it/openbsd/embe ... dded3.html
3. 无盘安装
用数量不太多的内存来创建一个嵌入式系统提供了几个优势:
  • 无需再使用compact flash cards(一般简称为CF卡) 或者 2.5" 磁盘, 从而节省了一部分资金;
  • 通过使用NFS, 你可以将可能拥有大容量磁盘;
  • 你可以集中管理磁盘;
  • 你可以在多台主机间共享文件系统 (通常是 /usr, 这个目录一般没有变化) , 因此使维护和升级更加简单和快捷;
但是也存在一些缺陷:
  • 必须增加一台新的服务器, 这台服务器提供了所有启动设备所需的服务;
  • 在关键的安全系统, 比如,在防火墙上应用NFS一般是一个不明智的选择;
  • boot server的配置可能并不容易。
那么我们现在来配置一下! 我们先建立一台boot server, 接下来将通过这台服务器完成多个安装步骤; 我们唯一需要知道的是嵌入式设备的MAC地址。要获取这个地址, 你只需连接到控制台并开启其这个设备:

代码: 全选

# cu -s 19200 -l cua00
 
comBIOS ver. 1.26a  20040819  Copyright (C) 2000-2004 Soekris Engineering.
 
net45xx
 
0064 Mbyte Memory                        CPU 80486 133 Mhz 
 
 
Slot   Vend Dev  ClassRev Cmd  Stat CL LT HT  Base1    Base2   Int 
-------------------------------------------------------------------
0:00:0 1022 3000 06000000 0006 2280 00 00 00 00000000 00000000 
0:17:0 104C AC51 06070000 0107 0210 10 3F 82 A0000000 020000A0 10
0:17:1 104C AC51 06070000 0107 0210 10 3F 82 A0001000 020000A0 10
0:18:0 100B 0020 02000000 0107 0290 00 3F 00 0000E101 A0002000 11
0:19:0 100B 0020 02000000 0107 0290 00 3F 00 0000E201 A0003000 05
 
 1 Seconds to automatic boot.   Press Ctrl-P for entering Monitor.
 
NSC DP83815/DP83816 Fast Ethernet UNDI, v1.03                                  
Copyright (C) 2002, 2003 National Semiconductor Corporation
All rights reserved.
 
Pre-boot eXecution Environment  PXE-2.0 (build 082)
Copyright (C) 1997-2000  Intel Corporation
 
 
CLIENT MAC ADDR: 00 00 24 C3 C1 B0  
[...]
现在我们来看一下如何让编译一个无盘内核, 接下来是了解系统的启动过程,这样我们就可以知道在boot server上对哪些网络设备进行配置。

3.1 构建一个定制内核
所有内容我们已经在 前面 有关内核配置和编译的章节里应用讨论过了; 你只需确认一下在配置文件里设置定系统必须到NFS服务器上寻找root和swap文件系统:
/usr/src/sys/arch/i386/conf/NET4521

代码: 全选

 
[...]config bsd root on nfs swap on nfs[...]

3.2 rarpd(8)
启动时, 这台设备首先尝试配置其网络设置。因为它只知道自己的MAC地址, 所以它发起一个RARP请求以获取一个IP地址。因此, 我们在boot server的 /etc/rc.conf.local(8) 文件里必须启用 rarpd(8) 守护进程:
/etc/rc.conf.local

代码: 全选

rarpd_flags="-a"



如果你不希望这个守护进程监听所有的接口, 只需用想监听的具体的接口名称替换这里的 "-a" 参数。 要回应RARP请求, 这个守护进程使用两个文件:
  • /etc/ethers(5) 用来将以太网地址映射到主机名:

    代码: 全选

     00:00:24:c3:c1:b0 net4521.kernel-panic.it
  • /etc/hosts(5), 用来映射IP地址到主机名:

    代码: 全选

    172.16.0.10 net4521.kernel-panic.it
如果两个文件内都没有列出这台请求的主机, 这个守护进程则无法发送回应。
3.3 dhcpd(8)
现在嵌入式设备已经获得了自己的IP地址, 它接下来将寻找启动文件。要获得这个文件的名称, 它将向我们的服务器会发送一条 DHCP 请求, 服务器会马上回应。因为, 我们需要在boot server的 /etc/rc.conf.local(8) 文件中启用守护进程 dhcpd(8) :
/etc/rc.conf.local

代码: 全选

dhcpd_flags=""
并对其进行配置:
/etc/dhcpd.conf

代码: 全选

[...][I]# Diskless devices group[/I]group {    filename "pxeboot";        [I]# Boot file[/I]    [I]#next-server  pxe-server;    # PXE server (if different from the DHCP server)[/I]    host net4521 { hardware ethernet 00:00:c8:c1:24:57; }}[...]
3.4 tftpd(8)
好, 到目前为止无盘设备已经知道了启动文件的名字, 它会尝试通过 tftp(1) 从 "next-server"参数指定的服务器下载这个启动文件、或者直接从DHCP服务器下载。要在boot server上启用 tftpd(8) , 我们需要删除 /etc/inetd.conf(8) 文件中下列行前面的注释符:
/etc/inetd.conf

代码: 全选

tftp        dgram    udp    wait    root    /usr/libexec/tftpd    tftpd -s /tftpboot
建立一个目录 /tftpboot, 然后拷入适当的文件: pxeboot(8) (第二阶段PXE启动引导程序), bsd (那个定制内核) 以及 /tftpboot/etc/boot.conf(8), 这个文件里包含了启动参数:
/tftpboot/etc/boot.conf

代码: 全选

set tty com0stty com0 19200

3.5 bootparamd(8)
现在系统将启动, 直至其需要挂载NFS文件系统。要找出它们, 它将广播一个BOOTPARAMS请求, 然后等待某个 rpc.bootparamd(8) 守护进程告诉它有关NFS文件系统的挂载参数。所以,我么需要在服务器上启动bootparamd(8) 守护进程。 再强调一下,我们必须在/etc/rc.conf.local(8)里编辑一些变量:
/etc/rc.conf.local

代码: 全选

bootparamd_flags=""
portmap="YES"
如你所见, 要使 bootparamd(8) 可以正常工作, 我们还需要启动 portmap(8) 守护进程, 它可以将RPC程序的数字转换为 DARPA 协议的端口号。 bootparamd(8) 有自己的配置文件, /etc/bootparams(5), 这个文件必须包含为每个客户端建立的特定项, 这个特定项指定了该客户端的 root 和 (可选的) swap 分区 (文字块用空格或tab分开, 选项可以使用多行表达,中断处用一个反斜杠表示):
/etc/bootparams

代码: 全选

net4521    root=boot-srv:/exports/net4521/root/ \
    swap=boot-srv:/exports/net4521/swap
3.6 nfs
完成启动过程的最后一个步骤是挂载NFS文件系统。因此, 我们必须建立一个NFS服务器; 编辑/etc/rc.conf.local(8) 文件来设置一些参数:
/etc/rc.conf.local

代码: 全选

nfs_server="YES"
nfsd_flags="-tun 4"
然后设置要挂载的文件系统:
  • /exports/net4521/root, 这个目录将包含嵌入式设备的所有文件系统 (除了 /usr: 事实上, 如果文件系统间具有相同的结构层次, 服务器可以通过输出自己的 /usr 目录来节省大量的磁盘空间); 在 前面 我们已经描述了怎样填充这个文件系统;
  • /exports/net4521/swap, 这个文件将包含系统的交换区域(swap); 你可以运行下面的命令来创建它:

    代码: 全选

    # dd if=/dev/zero of=/exports/net4521/swap  bs=1m count=128
    这条命令创建一个 128MB 的交换文件。
在NFS服务器上, 文件 /etc/exports(5) 列出了为每台无盘设备输出的文件系统和主机的一些设定组件:
/etc/exports

代码: 全选

/usr -ro 172.16.0.10
/export/net4521 -maproot=root -alldirs 172.16.0.10
客户端的文件系统分区表, /etc/fstab(5) (这个文件, 确切地说是服务器上的 /exports/net4521/root/etc/fstab), 看起来像这样:
/etc/fstab

代码: 全选

boot-srv:/exports/net4521/root	/	nfs	rw	0 0
boot-srv:/usr			/usr	nfs	rw	0 0
Now we only have to power up the device and, if some champagne remained from the previous chapter, now is time to go get it and finish it.

头像
leo
帖子: 2465
注册时间: 2010-01-21 3:27

帖子 leo » 2010-10-25 3:43

感觉个人实际应用中的意义不大,还需要设置NFS服务器,此外设置起来还是很麻烦,这个只是通过NFS服务器在客户端安装运行位于服务器上的文件系统,虽然是无盘工作站,但并非真正地完全将文件系统挂载到内存中运行,因为重新启动后内存中的数据直接无法访问,所以系统内核(以及 /usr 目录)还是必须放置在一个有效的介质上。—— 不知道我的理解有没有偏差。

wkx9dragon
锌 Zn
帖子: 493
注册时间: 2010-02-02 18:00

帖子 wkx9dragon » 2010-10-25 6:56

我看也像,看来还得想办法。

回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客