免费注册 查看新帖 |

Chinaunix

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

[OpenBSD] OpenBSD LiveCD制作过程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-03-26 09:44 |只看该作者 |正序浏览
2005-3-31更新

OpenBSD LiveCD制作过程
    刚开始接触OpenBSD时,我就很想使用OpenBSD LiveCD,但没找到。今年1月那时起就想自己做一个LiveCD,一个新年一过, 就将它放下了,现在又重新开始制作,今天写这篇文章只是我思路的一个开始,制作的LiveCD,还不完善,我会后续为其改进。

    制作过程:
一、        准备工作:
1、        一个能运行OpenBSD系统的所需要的必备文件,这里我就没像一些mini LiveCD那样对系统进行剔牛肉进行精减了,只是将一个能运行的系统的所有文件进行备份。而且如果备份的文件不大, 那制作出的LiveCD就很小, 我们就可以将这个备份的系统文件也一起放进CD中, 到时就可以用这个LiveCD安装系统,方法就是我今年1月3日写的《OpenBSD  另类安装法》。
2、        OpenBSD系统的源程序,我们在制作过程中需要编译光盘镜像。

二、        将备份的系统文件解开到一个目录下,我将以这个目录作为LiveCD的根目录制作CD,如/usr/live/。
三、        将OpenBSD源程序解开到/usr/src下,然后:
1、        安装必须的程序:
# cd /usr/src/distrib/crunch/crunchgen
#make; make install
#cd /usr/src/distrib/crunch/crunchide
#make; make install

2、        定制内核
内核文件是/usr/src/sys/arch/i386/conf/RAMDISK_CD,我们需要对这个文件进行修改,其中有三行最重要,一定不能少:
option  MFS
option  UNION
config  bsd root on cd0a
LiveCD运行于MFS上,而且它的根目录在CD上。

还有其它一些选项如:
option SMALL_KERNEL
option NO_PROPLICE
option TIMEZONE=0
option DST=0
option RAMDISK_HOOKS
option MINIROOTSIZE=3560

需要将一些多余的东西删除,因此这个内核大小控制在2.88M以内, 太大时会编译失败。我的RAMDISK_CD是将/usr/src/sys/arch/i386/conf/GENERIC 和/usr/src/sys/conf/GENERIC这两个文章合并然后去掉一些内容整理出来的。

3、        编译内核
# cd /usr/src/distrib/i386/ramdisk_cd
#make
成功后会在目录下生成cdrom36.fs这个文件,我们将这个文件复制到制作LiveCD的目录下/usr/live/。

四、        修改/usr/live/etc中的各类文件
1、fstab

  1. /dev/cd0a / cd9660 ro,noatime 0 0
  2. swap        /dev        mfs        rw,noatime,union,-s=16384        0 0
  3. swap        /tmp        mfs        rw,nodev,noexec,nosuid,noatime,-s=32768        0 0
  4. swap        /etc        mfs        rw,noatime,-s=16384        0 0
  5. swap        /var        mfs        rw,noatime,-s=16384        0 0
  6. swap        /home mfs        rw,noatime,-s=16384        0 0
复制代码

以前我没发现fstab的功能居然如此强大, 以为它只能mount已分好的挂载点, 原来它在光盘系统中还可以在启动时自动挂载写入fstab中的mfs.

2、rc
   OpenBSD启动时首先读取这个文件, 如果找不到它就会读取根目录下的/.profile文件进行初始配置。
   修改/etc/rc文件, 三个地方修改
  1.    
  2. #        $OpenBSD: rc,v 1.251 2004/08/21 08:17:28 hshoexer Exp $

  3. # System startup script run by init on autoboot
  4. # or after single-user.
  5. # Output and error are redirected to console by init,
  6. # and the console is the controlling terminal.

  7. # Subroutines (have to come first).

  8. # Strip comments (and leading/trailing whitespace if IFS is set)
  9. # from a file and spew to stdout

  10. stripcom() {
  11.         local _file="$1"
  12.         local _line

  13.         {
  14.                 while read _line ; do
  15.                         _line=${_line%%#*}                # strip comments
  16.                         test -z "$_line" && continue
  17.                         echo $_line
  18.                 done
  19.         } < $_file
  20. }

  21. # End subroutines

  22. stty status '^T'

  23. # Set shell to ignore SIGINT (2), but not children;
  24. # shell catches SIGQUIT (3) and returns to single user after fsck.
  25. trap : 2
  26. trap : 3        # shouldn't be needed

  27. HOME=/; export HOME
  28. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  29. export PATH

  30. if [ $1x = shutdownx ]; then
  31.         dd if=/dev/urandom of=/var/db/host.random bs=1024 count=64 >;/dev/null 2>;&1
  32.         chmod 600 /var/db/host.random >;/dev/null 2>;&1
  33.         if [ $? -eq 0 -a -f /etc/rc.shutdown ]; then
  34.                 echo /etc/rc.shutdown in progress...
  35.                 . /etc/rc.shutdown
  36.                 echo /etc/rc.shutdown complete.

  37.                 # bring carp interfaces down gracefully
  38.                 for hn in /etc/hostname.carp[0-9]*; do
  39.                         # Strip off /etc/hostname. prefix
  40.                         if=${hn#/etc/hostname.}
  41.                         test "$if" = "carp[0-9]*" && continue

  42.                         ifconfig $if >; /dev/null 2>;&1
  43.                         if [ "$?" != "0" ]; then
  44.                                 ifconfig $if down
  45.                         fi
  46.                 done

  47.                 if [ "X${powerdown}" = X"YES" ]; then
  48.                         exit 2
  49.                 fi

  50.         else
  51.                 echo single user: not running /etc/rc.shutdown
  52.         fi
  53.         exit 0
  54. fi

  55. # Configure ccd devices.
  56. if [ -f /etc/ccd.conf ]; then
  57.         ccdconfig -C
  58. fi

  59. # Configure raid devices.
  60. for dev in 0 1 2 3; do
  61.         if [ -f /etc/raid$dev.conf ]; then
  62.                 raidctl -c /etc/raid$dev.conf raid$dev
  63.         fi
  64. done

  65. # Check parity on raid devices.
  66. raidctl -P all

  67. swapctl -A -t blk

  68. if [ -e /fastboot ]; then
  69.         echo "Fast boot: skipping disk checks."
  70. elif [ $1x = autobootx ]; then
  71.         echo "Automatic boot in progress: starting file system checks."
  72. #        fsck –p      这一行要注释掉
  73.         case $? in
  74.         0)
  75.                 ;;
  76.         2)
  77.                 exit 1
  78.                 ;;
  79.         4)
  80.                 echo "Rebooting..."
  81.                 reboot
  82.                 echo "Reboot failed; help!"
  83.                 exit 1
  84.                 ;;
  85.         8)
  86.                 echo "Automatic file system check failed; help!"
  87.                 exit 1
  88.                 ;;
  89.         12)
  90.                 echo "Boot interrupted."
  91.                 exit 1
  92.                 ;;
  93.         130)
  94.                 # interrupt before catcher installed
  95.                 exit 1
  96.                 ;;
  97.         *)
  98.                 echo "Unknown error; help!"
  99.                 exit 1
  100.                 ;;
  101.         esac
  102. fi

  103. trap "echo 'Boot interrupted.'; exit 1" 3

  104. umount -a >;/dev/null 2>;&1
  105. mount -a -t nonfs
  106. mount -uw /                # root on nfs requires this, others aren't hurt
  107. rm -f /fastboot                # XXX (root now writeable)

  108. 这里需要在/dev下建立三个设备点, 不然后一步tar出错, 系统启动时会问题多多
  109. mknod /dev/stdout c 22 1
  110. mknod /dev/stdin c 22 0
  111. mknod /dev/stderr c 22 2

  112. if [ -f /mfs/mfs.tgz ]; then
  113.         tar zxpf /mfs/mfs.tgz -C /
  114.         echo 'Fixed up mfs from /mfs/mfs.tgz'
  115. fi
  116. chmod 755 /dev /etc /var
  117. chmod a+rwx,a+t /tmp

  118. # set flags on ttys.  (do early, in case they use tty for SLIP in netstart)
  119. echo 'setting tty flags'
  120. ttyflags -a

  121. if [ "X${pf}" != X"NO" ]; then
  122.         RULES="block all"
  123.         RULES="$RULES\npass on lo0"
  124.         RULES="$RULES\npass in proto tcp from any to any port 22 keep state"
  125.         RULES="$RULES\npass out proto { tcp, udp } from any to any port 53 keep state"
  126.         RULES="$RULES\npass out inet proto icmp all icmp-type echoreq keep state"
  127.         RULES="$RULES\npass out inet6 proto icmp6 all icmp6-type routersol"
  128.         RULES="$RULES\npass in inet6 proto icmp6 all icmp6-type routeradv"
  129.         RULES="$RULES\npass proto { pfsync, carp }"
  130.         case `sysctl vfs.mounts.nfs 2>;/dev/null` in
  131.         *[1-9]*)
  132.                 # don't kill NFS
  133.                 RULES="scrub in all no-df\n$RULES"
  134.                 RULES="$RULES\npass in proto udp from any port { 111, 2049 } to any"
  135.                 RULES="$RULES\npass out proto udp from any to any port { 111, 2049 }"
  136.                 ;;
  137.         esac
  138.         echo $RULES | pfctl -f - -e
  139. fi

  140. if [ -f /etc/sysctl.conf ]; then
  141. (
  142.         # delete comments and blank lines
  143.         set -- `stripcom /etc/sysctl.conf`
  144.         while [ $# -ge 1 ] ; do
  145.                 sysctl $1
  146.                 shift
  147.         done
  148. )
  149. fi

  150. # set hostname, turn on network
  151. echo "Setting Network......"     修改这里, 加入我写的setnetwork脚本,
  152. . /etc/setnetwork                     这样网络设置在每台机上都可以重新设置而不是更改文件.
复制代码

3、上一步最后有一个setnetwork脚本,这一步写出。我的脚本编写不会, 只好从其它地方抄过来,有一些错误,需要请高手改写。这个文件有点大, 贴在最后吧!

4、将一些网络配置的文件删除如:hosts, mygate等。上一步的network在启动时会生成这些配置文件。

五、        备份几个目录,在4.3 rc脚本中的MFS部分那个文件。
在/usr/live/ LiveCD根目录下建立文件夹:mfs 然后:
# tar cvzfp mfs/mfs.tgz dev etc home var
  
六、        制作ISO镜像:
# cd /usr/live
# mkhybrid –b cdrom36.fs –c boot.catalog –R –v –o /usr/OpenBSD-LiveCD.iso /usr/live

现在制作完成, 你可以用虚拟机测试这个生成的ISO镜像。
参考了网上许多文章, 这里就不一一列出来了, 感谢那些大哥写出那么好的教程.

我现在还有几个问题需要解决,主要是MFS这方面的,另外shell脚本的错误也需要大家来解决。
设置网络用的setnetwork脚本:
setnetwork:

  1. #!/bin/sh

  2. get_dkdevs() {
  3.         bsort `sed -ne "${MDDISKDEVS:-/^[sw]d[0-9][0-9]* /s/ .*//p}" /var/run/dmesg.boot`
  4. }

  5. get_cddevs() {
  6.         bsort `sed -ne "${MDCDDEVS:-/^cd[0-9][0-9]* /s/ .*//p}" /var/run/dmesg.boot`
  7. }

  8. get_ifdevs() {
  9.         ifconfig -a \
  10.             | egrep -v '^[[:space:]]|(bridge|enc|gif|gre|lo|pflog|pfsync|ppp|sl|tun|vlan)[[:digit:]]+:' \
  11.             | sed -ne 's/^\(.*\):.*/\1/p'
  12. }

  13. askpass() {
  14.         set -o noglob
  15.         stty -echo
  16.         read resp?"$1 "
  17.         stty echo
  18.         set +o noglob
  19.         echo
  20. }

  21. ask() {
  22.         local _question=$1 _default=$2

  23.         set -o noglob
  24.         while : ; do
  25.                 echo -n "$_question "
  26.                 [[ -z $_default ]] || echo -n "[$_default] "
  27.                 read resp
  28.                 case $resp in
  29.                 !)        echo "Type 'exit' to return to install."
  30.                         sh
  31.                         ;;
  32.                 !*)        eval ${resp#?}
  33.                         ;;
  34.                 *)        : ${resp:=$_default}
  35.                         break
  36.                         ;;
  37.                 esac
  38.         done
  39.         set +o noglob
  40. }

  41. ask_until() {
  42.         resp=
  43.         while [[ -z $resp ]] ; do
  44.                 ask "$1" "$2"
  45.         done
  46. }

  47. ask_yn() {
  48.         local _q=$1 _a=${2:-no} _resp
  49.         typeset -l _resp

  50.         while : ; do
  51.                 ask "$_q" "$_a"
  52.                 _resp=$resp
  53.                 case $_resp in
  54.                 y|yes)        resp=y ; return ;;
  55.                 n|no)        resp=n ; return ;;
  56.                 esac
  57.         done
  58. }

  59. ask_which() {
  60.         local _name=$1 _query=$2 _devs=$3 _defdev=$4 _err=$5

  61.         set -- $_devs
  62.         if [[ $# -lt 1 ]]; then
  63.                 echo "${_err:=No ${_name}s found}."
  64.                 resp=done
  65.                 return
  66.         fi
  67.         : ${_defdev:=$1}

  68.         _devs="$*"

  69.         while : ; do
  70.                 ask "Available ${_name}s are: ${_devs}.\nWhich one ${_query}? (or 'done')" "$_defdev"
  71.                 [[ $resp == done ]] && break

  72.                 if isin "$resp" $_devs; then
  73.                         makedev $resp && break
  74.                 else
  75.                         echo "'$resp' is not a valid choice."
  76.                 fi
  77.         done
  78. }

  79. isin() {
  80.         local        _a=$1 _b

  81.         shift
  82.         for _b; do
  83.                 [ "$_a" = "$_b" ] && return 0
  84.         done
  85.         return 1
  86. }

  87. addel() {
  88.         local        _a=$1

  89.         shift

  90.         echo -n "$*"
  91.         isin "$_a" $* || echo -n " $_a"
  92. }

  93. rmel() {
  94.         local        _a=$1 _b

  95.         shift
  96.         for _b; do
  97.                 [ "$_a" != "$_b" ] && echo -n "$_b "
  98.         done
  99. }

  100. edit_tmp_file() {
  101.         local _file=$1

  102.         ask_yn "Edit $_file with $EDITOR?"
  103.         [[ $resp == y ]] && $EDITOR /tmp/$_file
  104. }

  105. manual_net_cfg() {
  106.         ask_yn "Do you want to do any manual network configuration?"

  107.         [[ $resp == y ]] && { echo "Type 'exit' to return to $MODE." ; sh ; }
  108. }

  109. makedev() {
  110.         local _dev=$1 _node=/dev/r${1}c

  111.         if isin $_dev $IFDEVS || [[ -c $_node || -z ${_dev##+([0-9])} ]] ; then
  112.                 return 0
  113.         fi

  114.         if [[ ! -r /dev/MAKEDEV ]] ; then
  115.                 echo "No /dev/MAKEDEV. Can't create device nodes for ${_dev}."
  116.                 return 1
  117.         fi

  118.         (cd /dev; sh MAKEDEV $_dev)

  119.         [[ -c $_node ]] || return 1

  120.         DEVSMADE=`addel $_dev $DEVSMADE`
  121. }

  122. addhostent() {
  123.         sed "/ $2\$/d" /etc/hosts >; /etc/hosts.new
  124.         mv /etc/hosts.new /etc/hosts

  125.         echo "$1 $2" >;>; /etc/hosts
  126. }

  127. configure_ifs() {
  128.         local _IFDEVS=$IFDEVS _ifs _name _media _hn

  129.         while : ; do
  130.                 ask_which "interface" "do you wish to initialize" "$_IFDEVS" \
  131.                         "" "No more interfaces to initialize"
  132.                 [[ $resp == done ]] && break

  133.                 _ifs=$resp
  134.                 _hn=/etc/hostname.$_ifs

  135.                 ask "Symbolic (host) name for $_ifs?" "$(hostname -s)"
  136.                 _name=$resp

  137.                 _media=$(ifconfig -m $_ifs | grep "media ")
  138.                 if [[ -n $_media ]]; then
  139.                         cat << __EOT
  140. The media options for $_ifs are currently
  141. $(ifconfig -m $_ifs | sed -n '/supported/D;/media:/p')
  142. __EOT
  143.                         ask_yn "Do you want to change the media options?"
  144.                         case $resp in
  145.                         y)        cat << __EOT
  146. Supported media options for $_ifs are:
  147. $_media
  148. __EOT
  149.                                 ask "Media options for $_ifs?"
  150.                                 _media=$resp
  151.                                 ifconfig $_ifs $_media || return 1
  152.                                 ;;
  153.                         n)        _media=
  154.                                 ;;
  155.                         esac
  156.                 fi

  157.                 rm -f $_hn
  158.                 v4_config "$_ifs" "$_media" "$_name" "$_hn"

  159.                 [[ -f $_hn ]] && _IFDEVS=$(rmel "$_ifs" $_IFDEVS)
  160.         done
  161. }

  162. v4_info() {
  163.         ifconfig $1 inet | sed -n '
  164.                 1s/.*<UP,.*/UP/p
  165.                 1s/.*<.*/DOWN/p
  166.                 /inet/s/netmask//
  167.                 /inet/s///p'
  168. }

  169. dhcp_request() {
  170.         local _ifs=$1 _hostname=$2

  171.         echo "initial-interval 1;" >; /etc/dhclient.conf

  172.         if [[ -n $_hostname ]]; then
  173.                 echo "send host-name \"$_hostname\";" >;>; /etc/dhclient.conf
  174.                 echo "Issuing hostname-associated DHCP request for $_ifs."
  175.         else
  176.                 echo "Issuing free-roaming DHCP request for $_ifs."
  177.         fi

  178.         cat >;>; /etc/dhclient.conf << __EOT
  179. request subnet-mask,
  180.         broadcast-address,
  181.         routers,
  182.         domain-name,
  183.         domain-name-servers,
  184.         host-name;
  185. __EOT

  186.         cat >;>; /etc/resolv.conf.tail << __EOT
  187. lookup file bind
  188. __EOT

  189.         dhclient $_ifs

  190.         set -- $(v4_info $_ifs)

  191.         if [[ $1 == UP && $2 == "0.0.0.0" ]]; then
  192.                 ifconfig $_ifs delete down
  193.                 rm /etc/dhclient.conf /etc/resolv.conf.tail
  194.                 return 1
  195.         fi

  196. #        cp /etc/dhclient.conf /tmp/dhclient.conf
  197. #        cp /etc/resolv.conf.tail /tmp/resolv.conf.tail

  198.         return 0
  199. }

  200. v4_config() {
  201.         local _ifs=$1 _media=$2 _name=$3 _hn=$4 _prompt

  202.         set -- $(v4_info $_ifs)
  203.         if [[ -n $2 ]]; then
  204.                 ifconfig $_ifs inet $2 delete
  205.                 [[ $2 != "0.0.0.0" ]] && { _addr=$2; _mask=$3; }
  206.         fi

  207.         [[ -x /sbin/dhclient ]] && _prompt=" or 'dhcp'"
  208.         _prompt="IPv4 address for $_ifs? (or 'none'$_prompt)"

  209.         ask_until "$_prompt" "$_addr"
  210.         case $resp in
  211.         none)        ;;
  212.         dhcp)        if [[ ! -x /sbin/dhclient ]]; then
  213.                         echo "DHCP not possible - no /sbin/dhclient."
  214.                 elif dhcp_request $_ifs "$_name" || dhcp_request $_ifs ; then
  215.                         addhostent "127.0.0.1" "$_name"
  216.                         echo "dhcp NONE NONE NONE $_media" >; $_hn
  217.                 fi
  218.                 ;;
  219.         *)        _addr=$resp
  220.                 ask_until "Netmask?" "${_mask:=255.255.255.0}"
  221.                 if ifconfig $_ifs inet $_addr netmask $resp up ; then
  222.                         addhostent "$_addr" "$_name"
  223.                         echo "inet $_addr $resp NONE $_media" >; $_hn
  224.                 fi
  225.                 ;;
  226.         esac
  227. }

  228. v4_defroute() {
  229.         local _dr _prompt=" or 'none'"

  230.         [[ -x /sbin/dhclient ]] && _prompt=", 'dhcp'$_prompt"
  231.         _prompt="Default IPv4 route? (IPv4 address$_prompt)"

  232.         _dr=$(route -n show -inet | sed -ne '/^default */{s///; s/ .*//; p;}')
  233.         [[ -f /tmp/dhclient.conf ]] && _dr=dhcp

  234.         while : ; do
  235.                 ask_until "$_prompt" "$_dr"
  236.                 case $resp in
  237.                 none|dhcp) break ;;
  238.                 esac
  239.                 route delete -inet default >; /dev/null 2>;&1
  240.                 route -n add -inet -host default "$resp" && { echo "$resp" >;/etc/mygate ; break ; }
  241.                 route -n add -inet -host default $_dr >;/dev/null 2>;&1
  242.         done
  243. }

  244. isalphanumeric() {
  245.         local _n=$1
  246.         while [[ ${#_n} -ne 0 ]]; do
  247.                 case $_n in
  248.                 [A-Za-z0-9]*)        ;;
  249.                 *)                return 1;;
  250.                 esac
  251.                 _n=${_n#?}
  252.         done
  253.         return 0
  254. }

  255. enable_network() {
  256.         local _netfile

  257. #        for _netfile in hosts dhclient.conf resolv.conf resolv.conf.tail protocols services; do
  258. #                if [ -f /mnt/etc/${_netfile} ]; then
  259. #                        cp /mnt/etc/${_netfile} /etc/${_netfile}
  260. #                fi
  261. #        done

  262.         ifconfig lo0 inet 127.0.0.1

  263.         for hn in /etc/hostname.*; do
  264.                 if=${hn#/etc/hostname.}

  265.                 if ! isalphanumeric "$if"; then
  266.                         continue
  267.                 fi
  268.                 ifconfig $if >; /dev/null 2>;&1
  269.                 if [ $? -ne 0 ]; then
  270.                         continue
  271.                 fi

  272.                 while :; do
  273.                         if [ "$cmd2" ]; then
  274.                                 set -- $cmd2
  275.                                 af=$1 name=$2 mask=$3 bcaddr=$4 ext1=$5 cmd2=
  276.                                 i=1; while [ i -lt 6 -a -n "$1" ]; do shift; let i=i+1; done
  277.                                 ext2="$@"
  278.                         else
  279.                                 read af name mask bcaddr ext1 ext2 || break
  280.                         fi
  281.                         case $af in
  282.                         "#"*|"!"*|"bridge"|""|"rtsol")
  283.                                 continue
  284.                                 ;;
  285.                         "dhcp")        [ "$name" = "NONE" ] && name=
  286.                                 [ "$mask" = "NONE" ] && mask=
  287.                                 [ "$bcaddr" = "NONE" ] && bcaddr=
  288.                                 ifconfig $if $name $mask $bcaddr $ext1 $ext2 down
  289.                                 cmd="dhclient $if"
  290.                                 ;;
  291.                         "up")
  292.                                 cmd="ifconfig $if $name $mask $bcaddr $ext1 $ext2 up"
  293.                                 ;;
  294.                         *)        read dt dtaddr
  295.                                 if [ "$name" = "alias" ]; then
  296.                                         alias=$name
  297.                                         name=$mask
  298.                                         mask=$bcaddr
  299.                                         bcaddr=$ext1
  300.                                         ext1=$ext2
  301.                                         ext2=
  302.                                 else
  303.                                         alias=
  304.                                 fi
  305.                                 cmd="ifconfig $if $af $alias $name "
  306.                                 case $dt in
  307.                                 dest)        cmd="$cmd $dtaddr"
  308.                                         ;;
  309.                                 [a-z!]*)
  310.                                         cmd2="$dt $dtaddr"
  311.                                         ;;
  312.                                 esac
  313.                                 if [ ! -n "$name" ]; then
  314.                                         echo "/etc/hostname.$if: invalid network configuration file"
  315.                                         return
  316.                                 fi
  317.                                 case $af in
  318.                                 inet)        [ "$mask" ] && cmd="$cmd netmask $mask"
  319.                                         if [ "$bcaddr" -a "$bcaddr" != "NONE" ]; then
  320.                                                 cmd="$cmd broadcast $bcaddr"
  321.                                         fi
  322.                                         [ "$alias" ] && rtcmd="; route -qn add -host $name 127.0.0.1"
  323.                                         ;;
  324.                                 inet6)
  325.                                         continue
  326.                                         ;;
  327.                                 *)        cmd="$cmd $mask $bcaddr"
  328.                                 esac
  329.                                 cmd="$cmd $ext1 $ext2$rtcmd" rtcmd=
  330.                                 ;;
  331.                         esac
  332.                         eval "$cmd"
  333.                 done </etc/hostname.$if
  334.         done

  335.         if [ -f /etc/mygate ]; then
  336.                 route delete default >;/dev/null 2>;&1
  337.                 route -qn add -host default $(< /etc/mygate)
  338.         fi

  339.         route -qn add -host `hostname` 127.0.0.1 >;/dev/null
  340.         route -qn add -net 127 127.0.0.1 -reject >;/dev/null

  341.         echo "Network interface configuration:"
  342.         ifconfig -am

  343.         route -n show
  344.         if [ -f /etc/resolv.conf ]; then
  345.                 echo "\nResolver enabled."
  346.         else
  347.                 echo "\nResolver not enabled."
  348.         fi
  349. }

  350. get_fqdn() {
  351.         local _dn

  352.         _dn=$(hostname)
  353.         _dn=${_dn#$(hostname -s)}
  354.         _dn=${_dn#.}

  355.         echo "${_dn:=my.domain}"
  356. }

  357. donetconfig() {
  358.         local _dn _ns

  359.         configure_ifs

  360.         if [ -f /etc/resolv.conf.shadow ]; then
  361.                 mv /etc/resolv.conf.shadow /etc/resolv.conf
  362.                 _ns=$(sed -ne '/^nameserver /s///p' /etc/resolv.conf)
  363.                 _dn=$(sed -n \
  364.                         -e '/^domain[[:space:]][[:space:]]*/{s///;s/\([^[:space:]]*\).*$/\1/;h;}' \
  365.                         -e '/^search[[:space:]][[:space:]]*/{s///;s/\([^[:space:]]*\).*$/\1/;h;}' \
  366.                         -e '${g;p;}' /tmp/resolv.conf)
  367.         fi

  368.         ask "DNS domain name? (e.g. 'bar.com')" "${_dn:=$(get_fqdn)}"
  369.         hostname "$(hostname -s).$resp"

  370.         ask "DNS nameserver? (IP address or 'none')" "${_ns:=none}"
  371.         if [[ $resp != none ]]; then
  372.                 echo "lookup file bind" >; /etc/resolv.conf
  373.                 for _ns in $resp; do
  374.                         echo "nameserver $_ns" >;>; /etc/resolv.conf
  375.                 done
  376.                 ask_yn "Use the nameserver now?" yes
  377.                 [[ $resp == y ]] && cp /etc/resolv.conf /etc/resolv.conf.shadow
  378.         fi

  379.         [[ -n $(ifconfig -a | sed -ne '/[         ]inet .* broadcast /p') ]] && v4_defroute

  380. #        edit_tmp_file hosts
  381. #        manual_net_cfg
  382. }

  383. IFDEVS=$(get_ifdevs)
  384. MODE=OpenBSD-LiveCD
  385. EDITOR=mg

  386. ask_until "\nSystem hostname? (short form, e.g. 'foo')" "$(hostname -s)"
  387. [[ ${resp%%.*} != $(hostname -s) ]] && hostname $resp

  388. ( cd /etc; rm -f host* my* resolv.* dhclient.* )

  389. cat >; /etc/hosts << __EOT
  390. ::1 localhost
  391. 127.0.0.1 localhost
  392. ::1 $(hostname -s)
  393. 127.0.0.1 $(hostname -s)
  394. __EOT

  395. ask_yn "Configure the network?" yes
  396. [[ $resp == y ]] && donetconfig

  397. ( cd /etc
  398. hostname >; myname

  399. _dn=$(get_fqdn)
  400. while read _addr _hn _aliases; do
  401.         if [[ -n $_aliases || $_hn != ${_hn%%.*} || -z $_dn ]]; then
  402.                 echo "$_addr $_hn $_aliases"
  403.         else
  404.                 echo "$_addr $_hn.$_dn $_hn"
  405.         fi
  406. done < hosts >; hosts.new
  407. mv hosts.new hosts
  408. )

  409. ask "HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none')" \
  410.             "${ftp_proxy:-none}"
  411. unset ftp_proxy http_proxy
  412. [[ $resp == none ]] || export ftp_proxy=$resp http_proxy=$resp

复制代码

我将制作的一个livecd放在:
ftp://ftp.linuxeden.com/rianren/
各位可以下载来试试!

论坛徽章:
0
12 [报告]
发表于 2005-03-31 16:09 |只看该作者

OpenBSD LiveCD制作过程

我将制作的一个livecd放在:
ftp://ftp.linuxeden.com/rianren/
各位可以下载来试试!

论坛徽章:
0
11 [报告]
发表于 2005-03-30 13:21 |只看该作者

OpenBSD LiveCD制作过程

不错不错,鼓励啊

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
10 [报告]
发表于 2005-03-27 19:36 |只看该作者

OpenBSD LiveCD制作过程

liveCD是个什么东西呢?用来做什么的?
老鸟不要取笑哦。

论坛徽章:
0
9 [报告]
发表于 2005-03-27 15:59 |只看该作者

OpenBSD LiveCD制作过程

对于这种无私奉贤的人  我所能做的  就是狂顶   谢谢啊   支持

论坛徽章:
0
8 [报告]
发表于 2005-03-27 15:50 |只看该作者

OpenBSD LiveCD制作过程

2005-3.27更新版:
主要是更新了rc脚本的关于/etc, root,var,home这几个目录的运作方式,由mfs改为union, mfs在上一版本中运作不理想, 现将它挂到tmp下, 使得原来所做的各项设置不会改变:

将第五步, 制作mfs这一步省略, 将4.3的rc文件改成如下:

  1. #        $OpenBSD: rc,v 1.251 2004/08/21 08:17:28 hshoexer Exp $

  2. # System startup script run by init on autoboot
  3. # or after single-user.
  4. # Output and error are redirected to console by init,
  5. # and the console is the controlling terminal.
  6. # Subroutines (have to come first).
  7. # Strip comments (and leading/trailing whitespace if IFS is set)

  8. stripcom() {
  9.         local _file="$1"
  10.         local _line

  11.         {
  12.                 while read _line ; do
  13.                         _line=${_line%%#*}                # strip comments
  14.                         test -z "$_line" && continue
  15.                         echo $_line
  16.                 done
  17.         } < $_file
  18. }

  19. # End subroutines

  20. stty status '^T'

  21. # Set shell to ignore SIGINT (2), but not children;
  22. # shell catches SIGQUIT (3) and returns to single user after fsck.
  23. trap : 2
  24. trap : 3        # shouldn't be needed

  25. HOME=/; export HOME
  26. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  27. export PATH

  28. if [ $1x = shutdownx ]; then
  29.         dd if=/dev/urandom of=/var/db/host.random bs=1024 count=64 >;/dev/null 2>;&1
  30.         chmod 600 /var/db/host.random >;/dev/null 2>;&1
  31.         if [ $? -eq 0 -a -f /etc/rc.shutdown ]; then
  32.                 echo /etc/rc.shutdown in progress...
  33.                 . /etc/rc.shutdown
  34.                 echo /etc/rc.shutdown complete.

  35.                 # bring carp interfaces down gracefully
  36.                 for hn in /etc/hostname.carp[0-9]*; do
  37.                         # Strip off /etc/hostname. prefix
  38.                         if=${hn#/etc/hostname.}
  39.                         test "$if" = "carp[0-9]*" && continue

  40.                         ifconfig $if >; /dev/null 2>;&1
  41.                         if [ "$?" != "0" ]; then
  42.                                 ifconfig $if down
  43.                         fi
  44.                 done

  45.                 if [ "X${powerdown}" = X"YES" ]; then
  46.                         exit 2
  47.                 fi

  48.         else
  49.                 echo single user: not running /etc/rc.shutdown
  50.         fi
  51.         exit 0
  52. fi

  53. # Configure ccd devices.
  54. if [ -f /etc/ccd.conf ]; then
  55.         ccdconfig -C
  56. fi

  57. # Configure raid devices.
  58. for dev in 0 1 2 3; do
  59.         if [ -f /etc/raid$dev.conf ]; then
  60.                 raidctl -c /etc/raid$dev.conf raid$dev
  61.         fi
  62. done

  63. # Check parity on raid devices.
  64. raidctl -P all

  65. swapctl -A -t blk

  66. if [ -e /fastboot ]; then
  67.         echo "Fast boot: skipping disk checks."
  68. elif [ $1x = autobootx ]; then
  69.         echo "Automatic boot in progress: starting file system checks."
  70. #        fsck -p
  71.         case $? in
  72.         0)
  73.                 ;;
  74.         2)
  75.                 exit 1
  76.                 ;;
  77.         4)
  78.                 echo "Rebooting..."
  79.                 reboot
  80.                 echo "Reboot failed; help!"
  81.                 exit 1
  82.                 ;;
  83.         8)
  84.                 echo "Automatic file system check failed; help!"
  85.                 exit 1
  86.                 ;;
  87.         12)
  88.                 echo "Boot interrupted."
  89.                 exit 1
  90.                 ;;
  91.         130)
  92.                 # interrupt before catcher installed
  93.                 exit 1
  94.                 ;;
  95.         *)
  96.                 echo "Unknown error; help!"
  97.                 exit 1
  98.                 ;;
  99.         esac
  100. fi

  101. trap "echo 'Boot interrupted.'; exit 1" 3

  102. umount -a >;/dev/null 2>;&1

  103. echo 'mounting mfs union'
  104. mount_mfs -s 32768 swap /tmp 2>;&1
  105. echo "Generating /tmp under MFS"

  106. mount_union /tmp /etc
  107. mount_union /tmp /var
  108. mount_union /tmp /root
  109. mount_union        /tmp        /home

  110. # set flags on ttys.  (do early, in case they use tty for SLIP in netstart)
  111. echo 'setting tty flags'
  112. ttyflags -a

  113. if [ -f /etc/sysctl.conf ]; then
  114. (
  115.         # delete comments and blank lines
  116.         set -- `stripcom /etc/sysctl.conf`
  117.         while [ $# -ge 1 ] ; do
  118.                 sysctl $1
  119.                 shift
  120.         done
  121. )
  122. fi

  123. # if there's no /var/db/host.random, make one through /dev/urandom
  124. if [ ! -f /var/db/host.random ]; then
  125.         dd if=/dev/urandom of=/var/db/host.random bs=1024 count=64 \
  126.                 >;/dev/null 2>;&1
  127.         chmod 600 /var/db/host.random >;/dev/null 2>;&1
  128. else
  129.         dd if=/var/db/host.random of=/dev/urandom bs=1024 count=64 \
  130.             >; /dev/null 2>;&1
  131.         dd if=/var/db/host.random of=/dev/arandom bs=1024 count=64 \
  132.             >; /dev/null 2>;&1
  133. fi

  134. # reset seed file, so that if a shutdown-less reboot occurs,
  135. # the next seed is not a repeat
  136. dd if=/dev/urandom of=/var/db/host.random bs=1024 count=64 \
  137.     >; /dev/null 2>;&1

  138. # clean up left-over files
  139. rm -f /etc/nologin
  140. rm -f /var/spool/lock/LCK.*
  141. rm -f /var/spool/uucp/STST/*
  142. (cd /var/run && { rm -rf -- *; install -c -m 664 -g utmp /dev/null utmp; })
  143. (cd /var/authpf && rm -rf -- *)

  144. # save a copy of the boot messages
  145. dmesg >;/var/run/dmesg.boot

  146. # check the password temp/lock file
  147. if [ -f /etc/ptmp ]; then
  148.         logger -s -p auth.err \
  149.         'password file may be incorrect -- /etc/ptmp exists'
  150. fi

  151. echo clearing /tmp

  152. # prune quickly with one rm, then use find to clean up /tmp/[lq]*
  153. # (not needed with mfs /tmp, but doesn't hurt there...)
  154. (cd /tmp && rm -rf [a-km-pr-zA-Z]* &&
  155.     find . ! -name . ! -name lost+found ! -name quota.user \
  156.         ! -name quota.group -execdir rm -rf -- {} \; -type d -prune)

  157. [ -f /etc/rc.securelevel ] && . /etc/rc.securelevel
  158. if [ X${securelevel} != X"" ]; then
  159.         echo -n 'setting kernel security level: '
  160.         sysctl kern.securelevel=${securelevel}
  161. fi

  162. if [ -f /var/account/acct ]; then
  163.         echo 'turning on accounting';        accton /var/account/acct
  164. fi

  165. if [ -f /sbin/ldconfig ]; then
  166.         echo 'creating runtime link editor directory cache.'
  167.         if [ -d /usr/local/lib ]; then
  168.                 shlib_dirs="/usr/local/lib $shlib_dirs"
  169.         fi
  170.         if [ -d /usr/X11R6/lib ]; then
  171.                 shlib_dirs="/usr/X11R6/lib $shlib_dirs"
  172.         fi
  173.         ldconfig $shlib_dirs
  174. fi

  175. if [ -x /sbin/wsconsctl -a -f /etc/wsconsctl.conf ]; then
  176. (
  177.         # delete comments and blank lines
  178.         save_IFS="$IFS"
  179.         IFS="
  180. "
  181.         set -- `stripcom /etc/wsconsctl.conf`
  182.         IFS="$save_IFS"
  183.         while [ $# -ge 1 ] ; do
  184.                 eval /sbin/wsconsctl -w $1
  185.                 shift
  186.         done
  187. )
  188. fi

  189. if [ -f /sbin/kbd -a -f /etc/kbdtype ]; then
  190.         kbd `cat /etc/kbdtype`
  191. fi

  192. echo "Setting Network......"
  193. . /etc/setnetwork

  194. date


复制代码
freepower 该用户已被删除
7 [报告]
发表于 2005-03-27 13:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2005-03-26 14:52 |只看该作者

OpenBSD LiveCD制作过程

谢谢,收藏了
qhljx 该用户已被删除
5 [报告]
发表于 2005-03-26 14:45 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
丑牛
日期:2013-09-29 09:47:222015七夕节徽章
日期:2015-08-21 11:06:17
4 [报告]
发表于 2005-03-26 13:51 |只看该作者

OpenBSD LiveCD制作过程

回头实验一下
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP