[转]根据FreeBSD 7.x做一个精简版的FreeBSD(miniBSD)
网上有使用FreeBSD 4.x , FreeBSD 5.x , FreeBSD 6.x 制作miniBSD的具体方法(miniBSD from FreeBSD 4.x), 但我手头只有FreeBSD 7.0r,所以参照FreeBSD 6.x的方法作了一个尝试,原文是刷到CF卡里的,但我没有CF卡,但有U盘,所以刷到了U盘里,可是用U盘启动总是显示出所有寄存器的值之后报BTX halted错误。最后只好使用vmware虚拟出一块ide硬盘测试从FreeBSD 7.0制作的miniBSD。
1.安装FreeBSD 7.0
这个不用多说,你有盘装起来应该不成问题,选择minimal安装即可。
2.安装jail
2.1安装jail软件包
sysinstall进入到配置里,先进入Options,把Install Root改成/usr/jail
然后进入Custom里的Distributions,选中minimal,之后commit安装。
2.2复制文件到jail里
#cp /etc/resolv.conf /usr/jail/etc/resolv.conf
#cp /boot/kernel/kernel /usr/jail/boot/kernel/kernel
#cp /boot/defaults/loader.conf /usr/jail/boot/defaults/loader.conf
#cp /etc/localtime /usr/jail/etc/localtime
#cp /etc/wall_cmos_clock /usr/jail/etc/wall_cmos_clock
3.进入jail
3.1.设置prompt变量,否则你进入到jail之后自己也不知道有没有退出。
编辑/usr/jail/root/.cshrc文件,在最后加上
set prompt = ” miniBSD %~ %# ”
3.2.挂载dev并进入jail
#mount -t devfs devfs /usr/jail/dev
#chroot /usr/jail /bin/csh
此时命令提示符就变成之前设置的miniBSD#了,这样就知道自己在jail里。
4.创建文件夹
这一步可以自己创建,也可以使用脚本文件(脚本文件的原作者在脚本中有注明)。create-minibsd-dirs.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!/bin/sh
#
# http://www.freedot.org/
# E-Mail Contact: brian@freedot.org
#
MINIBSD_DIR=/usr/minibsd ;
if [ -d $MINIBSD_DIR ] ; then
echo ;
echo "$MINIBSD_DIR already exists. Remove the directory" ;
echo "before running this script." ;
echo ;
echo "Exiting..." ;
echo ;
exit ;
fi ;
mkdir $MINIBSD_DIR ;
cd $MINIBSD_DIR ;
mkdir bin ;
mkdir boot ;
mkdir boot/defaults ;
mkdir dev ;
mkdir etc ;
mkdir etc/defaults ;
mkdir etc/mtree ;
mkdir lib ;
mkdir libexec ;
mkdir mnt ;
mkdir -m 0555 proc ;
mkdir -m 0700 root ;
mkdir sbin ;
mkdir usr ;
mkdir usr/bin ;
mkdir usr/lib ;
mkdir usr/lib/aout ;
mkdir usr/libexec ;
mkdir usr/local ;
mkdir usr/sbin ;
mkdir usr/share ;
mkdir usr/share/misc ;
mkdir var ;
mkdir var/tmp ;
ln -s /var/tmp tmp |
5.复制boot里的文件和binary
5.1.复制loader
#cd /boot
#cp -r loader /usr/minibsd/boot/
#cp beastie.4th /usr/minibsd/boot/
#cp frames.4th /usr/minibsd/boot/
#cp screen.4th /usr/minibsd/boot/
#cp defaults/loader.conf /usr/minibsd/boot/defaults/
5.2.复制工具binary
使用一个脚本,mkmini.sh 参数为minibsd6.files
mkmini.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #!/bin/sh
#
# http://www.freedot.org/
# E-Mail Contact: brian@freedot.org
#
if [ ! $1 ] ; then
echo ;
echo "Syntax : mkmini.sh <input file>" ;
echo "Example: mkmini.sh /root/minibsd6.files" ;
echo ;
exit ;
fi ;
MINIBSDFILES="$1" ;
MINIBSDDIR="/usr/minibsd" ;
# Thanks to Nate Nielsen for this!
sed -nE -e 's/^ *([^ #]+) */\1/p' < $MINIBSDFILES | tr ':' '\n' | tar -C / -cvf - -T - | tar -C $MINIBSDDIR -x -f - |
minibsd6.files
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 | # minibsd.files
# by Manuel Kasper <mk@neon1.net>
# List of files required for a very minimal FreeBSD system,
# intended to be parsed by mkmini.pl
#
# Modified by David Courtney <minibsd@ultradesic.com>
# - sbin/rcorder is required for FreeBSD 5.x
# - bin/kenv is required for FreeBSD 6.x
# - Removed ssh files out of the default minibsd6.files
# - Removed named files out of the default minibsd6.files
# - Removed ppp files out of the default minibsd6.files
# - Removed usr/sbin/ndc
# - Removed usr/sbin/ipsend
# - Added usr/bin/cut
# - Added sbin/mount_mfs
# - Added sbin/nextboot
# - Removed the usr/sbin/tset hard link to usr/bin/reset
#
# Lines with colons (':') in them list files that should be hard-linked
# to each other, e.g.
# bin/link:bin/ln
# instructs mkmini.pl to copy over bin/link, then hard link ln to it.
# contents of /boot
boot/boot0
boot/boot1
boot/boot2
boot/defaults/loader.conf
boot/device.hints
boot/loader
boot/loader.4th
boot/loader.help
boot/loader.rc
boot/mbr
boot/support.4th
# contents of /libexec
libexec/ld-elf.so.1:usr/libexec/ld-elf.so.1
# contents of /bin
bin/[:bin/test
bin/cat
bin/chflags
bin/chio
bin/chmod
bin/cp
bin/csh:bin/tcsh
bin/date
bin/dd
bin/df
bin/domainname
bin/echo
bin/ed:bin/red
bin/expr
bin/hostname
bin/kenv
bin/kill
bin/link:bin/ln
bin/ls
bin/mkdir
bin/mv
bin/pax
bin/ps
bin/pwd
bin/realpath
bin/rm:bin/unlink
bin/rmdir
bin/sh
bin/sleep
bin/stty
bin/sync
# contents of /sbin
sbin/adjkerntz
sbin/comcontrol
sbin/dhclient
sbin/dhclient-script
sbin/disklabel
sbin/dmesg
sbin/fastboot:sbin/fasthalt:sbin/halt:sbin/reboot
sbin/fsck
sbin/fsck_ufs:sbin/fsck_ffs:sbin/fsck_4.2bsd
sbin/ifconfig
sbin/init
sbin/ipfw
sbin/kldconfig
sbin/kldload
sbin/kldstat
sbin/kldunload
sbin/ldconfig
sbin/md5
sbin/mdconfig
sbin/mknod
sbin/mdmfs
sbin/mount
sbin/mount_devfs:sbin/mount_fdescfs:sbin/mount_linprocfs:sbin/mount_procfs:sbin/mount_std
sbin/mount_mfs
sbin/mount_nullfs
sbin/mount_umapfs
sbin/mount_unionfs
sbin/natd
sbin/newfs
sbin/nextboot
sbin/nologin
sbin/nos-tun
sbin/rcorder
sbin/ping
sbin/route
sbin/setkey
sbin/shutdown
sbin/slattach
sbin/swapon
sbin/sysctl
sbin/umount
# contents of /usr/sbin
usr/bin/at:usr/bin/atq:usr/bin/atrm:usr/bin/batch
usr/bin/awk
usr/bin/basename
usr/bin/bunzip2:usr/bin/bzcat:usr/bin/bzip2
usr/bin/chat
usr/bin/chfn:usr/bin/chpass:usr/bin/chsh
usr/bin/chgrp
usr/bin/cksum
usr/bin/clear
usr/bin/cmp
usr/bin/compress:usr/bin/uncompress
usr/bin/cpio
usr/bin/crontab
usr/bin/cu
usr/bin/cut
usr/bin/dig
usr/bin/dirname
usr/bin/du
usr/bin/ee
usr/bin/egrep:usr/bin/fgrep:usr/bin/grep
usr/bin/env
usr/bin/false
usr/bin/fetch
usr/bin/find
usr/bin/finger
usr/bin/fstat
usr/bin/fsync
usr/bin/ftp
usr/bin/gunzip:usr/bin/gzcat:usr/bin/gzip
usr/bin/gzexe
usr/bin/head
usr/bin/hexdump
usr/bin/id:usr/bin/whoami
usr/bin/ident
usr/bin/killall
usr/bin/last
usr/bin/less:usr/bin/more
usr/bin/limits
usr/bin/lock
usr/bin/lockf
usr/bin/logger
usr/bin/login
usr/bin/logname
usr/bin/mesg
usr/bin/minigzip
usr/bin/mkfifo
usr/bin/mktemp
usr/bin/msgs
usr/bin/netstat
usr/bin/nice
usr/bin/nohup
usr/bin/objformat
usr/bin/openssl
usr/bin/passwd
usr/bin/printf
usr/bin/renice
usr/bin/reset
usr/bin/script
usr/bin/sed
usr/bin/shar
usr/bin/sort
usr/bin/split
usr/bin/su
usr/bin/tail
usr/bin/tar
usr/bin/tee
usr/bin/telnet
usr/bin/tftp
usr/bin/time
usr/bin/top
usr/bin/touch
usr/bin/tput
usr/bin/tr
usr/bin/true
usr/bin/tty
usr/bin/uname
usr/bin/uptime:usr/bin/w
usr/bin/users
usr/bin/uudecode
usr/bin/uuencode
usr/bin/vi
usr/bin/vmstat
usr/bin/wall
usr/bin/who
usr/bin/whois
usr/bin/write
usr/bin/yes
# contents of usr/sbin
usr/sbin/arp
usr/sbin/boot0cfg
usr/sbin/chown
usr/sbin/chroot
usr/sbin/cron
usr/sbin/idprio:usr/sbin/rtprio
usr/sbin/inetd
usr/sbin/iostat
usr/sbin/kbdcontrol
usr/sbin/lastlogin
usr/sbin/memcontrol
usr/sbin/mtree
usr/sbin/newsyslog
usr/sbin/ngctl
usr/sbin/nghook
usr/sbin/ntpdate
usr/sbin/pciconf
usr/sbin/pw
usr/sbin/pwd_mkdb
usr/sbin/slstat
usr/sbin/syslogd
usr/sbin/tcpdchk
usr/sbin/tcpdmatch
usr/sbin/tcpdump
usr/sbin/traceroute
usr/sbin/vidcontrol
usr/sbin/vipw
usr/sbin/vnconfig
usr/sbin/watch
# contents of /usr/libexec
usr/libexec/atrun
usr/libexec/ftpd
usr/libexec/getty
usr/libexec/telnetd
usr/libexec/tftpd
# contents of /usr/share
usr/share/misc/termcap |
6.定制kernel
我直接用了general的,省时省力,等boot miniBSD成功之后再定制也不迟,呵呵。
最好把kernel压缩一下,这样可以节省空间。
#cp /boot/kernel/kernel /usr/minibsd/boot/kernel/
#cd /usr/minibsd/boot/kernel
#gzip -9 kernel
7.复制lib
mklibs.sh
1 2 3 4 5 6 7 8 9 | #!/bin/sh # # http://www.freedot.org/ # E-Mail Contact: brian@freedot.org # MINIBSDDIR="/usr/minibsd" ; find -X $MINIBSDDIR ! -name "*.ko" -and -type f -and -perm +111 | xargs ldd -f "%p\n" 2> /dev/null | sort | uniq | sed 's|^/||' |
用脚本根据复制的binary来复制lib之后,还差几个lib需要复制。
#cp -p /usr/lib/pam* /usr/minibsd/usr/lib/
8.复制/etc里的配置文件
8.1.设置密码
因为密码文件是由passwd命令产生的,所以先在jail里把密码用passwd设置好,然后再把密码文件复制到miniBSD里。
8.2.复制/etc
这个是原本是freebsd6的,7里面我已经修改过了。
copy-etc-6.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #!/bin/sh
#
# http://www.freedot.org/
# E-Mail Contact: brian@freedot.org
#
DEST=/usr/minibsd/etc ;
if [ ! -d $DEST ] ; then
echo ;
echo "$DEST does not exist.";
echo "For safety reasons, this script will not create the" ;
echo "directory for you. Make sure you are running this script" ;
echo "from *within* your FreeBSD jail!" ;
echo ;
echo "If you know you are in the right place, type the following:" ;
echo ;
echo "mkdir $DEST" ;
echo ;
echo "...and then run this script again."
echo ;
echo "Exiting..." ;
echo ;
exit ;
fi ;
if [ -f $DEST/auth.conf ] ; then
echo ;
echo "It appears as though the files may have already been" ;
echo "copied. For safety reasons, the script will now exit." ;
echo "If you want to run this script, you'll need to delete" ;
echo "the files in $DEST first." ;
echo ;
echo "Exiting..." ;
echo ;
exit ;
fi ;
cp /etc/auth.conf $DEST
cp /etc/crontab $DEST
cp /etc/defaults/devfs.rules $DEST/defaults
cp /etc/defaults/periodic.conf $DEST/defaults
cp /etc/defaults/rc.conf $DEST/defaults
#cp /etc/disktab $DEST
if [ ! -f /etc/fstab ] ; then
touch /etc/fstab ;
fi ;
cp /etc/fstab $DEST
#cp /etc/ftpusers $DEST
cp /etc/gettytab $DEST
cp /etc/group $DEST
if [ ! -f /etc/host.conf ] ; then
cd $DEST ;
ln -s /tmp/host.conf ;
else
cp /etc/host.conf $DEST ;
fi ;
cp /etc/hosts $DEST
cp /etc/hosts.allow $DEST
#cp /etc/hosts.equiv $DEST
#cp /etc/hosts.lpd $DEST
cp /etc/inetd.conf $DEST
cp /etc/localtime $DEST
cp /etc/login.access $DEST
cp /etc/login.conf $DEST
cp /etc/master.passwd $DEST
cp /etc/mtree/BSD.include.dist $DEST/mtree
cp /etc/mtree/BSD.local.dist $DEST/mtree
cp /etc/mtree/BSD.root.dist $DEST/mtree
cp /etc/mtree/BSD.sendmail.dist $DEST/mtree
cp /etc/mtree/BSD.usr.dist $DEST/mtree
cp /etc/mtree/BSD.var.dist $DEST/mtree
cp /etc/mtree/BSD.x11-4.dist $DEST/mtree
cp /etc/mtree/BSD.x11.dist $DEST/mtree
#cp /etc/namedb/PROTO.localhost.rev $DEST/namedb
#cp /etc/namedb/make-localhost $DEST/namedb
#cp /etc/namedb/named.conf $DEST/namedb
#cp /etc/namedb/named.root $DEST/namedb
cp /etc/network.subr $DEST
cp /etc/networks $DEST
cp /etc/newsyslog.conf $DEST
if [ ! -f /etc/nsswitch.conf ] ; then
cd $DEST ;
ln -s /tmp/nsswitch.conf ;
else
cp /etc/nsswitch.conf $DEST ;
fi ;
cp -R /etc/pam.d $DEST
cp /etc/passwd $DEST
cp /etc/profile $DEST
cp /etc/protocols $DEST
cp /etc/pwd.db $DEST
cp /etc/rc $DEST
if [ -f /etc/rc.conf ] ; then
cp /etc/rc.conf $DEST ;
fi ;
cp -R /etc/rc.d $DEST
cp /etc/rc.firewall $DEST
#cp /etc/rc.i368 $DEST
#cp /etc/rc.local $DEST
#cp /etc/rc.network $DEST
#cp /etc/rc.serial $DEST
cp /etc/rc.shutdown $DEST
cp /etc/rc.subr $DEST
cp /etc/resolv.conf $DEST
#cp /etc/security $DEST
cp /etc/services $DEST
cp /etc/shells $DEST
#cp /etc/skeykeys $DEST
cp /etc/spwd.db $DEST
#cp /etc/ssh/primes $DEST/ssh
#cp /etc/ssh/ssh_config $DEST/ssh
#cp /etc/ssh/ssh_host_dsa_key $DEST/ssh
#cp /etc/ssh/ssh_host_dsa_key.pub $DEST/ssh
#cp /etc/ssh/ssh_host_key $DEST/ssh
#cp /etc/ssh/ssh_host_key.pub $DEST/ssh
#cp /etc/ssh/sshd_config $DEST/ssh
#cp /etc/ssl/openssl.cnf $DEST/ssl
cp /etc/sysctl.conf $DEST
cp /etc/syslog.conf $DEST
if [ ! -f $DEST/termcap ] ; then
ln -s /usr/share/misc/termcap $DEST/termcap ;
fi ;
cp /etc/ttys $DEST
if [ -f /etc/wall_cmos_clock ] ; then
cp /etc/wall_cmos_clock $DEST ;
fi ; |
9.设置配置文件
9.1.把/usr/minibsd/etc/fstab作一下修改,因为当用硬盘启动miniBSD的时候,硬盘是被认作ad0的,设置成只读,这样对于CF卡之类有好处,不至于卡很快报废,呵呵。内容如下:
/dev/ad0s1a / ufs ro 1 1
9.2.对于/usr/minibsd/etc/rc.conf需要进行设置,根据自己实际情况设置,
因为没有swap,所以dumpdev=”NO”,另外要使用到内存盘,因为我们的/文件系统是read only的。这里可以使用rc.diskless2,有空我研究一下。我的内容如下:
hostname=”jojo.minibsd”
sshd_enabled=”NO”
usbd_enabled=”NO”
sendmail_enabled=”NO”
inetd_enabled=”NO”
portmap_enabled=”NO”
update_motd=”NO”
varsize=8192
varmfs=”YES”
tmpmfs=”YES”
tmpsize=8192
dumpdev=”NO”
9.3.为了跳过启动时的十秒等待,可以编辑/usr/minibsd/boot/boot.rc这个文件,加入如下这行:
autoboot 0
10.打包miniBSD
#cd /usr/minibsd
#tar cfvz /usr/minibsd-7.tar.gz *
11.把miniBSD复制到硬盘(CF卡或者U盘)上(如果你想用dd命令把磁盘文件直接刷到硬盘上,直接跳到12)
因为我的主板USB启动有些问题,可能是FreeBSD的loader跟我的主板不兼容,所以我使用IDE硬盘,如果你是U盘的话,下面的ad1和ad0都改成da0即可。
10.1.格式化硬盘,因为ad0是第一块IDE,所以新接上去的这里是ad1。
#fdisk -BI /dev/ad1
11.2.创建一个slice,使用整个硬盘空间。
#bsdlabel -B -w ad1s1
11.3.创建filesystem。
#newfs -U /dev/ad1s1a
11.4.挂载到/mnt。
#mount /dev/ad1s1a /mnt
11.5.把刚才打包的miniBSD全解包到/mnt目录。
#cd /mnt
#tar xfvzP /usr/minibsd-7.tar.gz
11.6.设置成可引导,即把boot0程序写进硬盘的mbr
#boot0cfg -v -B ad1
11.7.跳到13
12.把miniBSD刷到硬盘(CF卡或者U盘)上
12.1首先获得要刷的磁盘大小
#bsdlabel -w -An-B ad1 auto | grep sectors/unit
得到一个sector的数量。
12.2创建磁盘文件(内容用零填充),[number of sector]就是刚才得到的数字
#dd if=/dev/zero of=/usr/minibsd-disk.bin bs=512 count=[number of sector]
12.3创建一个minibsd-disk.bin文件的vnode
#mdconfig -f /usr/minibsd-disk.bin -u 0
12.4现在我们对/dev/md0这个vnode的操作就等于是对磁盘文件minbsd-disk.bin的操作了。
#fdisk -BI /dev/md0
#bsdlabel -B -w md0s1
#newfs -U md0s1a
#mount /dev/md0s1a /mnt
这几步格式化了vnode,创建了一个slice和一个ufs文件系统,并挂载到/mnt目录下。
12.5把我们的minibsd解包到/mnt
#cd /mnt
#tar xfvzP /usr/minibsd-7.tar.gz
12.6对vnode的操作结束,清理一下
#cd /
#umount /mnt
#mdconfig -d -u 0
12.7现在可以用dd命令把装有miniBSD的minibsd-disk.bin文件刷到硬盘上了
#dd if=/usr/minibsd-disk.bin of=/dev/ad1 bs=8k
13.用装好的minibsd引导
把这块装有miniBSD的硬盘接到电脑上启动吧。
我这样做出来的miniBSD打包后9M,这样的一个精简的Freebsd能干什么呢?加入自己想要的,像m0n0wall和pfSense一样做个路由不错。不过这可是DIY的哦。