Эта страница дорабатывается This page is under construction

Инсталляция FreeBSD в качестве Internet-сервера



Много чего написано про инсталляцию Windows от 3.* до NT; немного меньше - про инсталляцию OS/2, а вот детальное описание инсталляции Unix я не встречал. Попробую рассказать, как установить и настроить FreeBSD. Это - мой личный опыт, так что возможны расхождения во мнениях с гуру, а также пробелы, тем более что многие вещи я пишу прямо по горячим следам: сделал, понял - и сразу на всеобщее обозрение. :-)

Я работаю в условиях, когда я - единственый администратор на машине, на которой нет никакой особо секретной информации. Вокруг меня нет серьезных хакеров (по крайней мере они себя никак не проявляют). Основная задача - обеспечить почту, в основном по UUCP. Это накладывает некоторый отпечаток на мои воззрения по поводу администрирования.

А почему именно FreeBSD?

Я наконец проникся уверениями Micro$oft, BSA и прочих серебролюбивых организаций, что нехорошо использовать ворованное ПО - это аморально, преступно, а также невыгодно. Из бесплатных OS мне известны три Unix'а - FreeBSD, Linux и SCO (последний - только для некоммерческого использования), а также Acorn'овская RiscOS. Но RiscOS идет только на RISC-процессорах ARM, а из Unix'ов я лучше всего знаю FreeBSD.

Какую машину мне приготовить для FreeBSD?

В отличие от WindowsNT, которая требует Pentium и 16 MB RAM, для работы Internet-сервером вполне достаточно 486SX-33 и 8 MB RAM. Операции с плавающей точкой серверу не нужны, быстродействие определяется не процессором, а пропускной способностью сети, а графическая карта сойдет самая слабая, какая только есть - все равно он будет работать в текстовом режиме. Мышь, кстати, тоже не нужна. Так что, как видите, использовать легальное ПО действительно дешевле, чем цельнотянутое.

Обьем диска:

С каких носителей его можно инсталлировать?

FreeBSD можно инсталлировать с дискет (классический способ), с FAT-раздела, с FreeBSD-раздела, с CD-ROM (ну, это нынче все могут), со стримера (у меня его никогда не было), а также по сети: по NFS и по FTP (обычному и сквозь FireWall). Как правило, на CD-ROM не самая свежая версия, с дискет довольно мучительно, для инсталляции с FreeBSD-раздела нужно иметь дистрибутив, записанный на этот раздел (а значит, иметь установленный FreeBSD). NFS вообще используется довольно редко, по крайней мере для NFS, как и для FreeBSD-раздела надо иметь уже установленный Unix, Так что остаются FAT-раздел и FTP. Для FTP нужно иметь быструю, а главное - стабильную связь с FTP-сервером, поэтому для первой инсталляции рекомендую закачать FreeBSD на FAT-раздел локального диска. Это отрежет часть места на диске, но потом можно будет снести FAT-раздел и сделать на его месте что-нибудь полезное или же держать его для загрузки в DOS.

На каких именно серверах можно взять FreeBSD?

Для получения списка серверов обратитесь на http://www.freebsd.org/; в России - ftp://ftp.ru/, ftp://ftp.kiae.su/ и ftp://ftp.gamma.ru/. К сожалению, ftp.gamma.ru не позволяет анонимный вход, если ваша машина не известна ReverseDNS-серверу, отвечающему за вашу зону IP-номеров; так что если вы только собираетесь строить свою Internet-сеть на базе FreeBSD, то это место не самое удачное.

Что именно закачивать?

Сначала надо подготовить директории:

	mkdir /FreeBSD
	cd /FreeBSD
	mkdir bin
	mkdir floppies
Вот мы и создали основные директории. Если думаете брать еще что-нибудь, выясняйте, где оно лежит и действуйте аналогично.

Запускаем FTP-клиента:

	ftp ftp[номер][.страна].freebsd.org
Я не оговорился - все FTP-серверы, содержащие FreeBSD, прописаны в домене freebsd.org. Узнать, какой ближе, можно командой
	ping ftp[номер][.страна].freebsd.org
по принципу наименьшего времени отклика и наибольшего процента возвращенных пакетов. Сервер спросит login: и Password:
	login: ftp
	Password: имя@
- обычный анонимный вход на FTP-сервер. Дальше
	cd pub/FreeBSD/версия-RELEASE
Вопрос о версии требует отдельного рассмотрения. К сожалению, 2.2.1 и 2.2.2 мне не понравились - похоже, там что-то намудрили и они работают нестабильно. Пришлось вернуться к 2.1.7.1, а ее удалось найти только на ftp.freebsd.org - на ftp.kiae.su и ftp.gamma.ru ее уже не было, там держат только последние версии. Включаем режим перекачки двоичных (нетектовых) файлов
	bin
и визуального отображения закачанных килобайтов
	hash
отключим вопросы про каждый файл "это брать?"
	prompt

Далее:

	cd bin
	lcd bin
	mget *.*
	lcd ..
	cd ..
Для минимальной инсталляции надо взять все в директории bin. Там находятся файлы bin.?? (от bin.aa до bin.cq - последний зависит от версии), bin.mtree, checksum.md5 и install.sh - всего 17 MB. Если процесс оборвался, допустим, на файле bin.ai, не надо качать все заново, можно продолжить командой
	mget bin.a[i-z] bin.[bc]? bin.mtree checksum.md5 install.sh
Впрочем, это все относится к командной строке FTP, к тому же операционные системы Micro$oft в командах "lcd" вместо "/" используют "\". Если у вас FTP-программа работает по другому - делайте сами.

	cd floppies
	lcd floppies
	get boot.flp
	lcd ../tools
	cd ../tools
	get rawrite.exe
	quit
boot.flp - образ загрузочной инсталляционной 1.44 MB дискеты (естественно, надо иметь такой дисковод). Прежние версии обходились дискетой 1.2 MB. Впрочем, возможно, удастся впихнуть ядро на 5.24"-дискету, отформатировав ее на 1.44 rawrite.exe - программа под DOS, способная сделать из форматированной дискеты и файла boot.flp загрузочную дискету. Теперь минимальная инсталляция (впрочем, это не так мало) находится на нашем диске. Там же в tools есть еще много иногда полезного, описанного в 00_index.txt, берите, если хочется. Изготовим загрузочную дискету:
	rawrite.exe boot.flp a:
Теперь загрузимся с нее. Будет много непонятных сообщений - не пугайтесь "not found" или "conflict with" - ядро содержит множество драйверов для самых разных устройств, большая часть которых у вас отсутствует (ну действительно, откуда взяться на машине десятку сетевых карт разных производителей?). Основная проблема может быть с NE1000/NE2000-совместимыим и 3Com 3C503 картами - устройство ed0 расчитывает на Port 280 и IRQ 5, ed1 - Port 300 и IRQ 5. Впрочем, перед стартом ядро предлагает научить его работать с другими портами и прерываниями, но я предпочел переставить параметры карты (перемычками на карте или программой-настройщиком), так как считаю, что аппаратуру конфигурировать проще, чем программу.

Надеюсь, вы заранее подготовили свободное место на диске для FreeBSD-раздела? Если нет, и к тому же у вас только одна партиция, придется вернуться в DOS, стереть лишнее, дефрагментировать диск и воспользоваться программой fips.exe (лежит рядом с rawrite.exe), чтобы освободить место. (При этом размер кластера на FAT-разделе останется прежним.)

Первое, что надо сделать - создать раздел на диске. Создадим FreeBSD-партицию (в терминах Unix она называется slice, а partition - подраздел внутри slice) на все свободное место либо, если свободное место не непрерывно, на самый большой непрерывный кусок. Затем надо создать подразделы. Я рекомендую такую схему:

	/ (корень) - от 16 до 32 MB
	/usr (системные программы и данные для них) - от 50 MB
	swap (область подкачки) - см.ниже
	/var (рабочие файлы) - порядка 30 MB
	/home (домашнии директории пользователей) - остальное
Конкретные значения сильно зависят от размера диска. Рекомендуемое значение для / составляет 20 MB, если меньше - sysinstall будет возмущаться; ну и пусть, ничего страшного. /usr должна соответствовать обьему инсталлируемого, при выборе distribution можно уточнить, сколько именно понадобится и отвести раза в полтора больше. swap зависит не столько от обьема диска, сколько от количества оперативной памяти и должен превышать ее в два..пять раз (в пять раз - с учетом возможного наращивания памяти). Если хотите, чтобы FAT-раздел был доступен из Unix, надо указать точку монтирования для него, обычно - /dos.

После того, как вы дали приказ начать инсталляцию и отказались от последнего шанса спасти информацию на том месте, которое отвели под FreeBSD, будет долгое извлечение из архива и размещение на диске. Можно пока нажать Alt+F2 - посмотреть как идет извлечение, Alt+F4 - подать какую-нибудь команду (ой, лучше не делайте этого) и Alt+F1 - вернуться обратно.

Теперь, если все закончилось удачно, зайдем в пост-конфигурирование. Если вы проводили инсталляцию по сети, то сетевой интерфейс должен быть уже сконфигурирован, иначе лучше честно ответить на вопросы о конфигурации сетевого интерфейса. Если у вас есть подключение к Internet, адреса должен дать провайдер или местный сетевой администратор, если же это чисто внутренняя сеть - воспользуйтесь адресом из множества, отведенного под внутрикорпоративные сети, например 192.168.0.1 и маской 255.255.255.0. Если есть подключение, желательно сконфигурировать анонимный FTP-доступ, если есть внутренняя сеть - неплохо покажет себя Samba (файл-сервер для Micro$oft Network по протоколу TCP/IP). И наконец, весьма здорово сделать WWW-сервер на базе Apache! Я даже не ожидал, что это будет так легко.

И как мне пользоваться этой системой дальше?

После выхода из программы инсталляции система должна загрузиться с жесткого диска. Снова будут те же самые сообщения "not found" и "conflict with". Как-то раз у меня не пошла загрузка сразу после инсталляции (система висла), но вместо того, чтобы устанавливать все заново, я на приглашение загрузчика ввел

	Boot: kernel.GENERIC
и вместо того, чтобы грузиться с основного ядра /kernel, загрузился с его копии /kernel.GENERIC. Затем вошел без пароля:
	login: root
и скопировал хорошее ядро на место плохого:
	cp /kernel.GENERIC /kernel
Дальнейшие действия проходят под китайским лозунгом "три дня труда - десять лет счастья". :-) Бороться придется по большей части врукопашную. Для начала возьмем на ftp://ftp.kiae.su/pub/FreeBSD/local deco*bin.tgz. Закинуть его можно в любую директорию, я предпочитаю в /dos (на случай переустановки) или /var (не засорять же / и /usr); желательно недалеко от корня, иначе долго будет добираться. Инсталлируем
	pkg_add deco*bin.tgz
Если deco*bin.tgz не в текущей директории, придется указывать полный путь. Почему-то авторы решили, что запускаемый файл лучше поместить в /usr/local/bin/, но я предпочел переместить его
	mv /usr/local/bin/deco /usr/bin/deco
Хотя директория /usr/bin/ по умолчанию прописана в переменной окружения PATH, мне пришлось выйти из системы (Ctrl+D) и войти снова, чтобы можно было запускать deco без указания полного пути.

Теперь deco запускается, но - вот ужас! - он черно-белый, вместо псевдографики - "|", "-" и "+", не работают клавиши с F5 до F10. Надо править файлы /etc/ttys и /etc/termcap. С /etc/ttys довольно просто:

	ttyvN	"/usr/libexec/getty Pc" 	pc3r	on secure
где вместо "N" надо подставить номера консолей (мне хватает с 0 по 5). Не забудьте создать файлы виртуальных консолей
	mknod /dev/ttyvN c 12 N

С /etc/termcap несколько сложнее. Во первых, он хранится не в /etc/, а в /usr/share/misc/; /etc/termcap - символьный линк к реальному файлу (обозначается /etc/termcap -> /usr/share/misc/). А мы сотрем его и сделаем другой, на тот termcap, который пришел с deco:

	rm /etc/termcap
	ln -s /usr/lib/deco/termcap /etc/termcap
Но этого мало, надо его поправить:
	# Standard Xenix console.
	# It is not true ansi, but has been hacked for dumb users.
	ansi|xenix|pc3r|cons25r:\
		:g1=\240\241\253\273\256\261\276\265\245\270\250:\
		:C2:Nf#16:Nb#8:Mf=042615378CAE9DBF:Mb=04261537:\
		:Cf=\E[%p1%{8}%/%d;3%p1%{8}%m%d;4%p2%dm:fs=\E[m:\
		:kI=\E[L:kH=\E[F:kd=\E[B:kN=\E[G:kl=\E[D:\
		:kr=\E[C:kh=\E[H:ku=\E[A:kP=\E[I:kD=\177:\
		:f1=\E[M:f2=\E[N:f3=\E[O:f4=\E[P:f5=\E[Q:\
		:f6=\E[R:f7=\E[S:f8=\E[T:f9=\E[U:f0=\E[V:tc=ansi:

	vt100:gs=\E(0:ge=\E(B:g1=-|+\136+}+{+++:\
		:f0=\EOp:f1=\EOq:f2=\EOr:f3=\EOs:f4=\EOt:f5=\EOu:f6=\EOv:\
		:f7=\EOw:f8=\EOx:f9=\EOy:kh=\EOP:kD=\177:kb=\008:\
		:md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m:tc=vt100:
Некоторые пояснения: Вообще, читайте руководство - команда
	man termcap 5
(если вы установили manual pages) содержит по этому поводу все, что я знаю, и все остальное. "5" означает, что manual page будет браться из каталога man5; иначе будет взята первая попавшаеся, а именно 3-я, в которой описаны вызовы библиотеки termcap.

Но псевдографика же соответствует Alt-кодировке, а не KOI-8?

В Internet принята кодировка KOI-8 - кодировка Unix и Acorn, кодировка E-mail, FTP и Usenet (News). (WWW/HTTP, как правило, в многокодовой форме). Поэтому обратимся к /etc/sysconfig для версий до 2.1.* или /etc/rc.conf для версий, начиная с 2.2.*. Этот файл - всего лишь запускаемый (исполняемый), да и не делает ничего, кроме определения переменных, которые будут использоваться в /etc/rc и запускаемых из него /etc/rc.* и /etc/netstart. Если интерсно, как именно:
	grep имя_переменной /etc/sysconfig /etc/rc.* /etc/netstart

Ну да ладно, вернемся к проблеме русификации. В комментариях к переменным написано много интересного, позволяющего разобраться, что с этой переменной делать и какие значения она может принимать. Вот так я настраиваю клавиатуру:

	keymap="ru.koi8-r"
	keyrate="fast"
	keychange="NO"
	cursor="blink"

Русификацию экрана можно провести двумя путями: загрузить шрифты KOI-8 или загрузить шрифты Alt и карту перекодировки. Разница в том, что символы Alt-псевдографики отображаются видеоконтроллером с расширением на один столбец вправо, из-за чего горизонтальные линии в KOI-8 получаются разрывными (как будто использовались знаки равенства "="). Но а предпочел KOI-8:

	scrnmap="NO"
	font8x16="koi8-r-8x16"
	font8x14="NO"
	font8x8="NO"
	blanktime="NO"
	saver="NO"

Для того, чтобы эти изменения возымели действие, надо перезагрузить систему. Опытный администратор часто может произвести настройку без этого, но надо убедиться, что при последующих включениях машины все будет нормально.

	reboot

Дальнейшие действия?

Советую слинковать некоторые директории. Некоторые программы почему-то считают, что spool/ должен находиться в /usr/, а mail/ - в spool/

	ln -s /var/spool /usr/spool
	ln -s /var/mail /var/spool/mail
Почему-то стартовые скрипты должны находиться в /usr/local/etc/rc.d, в то время как я считаю, что /usr вообще должна быть read-only
	mkdir /etc/rc.d
	mv /usr/local/etc/rc.d/* /etc/rc.d
	rmdir /usr/local/etc/rc.d
	ln -s /etc/rc.d /usr/local/etc/rc.d

А где брать серверы DNS, FTP, Samba и Apache?

Серверы DNS и FTP присутствует в минимальной поставке. Кстати, анонимный FTP доступ надо конфигурить (создать пользователя FTP, в поле пароля прописать "*" и назначить ему домашнюю директорию), а вот парольный действует автоматически, используя ту же базу данных, что и терминальный доступ. А для Samba и Apache достаточно просто сменить Media - указать в качестве источника FTP-сервер. Packages (в это понятие входят множество программ) редко превышают 1.5 MB, так что их можно инсталлировать даже по сети из США, что я и делал. Впрочем, Apache лучше взять русский (об этом далее).

Как администрировать юзеров и регулировать доступ к файлам?

Для этого есть специальные утилиты, например, adduser. Но эти утилиты слишком умные: например, копируют стандартные инициализационные файлы в домашнюю директорию пользователя, а я считаю, что сам могу решить, что надо копировать, а что - нет.

Базовый файл - /etc/master.passwd, из него получаются /etc/passwd (общедоступный список пользователей), /etc/spwd.db (база пользователей) и /etc/pwd.db (база паролей). Для добавления и удаления юзеров, а также для изменения некоторых параметров можно использовать команду vipw (как следует из ее названия, она запускает редактор vi или другой, если установлена переменная окружения EDITOR).

Но я предпочитаю deco, а затем даю команду pwd_mkdb master.passwd. (Внимание - это можно делать только если гарантируется, что никто другой не будет редактировать файл в это время! vipw блокирует запуск другого экземпляра этой (но не другой) программы администрирования юзеров.)

В файле master.passwd на каждого юзера отведено по одной строке. Каждая строка состоит из полей, разделенных двоеточием:

Имя пользователя задействовано во множестве мест, в т.ч. в терминальном входе (при работе на машине с Unix как на рабочей станции), в почтовом обмене (как имя отправителя и получателя), а также в доступе по FTP и Samba. Во всех случаях используется один и тот же пароль.

Пароль шифруется алгоритмом, который не позволяет расшифровать обратно, а при входе в систему сравниваются зашифрованный пароль из базы паролей и свежезашифрованный введенный пользователем пароль. Сменить пароль можно командой passwd имя_юзера; если дать просто команду passwd, это относится к тому имени, под которым сейчас работаем; обычный юзер (не супервизор) должен сначала ввести старый пароль, и если система сочтет его пароль недостаточно секретным (слишком короткий, содержит только строчные буквы), то не примет его. Пароль надо вводить дважды, причем вслепую - обычные меры безопасности, принятые нынче во всех системах.

Пустой пароль при шифрации превращается в пустую строку, так что если надо убрать пароль, нужно стереть его ручками (ввод пустого пароля рассматривается как отказ от изменений). Никакой пароль не превращается в звездочку "*", это используется как запрет входить под таким именем.
Отсутствие пароля (пустой пароль) приводит к отказу некоторых особо осторожных сервисов работать с этим пользователем.

UID идентифицирует права пользователя на файлы и процессы (а не имя!). Таким образом, второй account с тем же UID будет лишь alias для первого (т.е. оба account'а будут иметь идентичные права). /* Переводите с английского сами, я не могу. */ Этот UID будет присвоен всем файлам и директориям, созданным юзером. Изменить UID файла может только супервизор (пользователь с UID=0).

GID также будет присвоен всем файлам и директориям, созданным юзером. Юзер может входить в несколько групп, если это прописано в /etc/group.

Со следующими тремя полями я не разбирался.

Комментарий используется в строке "From:" в письмах, отправляемых командой mail, сообщается командой finger.

Домашняя директория становится текущей и записывается в переменную HOME при терминальном входе, в ней лежат настроечные файлы ко многим программам. Также является корневой при подключении по Samba ресурса homes.

Shell - для терминальных пользователей как правило /bin/sh, /bin/csh или /bin/bash. Для почтового обмена по UUCP - /usr/libexec/uucp/uucico. Для тех, кому надо предоставить только специфический доступ (например, POP3 и Samba) ставится /usr/bin/passwd и единственной возможностью при входе терминалом или по Telnet для них будет смена пароля. Для пользователей, которые никогда не будут работать (т.н. псевдопользователей) ставится несуществующий /none или безобидный /bin/false.

Если shell, указанный пользователю, не прописан в файле /etc/shells, то многие сервисы (например, ftpd и pcnfsd) будут рассматривать такого пользователя как нежелательного.

Что можно порекомендовать в плане администрирования?

Прежде всего не надо использовать имя root. К сожалению, его нельзя удалить, слишком во многих местах оно задействовано. Поэтому я делаю

	root:*:0:0::0:0:SysMaster:/none:/none
т.е. у него нет ни пароля, ни домашней директории, ни shell'а. Изначально во FreeBSD создается еще пользователь toor, который может заменить собой root, но я предпочитаю использовать какое-нибудь третье имя. Если же вы решили сохранить имя root, то по крайне мере надо установить ему пароль (при установке этот пользователь создается без пароля).

Если на машине несколько администраторов, то им лучше каждому иметь свой супервизорский account на случай если один вдруг решит сменить пароль. Вообще надо время от времени менять свой пароль, но я не буду вдаваться в подробности. Главное, на мой взгляд - не дать мерам безопасности мешать нормальной работе.

Супервизору запрещен удаленный вход (по Telnet и FTP). Если надо удаленно администрировать систему, входите под обычным именем и давайте команду su имя_супервизора. Однако делать это могут только те, кто явно включен в нулевую группу (wheel). Вообще лучше поменьше времени проводить под правами супервизора - меньше вероятность повредить систему.

Администрирование групп сильно зависит от задач, возлагаемых на систему. Этот аспект тоже администрирования подробно описан в литературе, а у меня на данный момент не так уж много пользователей, чтобы я успел накопить опыт.

Какие особенности настройки Samba?

Настройка Samba заключена в файле /usr/local/samba/lib/smb.conf или в /usr/local/etc/smb.conf, на всякий случай я залинковал их и у меня это как бы один файл. Вот он:

	[global]
		comment = FreeBSD - Samba %v
		log file = /var/log/samba.log
		dont descend = /dev,/proc,/root,/stand
		printing = bsd
		map archive = no
		status = yes
		public = yes
		read only = no
		PREserve case = yes
		strip dot = yes
		security = share
		workgroup = Unix

	[homes]
		browseable = Yes
		comment = %U's Home Directory
		create mode = 0664
		public = no
		mangled map = (*.html *.htm) (*;1 *)

	[pub]
		browseable = Yes
		path = /var/ftp/pub
		comment = Public domain
		public = yes
		read only = yes
Комментарии к этому файлу даст команда man smb.conf, а я пока лишь замечу, что к этой машине не подключен принтер (соответственно нет секции [printers]), а в качестве публично доступной директории используется та же самая, что и по FTP.

Какие особенности настройки Apache?

При изучении Apache я использовал два источника: сервер поддержки русского Apache apache.lexa.ru Алекса Тутубалина и книгу Бена и Петера Лори "Apache: установка и использование" (изд-во Питер-Пресс).

Начать лучше с сервера, там по русски изложена процедура начальной инсталляции. Замечу только, что в файле Configuration закомментарена строка, отвечающая за присоединение модуля Proxy, так что из-за этого когда я решил все-таки установить Proxy, мне пришлось перекомпилировать Apache еще раз.

Дальнейшие сложности настройки связаны как с большими возможностями протокола HTTP, так и с большими возможностями самогО Apache.

Собственно использование русского Apache связано с поддержкой нескольких русских кодировок. Приведу куски файла httpd.conf, отвечающие за это:

	Port 80
	CharsetDecl koi8-r ru
	CharsetDecl windows-1251 ru
	#Перекодировка KOI<->KOI не нужна
	CharsetRecodeTable koi8-r windows-1251 conf/koi-win.tab
	CharsetAlias windows-1251 win1251 win x-cp1251 cp1251 cp-1251
	CharsetAlias koi8-r koi8r koi-8-r koi8 koi-8 koi
	CharsetPriority koi8-r windows-1251 ISO-8859-5 ibm866 x-mac-cyrillic
	CharsetDefault koi8-r
	CharsetSourceEnc koi8-r
	CharsetSelectionOrder Portnumber Hostname Dirprefix Useragent
	CharsetMatchLanguage off
	CharsetRecodeFilenames Off
	Listen 80
	Listen 8000
	Listen 8001
	CharsetByPort koi8-r 8100
	CharsetByPort windows-1251 8101
Я избрал перекодировку по номеру порта; кодировка на сервере - KOI-8; при заходе по порту :80 выдается кодировка, запрошенная браузером. На сАмом деле у меня поддерживаются все пять кодировок, но здесь приведен пример для двух - KOI-8 и Windows1251.

А почему она так долго загружается? Нельзя ли быстрее?

Основное время тратится на неудачные попытки лишних драйверов найти несуществующие устройства. Все драйверы жестко вшиваются в ядро (хотя есть loadable kernel modules, это мало меняет суть дела). FreeBSD начиная с 2.1.6 имеет модуль предзагрузочной конфигурации: можно указать Port и IRQ устройства или вообще отключить его. Измененные значения фиксируются и это сильно ускоряет загрузку, но драйверы все равно занимают место в файле и на диске, поэтому если хочется, чтобы машина работала более эффективно, придется перекомпилировать ядро. Это не требует писать программы, надо только указать компилятору, какие именно части надо включить в ядро.

Со страхом и трепетом я приступил в первый раз к перекомпиляции ядра. На всякий случай позвал на помощь товарища. Тот, правда, видел Unix второй раз в жизни, но "кто умеет - делает, а кто не умеет - советует". :-) Еще говорят, что "кто совсем не умеет - учит", но я, как видите, делал, а теперь учу. :-) Кстати, его советы оказались неплохими, по крайней мере в части перевода с английского и в понимании логики конфигурирования.

Для начала надо получить ftp.freebsd.org/pub/FreeBSD/версия-RELEASE/src/ssys.*, обычно я кладу их на DOS-раздел в \FreeBSD\src\, рядом с bin. Теперь их надо извлечь. Маленькая тонкость - по умолчанию /sys -> /usr/src/sys, а я не хочу кидать исходники ядра в /usr. Поэтому

	mkdir /var/src /var/src/sys
	ln -s /var/src /usr/src
	cat .../src/ssys.?? | tar --unlink -xvpzf - -C /
Последнюю строчку я почти не раздумывая взял из .../bin/install.sh. При этом извлекается исходник ядра с кучей драйверов, часть из которых прописана в GENERIC. Идем дальше:
	cd /sys/i386/conf
	cp GENERIC MYCONF
	редактировать файл MYCONF
	config MYCONF
	cd /sys/compile/MYCONF
	make depend
	make
	make install
	reboot
Если компиляция заткнется на каком-либо этапе, вам сообщат. Внимательно читайте диагностику и, чтобы не сбросить ее с экрана, производите правку с другой виртуальной консоли или из другой сесии telnet.

Что значит "редактировать файл MYCONF"?

Изначально файл GENERIC содержит строки
	команда драйвер параметры #комментарий
например
	cpu	"I386_CPU"
	cpu	"I486_CPU"
	cpu	"I586_CPU"
Естественно, надо оставить тот, который соответствует вашей машине. Возможен также вариант, когда это ядро должно работать в нескольких конфигурациях, тогда надо оставить строки, соответствующие хоть одной (т.е. если ядро делается для 486-й машине, которая вскоре должна быть усилена до 586-й, то надо оставить две последние строки).

В этом очень поможет файл LINT. Он содержит все драйверы, которые есть в ssys.?? и по слухам не может быть скомпилирован - некоторые строки противоречат друг другу. Зато от неплохо прокомментирован. Моя первая компиляция закончилась неудачно - я выкинул шину PCI (ее на машине действительно не было), но оставил какое-то PCI-устройство и компилятор на нем запнулся. Ничего страшного не произошло, машина не повисла, система не грохнулась - просто пришлось запустить компиляцию заново. Был вечер, ждать конца было неохота и я ушел домой, оставив компилятор работать, а утром получил готовое ядро.

Компиляция сократила размер ядра (файла - ядро скомпрессировано, самораспаковывается при загрузке и в памяти занимает больше) с 1224 KB до 840 KB на одной машине и до 790 KB на другой (разница - в наличии CD-ROM и в сетевых картах). Это немаловажно, особенно если у вас не очень много памяти. FreeBSD способен работать и даже эффективно выполнять многие функции даже при 4 MB оперативной памяти, но для компиляции неплохо будет добавить; впрочем, компиляция при 8 MB, мне показалась, шла вполне приемлимо.


Выражаю благодарность Александру Лапинскому за его насмешливые комментарии к ошибкам, допущенным в предыдущих версиях текста.