Автор: Сергей Воронков serg(at)so.net.ua
Зачем это надо. Я думаю задач придумать можно массу, у меня работает роутинг(quagga), NAT, firewall.
Платформа:
i386 поддерживающая USB-HDD и соответственно загрузку с него, загрузочная FLASH-USB 128 Мб
(я думаю можно и на меньшую установить, зависит от задач), 128 Мб оперативной памяти.
Установка:
Все бесхитростно, но желательно иметь "тестовый стенд", т.е. систему установленную на
жесткий диск, зачем, будет понятно ниже. Вставляю диск с инсталляцией в CD привод,
FLASH-USB соответственно в USB разъем. Дальше устанавливаю систему на sd0 (у меня так определилась FLASH-USB).
При установке выбираю Install to hard disk, далее Custom installation. В разделе
The following is the list off distribution sets that will оставляю
yes на пунктах:
Kernel (GENERIC)
Base
System (/etc)
а
X11 sets переключаем в
none.
Стараюсь уменьшить колличество устанавливаемого ПО на Flash носитель.
При определении геометрии диска соглашаюсь с BIOS.
Далее выбираю
Edit the MBR partition table.
При дальнейшем определении разделов весь объем Flash носителя отдаю под раздел a:,
b: - (swap) no,
tmp - 0
/usr - 0
/var - 0
/home - 0
Дальше нет смысла описывать, стандартная процедура.
Вот и получили готовую систему.
Установка ПО:
Дальше немножко ее модернизирую, ну нравится мне, bash и mc.
На тестовом стенде определяю зависимости для bash и mc с помощью ldd:
root@difficulty:/usr/pkg/bin>ldd mc
mc:
-lintl.0 => /usr/lib/libintl.so.0
-lglib-2.0.0 => /usr/pkg/lib/libglib-2.0.so.0
-lm.0 => /usr/lib/libm387.so.0
-lm.0 => /usr/lib/libm.so.0
-ltermcap.0 => /usr/lib/libtermcap.so.0
-lslang.1 => /usr/pkg/lib/libslang.so.1
-lc.12 => /usr/lib/libc.so.12
root@difficulty:/usr/pkg/bin>ldd bash
bash:
-lreadline.5 => /usr/pkg/lib/libreadline.so.5
-lhistory.5 => /usr/pkg/lib/libhistory.so.5
-ltermcap.0 => /usr/lib/libtermcap.so.0
-lintl.0 => /usr/lib/libintl.so.0
-lc.12 => /usr/lib/libc.so.12
На самом деле для mc понадобятся сам
/usr/pkg/bin/mc, две либы и два линка на них из
/usr/pkg/lib
libglib-2.0.so.0 -> libglib-2.0.so.0.1000.0
libglib-2.0.so.0.1000.0
libslang.so.1 -> libslang.so.1.0.4
libslang.so.1.0.4
Для bash понадобятся сам
/usr/pkg/bin/bash, две либы и два линка на них из
/usr/pkg/lib
libhistory.so.5 -> libhistory.so.5.0.1
libhistory.so.5.0.1
libreadline.so.5 -> libreadline.so.5.0.1
libreadline.so.5.0.1
Далее на тестовом стенде:
mount /dev/sd0a /mnt
mkdir /mnt/usr/pkg/lib/
mkdir /mnt/usr/pkg/bin/
mkdir /mnt/usr/pkg/sbin/
mkdir /mnt/usr/pkg/etc/
mkdir /mnt/usr/pkg/share/
Для bash и mc:
cp /usr/pkg/lib/libglib-2.0.so.0 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libglib-2.0.so.0.1000.0 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libslang.so.1 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libslang.so.1.0.4 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libhistory.so.5 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libhistory.so.5.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libreadline.so.5 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libreadline.so.5.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/bin/mc /mnt/usr/pkg/bin/
cp /usr/pkg/bin/bash /mnt/usr/pkg/bin/
в
/etc/shells добавляю строчку
/usr/pkg/bin/bash
Так же мне понадобились snmp и zebra(quagga), провожу аналогичную процедуру с ldd и для них, в результате.
Для snmp:
cp /usr/pkg/lib/libnetsnmp.so.10 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmp.so.10.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmpagent.so.10 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmpagent.so.10.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmphelpers.so.10 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmphelpers.so.10.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmpmibs.so.10 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libnetsnmpmibs.so.10.0.1 /mnt/usr/pkg/lib/
cp /usr/pkg/sbin/snmpd /mnt/usr/pkg/sbin/
cp /etc/rc.d/snmpd /mnt/etc/rc.d/
cp /usr/pkg/etc/snmpd.conf /mnt/usr/pkg/etc/
в
/etc/rc.conf добавляю строчку:
snmpd=YES
Забегая вперед, после эксперементального запуска оказалась необходимой и содержимое
директории
/usr/pkg/share/snmp, соответственно:
mkdir /usr/pkg/share/snmp
cp -R /usr/pkg/share/snmp/* /mnt/usr/pkg/share/snmp/
Для zebra
cp /usr/pkg/lib/libzebra.so.0 /mnt/usr/pkg/lib/
cp /usr/pkg/lib/libzebra.so.0.0.0 /mnt/usr/pkg/lib/
cp /usr/pkg/sbin/zebra /mnt/usr/pkg/sbin/
cp /etc/rc.d/zebra /mnt/etc/rc.d/
mkdir /mnt/usr/pkg/etc/zebra/
cp /usr/pkg/etc/zebra/zebra.conf /mnt/usr/pkg/etc/zebra/
в
/etc/rc.conf добавляю строчку:
zebra=YES и
zebra_flags="-P 2601"
В дополнении приведу все конфиги которые у меня работают.
Оптимизация:
Далее гружусь с FLASH-USB.
Конечно, оптимизировать можно до бесконечности, как один из вариантов, удалять не нужные компаненты.
Я всего лишь "засунул" в mfs /dev, /var, /tmp.
Для /dev, я уже не помню где вычитал метод, но признаюсь придумал не сам:
cp /dev/MAKEDEV /etc/
cp /dev/MAKEDEV.local /etc/
rm -R /dev/*
shutdown -r now
и как результат:
mfs:17 on /dev type mfs (synchronous, local)
Для /tmp:
rm -R /tmp/*
правим fstab:
mfs /tmp mfs rw,-s=10m
Для /var ситуация чуть сложнее, делаю следующее:
mkdir /img
rm -R /var/run/*
tar -czf /img/var.tgz /var
правлю fstab:
mfs /var mfs rw,-s=10m
в
/etc/rc.d/ ложу скрипт
make_var (содержимое скрипта см. ниже)
в
/etc/rc.conf добавляю строчку:
make_var=YES
в
/etc/rc.d/ttys в разделе
# REQUIRE: добаваляю make_var, в результате
# REQUIRE: root make_var
Теперь посмотрим внимательно на /etc/rc.d/mountcritlocal в этом скрипте с легкостью можно
убрать строки, т.к. /var/run/ в памяти и при размонтировании автоматически уничтожается:
rm -f /etc/nologin /var/spool/lock/LCK.* /var/spool/uucp/STST/*
(cd /var/run && rm -rf -- *)
Теперь относительно ipfilter и ipnat, приведу пример самого простейшего варианта:
добавляю в
/etc/sysctl.conf
net.inet.ip.forwarding=1
правлю
/etc/ipf.conf,
/etc/ipnat.conf (см. ниже), и при загрузке получаю ошибку,
которая лечится изменением
/etc/rc.d/ipfilter в разделе
ipfilter_prestart() {....... надо добавить строки:
pwd_temp=`pwd`
cd /dev
/etc/MAKEDEV ipl
cd ${pwd_temp}
Теперь ядро, компилю на тестовом стенде сжимаю и переливаю на FLASH-USB, вот и вся процедура
Можно при желании исправить fstab чтобы root монтировался в ro.
Вот наверное и все изменения, конечно пределу совершенства нет, я уже не описываю ротацию с
уничтожением логов, удаление ненужных бинарников в каждом случае это может варироваться.
Могу сказать только, что проверено все роутится и натится, а дальше у кого какая фантазия.
Дополнительно:
rc.conf
if [ -r /etc/defaults/rc.conf ]; then
. /etc/defaults/rc.conf
fi
hostname="difficulty"
rc_configured=YES
wscons=YES
no_swap=YES
ifconfig_fxp0="inet 10.1.1.173 netmask 255.255.255.0"
sendmail=NO
inetd=NO
cron=NO
ccd=NO
raidframe=NO
cgd=NO
clear_tmp=NO
quota=NO
make_var=YES
snmpd=YES
zebra=YES zebra_flags="-P 2601"
update_motd=NO
ipfilter=YES
ipnat=YES
fstab
/dev/sd0a / ffs ro 1 1
kernfs /kern kernfs rw
procfs /proc procfs rw,noauto
mfs /tmp mfs rw,-s=10m
mfs /var mfs rw,-s=10m
shells
/bin/sh
/bin/csh
/bin/ksh
/bin/bash
syslog.conf
# $NetBSD: syslog.conf,v 1.9 2004/07/23 03:45:42 mycroft Exp $
*.err;kern.*;auth.notice;authpriv.none;mail.crit /dev/console
*.info;auth,authpriv,cron,ftp,kern,lpr,mail.none /var/log/messages
kern.debug /var/log/messages
auth,authpriv.info /var/log/authlog
*.emerg *
*.notice /var/log/messages
resolv.conf
nameserver 10.100.10.1
sysctl.conf
net.inet.ip.forwarding=1
zebra.conf
hostname Router
password ----------------
enable password -----------------
log file /var/log/zebra.log
service password-encryption
no banner motd
!
interface fxp0
ip address 10.1.1.173/24
ipv6 nd suppress-ra
!
interface lo0
!
interface rtk0
ip address 10.100.80.1/24
ipv6 nd suppress-ra
!
ip route 0.0.0.0/0 10.100.10.1
!
!
line vty
access-class term
exec-timeout 30 0
!
ipfilter
#!/bin/sh
#
# $NetBSD: ipfilter,v 1.14 2004/12/23 03:31:54 lukem Exp $
#
# PROVIDE: ipfilter
# REQUIRE: root beforenetlkm mountcritlocal tty
$_rc_subr_loaded . /etc/rc.subr
name="ipfilter"
rcvar=$name
start_precmd="ipfilter_prestart"
start_cmd="ipfilter_start"
stop_precmd="test -f /etc/ipf.conf -o -f /etc/ipf6.conf"
stop_cmd="ipfilter_stop"
reload_precmd="$stop_precmd"
reload_cmd="ipfilter_reload"
resync_precmd="$stop_precmd"
resync_cmd="ipfilter_resync"
status_precmd="$stop_precmd"
status_cmd="ipfilter_status"
extra_commands="reload resync status"
ipfilter_prestart()
{
pwd_temp=`pwd`
cd /dev
/etc/MAKEDEV ipl
cd ${pwd_temp}
if [ ! -f /etc/ipf.conf ] && [ ! -f /etc/ipf6.conf ]; then
warn "/etc/ipf*.conf not readable; ipfilter start aborted."
...........
..........
...........
ipfilter_status()
{
/sbin/ipf -V
}
load_rc_config $name
run_rc_command "$1"
make_var
#!/bin/sh
#
# $NetBSD: make_var,
#
# PROVIDE: make_var
# REQUIRE: mountcritlocal
. /etc/rc.subr
name="make_var"
start_cmd="make_var_start"
stop_cmd=":"
make_var_start()
{
tar -xzf /img/var.tgz -C /
}
load_rc_config $name
run_rc_command "$1"
mountcritlocal
#!/bin/sh
#
# $NetBSD: mountcritlocal,v 1.8 2004/08/13 18:08:03 mycroft Exp $
#
# PROVIDE: mountcritlocal
# REQUIRE: root
$_rc_subr_loaded . /etc/rc.subr
name="mountcritlocal"
start_cmd="mountcritlocal_start"
stop_cmd=":"
mountcritlocal_start()
{
# Mount critical filesystems that are `local'
# (as specified in $critical_filesystems_local)
# This usually includes /var.
#
mount_critical_filesystems local
# clean up left-over files.
# this could include the cleanup of lock files and /var/run, etc.
#
#!!!!!!!!! rm -f /etc/nologin /var/spool/lock/LCK.* /var/spool/uucp/STST/*
#!!!!!!!!! (cd /var/run && rm -rf -- *)
}
load_rc_config $name
run_rc_command "$1"
snmpd
#!/bin/sh
#
# $NetBSD: snmpd.sh,v 1.4 2004/05/31 11:47:29 tron Exp $
#
# PROVIDE: snmpd
# REQUIRE: DAEMON
if [ -f /etc/rc.subr ]; then
. /etc/rc.subr
fi
name="snmpd"
rcvar=$name
command="/usr/pkg/sbin/${name}"
pidfile="/var/run/${name}.pid"
snmpd_flags="-Ls d" # log using syslog LOG_DAEMON
command_args="-p ${pidfile}"
if [ -f /usr/pkg/etc/snmpd.conf ]; then
command_args="${command_args} -c /usr/pkg/etc/snmpd.conf"
fi
if [ -f /etc/rc.subr -a -f /etc/rc.conf -a -f /etc/rc.d/DAEMON ]; then
load_rc_config $name
run_rc_command "$1"
else
echo -n " ${name}"
${command} ${snmpd_flags} ${command_args}
fi
ttys
#!/bin/sh
#
# $NetBSD: ttys,v 1.6 2004/11/10 05:04:51 christos Exp $
#
# PROVIDE: tty
# REQUIRE: root make_var
..............
..............
..............
zebra
#!/bin/sh
#
# zebra is the head of the quagga routing beast
#
# PROVIDE: zebra
# REQUIRE: NETWORKING
##
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/pkg/sbin:/usr/pkg/bin
export PATH
..............
..............
..............