Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Глава 5 Конфигурирование и создание оптимизированных, безопасных ядер (Часть 1)

Общий обзор.

Ну хорошо, Вы видите, что сервер приобрел общую форму. Но подождите, что является основной частью сервера? Да, это ядро. Оно является основой операционной системы. Без него Linux не Linux. Так что мы должны очень внимательно отнестись к ядру и настроить его так, чтобы оно соответствовало нашим потребностям. Первое, о чем Вы думаете, создавая новое ядро, это его настройка под Вашу систему. Это сделать очень просто, но в любом случае прочитайте вначале файл README в каталоге /usr/src/linux. При конфигурировании ядра Вы должны компилировать те коды, которые Вам нужны. Это даст следующие преимущества: ядро будет быстрее (меньше размер кода, входящего в него), освободиться место в RAM (меньше кода, меньше размер ядра, а части ядра никогда не помещаются в виртуальную память), ядро будет более стабильным (не надо искать несуществующих устройств), неиспользуемые части могут использоваться нападающими для получения доступа к Вашей или другим системам. Модули работают медленнее, чем тот же код вкомпилированный в ядро. При конфигурировании и компиляции мы будем создавать монолитное ядро. Такое ядро получается при ответе на вопросы Yes или No (никогда не создавайте модули) и пропуске следующих шагов: make modules и make modules_install. Также мы будем патчить наше новое ядро кодом защиты от переполнения буфера. Подобный патч для ядра существует и работает он подобно Solar Designer's, отвергая выполнение кода находящегося в стеке, делая осуществление атак типа "переполнение буфера" более сложным, и полностью защищая систему от всех текущих эксплойтов взятых из "script kiddies" всемирной сети.

Помните, что на все вопросы надо отвечать Yes или No, если Вы хотите создать монолитное ядро. Ели Вы собираетесь использовать маскарадинг или дозвон через ppp-соединение, то создать монолитное ядро невозможно, эти функции требуют использования ряда модулей. Поэтому Вам придется создавать модульное ядро.

Созданное ядро будет сильно привязано к определенному аппаратному обеспечению, при конфигурировании я использовал следующее оборудование:

  • 1 Pentium II 400 MHz (i686) processor
  • 1 Motherboard SCSI
  • 1 Hard Disk SCSI
  • 1 SCSI Controler Adaptec AIC 7xxx
  • 1 CD-ROM ATAPI IDE
  • 1 Floppy Disk
  • 2 Ethernet Cards Intel EtherExpressPro 10/100
  • 1 Mouse PS/2

Все шаги описанные ниже подразумевают

  • UNIX-совместимые команды
  • Исходные тексты находятся в /usr/src
  • Тестирование проводилось под Red Hat 6.1 и 6.2
  • Все шаги инсталляции выполнялись от пользователя root
  • Последняя версия ядра 2.2.14
  • Последняя версия Secure Linux Kernel Patches 2_2_14-ow2

Пакеты

Домашняя страница ядер Linux: http://www.kernelnotes.org. Вы должны скачать: linux-2_2_14_tar.gz. Домашняя страница Secure Linux Kernel Patches: http://www.openwall.com/linux. Вы должны скачать: linux-2_2_14-ow2_tar.gz. FTP-сервер, где лежит Secure Linux Kernel Patches: ftp://195.42.162.180 .

Создание аварийной загрузочной дискеты

Первый прединсталляционный шаг: создание аварийной загрузочной дискеты (если ее еще нет). Самый простой путь это сделать: воспользоваться командой mkbootdisk.

Первое, надо выяснить, какое ядро Вы сейчас используете. Для этого просмотрите файл /etc/lilo.conf и посмотрите, какой образ загружается. У меня этот файл выглядит так:

boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.12-20
label=linux
root=/dev/sda6
initrd=/boot/initrd-2.2.12-20.img
read-only

Найдите в нем образ ядра, который Вы используете. Обычно, он имеет метку linux. В нашем примере это /boot/vmlinuz-2.2.12-20. Теперь просто вставьте дискетку 1,44" и подключитесь к системе как пользователь root.

[root@deep]# mkbootdisk --device /dev/fd0 2.2.12-20
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press <Enter> to continue or ^C to abort:

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

Деинсталляция и оптимизация.

Шаг 1.

Скопируйте архив ядра в /usr/src и перейдите туда:

[root@deep]# cp linux-version_tar.gz /usr/src
[root@deep]# cd /usr/src
Если Вы уже инсталлировали ядро из tar-архива

Эти шаги нужно выполнять, если у Вас уже были установлены ранее исходные тексты ядра из tar.gz. Если это первое обновление ядра, надо деинсталлировать два rpm-пакета: kernel-headers-version.i386.rpm и kernel-version.i386.rpm.

Удаление символической ссылки:

[root@deep]# rm -rf linux

Удаление текущего каталога с заголовками ядра:

[root@deep]# rm -rf linux-2.2.xx

Удаление каталога с модулями ядра:

[root@deep src]# rm -rf /lib/modules/2.2.xx

Замечание. Удаление старых модулей ядра необходимо, если Вы до этого устанавливали модульное ядро. Если в /lib Вы не находите каталога с модулями, ядро у вас было монолитным.

Если у Вас были установлены стандартные RPM-пакеты с ядром

Если у Вас были установлены стандартные RPM-пакеты с ядром вместо .tar.gz-архива, потому что Вы только что завершили установку нового сервера или использовали RPM-пакеты для обновления системы, используйте следующие команды для деинсталляции ядра.

Для проверки, что они у Вас установлены, дайте команду:

[root@deep]# rpm -qa | grep kernel
kernel-headers-2.2.12-20.i386.rpm
kernel-2.2.12-20.i386.rpm

Для деинсталляции RPM-пакетов:

[root@deep src]# rpm -e --nodeps kernel-headers kernel
cannot remove /usr/src/linux-2.2.xx - directory not empty
cannot remove /lib/modules/2.2.xx - directory not empty
[root@deep src]# rm -rf /usr/src/linux-2.2.xx
[root@deep src]# rm -rf /lib/modules/2.2.xx

Мы вручную удалили каталоги /usr/src/linux-2.2.12 и /lib/modules/2.2.12, которые останутся после деинсталляции rpm-пакетов.

Шаг 2. Разворачивание архива с ядром Linux

Сейчас мы будем разворачивать исходные тексты нового ядра из tar.gz, а затем удалим Linux tar-архив.

[root@deep]# tar xzpf linux-version_tar.gz
[root@deep]# rm -f linux-version_tar.gz
Шаг 3. Увеличение числа задач (оптимизация).

Для увеличения числа разрешенных задач (максимальное число процессов для пользователя) нужно редактировать файл /usr/src/linux/include/linux/tasks.h и изменить следующий параметр:

Редактируйте tasks.h file (vi +14 /usr/src/linux/include/linux/tasks.h) и измените:

NR_TASKS из 512 в 3072
MIN_TASKS_LEFT_FOR_ROOT из 4 в 24

Замечания. 1. Значение NR_TASKS определяет максимальное число идентификаторов задач (процессов), которое ядро будет назначать каждому пользователю. Увеличение этого числа приведет к увеличению количества соединений от клиента к серверу (например, веб-сервер сможет обслуживать большее количество запросов).

2. Linux защищен от того, чтобы распределить все свободные области памяти процессов обычным пользователям. С помощью опции MIN_TASKS_LEFT_FOR_ROOT резервируются подобные области для root (24 хорошее значение).

Шаг 4. Оптимизация ядра.

Для оптимизации ядра Linux под конкретную архитектуру CPU и включения оптимизационных флагов надо редактировать файл /usr/src/linux/Makefile и изменить следующие параметры:

Редактируйте Makefile (vi +18 /usr/src/linux/Makefile) и измените следующую строку:

HOSTCC=gcc

Должна быть:

HOSTCC=egcs

Редактируйте Makefile (vi +25 /usr/src/linux/Makefile) и измените следующую строку:

CC =$(CROSS_COMPILE)gcc -D__KERNEL__ -I$(HPATH)

Должна быть:

CC =$(CROSS_COMPILE)egcs -D__KERNEL__ -I$(HPATH)

Редактируйте Makefile (vi +90 /usr/src/linux/Makefile) и измените следующую строку:

CFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

Должна быть:

CFLAGS = -Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math \
         -malign-double -mcpu=pentiumpro -march=pentiumpro \
         -fomit-frame-pointer -fno-exceptions

Редактируйте файл Makefile (vi +19 /usr/src/linux/Makefile) и измените следующую строку:

HOSTCFLAGS =-Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

Должна быть:

HOSTCFLAGS =-Wall -Wstrict-prototypes -O9 -funroll-loops -ffast-math \
            -malign-double -mcpu=pentiumpro -march=pentiumpro \
            -fomit-frame-pointer -fno-exceptions

Они включают агрессивные оптимизационные трюки, которые могут и не работать со всеми ядрами. Пожалуйста, если оптимизационные флаги, приведенные выше, не работают у Вас, не пытайтесь во чтобы то ни стало заставить их работать. Я не хочу сделать Вашу систему нестабильной, подобной Microsoft Windows.

Безопасность ядра

Secure Linux kernel patches от Openwall Project прекрасный путь предупредить атаки Stack Buffer Overflows и подобные ей. Этот патч включает набор дополнительных возможностей, связанных с обеспечением безопасности ядра Linux, которые настраиваются через новую конфигурационную секцию Security options.

Новые возможности патча linux-2_2_14-ow2_tar.gz:
  • Неисполняемая область стека пользователя
  • Ограничение использования ссылок в /tmp
  • Ограничение использования FIFO в /tmp
  • Ограничения в /proc
  • Специальные дескрипторы для fd 0, 1 и 2
  • Усиление RLIMIT_NPROC на execve(2)
  • Уничтожение неиспользуемых разделенных сегментов памяти

Замечание. Когда Вы наложите патч linux-2_2_14-ow2 в конце конфигурации ядра будет добавлена секция Security options. Для получения большей информации о новых возможностях читайте файл README, поставляемый вместе с исходными текстами патча.

Применение патча

[root@deep]# cp linux-2_2_14-ow2_tar.gz /usr/src/
[root@deep]# cd /usr/src/
[root@deep]# tar xzpf linux.2_2_14-ow2_tar.gz
[root@deep]# cd linux-2.2.14-ow2/
[root@deep]# mv linux-2.2.14-ow2.diff /usr/src/
[root@deep]# cd ..
[root@deep]# patch -p0 < linux-2.2.14-ow2.diff
[root@deep]# rm -rf linux-2.2.14-ow2
[root@deep]# rm -f linux-2.2.14-ow2.diff
[root@deep]# rm -f linux-2_2_14-ow2_tar.gz

Первое, мы копируем программный архив в каталог /usr/src, затем мы перемещаемся в этот каталог и раскрываем там архив linux-2_2_14ow2_tar.gz, переходим в раскрытый патч и перемещаем оттуда файл linux-2.2.14-ow2.diff в /usr/src, возвращаемся в /usr/src и патчим ядро файлом linux-2.2.14-ow2.diff. После этого мы удаляем все файлы, связанные с этим патчем. Замечание. Все сообщения обеспечения безопасности, связанные с патчем linux-2.2.14-ow2, должны фиксироваться в файле /var/log/message. Стадия наложения патча на Ваше ядро завершена. Теперь пора вернуться к созданию ядра и перезагрузке.

ЗАМЕЧАНИЕ ОТ ПЕРЕВОДЧИКА. При определение опции "Destroy shared memory segments not in use" в секции "Security options" у меня начала ругаться программа, предназначенная для работы с UPS, apcupsd. Пришлось эту опцию отключить.

Компиляция

Очень важно, чтобы Ваши каталоги /usr/include/asm, /usr/include/linux и /usr/include/scsi представляли из себя символические ссылки к исходным кодам ядра.

Шаг 1.

Каталоги asm, linux и scsi являются символическими ссылками к реальным include-каталогам, необходимым для конкретной архитектуры, например, /usr/src/linux/include/asm-i386 для asm.

[root@deep]# cd /usr/include/
[root@deep]# rm -rf asm linux scsi
[root@deep]# ln -s /usr/src/linux/include/asm-i386 asm
[root@deep]# ln -s /usr/src/linux/include/linux linux
[root@deep]# ln -s /usr/src/linux/include/scsi scsi

Это очень важная часть конфигурирования, мы удаляем каталоги asm, linux, и scsi под /usr/include, затем создаем ссылки на каталоги с такими же именами в дереве исходных кодов нового ядра. Каталог include содержит важнейшие заголовочные файлы необходимые для Вашего ядра и для программ, которые Вы будете компилировать.

Шаг 2.

Сделайте так, чтобы у Вас не было старых .o-файлов и неправильных зависимостей:

[root@deep]# cd /usr/src/linux/
[root@deep]# make mrproper

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

Сейчас Вы имеете корректно установленные исходные коды ядра. Существует три пути для конфигурирования ядра.

  1. Команда make config. Она предоставляет текстовый интерфейс для ответов на вопросы относительно всех параметров настройки ядра. Вы будете запрошены обо всех нужных опциях.
  2. Команда make menuconfig. Она предоставляет все опции настройки в легком в использовании меню.
  3. Команда make xconfig. Она предоставляет полный графический интерфейс ко всем опциям ядра.
Шаг 3.

В этой главе для конфигурирования ядра мы используем команду make config, потому что у нас на сервере не установлен Xfree86.

[root@deep /]# cd /usr/src/linux/ (если Вы еще не в этом каталоге).
[root@deep linux]# make config
rm -f include/asm
(cd include; ln -sf asm-i386 asm)
/bin/sh scripts/Configure arch/i386/config.in
#
# Using defaults found in arch/i386/defconfig

Конфигурация ядра.

Code maturity level options
Prompt for development and/or incomplete code/drivers
(CONFIG_EXPERIMENTAL) [N/y/?]
Processor type and features
Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC,
PPro/6x86MX) [PPro/6x86MX]
Maximum Physical Memory (1GB, 2GB) [1GB]
Math emulation (CONFIG_MATH_EMULATION) [N/y/?]
MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]
Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] N
Loadable module support
Enable loadable module support (CONFIG_MODULES) [Y/n/?] N
General setup
Networking support (CONFIG_NET) [Y/n/?]
PCI support (CONFIG_PCI) [Y/n/?]
PCI access mode (BIOS, Direct, Any) [Any]
PCI quirks (CONFIG_PCI_QUIRKS) [Y/n/?] N
Backward-compatible /proc/pci (CONFIG_PCI_OLD_PROC) [Y/n/?] N
MCA support (CONFIG_MCA) [N/y/?]
SGI Visual Workstation support (CONFIG_VISWS) [N/y/?]
System V IPC (CONFIG_SYSVIPC) [Y/n/?]
BSD Process Accounting (CONFIG_BSD_PROCESS_ACCT) [N/y/?]
Sysctl support (CONFIG_SYSCTL) [Y/n/?]
Kernel support for a.out binaries (CONFIG_BINFMT_AOUT) [Y/n/?]
Kernel support for ELF binaries (CONFIG_BINFMT_ELF) [Y/n/?]
Kernel support for MISC binaries (CONFIG_BINFMT_MISC) [Y/n/?]
Parallel port support (CONFIG_PARPORT) [N/y/?]
Advanced Power Management BIOS support (CONFIG_APM) [N/y/?]
Plug and Play support
Plug and Play support (CONFIG_PNP) [N/y/?]
Block devices
Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/n/?]
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
(CONFIG_BLK_DEV_IDE) [Y/n/?]
Use old disk-only driver on primary interface (CONFIG_BLK_DEV_HD_IDE)
[N/y/?]
Include IDE/ATA-2 DISK support (CONFIG_BLK_DEV_IDEDISK) [Y/n/?]
Include IDE/ATAPI CDROM support (CONFIG_BLK_DEV_IDECD) [Y/n/?]
Include IDE/ATAPI TAPE support (CONFIG_BLK_DEV_IDETAPE) [N/y/?]
Include IDE/ATAPI FLOPPY support (CONFIG_BLK_DEV_IDEFLOPPY) [N/y/?]
SCSI emulation support (CONFIG_BLK_DEV_IDESCSI) [N/y/?]
CMD640 chipset bugfix/support (CONFIG_BLK_DEV_CMD640) [Y/n/?] N
RZ1000 chipset bugfix/support (CONFIG_BLK_DEV_RZ1000) [Y/n/?] N
Generic PCI IDE chipset support (CONFIG_BLK_DEV_IDEPCI) [Y/n/?]
Generic PCI bus-master DMA support (CONFIG_BLK_DEV_IDEDMA) [Y/n/?]
Boot off-board chipsets first support (CONFIG_BLK_DEV_OFFBOARD) [N/y/?]
Use DMA by default when available (CONFIG_IDEDMA_AUTO) [Y/n/?]
Other IDE chipset support (CONFIG_IDE_CHIPSETS) [N/y/?]
Loopback device support (CONFIG_BLK_DEV_LOOP) [N/y/?]
Network block device support (CONFIG_BLK_DEV_NBD) [N/y/?]
Multiple devices driver support (CONFIG_BLK_DEV_MD) [N/y/?]
RAM disk support (CONFIG_BLK_DEV_RAM) [N/y/?]
XT hard disk support (CONFIG_BLK_DEV_XD) [N/y/?]
Mylex DAC960/DAC1100 PCI RAID Controller support
(CONFIG_BLK_DEV_DAC960) [N/y/?] (NEW)
Parallel port IDE device support (CONFIG_PARIDE) [N/y/?]
Compaq SMART2 support (CONFIG_BLK_CPQ_DA) [N/y/?] (NEW)
Networking options
Packet socket (CONFIG_PACKET) [Y/n/?]
Kernel/User netlink socket (CONFIG_NETLINK) [N/y/?]
Network firewalls (CONFIG_FIREWALL) [N/y/?] Y
Socket Filtering (CONFIG_FILTER) [N/y/?]
Unix domain sockets (CONFIG_UNIX) [Y/n/?]
TCP/IP networking (CONFIG_INET) [Y/n/?]
IP: multicasting (CONFIG_IP_MULTICAST) [N/y/?]
IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [N/y/?]
IP: kernel level autoconfiguration (CONFIG_IP_PNP) [N/y/?]
IP: firewalling (CONFIG_IP_FIREWALL) [N/y/?] (NEW) Y
IP: transparent proxy support (CONFIG_IP_TRANSPARENT_PROXY) [N/y/?]
(NEW)
IP: masquerading (CONFIG_IP_MASQUERADE) [N/y/?] (NEW)
IP: optimize as router not host (CONFIG_IP_ROUTER) [N/y/?]
IP: tunneling (CONFIG_NET_IPIP) [N/y/?]
IP: GRE tunnels over IP (CONFIG_NET_IPGRE) [N/y/?]
IP: aliasing support (CONFIG_IP_ALIAS) [N/y/?]
IP: TCP syncookie support (not enabled per default) (CONFIG_SYN_COOKIES)
[N/y/?] Y
IP: Reverse ARP (CONFIG_INET_RARP) [N/y/?]
IP: Allow large windows (not recommended if <16Mb of memory)
(CONFIG_SKB_LARGE) [Y/n/?]
The IPX protocol (CONFIG_IPX) [N/y/?]
Appletalk DDP (CONFIG_ATALK) [N/y/?]
Telephony support
Linux telephony support (CONFIG_PHONE) [N/y/?] (NEW)
SCSI support
SCSI support (CONFIG_SCSI) [Y/n/?]
SCSI disk support (CONFIG_BLK_DEV_SD) [Y/n/?]
SCSI tape support (CONFIG_CHR_DEV_ST) [N/y/?]
SCSI CD-ROM support (CONFIG_BLK_DEV_SR) [N/y/?]
SCSI generic support (CONFIG_CHR_DEV_SG) [N/y/?]
Probe all LUNs on each SCSI device (CONFIG_SCSI_MULTI_LUN) [Y/n/?] N
Verbose SCSI error reporting (kernel size +=12K) (CONFIG_SCSI_CONSTANTS)
[Y/n/?] N
SCSI logging facility (CONFIG_SCSI_LOGGING) [N/y/?]
SCSI low-level drivers
7000FASST SCSI support (CONFIG_SCSI_7000FASST) [N/y/?]
ACARD SCSI support (CONFIG_SCSI_ACARD) [N/y/?]
Adaptec AHA152X/2825 support (CONFIG_SCSI_AHA152X) [N/y/?]
Adaptec AHA1542 support (CONFIG_SCSI_AHA1542) [N/y/?]
Adaptec AHA1740 support (CONFIG_SCSI_AHA1740) [N/y/?]
Adaptec AIC7xxx support (CONFIG_SCSI_AIC7XXX) [N/y/?] Y
Enable Tagged Command Queueing (TCQ) by default [N/y/?] (NEW) Y
Maximum number of TCQ commands per device
(CONFIG_AIC7XXX_CMDS_PER_DEVICE) [8] (NEW)
Collect statistics to report in /proc (CONFIG_AIC7XXX_PROC_STATS) [N/y/?]
(NEW)
Delay in seconds after SCSI bus reset (CONFIG_AIC7XXX_RESET_DELAY) [5]
(NEW)
IBM ServeRAID support (CONFIG_SCSI_IPS) [N/y/?] (NEW)
AdvanSys SCSI support (CONFIG_SCSI_ADVANSYS) [N/y/?]
Always IN2000 SCSI support (CONFIG_SCSI_IN2000) [N/y/?]
AM53/79C974 PCI SCSI support (CONFIG_SCSI_AM53C974) [N/y/?]
AMI MegaRAID support (CONFIG_SCSI_MEGARAID) [N/y/?]
BusLogic SCSI support (CONFIG_SCSI_BUSLOGIC) [N/y/?]
DTC3180/3280 SCSI support (CONFIG_SCSI_DTC3280) [N/y/?]
EATA ISA/EISA/PCI (DPT and generic EATA/DMA) support
(CONFIG_SCSI_EATA) [N/y/?]
EATA-DMA [Obsolete] (DPT, NEC, AT&T, SNI, AST, Olivetti, Alphatronix)
support
(CONFIG_SCSI_EATA_DMA) [N/y/?]
EATA-PIO (old DPT PM2001, PM2012A) support (CONFIG_SCSI_EATA_PIO)
[N/y/?]
Future Domain 16xx SCSI/AHA-2920A support
(CONFIG_SCSI_FUTURE_DOMAIN) [N/y/?]
GDT SCSI Disk Array Controller support (CONFIG_SCSI_GDTH) [N/y/?]
Generic NCR5380/53c400 SCSI support (CONFIG_SCSI_GENERIC_NCR5380)
[N/y/?]
Initio 9100U(W) support (CONFIG_SCSI_INITIO) [N/y/?]
Initio INI-A100U2W support (CONFIG_SCSI_INIA100) [N/y/?]
NCR53c406a SCSI support (CONFIG_SCSI_NCR53C406A) [N/y/?]
symbios 53c416 SCSI support (CONFIG_SCSI_SYM53C416) [N/y/?]
Simple 53c710 SCSI support (Compaq, NCR machines) (CONFIG_SCSI_SIM710)
[N/y/?] (NEW)
NCR53c7,8xx SCSI support (CONFIG_SCSI_NCR53C7xx) [N/y/?]
NCR53C8XX SCSI support (CONFIG_SCSI_NCR53C8XX) [N/y/?]
SYM53C8XX SCSI support (CONFIG_SCSI_SYM53C8XX) [Y/n/?] N
PAS16 SCSI support (CONFIG_SCSI_PAS16) [N/y/?]
PCI2000 support (CONFIG_SCSI_PCI2000) [N/y/?]
PCI2220i support (CONFIG_SCSI_PCI2220I) [N/y/?]
PSI240i support (CONFIG_SCSI_PSI240I) [N/y/?]
Qlogic FAS SCSI support (CONFIG_SCSI_QLOGIC_FAS) [N/y/?]
Qlogic ISP SCSI support (CONFIG_SCSI_QLOGIC_ISP) [N/y/?]
Qlogic ISP FC SCSI support (CONFIG_SCSI_QLOGIC_FC) [N/y/?]
Seagate ST-02 and Future Domain TMC-8xx SCSI support
(CONFIG_SCSI_SEAGATE) [N/y/?]
Tekram DC390(T) and Am53/79C974 SCSI support (CONFIG_SCSI_DC390T)
[N/y/?]
Trantor T128/T128F/T228 SCSI support (CONFIG_SCSI_T128) [N/y/?]
UltraStor 14F/34F support (CONFIG_SCSI_U14_34F) [N/y/?]
UltraStor SCSI support (CONFIG_SCSI_ULTRASTOR) [N/y/?]
Network device support
Network device support (CONFIG_NETDEVICES) [Y/n/?]
ARCnet devices
ARCnet support (CONFIG_ARCNET) [N/y/?]
Dummy net driver support (CONFIG_DUMMY) [Y/n/?]
EQL (serial line load balancing) support (CONFIG_EQUALIZER) [N/y/?]
General Instruments Surfboard 1000 (CONFIG_NET_SB1000) [N/y/?] (NEW)
Ethernet (10 or 100Mbit)
Ethernet (10 or 100Mbit) (CONFIG_NET_ETHERNET) [Y/n/?]
3COM cards (CONFIG_NET_VENDOR_3COM) [N/y/?]
AMD LANCE and PCnet (AT1500 and NE2100) support (CONFIG_LANCE)
[N/y/?]
Western Digital/SMC cards (CONFIG_NET_VENDOR_SMC) [N/y/?]
Racal-Interlan (Micom) NI cards (CONFIG_NET_VENDOR_RACAL) [N/y/?]
Other ISA cards (CONFIG_NET_ISA) [N/y/?]
EISA, VLB, PCI and on board controllers (CONFIG_NET_EISA) [Y/n/?]
AMD PCnet32 (VLB and PCI) support (CONFIG_PCNET32) [N/y/?]
Apricot Xen-II on board Ethernet (CONFIG_APRICOT) [N/y/?]
CS89x0 support (CONFIG_CS89x0) [N/y/?]
DM9102 PCI Fast Ethernet Adapter support (EXPERIMENTAL)
(CONFIG_DM9102) [N/y/?] (NEW)
Generic DECchip & DIGITAL EtherWORKS PCI/EISA (CONFIG_DE4X5) [N/y/?]
DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP) [N/y/?]
Old DECchip Tulip (dc21x4x) PCI support (CONFIG_DEC_ELCP_OLD) [N/y/?]
(NEW)
Digi Intl. RightSwitch SE-X support (CONFIG_DGRS) [N/y/?]
EtherExpressPro/100 support (CONFIG_EEXPRESS_PRO100) [Y/n/?]
PCI NE2000 support (CONFIG_NE2K_PCI) [N/y/?]
TI ThunderLAN support (CONFIG_TLAN) [N/y/?]
VIA Rhine support (CONFIG_VIA_RHINE) [N/y/?]
SiS 900/7016 PCI Fast Ethernet Adapter support (CONFIG_SIS900) [N/y/?] (NEW)
Pocket and portable adaptors (CONFIG_NET_POCKET) [N/y/?]
Ethernet (1000 Mbit)
SysKonnect SK-98xx support (CONFIG_SK98LIN) [N/y/?] (NEW)
FDDI driver support (CONFIG_FDDI) [N/y/?]
PPP (point-to-point) support (CONFIG_PPP) [N/y/?]
SLIP (serial line) support (CONFIG_SLIP) [N/y/?]
Wireless LAN (non-hamradio) (CONFIG_NET_RADIO) [N/y/?]
Token ring devices
Token Ring driver support (CONFIG_TR) [N/y/?]
Fibre Channel driver support (CONFIG_NET_FC) [N/y/?] (NEW)
Wan interfaces
MultiGate (COMX) synchronous serial boards support (CONFIG_COMX) [N/y/?]
(NEW)
Frame relay DLCI support (CONFIG_DLCI) [N/y/?]
WAN drivers (CONFIG_WAN_DRIVERS) [N/y/?]
SBNI12-xx support (CONFIG_SBNI) [N/y/?] (NEW)
Amateur Radio support
Amateur Radio support (CONFIG_HAMRADIO) [N/y/?]
IrDA subsystem support
IrDA subsystem support (CONFIG_IRDA) [N/y/?]
ISDN subsystem
ISDN support (CONFIG_ISDN) [N/y/?]
Old CD-ROM drivers (not SCSI, not IDE)
Support non-SCSI/IDE/ATAPI CDROM drives (CONFIG_CD_NO_IDESCSI)
[N/y/?]
Character devices
Virtual terminal (CONFIG_VT) [Y/n/?]
Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]
Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y/n/?]
Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]
Extended dumb serial driver options (CONFIG_SERIAL_EXTENDED) [N/y/?]
Non-standard serial port support (CONFIG_SERIAL_NONSTANDARD) [N/y/?]
Unix98 PTY support (CONFIG_UNIX98_PTYS) [Y/n/?]
Maximum number of Unix98 PTYs in use (0-2048)
(CONFIG_UNIX98_PTY_COUNT) [256] 128
Mouse Support (not serial mice) (CONFIG_MOUSE) [Y/n/?]
Mice
ATIXL busmouse support (CONFIG_ATIXL_BUSMOUSE) [N/y/?]
Logitech busmouse support (CONFIG_BUSMOUSE) [N/y/?]
Microsoft busmouse support (CONFIG_MS_BUSMOUSE) [N/y/?]
PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [Y/n/?]
C&T 82C710 mouse port support (as on TI Travelmate)
(CONFIG_82C710_MOUSE) [Y/n/?] N
PC110 digitizer pad support (CONFIG_PC110_PAD) [N/y/?]
Joystick support
Joystick support (CONFIG_JOYSTICK) [N/y/?]
QIC-02 tape support (CONFIG_QIC02_TAPE) [N/y/?]
Watchdog Timer Support (CONFIG_WATCHDOG) [N/y/?]
/dev/nvram support (CONFIG_NVRAM) [N/y/?]
Enhanced Real Time Clock Support (CONFIG_RTC) [N/y/?]
Video for Linux
Video For Linux (CONFIG_VIDEO_DEV) [N/y/?]
Double Talk PC internal speech card support (CONFIG_DTLK) [N/y/?]
Ftape, the floppy tape device driver
Ftape (QIC-80/Travan) support (CONFIG_FTAPE) [N/y/?]
Filesystems
Quota support (CONFIG_QUOTA) [N/y/?] Y
Kernel automounter support (CONFIG_AUTOFS_FS) [Y/n/?] N
Amiga FFS filesystem support (CONFIG_AFFS_FS) [N/y/?]
Apple Macintosh filesystem support (experimental) (CONFIG_HFS_FS) [N/y/?]
DOS FAT fs support (CONFIG_FAT_FS) [N/y/?]
ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/n/?]
Microsoft Joliet CDROM extensions (CONFIG_JOLIET) [N/y/?]
Minix fs support (CONFIG_MINIX_FS) [N/y/?]
NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/?]
OS/2 HPFS filesystem support (read only) (CONFIG_HPFS_FS) [N/y/?]
/proc filesystem support (CONFIG_PROC_FS) [Y/n/?]
/dev/pts filesystem for Unix98 PTYs (CONFIG_DEVPTS_FS) [Y/n/?]
ROM filesystem support (CONFIG_ROMFS_FS) [N/y/?]
Second extended fs support (CONFIG_EXT2_FS) [Y/n/?]
System V and Coherent filesystem support (CONFIG_SYSV_FS) [N/y/?]
UFS filesystem support (CONFIG_UFS_FS) [N/y/?]
Network File Systems
Coda filesystem support (advanced network fs) (CONFIG_CODA_FS) [N/y/?]
NFS filesystem support (CONFIG_NFS_FS) [Y/n/?] N
SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS) [N/y/?]
NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS) [N/y/?]
Partition Types
BSD disklabel (BSD partition tables) support (CONFIG_BSD_DISKLABEL) [N/y/?]
Macintosh partition map support (CONFIG_MAC_PARTITION) [N/y/?]
SMD disklabel (Sun partition tables) support (CONFIG_SMD_DISKLABEL) [N/y/?]
Solaris (x86) partition table support (CONFIG_SOLARIS_X86_PARTITION)
[N/y/?]
Console drivers
VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?]
Video mode selection support (CONFIG_VIDEO_SELECT) [N/y/?]
Sound
Sound card support (CONFIG_SOUND) [N/y/?]
(Security options will appear only if you are patched your kernel with the Openwall
Project patch).
Security options
Non-executable user stack area (CONFIG_SECURE_STACK) [Y]
Autodetect and emulate GCC trampolines (CONFIG_SECURE_STACK_SMART)
[Y]
Restricted links in /tmp (CONFIG_SECURE_LINK) [Y]
Restricted FIFOs in /tmp (CONFIG_SECURE_FIFO) [Y]
Restricted /proc (CONFIG_SECURE_PROC) [N] Y
Special handling of fd 0, 1, and 2 (CONFIG_SECURE_FD_0_1_2) [Y]
Enforce RLIMIT_NPROC on execve(2) (CONFIG_SECURE_RLIMIT_NPROC) [Y]
Destroy shared memory segments not in use (CONFIG_SECURE_SHM) [N] Y
Kernel hacking
Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?]

Сейчас вернитесь в каталог /usr/src/linux (если Вы там не находитесь). Вам нужно компилировать новое ядро. Для этого используйте следующие команды:

[root@deep]# make dep; make clean; make bzImage

Эта строка содержит три команды. Первая, make dep, берет Вашу конфигурацию и создает надлежащее дерево зависимостей. Этот процесс определяет, что надо компилировать, а что нет.

Команда make clean стирает все следы предыдущих компиляций, чтобы ошибки из предыдущей версии не попали в новое ядро.

Затем make bzImage осуществляет полную компиляцию ядра.

После того как процесс компиляции завершается, ядро сжимается и готово к инсталляции. Перед тем как инсталлировать ядро, Вы должны скомпилировать необходимые модули. Это необходимо, если Вы ответили Yes на вопрос Enable loadable module support (CONFIG_MODULES) и отметили некоторые опции в ядре как модули. В этом случае введите следующие команды:

[root@deep linux]# make modules
[root@deep linux]# make modules_install

Замечание. Команды make modules и make modules_install нужны только, если Вы ответили Yes на вопрос Enable loadable module support (CONFIG_MODULES).

Инсталляция нового ядра.

1. Копируйте /usr/src/linux/arch/i386/boot/bzImage из дерева исходных кодов ядра в каталог /boot и дайте ему новое имя.

[root@deep linux]# cp /usr/src/linux/arch/i386/boot/bzImage \
                      /boot/vmlinuz-kernel.version.number

Замечание. Я рекомендую название, подобное vmlinuz-2.2.14, потому что если Вы хотите создать новый спасательный или загрузочные диски при помощи mkbootdisk, то она требует некоторой точности, например, vmlinuz-2.2.14 вместо vmlinuz-2.2.14.a

2. Копируйте /usr/src/linux/System.map из дерева исходных кодов ядра в каталог /boot и дайте ему новое имя.

[root@deep linux]# cp /usr/src/linux/System.map \
                      /boot/System.map-kernel.version.number

3. Переместитесь в каталог /boot и создайте символические ссылки vmlinuz и System.map.

[root@deep linux]# cd /boot
[root@deep /boot]# ln -fs vmlinuz-kernel.version.number vmlinuz
[root@deep /boot]# ln -fs System.map-kernel.version.number System.map

Мы должны пересоздать ссылки vmlinuz и System.map на новую версию ядра. Иначе lilo будет использовать старое ядро.

4. Удалите устаревшие и ненужные файлы из каталога /boot, чтобы освободить место на диске:

[root@deep /boot]# rm -f module-info
[root@deep /boot]# rm -f initrd-2.2.xx.img

module-info это ссылка на каталог с модулями к старому ядру. Так как мы инсталлируем новое ядро, мы не нуждаемся в потерянных ссылках. Файл initrd-2.2.xx содержит инициализационный образ RAM-диска, который выступает как система пока не будут доступны диски. Этот файл будет существовать и будет инсталлирован в ходе установки сервера, если Вы имеете SCSI-диск. Все необходимые драйвера сейчас встроены в монолитное ядро, поэтому спокойно удаляйте этот файл.

5. Создайте новый каталог, который будет содержать все необходимые заголовочные файлы, связанные с ядром, которые будут нужны в дальнейшем при компиляции нового программного обеспечения.

Помните, что мы должны создать три символические ссылки в /usr/include, которые являются точками входа в заголовочные файлы ядра Linux. Каталог /usr/include содержит все заголовочные файлы Вашей системы, которые нужны для компиляции новых программ. Ссылки asm, linux и scsi используются когда программам нужно знать некоторые функции времени компиляции ядра инсталлированного на Вашей системе. Программы вызывают другие заголовочные файлы из каталога include когда им нужны специальная информация, зависимости и т.д.

[root@deep /]# mkdir -p /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/asm-generic \
                  /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/asm-i386 \
                  /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/linux \
                  /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/net /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/video \
                  /usr/src/linux-2.2.14/include
[root@deep /]# cp -r /usr/src/linux/include/scsi \
                  /usr/src/linux-2.2.14/include
[root@deep /]# rm -rf /usr/src/linux
[root@deep /]# cd /usr/src
[root@deep src]# ln -s /usr/src/linux-2.2.14 linux

Первое, мы создаем новый каталог linux-2.2.14, базирующийся на версии ядра, которое мы инсталлируем для более легкой интерпретации, затем копируем туда каталоги asm-generic, asm-i386, linux, net, video, и scsi из /usr/linux/include. После этого мы удаляем каталог в котором компилировали новое ядро и создаем в /usr/src ссылку linux, указывающую на linux-2.2.14. Последний шаг позволяет сэкономить место на диске. Ядро в разархивированном виде занимает около 75M, а каталоги include около 3M.

6. В заключении нам необходимо редактировать файл /etc/lilo.conf, чтобы сделать новое ядро, загружаемым по умолчанию.

Шаг 1.

Редактируем файл lilo.conf (vi /etc/lilo.conf) и делаем соответствующие изменения в строке image=/boot:

[root@deep /]# vi /etc/lilo.conf
boot=/dev/sda
map=/boot/map
install=/boot/boot.b
prompt
timeout=00
restricted
password=somepasswd
image=/boot/vmlinuz-kernel.version.number
      #(добавьте здесь имя вашего нового ядра).
label=linux
root=/dev/sda6
read-only

Замечание. Не забудьте удалить строку initrd=/boot/initrd-2.2.12-20.img, так как она нам больше не нужна.

Шаг 2.

Когда имя нового ядра было внесено в файл /etc/lilo.conf, как это было описано выше, мы должны дать следующие команды, чтобы изменения вступили в силу:

[root@deep /]# /sbin/lilo -v
LILO version 21, [Copyright 1992-1998 Werner Almesberger
Reading boot sector from /dev/sda
Merging with /boot/boot.b
Boot image: /boot/vmlinuz-2.2.14
Added linux *
/boot/boot.0800 exits no backup copy made.
Writing boot sector.

ВАЖНОЕ ЗАМЕЧАНИЕ: Если Вы сказали No на вопрос Unix98 PTY support (CONFIG_UNIX98_PTYS) во время конфигурирования ядра, то отредактируйте файл /etc/fstab и удалите следующую строку:

none   /dev/pts   devpts   gid=5,mode=620   0 0

Удаление программ, файлов и строк, связанных с модулями

Когда Вы инсталлируете Linux в первый раз (как это делали мы), у Вас устанавливается модульное ядро. Это означает, что каждый элемент или функция, которые нам нужны, существует в виде модуля и контролируется демоном ядра, который называется kmod. Он автоматически загружает модули и функции в память, когда это нужно, и выгружает их, когда необходимость в них отпадает.

Шаг 1.

kmod и другие программы, управляющие модулями, включенные в RPM-пакет modutils используют файл conf.modules, который находится в каталоге /etc. В этом файле определяется, например, какие Ethernet-карты Вы имеете, и какие параметры настройки они используют. Так как мы не используем модули в новом ядре, мы удаляем файл conf.modules и полностью деинсталлируем пакет modutils.

[root@deep /]# rm -f /etc/conf.modules
[root@deep /]# rpm -e --nodeps modutils

Шаг 2.

Теперь необходимо редактировать файл rc.sysinit и закомментировать все строки, в которых упоминается depmod -a, вставив в их начало символ #. Это нужно потому, что при загрузке система читает скрипт rc.sysinit для поиска модульных зависимостей.

Под Red Hat Linux 6.1

Комментируем строку 260 в rc.sysinit file (vi +260 /etc/rc.d/rc.sysinit):

if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

должна читаться:

#if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

Комментируем строки с 272 по 277 в rc.sysinit file (vi +272 /etc/rc.d/rc.sysinit):

if [ -L /lib/modules/default ]; then
INITLOG_ARGS= action "Finding module dependencies" depmod -a default
else
INITLOG_ARGS= action "Finding module dependencies" depmod -a
fi
fi

должны читаться:

# if [ -L /lib/modules/default ]; then
# INITLOG_ARGS= action "Finding module dependencies" depmod -a default
# else
# INITLOG_ARGS= action "Finding module dependencies" depmod -a
# fi
#fi

ЗАМЕЧАНИЕ: Процедура описанная выше связана с пакетом initscripts-4_70-1 из дистрибутива Red Hat Linux 6.1.

Под Red Hat Linux 6.2

Комментируем строку 243 в rc.sysinit (vi +243 /etc/rc.d/rc.sysinit):

if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

должна читаться:

#if [ -x /sbin/depmod -a -n "$USEMODULES" ]; then

Комментируем строки с 255 по 260 в rc.sysinit file (vi +255 /etc/rc.d/rc.sysinit):

if [ -L /lib/modules/default ]; then
INITLOG_ARGS= action "Finding module dependencies" depmod -a default
else
INITLOG_ARGS= action "Finding module dependencies" depmod -a
fi
fi

должны читаться:

# if [ -L /lib/modules/default ]; then
# INITLOG_ARGS= action "Finding module dependencies" depmod -a default
# else
# INITLOG_ARGS= action "Finding module dependencies" depmod -a
# fi
#fi

Замечание. Еще раз повторим, вся эта часть (Удаление программ, файлов и строк связанных с модулями) требуется только, если Вы ответили No на вопрос Enable loadable module support (CONFIG_MODULES) при конфигурировании ядра.

Шаг 3.

Когда система перезагрузится, и Вы подключитесь к серверу, проверьте версию используемого ядра:

[root@deep /]# uname -a
Linux deep.openna.com 2.2.14 #1 Mon Jan 10 10:40:35 EDT 2000 i686 unknown
[root@deep]#

С чем Вас и поздравляю.

Создание новой аварийной дискеты

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

Подключитесь к системе, вставьте новую дискету и выполните следующую команду:

[root@deep /]# mkbootdisk --device /dev/fd0 2.2.14
Insert a disk in /dev/fd0. Any information on the disk will be lost.
Press <Enter> to continue or ^C to abort:

Важное замечание. Программа mkbootdisk запускается только для модульных ядер. Так что Вы не можете использовать ее на монолитном ядре, вместо этого создайте аварийную загрузочную дискету так, как это описано ниже.

Создание аварийного загрузочного флоппи-диска

Так как создать спасательную дискету можно только с модульными ядрами, мы должны найти другой путь загрузки системы с дискеты, если ядро на жестком диске испорчено. Это возможно с помощью аварийной загрузочной дискеты. Вы должны создать ее немедленно после первой удачной загрузки системы и подключения к ней как root.

Для создания аварийной загрузочной дискеты сделайте следующее:

Шаг 1.

Вставьте дискету и форматируйте ее, используя команду:

[root@deep /]# fdformat /dev/fd0H1440
Double-sided, 80 tracks, 18 sec/track. Total capacity 1440 kB.
Formatting ... done
Verifying ... done

Шаг 2.

Копируйте файл vmlinuz из каталога /boot на дискету:

[root@deep /]# cp /boot/vmlinuz /dev/fd0
cp: overwrite `/dev/fd0'? y

vmlinuz это символическая ссылка на реальное ядро.

Шаг 3.

Определяем корневой раздел ядра:

[root@deep /]# rdev
/dev/sda12 /

Корневой раздел ядра это раздел, где находится корневая файловая система. В этом примере, корневой раздел dev/sda12; на Вашей системе это имя может быть другим.

Шаг 4.

Устанавливаем корневой раздел ядра:

[root@deep /]# rdev /dev/fd0 /dev/sda12

В качестве корневого раздела ядра используется значение полученное на предыдущем шаге.

Шаг 5.

Маркируем корневой раздел как "только для чтения":

[root@deep /]# rdev -R /dev/fd0 1

При инициализации Linux корневая файловая система монтируется только для чтения. Подобная установка избавит Вас от ряда предупреждающих сообщений и сообщений об ошибках.

Шаг 6.

Вставьте загрузочную дискету в дисковод A: и перезагрузите систему:

[root@deep /]# reboot

Обновление /dev-входов

Если Вы добавили новое устройство в систему или провели крупное обновление ядра (например, из версии 2.2.9 к 2.2.15), то необходимо обновить входы в /dev для предотвращения проблем с потерянными устройствами. Мы можем решить эту задачу при помощи скрипта MAKEDEV. Он сканирует каталог /dev, где все устройства связываются с драйверами ядра. Специальная опция update позволяет утилите MAKEDEV создать новые устройства, которые Вы сконфигурировали в Вашем ядре и удалить ненужные.

Для обновления входов в /dev выполните следующие команды:

[root@deep /]# cd /dev
[root@deep /dev]# ./MAKEDEV update