воскресенье, 21 декабря 2008 г.

Собираем ядро


make cleandepend && make depend && make -j8 -B && make install && reboot






1.Для пересборки ядра должны быть установлены его исходные тексты.

Проверяем установлены ли исходники (без них не пересоберецца): /usr/home/alex/>cd /usr/src/ ls

Когда исходные кодя ядра установлены, приступаем с правке файла конфигурации ядра.
/usr/src/sys/i386/conf/

make LINT выводит достурные опции для конфигурирования ядра
ee LINT
/usr/src/sys/i386/conf/>cp GENERIC MY_GENERIC # копируем ядро
ee MY_GENERIC


Если у Вашей машины конфигурация i386 - а это 80386, 80486, 80586 (первые пни), P-II, P-III, P-IV, AMD K5, AMD K6, AMD K6-II, AMD K6-III, AMD K7 (Duron, Athlon, Sempron) то делаете то же что и я. Если архитектура отличается - тогда в директории /usr/src/sys/ ищете архитектуру, которая у Вас и делаете там похожие действия :) Архитектуру можно посмотреть, после загрузки так: /usr/src/sys/i386/conf/>dmesg | grep CP
CPU: Intel Pentium III (792.22-MHz 686-class CPU)

Подробней про архитектуры можно узнать на www.freebsd.org или в файле /etc/defaults/make.conf. Вот мой файл конфигурации ядра: #


2. Пример конфигурации ядра
   
machine i386 # по умолчанию в 7 не указан- описывает архитектуру РК (amd64, i386, sparc) но можна и без него
#cpu I386_CPU# процессор компьютера
#cpu I486_CPU# процессор компьютера
#cpu I586_CPU# процессор компьютера
 cpu I686_CPU# процессор компьютера
  # про процы подробней можно посмотреть LINT
 ident main_kernell# идентификатор ядра
 maxusers 0# Определяет количество дескрипторов в системе (0 - значит определяет "автопилот"
 makeoptions DEBUG=-g#опции отладки ядра (в жизни, вероятно не пригодится, но если поймаете глюк и захотите cообщить об этом разработчикам - то пригодится)
   
 options IPFIREWALL #встраиваем поддержку файрволла в ядро
 options IPFIREWALL_VERBOSE# вывод информации об отброшенных пакетах
 options PFIREWALL_VERBOSE_LIMIT=100# ограничение, чтоб весь /var логами не засрали
 options IPFIREWALL_FORWARD# включаем поддержку перенаправления чтобы можно было сделать позрачный прокси-сервер TCP пакетов ядром
 options IPDIVERT#поддержка IP-маскарадинга
 options DUMMYNET#поддержка DUMMYNET (искуственное ограничение пропускной способности сети, может быть нужно если есть необходимость урезать канал одним и разжать другим компьютерам)
 options TCP_DROP_SYNFIN# Это нужно, чтобы сетевые сканеры не могли определять версию OS на сервере. Также нужно добавить в /etc/rc.conf строчку tcp_drop_synfin="YES" (хз работает ли ето в 7ке)
   
 options MATH_EMULATE #эмуляция mатеметического сопроцессора сейчас он есть во всех процах, поэтому не нужно
 options INET# поддержка сети, конкретно протокола TCP/IP (если у Вас машина без сети - можете смело убирать :))
 options INET6# Протокол IP версии IPv6
 options FFS#Berkeley Fast Filesystem файловая система FreeBSD
 options FFS_ROOTфайловая система FFS является фаловой системой ядра
 options SOFTUPDATES#Enable FFS soft updates support SoftUpdates - повышает скорость работы с файловой системой
 options UFS_DIRHASH #Improve performance on big directories если у Вас будут директории с миллионами файлов - то этот пункт нужен. Но на самом деле никто не знает будут, или нет...
 options MFS#Memory Filesystem файловая система памяти
 options MD_ROOT#MD is a potential root device корневой файловой системой может быть файловая система в памяти (нужно для бездисковых рабочих станций )
 options NFS#Network Filesystem Сетевая файловая система - если будете строить сеть между фряхами - оно нужно
 options NFS_ROOT#NFS usable as root device, NFS required корневым разделом может быть ФС находящаяся на другом компе. Нужно,
# опять-таки только бездисковым рабочим станциям
 options MSDOSFS#MSDOS Filesystem файловая система FAT12, FAT16 и FAT32. Если будете что-то таскать дискетками на виндовые машины и
# обратно - нужно. если будете монтировать форточные ФС - тоже нужно.
 options CD9660#ISO 9660 Filesystem файловая система CD-ROM дисков
 options CD9660_ROOT#CD-ROM usable as root, CD9660 required Корневым разделом может быть файловая система CD-ROM - опять таки для бездисковых рабочих станций
 options PROCFS#файловая система процессов
 options COMPAT_43 # Cовместимость с BSD 4.3 (отдельные приложения начинают себя неадекватно вести, без этого пункта)
 options SCSI_DELAY=15000#Задержка при загрузке для того, чтобы SCSI-контроллер успел обнаружить все подключенные к нему устройства. для современныхвинтов и контроллеров - 5 секунд, хватает за глаза. Если у Вас есть другие устройства на SCSI-шине - то читайте маны, что шли с ними.
 #options UCONSOLE#Allow users to grab the console если иксов на машиен нету - то этот пункт и не нужен
 #options USERCONFIG #boot -c editor
 #options VISUAL_USERCONFIG #visual boot -c editor
 #options KTRACE#ktrace(1) support
 options SYSVSHM#SYSV-style shared memory чё-то там про разделяемую память как я понял, это нужно в первую очередь графическим программам, но на всякий случай оставляю
 options SYSVMSG#SYSV-style message queues
 options SYSVSEM #SYSV-style semaphores
 options P1003_1B#Posix P1003_1B real-time extensions Насчёт этого пункта нигде ничё нарыть не удалось, самая подробная инфа в LINT - это какие-то расширения для работы в режиме реального времени.
 options _KPOSIX_PRIORITY_SCHEDULING# ну и шедулер, для этого самого Real Time - только вот не вполне понятно, какой нафиг шедулер для реального времени вообще может быть...
 options ICMP_BANDLIM#Rate limit bad replies ограничение неверных ответов по ICMP
 options KBD_INSTALL_CDEV # install a CDEV entry in /dev для всяких клав USB-овых
  options AHC_REG_PRETTY_PRINT# Print register bitfields in debug output. Adds ~128k to driver. для отладки
 options AHD_REG_PRETTY_PRINT # Print register bitfields in debug output. Adds ~215k to driver. для отладки
   
  # следующие две опции нужны для многопроцессорных систем
  options SMP# Symmetric MultiProcessor Kernel
 options APIC_IO # Symmetric (APIC) I/O
   
 device isa # поддержка шины ISA - советую не удалять этот пункт, даже на самых современных компах, т.к. даже в них есть ситемный таймер, клава и прочие вещи, которые с рождения ИСОвые и такими навсегда и останутся :)
 #device eisa # Шина EISA - я её видел то пару раз,на 486 компах...
  device pci # поддержка шины PCI
 Floppy drives# флоппики
 device fdc0 at isa? port IO_FD1 irq 6 drq 2# контроллер флопов
 device fd0 at fdc0 drive 0# первый флоп
 #device fd1 at fdc0 drive 1# второй флоп
 # If you have a Toshiba with its Y-E Data PCMCIA floppy,
# don't use the above line for fdc0 but the following one:
# какой-то тошибовский флопповод, подрубающийся по PCMSIA (для буков?)
#device fdc0
 
   
 # ATA and ATAPI devices# Контролеры IDE хардов
 device ata0 at isa? port IO_WD1 irq 14# первый канал
 device ata1 at isa? port IO_WD2 irq 15# второй канал
 device ata# ????????
 device atadisk # ATA disk drives собственно поддержка ATA-хардов
 device atapicd # ATAPI CDROM drives# CDROM`ы подключаемые к ATA
  #device atapifd # ATAPI floppy drives флопповоды подключаемые к ATA контроллеру (первый раз о таких узнал именно из конфига ядра)
  #device atapist # ATAPI tape drives Стриммеры подключаемые по ATA
  #options ATA_STATIC_ID #Static device numbering статическая нумерация устройств (я вот думал, что она всегда статическая)
     
  # SCSI Controllers # SCSI-контроллеры - без комментариев
  #device ahb # EISA AHA1742 family
  #device ahc # AHA2940 and onboard AIC7xxx devices
  #device ahd # AHA39320/29320 and onboard AIC79xx devices
  #device amd # AMD 53C974 (Tekram DC-390(T))
  #device isp # Qlogic family
  #device mpt # LSI-Logic MPT/Fusion
  #device ncr # NCR/Symbios Logic
  #device sym # NCR/Symbios Logic (newer chipsets)
  #optionsSYM_SETUP_LP_PROBE_MAP=0x40 # Allow ncr to attach legacy NCR devices when both sym and ncr are configured
     
  #device adv0 at isa?  
  #device adw  
  #device bt0 at isa?  
  #device aha0 at isa?  
  #device aic0 at isa?  
     
  #device ncv # NCR 53C500  
  #device nsp # Workbit Ninja SCSI-3  
  #device stg # TMC 18C30/18C50  
     
  # SCSI peripherals # периферийное сказёвое оборудование (собственно диски, накопители на магнитной ленте, CD-ROM`ы)
  #device scbus # SCSI bus (required)
  #device da # Direct Access (disks)
  #device sa # Sequential Access (tape etc)
  #device cd # CD
  #device pass # Passthrough device (direct SCSI access)
     
  # RAID controllers interfaced to the SCSI subsystem # сказёвые рэйды
  #device asr # DPT SmartRAID V, VI and Adaptec SCSI RAID
  #device dpt # DPT Smartcache - See LINT for options!
  #device iir # Intel Integrated RAID
  #device mly # Mylex AcceleRAID/eXtremeRAID
  #device ciss # Compaq SmartRAID 5* series
  #device twa # 3ware 9000 series PATA/SATA RAID
     
  # RAID controllers # рэйд-контроллеры
  #device aac # Adaptec FSA RAID, Dell PERC2/PERC3
  #device aacp # SCSI passthrough for aac (requires CAM)
  #device ida # Compaq Smart RAID
  #device ips # IBM/Adaptec ServeRAID
  #device amr # AMI MegaRAID
  #device mlx # Mylex DAC960 family
  #device pst # Promise Supertrak SX6000
  #device twe # 3ware Escalade
     
  # atkbdc0 controls both the keyboard and the PS/2 mouse
  device atkbdc0 at isa? port IO_KBD # контроллер клавы
  device atkbd0 at atkbdc? irq 1 flags 0x1 # клава
  device psm0 at atkbdc? irq 12 # PS/2 мышь
     
  device vga0 at isa? # Ну, это, куда моник прикручивать :)
  # splash screen/screen saver  
  #pseudo-device splash  
  # syscons is the default console driver, resembling an SCO console # системная консоль -
  device sc0 at isa? flags 0x100 # без этого пункта всё работает, но на локальном мониторе ничего не показывает
     
  # Enable this and PCVT_FREEBSD for pcvt vt220 compatible console driver # это для всяких иксов нужно
  #device vt0 at isa?  
  #options XSERVER # support for X server on a vt console
  #options FAT_CURSOR # start with block cursor If you have a ThinkPAD, uncomment this along with the rest of the PCVT lines
  #options PCVT_SCANSET=2 IBM keyboards are non-std
  device agp # support several AGP chipsets Поддержка шины AGP
     
  # Floating point support do not disable. # какой-то драйвер расширений для математического сопроцессора
  device npx0 at nexus? port IO_NPX irq 13  
  # Power management support (see LINT for more options # управление питанием (ну, вот, зачем серверу засыпать?)
  #device apm0 at nexus? disable flags 0x20 # Advanced Power Management
     
  PCCARD (PCMCIA) support
  #device card  
  #device pcic0 at isa? irq 0 port 0x3e0 iomem 0xd0000  
  #device pcic1 at isa? irq 0 port 0x3e2 iomem 0xd4000 disable  
     
  # Serial (COM) ports  
  device sio0 at isa? port IO_COM1 flags 0x10 irq 4  
  device sio1 at isa? port IO_COM2 irq 3  
  #device sio2 at isa? disable port IO_COM3 irq 5  
  #device sio3 at isa? disable port IO_COM4 irq 9  
     
  # Parallel port  
  #device ppc0 at isa? irq 7  
  #device ppbus # Parallel port bus (required)
  #device lpt # Printer
  #device plip # TCP/IP over parallel
  #device ppi # Parallel port interface device
  #device vpo # Requires scbus and da
     
  # PCI Ethernet NICs  
  #device de # DEC/Intel DC21x4x (``Tulip'')
  #device em # Intel PRO/1000 adapter Gigabit Ethernet Card # (``Wiseman'')
  #device txp # 3Com 3cR990 (``Typhoon'')
  #device vx # 3Com 3c590, 3c595 (``Vortex'')
  # PCI Ethernet NICs that use the common MII bus controller code. # NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
  #device miibus # MII bus support Вообще, MII bus нужен для всех современных сетевух, поэтому его комментировать не надо. у меня сетевухи исовые, потому закомментил.
  #device dc # DEC/Intel 21143 and various workalikes
  #device fxp # Intel EtherExpress PRO/100B (82557, 82558)
  #device pcn # AMD Am79C97x PCI 10/100 NICs
  #device rl # RealTek 8129/8139
  #device sf # Adaptec AIC-6915 (``Starfire'')
  #device sis # Silicon Integrated Systems SiS 900/SiS 7016
  #device ste # Sundance ST201 (D-Link DFE-550TX)
  #device tl # Texas Instruments ThunderLAN
  #device tx # SMC EtherPower II (83c170 ``EPIC'')
  #device vr # VIA Rhine, Rhine II
  #device wb # Winbond W89C840F
  #device xl # 3Com 3c90x (``Boomerang'', ``Cyclone'')
  #device bge # B roadcom BCM570x (``Tigon III'')
  # ISA Ethernet NICs.  
  # 'device ed' requires 'device miibus'  
  #device ed0 at isa? disable port 0x280 irq 10 iomem 0xd8000  
  #device ex  
  #device ep  
  #device fe0 at isa? disable port 0x300  
  # Xircom Ethernet  
  #device xe  
  # PRISM I IEEE 802.11b wireless NIC.  
  #device awi  
  # WaveLAN/IEEE 802.11 wireless NICs. Note: the WaveLAN/IEEE really  
  # exists only as a PCMCIA device, so there is no ISA attachment needed  
  # and resources will always be dynamically assigned by the pccard code.  
  #device wi  
  # Aironet 4500/4800 802.11 wireless NICs. Note: the declaration below will  
  # work for PCMCIA and PCI cards, as well as ISA cards set to ISA PnP  
  # mode (the factory default). If you set the switches on your ISA  
  # card for a manually chosen I/O address and IRQ, you must specify  
  # those parameters here. device an  
  # The probe order of these is presently determined by i386/isa/isa_compat.c.  
  #device ie0 at isa? disable port 0x300 irq 10 iomem 0xd0000  
  #device le0 at isa? disable port 0x300 irq 5 iomem 0xd0000  
  device lnc0 at isa? disable port 0x280 irq 10 drq 0  
  #device cs0 at isa? disable port 0x300  
  #device sn0 at isa? disable port 0x300 irq 10  
  # Pseudo devices - the number indicates how many units to allocate.  
  pseudo-device loop # Network loopback сетевая петля
  pseudo-device ether # Ethernet support # поддержка Ethernet
  #pseudo-device sl 1 # Kernel SLIP
  #pseudo-device ppp 1 # Kernel PPP
  #pseudo-device tun # Packet tunnel.
  pseudo-device pty # Pseudo-ttys (telnet etc) псевдо консоли (ssh, telnet)
  #pseudo-device md # Memory "disks"
  #pseudo-device gif # IPv6 and IPv4 tunneling
  #pseudo-device faith 1 # IPv6-to-IPv4 relaying (translation)
  # The `bpf' pseudo-device enables the Berkeley Packet Filter. # Be aware of the administrative consequences of enabling this!
  pseudo-device bpf #Berkeley packet filter псевдо-устройство, используется программами подсчёта траффика, сетевыми сканерами...
     
  # USB support  
  #device uhci # UHCI PCI->USB interface
  #device ohci # OHCI PCI->USB interface
  #device usb # USB Bus (required)
  #device ugen # Generic
  #device uhid # "Human Interface Devices"
  #device ukbd # Keyboard
  #device ulpt # Printer
  #device umass # Disks/Mass storage - Requires scbus and da
  #device ums # Mouse
  #device uscanner # Diamond Rio MP3 Player USB Ethernet, requires mii
  #device urio  
  #device aue # ADMtek USB ethernet
  #device axe # ASIX Electronics USB ethernet
  #device cue #CATC USB ethernet
  #device kue # Kawasaki LSI USB ethernet
     
  # FireWire support  
  #device firewire # FireWire bus code  
  #device sbp # SCSI over FireWire (Requires scbus and da)
  #device fwe #Ethernet over FireWire (non-standard!)



Также были добавлены несколько строк мною - для поддержки IPFW и ipforward. /usr/src/sys/i386/conf/>cd ../../../
/usr/src/>make buildkernel KERNCONF=main_kernell.2005-26-11 && \
make installkernel KERNCONF=main_kernell.2005-26-11


Ядро стало меньше почти втрое. Перезагружаемся командой shutdown -r now, и проверяем всё ли работает нормально.
Теперь рассмотрим вариант, что у вас что-то неполучилось. В простых случаях, например, не работает сеть - надо просто изменить конфиг и пересобрать ядро. Для этого можно и локально поработать недолго :) В более сложном варианте - фря не грузится вообще - такое вполне возможно, если Вы на горячую руку ампутировали что-то нужное - например подержку SCSI-контроллера на котором висят винты, или вообще ампутировали файловую систему из ядра :) Бывает и такое. Тоже не надо терять голову, проблема решается сравнительно просто - надо загрузиться со старым ядром и заново пересобрать новое. На моменте загрузки, когда идёт 10-секундный обратный отсчёт времени (у меня, кстати, 2-х секундный :)) надо сделать то, что он просит - нажать любую клавищу, кроме [Enter], я, например, жму 'Esc': Hit [Enter] to boot immediately, or any other kay for command prompt.
Booting [kernel] in 8 seconds...

Type '?' for a list of commands, 'help' for more detailed help.
ok _

Как итог мы получаем приглашение загрузчика. Советую ознакомится со списком команд - их совсем мало, и времени это немного займёт. Теперь, выгружаем новое ядро из памяти, загружаем туда GENERIC (или Ваше старое ядро, если на машине какой-то нестандартный набор железа), и загружаем ОС: ok unload
ok load kernel.GENERIC
/kernel.GENERIC text=0x3418b5 data=0x4c0e0+0x34af4 syms=[0x4+0x474b0+0x4+0x5037c]
ok boot

После загрузки собираем новое ядро и снова пробуем.
---------------------------------------------------------------
machine i386 добавить(по умолчанию в 7 не указан) описывает архитектуру РК (amd64, i386, sparc) но можна и без него
------------------------------------------------------------------------
Всё прошло. Оказалось , что в 7.0 realese не надо комментировать в ядре IPv6 и потом в firewall некоторые опции видать уже встроены
(дос атак)
----------------------------------------------------------------------
config GENERIC - проверка на синтаксис вновь заполненого ядра
----------------------------------------------------------------------
после всех изменений, переходим в каталог /usr/src и выполняем следующую команду (если вы компилируете на многопроцессорной машине, имеет смысл выполнять make с ключом -j, где n – количество процессоров:)

#make -j4 buildkernel KERNCONF=kern1 && make installkernel KERNCONF=kern1

Параметр j4 означает собирать в 4 потока, то есть значительно быстрее. Если у вас не Pentium3, а хотя бы какой-нибудь dualcore тогда применение этого параметра будет целесообразны

Если вдруг новое ядро не загрузилось, тогда делаем так. При загрузке появляется 10 секундная пауза, выбираем пункт 6 и делаем такие действия

OK unload kernel_name

OK load /boot/kernel.old/kernel

OK boot

, где kernel_name - имя нового ядра при сборке

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

OK unload kernel_name

boot /boot/kernel.old/kernel


======
unload
boot kernel.old

Таким образом ты загрузишь предыдущую версию системы. Исправь ошибки и повтори процесс установки нового ядра. Обычно со второго раза все получается =) Если же нет то загрузи GENERIC-ядро (вместо boot kernel.old, напиши boot kernel.GENERIC). Но ты особо не огорчайся, если оно не хочет компилится/работать/etc, мне пришлось перестраивать ядро 6 раз, чтобы добиться конфигурации "под себя" и "как мне удобно и нужно" =)