Ссылка на оригинал: http://ru.gentoo-wiki.com
С версии: 1.0
Обновлено: 1.5
Дата: 28.01.2008
В связи с выходом hal-0.5.10 и включении поддержки hal в xorg возникло много вопросов: где раскладки, где мышка, где тачпад, и прочее.
Сейчас xorg использует hal для устройств ввода и xorg.conf игнорирует Данное руководство предназначенно для безболезненного перехода на новую систему
В данном руководстве используются пакеты из ~x86(~amd64) ветки. Посему заботу о keywords оставляю на вашей совести.
# emerge --sync
(# eix-sync -v)
#emerge -avDNt xorg-x11
убеждаемся в наличии флага hal. При отсутствии — включаем. / В окончании сборки пакета xorg-server выведется список пакетов для пересборки, их надо пересобрать. Если не заметили или пропустили вот комманда для получения списка пакетов:
emerge portage-utils; qlist -I -C x11-drivers/
Правила(rules) пользователя можно разместить в каталогах:
/usr/share/hal/fdi/policy/20thirdparty/ или аналогичном /etc/hal/fdi/policy
получить список устройств "узнанных" hal можно командой lshal у меня системе(ноутбук с мультимедийными клавишами) оказалось несколько устройств которые совместимы с понятием "клавиатура", но основная была описана так:
udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input'
info.addons.singleton = {'hald-addon-input'} (string list)
info.capabilities = {'input', 'input.keyboard', 'input.keypad', 'input.keys', 'button'} (string list)
info.category = 'input' (string)
info.parent = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string)
info.product = 'AT Translated Set 2 keyboard' (string)
info.udi = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input' (string)
input.device = '/dev/input/event2' (string)
input.originating_device = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string)
input.physical_device = '/org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port' (string)
input.product = 'AT Translated Set 2 keyboard' (string)
input.x11_driver = 'evdev' (string)
input.xkb.layout = 'us' (string)
input.xkb.model = 'evdev' (string)
input.xkb.rules = 'base' (string)
input.xkb.variant = (string)
linux.device_file = '/dev/input/event2' (string)
linux.hotplug_type = 2 (0x2) (int)
linux.subsystem = 'input' (string)
linux.sysfs_path = '/sys/devices/platform/i8042/serio0/input/input2/event2' (string)Заметно что
input.xkb.layout = 'us' input.xkb.rules = 'base' input.xkb.variant =
нас не устраивает
Создаём новый файл
nano /usr/share/hal/fdi/policy/20thirdparty/10russian-layout.fdi
со следующим содержимым:
|
Файл: /usr/share/hal/fdi/policy/20thirdparty/10russian-layout.fdi |
|
<?xml version="1.0"
encoding="ISO-8859-1"?><!-- -*- SGML -*- -->
|
если у вас одно устройство ввода типа "клавиатура",то можно сточку
<match key="input.product" contains="AT Translated Set 2 keyboard">
заменить на
<match key="info.capabilities" contains="input.keyboard">
Так мы получим более универсальное правило. Можно заметить что названия опций перекликается с аналогами xorg.conf. Так и есть, в принципе здесь можно записать все те параметры которые вы использовали в xorg.conf только в приложении к XML.
ВАЖНО: Если у вас остались проблемы с расположением клавиш, то возможно так и следует сделать?
например:
Option "XkbRules" "xorg"
тоже самое что
<merge key="input.xkb.rules" type="string">xorg</merge> Driver "kbd"
=
<merge key="input.x11_driver" type="string">kbd</merge>
Сохраняем файл.
#/etc/init.d/hald restart
Проверяем системный лог и убеждаемся, что правило успешно добавленно.
#lshal
должно вывести следующие строчки:
... input.x11_driver = 'evdev' (string) input.xkb.layout = 'us,ru' (string) input.xkb.model = 'evdev' (string) input.xkb.options = 'grp:alt_shift_toggle,grp_led:scroll' (string) input.xkb.rules = 'base' (string) input.xkb.variant = ',winkeys' (string) ...
Если так и есть, то дело сделано. Если нет--внимательно перечитываем до просветления.
После чего можно перезапустить X-ы(перезагрузить компьтер, перезапустить xdm). Проверяем. Радуемся. Если не получаеться, то внимательно читаем лог Xorg, Скорее всего там можно найти ответ.
Пока проблема одна. Hal по умолчанию использует драйвер evdev,которые не всегда корректно работает в полноэкранных приложениях(игры)
#echo "SDL_VIDEO_X11_DGAMOUSE=0" >>/etc/env.d/02locale #env-update #source /etc/profile
Должно решить эту проблему.
Пока в разработке.
Целью статьи является установка ivman для автомонтирования устройств.
Внимание: часть информации может быть недействительна для старых версий Ivman, особенно Ivman 0.5.x. Пожалуйста, используйте последние стабильные версии Ivman.
Все требуемые пакеты есть в портежах, поэтому минимальным действием будет:
emerge -av ivman
Размаскируйте требуемые пакеты, если необходимо.
Если установка HAL выдаёт предупреждения, что не установлены "u64" или "BLKGETSIZE64"и вы используете ядро 2.6, обновите пакет linux-headers:
emerge --oneshot linux-headers
Когда linux-headers полностью обновится, пересоберите glibc:
emerge --oneshot glibc
Есть два пути использования Ivman: от root, или от обычного пользователя. У любого из методов имеются как преимущества, так и недостатки.
Для запуска Ivman выполните: /etc/init.d/ivman start
Чтобы Ivman стартовал при каждом запуске выполните: rc-update add ivman default
Все действия Ivman после запуска выполняются с привилегиями пользователя «ivman» и группы «plugdev».
По умолчанию, сменные устройства будут монтироваться для доступа на чтение/запись только входящим в группу «plugdev» (группа пользователей, которым разрешено использовать pmount). Это более безопасно, чем запуск Ivman от обычного пользователя.
Размонтирование дисков обычным пользователем может быть затруднено. Вам может потребоваться использование sudo pumount или sudo umount. Размонтирование используя 'media:/' ioslave в KDE может не работать.
Для легкого размонтирования
дисков обычными пользователями
отредактируйте файл
/usr/share/hal/fdi/policy/10osvendor/10-storage-policy.fdi,
изменив user на users в строке <merge
key="storage.policy.default.mount_option.user"
type="bool">true</merge>. Если у
вас нет такого файла, поищите похожий
в /usr/share/hal.
(Внимание:
это работает
для ivman 0.5.x, но
не для последних версий ivman.)
Для начала, у вас должен быть запущен HAL. Выполните как root: /etc/init.d/hald start
Для запуска HAL каждый раз при загрузке выполните: rc-update add hald default
Для запуска Ivman единично выполните команду ivman под вашим пользовательским аккаунтом. Чтобы Ivman запускался автоматически, когда вы входите в систему, вы должны сделать следующее:
KDE: создать символьную ссылки для ivman в ~/.kde/Autostart: ln -s $(which ivman) ~/.kde/Autostart/ivman
X: поместите ivman-launch --exit-with-session xinit & в ~/.xinitrc (требуется Ivman 0.6.9 или более новый).
E17: Создание Ivman.eap (секция 'приложения GTK+'), и добавьте это в ~/.e/e/applications/all/ . После отредактируйте ~/.e/e/applications/startup/.order, добавив Ivman.eap.
fluxbox: поместите ivman-launch --exit-with-session xinit & в ~/.fluxbox/startup (требуется Ivman 0.6.9 или более новый)
Другие: пожалуйста, добавьте ваши инструкции здесь!
Ivman запустится под вашим пользовательским аккаунтом.
|
Примечание: Вы можете не находиться в группе plugdev, потому что сейчас устройства монтируются так, что только вы имеете к ним доступ. |
По умолчанию сменные устройства будут монтироваться на запись/чтение для вас и не допускать больше никого.
Размонтирование работает как обычно. Работает стандартный pumount. Размонтирование используя 'media:/' ioslave в KDE работает.
Когда возможно (а, как правило, это возможно), запускайте Ivman одновременно от root и от обычного пользователя. В этом случае автомонтирование будет произведено от пользовательского запуска Ivman, а если пользовательский Ivman отсутствует, автомонтирование будет автоматически передано запуску Ivman от root. Не запускайте более одного пользовательского Ivman, даже под различающимися пользовательскими аккаунтами – это приведёт к войне за ресурсы.
Ivman не требует дополнительной конфигурации для автомонтирования. Данные fstab игнорируются, сменные устройства/диски будут смонтированы в /media. Однако, Ivman может быть использован не только для монтирования. Обретите свободу для добавления ваших супер-правил на этой странице :-)
|
Code: Смонтировать всё, что есть |
<ivm:Match name="ivm.mountable" value="true">
<ivm:Option name="mount" value="true" />
</ivm:Match>
|
|
Code: Открыть мой MP3-плеер в mc, когда он подключен |
<ivm:Match name="hal.info.product" value="IAUDIO">
<ivm:Option name="exec" value="xterm -e mc /home/share/music /media/IAUDIO" />
</ivm:Match>
|
|
Code: Открыть мою камеру в mc, когда она подключена |
<ivm:Match name="hal.info.vendor" value="FUJIFILM">
<ivm:Option name="exec" value="xterm -e mc /home/share/pics /media/usbdisk/DCIM/100_FUJI" />
</ivm:Match>
|
Для KDE
|
Code: Выводит всплывающее окошко, когда что-нибудь подключено |
<ivm:Match name="hal.info.category" value="storage">
<ivm:Match name="hal.storage.bus" value="usb">
<ivm:Option name="exec" value="kdialog --passivepopup 'USB storage device detected: $hal.info.vendor$ $hal.info.product$' 4" />
</ivm:Match>
</ivm:Match>
|
Использование записей в fstab (ivman 0.6.x или более новый)
Ivman 0.6.x или более новый использует pmount для монтирования устройств, и не нуждается в записях fstab. Но если хочеться, то можно.
pmount (и Ivman, таким образом) будет автоматически учитывать записи fstab. С версии 0.6.0, на каждую символьную ссылку будет создано правило, без использования IvmConfigMappings.xml. Устройства, не отмеченные в fstab, будут монтироваться в /media.
Использование записей в fstab (ТОЛЬКО ivman 0.5.x!)
Ivman 0.5.x может использовать ваш /etc/fstab. Если вы до этого пользовались supermount, вам необходимо изменить записи для использования ivman. Например:
/dev/cdroms/cdrom0 /mnt/cdrom iso9660 noauto,ro 0 0
Может также потребоваться отключение devfs.
Монтирование устройств с размонтированием от обычного пользователя (ТОЛЬКО ivman 0.5.x!)
Когда вы подключаете USB-носитель, ivman, запущеный от root монтирует его автоматически, но вы не можете размонтировать его иначе, чем от root. Это можно устранить, настроив HAL на монтирование всех устройств хранения данных с опцией "users", чего вам может очень не хотеться.
Создайте файл с названием whatever.fdi в директории /usr/share/hal/fdi/95userpolicy/ со следующим содержимым:
|
Файл: whatever.fdi |
<?xml version="1.0" encoding="ISO-8859-1"?> <!-- -*- SGML -*- -->
<deviceinfo version="0.2">
<!-- Append users to default mount options -->
<device>
<merge key="storage.policy.default.mount_option.users" type="bool">true</merge>
</device>
</deviceinfo>
|
Для дополнительной информации смотрите HAL Specifications.
Решение проблемы неразмонитирования флешки после ее физического удаления
Иногда может возникать ситуация что после удаления флешки команда mount выдает что она подмонтирована, в результате следующие подсоединение флешки приводит к тому что ей присваевается следующая буква и в резульатет чего возникает множество мертвых точек монтирования
|
Code: Пример ситуации когда два раза вынута и вставлена одна и таже флешка |
#mount /dev/sdb1 on /media/sdb1 type vfat (rw,noexec,nosuid,nodev,quiet,shortname=mixed,uid=104,gid=412,umask=007,fmask=0117,dmask=0007,iocharset=utf8) /dev/sdc1 on /media/sdc1 type vfat (rw,noexec,nosuid,nodev,quiet,shortname=mixed,uid=104,gid=412,umask=007,fmask=0117,dmask=0007,iocharset=utf8) |
это происходит из за того что по умолчанию ivman для размонтирования вызывает команду pumount /dev/sdb1, которая нечего не выполняет выдавая что /dev/sdb1 нет (udev успевает удалить это устройсво)
решение проблемы следующее правим /etc/ivman/IvmConfigBase.xml таким образом
|
Файл: /etc/ivman/IvmConfigBase.xml |
<!-- mount command. default is autodetected. Must be specified with
umountcommand. -->
<ivm:Option name="mountcommand" value="/usr/bin/pmount -u 007 '$hal.block.device$'" />
<!-- umount command. default is autodetected. Must be specified with
mountcommand. -->
<ivm:Option name="umountcommand" value="/usr/bin/sudo /bin/umount -l '$hal.block.device$'" />
|
а так же добавляя в /etc/sudoers строчку
|
Файл: /etc/sudoers |
ivman ALL = NOPASSWD: /bin/umount |
sudo конечно же должен быть установлен.
HAL может потребовать добавление coldplug на уровень загрузки boot для работы распознавания USB-устройств.
Если у вас проблемы с пользовательскими запусками ivman для автомонтирования USB flash, вам может потребоваться включить поддержку utf-8 в вашем ядре. Смотрите это обсуждение на форуме для подробностей.
Если ivman не работает, для начала остановите его:
/etc/init.d/ivman stop
Отредактируйте базовые настройки:
nano -w /etc/ivman/IvmConfigBase.xml
Отключите fork, и включите отладку. Потом запустите ivman из консоли. Смотрите сообщения.
Источник — «http://ru.gentoo-wiki.com/HOWTO_Ivman»
Под IDE понимаются устройства, подключаемые к IDE-интерфейсу. Обычно это жесткие диски и дисководы CD-ROM. Эти устройства должны быть документированы, как:
IDE
ATA
ATAPI
Enhanced IDE (EIDE)
Fast ATA или Fast ATA-2
IDE устройства могут передавать данные по шине в двух режимах - PIO и DMA. Учтите, что это именно передача данных по шине, с пластины данные читаются медленнее, а вот из аппаратного кеша на полной скорости.
PIO - Программный ввод/вывод, метод передачи данных между двумя устройствами, использующий процессор как часть маршрута данных (процессор выполняет команду чтения порта, считывает байт или слово данных в свой регистр, после чего переписывает его в память, затем повторяет эту процедуру до тех пор, пока вся необходимая информация не будет считана из устройства в память).
Бывает PIO Mode 0 1 2 3 4. Чем больше номер режима, тем быстрее. IDE ZIP100 приводы от Iomega например умеют только PIO mode 0. Старые CD-ROM обычно умеют PIO mode 4, если не могут DMA.
PIO Mode 0 = 3.3 Mb/s
PIO Mode 1 = 5.2 Mb/s
PIO Mode 2 = 8.3 Mb/s
PIO Mode 4 = 11.1 Mb/s
PIO Mode 5 = 16.7 Mb/s
DMA - Direct Memory Access - прямой доступ к памяти - собирательное название протоколов, позволяющих периферийному устройству передавать информацию непосредственно в системную память без участия центрального процессора, жесткие диски используют эту возможность в сочетании с возможностью перехватывать управление шиной и самостоятельно управлять передачей информации (bus mastering), что уменьшает нагрузку на процессор и повышает скорость передачи данных.
DMA встречается двух типов: UDMA и MDMA.
UDMA - ultra DMA - наиболее предпочитаемый тип, основной на сегодня. Бывает UDMA 0 1 2 3 4 5 6. Реально встречаются:
UDMA 2 = 33 mb/s
UDMA 4 = 66 mb/s
UDMA 5 = 100 mb/s
UDMA 6 = 133 mb/s
Последний встречается на не Intel матерях и не все винты его умеют. Кстати SATA винчестеры используют UDMA = 150 Mb/s.
Для UDMA 66 - 100 - 133 необходим 80-жильный шлейф, кроме того старые матери умеют его не на всех каналах, смотрите в инструкцию. Форсирование этих режимов с 40-жильным шлейфом может убить Ваши данные.
MDMA - multiword dma, более древний режим, предпочтителен для старых винчестеров и CD-ROM.
MDMA0 = 4.2 mb/s
MDMA1 = 13.3 mb/s
MDMA2 = 16.7 mb/s
На большинстве современных систем ядро автоматически определяет и настраивает IDE подсистему на максимальную производительность, если правильно его сконфигурировать. Но настроить что-нибудь всё равно можно.
ОЧЕНЬ ВАЖНО
Всё нижеописанное может убить Ваши данные, сломать Вам винчестер, спалить Вашу машину, удивить Вашу кошку и т.п. отмазы :)
Всё нижеописанное тестировалось, работало и работает на пяти машинах с ядром 2.6.9-gentoo-r4 и hdparm-5.7-r1, ACCEPT_KEYWORDS="~x86".
У Вас что-нибудь может не работать, работать не так.
ВАЖНО
Всё нижеописанное не относится к SATA дискам работающим через libata интерфейс (то есть видимым как sdX а не hdX). Поскольку sata интерфейс гораздо ближе к scsi чем к pata, разработчики вполне обоснованно используют scsi подсистему для работы с sata. Поэтому на текущий момент настройка sata винчестеров средствами hdparm невозможна, так как в libata не реализована специфичная для подобных програм функциональность.
В Сети есть патчик на ядро, добавляющий нужный функционал, но он ОЧЕНЬ сыр и с вероятностью в 100% убьёт вам раздел. Даже ссылку давать не буду, если Вы камикадзе, сами найдёте.
Убедитесь, что Ваши IDE диски используют DMA интерфейс, и ядро правильно настроено.
Для этого сделайте :
dmesg | less
или загляните в логи.
Нас будут интересовать сообщения о настройке ide контроллера и дисков. Мой кусок kern.log выглядит так (с моими комментариями):
Nov 14 17:45:54 tsoptimus kernel: ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Можно при загрузке сказать ядру idebus=66, но это работает только для не использующих DMA винчестеров и сидиромов. Подробности в /usr/src/linux/Documentation/ide.txt
Nov 14 17:45:54 tsoptimus kernel: ICH2: IDE controller at PCI slot 0000:00:1f.1
Nov 14 17:45:54 tsoptimus kernel: ICH2: chipset revision 2
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Определили первый контроллер.
Nov 14 17:45:54 tsoptimus kernel: ICH2: not 100%% native mode: will probe irqs later
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Это из-за того что интеловский контроллер использует разные прерывания для
каждого из каналов. Это нормально.
Nov 14 17:45:54 tsoptimus kernel: ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:DMA, hdb:pio
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
контроллер работает в busmaster режиме, dma для первого диска включен в BIOS.
Nov 14 17:45:54 tsoptimus kernel: ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:pio, hdd:DMA
Nov 14 17:45:54 tsoptimus kernel: Probing IDE interface ide0...
Nov 14 17:45:54 tsoptimus kernel: hda: ST340016A, ATA DISK drive
Nov 14 17:45:54 tsoptimus kernel: ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
Nov 14 17:45:54 tsoptimus kernel: Probing IDE interface ide1...
Nov 14 17:45:54 tsoptimus kernel: hdd: DV-516E, ATAPI CD/DVD-ROM drive
Nov 14 17:45:54 tsoptimus kernel: ide1 at 0x170-0x177,0x376 on irq 15
Nov 14 17:45:54 tsoptimus kernel: PDC20265: IDE controller at PCI slot 0000:02:0a.0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Определили интегрированный promise контроллер
Nov 14 17:45:54 tsoptimus kernel: ACPI: PCI interrupt 0000:02:0a.0[A] -> GSI 17 (level, low) -> IRQ 17
Nov 14 17:45:54 tsoptimus kernel: PDC20265: chipset revision 2
Nov 14 17:45:54 tsoptimus kernel: PDC20265: 100%% native mode on irq 17
Nov 14 17:45:54 tsoptimus kernel: PDC20265: (U)DMA Burst Bit ENABLED Primary MASTER Mode Secondary MASTER Mode.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
BIOS этого уродца не включает DMA, поэтому его включило ядро :)
Nov 14 17:45:54 tsoptimus kernel: ide2: BM-DMA at 0xac00-0xac07, BIOS settings: hde:pio, hdf:pio
^^^^^^^
Что мы собственно и наблюдаем.
Nov 14 17:45:54 tsoptimus kernel: ide3: BM-DMA at 0xac08-0xac0f, BIOS settings: hdg:pio, hdh:pio
Nov 14 17:45:54 tsoptimus kernel: Probing IDE interface ide2...
Nov 14 17:45:54 tsoptimus kernel: hde: FUJITSU MPG3204AT E, ATA DISK drive
Nov 14 17:45:54 tsoptimus kernel: ide2 at 0x9c00-0x9c07,0xa002 on irq 17
Nov 14 17:45:54 tsoptimus kernel: Probing IDE interface ide3...
Nov 14 17:45:54 tsoptimus kernel: hda: max request size: 128KiB
Nov 14 17:45:54 tsoptimus kernel: hda: 78165360 sectors (40020 MB) w/2048KiB Cache, CHS=65535/16/63, UDMA(100)
^^^^^^^^
Говорит само за себя
Nov 14 17:45:54 tsoptimus kernel: hda: cache flushes not supported
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
А вот это странно :( Ядро не сможет принудительно синхронизировать аппаратный кеш винчестера, в случае panic или oops будет не сладко. До этого было supported, разберусь...
Nov 14 17:45:54 tsoptimus kernel: /dev/ide/host0/bus0/target0/lun0: p1 p2 p3 p4
Nov 14 17:45:54 tsoptimus kernel: hde: max request size: 128KiB
Nov 14 17:45:54 tsoptimus kernel: hde: 40031712 sectors (20496 MB) w/512KiB Cache, CHS=39714/16/63, UDMA(100)
Nov 14 17:45:54 tsoptimus kernel: hde: cache flushes not supported
Nov 14 17:45:54 tsoptimus kernel: /dev/ide/host2/bus0/target0/lun0: p1 p2
Nov 14 17:45:54 tsoptimus kernel: hdd: ATAPI 48X DVD-ROM drive, 256kB Cache, UDMA(33)
Nov 14 17:45:54 tsoptimus kernel: Uniform CD-ROM driver Revision: 3.20
Проверьте настройки ядра. Мой кусок касающийся IDE выглядит так (с моими комментариями)
# ATA/ATAPI/MFM/RLL support
#
CONFIG_IDE=y
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_IDE_SATA is not set
# CONFIG_BLK_DEV_HD_IDE is not set
CONFIG_BLK_DEV_IDEDISK=y
#CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Был нужен для пишущих cdrom, сейчас не нужен (даже вреден)
CONFIG_IDE_TASK_IOCTL=y
CONFIG_IDE_TASKFILE_IO=y
^^^^^^^^^^^^^^^^^^^^^^^^
Не разбирался :)
#
# IDE chipset support/bugfixes
#
# CONFIG_IDE_GENERIC is not set
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Не нужен если Ваши IDE контроллеры известны ядру. У 99% людей они известны. Посему выключен.
# CONFIG_BLK_DEV_CMD640 is not set
CONFIG_BLK_DEV_IDEPCI=y
CONFIG_IDEPCI_SHARE_IRQ=y
^^^^^^^^^^^^^^^^^^^^^^^^^^
Разрешает устройству совместно использовать одно прерывание с другими устройствами.
В случае проблем можно выключить.
# CONFIG_BLK_DEV_OFFBOARD is not set
# CONFIG_BLK_DEV_GENERIC is not set
# CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_RZ1000 is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
ОПАСНО!!!! Если ваш винт или контроллер совсем никак не умеет DMA
или blacklisted, то есть риск потерять раздел.
CONFIG_IDEDMA_PCI_AUTO=y
^^^^^^^^^^^^^^^^^^^^^^^^^
А вот это значительно нежнее :) Если с винтом и контроллером всё в порядке, ядро само включит Вам DMA.
# CONFIG_IDEDMA_ONLYDISK is not set
Ежели ваш CDROM глючит с DMA или работает медленне чем в PIO режиме, ядро включит DMA только для винчестеров.
# CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_BLK_DEV_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_BLK_DEV_ATIIXP is not set
# CONFIG_BLK_DEV_CMD64X is not set
# CONFIG_BLK_DEV_TRIFLEX is not set
# CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5520 is not set
# CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_SC1200 is not set
CONFIG_BLK_DEV_PIIX=y
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Контроллер моей материнки
# CONFIG_BLK_DEV_NS87415 is not set
CONFIG_BLK_DEV_PDC202XX_OLD=y
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Второй контроллер моей материнки
CONFIG_PDC202XX_BURST=y
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Форсируем DMA для promise, так как его биос DMA не включает. Странный он.
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
# CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIIMAGE is not set
# CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_IDE_ARM is not set
CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_IDEDMA_IVB is not set
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Форсирование UDMA4 5 6 если ядро само его не включает.
ОПАСНО - если у Вас 40-жильный или повреждённый шлейф, вы можете убить данные.
CONFIG_IDEDMA_AUTO=y
# CONFIG_BLK_DEV_HD is not set
Сделайте, если ещё не сделали,
emerge hdparm
На одной консоли сделайте:
man hdparm
А на другой мы начнём играться :)
Делайте:
hdparm -tT /dev/hdX
Где X - буква вашего винчестера
Мы запустили тест скорости чтения из кеша и с пластины. Для усреднения результатов запустите его несколько раз.
Должны увидеть следующее:
/dev/hda:
Timing cached reads: 616 MB in 2.00 seconds = 307.74 MB/sec
Timing buffered disk reads: 74 MB in 3.04 seconds = 42.33 MB/sec
Первый результат с учётом программного кеширования, он у всех большой :)
Второй - собственно чтение с диска с учётом аппаратного кеширования.
Второй результат мы собственно и будем улучшать :) Цифры в районе 35-55 mb/s хороший результат, выше 50 без raid контроллера вы на парралельном интерфейсе вряд ли получите (хотя... кто знает...). Но в любом случае кроме скорости можно
Разбираемся с железом на железном уровне
Имеет смысл заглянуть в BIOS и в корпус.
ВНИМАНИЕ!!! Если вы страдаете хронической неуверенностью, криворукостью, боитесь потерять гарантию, пропустите этот раздел!
Иногда сборщики компьютеров страдают излишней жадностью или криворукостью, поэтому всегда имеет смысл проверить, всё ли внутри корпуса как надо.
Каждый канал IDE/AТА интерфейса поддерживает подключение двух устройств - master и slave. Конфигурация обычно задается перемычкой на устройстве. Кроме этих двух позиций там обычно присутствует и третья - cable select. Для работы устройств в положении перемычки cable select требуется специальный Y-образный шлейф, центральный разъем которого подключается к материнской плате. Крайние разъемы такого кабеля неравноправны - устройство, подключенное к одному разъему, автоматически становится master, к другому - slave.
Проверьте, чтобы шлейфы были 80-жильные, на 40-жильных вы не сильно ускоритесь :).
Каждый канал в каждый момент времени может обрабатывать только один запрос к одному устройству. Следующий запрос, пусть даже к другому устройству, будет ожидать завершения текущего. Разные каналы при этом могут работать независимо. Поэтому не стоит подключать два активно используемых устройства (например, два жестких диска), к одному каналу.
В идеале каждое IDE-устройство стоит подключать к отдельному каналу (в этом заключается основное преимущество SATA).
Практически все современные чипсеты поддерживают возможность использования различных режимов передачи данных для устройств, подключенных к одному каналу. Однако злоупотреблять этим все-таки не стоит. Два устройства, существенно различающихся по скорости, лучше все-таки разнести по разным каналам.
Не рекомендуется подключать к одному каналу жесткий диск и ATAPI-устройство (например, CD-ROM). Как было сказано выше, протокол ATAPI использует другую систему команд, и, кроме того, даже самые быстрые ATAPI-устройства намного медленнее жесткого диска, что может замедлить работу последнего.
Идеальная конфигурация.
Каждый винт и CD-ROM на отдельном шлейфе.
Приемлемая конфигурация.
На первом канале основной винт, на втором дополнительный master и CD-ROM slave
Тоже неплохо.
На первом канале два винчестера одного поколения, CD-ROM на втором.
Плохо!!!
На одном канале современный винт и древняя древность на полтора гига :)
Смотрим в BIOS. Включаем UDMA где только можно, включаем Bus master для контроллеров IDE, включаем IDE Block mode.
А что умеет наш винчестер? И что у него включено сейчас?
Делаем:
hdparm -iIv /dev/hdX | less
Получаем длинный листинг с описанием возможностей нашего винчестера. Пример моего с комментариями приведён ниже.
Эта секция коротко описывает, что у нас включено прямо сейчас.
/dev/hda:
multcount = 16 (on)
IO_support = 1 (32-bit)
unmaskirq = 1 (on)
using_dma = 1 (on)
keepsettings = 0 (off)
readonly = 0 (off)
readahead = 256 (on)
geometry = 65535/16/63, sectors = 40020664320, start = 0
Эта секция показывает необработанные для читабельности данные, прочитанные напрямую с винчестера.
Model=ST340016A, FwRev=3.19, SerialNo=3HS9R2GG
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=2048kB, MaxMultSect=16, MultSect=16
CurCHS=4047/16/255, CurSects=16511760, LBA=yes, LBAsects=78165360
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 *udma5
AdvancedPM=no WriteCache=enabled
Drive conforms to: device does not report version:
* signifies the current active mode
А вот это более интересно. Читайте комментарии в ней самой.
ATA device, with non-removable media
Model Number: ST340016A
Serial Number: 3HS9R2GG
Firmware Revision: 3.19
Standards:
Supported: 5 4 3 2
Likely used: 6
Configuration:
Logical max current
cylinders 16383 4047
heads 16 16
sectors/track 63 255
--
CHS current addressable sectors: 16511760
LBA user addressable sectors: 78165360
device size with M = 1024*1024: 38166 MBytes
device size with M = 1000*1000: 40020 MBytes (40 GB)
Capabilities:
LBA, IORDY(can be disabled)
bytes avail on r/w long: 4 Queue depth: 1
Standby timer values: spec'd by Standard
R/W multiple sector transfer: Max = 16 Current = 16
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Аппаратное блочное чтение. Может читать зараз 16 блоков. Так и делает.
Recommended acoustic management value: 128, current value: 254
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Управление акустикой. Чем больше значение, тем шумнее и быстрее.
DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 *udma5
Cycle time: min=120ns recommended=120ns
PIO: pio0 pio1 pio2 pio3 pio4
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Поддерживаемые режимы передачи. Звёздочка показывает текущий.
Cycle time: no flow control=240ns IORDY flow control=120ns
Commands/features:
Enabled Supported:
* READ BUFFER cmd
* WRITE BUFFER cmd
* Host Protected Area feature set
* Look-ahead
* Write cache
* Power Management feature set
Security Mode feature set
* SMART feature set
Device Configuration Overlay feature set
* Automatic Acoustic Management feature set
SET MAX security extension
* DOWNLOAD MICROCODE cmd
Security:
Master password revision code = 65534
supported
not enabled
not locked
not frozen
not expired: security count
not supported: enhanced erase
HW reset results:
CBLID- above Vih
Device num = 1
Checksum: correct
Имея эту информацию, мы можем ручками настраивать наш винчестер. Те параметры, которые и так настроены, настраивать не обязательно :). Сверяйтесь с man для hdparm, я расскажу про наиболее интересные параметры. \
Собственно настраиваем
Итак, параметры мы передаём как:
hdparm -параметр /имя/диска
Если hdparm ругается, значит или режим не поддерживается, или параметр не верный. Если режим не поддерживается, команда dmesg покажет нам последней строчкой ругань драйвера.
-a Количество секторов упреждающего чтения для файловой системы, то есть софтварное упреждающее чтение. Обычно значение по дефолту приемлемое, а наличие аппаратного упреждающего чтения смазывает эффект. Чем меньше, тем лучше в случае чтения кучи мелких файлов разбросанных хаотично по диску. Чем больше число, тем лучше для копирования фильмов и mp3.
-A Включение аппаратного упреждающего чтения винчестером. Обычно всегда включено по дефолту. Изменять следует, если в вышеописаном информационном выводе не стоит звёздочка перед Look-ahead в разделе Enabled Supported. 1 - включено, 0 - выключено.
-B Имеет смысл для нотебуков, управляет настройкой энергосбережения. Чем значение ниже, тем больше у винта желание остановить блин и заснуть :), от чего растёт время отклика. Значение 255 вырубает управление питанием, соответственно уменьшая время отклика. Не все винчестеры имеют собственное управление питанием. Проверьте параметр AdvancedPM= в коротком листинге с сырыми данными.
-c Значение 1 включает 32 битную передачу по внутренней шине, по шлейфу возможно только 16 бит. Значение 3 включает то-же самое с контролем чётности. Это более надёжно, но чуть медленне чем 1. По умолчанию всегда выключено, имеет смысл включить. разницы между 1 и 3 не заметил ни по скорости, ни по надёжности.
-d 1 - включено, 0 - нет. Признак использования DMA. Если у Вас стоит звёздочка напротив одного из dma режимов в вышеприведённых листингах, значит Вам этот параметр не нужен. Если не стоит, можно попробовать включить. ВНИМАНИЕ!!! Машина может зависнуть, раздел может навернуться!!! Если это случилось, что-то крепко не в порядке с железом или ядром!!!
-E Скорость cdrom. Если сильно воет... Просто укажите желаемую скорость. Для винтов бесполезен :)
-k и -K Сохранение настроек и опций винчестером. Это не означает что они автоматически сохранятся после перезагрузки. Это означает, что они сохранятся, если драйвер сделает reset контроллеру, или после спячки, но не гибернации (aka suspend to disk). 1 - сохранять. 0 - нет.
-m Количество секторов для аппаратного упреждающего чтения. Не может быть больше чем умеет винт. Смотреть в диагностический листинг, параметр MaxMultSect=. По дефолту обычно всегда максимум.
-M Управление акустикой. 254 - шумно и быстро. 0 - медленно и тихо. Многие драйвы умеют только 128 и 254. Многие вообще нисколько не умеют :)
-P Ещё одна ручка для регулирования аппаратного упреждающего чтения. Не работает ни на одном виденном мною винте. Может у Вас заработает?
-u Включить размаскирование прерываний. Если значение 1, то контроллер разрешает другие прерывания во время операции ввода-вывода. Это снижает нагрузку на систему и повышает отклик. Нужно включать. По умолчанию выключено. На оччень древних контроллерах система может повиснуть.
-W 1 - включает кеширование записи. Включено по дефолту у всех виденных мною винтов. Но пригодится может.
-X Самый мощный параметр. Позволяет вам принудительно выставить режим работы DMA. В последних версиях hdparm задаётся буквенно, например -X udma5. Внимание!!! Не включайте режимы, не поддерживаемые Вашим контроллером, или с плохим (40-жильным) шлейфом!!! Обычно ядро само выбирает максимальный режим DMA, и если оно не смогло, или выбрало как Вам кажется меньший режим чем можно, ПОДУМАЙТЕ!!! Вдруг тому есть ОБЪЕКТИВНЫЕ причины?.
Пробуйте параметры по одному, запускайте hdparm -tT, смотрите в dmesg.
Сидиромы понимают не все параметры из указанных выше. У разных винчестеров понимание тоже может отличаться :)
После того как наиграетесь, будем закреплять.
В /etc/conf.d/hdparm заносим понравившиеся параметры. У меня это выглядит так:
hda_args="-u1c3M254Kk"
hde_args="-u1c3M254Kk"
#hdd - cdrom
hdd_args="-u1c3Kk"
Делаем: rc-update add hdparm default
Затем: /etc/init.d/hdparm start
В ядрах 2.6 появилась возможность выбирать между четырьмя планировщиками ввода-вывода. У каждого планировщика есть свои достоинства и недостатки. По дефолту в ядро всунуты все четыре, и выбран anticipatory io cheduler. Кратенько опишу их.
no-op - очень мелкий и лёгкий планировщик. Мало чего умеет. Для винтов не пригоден. В основном используется если вместо винта - флеш.
anticipatory - выбирается по дефолту. Середина-наполовину для всего на свете. И там хорош, и тут хорош.
deadline - более лёгкий и простой чем anticipatory, лучше себя ведёт при "взрывных" нагрузках. При равномерной нагрузке имеет особенность задумываться и притормаживать.
CFQ - размазывает ввод-вывод равномерно между всеми процессами. Ввод-вывод медленный, но плавный и равномерный независимо от загрузки. Это мой выбор на сегодня.
Передайте ядру в строке загрузки GRUB или другого загрузчика параметр elevator=[cfq|as|deadline|noop], поработайте, сравните. Ненужные планировщики ввода/вывода можно убрать из конфигурации ядра перед его компиляцией. Подробней можно узнать в статье "Компиляция ядра Linux". Они в
general setup ->
Configure standart kernel features...
Как нибудь потом расскажу про тюнинг vm и свопа ...
Для начала, убедитесь что у вас установлены программы cdrecord и mkisofs, которые входят в пакет cdrtools. Если нет -- установите его:
emerge cdrtools
Конфигурация ядра и загрузчика
Убедитесь, что у вас ядро настроено соответствующим образом.
Ядра серии 2.4.x
Для ядер серии 2.4.x в ядро необходимо включить поддержку SCSI эмуляции: Linux Kernel Configuration:
Конфигурация ядра 2.4.x
ATA/IDE/MFM/RLL Support -->
IDE, ATA, and ATAPI Block Devices -->
<M> SCSI Emulation Support
SCSI Support -->
<M> SCSI Support
<M> SCSI CDROM Support
<M> SCSI Generic Support
Теперь, еще необходимо ядру при загрузке передать параметр hdc=ide-scsi (в данном случае предполагается, что ваш CD привод - это hdc).
Т.е. если вы используете grub, то его конфиг должен выглядеть примерно так:
Файл: /boot/grub/grub.conf
title Gentoo Linux
root (hd#,#)
kernel (hd#,#)/YOUR_KERNEL_NAME_HERE root=/dev/hdx# hdc=ide-scsi ANY_OTHER_KERNEL_OPTIONS_NEEDED
Т.е. если вы используете grub, то его конфиг должен выглядеть примерно так:
Файл: /boot/grub/grub.conf
title Gentoo Linux
root (hd#,#)
kernel (hd#,#)/YOUR_KERNEL_NAME_HERE root=/dev/hdx# hdc=ide-scsi ANY_OTHER_KERNEL_OPTIONS_NEEDED
Если вы ипользуете lilo, то соответсвующая часть конфига:
Файл: /etc/lilo.conf
# Linux bootable partition config
image = /boot/YOUR_KERNEL_NAME_HERE
append = "hdc=ide-scsi"
root = /dev/hdx#
label = Gentoo
read-only
Ядра серии 2.6.x
В ядрах серии 2.6.x вам уже нет необходимости включать SCSI (и, следовательно, не надо переконфигурировать загрузчик). Вместо этого, надо указать поддержку ATAPI CDROM: Linux Kernel Configuration:
Конфигурация ядра 2.6.x
Device Drivers -->
ATA/ATAPI/MFM/RLL support -->
<*> Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support
<*> Include IDE/ATAPI CDROM support
Подготовка ISO образа
Для начала, создайте папку:
mkdir /tmp/iso
а затем скопируйте все файлы, которые вы хотите записать, в созданную папку. cp *.doc /tmp/iso
Затем создайте image.iso mkisofs -o /tmp/image.iso /tmp/iso
Дополнительные опции при создании ISO образа
-r : добавляет (частично) поддержку так называемых расширений Rock Ridge, т.е. сохраняет специфичные для unix аттрибуты файлов. Например, добавляет поддержку длинных имён (до 255 символов, но не для MS Windows), символических ссылок. В отличие от опции -R, которая полностью соответсвует Rock Ridge, права доступа на файлы не сохраняются, они становятся доступны для чтения любому пользователю.
-jcharset=koi8-r: подразумевает под собой 2 опции: 1) -J включает поддержку Joliet, которая используется для распознавания длинных имён файлов под MS Windows; 2) -input-charset: устанавливает перекодировку символов для корректного отображения русских имён файлов. ("koi8-r" здесь дано для примера - замените на кодироку, используемую в вашей системе)
-joliet-long: Позволяет, чтобы имена Joliet могли быть установлены в 103 Unicode сивволы. Это нарушает Joliet спецификацию - но работает. Используйте с осторожностью.
-f : следование символическим ссылкам. Если вместо копирования файлов в /tmp/iso, вы просто создаёте в этой директории симлинки на них, то вы должны включить эту опцию.
-C : эта опция необходима, если вы хотите дописать мультисессионный диск (см. раздел [Как дописывать диски])
Выполните cdrecord --dev=ATAPI --scanbus
Вы должны увидеть нечто похожее на следующее:
Cdrecord-Clone 2.01a25 (i686-pc-linux-gnu) Copyright (C) 1995-2004 J?rg Schilling
scsidev: 'ATAPI'
devname: 'ATAPI'
scsibus: -2 target: -2 lun: -2
Warning: Using ATA Packet interface.
Warning: The related libscg interface code is in pre alpha.
Warning: There may be fatal problems.
Using libscg version 'schily-0.8'.
scsibus0:
0,0,0 0) 'SONY ' 'CD-RW CRX175A1 ' '5YS2' Removable CD-ROM
0,1,0 1) *
0,2,0 2) *
0,3,0 3) *
0,4,0 4) *
0,5,0 5) *
0,6,0 6) *
0,7,0 7) *
Здесь показано, что на шине 0,0,0 есть CD-RW привод. Предупреждение: В новых версиях cdrtools (2.01.01) и ядра 2.6.x надо писать cdrecord --dev=ATA --scanbus
cdrecord --dev=ATA:0,0,0 /tmp/image.iso
(Замените шину 0,0,0 на необходимую) Примечание: Вместо dev=ATA:0,0,0 можно указывать просто имя устройства, напирмер, dev=/dev/cdrw
Используйте опцию --speed=# для указания скорости записи
cdrecord --dev=ATAPI:0,0,0 --speed=4 /tmp/image.iso
Используйте --blank=fast для быстрой очистки CD-RW диска.
cdrecord --dev=ATAPI:0,0,0 --blank=fast
Большинство современных записывающих устройств поддерживает технологию BURN-free. К сожалению она не включена по умолчанию при запуске cdrecord. Для включения, добавьте опцию --driveropts=burnfree. Вы можете посмотреть, какие ещё опции поддерживает ваш CD-ROM посредством команды
cdrecord dev=/dev/cdrw driveropts=help -checkdrive
Если в файле /etc/default/cdrecord установить переменную CDR_DEVICE=ATAPI:0,0,0 (можно и CDR_DEVICE=/dev/hdc), то не придется каждый раз указывать устройство (ключ --dev=ATAPI:0,0,0) и тогда для очистки CD-RW диска понадобится набрать только следуюшее:
cdrecord --blank=fast
Если нужно разрешить пользователю запись на CD, то включите его в группу cdrom.
Если у вас всего один CD-ROM, то необходимо вначале создать файл-образ диска. Это можно сделать многими способами (с помощью dd, cat, cdrdao, readcd и т.д.). Лучше воспользоваться readcd, т.к. он уже входит в пакет cdrtools, и имеет множество интересных опций (смотри man readcd): readcd dev=/dev/cdrw -clone f=/tmp/image.iso
После этого запишем образ на болванку с помощью cdrecord:
cdrecord -v -eject dev=/dev/cdrw -raw96r -clone /tmp/image.iso
ВАЖНО: Ключи -raw96r и -clone необходимы ТОЛЬКО если вы создавали файл-образ с помощью команды readcd -clone.
Прежде всего, при создании и последующем дописывании мульти-сессионных дисков, необходимо всегда для cdrecord указывать опцию -multi, а для mkisofs использовать ключ -r или -R (т.е. включать расширение Rock Ridge). Таким образом создание первой сессий будет выглядить примерно так: Code: Запись первой сессии
mkisofs -r -f -jcharset=koi8-r -o /tmp/image.iso /tmp/iso/
cdrecord -v -multi driveropts=burnfree -eject dev=/dev/cdrw /tmp/image.iso
Для создания последующих сессий, нам нужна информация о номере начального сектора последней сессии и о номере сектора с которого будет начинаться новая сессия. Эта пара чисел выводится командой cdrecord -msinfo dev=/dev/cdrw. После этого данные числа указываются в команде mkisofs в качетстве аргументов к опции -C. Также, чтобы были видны файлы из предыдущей сессии, необходим ключ -M, аргументом к ключу -М служит имя устройства вашего CD-ROM (т.е. в нашем примере - это /dev/cdrw). Команда cdrecord остаётся такой же. Резюмируя вышесказанное получаем для записи последующей сессии: Code: Запись последующих сессий
mkisofs -r -f -jcharset=koi8-r -C $(cdrecord dev=/dev/cdrw -msinfo) -M /dev/cdrw -o /tmp/image.iso /tmp/iso/
cdrecord -v -multi driveropts=burnfree -eject dev=/dev/cdrw /tmp/image.iso
Классическое how-to по записи дисков на английском языке: http://www.tldp.org/HOWTO/CD-Writing-HOWTO.html
То же самое на русском:
http://www.opennet.ru/docs/HOWTO-RU/CD-Writing-HOWTO.html
Создание аудио дисков (на английском языке): en:
В данной статье будет подробно рассмотрен вопрос формирования и записи видео дисков формата DVD в Gentoo Linux.
Для начала, убедитесь что у вас установлены следующие программы: transcode
emerge -n transcode
cdrecord и mkisofs
emerge -n cdrtools
growisofs
emerge -n dvd+rw-tools
dvdauthor
emerge -n dvdauthor
также могут пригодиться: kino
emerge -n kino
cinelerra
emerge -n cinelerra-cvs
dvdrip
USE='cdr mplayer ogg subtitles xvid rar' emerge -n dvdrip
replex
emerge -n replex
cdrecord-prodvd
emerge -n cdrecord-prodvd
Использование transcode для декодирования видео произвольного формата и кодирования его в формат MPEG2, совместимый с DVD
Хотелось бы заметить, что если вы не любители программ с кучей непонятных опций, то вам следует попробовать программу dvdrip, которая является неплохим фронтендом для transcode с понятным интерфейсом.
Transcode, пожалуй, лучший инструмент для нашей задачи. Вам, возможно, придётся заглянуть в man страницу по transcode, чтобы понять те команды, которые используются здесь. Также вам могут пригодиться и другие инструменты для декодирования и кодирования вашего формата, так что не поленитесь заглянуть и в их man странички. Здесь будет приведен пример того, как конвертировать стандартный divx файл в широэкранный формат (без черных полос сверху и снизу). Затем мы конвертируем все это в формат letterbox 1.5:1. Зачем, спросите вы. Затем, что изначально широкоэкранный формат имеет соотношение 1.73 (16:9) с разрешением 720x416. DVD в свою очередь поддерживает размеры изображения только 720x480, 704x480, 352x480 и 352x240 (возможно это не все). Поэтому самое простое и качественное решение здесь - это привести наше видео к формату 720x480 (соотношение 1.5), добавив по 32 черных полоски сверху и снизу к изображению.
transcode -i test-divx.avi -V -y mpeg -F d -Y -32,0,-32,0 -E 44100 -b 128 -o showgirls-dvd
Отрицательные значения для параметра -Y сообщают transcode о том, чтобы добавить нужное количество черных полосок сверху и снизу. Если использовать положительные значения, то полоски будут соответственно убираться сверху и снизу. Часто вам может попасться видео уже в формате 720x480 или еще каком-то "хорошем" формате, тогда не нужно изменять его размеры, то есть просто не используйте опцию -Y.
Here's what some of those command line arguments mean: Вот, что означают остальные опции:
-V использовать YV12/I420 в качестве встроенного видео кодека [выключено изначально]
Это, как правило, намного быстрее чем RGB процессинг, но
некоторые импортированные модули могут не поддерживать этот формат.
Используйте эту опцию всегда, когда это возможно.
-y vmod[,amod]
видео[,аудио] модули для эксопртирования [отсутствуют изначально].
Если опустить, то transcode не будет кодировать никаким модулем.
Полностью установленный transcode имеет следующие модули:
<вырезано>
mpeg - (видео) MPEG 1/2 | (аудио) MPEG 1 Layer II
nasm должен быть доступен во время компиляции. Этот модуль не имеет
зависимостей. Этот модуль хорошо поддерживается.
Инетрфейс к библиотеке bbmpeg (включена в transcode). Может
кодировать в mpeg1, VCD, SVCD, MPEG2 и DVD видео форматы.
Кодированое видео является отдельным файлом, который следует объединить
с соответствующим аудио файлом после кодирования.
-F codec_string
параметры енкодера [зависят от модуля].
Параметр -F имеет разные значения для разных модулей.
<вырезано>
-y mpeg:
Синтаксис: -F "<base-profile>[,<resizer-mode>[,user-profile]]"
<base-profile> может быть одним из:
'1' = MPEG 1 (по умолчанию)
'b' = big MPEG 1 (экспериментальный)
'v' = VCD
's' = SVCD
'2' = MPEG2
'd' = DVD совместимый
<resizer-mode> может быть одним из:
0 = выключить resizer (по умолчанию)
1 = 352x288
2 = 480x480
3 = 480x576
4 = 352x240
<user-profile> Имя файла профиля. Вы можете
можно указать как абсолютный путь так и относительный
(относительно директории из которой запускаете transcode).
-Y top[,left[,bottom[,right]]]
определить (для енкодера) рамку по котрой будет обрезано изображение.
Отрицаельные значения будут добавлять рамку [отключено изначально].
-E r[,b[,c]]
частота сэмплирования выходного аудио [Гц], битов на сэмпл и каналы
[входящие данные]. Опция "-J resample" должна быть передана
не совместимым с ресэмплингом.
-B n[,m[,M]]
изменить размеры до высота-n*M горизонтальных полосок
[,ширина-m*M] вертикальных полосок [отключено изначально,32].
M должно иметь одно из значений 8, 16 или 32. Неважно какое M
вы используете. Также взгляниет на флаг fast опции -Z если
не хотите считать n и m вручную.
-b b[,v,[q,[m]]]
битрейт аудио енкодера кБит/с [,vbr[,quality[,mode]]] [128,0,5,0]
Параметр mode оперделяет какие модули будет использовать lame
при кодировании. Возможные значения для mode:
0 Joint Stereo (по умолчанию)
1 Full stereo
2 Mono
-o file
имя выходного файла, по умолчанию [/dev/null].
Если бы, к примеру, наше видео имело формат 728x424, то следовало бы воспользоватья командой типа следующей:
transcode -i showgirls-divx.avi -V -y mpeg -F d -B 1,1,8 -E 44100 -b 128 -o showgirls-dvd
Также обратитесь к опции -X для того, чтобы увеличить размеры видео.
Использование tcmplex для объединения аудио и видео данных
Transcode должен был создать *.m2v (mpeg-2 видео) и *.mpa (аудио) файлы в текущей директории. Теперь мы их объединим так:
tcmplex -o showgirls-dvd.vob -i showgirls-dvd.m2v -p showgirls-dvd.mpa -m d
Kino используется для получения видео с dv камер. Эта программа имеет возможности простейшего видеомонтажа (вырезать сцену, вставить, поменять местами). Она имеет удобный интерфейс для захвата видео (хотя вы можете использовать dvgrab для этой цели). Она использует фомат qt4linux mov по умолчанию для захвата.
Для более продвинутого монтажа cinelerra, пожалуй, пока единственный выбор под Linux. Это достаточно мощная, но достаточно долгая в освоении и пока что нестабильная (сохраняйтесь как можно чаще) программа. Вы можете просто импортировать тот же .mov полученный с помощью kino (dvgrab) в cinelerra (на самом деле, она падает при работе с большинством других форматов). Затем вы можете использовать cinelerra, чтобы привести оконченный фильм обратно к формату mov.
Как только вы наконец получите тот .mov файл, какой вы хотели, загрузите его опять в kino и перейдите в закладку export. Здесь вы уже можете экспортировать video в формат vcd, svcd или dvd. Формат DVD потребует достаточно много времени для конвертирования (желателен мощный процессор).
Использование replex (подготовка DVB записей с цифрового телевидения (Digital Television))
"Эти инструкции были испробованы на записях формата DVB-C, сделанных в Финляндии"
Примечание: пожалуй, для России эта глава абсолютно бесполезна, но если есть большое желание, то я переведу и её. Мало ли, кто где живет ;)
Digital television streams are transmitted as MPEG2-TS in which the TS stands for Transport Stream. This means that extra information, such as multiple audio streams, could be transferred along with the actual video. Quite fortunately, the video stream is already suitable for DVD without re-encoding which is both time consuming and stupid as it lowers the quality. Enter replex. First use czap for tuning into some channel:
czap -r -n 3
This tunes the DVB card to channel number 3. Now, record some data by typing:
cat /dev/dvb/adapter0/dvr0 > stream.ts
This simply writes raw data from the first tuner card into a file. After awhile press CTRL-C to stop recording.
Now, you should have a blob of data which could be played with e.g. mplayer. Next, you should use replex to transform TS format suitable for DVD. Enter following command:
replex -k -i TS -t DVD -o stream.dvd stream.ts
This command ignores possible errors in original stream (-k), assumes that input file is in TS format (-i TS), outputs format suitable for DVD (-t DVD), writes to a file called stream.dvd (-o stream.dvd) and reads its input from the file entered as a last parameter (stream.ts).
After a moment a file called stream.dvd should appear in the same directory where above command was entered. Now just follow the instructions from the next chapter onwards to burn this baby on a DVD.
Это самый сложный этап! Имея готовый MPEG2 файл, воспользуйтесь программой dvdauthor (или вашим любимым графическим фронтендом к ней (например, dvdstyler)), чтобы создать структуру директорий для записи DVD (VIDEO_TS и AUDIO_TS).
dvdauthor -o . showgirls-dvd.vob && dvdauthor -o . -T
Создание DVD образа для записи
Если директории AUDIO_TS и VIDEO_TS созданы у вас в директории bar, которая в свою очередь находится в текущей директории, то введите команду:
mkisofs -dvd-video -o ./bar.img ./bar/
и вы получите образ bar.img в текущей директории, который теперь следует записать на диск вашей любимой программой для записи дисков.
Или можете записать диретории AUDIO_TS и VIDEO_TS прямо из каталога bar/ набрав:
growisofs -Z /dev/dvd -dvd-video -V название_диска .
Где /dev/dvd - ваш DVD-writer.
В Linux существует множество способов записи DVD. Из уже показанных можно использовать cdrecord или growisofs.
С помощью графического интерфейса
Формат ISO можно записать с помощью программы X-CDroast (она использует cdrecord-ProDVD, которая требует ключ, что доставляет определенное неудобство).
Также можно воспользоваться прораммой k3b, котрая использует growisofs. Это, пожалуй, самый простой способ.
Из командной строки
Можно записать образ ещё и так:
cdrecord-ProDVD -dao -speed=4 -dev=/dev/dvd ./bar.img
Воспользуйтесь командой cdrecord -scanbus предварительно, чтобы определить какое устройство использовать для записи. Для устройств ATAPI используйте формат -dev=/dev/dvd или -dev=/dev/hdd (зависит от машины), для эмуляции SCSI устройств используйте -dev=0,0,0 или -dev=0,0,1 (зависит от машины).
Если у вас нет cdrecord-ProDVD можете использовать growisofs.
growisofs -dvd-compat -Z /dev/dvd=./bar.img
Подсказка: С помощью growisofs вы можете писать диски налету (без создания четырёхгигабайтного файла .iso):
growisofs -dvd-compat -Z /dev/dvd -dvd-video ./bar
Можно также воспользоваться скриптом, который расположен по адресу http://james.nontrivial.org/projdvd.htm
Слишком долгое время выполнения 'emerge --sync' на всех серверах в LAN. Согласно этикету gentoo, вы не можете синхронизироваться чаще одного раза в день
Общий NFS portage. Одна машина синхронизируется под управлением cron, остальные машины монтируют свою директорию /usr/portage с помощью NFS.
Общее представление
1. Обязательная поддержка nfs в ядре. В случае компиляции ее как модуля, добавить соответствующие строчки в modules.autoload
2. Если потребуется, перезагрузить или загрузить модуль nfs
3. Выполнить emerge nfs-utils
4. Настроить NFS/fstab для автоматического монтирования общего репозитария portage.
5. Установить локальный PORTAGE_TMPDIR на локальную файловую систему.
Только один сервер заботится о синхронизации portage (ночью по заданию cron'а).
Не нужен локальный rsync сервер.
Общий для всех каталог /usr/portage/distfiles означает, что вам не нужно скачивать одно и то же каждый раз, чтобы синхронизировать репозитарий portage на ваших ваши компьютерах.
И вообще, NFS - это классная штука ;)
Предупреждение: NFS является очень скудным протоколом по части безопасности. Убедитесь, что используете его только в пределах вашей локальной сети, где вы полностью доверяете вашим пользователям. Мы вас предупредили!
Поддержка ядра
У вас ДОЛЖНА быть включена поддержка NFS в вашем ядре, либо вкомпиленная в ядро (в таком случае необходимо будет перезагрузиться):
Linux Kernel Configuration: Встроенная поддержка
File systems --->
Network File Systems --->
<*> NFS file system support
[*] Provide NFSv3 client support
[ ] Provide NFSv4 client support (EXPERIMENTAL)
[ ] Allow direct I/O on NFS files (EXPERIMENTAL)
<*> NFS server support
[*] Provide NFSv3 server support
[ ] Provide NFSv4 server support (EXPERIMENTAL)
[ ] Provide NFS server over TCP support (EXPERIMENTAL)
либо в качестве модулей:
Linux Kernel Configuration: Включение модулей
File systems --->
Network File Systems --->
<M> NFS file system support
[*] Provide NFSv3 client support
[ ] Provide NFSv4 client support (EXPERIMENTAL)
[ ] Allow direct I/O on NFS files (EXPERIMENTAL)
<M> NFS server support
[*] Provide NFSv3 server support
[ ] Provide NFSv4 server support (EXPERIMENTAL)
[ ] Provide NFS server over TCP support (EXPERIMENTAL)
Добавляем NFS server support, так как на данной машине будет размещаться общий каталог portage. Поддержку клиента NFS можно добавить по желанию.
Сохраните конфиг вашего ядра и пересоберите его. Code: Пересборка ядра
gentoo # mount /boot //если это еще не сделано
gentoo # cd /usr/src/linux
Для ядер 2.4:
gentoo # make dep && make bzImage modules modules_install install
Для ядер 2.6:
gentoo # make && make modules_install
Перезагрузитесь, если включили поддержку NFS в ядро, или, если вы собрали ее как модули, просто запустите: modprobe nfs
Установите пакет
nfs-utils: emerge nfs-utils
Настраиваем автоматическое монтирование общего portage
rc-update add portmap default
rc-update add nfs default
Отредактируйте crontab на сервере (метод зависит от того, какой cron вы используете). Для vixie-cron и dcron команда выглядит так: crontab -e Добавьте код:
0 0 * * * emerge --sync > /dev/null 2>&1 || true --nospinner && emerge world -vup
Отредактируйте файл /etc/exports на сервере, чтобы в нем были следующие строчки:
/usr/portage ip_range/subnet(sync,no_root_squash,rw)
Отредактируйте /etc/fstab на клиентах, добавив в него следующий код:
SERVER_IP:/usr/portage /usr/portage nfs bg,hard 0 0
Отредактируйте /etc/modules.autoload.d/kernel-version, добавив следующую строку: nfs
Примечание: Кеш портежей не расшарен через nfs. Если каждый раз вас докучает обновление кеша при команде emerge сразу после синхронизации, попробуйте добавить следующее в crontab клиентов. Это обновит кеш на компьютерах ваших клиентов спустя 10 минут после старта синхронизации на сервере. Установите время согласно скорости вашего подключения.
10 0 * * * emerge --metadata
PORTAGE_TMPDIR
PORTAGE_TMPDIR должен быть локальным каталогом (для скорости).
Переменная PORTAGE_TMPDIR устанавливается в файле /etc/make.conf и по умолчанию указывает на /var/tmp, то есть на локальную файловую систему, но просто для того, чтобы увериться в том, что это так, а не иначе, сделайте: emerge info Если всё прошло успешно (а всё так и должно быть), вы спокойно можете очистить содержимое каталога /usr/portage на КЛИЕНТСКОЙ машине (например, чтобы освободить дополнительное свободное место на диске)
Пояснение кода
Запись crontab'а
0 0 * * * emerge --sync > /dev/null 2>&1 || true --nospinner && emerge world -vup
говорит о том, что раз в сутки, в полночь будут выполнятся синхронизация с перенаправлением вывода в мусор и без бегунка и emerge world -vup и отправка письма root'у о том, что должно быть обновлено - настройте корректно почту).
/etc/exports:
"/usr/portage" - каталог для экспорта
"ip_range/subnet" - только компьютеры из этого диапазона могут подключать его по сети
"(sync,no_root_squash,rw)" - полезные параметры, всегда мною используемые
/etc/fstab:
"SERVER_IP:/usr/portage" - что вы хотите подключить
"/usr/portage" - куда вы хотите подключить
"nfs" - ФС ресурса
"bg,hard 0 0" - полезные параметры, всегда мною используемые
/etc/modules.autoload.d/kernel-version:
"nfs" сообщает какой модуль загружать при загрузке ядра версии kernel-version
Советы? Пожелания? Похвала? Дайте нам знать.
Если вы получаете ошибку "Error starting NFS daemon" попробуйте
# mount -t nfsd nfsd /proc/fs/nfsd
это работает для меня.
Это руководство создается для людей, которые хотят использовать все возможности системы Portage.
Portage — это система управления пакетами Gentoo Linux. Ее возможности довольно велики — сборка пакетов из исходников, включая конфигурирование пакета на основе пользовательских USE-флагов; начальная настройка приложений; установка предкомпилированных пакетов; удаление програм; автоматическое обновление, и т. д. Однако, как показывает опыт, несмотря на отличную документацию, большинство пользователей не знают всех возможностей этой замечательной системы, поэтому очень часто Gentoo Linux подвергается незаслуженной критике. Данный документ — это попытка восполнить этот пробел.
Gentoo — многоплатформенная система, при этом количество поддерживаемых архитектур постоянно увеличивается. Поэтому возникает необходимость в так называемых профилях сборки. Профиль — это набор настроек по умолчанию для определенной архитектуры, или определенного класса задач (например, для систем с повышенной безопасностью существуют профили hardened и selinux). Наличие профилей, которые легко создавать, позволяет называть Gentoo не дистрибутивом, а метадистрибутивом, то есть дистрибутивом для создания других дистрибутивов ;). Но не об этом сейчас разговор.
Итак, для того, чтобы иметь работающую Gentoo-систему, необходимо выбрать себе нужный профиль. Профили по умолчанию находятся в каталоге /usr/portage/profiles. По названию профиля легко определить тот, который нужен вам. Например, 'default-x86-2004.2' — это стандартный профиль для архитектуры x86 версии 2004.2. Если в каталоге с профилем есть файл deprecated, то это означает, что данный профиль больше не поддерживается и выбирать его не следует.
После того как вы определились с выбранным профилем необходимо создать симлинк /etc/make.profile на каталог с выбранным профилем. Например, ln -s /usr/portage/profiles/default-x86-2004.2 /etc/make.profile Когда выйдет новая версия Gentoo, вам не надо бежать в магазин, покупать новые диски. Достаточно просто поменять симлинк /etc/make.profile на симлинк, указывающий на каталог с новым профилем.
Примечание: Сейчас идет переход на новый вид профилей — Cascading
Profiles. Такие профили имеют вид:
default-linux/x86/2004.2/
То есть настройки, общие для нескольких профилей не надо записывать по несколько раз. Пока что это экспериментальная фича, но если вы хотите помочь ее протестировать, то используйте на здоровье ;).
Примечание: Вообще-то переход на cascading profiles уже произошел, посему надо обновить то, что написано выше в этой секции "Portage profiles"
В профилях содержится следующая информация:
use-флаги использующиеся по умолчанию;
системные пакеты, то есть такие пакеты, которые устанавливаются при emerge system;
маскированные пакеты;
Настройки сборки пакетов по умолчанию. (CFLAGS, CHOST и другие);
Какие пакеты надо устанавливать при наличии альтернативных. (например, xorg или xfree)
Конфигурацию профилей напрямую менять не следует, так как ваши настройки будут удалены после следующей синхронизации с rsync-сервером. О том как правильно настраивать portage будет рассказано в следующем разделе.
/etc/portage и /etc/make.conf
Для того, чтобы изменить конфигурацию выбранного профиля, нужно использовать конфигурационные файлы в /etc/portage. Если у вас нет этого каталога, то его необходимо создать. Вот список конфигурационных файлов, которые читает Portage во время своей работы:
/etc/portage/package.mask
Синтаксис: в каждой строке содержится DEPEND ATOM, то есть один из знаков >, <, >=, <=, =, категорию, название и версию пакета. Логические знаки обязательны если указана версия пакета.
Например: >=net-www/mozilla-1.7
Неправильные примеры:
net-www/mozilla-1.7 (нет логической операции)
>=mozilla-1.7 (нет категории)
Предназначение: Маскирует пакеты. Может использоваться для того, чтоб Portage не обновлял нужный вам пакет. Например, если вы хотите использовать apache-1.3 вместо apache-2.0
/etc/portage/package.unmask
Синтаксис: такой же, как и у package.mask
Предназначение: Демаскирует пакеты, которые маскированы в профиле. Используется для установки нестабильных пакетов. Рекомендуется использовать только тем, кто хочет протестировать какой-то нестабильный пакет.
/etc/portage/profile/package.provided
Синтаксис: В каждой строчке содержится полное имя пакета, то есть category/name-version
Например: dev-lang/ghc-6.2.1-r1
Предназначение: Замена 'emerge --inject'. При наличии пакета в package.provided Portage будет считать, что этот пакет уже установлен в системе.
Примечание: Иногда этого бывает недостаточно и пакет приходится вносить в /etc/make.profile/package.provided (который удаляется после каждого emerge sync)
/etc/portage/mirrors
Синтаксис: Такой же как и у файла /usr/portage/profiles/thirdpartymirrors. Предназначение: Список зеркал, которые будут использоватся в первую очередь. Можно также указать зеркала sourceforge или gnu, которые будут использоватся в первую очередь.
Например: sourceforge http://keihanna.dl.sourceforge.net/sourceforge
Так же можно использовать тип миррора 'local'. Такое зеркало будет проверятся, даже если в ebuild'е пакета есть RESTRICT="NOMIRROR". Например:
local ftp://gentoo.linux.kiev.ua/pub/Linux/Gentoo/distfiles/
/etc/portage/package.use
Синтаксис: DEPEND ATOM USE-флаги
Например: x11-libs/gtk+ doc
Предназначение: Установка индивидуальных USE-флагов для отдельных пакетов
/etc/portage/package.keywords
Синтаксис: DEPEND ATOM KEYWORD KEYWORD — это идентификатор, который показывает, насколько стабилен пакет на данной архитектуре. Всего есть 4 вида KEYWORDS:
arch — пакет стабилен на архитектуре arch
~arch — пакет стабилен на архитекруре arch, но еще не прошло время тестирования
-arch — у пакета наблюдаются проблемы на архитектуре arch.
-* — пакет нестабилен на всех архитектурах
Например: >=app-editors/emacs-cvs-21.3 ~x86
Предназначение: Установка индивидуальных KEYWORDS для отдельных пакетов. Используйте если хотите, чтоб в вашей стабильной системе были отдельные нестабильные пакеты или наоборот :)
/etc/portage/categories
Синтаксис: В каждой строке содержится название категории. Предназначение: Используется для создание новых категорий для Portage.
Например: app-vasia
Теперь вы можете создать ebuild для пакетов категории app-vasia. emacs ${PORTDIR_OVERLAY}/app-vasia/pupkin/pupkin-0.0.1.ebuild
/etc/make.conf
Файл /etc/make.conf служит для настройки самого процесса сборки пакетов. Никаких сложных опций там нет, читайте внимательно комментарии в /etc/make.conf.example.
$PORTDIR_OVERLAY
Представьте себе такую ситуацию: вы хотите установить пакет, ebuild'а которого нет в официальном дереве, но кто-то уже его написал. Или вы собираетесь самостоятельно научится писать ebuild'ы, и вы хотите, чтоб Portage мог устанавливать нужные вам программы. Если вы запишете свой ebuild в /usr/portage, то он сотрется при следующей синхронизации с rsync-сервером. Для того, чтобы third-party ebuild'ы сохранялись, необходимо создать каталог для их хранения (например, /usr/local/portage) и записать его имя в переменную $PORTDIR_OVERLAY в файле /etc/make.conf. Теперь вы можете размещать свои ebuild'ы в этом каталоге, пример был показан в предыдущем разделе.
Это руководство расскажет о том как установить ebuild который не включен в официальное дерево портежей.
Первым делом мы должны указать PORTAGE_OVERLAY директорию, для этого необходимо отредактировать файл /etc/make.conf
Файл: /etc/make.conf
PORTDIR_OVERLAY="/usr/local/portage"
Таким образом мы позволяем устанавливать дополнительные ebuild'ы при этом не нарушая процесс синхронизации основного дерева портежей.
Проверьте наличие директории /usr/local/portage, и если ее нет создайте ее install -d /usr/local/portage
Когда помещаете новый ebuild в /usr/local/portage, вы должны использовать такую же схему как в /usr/portage (category/program/program.ebuild)
digest-файлы -- это файлы, которые содержат md5 суммы файлов, необходимых для установки пакетов. После того, как Portage скачает необходимые файлы, будет сделана проверка на соответствие файлов их md5-суммам (это дает возможность убедиться в целостности файлов). Для того, чтобы Portage мог устанавливать пакеты, необходим digest-файл. Digest-файл можно создать с помощью команды ebuild /usr/local/portage/category/program/program.ebuild digest Вручную редактировать созданные этой командой файлы не следует. При этом надо учитывать требования к имени ebuild-а. При переименовании ebuild-а в произвольное имя, команда
ebuild /usr/local/portage/category/program/program.ebuild digest выдаст ошибку:
!!! /usr/local/portage does not seem to have a valid PORTDIR structure.
Чтобы этого не произошло необходимо переименовывать ebuild в то же самое имя, но с приставкой номера релиза.
Пример:
В портежах имеется ebuild:
/usr/portage/media-sound/ncmpc/ncmpc-0.11.1-r1.ebuild
И архив исходных кодов:
/usr/portage/distfiles/ncmpc-0.11.1.tar.gz для этого ebuild-а.
Вы хотите наложить свой патч и добавить ebuild вашего пропатченного пакета в систему. Для этого вы должны скопировать исходный ebuld в ваш новый, но добавить к нему приставку '-rN', где N - номер релиза. Если такая преставка уже есть - изменить её номер:
cp /usr/portage/media-sound/ncmpc/ncmpc-0.11.1-r1.ebuild /usr/local/portage/media-sound/ncmpc/ncmpc-0.11.1-r2.ebuild
После этого пропатчите исходные коды пакета, на который ссылается исходный
ebuild /usr/portage/distfiles/ncmpc-0.11.1.tar.gz
и сохраните его в /usr/portage/distfiles/ncmpc-0.11.1-r2.tar.gz
Далее, нам нужно будет поправить наш новый ebuild:
vi /usr/local/portage/media-sound/ncmpc/ncmpc-0.11.1-r2.ebuild
И изменить строку:
SRC_URI="http://mercury.chem.pitt.edu/~shank/${P}.tar.gz mirror://sourceforge/musicpd/${P}.tar.gz"
На строку:
SRC_URI="http://mercury.chem.pitt.edu/~shank/${P}-r2.tar.gz mirror://sourceforge/musicpd/${P}-r2.tar.gz"
Т.е. добавив наш префикс '-r2', чтобы система знала, какой именно файл с исходными кодами ей необходимо прописать. В данном случае скачать с сайта этот пакет конечно же не удастся, но нам этого и не требуется - нам необходимо установить нами поправленный пакет.
После этого даём команду
ebuild /usr/local/portage/media-sound/ncmpc/ncmpc-0.11.1-r2.ebuild digest,
после чего emerge будет знать о вашем пакете.
Когда вы будете устанавливать пакет используя новый ebuild, скорее всего он будет masked, поэтому надо добавить имя пакета в /etc/portage/package.keywords
Создайте директорию /etc/portage/, если она еще не создана, и затем выполните команду:
echo "<category>/<package> ~x86" >>/etc/portage/package.keywords
Теперь этот пакет можно установить как и любой другой:
emerge -p package
emerge package
Unofficial ebuilds содержит список с коротким описанием сайтов где можно найти неофициальные пакеты Многие, написанные юзерами ebuild'ы, которые еще не попали в официальное дерево, находятся в Bugzill'е Gentoo. Найти нужные ebuild'ы можно с помощью поиска
Как известно, программы в Gentoo Linux устанавливаются из исходников. Это чистый текст. Однако, такие программы как, например, gcc или openoffice весят непростительно много. А у большинства из нас интернет не позволяет качать файлы больших объемов, а пользователи модемов вообще толком ничего обновить не могут. Для людей, которые экономят свои деньги, и была написана программа deltup. Вместо wget мы заставляем emerge использовать getdelta. Эта программа скачивает со специального сайта не весь архив программы, а только разницу между требуемой версией и тем, что у вас есть. Если у вас нет предыдущей версии программы, то придется качать весь архив.
Установка deltup
Теперь установим deltup:
emerge deltup и getdelta: emerge getdelta
Примечание: Если при выполнении emerge deltup выйдет ошибка "!!!All ebuilds that could satisfy "deltup" have been masked." перед командой добавьте ACCEPT_KEYWORDS="~x86"
Теперь нужно предупредить emerge о том что мы хотим использовать getdelta вместо wget. Для этого добавим в /etc/make.conf параметр FETCHCOMMAND: Файл: File /etc/make.conf
FETCHCOMMAND="/usr/bin/getdelta.sh \${URI}"
У getdelta есть свой файл конфигурации:/etc/deltup/getdelta.rc. Рассмотрим некоторые полезные параметры:
DELTUP_SERVER - указывает на используемый deltup сервер. Рекомендуется оставить без изменений, так как deltup-сервера сейчас собраны в сеть обращение к которой идёт через один сервер linux01.gwdg.de.
QUEUERETRY - количество секунд, которые будет ждать getdelta,пока сервер не сделает dtu-файл.
MAXIMUM_ACCEPTABLE_QUEUEPOS - максимальный номер в очереди ожидания. В связи с ростом загруженности deltup-сервера имеет смысл установить число побольше.
REMOVE_OLD - удалять старые версии файлов. Полезно, если вы не хотите складировать дистфайлы.
DO_NOT_REMOVE - путь к файлу, содержащему имена файлов, которые не следует удалять при включенной опции REMOVE_OLD
Могут возникнуть проблемы если вы скачали часть файла нужного для установки. Дело в том, что для продолжения докачки emerge использует не FETCHCOMMAND, а RESUMECOMMAND. Однако не следует менять RESUMECOMMAND на getdelta, так как getdelta не поддерживает докачку.
Данное руководство может помочь вам если с доступом в интернет из системы Gentoo проблемы. Однако у вас есть свежий portage-xxxxxxxx.tar.bz2. Если portage-xxxxxxxx.tar.bz2.md5sum не старше 40 дней(возможно это ограничение можно убрать, но автор этих строк не знает как) тогда проще сделать так :
Создаем папку /var/tmp/emerge-webrsync/ командой:
# mkdir /var/tmp/emerge-webrsync/
Копируем фаилы portage-xxxxxxxx.tar.bz2 и portage-xxxxxxxx.tar.bz2.md5, которые находятся к примеру, в корневом каталоге на CD-ROM диске (/mnt/cdrom/portage-xxxxxxxx.tar.bz2 и /mnt/cdrom/portage-xxxxxxxx.tar.bz2.md5sum), командами:
# cp /mnt/cdrom/portage-xxxxxxxx.tar.bz2 /var/tmp/emerge-webrsync/
#cp /mnt/cdrom/portage-xxxxxxxx.tar.bz2.md5sum /var/tmp/emerge-webrsync/
и обновляем портежи при помощи
emerge -webrsync: # emerge-webrsync
Теперь мы получили систему портежей по состоянию на xxxxxxxx.
Если же portage-xxxxxxxx.tar.bz2 старше 40 дней тогда:
Первым делом переименовываем каталог /usr/portage например в /usr/portage2:
# mv /usr/portage /usr/portage2
затем создаем переименнованный /usr/portage:
# mkdir /usr/portage
Перемещаем из /usr/portage2/distfiles исходники (если вам они нужны :) ) обратно в /usr/portage/distfiles:
# cp /usr/portage2/distfiles /usr/portage/distfiles
Теперь можно распаковывать наш новый portage-xxxxxxxx.tar.bz2, который находится, к примеру, в корневом каталоге на CD-ROM диске (/mnt/cdrom/portage-xxxxxxxx.tar.bz2), командой:
# tar -xvjpf /mnt/cdrom/portage-xxxxxxxx.tar.bz2 -C /usr/portage
После достаточно продолжительной распаковки нужно обновить кэш системы портежей:
# emerge metadata
Теперь мы получили систему портежей по состоянию на xxxxxxxx, а в каталоге /usr/portage2 - её бэкап.
Дополнительно можно прочитать:
HOWTO Обновление пакетов без доступа в интернет непосредственно из системы.
В моем случае это понадобилось в следующей (я полагаю довольно распространенной) ситуации: дома - нет интернета (дорогой, медленный - нужное подчеркнуть :) ), а на работе - хороший и бесплатный. Итак для начала необходимо получить список нужных пакетов. В этом примере мы хотим установить/обновить glibc baselayout texinfo gettext zlib binutils gcc ncurses. Список мы сохраняем на устаревший магнитный носитель, но счастливые обладатели более надежных носителей естественно могут пользоваться ими.
Получение списка для скачивания:
(Не забывайте '2' перед '>') Code:
# emerge -fp glibc baselayout gettext zlib binutils gcc ncurses 2> stage1.list
# mount -t vfat /dev/fd0 /mnt/floppy
# cp /mnt/gentoo/stage1.list /mnt/floppy
# umount /mnt/floppy
Теперь вставляем дискету в компьютер с хорошим каналом. (В моем случае это рабочий компьютер.) Если заглянуть в файл stage1.list, можно увидеть, что в нем перечисляются несколько ссылок на каждую загрузку. К сожалению, это не совсем то, что нам надо. Сначала список надо почистить от лишнего:
Очистка от лишних ссылок:
Этот скрипт привязан к формату вывода emerge, который может измениться без предварительного предупреждения - используйте с осторожностью! # cut -f 1 -d ' ' stage1.list > stage1.download
Теперь используем wget для загрузки списка пакетов:
# wget -N -i stage1.download
Получив все файлы, переносим их в наш компьютер в /mnt/gentoo/usr/portage/distfiles. И для проверки запустим
# emerge -pv glibc baselayout gettext zlib binutils gcc ncurses
Если в строке Total Download: указана цифра 0 - значит все было сделано верно. Можно теперь запускать установку:
# emerge glibc baselayout gettext zlib binutils gcc ncurses
У всего вышеописанного есть один недостаток. В фаиле stage1.download есть все необходимые для установки фаилы. Даже те, которые у вас могут быть в distfiles. А как вырезать ссылки из stage1.download на имеющиеся в distfiles фаилы я не знаю. Если кто знает - напишите.
Взято с Gentoo.org: http://www.gentoo.org/doc/ru/altinstall.xml
В world должен быть список программ, которые нужно доустановить к тем, которые уже входят в "system" (т.е. в текущий профайл).
в world не должно быть никаких библиотек, и т.д., которые не нужны сами по себе, а нужны только для удовлетворения чьих-то зависимостей (чтобы не продолжать устанавливать/обновлять их, если они уже станут не нужны по какой-то причине) программ, которые уже входят в "system", не должно быть в world. В world нельзя указывать определенную версию софта, это лучше делать в /etc/portage/package.mask.
Скрипт regenworld может помочь восстановить world путем анализа /var/log/emerge.log и генерации на его базе файла world (он перезапишет текущий world!).
Скрипт dep -p -w поможет найти избыточные записи в world(которые всё-равно нужны другим записям в world или входят в system).
Перед серьёзными обновлениями желательно просмотреть /etc/portage/*, т.к. там могут быть уже не актуальные записи мешающие текущему обновлению.
Обновление profile
Не каждый Gentoo release включает в себя новый profile (например, 2004.1 был без profile). Даже если новый profile есть, то переходить на него не обязательно (если это будет обязательно, то старый профайл будет deprecated и emerge об этом должен будет громко кричать).
Инструкции по обновлению profile будут выкладываться здесь:
http://www.gentoo.org/doc/en/gentoo-upgrading.xml
и как правило сводиться к изменению симлинка /etc/make.profile
Запустить emerge -uDpv --newuse world и проверить что USE-флаги для всех пакетов выставлены корректно, и при необходимости скорректировать
USE-флаги выставляются в /etc/make.conf и /etc/portage/package.use
Запуск обновления системы (если не нужно обновлять toolchain)
Если
emerge -uDav --newuse world
показывает что будет обновляться пакет входящий в toolchain (linux-headers, glibc, binutils или gcc), то крайне рекомендуется полностью перекомпилировать всю систему - см. следующий пункт - а иначе можно вместо следующего пункта просто запустить:
emerge -uDav --newuse world
Некоторые причины не использовать emerge -U вместо -u
Причина 1: Проблемы со SLOT
Это, к примеру, происходит потому, что некоторые люди хотели gimp-2 вместо gimp-1.2. Представьте ситуацию, где gimp-1.2 помечен stable и находится в SLOT 1, gimp-2 помечен unstable и находится в SLOT 2. Теперь при выполнении ACCEPT_KEYWORDS=~x86 emerge gimp получите gimp-2.
Позже, когда вы посчитаете, что наступило время обновить свою систему чем-либо похожим на "emerge -U world", эта команда установит gimp-1.2, потому, что gimp находится в world-файле, и флаг "-U" не обрабатывает SLOT должным образом.
Причина 2: Проблемы, в случае удаления ebuild-ов с Portage-дерева.
Допустим, в Portage находятся 2 версии пакетов foo, foo-1.4 (помеченный как stable) и foo-1.6 (помеченный как unstable). Вы хотите вариант unstable и делаете emerge, как с вышеуказанным gimp. Позже обновляете world как было сказано выше, но в промежутке этого времени вышло критическое обновление для foo-1.6 - foo-1.6.1. Теперь появляется несколько возможностей обработки.
foo-1.6 был удален из Portage. Будет установлен foo-1.4, несмотря на "снижение" версии вместо флага "-U"
Ситуация будет еще хуже, если foo-1.6 не был удалён из Portage по какой-либо причине: foo-1.6 (тот, что с критической уязвимостью) будет оставаться на вашей системе до тех пор, пока не будет помечено stable что-либо выше чем foo-1.6.
Обновление одного из пакетов входящих в toolchain
Если обновляется хотя-бы один из linux-headers, glibc, binutils или gcc, то рекомендуется пересобрать их дважды, после чего весь system, после чего весь world.
Примечание: Цель двойной компиляции toolchain - получить гарантированно стабильный и корректный toolchain не зависящий от предыдущего. Перекомпилировать system/world после этого жёсткой необходимости нет, по крайней мере если остальной софт продолжает работать (возможно даже используя библиотеки из старого toolchain - см. предыдущие пункты об апгрейде).
Цель перекомпиляции system/world - чтобы весь софт получил потенциальное преимущество от установки нового toolchain. system перекомпилируется перед world из тех-же соображений, т.к. при компиляции программ из world используются утилиты из system.
Если увеличивается первая или вторая цифра версии gcc, то перед второй сборкой нужно переключиться на новую версию через gcc-config - иначе новый gcc просто установится параллельно со старым в "новый слот", но по умолчанию использоваться будет старый.
При сборке system после двойной перекомпиляции toolchain нет необходимости опять компилировать toolchain как часть system. Аналогично при сборке world после system нет небходимости опять компилировать пакеты из system как часть world. Это можно попробовать обойти либо вручную, либо используя скрипты [1], либо через бинарные пакеты и `emerge -k` (я предпочитаю последний вариант).
Итак, рекомендованный набор команд:
# для того, чтобы безопасно использовать `emerge -k` нужно очистить
# каталог с текущими бинарными пакетами
# (напр., переместить его в /tmp/portage-packages)
pkgdir=$(portageq pkgdir)
mv $pkgdir /tmp/portage-packages1
install -d -o portage -g portage $pkgdir
# первая сборка toolchain
emerge linux-headers glibc binutils gcc-config gcc
# выбрать новый gcc если он установился в новый слот
gcc-config имя_или_номер_нового_gcc
# см. `gcc-config -l`
source /etc/profile
# компиляция toolchain с созданием бинарных пакетов
emerge -b glibc binutils gcc portage
# не компилить glibc, binutils и gcc
emerge -bke system
# не компилить предыдущие пакеты (включая system)
emerge -bke world
Примечание: Чисто теоретически существует пакет binutils-config, который когда-нибудь может потребоваться использовать аналогично gcc-config.
Примечание: Даже после `emerge -uDav --newuse world` в системе могут оставаться
устаревшие пакеты с дырами в безопасности - в слотах!
glsa-check -l | grep '\[N\]'
emerge ... # если нужно
После обновления системы в ней могут оказаться пакеты, которые никто не использует. Эти пакеты желательно удалить, т.к. они не будут в дальнейшем обновляться при `emerge -uDav --newuse world`.
emerge -a depclean # очень осторожно!!!
После обновления библиотек может потребоваться перекомпилировать программы, которые эти библиотеки используют:
Примечание: Для glsa-check, revdep-rebuild необходимо установить пакет gentoolkit
rm /root/.revdep-rebuild*.?_*
revdep-rebuild -p
revdep-rebuild
dispatch-conf
Если используется runit-init и обновлялся пакет baselayout, то нужно восстановить /sbin/init:
ls -l /sbin/*init*
if (/sbin/init это бинарник, а не симлинк) {
mv /sbin/init /sbin/init-sysv
ln -s runit-init /sbin/init
}
В процессе emerge world выдаётся очень много сообщений, причём важные комментарии перемешаны с командами компиляции, и отследить их при сборке нескольких пакетов одновременно не возможно.
Но все эти сообщения можно получить из log-файлов после окончания установки emerge world. Для этого нужно использовать либо enotice, либо portlog-info.
Существует много методов добиться этого, но мы используем самый удобный - тот, что работает с портежами.
Другие методы могут быть более подходящими для других ситуаций, когда главная проблема не только медленный процессор и долгое время сборки, например, если надо перенести Gentoo на систему, которая не может загружаться с CD или сети.
Скомпилировать Gentoo для старых систем x86 (например, Pentium Pro 200MHz с небольшим количеством RAM) можно на x86_64-системе с работающей Gentoo. Обратный трюк, собрать 64-битную систему на 32-битном компьютере, невозможен.
Я собирал систему в chroot-окружении согласно Gentoo-handbook, используя мою 64bit-Gentoo вместо "живого" CD:
# mkdir /your/new/gentoo
# tar xjvpf stage3-x86-*.tar.bz2 -C /your/new/gentoo
Отредактируйте переменные CHOST и CFLAGS, соответствующие вашей целевой системе (не изменяйте CHOST, если используете стадию 2 или 3 - возмите стадию для соответствующей платформы). У меня было:
# CHOST="i686-pc-linux-gnu"
# CFLAGS="-march=pentiumpro -Os -momit-frame-pointer -pipe"
# CXXFLAGS="$CFLAGS"
Далее переходим в chroot-окружение и выполняем все шаги, описанные в Руководстве Gentoo по установке.
Чтобы собрать ядро для i386 на x86_64-машине добавьте ARCH=i386 при конфигурации и компиляции ядра.
# make menuconfig ARCH=i386
# make clean dep modules modules_install bzImage ARCH=i386
# cp arch/i386/boot/bzImage /boot/vmlinuz
Размечать диск и создавать файловые системы на старом компьютере вам придется с помощью "живого" CD или другой системы Linux.
Переносим готовую систему на старый компьютер:
# cd /your/new/gentoo
# echo "/sys/*" >> tar_exclusions
# echo "/var/run/*" >> tar_exclusions
# echo "/tmp/*" >> tar_exclusions
# echo "/proc/*" >> tar_exclusions
#
# tar -C /your/new/gentoo -X tar_exclusions --preserve -cf ../gentoo.tar .
## можете добавить -v для подробного вывода или -j / -z для компрессии
# scp [-P ssh_port] ../gentoo.tar user@dest_pc:
На старой машине подготавливаем диски и распаковываем систему:
# tar -C /your/new/system --preserve -xf ~user/gentoo.tar
Теперь вы можете войти в chroot-окружение. Сконфигурируйте системный загрузчик и перегрузитесь. Теперь вы находитесь в новой, с иголочки, Gentoo.
Система теперь должна работать, но я заметил проблему - я не могу ничего скомпилировать. Похоже, что не работает ни C-препроцессор, ни gcc (обычно configure говорит, что /lib/cpp fails sanity check). Не знаю почему, но копирование /usr/include из chroot-каталога с исходной машины на старый компьютер эту проблему решило.
Удачи!
Оригинал на http://gentoo-wiki.com/HOWTO_Compile_on_another_computer
Перевод Poor Fred
Достаточно часто возникает необходимость подмонтировать раздел с установленным M$ Windows.
Для того, чтобы система могла работать с разделами FAT или NTFS, необходимо включить их поддержку в ядре.
Linux Kernel Configuration: Filesystems
File systems ->
DOS/FAT/NT Filesystems ->
(M) DOS FAT fs support
(M) MSDOS fs support
(M) VFAT (Windows-95) fs support
(M) NTFS file system support
Также надо включить поддержку следующих кодировок:
Linux Kernel Configuration: Native Language Support
File systems ->
Native Language Support ->
<M> Windows CP1251 (Bulgarian, Belarusian)
<M> Codepage 866 (Cyrillic/Russian)
Теперь можно примонтировать любой windows-раздел программой mount. mount -t file_system /dev/device /mnt/dir В нашем случае в качестве file_system необходимо указывать vfat или ntfs, в зависимости от файловой системы раздела с windows.
Монтирование FAT
Для монтирования разделов FAT нужно использовать следующую команду:
mount -t vfat -o codepage=866,iocharset=koi8-r,quiet,umask=000 /dev/hdd2 /mnt/win1
Для украинских символов:
mount -t vfat -o codepage=866,iocharset=koi8-u,quiet,umask=000 /dev/hdd2 /mnt/win1
Мы использовали дополнительные опции iocharset, codepage, quiet и umask.
Рассмотрим их внимательнее:
codepage - это кодовая страница используемая на монтируемой ФС. Так как мы из России,то нужно писать codepage=866. Эта опция нужна для перекодировки имен файлов.
iocharset - указывает какую кодировку использовать для ввода/вывода.Нужно указать свою системную локаль. Локаль можно узнать командой locale. (Здесь под вводом/выводом понимается ввод с и вывод на терминал. Иммено поэтому нужно указывать кодировку локали, т.е. кодировку которую используют программы запущенные в терминале.)
quiet - при копировании на файловую систему FAT программа попытается записать права доступа, владельца и т.д., но на FAT их сохранить нельзя и будет выведено сообщение об ошибке ( хотя файл скопируется ). Чтобы ошибки не появлялись мы просим смонтировать в "молчаливом" режиме
umask - в некоторых случаях у простого пользователя может не хватить прав на чтение или запись файлов из-за неправильно установленных прав на файлы и директории. Поскольку у файловой системы FAT нет прав доступа, они выставляются операционной системой ( в данном случае Linux ) на лету в соответствии с указанным значением umask. Про umask смотрите в umask(2)
Параметры codepage и iocharset можно задать прямо в ядре. Тогда не нужно будет писать их каждый раз:
Linux Kernel Configuration: FAT
File systems ->
DOS/FAT/NT Filesystems ->
(utf8) Default iocharset for FAT
(866) Default codepage for FAT
То есть вместо
mount -t vfat -o codepage=866,iocharset=utf8,quiet,umask=000 /dev/hdd2 /mnt/win1 можно писать
mount -t vfat -o quiet,umask=000 /dev/hdd2 /mnt/win1
Монтирование NTFS
Для монтирования NTFS разделов опции mount немного изменяться. Делаем это так:
mount -t ntfs -o nls=koi8-r,umask=0,ro /dev/hdd2 /mnt/win1
Для украинских символов:
mount -t ntfs -o nls=koi8-u,umask=0,ro /dev/hdd2 /mnt/win1
Вот что они значат:
nls - указывает на вашу системную локаль. Отсутствие опций codepage и iocharset связано с тем,что NTFS разделы используют юникод для хранения имен файла.
umask - указывает на то что читать файлы с этого раздела могут все. А вот писать не разрешает опция ro. Мы рекомендуем ее поставить,так как функция записи на разделы NTFS еще не отлажена.
В случае если вы в качестве системной кодировки используете utf-8, то опции mount должны быть следующими: mount -t ntfs -o utf8,umask=0,ro /dev/hdd2 /mnt/win1
utf8 - использовать UTF-8 для перекодировки имён файлов.
Если у вас все еще есть разделы ОС Windows на харде,то можно добавить монтирование этих разделов при загрузке.Для этого необходимо отредактировать файл /etc/fstab. Файл: /etc/fstab
...
/dev/hda9 /mnt/win1 vfat auto,codepage=866,iocharset=koi8-r,quiet,umask=000 0 0
#/dev/hda9 /mnt/win1 vfat auto,codepage=866,iocharset=koi8-u,quiet,umask=000 0 0
/dev/hda3 /mnt/win2 ntfs auto,nls=koi8-r,umask=0,user 0 0
еще к опциям можно добавить showexec, чтобы все файлы не выглядели исполняемыми, в случае с FAT32
Установка необходимых программ
emerge udev hotplug coldplug
Для активизации udev нам необходимо ядро 2.6. Лично у меня 2.6.12-mm1.
General setup --->
[*] Support for hot-pluggable devices
File systems --->
Pseudo filesystems --->
[ ] /dev file system support (OBSOLETE)
[ ] Automatically mount at boot (NEW)
[*] Virtual memory file system support (former shm fs)
Примечание: devfs Может быть включен, но автоматическое монтирование обязано быть выключено. А с учетом того, что из 2.6.13 его вообще собираются убрать... ну смотрите сами.
Примечание: Во всяком случае, из 2.6.14 убрали
Конфигурация системы
Не буду рассматривать как udev работает из таррбола, рассматриваю вариант чистого udev.
/etc/conf.d/rc:
...
RC_DEVICE_TARBALL="no"
...
RC_DEVFSD_STARTUP="yes"
...
Примечание: Последнюю опцию можно поставить в "no", когда мы убедимся в нормальной работоспособности udev
rc-update add coldplug boot rc-update add hotplug default
Конфигурация процесса загрузки
GrUB
К строке kernel от старого ядра необходимо дописать:
kernel /boot/kernel-2.6.9-r4 root=/dev/hda3 gentoo=noudev
А в строке kernel для нового ядра прописать:
kernel /boot/kernel-2.6.10-r6 root=/dev/hda3 gentoo=nodevfs
Попытка номер раз
В принципе можно перегружаться, но нас ждет одно неприятное сообщение. Вот примерно такое:
WARNING: Unable to open an initial console
Для того чтобы все было хорошо, нам необходимо загрузиться с другого носителя (например любой LiveCD) подмонтировать наш корневой раздел, и в каталоге /dev (каталог по идее должен оказаться абсолютно пустым) проделать следующее: Code:
# mknod -m 660 console c 5 1
# mknod -m 660 null c 1 3
POMAH007: Зачем же так жестоко - заставлять грузиться с компакта? Согласно udev guide с www.gentoo.org (http://www.gentoo.org/doc/en/udev-guide.xml), доступ к девственному /dev можно получить альтернативно: Code: Code Listing 3.1: Listing device nodes available at boot
# mkdir test
# mount --bind / test
# cd test/dev
# ls
Попытка номер два
С консолью вроде все в порядке, а вот иксы не хотят... грузимся в шелл и в файле конфигурации Xorg прописываем в разделе мыши:
Option "Device" "/dev/input/mice"
PS
Ну теперь вроде все так как было раньше. и старая конфигурация тоже работает. Если старая конфигурация не нужна, то убираем все из загрузчика, ставим в /etc/conf.d/rc - "no" и живем спокойно под udev.
PPS
Кстати тарболл может потребоваться пользователям нестандартных устройств, а так же некоторых сторонних модулей ядра
Стремление выжать из своего компьютера максимум производительности есть в каждом, ну почти в каждом ;-). Особенно его много в русских линуксоидах Gentoo'шниках ;) Мы попытаемся путем изменения флагов оптимизации ускорить работу приложений нашей системы.
ВНИМАНИЕ: Некоторые флаги могут сделать приложения нестабильными, так что нужно быть аккуратным.
Переменная окружения CFLAGS
Для указания параметров оптимизации компилятору GCC, используется переменная окружения CFLAGS. Эта переменная определена в /etc/make.conf, её можно изменить двумя способами:
Отредактировать эту переменную в /etc/make.conf;
Экспортировать ее в окружение (emerge будет использовать эти параметры, но каждый раз выполнять export неудобно):
export CFLAGS='параметры оптимизации'
Уровни оптимизации
Для gcc версий 3.x и выше существует только 5 уровней оптимизации: -O0 (без оптимизации), -O1, -O2 и -O3 (O3 - самый высокий уровень), а так же -Os.
Примечание: Если вы используете несколько -O опций, то только последняя объявленная будет оказывать влияние на процесс компиляции.
-O0
Отключает оптимизацию. Только переменные, объявленные register, сохраняются в регистрах.
-O(-O1)
Включает оптимизацию. Пытается уменьшить размер кода и ускорить работу программы. Соответственно увеличивается время компиляции. При указании -O активируются следующие флаги: -fthread-jumps, -fdefer-pop.
На машинах, у которых есть слоты задержки, включается опция -fdelayed-branch.
На тех машинах, которые способны поддерживать отладку даже без указателя на стек функции, также включается опция -fomit-frame-pointer.
На других машинах могут быть включены и другие флаги.
-O2
Оптимизирует еще больше. GCC выполняет почти все поддерживаемые оптимизации, которые не включают уменьшение времени исполнения за счет увеличения длины кода. Компилятор не выполняет раскрутку циклов или подстановку функций, когда вы указываете -O2. По сравнения с -O, эта опция увеличивает как время компиляции, так и эффективность сгенерированного кода.
-O2 включает все флаги оптимизации наследованные от -O. Также включает следущие флаги оптимизации:
-fforce-mem -foptimize-sibling-calls
-fstrength-reduce -fcse-follow-jumps -fcse-skip-blocks
-frerun-cse-after-loop -frerun-loop-opt -fgcse -fgcse-lm
-fgcse-sm -fgcse-las -fdelete-null-pointer-checks -fexpensive-optimizations
-fregmove -fschedule-insns -fschedule-insns2 -fsched-interblock
-fsched-spec -fcaller-saves -fpeephole2 -freorder-blocks
-fre-order-functions -fstrict-aliasing -funit-at-a-time -falign-functions
-falign-jumps -falign-loops -falign-labels -fcrossjumping
-O3
Оптимизирует еще немного. Включает все оптимизации -O2 и также включает флаг -finline-functions и -fweb.
-Os
Включает оптимизацию по размеру. -Os флаг активирует все флаги оптимизации из -O2, в основном те, которые не увиличивают размер выходного файла. В дальнейшем выполняются оптимизации по уменьшению размера кода.
-Os выключает следущие флаги оптимизации: -falign-functions, -falign-jumps, -falign-loop, -falign-labels, -freorder-blocks, -fprefetch-loop-arrays.
Примечание: Более полное описание флагов -Ox, -fflag смотрите в man gcc
Оптимизация под тип процессора
Не все процессоры одинаковы,поэтому давайте укажем компилятору на наш тип процессора. Для этого есть опции -mtune и -march.Отличие в том,что с опцией -mtune компилятор сделает код,который будет совместим с более младшими моделями процессора,в то время как с -march этого не происходит.Вот список возможных значений для данных опций:
i386
i486
i586
i686
pentium
pentium-mmx
pentiumpro
pentium2
pentium3
pentium4
pentium-m
prescott
nocona
k6
k8
k6-2 (не рекомендуется ставить, из-за багов в компиляторе, заменять на i686)
k6-3
athlon
athlon-tbird
athlon-4
athlon-xp
athlon-mp
athlon64
opteron
winchip-c6
winchip2
c3.
Внимание! pentium-m - это аналог для pentium3. Если процессор в вашем ноутбуке Mobile Intel Pentium 4 - M, то нужно ставить опцию pentium4 или pentium4m (они равнозначны)
Примечание(JohnBat26) (обновлено в 1.5): Если Вы используете компилятор версии 4.2.0 и выше, то вместо указания специфичного типа процессора, можно указывать одно из двух (в параметрах: -march и -mtune):
generic: если Вы хотите, чтобы Ваш скомпилированный код запускался на всех процессорах, архитектуры x86;
native: если Вы хотите оптимизировать код только для Вашего процессора. В этом случае компилятор будет брать сведения о процессоре путем вызова cpuid ! .
Выбор оптимальных параметров
Для этого есть очень интересная утилита. emerge acovea
Правда существующие профили рассчитаны только на pentium 3/4, и на gcc 3.3/3.4, Но в принципе добавить свою конфигурацию тоже не составляет труда. Также рекомендуется добавить в конфигурацию опции -ftracer и -mfpmath=sse. В некоторых случаях они дают значительный прирост производительности сгенерированного кода.
После чего вызываем утилиту runacovea -config gcc33_pentium3.acovea -bench evobench.c Ждем несколько часов и получаем оптимальные флаги компиляции.
Возможны различные тесты, которые хранятся в каталоге /usr/share/acovea/benchmarks, И различные конфигурации платформы /usr/share/acovea/config, к которым при желании можно добавить свою.
nano - Nano's ANOther editor
Nano - достаточно простой и удобный текстовый редактор, клон редактора pico
emerge nano
Конфигурация
Файл: /etc/nanorc
Запуск редактора
nano -w somefile
Параметр -w здесь означает запрет переноса строк.
В данной статье речь пойдет о том, как настроить udev для автоматического монтирования и отмонтирования usb-носителей. Ведь согласитесь, неудобно каждый раз монтировать флэшки из консоли. А когда вам нужно быстро что-то скинуть с одной флэшки на другую? Здесь я привожу одно из возможных решений.
У меня установлена следующая версия udev:
sys-fs/udev-069
Я умышленно не ставлю более новые версии, т.к. с ними возникают проблемы при загрузке firmware на моем компьютере. Возможно в более новых версиях что-то работает по-другому, но суть одна и та же.
Создаем правила для flash-носителей
Правила udev, в соответствии с которыми устройствам назначаются имена, а также выполняются специфические действия, расположены в /etc/udev/rules.d/*. В этой директории уже есть файлы, содержащие правила, у меня их было 2:
# ls /etc/udev/rules.d
05-udev-early.rules
50-udev.rules
Такие названия им были даны неспроста. Дело в том, что udev обрабатывает файлы в этой директории в алфавитном порядке по возрастанию. Вообще, при написании правил udev следует помнить 2 главные вещи:
Udev считывает файлы из /etc/udev/rules.d в алфавитном порядке.
Найдя первое подходящее правило для устройства, udev прекращает дальнейший поиск.
Давайте добавим свой файл с правилами так, чтобы он обрабатывался раньше, чем файл с правилами по умолчанию (50-udev.rules). Назовем его 10-udev-my.rules. Содержимое нового файла будет следующим:
Файл: /etc/udev/rules.d/10-udev-my.rules
# First rule
SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="add", NAME="%k", GROUP="disk", RUN+="/etc/udev/scripts/udev-flash-mount add %k"
#Second rule
SUBSYSTEM=="block", KERNEL=="sd*", ACTION=="remove", RUN+="/etc/udev/scripts/udev-flash-mount remove %k"
Теперь разберемся в том, что написали.
Первое правило (добавление устройства)
SUBSYSTEM=="block" При добавлении нового устройства в систему возникает множество событий разных классов. block - это класс для блочных устройств, который нам больше всего подходит для составления правила. Для просмотра значений всех переменных, возникающих событий используйте udevmonitor --env Т.о. здесь мы реагируем только на событие, в окружении которого есть переменная SUBSYSTEM со значением block .
KERNEL=="sd*" Эта часть правила сравнивает имя устройства, которое было дано по умолчанию ядром, с шаблоном. В данном случае нам нужны такие имена как: sda, sda1, sdb, sdb1 и т.д.
ACTION=="add" Реагируем на событие добавления устройства. Например, usb флэшка была вставлена в разьем.
NAME="%k" Обратите внимание на то, что здесь стоит один знак равенства, а не два, как в предыдущих частях правила. Это говорит о присваивании, а не сравнении. Здесь мы присваиваем вставленному устройству имя, которое соответствует тому, что было дано по умолчанию ядром. %k это одна из переменных окружения. Подробнее о них можно прочитать в man udev.
GROUP="disk" Причисляем устройство к группе дисковых.
RUN+="/etc/udev/scripts/udev-flash-mount add %k" Это самая интересная часть скрипта. Здесь мы добавляем ("+=") одно из действий, которое произойдет после обработки правила. В данном случае мы запускаем скрипт (он будет рассмотрен далее) /etc/udev/scripts/udev-flash-mount и передаем ему 2 параметра. Первый указывает на то что нужно выполнить действия по добавлению и инициализации нового устройства, а второй содержит имя устройства, с которым нужно выполнять действия.
Второе правило (удаление устройства)
ACTION=="remove" Реагируем на удаление устройства.
RUN+="/etc/udev/scripts/udev-flash-mount remove %k" Здесь мы запускаем скрипт, использовавшийся в первом правиле, но уже для выполнения действий после удаления устройства из системы. Этот скрипт будет выполнен как только ядро заметит, что устройство было удалено из системы. Это не самое лучшее решение, т.к. данные могут быть утеряны, но об этом в следующем разделе.
Теперь напишем скрипт, который будет выполняться после добавления устройства и после его удаления. Допустим он будет размещен в /usr/bin/. Итак, от пользователя root:
# su
Создадим файл:
# touch /etc/udev/scripts/udev-flash-mount
Сделаем его исполняемым:
# chmod u+x /etc/udev/scripts/udev-flash-mount
Напишем в нем следующее: Файл: /etc/udev/scripts/udev-flash-mount
#!/bin/bash
LOG="/var/log/udev"
sleep 3
DEV=`echo $2 | sed -n '/^sd[a-z][1-9]\?/p'`
if [ "$1" = "add" ]; then
if [ "$DEV" != "" ]; then
echo "--- `date` ---" >> $LOG
echo "Mounting /dev/$DEV" >> $LOG
mkdir /mnt/$DEV >> $LOG 2>&1
chmod a+rwx /mnt/$DEV >> $LOG 2>&1
mount /dev/$DEV /mnt/$DEV -o sync,umask=0000,iocharset=cp1251 >> $LOG 2>&1
fi
elif [ "$1" = "remove" ]; then
if [ "$DEV" != "" ]; then
echo "--- `date` ---" >> $LOG
echo "Unmounting /dev/$DEV" >> $LOG
umount /dev/$DEV >> $LOG 2>&1
rm -rf /mnt/$DEV >> $LOG 2>&1
fi
fi
Задержка в 3 или более секунд необходима для того, чтобы ядро успело выполнить свои действия по инициализации устройства. Если не лень, то поэкспериментируйте с задержкой. Если скрипту был передан параметр add, то он создает папку с именем устройства, затем пытается примонтировать устройство в эту папку. Весь вывод, в том числе и ошибки, выводятся в файл лога. Соответственно, при вызове скрипта с параметром remove, он пытается отмонтировать устройство и удалить ранее созданную папку. Предупреждение: Опция sync в параметрах mount является необходимой, т.к. форсирует мгновенную запись на устройство. Если ее не будет, то когда вы удалите устройство из системы, данные не будут записаны на него. Поэтому, чтобы избежать проблем такого рода, дождитесь пока индикатор на носителе перестанет мигать и после этого извлеките устройство. НО для файловой системы fat c версии ядра linux 2.6.13 sync ставить нельзя т.к. функционирование данной опции сильно изменилось и максимальная скорость записи на usb2.0 это 200 клибойт в секунду а для usb1.0 это где то 10 - 20 килобайт в секунду. Кроме того, опция sync в параметрах mount убьет Вашу флешку с гарантией за 6 месяцев использования. См. http://bugs.debian.org/309625
Предупреждение: Внимание! Если какая-либо запущенная программа просматривает содержимое папки, в которую смонтировано устройство, то скрипт не сможет отмонтировать его и удалить папку. Поэтому сначала убедитесь в том, что ни одна из программ не использует эту папку.
Последний скрипт можно немного модернизировать. Предположим, если вы монтируете свою камеру, чтобы просмотреть фотографии, то можно передать скрипту еще один параметр из udev правила, например, с производителем устройства. Либо можно проанализировать содержимое каталога и на основе этого выполнить какие-либо действия. Все в ваших руках, дерзайте
Glibc - свободная библиотека, предоставляющая системные вызовы и другие основные операторы для основных систем GNU/Linux. Если C является наиболее распространённым языком, используемым для программирования в Linux, такая же судьба постигла и glibc - она является продуманной частью ядра системы. Glibc может быть оптимизирована на вашей системе для ускорения операций различными способами. Оптимизация, естественно, зависит от вашей системы и её использования. Это также зависит от установки флагов USE, доступных при выполнении emerge. До применения рекомендаций рекомендуется узнать о назначении и использовании флагов USE. Есть неплохая инструкция здесь.
Эффект CFLAGS
Компиляция Glibc с возможностями GCC используется в основном коде glibc. Glibc идентифицирует GCC как компилятор и использует установленный флаги CFLAGS.Подробней здесь. Используя правильные флаги CFLAGS для вашей системы, вы можете хорошо оптимизировать glibc.
Улучшение оптимизации
Если вы использовали -fomit-frame-pointer, вы можете также поместить glibc-omitfp во флаги USE. Повторно пересоберите glibc. Code: Remerging glibc
emerge --newuse -v world
При этом соберутся Glibc и её зависимости. При компиляции glibc этот флаг активизирует флаг -enable-omitfp, который, в свою очередь, указывает glibc на использование --fomit-frame-pointer. В результате более безопасно устанавливается указатель кадра. Этот флаг устанавливает максимальную оптимизацию glibc и предоставляет два типа библиотек - 'оптимизированная' и 'стандартная'. То есть, по умолчанию будут использоваться оптимизированные библиотеки, но при необходимости можно будет использовать 'стандартную' версию. Это увеличит размер glibc и приведет к обычному поведению при установленном --fomit-frame-pointer, т.е. сделает невозможным отладку (debug) программ, так что не используйте этот флаг если вы планируете заниматься разработкой программ. Теоретически этот флаг может вызвать некоторые ошибки компилятора, хотя на практике он достаточно безопасен, тем не менее вы были предупреждены.
Модели потоков
glibc поддерживает 2 различных модели потоков - старую linuxthreads и новую nptl. По умолчанию, если не был указан флаг nptlonly, кроме nptl собирается и версия с linuxthreads. В случае, если у вас нет устаревшего программного обеспечения, вы можете указать флаг nptl. Если у вас современная система без сторонних бинарных пакетов, будет лучше указать nptlonly, чтобы избежать сборки glibc дважды (с поддежкой linuxthreads и без неё).
В основном это основано на еженедельном новостном бюллетене Gentoo от 8 ноября 2004 года, который можно найти здесь (en:TIP Specifying only needed locales). Вы можете выбрать, какие локали (включая раскладки и установки клавиатуры, времени и т.д.) будут собраны при установке. Если вы не ограничите локали, используемые в вашей системе, будут собраны все имеющиеся локали, начиная с aa_DJ (локаль Афар для Джибути) через en_GB (английская локаль для Великобритании) и заканчивая zu_ZA.utf8 (локаль Зулу для Южной Африки). При ограничении сборки локалей вы можете сохранить до 90% места, необходимого для Glibc в вашей системе, сохранить время, необходимое на сборку ненужных вам локале и, как следствие, уменьшить общее время компиляции. Если вы действительно не нуждаетесь в них всех (а трудно представить, кому это могло бы понадобиться), вы можете ограничить их необходимым минимумом.
Используйте флаг USE userlocales для сборки только тех локалей, которые указаны в /etc/locales.build.
Отредактируйте /etc/make.conf в вашем любимом редакторе и поместите userlocales где-нибудь между "" в строке USE="".
Другой способ - изменить /etc/portage/package.use используя данную команду: Code: Activating the userlocales USE flag for glibc
echo "sys-libs/glibc userlocales" >> /etc/portage/package.use
После этого вы можете указать локали, которые хотите использовать:
Файл: nano -w /etc/locales.build
#Читайте комментарии в начале файла для большей информации!
en_US/ISO-8859-1
en_US.UTF-8/UTF-8
#en_GB/ISO-8859-1
#en_GB.UTF-8/UTF-8
de_DE/ISO-8859-1
de_DE@euro/ISO-8859-15
ru_RU.UTF-8/UTF-8
В glibc-2.3.6-r4 или glibc-2.4-r2, был удалён флаг userlocales. Вы должны править файл /etc/locale.gen и удалить /etc/locales.build.
Вы можете воспользоваться для этого следующими командами: Code: Convert locales.build to locale.gen
cd /etc
grep '^[^#].*' locales.build | sed 's:/: :' > locale.gen
rm locales.build
nano -w locale.gen
Файл: nano -w /etc/locale.gen
#Читайте комментарии в начале файла для большей информации!
en_US.UTF-8 UTF-8
en_US ISO-8859-1
ru_RU.UTF-8 UTF-8
de_DE ISO-8859-1
de_DE@euro ISO-8859-15
Вы можете найти правильные значения локалей в файле /usr/share/i18n/SUPPORTED.
Помогите! Я не знаю, какими должны быть настройки моей локали!
Не волнуйтесь, это просто. Записи в этом файле должны быть в формате <locale>/<charmap>. <locale> это локаль из каталога /usr/share/i18n/locales, а <charmap> -- это имя одного из файлов каталога /usr/share/i18n/charmaps/. Нужно только понимать два момента: первое, локаль с новой валютой, такой как евро, требует изменения @euro, описанного в примере выше. Второе, локали UTF-8 требуют от вас добавления .UTF-8 в конец определения локали (нет, я не знаю, зачем, но иначе оно не работает).
Если вы В САМОМ ДЕЛЕ хотите минимизировать ваши локали, вам всего лишь нужно перевести вашу систему на Юникод. Вообще-то пока есть причины этого не делать, но это уже становится стандартом de facto, так как несёт множество преимуществ перед старыми форматами ISO, ASCII и другими. Больше об этом можно прочесть здесь и здесь, а также непосредственно в соответствующем руководстве с сайта Gentoo.
Вам просто нужно определить следующее: Файл: nano -w /etc/locales.build
#Как раньше!
en_US.UTF-8/UTF-8
ru_RU.UTF-8/UTF-8
Обратите внимание, я оставил строку US UTF-8. Её лучше не убирать, так как некоторые программы не соберутся без неё.
Сделайте это до установки Gentoo
Вы можете выполнить эти настройки до началасборки системы с нуля. Просто следуйте инструкциям из Gentoo Handbook. Это позволит меньше волноваться о возможных недоделках программ после сборки и наслаждаться быстрой сборкой.
Сделайте это после установки Gentoo
Если glibc уже установлена, вам потребуется пересобрать glibc:
Code: Пересборка glibc
emerge glibc
Вы также можете пересобрать world, если пакеты были скомпилированы с поддержкой множества локалей, но полученное ускорение работы пакетов и сэкономленное дисковое пространство не стоят затрат времени. Придётся затратить очень много времени на пересборку всей системы.
Возможно, вам стоит обратить внимание на пакет localepurge, который может очистить систему от любых установленных man страниц или info-файлов на языках не используемых в вашей системе. Вначале прочитайте man к localepurge, что бы определить локали, которые необходимо пропустить в /etc/locale.nopurge.
Для большей инфомации об управлении локалями читайте:
Gentoo Linux Localization Guide.
Или на русском языке Руководство по русской локализации Gentoo Linux.
Эта оптимизация полностью безопасна (Кроме случаев, если вы не можете читать на языке, который установили!).
Как безопасность относится к оптимизации? Итак, это оптимизация безопасности, поскольку ранее было сказано, как оптимизация зависит от вашей системы и как всё это работает. Если это сервер, вы, к примеру, можете пожертвовать оптимизацией в угоду безопасности, или выполнить обе оптимизации.
Стабилизация Glibc
Это предполагает (как вы, возможно, догадывались...) использование флага USE hardened. Это сделает вашу систему более устойчивой к нападениям разного вида.
Усиление стека
Используйте флаг erandom если вам необходимо использование модуля случайных чисел, установленного в вашем ядре.
Введение
В Linux я пользователь новый и с этим вопросом никогда не сталкивался, и более того - ядро по жизни собирал без поддержки USB устройств, т.к. ничего такого у меня просто нет :), но вот, как говорится - пришлось и срочно. И как оказалось - это довольно несложно.
Итак, по прочтении парочки-тройки вопросов связанных с USB, и небольшого количества теории - я без проблем подмонтировал USB флешку. Примечание: Что такое флешка и USB описывать не буду, т.к. если читатель этого не знает - то имхо ему следует сначала прочесть несколько других статей.
Итак, начнем
Конфигурация ядра
USB флешки видны в Linux как scsi устройства,ибо поддержка usb устройств в ядре Linux реализуется именно посредством эмуляции скази, т.е. типа /dev/sda1(2,3) и т.д, смотря сколько партиций.
Следовательно, чтобы была возможность подключения флешки, сначала необходимо добавить поддержку scsi в ядро
Linux Kernel Configuration: Включаем поддержку SCSI
Device Drivers --->
SCSI device support
<*>legacy /proc/scsi/ support
--- SCSI support type (disk, tape, CD-ROM)
<*> SCSI disk support
<*> SCSI generic support
--- Some SCSI devices (e.g. CD jukebox) support multiple LUNs
<*> Probe all LUNs on each SCSI device
Далее добавляем непосредственно поддержку USB (я не говорю о клавиатурах или других устройствах USB, а говорю только о флешке)
Linux Kernel Configuration: Поддержка USB
Device Drivers --->
USB support
<*> Support for Host-side USB
<*> USB device filesystem
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
<*> USB Mass Storage support
Примечание: В разделе USB Mass Storage support есть куча других устройств - я там не отмечал ничего, у меня заработало и так. Подозреваю, что для специфических устройств (всмысле каких то навороченных флешок) нужно будет что нибудь еще там отметить.
Кроме того, для этих всяких сложных флешок скорее всего придется добавить MTD в ядро
Linux Kernel Configuration: MTD
Device Drivers --->
Memory Technology Devices (MTD) --->
ну и там смотрим, что нужно. Примечание: Для большинства современных флэшек, USB носителей и цифровых фотоаппаратов поддержка MTD не требуется.
Монтирование
После загрузки с новым ядром, нажимаем Alt+F12 и вставляем флешку - если с ядром все ок- то сразу появятся сообщения, что мол есть устройство USB , потом пишется, что есть /dev/uba ну и т.п.
Если этого не происходит, делаем
dmesg | grep usb
Если и здесь ничего нет, то советую перегрузиться и посмотреть включены ли USB контроллеры в BIOS :) как это не смешно звучит, но я сам себе это отрубил, когда ядро собирал, а потом включить забыл, и минут 15 гадал - чего же оно не работает :)
Если dmesg | grep usb выдает результат, а когда вставляем флешку - никакой реакции, то нужно проверить еще раз - все ли отмечено в ядре.
Вобщем - надеемся , что все заработало и теперь нужно смонтировать флешку.
Добавляем в /etc/fstab строку
Файл: /etc/fstab
/dev/uba1 /mnt/usbdir auto user,noauto,rw 0 0
и можно монтировать! но есть одно но, в опциях я не указал кодировки, т.к. кодировка по умолчанию указанна в разделе Native Languages конфигурации ядра.
Не будет лишним напомнить отмонтировать флешку перед тем как вытаскивать ее!
Если такой вариант вас не устраивает, то вы можете установить пакет submount и монтировать флэшку вот так:
Файл: /etc/fstab
/dev/uba1 /mnt/usb subfs fs=vfat,auto,umask=0,quiet,sync 0 0
Параметр sync необходим чтобы отключить отложенную запись и избежать потерю данных при копировании файлов на флэшку.
Вроде бы все. Удачи всем!
И естественно- за любые комментарии, дополнения, уточнения и исправления ошибок – буду только благодарен :)
надеюсь, кому-то помог tradakad
исправил касательно монтирования при помощи submount (dernik)
Установите пакеты: hal, dbus, and hotplug
Добавьте флаг hal в /etc/make.conf
emerge -avt kdebase-kioslaves
Убедитесь, что hal используется всеми пакетами:
emerge -DNu world
rc-update add dbus default
/etc/init.d/dbus start
rc-update add hald default
/etc/init.d/hald start
так же можно монтировать устройства без изменения /etc/fstab с помощью
emerge -av pmount
Добавьте себя в групп plugdev
gpasswd -a USER plugdev
Включите "Storage media" ("Устройства хранения данных" в русском варианте) в systray (на панель). Наслаждайтесь :)
Если лень замарачиваться каждый раз при втыкании флэшки или сидюка, а хочется, чтоб как в одной другой ОС, добавьте параметр managed в /etc/fstab к требуемому устройству, например
Файл: /etc/fstab
/dev/cdrw /mnt/cdrom iso9660 user,noauto,ro,managed 0 0
/dev/sda /mnt/flash vfat exec,user,noauto,sync,managed 0 0
Типа, все, теперь при появлении флэшки в системе будет появляться иконка на рабочем столе.
ps. распишите эту статью подробнее. Добавьте gpasswd в статью:
http://gentoo-wiki.com/HOWTO_D-BUS,_HAL,_KDE_media:/
"Драйвер ntfs-3g является открытым, лицензированным по GPL, драйвером NTFS для Linux, созданным в рамках проекта Linux-NTFS. Он предоставляет полный доступ к разделам NTFS (чтение-запись), кроме работы с зашифрованными файлами и записи сжатых файлов. Так же не поддерживается смена владельца файла и его прав доступа. Технически он является сильно усовершенствованным драйвером ntfsmount. Улучшена функциональность, качество и добавлены дополнительные возможности." (Szakacsits Szabolcs, автор ntfs-3g)
Автор создал драйвер, который гораздо лучше пригоден для использования, чем другие драйвера NTFS для Linux, и при этом не менее быстрый, чем драйвера родных файловых систем Linux - временами в два раза быстрее чем родной модуль файловой системы EXT3 в ядре.
Для получения более подробной информации посетите: [1]
Предупреждение: Драйвер имеет статус BETA, имеются некоторые не решённые вопросы, возможна потеря данных и/или зависания при попытке примонтировать раздел. Он НЕ работает на архитектурах, отличных от x86 и amd64.
СДЕЛАЙТЕ РЕЗЕРВНУЮ КОПИЮ ДАННЫХ ПЕРЕД ЛЮБЫМИ ПОПЫТКАМИ ИСПОЛЬЗОВАНИЯ !!! В ЛЮБОМ СЛУЧАЕ - ВЫ ПРЕДУПРЕЖДЕНЫ !!!
ebuild драйвера зависит от sys-fs/fuse (portage установит его автоматически).
Поскольку это программное обеспечение находится на стадии бета-тестирования, вы должны размаскировать его:
# echo "sys-fs/ntfs3g ~x86" >> /etc/portage/package.keywords
И установить его:
# emerge sys-fs/ntfs3g
Модуль ядра fuse должен быть загружен перед использованием драйвера
# modules-update
# modprobe fuse
Примеры использования
Монтирование раздела:
# ntfs-3g /dev/hda1 /mnt/windows
Полный доступ для всех пользователей, без ограничений прав доступа, и поддержкой заданной локали (В примере используется ru_RU.utf8, однако у вас она может отличаться):
# ntfs-3g /dev/hda1 /mnt/windows -o silent,umask=0,locale=ru_RU.utf8
Размонтирование
# fusermount -u /mnt/windows
Прочтите страницу руководства по ntfs-3g для получения более подробной информации.
$ man ntfs-3g
Монтирование при загрузке:
Для автоматической загрузки модуля fuse при старте системы выполните:
# echo "fuse" >> /etc/modules.autoload.d/kernel-2.6
Отредактируйте /etc/fstab:
# echo "/dev/hda1 /mnt/windows ntfs-3g silent,umask=0,locale=ru_RU.utf8 0 0" >> /etc/fstab
Если после обновления ядра драйвер перестал работать, сделайте следующее:
# emerge sys-fs/fuse
# modules-update
# modprobe fuse
Автор этого документа не отвечает за какие либо последтсвия, связанные с использованием этого драйвера. Всё что вы делаете - вы делаете на свой страх и риск.
Apache2 сейчас работает на большинстве системах без проблем, если у вас возникли проблемы прочтите раздел Common Problems это может помочь.
Начнем установку apache2: добавьте "apache2" к вашим USE флагу в файле /etc/make.conf и выполните:
emerge apache
Запустите Apache2:
/etc/init.d/apache2 start
Если вы хотите запускать apache2 при запуске системы выполните комманду:
rc-update add apache2 default
Посмотрите init scripts section для дополнительной информации.
Теперь у вас есть работующий веб сервер Apache2. Перейдите в вашем браузере на страницу http://localhost/ и вы должны увидеть страницу приветствия.
Вы найдете в /var/www/localhost/htdocs/index.html HTML код страницы приветствия которую вы видите на http://localhost/. Замечаем что Apache отображает htdocs/index.html когда вы пытаетесь открыть htdocs/ . Это особенность протокола HTTP. Apache не может передать директорию но может показать содержимое. Список (index) файлов в директории может быть передан. Apache ищет страницу со специальным именем index либо генерирует список файлов в директории. Если у вас есть страница с именем 'index' то будет отображена она; в этом случае вы не сможете посмотреть список файлов в директории.
Apache очень гибок. Он может сёрфить файлы используя HTTP либо серфить файлы и помощью FTP. Он может передать файл с жесткого диска, либо вывод PHP скрипта. Для реализации этого Apache использует модули. Другие приложения используют для этого плагины. При добавлении модули добавляют функциональность. Их также можно инсталлировать, удалять, пересобирать (перекомпилировать).
Модули Apache обычно называются mod_something. Некоторые уже включены в Апачь а некоторые нужно добавлять отдельно. В портежах содержатся множество модулей. Процесс установки выглядит примерно так:
emerge module ;
отредактируйте /etc/conf.d/apache2 для активации добавьте -D MOD ;
опционально /etc/apache2/modules.d/xy_module ;
добавьте директивы конфигурации в httpd.conf либо .htaccess ;
emerge mod_perl
nano /etc/conf.d/apache2
# change APACHE_OPTS="" to APACHE_OPTS="-D PERL"
Документацию по конкретным модулям вы найдете Apache Index in this wiki. Вы также можете почитать the documentation для дополнительной информации о модулях Apache.
В файле httpd.conf, (/etc/apache2/httpd.conf,) который поставляется с Gentoo хранятся большинство настроек Apache. However, it probably does both more and less than you need it to. Apache configuration files have a consistent syntax.
Любые строки начинающиеся с # игнорируются
# Apache не анализирует написанное здесь
# это комментарии
Некоторые строки начинаются с директивы и могут иметь один или несколько аргументов.
Директивы могут быть объединены в секции. Разделы обычно заключены в угловые скобки.
<Section>
# Will only apply when the section matches
AnotherDirective
</Section>
В разделе могут быть подразделы. Вот часть файла httpd.conf:
# If mod_alias is loaded
<IfModule mod_alias.c>
# Alias is a directive and it only applies if mod_alias is loaded
Alias /icons/ "/usr/share/httpd/icons/"
# If the file is in the directory
<Directory "/usr/share/httpd/icons">
# Options will only apply if:
# mod_alias is loaded AND
# the file is in the directory
Options Indexes MultiViews
</Directory>
</IfModule>
Вы можете прочитать подробнее configuration files и sections в оффициальная документация Apache.
SSI Not Working
When configuring for SSI (Server Side Includes), an error may occur:
mod_include: Options +Includes (or IncludesNoExec) wasn't set, INCLUDES filter removed
The problem is that setting Options +Includes in either .htaccess or httpd.conf is overwritten by the additional configuration file as defined at the end of httpd.conf.
Include /etc/apache2/vhosts.d/*.conf
You need to edit this additional configuration file such that
AllowOverride None
Is replaced by
AllowOverride Options
Could Not Open Error Log
While starting Apache, it prints:
Error while starting apache: (2)No such file or directory: apache2: could not open error log file /usr/lib/apache2/logs/error_log.
/usr/lib/apache2/logs should be a symlink pointing to /var/log/apache2 . Check it using:
ls -la /usr/lib/apache2/logs
(note the lack of a slash on the end). If /var/log/apache2 is missing, create it and make sure you give apache ownership:
mkdir /var/log/apache2
chown apache:apache /var/log/apache2
If the symlink /usr/lib/apache2/logs is missing, you can create it:
ln -s /var/log/apache2 /usr/lib/apache2/logs
You don't need to set permissions on the symlink.
Check the Logs
See /var/log/apache2/error_log for errors, especially towards the end of the file. You may find tail useful because it displays only the last few lines of a file:
tail /var/log/apache2/error_log
If you wish to keep an eye one the log the -f option for tail may be useful:
tail -f /var/log/apache2/error_log
Here's one error you might see:
Error: [alert] (EAI 2)Name or service not known: mod_unique_id: unable to find IPv4 address of ""
With the base installation "mod_unique_id" is turned on, this can cause problems, notably the server not starting. Simply comment out this module in /etc/apache2/httpd.conf and the problem will be solved.
(Your config file might be /etc/apache2/conf/apache2.conf)
Forbidden User Directories
If the server is returning "403 Forbidden" while accessing http://server/~username/ Make sure Apache (usually user apache and group apache) has read access to username's home directory and public_html (or equivalent). You can grant everyone read access using:
chmod 755 ~username/ ~username/public_html/
Not Enough Entropy
If Apache2
accepts connections
does not respond to clients
creates exactly one process
is not stopped by
/etc/init.d/apache2 stop
Check to see how much entropy is available using:
cat /proc/sys/kernel/random/entropy_avail
If little entropy (less than 100) is available, Apache2 is probably waiting for more so it can generate the secret for digest authentication (mod_auth_digest). To generate more entropy, just do something else for a little while. Grepping the kernel or emerging a package usually works well.
The video-entropyd and audio-entropyd supply /dev/random with entropy gathered from your video and audio devices, respectively. If you have a hardware random number generator (RNG), you can emerge rng-tools and run rngd.
If there's still a shortage of entropy, you can enable the urandom USE flag and re-emerge APR and Apache2. This makes APR use /dev/urandom, which falls back to a pseudorandom number generator when there isn't enough entropy. The program gets a number immediately, but it is cryptographically weaker. This is okay for some things (e.g. solitaire), but completely unacceptable for others (like PGP key generation).
Confusing config files
If you start the Apache2 server with the startup script /etc/init.d/apache2 check to see if the line
local myconf="/etc/apache2/httpd.conf"
from /etc/init.d/apache2 points to your configuration script. If it points to apache.conf and you use httpd.conf, make the necessary adjustments.
Configure LAMP (Linux, Apache, MySQL, and Python/PHP/Perl) - A popular web server combination
Apache Installation & Configuration
How to install mod_security for Apache
В сети мало документации по iptables рассчитанной на новичков. Мы же попытаемся восполнить этот пробел. Рассмотрим основы составления правил, а также некоторые дополнительные модули которые помогут сделать жизнь легче.
Прежде чем двигаться дальше - убедитесь, что ...
Всё ваше аппаратное обеспечение работоспособно. То есть Вы подключили все оборудование, модули грузятся, устройства видны в системе. Полезно в начале проверить, что соединение с интернетом возможно и без всяких там iptables. Нет ничего хуже, чем в течении многих часов возиться с упрямой программой, ругая её почём зря, а потом понять, что сетевая карта не работает или модем сконфигурирован неправильно.
Вы имеете представление о сетевых технологиях и Вы знакомы с администрированием Linux и Gentoo Linux в частности. То есть необходимы навыки работы с такими базовыми вещами как ifconfig, rc-update, /etc/conf.d/net, и так далее. Если для Вас это пока пустые звуки, то, пожалуйста предварительно изучите Настольную книгу Gentoo и Linux Help's Networking Basics 101
Все что вам нужно - это включить поддержку iptables.
Networking --->
Networking Options---->
Network Packet Filtering (replace Ipchains)--->
Netfilter Configuration
Включим все опции как модули (хотя с точки зрения безопасности модули следует вообще отключить, монолитное ядро надежнее, хотя и медленнее).
Далее вы должны установить пакет iptables: emerge iptables
Предположим, что у нас есть 2 сетевых интерфейса: eth0 - локальная сеть и ppp0 - интернет соединение.
Проверим работоспособность сети командой ping:
|
Code: ping |
ping www.google.com ping 192.168.1.78 ping 192.168.2.77 |
Запустим iptables: /etc/init.d/iptables start
Эта команда загрузит основные модули и создаст цепочки в ядре Linux. Теперь добавим iptables в автозагрузку: rc-update add iptables default
Скрипт /etc/init.d/iptables понимает несколько команд (/etc/init.d/iptables <команда>), некоторые из них:
start - запуск iptables. Восстанавливает все правила (правила хранятся в /var/lib/iptables/rules-save);
stop - сброс всех цепочек;
save - сохранение всех правил.
Практически все правила можно привести к виду: iptables -A ЦЕПОЧКА ПАРАМЕТРЫ_ПАКЕТА -j ДЕЙСТВИЕ
Цепочки
Все изменения будем проводить над таблицей filter, именно она отвечает за фильтрацию пакетов. В таблице filter существует 3 цепочки: INPUT, OUTPUT и FORWARD. В каждой цепочки свой "тип" пакетов:
INPUT - пакеты пришедшие к Вам. То есть входящий трафик.
FORWARD - пакеты которые предназначены для другого узла, то есть транзитный трафик.
OUTPUT - пакеты, которые уходят от нас, или исходящий трафик.
Работают с цепочками так: iptables <опция> <цепочка>
Для работы с цепочками предусмотрены следующие опции:
-A - добавление нового правила в цепочку. Правило будет добавлено в конец цепочки.
-I - добавление правила не в конец,а туда куда вы укажите. Например команда:
iptables -I INPUT 2 bla-bla-bla - сделает наше правило вторым.
-D - удаление правила. Например для удаления пятого правила введите:
iptables -D INPUT 5
-F - сброс всех правил цепочки. Нужно, например,при удалении ненужной цепочки.
-N - создание пользовательской цепочки. Если не хотите создавать кашу в каждой цепочке, то создайте несколько дополнительных цепочек. Синтаксис такой: iptables -N ЦЕПОЧКА. Только русские буквы, конечно, использовать нельзя.
-X - удаление пользовательской цепочки.
ПРИМЕЧАНИЕ: Удалить цепочки INPUT, OUTPUT и FORWARD нельзя.
-P - установка политики для цепочки. Например:
iptables -P ЦЕПОЧКА ПОЛИТИКА
Итак по каким параметрам можно фильтровать пакеты? Рассмотрим самые основные.
Источник пакета
Для фильтрации по источнику используется опция -s. Например запретим все входящие пакеты с узла 192.168.133.133: iptables -A INPUT -s 192.168.133.133 -j DROP
Можно использовать доменное имя для указания адреса хоста. То есть: iptables -A INPUT -s test.host.jp -j DROP
Также можно указать целую подсеть: iptables -A INPUT -s 192.168.133.0/24 -j DROP
Также вы можете использовать отрицание (знак !). Например так - все пакеты с хостов отличных от 192.168.133.156 будут уничтожаться: iptables -A INPUT -s ! 192.168.133.156 -j DROP
Адрес назначения
Для этого нужно использовать опцию -d. Например запретим все исходящие пакеты на хост 192.168.156.156: iptables -A OUTPUT -d 192.168.156.156 -j DROP
Как и в случае с источником пакета можно использовать адреса подсети и доменные имена. Отрицание также работает.
Протокол
Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp.
Порт источника
Указывает на порт с которого был прислан пакет. Вот синтаксис: iptables -A INPUT -p tcp --sport 80 -j ACCEPT
Для указания порта необходимо указать протокол (tcp или udp). Можно использовать отрицание.
Порт назначения
Порт назначения. Синтаксис: iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Как и в случае с портом источника нужно указать протокол. Можно использовать отрицание.
Проку от того,что мы укажем параметры пакета нет.Нужно указать,что надо с ним делать. Для этого служит опция -j. Рассмотрим основные действия:
ACCEPT - разрешить пакет.
DROP - уничтожить пакет.
REJECT - будет отправлено ICMP сообщение, что порт недоступен.
LOG - информация об этом пакете будет добавлена в системный журнал (syslog).
В качестве действия можно указать и имя пользовательской цепочки. Например перекинем все пакеты с локальной сети в цепочку, где будет производиться дополнительная проверка: iptables -A INPUT -s 192.168.200.0/24 -j LOCAL_NET
В большинстве случаев пользователю достаточно выполнить такую последовательность комманд: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -P INPUT DROP
Вот собственно и вся настройка. На первый взгляд непонятно, что мы тут вообще сделали. Поэтому ознакомимся с основами составления правил.
Может сложиться впечатление, что возможностей у iptables маловато. Однако с использованием модулей iptables получит просто безграничные возможности. Для указания модуля используется опция -m. Например: iptables -A INPUT -m модуль bla-bla
-m owner
Добавляет следующие опции (опции только для цепочки OUTPUT):
--uid-owner UID - UID программы пославшей пакет.
--gid-owner GID - GID прораммы пославшей пакет.
Следующие опции доступны только в версиях ядра ниже 2.6.14:
--pid-owner PID - PID программы пославшей пакет.
--sid-owner SID - SID (идентификатор сессии) производится проверка SID пакета, значение SID наследуются дочерними процессами от "родителя".
--cmd-owner NAME - имя программы пославшей пакет.
-m multiport
Позволяет указывать не по одному порту, а сразу несколько:
--source-ports порт1,порт2 - список портов, с которых пришел пакет;
--sports порт1,порт2 - укороченый аналог --source-ports;
--destination-ports порт1,порт2 - список портов назначения;
--dports порт1,порт2 - укороченый аналог --destination-ports;
--ports порт1,порт2 - проверяет как исходящий так и входящий порт пакета.
-m state
Предназначен для указания состояния пакета с помощью опции --state. Доступны следующие типы пакетов:
NEW - пакет устанавливающий новое соединение.
ESTABLISHED - пакет от уже установленного соединения.
RELATED - новый пакет уже установленном соединении.
-m mac
Проверяет соответствие MAC-адреса в пакете с помощью опции --mac-source, например:
iptables -A INPUT -s 192.168.0.1 -m mac --mac-source 00:65:3F:ED:12:98 -j DROP
Документация по iptables в сети не рассчитана на новичков. В этой статье будет сжато и быстро описаны команды, затем, возможно, будут правки и добавления для расширенного объяснения. Так что это будет минимальная установка которую мы в дальнейшем расширим и упрочим с помощью правил.
Так же примите во внимание, что будет использовано pppoe соединение и 2.6.x ядро. Для настройки сетевой карты надо будет заменить ppp0 на eth0 (или подходящий по смыслу ваш сетевой интерфейс глядящий в интернет)
Прежде чем двигаться дальше - убедитесь, что ...
1.Всё ваше аппаратное обеспечение работоспособно. То есть вы все подключили, модули грузятся, устройства видны в системе. Полезно вначале проверить, что соединение с интернетом возможно и без всяких там iptables. Нет ничего хуже, чем в течение многих часов возиться с упрямой программой, ругая её почём зря, а потом понять, что сетевая плата не работает или модем сконфигурирован неправильно.
2.Вы читали маны по теме. Предполагается, что, пока вы изучаете это руководство, man iptables постоянно открыт в соседнем терминале для точного понимания и уточнения, что же та или иная команда означает на самом деле.
3.Вы имеете представление о сетевых технологиях и Вы знакомы с администрированием Linux и Gentoo Linux в частности. То есть необходимы навыки работы с такими базовыми вещами как ifconfig, rc-update, /etc/conf.d/net, и так далее. Если для вас это пока пустые звуки, то, пожалуйста предварительно изучите The Gentoo Handbook и Linux Help's Networking Basics 101
Все что вам нужно - это включить поддержку iptables.
|
Linux Kernel Configuration: Включение IPTables |
Device Drivers--->
Networking Support--->
Networking Options---->
Network Packet Filtering (replace Ipchains)--->
Netfilter Configuration
|
Я включил все опции как модули (с тем рассчетом, что я захочу попробовать другие опции позже) и добавил ip_tables в modules.autoload. Это загрузит еще несколько модулей в качестве зависимостей. Модуль ip_conntrack необходим для "statefull" фильтрования, то есть для отслеживания соединений. Для запуска скриптов выполните команду :
# modprobe ip_tables
Далее вы должны установить пакет iptables:
# emerge iptables
В моем случае имеется 3 сетевых адаптера. Один подключен к WAN через pppoe. Другие два - к моей внутренней сети. Для того, чтобы не было проблем с iptables и маскардингом (NAT'ом), они должны быть сконфигурированы для различных подсетей. Для примера, 2 сетевых адаптера подключены к моим внутренним компьютерам (внутренние сетевые интерфейсы). Им присвоены IP-адреса: 192.168.1.1 и 192.168.2.1.
Следует заметить, что будет лучше если подключать эти внутренние адаптеры в любое сетевое устройство, такие как свитч и хаб. Для pppoe подключений мы должны убедиться, что сетевой адаптер подключен к внешнему миру, то есть внешним интерфейсам не присвоены никакие IP-адреса. Его запись в /etc/conf.d/net должна оставаться пустой. Это делается потому, что pppoe выступает в качестве виртуального устройства, которое включается вслед за сетевым интерфейсом. Мы также должны присвоить правильные сетевые маски и широковещательные адреса для этих интерфейсов. Ваш conf.d/ должна выглядеть примерно так:
Сервер
|
Файл: /etc/conf.d/net |
# Для pppoe подключений вы не должны указывать значения для [[eth0]], # просто добавьте net.ppp0 или rc-pppoe в default уровень загрузки. iface_eth0="192.168.1.1 broadcast 192.168.1.255 netmask 255.255.255.0" iface_eth1="192.168.2.1 broadcast 192.168.2.255 netmask 255.255.255.0" |
Заметьте, что не было указано никаких шлюзов.
Клиент1
|
Файл: /etc/conf.d/net |
iface_eth0="192.168.1.77 broadcast 192.168.1.255 netmask 255.255.255.0" gateway="eth0/192.168.1.1" |
Клиент2
|
Файл: /etc/conf.d/net |
iface_eth0="192.168.2.77 broadcast 192.168.2.255 netmask 255.255.255.0" gateway="eth0/192.168.2.1" |
Шлюз для клиентов установлен на внутренний IP сетевого интерфейса сервера, что и логично. Теперь добавьте все интерфейсы в default уровень загрузки и перезапустите подключения:
# rc-update add net.eth1 default && rc-update add net.eth2 default && rc-update add net.ppp0 default
и
# /etc/init.d/net.eth1 start && /etc/init.d/net.eth2 start && /etc/init.d/net.ppp0 start
Для клиентов:
# /etc/init.d/net.eth0 restart
Теперь убедитесь в том, что ваш сервер подключен к интернету, а также все интерфейсы могут пинговать друг друга. Для сервера:
|
Code: ping |
ping www.google.com; ping 192.168.1.78 ping 192.168.2.78 ping 192.168.1.77 ping 192.168.2.77 |
Убедитесь что у клиентов правильно указаны DNS-сервера в /etc/resolv.conf
Теперь интересная часть... iptables и NAT(трансляция адресов). Для начала сделаем простое перенаправление адресов с минимальными правилами, чтобы убедиться что можем выходить в сеть.
|
Предупреждение: Если вы параноик, то это не самое секретное, что можно сделать... мы открываемся в сеть с мизерной защитой. Однако будем считать, что сеть настраиваем для дома или для игрового класса. |
|
Файл: /var/lib/iptables/rules-save |
#!/bin/bash IPTABLES='/sbin/iptables' # Определяем интерфейсы EXTIF='ppp0' INTIF1='eth1' INTIF2='eth2' # Включаем форвардинг ip в ядре. /bin/echo 1 > /proc/sys/net/ipv4/ip_forward # Сбросить правила и удалить цепочки $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X $IPTABLES -t nat -X $IPTABLES -t mangle -X # Включаем маскарадинг для разрешения доступа в интернет $IPTABLES -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE # Форвардить сетевой трафик с $INTIF1 на интернетовский интерфейс $EXTIF $IPTABLES -A FORWARD -i $INTIF1 -o $EXTIF -m state --state NEW,ESTABLISHED -j ACCEPT # Форвардить сетевой трафик с $INTIF2 на интернетовский интерфейс $EXTIF $IPTABLES -A FORWARD -i $INTIF2 -o $EXTIF -m state --state NEW,ESTABLISHED -j ACCEPT #echo -e " - Разрешаем доступ к SSH серверу" $IPTABLES -A INPUT --protocol tcp --dport 22 -j ACCEPT #echo -e " - Разрешаем доступ к HTTP серверу" $IPTABLES -A INPUT --protocol tcp --dport 80 -j ACCEPT # Блокируем все прочие попытки доступа на $EXTIF $IPTABLES -A INPUT -i $EXTIF -m state --state NEW,INVALID -j DROP $IPTABLES -A FORWARD -i $EXTIF -m state --state NEW,INVALID -j DROP |
|
Примечание: Этот скрипт написан кем-то в сетевом форуме... Адрес автора утерян, имя... В общем, спасибо ему, пусть и без имени. (Надеюсь, он не обидется). |
Теперь проверяем могут ли наши пользователи выйти в интернет или подключиться к серверу по ssh. Если все нормально, то можно переходить ниже по тексту. Если нет - проверьте синтаксические ошибки и прочее... Удостоверьтесь, что IP-адреса и маски клиентов и сервера введены правильно... Ну или...
Если все работает, как задумали, сохраняем конфигурацию:
# /etc/init.d/iptables save
И бэкапим вашу рабочую конфигурацию для возможного восстановления "как было":
# cp /var/lib/iptables/rules-save /var/lib/iptables/rules.working
Проверим iptables start-up скрипт перед тем как добавить iptables в default runlevel:
|
Code: Проверка скрипта |
|
Смысл в запуске-остановке-запуске в том, что у нас нет скрипта запуска iptables... поэтому нужно “инициализировать” статус перед остановкой. Остановка, по существу, обнуляет настройки и возвращает все к исходному. Перезапуск покажет нам работает ли наша сеть после перезагрузки. Если все в порядке, то добавляем iptables в default runlevel:
rc-update add iptables default
Не забудем также установить в /etc/sysctl.conf:
net.ipv4.ip_forward = 1
Далее мы сделаем наш, уже работающий файрвол безопасным, т.е. защищающим нашу систему от проникновений извне. На самом деле нам придется настроить файрвол таким образом, чтобы он не только защищал нас, но и защищал внешнюю сеть от нас. :) Защита такого рода является обязательной, она нужна для того, чтобы, в том случае, если наша система все-таки была взломана, взломщик не смог воспользоваться нашими ресурсами для дальнейшей атаки любого рода. Этот аспект является важнейшим в сетях класса SOHO, т.е. небольших офисах. Обыкновенно вирусы не оказывают никакого влияния на малые сети и заражение ими редко приводит к потере данных. Для нас, пользователей *nix, этой проблемы практически не существует. В любом случае, т.к. небольшие сети, как правило, защищены гораздо хуже больших, кракеры стараются использовать их в качестве “опорной базы” для DoS атак, или другой своей вредоносной активности.
В последующем я опишу всю конфигурацию по кусочкам, дабы мы смогли бы проверить пошагово каждый фрагмент. Каждый шаг может потребовать от вас вставки чего-либо до, после или в середину указываемого скрипта. Все действия производятся так, чтобы (я надеюсь) ваша сеть не работала только лишь короткий промежуток времени во время настройки. Это сделано мною потому как я предположил что у многих из вас (таких как я) выделен сервер под Firewall. И так как я предпочитаю настраивать свой сервер через SSH, отключение сети может иметь пренеприятные последствия, такие как ползания под столами или хуже того. Если же вы смелы, то вы можете скопировать скрипт в конце этого документа и запустить его на своей машине. Этот скрипт должен быть работоспособен на все сто, но тестировал я его только на своей машине, так что ymmv.
Вы можете установить необходимые переменные окружения следующим скриптом:
|
Code: ' |
#!/bin/sh
#
# Внешний интерфейс
EXTIF="ppp0"
# Внутренний интерфейс
INTIF="eth1"
# Loop device/localhost
LPDIF="lo"
LPDIP="127.0.0.1"
LPDMSK="255.0.0.0"
LPDNET="$LPDIP/$LPDMSK"
# Необходимые утилиты
IPT="/sbin/iptables"
IFC="/sbin/ifconfig"
G="/bin/grep"
SED="/bin/sed"
AWK="/usr/bin/awk"
ECHO="/bin/echo"
# Последующие команды могут работать некорректно при локализации.
# Установка переменных окружения внешнего интерфейса
EXTIP="`$IFC $EXTIF | $AWK /$EXTIF/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
EXTBC="255.255.255.255"
#EXTMSK="`$IFC $EXTIF | $G Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`"
EXTMSK="`$IFC $EXTIF | $AWK /$EXTIF/'{next}//{split($0,a,":");split(a[4],a," ");print a[1];exit}'`"
EXTNET="$EXTIP/$EXTMSK"
$ECHO "EXTIP=$EXTIP EXTBC=$EXTBC EXTMSK=$EXTMSK EXTNET=$EXTNET"
# Due to absence of EXTBC I manually set it to 255.255.255.255
# this (hopefully) will serve the same purpose
# Установка переменных окружения внутреннего интерфейса
INTIP="`$IFC $INTIF | $AWK /$INTIF/'{next}//{split($0,a,":");split(a[2],a," ");print a[1];exit}'`"
INTBC="`$IFC $INTIF | $AWK /$INTIF/'{next}//{split($0,a,":");split(a[3],a," ");print a[1];exit}'`"
INTMSK="`$IFC $INTIF | $AWK /$INTIF/'{next}//{split($0,a,":");split(a[4],a," ");print a[1];exit}'`"
INTNET="$INTIP/$INTMSK"
$ECHO "INTIP=$INTIP INTBC=$INTBC INTMSK=$INTMSK INTNET=$INTNET"
|
Теперь мы должны установить ACCEPTы, так, чтобы мы могли соединяться с нашим сервером. На самом деле это очень больной вопрос. Правила для надежного маршрутизатора должны по умолчанию запрещать нежели разрешать. Однако, если вы сделаете это, то потеряете все соединения. Продолжайте тестирование пока не будете уверены что ваши ACCEPTы работают как надо. Однако думаю, что сперва мы введем следующее и это будет предпоследним правилом в окончательном скрипте.
|
Code: ' |
$IPT -t nat -A PREROUTING -j ACCEPT # $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET -j SNAT --to $EXTIP # Закомментируйте последующие строки (которые содержат "MASQUERADE") # для сетей без трансляции адресов (NAT) $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET1 -j MASQUERADE $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET2 -j MASQUERADE $IPT -t nat -A POSTROUTING -j ACCEPT $IPT -t nat -A OUTPUT -j ACCEPT $IPT -A INPUT -p tcp --dport auth --syn -m state --state NEW -j ACCEPT $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT |
Теперь мы определим пару цепочек (chains) которые будут фиксировать события DROP и REJECT. Таким образом нам не придется вводить отдельные строки для каждой введенной команды. Сообщения о событиях будут отправлены сервису syslog, (обычно они фиксируются в /var/log/messages). Позже я (переводчик не имеет к этому никакого отношения) собираюсь написать скрипт на sed/grep по разбору событий для облегченного просмотра и установлю его как ежедневную работу для сервиса cron.
Эти строки следует вставить сразу после текста выше, в тот же скрипт. Когда вы это сделаете, запустите скрипт снова. Это не окажет влияния на вашу сеть, вы пока просто устанавливаете правила. Но это поможет убедиться что мы не сделали ошибок на данном этапе.
|
Code: ' |
# ********** Цепочки журналирования событий ********** # # Теперь мы определяем несколько цепочек которые служат для записи # событий о сбрасываемых пакетах. Это позволит нам избежать ввода # команд для каждого правила. Сперва мы фиксируем DROP, а потом REJECT. # Не жалуйтесь, если цепочки уже существуют (однако это не приведет к ошибкам???) $IPT -N DROPl 2> /dev/null $IPT -A DROPl -m limit --limit 3/minute --limit-burst 10 -j LOG --log-prefix 'FIREWALL DROP BLOCKED:' $IPT -A DROPl -j DROP $IPT -N REJECTl 2> /dev/null $IPT -A REJECTl -m limit --limit 3/minute --limit-burst 10 -j LOG --log-prefix 'FIREWALL REJECT BLOCKED:' $IPT -A REJECTl -j REJECT $IPT -N DROP2 2> /dev/null $IPT -A DROP2 -m limit --limit 3/second --limit-burst 10 -j LOG --log-prefix 'FIREWALL DROP UNKNOWN:' $IPT -A DROP2 -j DROP $IPT -N REJECT2 2> /dev/null $IPT -A REJECT2 -m limit --limit 3/second --limit-burst 10 -j LOG --log-prefix 'FIREWALL REJECT UNKNOWN:' $IPT -A REJECT2 -j REJECT # Для тестирования фиксируем события ACCEPT $IPT -N ACCEPTl 2> /dev/null $IPT -A ACCEPTl -m limit --limit 10/second --limit-burst 50 -j LOG --log-prefix 'FIREWALL ACCEPT:' $IPT -A ACCEPTl -j ACCEPT |
Теперь, когда мы видим наши устройства, правильно определенные, вставляем команду сброса правил. Однако все уже назначенные правила будут сброшены. Эти строки должны быть вставлены после определения утилит, которые заканчиваются строкой: ECHO='/bin/echo'
|
Code: ' |
# Сброс всех существующих и очистка персональных цепочек.
CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null`
for i in $CHAINS
do
$IPT -t $i -F
done
for i in $CHAINS
do
$IPT -t $i -X
done
|
Теперь мы готовы для того, чтобы описать некоторые правила. Для начала мы разрешим все пакеты с loopback интерфейса, имеющие в качестве адреса назначения один из адресов наших интерфейсов.
|
Code: ' |
$IPT -A INPUT -i $LPDIF -s $LPDIP -j ACCEPT $IPT -A INPUT -i $LPDIF -s $EXTIP -j ACCEPT $IPT -A INPUT -i $LPDIF -s $INTIP1 -j ACCEPT $IPT -A INPUT -i $LPDIF -s $INTIP2 -j ACCEPT |
Теперь мы должны заблокировать все входящие и исходящие широковещательные пакеты. Это предотвратит DoS атаки против нас, и не позволит нашим клиентам проводить DoS атаки против кого либо другого. Если бы все системные администраторы следовали этим правилам, тогда много суровых и дорогих DoS атак не состоялись или были максимально ограниченными.
|
Code: Блокировка широковещательных пакетов |
$IPT -A INPUT -i $EXTIF -d $EXTBC -j DROPl $IPT -A INPUT -i $INTIF1 -d $INTBC1 -j DROPl $IPT -A INPUT -i $INTIF2 -d $INTBC2 -j DROPl $IPT -A OUTPUT -o $EXTIF -d $EXTBC -j DROPl $IPT -A OUTPUT -o $INTIF1 -d $INTBC1 -j DROPl $IPT -A OUTPUT -o $INTIF2 -d $INTBC2 -j DROPl $IPT -A FORWARD -o $EXTIF -d $EXTBC -j DROPl $IPT -A FORWARD -o $INTIF1 -d $INTBC1 -j DROPl $IPT -A FORWARD -o $INTIF2 -d $INTBC2 -j DROPl |
Теперь проверим скрипт еще раз, чтобы убедиться в том, что мы не наделали синтаксических ошибок. Также отмечу, что мы используем определенные нами DROP1 цепочки (chains). Это означает, что отбрасываемые пакеты будут отмечены в журнале событий (log file).
Теперь мы блокируем доступ из глобальной сети в нашу локальную сеть, если мы не хотим что бы интернет провайдер назначал IP адреса для нашей внутренней сети.
|
Code: ' |
# Блокировать внешний доступ к локальной сети # Это позволит остановить боевых кракеров от использования # нашей сети как стартовой точки для других атак. # # Нижеприведенная строчка на человеческом языке будет выглядеть как # "если входящий пакет, пришедший на наш внешний интерфейс, # имеет адрес назначения, отличный от адреса нашего внешнего интерфейса, # то этот пакет не будет пропущен." $IPT -A INPUT -i $EXTIF -d ! $EXTIP -j DROPl |
Теперь мы предпримем некоторые действия для наших локальных сетей. Другими словами - все пакеты не относящиеся к локальным сетям должны быть блокированы.
|
Code: ' |
# Теперь мы должны заблокировать все пакеты не относящиеся к # адресному пространству наших локальных сетей. # Запомните, если вы подключите свой ноутбук к другому разъему, # вам надо убедиться, что ваш сетевой адрес соответствует адресам этой сети. # # Первая локальная сеть $IPT -A INPUT -i $INTIF1 -s ! $INTNET1 -j DROPl $IPT -A OUTPUT -o $INTIF1 -d ! $INTNET1 -j DROPl $IPT -A FORWARD -i $INTIF1 -s ! $INTNET1 -j DROPl $IPT -A FORWARD -o $INTIF1 -d ! $INTNET1 -j DROPl # Вторая локальная сеть $IPT -A INPUT -i $INTIF2 -s ! $INTNET2 -j DROPl $IPT -A OUTPUT -o $INTIF2 -d ! $INTNET2 -j DROPl $IPT -A FORWARD -i $INTIF2 -s ! $INTNET2 -j DROPl $IPT -A FORWARD -o $INTIF2 -d ! $INTNET2 -j DROPl |
Дальше мы сделаем некоторые дополнительные проверки исходящих пакетов и остановим все icmp пакеты кроме ping.
|
Code: ' |
# Дополнительная проверка $IPT -A OUTPUT -o $EXTIF -s ! $EXTNET -j DROPl # Блокируем исходящие ICMP (кроме PING) $IPT -A OUTPUT -o $EXTIF -p icmp --icmp-type ! 8 -j DROPl $IPT -A FORWARD -o $EXTIF -p icmp --icmp-type ! 8 -j DROPl |
Замечательно. Двигаемся дальше и проверяем скрипт на ошибки.
Предполагая что у нас все сработало мы заткнем еще несколько портов, доступ по которым может представлять для нас серьезную опасность:
# COMmon ports: # 0 is tcpmux; SGI had vulnerability, 1 is common attack # 13 is daytime # 98 is Linuxconf # 111 is sunrpc (portmap) # 137:139, 445 is Microsoft # SNMP: 161,2 # Squid flotilla: 3128, 8000, 8008, 8080 # 1214 is Morpheus or KaZaA # 2049 is NFS # 3049 is very virulent Linux Trojan, mistakable for NFS # Common attacks: 1999, 4329, 6346 # Common Trojans 12345 65535 COMBLOCK="0:1 13 98 111 137:139 161:162 445 1214 1999 2049 3049 4329 6346 3128 8000 8008 8080 12345 65535" # TCP ports: # 98 is Linuxconf # 512-5!5 is rexec, rlogin, rsh, printer(lpd) # [very serious vulnerabilities; attacks continue daily] # 1080 is Socks proxy server # 6000 is X (NOTE X over SSH is secure and runs on TCP 22) # Block 6112 (Sun's/HP's CDE) TCPBLOCK="$COMBLOCK 98 512:515 1080 6000:6009 6112" # UDP ports: # 161:162 is SNMP # 520=RIP, 9000 is Sangoma # 517:518 are talk and ntalk (more annoying than anything) UDPBLOCK="$COMBLOCK 161:162 520 123 517:518 1427 9000 9 6346 3128 8000 8008 8080 12345 65535"
После определения переменных окружения нам останется только пробежаться по ним циклом:
echo -n "FW: Blocking attacks to TCP port" for i in $TCPBLOCK; do echo -n "$i " $IPT -A INPUT -p tcp --dport $i -j DROPl $IPT -A OUTPUT -p tcp --dport $i -j DROPl $IPT -A FORWARD -p tcp --dport $i -j DROPl done echo "" echo -n "FW: Blocking attacks to UDP port " for i in $UDPBLOCK; do echo -n "$i " $IPT -A INPUT -p udp --dport $i -j DROPl $IPT -A OUTPUT -p udp --dport $i -j DROPl $IPT -A FORWARD -p udp --dport $i -j DROPl done echo ""
Ну что ж, теперь каждый раз, когда мы запускаем скрипт, эти строчки просто добавляются к уже существующим... что создаёт небольшой бардак. По этой причине мы собираемся перепрыгнуть в начало скрипта... сразу после переменных окружения для sed и grep, но перед переменными для EXTIP и EXTBC - там мы добавляем цикл, который производит очистку. Так мы будем уверены, что работаем в чистой среде. Нам не приходилось задумываться об этом ранее, потому что мы не имели возможности оттестить скрипт без обрыва соединения либо закрытия файрвола. Этот скрипт сначала выставляет всю политику в DROP, после чего очищает и удаляет наши цепочки. Чтобы убедиться, что мы по-прежнему можем залогиниться по ssh на наш сервер после того, как скрипт перезапуститься, мы добавим цепочку INPUT для ssh. Пока что поставим её в конец скрипта. Это делается для того чтобы избежать открытия дыры в момент установки новых правил, что является довольно распространённой ошибкой:
# Отказываем, потом принимаем: это уберёт дыру в момент, # когда мы закрываем порты $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # Очищаем все существуещие цепочки и стираем дополнительные CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null` for i in $CHAINS; do $IPT -t $i -F done for i in $CHAINS; do $IPT -t $i -X done $IPT -A INPUT -i $INTIF1 -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
Сразу после этого мы запустим sysctl'ы для tcp_syncookies, icmp_echo_ignore_broadcasts, rp_filter и accept_source_routе. До этого момента многие правила, которые мы "проверяли", фактически не выполнялись. По сути, мы просто делали проверку синтаксических ошибок. Теперь наши правила будут выполняться в полной мере:
echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Проверка адреса источника for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done # Отключаем роутинг источника IP и ICMP-редиректы for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $f done echo 1 > /proc/sys/net/ipv4/ip_forward
Теперь мы собираемся добавить трекинг ftp-соединения, так что нам не доведётся наблюдать ошибки PASV при установке паков:
# Запускаем трекинг ftp-соединения MODULES="ip_nat_ftp ip_conntrack_ftp" for i in $MODULES; do echo "Добавляем модуль $i" modprobe $i done
А сейчас возвратимся к концу нашего скрипта, поскольку мы собираемся открыть сервисы для хостов, находящихся за файерволом. Я включил следующие сервисы: IRC, MSN, ICQ, and NFS, FTP, domain,time и некоторые другие. Самое главное здесь то, что эти сервисы могут использоваться ТОЛЬКО ЗА файерволом.Таким образом никто не сможет их использовать по ftp внутри Вашей локальной сетки:
IRC='ircd' MSN=1863 ICQ=5190 NFS='sunrpc' # Мы пользуемся sync!! PORTAGE='rsync' OpenPGP_HTTP_Keyserver=11371 # Все порты сервисов считываются из /etc/services TCPSERV="domain ssh http https ftp ftp-data mail pop3 pop3s imap3 imaps imap2 time $PORTAGE $IRC $MSN $ICQ $OpenPGP_HTTP_Keyserver" UDPSERV="domain time" echo -n "FW: Allowing inside systems to use service:" for i in $TCPSERV; do echo -n "$i " $IPT -A OUTPUT -o $EXTIF -p tcp -s $EXTIP --dport $i --syn -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF1 -p tcp -s $INTNET1 --dport $i --syn -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF2 -p tcp -s $INTNET2 --dport $i --syn -m state --state NEW -j ACCEPT done echo "" echo -n "FW: Allowing inside systems to use service:" for i in $UDPSERV; do echo -n "$i " $IPT -A OUTPUT -o $EXTIF -p udp -s $EXTIP --dport $i -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF1 -p udp -s $INTNET1 --dport $i -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF2 -p udp -s $INTNET2 --dport $i -m state --state NEW -j ACCEPT done echo ""
Теперь сделаем так, чтобы файервол позволил нам пинговать внешний мир. Для этого разрешим прохождение icmp-пакетов через внешний интерфейс:
# Разрешаем внешнее пингование
$IPT -A OUTPUT -o $EXTIF -p icmp -s $EXTIP --icmp-type 8 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $INTIF1 -p icmp -s $INTNET1 --icmp-type 8 -m state --state NEW -j ACCEPT
$IPT -A FORWARD -i $INTIF2 -p icmp -s $INTNET2 --icmp-type 8 -m state --state NEW -j ACCEPT
# Разрешим файерволу пинговать наши внутренние сетки:
$IPT -A OUTPUT -o $INTIF1 -p icmp -s $INTNET1 --icmp-type 8 -m state --state NEW -j ACCEPT
$IPT -A OUTPUT -o $INTIF2 -p icmp -s $INTNET2 --icmp-type 8 -m state --state NEW -j ACCEPT
Теперь мы по умолчанию будем записывать в журнал все прочие запросы, но никак не будем на них реагировать. Все что нам надо было принять мы описали в начале наших правил. Так что заканчиваем правила блокировкой всего, что специально не разрешено:
# Заблокируем все, что осталось: $IPT -A INPUT -j DROPl $IPT -A OUTPUT -j REJECTl $IPT -A FORWARD -j DROPl
Итак, все сделано. я имею дружественные nmap и nessus для моих соединений с вышеописанным набором правил и ничего не препятствует использованию IRC, MSN, ICQ, и emerge sync.
А сейчас, полноценный скрипт во всей своей красе (Заодно я поместил форвардинг ssh в более подходящее для него место):
# Внешний интерфейс EXTIF=ppp0 # Внутренний интерфейс INTIF1=eth1 INTIF2=eth2 # Loop-устройство/localhost LPDIF=lo LPDIP=127.0.0.1 LPDMSK=255.0.0.0 LPDNET="$LPDIP/$LPDMSK" # Переменные текстовых инструментов IPT='/sbin/iptables' IFC='/sbin/ifconfig' G='/bin/grep' SED='/bin/sed' # Последнее (но немаловажное) - пользователи JAMES=192.168.1.77 TERESA=192.168.2.77 # Deny вместо accept: предотвращает открытие "дыр" # в то время, как мы закрываем порты и все такое $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # Сброс всех существующих цепочек и стирание персональных цепочек CHAINS=`cat /proc/net/ip_tables_names 2>/dev/null` for i in $CHAINS do $IPT -t $i -F $IPT -t $i -X done echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Проверка адреса источника for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done # Запрет маршрутизации IP от источника и редиректов ICMP for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > $f done for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > $f done echo 1 > /proc/sys/net/ipv4/ip_forward # Установка переменных среды для внешнего интерфейса EXTIP="`$IFC $EXTIF|$G addr:|$SED 's/.*addr:\([^ ]*\) .*/\1/'`" #EXTBC="`$IFC $EXTIF|$G Bcast:|$SED 's/.*Bcast:\([^ ]*\) .*/\1/'`" EXTBC="255.255.255.255" EXTMSK="`$IFC $EXTIF|$G Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`" EXTNET="$EXTIP/$EXTMSK" #echo "EXTIP=$EXTIP EXTBC=$EXTBC EXTMSK=$EXTMSK EXTNET=$EXTNET" echo "EXTIP=$EXTIP EXTBC=$EXTBC EXTMSK=$EXTMSK EXTNET=$EXTNET" # Так как EXTBC отсутствует, я устанавливаю ее вручную как it to 255.255.255.255 # Это (надеюсь) послужит тем же целям # Устанвка переменных среды для первого внутреннего интерфейса INTIP1="`$IFC $INTIF1|$G addr:|$SED 's/.*addr:\([^ ]*\) .*/\1/'`" INTBC1="`$IFC $INTIF1|$G Bcast:|$SED 's/.*Bcast:\([^ ]*\) .*/\1/'`" INTMSK1="`$IFC $INTIF1|$G Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`" INTNET1="$INTIP1/$INTMSK1" echo "INTIP1=$INTIP1 INTBC1=$INTBC1 INTMSK1=$INTMSK1 INTNET1=$INTNET1" # Установка переменных среды для второго внутреннего интерфейса INTIP2="`$IFC $INTIF2|$G addr:|$SED 's/.*addr:\([^ ]*\) .*/\1/'`" INTBC2="`$IFC $INTIF2|$G Bcast:|$SED 's/.*Bcast:\([^ ]*\) .*/\1/'`" INTMSK2="`$IFC $INTIF2|$G Mask:|$SED 's/.*Mask:\([^ ]*\)/\1/'`" INTNET2="$INTIP2/$INTMSK2" echo "INTIP2=$INTIP2 INTBC2=$INTBC2 INTMSK2=$INTMSK2 INTNET2=$INTNET2" # Сейчас мы собираемся создать несколько собственных цепочек, результатом работы # которых будет логгинг отброшенных пакетов. Это поможет нам избежать необходимости # вводить команду log перед каждым отбрасыванием пакета, что мы хотим запротоколировать. # Первыми идут лог отброшенных пакетов и собственно отброс, затем лог пакетов с отказами # и собственно отказы. # Отключаем сообщения о том, что цепочки уже существуют (чтобы перезапуск был без мусора) $IPT -N DROPl 2> /dev/null $IPT -A DROPl -j LOG --log-prefix 'DROPl:' $IPT -A DROPl -j DROP $IPT -N REJECTl 2> /dev/null $IPT -A REJECTl -j LOG --log-prefix 'REJECTl:' $IPT -A REJECTl -j REJECT # Весь траффик от устройства loopback принимается # если IP совпадает с любым из наших интерфейсов. $IPT -A INPUT -i $LPDIF -s $LPDIP -j ACCEPT $IPT -A INPUT -i $LPDIF -s $EXTIP -j ACCEPT $IPT -A INPUT -i $LPDIF -s $INTIP1 -j ACCEPT $IPT -A INPUT -i $LPDIF -s $INTIP2 -j ACCEPT # Широковещательные пакеты блокируем $IPT -A INPUT -i $EXTIF -d $EXTBC -j DROPl $IPT -A INPUT -i $INTIF1 -d $INTBC1 -j DROPl $IPT -A INPUT -i $INTIF2 -d $INTBC2 -j DROPl $IPT -A OUTPUT -o $EXTIF -d $EXTBC -j DROPl $IPT -A OUTPUT -o $INTIF1 -d $INTBC1 -j DROPl $IPT -A OUTPUT -o $INTIF2 -d $INTBC2 -j DROPl $IPT -A FORWARD -o $EXTIF -d $EXTBC -j DROPl $IPT -A FORWARD -o $INTIF1 -d $INTBC1 -j DROPl $IPT -A FORWARD -o $INTIF2 -d $INTBC2 -j DROPl # Блокируем доступ к внутренней сети из WAN # Это также призвано не дать нечестивым крякерам использовать нашу сетку # в качестве отправной точки для атак на других людей # Перевод с языка iptables: # "если пришедшие на наружный интерфейс пакеты были отправлены не с выданного # nefarious адреса, выкинуть их как горячую картошку" $IPT -A INPUT -i $EXTIF -d ! $EXTIP -j DROPl # А сейчас мы блокируем внутренние адреса, кроме двух, присвоенных нашим двум # внутренним интерфейсам.....только помните, что если вы воткнете свой лэптоп или # какой другой pc в напрямую в одну из этих сетевых карт, то нужно удостовериться, # что они имеют именно эти IP-адреса или добавить соответствующий адрес отдельно. # Первый интерфейс/первая внутренняя сеть $IPT -A INPUT -i $INTIF1 -s ! $INTNET1 -j DROPl $IPT -A OUTPUT -o $INTIF1 -d ! $INTNET1 -j DROPl $IPT -A FORWARD -i $INTIF1 -s ! $INTNET1 -j DROPl $IPT -A FORWARD -o $INTIF1 -d ! $INTNET1 -j DROPl # Второй интерфейс/вторая внутренняя сеть $IPT -A INPUT -i $INTIF2 -s ! $INTNET2 -j DROPl $IPT -A OUTPUT -o $INTIF2 -d ! $INTNET2 -j DROPl $IPT -A FORWARD -i $INTIF2 -s ! $INTNET2 -j DROPl $IPT -A FORWARD -o $INTIF2 -d ! $INTNET2 -j DROPl # Дополнительная Egress-проверка $IPT -A OUTPUT -o $EXTIF -s ! $EXTNET -j DROPl # Блокируем исходящиие пакеты ICMP (за исключением PING) $IPT -A OUTPUT -o $EXTIF -p icmp --icmp-type ! 8 -j DROPl $IPT -A FORWARD -o $EXTIF -p icmp --icmp-type ! 8 -j DROPl # печально известные порты: # 0 - tcpmux; у SGI есть уязвимость, через которую можно атаковать # 13 - daytime # 98 - Linuxconf # 111 - sunrpc (portmap) # 137:139, 445 - Microsoft # SNMP: 161,2 # Флотилия Squid: 3128, 8000, 8008, 8080 # 1214 - Morpheus или KaZaA # 2049 - NFS # 3049 - очень заразный троян для Linux, часто путаемый с NFS # Часто атакуемые: 1999, 4329, 6346 # Частые трояны 12345 65535 COMBLOCK="0:1 13 98 111 137:139 161:162 445 1214 1999 2049 3049 4329 6346 3128 8000 8008 8080 12345 65535" # Порты TCP: # 98 - Linuxconf # 512-5!5 - rexec, rlogin, rsh, printer(lpd) # [очень серьезеные уязвимости; продолжаются ежедневные атаки] # 1080 - прокси-серверы Socks # 6000 - X (ЗАМЕЧАНИЕ. X через SSH - безопасен, и работает на порту TCP 22) # Блокировка 6112 (CDE у Sun и HP) TCPBLOCK="$COMBLOCK 98 512:515 1080 6000:6009 6112" # Порты UDP: # 161:162 - SNMP # 520=RIP, 9000 - Sangoma # 517:518 - talk и ntalk (самые надоедливые) UDPBLOCK="$COMBLOCK 161:162 520 123 517:518 1427 9000" echo -n "FW: Blocking attacks to TCP port" for i in $TCPBLOCK; do echo -n "$i " $IPT -A INPUT -p tcp --dport $i -j DROPl $IPT -A OUTPUT -p tcp --dport $i -j DROPl $IPT -A FORWARD -p tcp --dport $i -j DROPl done echo "" echo -n "FW: Blocking attacks to UDP port " for i in $UDPBLOCK; do echo -n "$i " $IPT -A INPUT -p udp --dport $i -j DROPl $IPT -A OUTPUT -p udp --dport $i -j DROPl $IPT -A FORWARD -p udp --dport $i -j DROPl done echo "" # Открываем отлеживание соединений по ftp MODULES="ip_nat_ftp ip_conntrack_ftp" for i in $MODULES; do echo "Inserting module $i" modprobe $i done # Защищаем некоторые распространенные клиенты для чата. # Уберите из списка допустимых для пущей безопасности. IRC='ircd' MSN=1863 ICQ=5190 NFS='sunrpc' # Нам нужно синхронизировать данные!! PORTAGE='rsync' OpenPGP_HTTP_Keyserver=11371 # Все порты сервисов читаются из /etc/services TCPSERV="domain ssh http https ftp ftp-data mail pop3 pop3s imap3 imaps imap2 time $PORTAGE $IRC $MSN $ICQ $OpenPGP_HTTP_Keyserver" UDPSERV="domain time" echo -n "FW: Allowing inside systems to use service:" for i in $TCPSERV; do echo -n "$i " $IPT -A OUTPUT -o $EXTIF -p tcp -s $EXTIP --dport $i --syn -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF1 -p tcp -s $INTNET1 --dport $i --syn -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF2 -p tcp -s $INTNET2 --dport $i --syn -m state --state NEW -j ACCEPT done echo "" echo -n "FW: Allowing inside systems to use service:" for i in $UDPSERV; do echo -n "$i " $IPT -A OUTPUT -o $EXTIF -p udp -s $EXTIP --dport $i -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF1 -p udp -s $INTNET1 --dport $i -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF2 -p udp -s $INTNET2 --dport $i -m state --state NEW -j ACCEPT done echo "" # Разрешается ping наружу $IPT -A OUTPUT -o $EXTIF -p icmp -s $EXTIP --icmp-type 8 -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF1 -p icmp -s $INTNET1 --icmp-type 8 -m state --state NEW -j ACCEPT $IPT -A FORWARD -i $INTIF2 -p icmp -s $INTNET2 --icmp-type 8 -m state --state NEW -j ACCEPT # Файерволу разрешается ping внутренних систем $IPT -A OUTPUT -o $INTIF1 -p icmp -s $INTNET1 --icmp-type 8 -m state --state NEW -j ACCEPT $IPT -A OUTPUT -o $INTIF2 -p icmp -s $INTNET2 --icmp-type 8 -m state --state NEW -j ACCEPT $IPT -A INPUT -i $INTIF1 -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT $IPT -t nat -A PREROUTING -j ACCEPT $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET1 -j MASQUERADE $IPT -t nat -A POSTROUTING -o $EXTIF -s $INTNET2 -j MASQUERADE $IPT -t nat -A POSTROUTING -j ACCEPT $IPT -t nat -A OUTPUT -j ACCEPT $IPT -A INPUT -p tcp --dport auth --syn -m state --state NEW -j ACCEPT $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # Заблокировать и запротоколировать все, что мы могли забыть. $IPT -A INPUT -j DROPl $IPT -A OUTPUT -j REJECTl $IPT -A FORWARD -j DROPl
Установка почтовой системы на Gentoo linux для небольшой конторы
Используется postfix + cyrus-imap, авторизация пользователей через cyrus-sasl без прикручивания какой-либо БД (подходит для контор с несколькими десятками почтовых ящиков - хранить что-либо в mysql или postgress в данном случае нет смысла). Пользователи хранятся в базе sasldb, поэтому нет нужды заводить в системе реальных пользователей.
Возможно при установке указанных пакетов понадобится установить все зависимости, которые они за собой тянут. Предоставим системе самой разобраться, что же ей не хватает - она с этим вполне успешно справляется.
Предпочитаю использовать для /var reiserfs, но это сугубо личные предпочтения.
emerge -pv cyrus-sasl
[ebuild N ] dev-libs/cyrus-sasl-2.1.20 -authdaemond +berkdb -debug +gdbm +java -kerberos -ldap +mysql +pam -postgres +ssl -static 0 kB
На всякий случай проверяем флаги - все ОК
emerge cyrus-sasl
Этот пакет поставили, едем дальше
emerge -pv postfix
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] mail-mta/postfix-2.1.5-r1 +ipv6 -ldap -mailwrapper -mbox +mysql +pam -postgres -sasl*(-selinux) +ssl -vda 0 kB
Здесь нам может пригодиться флаг sasl, хотя в моем случае пока нет нужды авторизоваться на smtp, возможно в дальнейшем здесь будет описана авторизация через cyrus-sasl на smtp - вообщем выставляйте флаги по вкусу кому что надо
USE="sasl" emerge postfix
Постфикс собрался
emerge -pv cyrus-imapd
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] net-mail/cyrus-imapd-2.2.10 -afs -drac -idled -kerberos +pam -snmp +ssl +tcpd 0 kB
После проверки и установки нужных нам флагов пересобираем openssl и imap-сервер
emerge cyrus-imapd
Программа для администрирования имаповских ящиков
emerge cyrus-imap-admin
После того как все нужные нам пакеты поставлены, можно приступать к настройке
сначала cyrus-sasl
passwd cyrus
pwconv
chown -R cyrus:mail /etc/sasl2 - доступ cyrus к базе /etc/sasl2/sasldb2
saslpasswd2 cyrus - заводим в sasldb2
sasldblistusers2 - для проверки
Cодержимое /etc/postfix/main.cf, ниже приведена примерная конфигурация почтового сервера подключенного напрямую к инету (не через relayhost), естественно для этого случая должна быть MX-запись в ДНС. Подчеркиваю, что умышленно опускаю многие параметры в main.cf, чтобы не раздувать описание. Добавьте все остальное руководствуясь документацией postfix.
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
mail_owner = postfix
myhostname = mail.domain.tld
mydomain = mail.domain.tld
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
local_recipient_maps =
unknown_local_recipient_reject_code = 550
mynetworks_style = subnet
mynetworks = 192.168.1.0/24, 127.0.0.0/8
relay_domains = $mydestination
НА ЭТУ СТРОЧКУ ОБРАТИТЕ ВНИМАНИЕ!!!
mailbox_transport = lmtp:unix:/var/imap/socket/lmtp
Если надо подключить procmail то вместо нее пишем
mailbox_transport = procmail
Когда добавили все, что нужно в main.cf, идем в /etc/postfix/master.cf
Ищем такую строку
# Also specify in main.cf: cyrus_destination_recipient_limit=1
cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
И заменяем путь на
# Also specify in main.cf: cyrus_destination_recipient_limit=1
cyrus unix - n n - - pipe
user=cyrus argv=/cyrus/deliver -e -r ${sender} -m ${extension} ${user}
При использовании procmail, добавляем
procmail unix - n n - - pipe
flags=R user=cyrus argv=/usr/bin/procmail -p /etc/procmailrc USER=${user}
Где файл /etc/procmailrc :
DELIVERMAIL=/usr/lib/cyrus/deliver
LOGFILE=/var/log/procmaillog
IMAP="$DELIVERMAIL -e -a $USER -m user.$USER"
(если надо подключить spamassassin)
:0fw : spamassassin.lock
* < 90000
| /usr/bin/spamassassin
и далее обязательно
:0
| $IMAP
:0w
{
EXITCODE=$?
HOST
}
Все, с постфиксом разобрались, теперь cyrus-imapd
Редактируем /etc/cyrus.conf
# $Header: /var/cvsroot/gentoo-x86/net-mail/cyrus-imapd/files/cyrus.conf,v 1.4 2004/07/18 04:02:23 dragonheart Exp $
# Standard standalone server configuration.
START {
# Do not delete this entry!
recover cmd="ctl_cyrusdb -r"
# This is only necessary if using idled for IMAP IDLE.
#idled cmd="idled"
}
# UNIX sockets start with a slash and are put into /var/imap/socket.
SERVICES {
# Add or remove based on preferences.
imap cmd="imapd" listen="imap2" prefork=0
pop3 cmd="pop3d" listen="pop-3" prefork=0
# Don't forget to generate the needed keys for SSL or TLS
# (see doc/html/install-configure.html).
imaps cmd="imapd -s" listen="imaps" prefork=0
pop3s cmd="pop3d -s" listen="pop3s" prefork=0
sieve cmd="timsieved" listen="sieve" prefork=0
# at least one LMTP is required for delivery
#lmtp cmd="lmtpd" listen="lmtp" prefork=0
##ОБРАТИТЕ ВНИМАНИЕ НА ЭТУ СТРОКУ
lmtpunix cmd="lmtpd" listen="/var/imap/socket/lmtp" prefork=0
# this is only necessary if using notifications
#notify cmd="notifyd" listen="/var/imap/socket/notify" proto="udp" prefork=1
}
EVENTS {
# This is required.
checkpoint cmd="ctl_cyrusdb -c" period=30
# This is only necessary if using duplicate delivery suppression.
delprune cmd="ctl_deliver -E 3" period=1440
# This is only necessary if caching TLS sessions.
tlsprune cmd="tls_prune" period=1440
}
Вот так делаем сертификаты
openssl req -new -nodes -out req.pem -keyout key.pem
openssl rsa -in key.pem -out new.key.pem
openssl x509 -in req.pem -out ca-cert -req \
-signkey new.key.pem -days 999
cp new.key.pem /etc/ssl/cyrus/server.pem
rm new.key.pem
cat ca-cert >> /etc/ssl/cyrus/server.pem
chown cyrus:mail /etc/ssl/cyrus/server.pem
chmod 600 /etc/ssl/cyrus/server.pem # Your key should be protected
Проверяем все-ли директории созданы
/var/imap
cd /var
mkdir imap
chown cyrus:mail imap
chmod 750 imap
/var/spool/imap
cd /var/spool
mkdir imap
chown cyrus:mail imap
chmod 750 imap
/usr/sieve
cd /usr
mkdir sieve
chown cyrus:mail sieve
chmod 750 sieve
Далее редактируем /etc/imapd.conf
configdirectory: /var/imap
partition-default: /var/spool/imap
auto_transition: yes
tls_ca_path: /etc/ssl/cyrus
tls_cert_file: /etc/ssl/cyrus/server.pem
tls_key_file: /etc/ssl/cyrus/server.pem
admins: cyrus
hashimapspool: yes
allowanonymouslogin: no
allowplaintext: yes
sasl_pwcheck_method: auxprop
sasl_auxprop_plugin: sasldb
sasldb_path: /etc/sasl2/sasldb2
sasl_mech_list: LOGIN PLAIN
Авторизация через базу sasldb, механизмы авторизации LOGIN,PLAIN Если мы будем использовать обычные открытые пароли, без шифрования (например внутри организации) то изменим в /etc/imapd.conf
allowanonymouslogin: yes
вроде бы с настройкой cyrus покончено
Теперь займемся почтовыми ящиками юзеров, для этого используем программу cyradm
/etc/init.d/cyrus start
cyradm -user cyrus -server localhost
localhost> cm user.testuser
localhost> help - выводит все команды для руления юзерскими ящиками
localhost> exit
Не забудьте забить в sasldb2 нового юзера:
saslpasswd2 testuser
Поднимаем сервисы
/etc/init.d/postfix start
/etc/init.d/cyrus start
Настраиваем почтового клиента (проверено с thunderbird 1.0 и с KMail 1.7.1, с Outlook Express тоже не должно быть проблем).
Пробуем отправить письмо, если что-то не работает - смотрим логи, прежде всего проверьте права на доступ в /var/imap/socket/lmtp для пользователей postfix и cyrus, чаще всего проблемы связаны именно с этим. Также проверьте права на доступ к /etc/sasl2/sasldb2 для пользователя cyrus, который должен быть в группе mail.
Желательно поставить антивирус например clamav используем для этого связку clamav + clamsmtp хотя возможны и другие варианты например amavisd-new. Установка прекрасно описана здесь http://www.nixp.ru/articles/clamav_postfix, необходимо руководствоваться ей,естественно с адаптацией под реалии Gentoo
emerge clamav
ACCEPT_KEYWORDS="~x86" emerge clamsmtp (пока замаскирован в портаджах)
Затем в файле /etc/conf.d/clamd START_CLAMD = yes (для версии старше 0.85 уже не актуально - все настройки только в clamd.conf и clamsmtpd.conf)
Редактируем файлы /etc/clamd.conf и /etc/clamsmtpd.conf в соответствии с рекомендациями приведенными выше по ссылке Обратите внимание на параметры LocalSocket: /var/run/clamav/clamd.sock в /etc/clamav.conf и ClamAddress: /var/run/clamav/clamd.sock в /etc/clamsmtpd.conf - путь и имя файла должен одинаковым для обоих конфигов
В файл main.cf необходимо добавить две строчки:
content_filter = scan:127.0.0.1:10025
receive_override_options = no_address_mappings
Первая говорит postfix'у о том, что необходимо пересылать всю почту через сервис (фильтр) 'scan' на 10025-ый порт, который, как раз, открыт clamsmtpd. Вторая строчка говорит о том, чтобы postfix не делал никаких манипуляций с адресами до того, как они дойдут до content_filter. Так что получается, что фильтр работает с реальными почтовыми адресами, а не с результатами перевода в виртуальные псевдонимы, маскарадингом и т.п.
В файл master.cf необходимо добавить следующие строки:
# AV scan filter (used by content_filter)
scan unix - - n - 16 smtp
-o smtp_send_xforward_command=yes
# For injecting mail back into postfix from the filter
127.0.0.1:10026 inet n - n - 16 smtpd
-o content_filter=
-o receive_override_options=no_unknown_recipient_checks,no_header_body_checks
-o smtpd_helo_restrictions=
-o smtpd_client_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o smtpd_authorized_xforward_hosts=127.0.0.0/8
Примечание: вокруг знака '=' пробелы не ставить. Значение 127.0.0.1:10026 открывает 10026-порт для возвращения почты обратно от clamsmtpd.
rc-update add clamd default
rc-update add clamsmtpd default
/etc/init.d/postfix reload
все - антивирус должен проверять всю почту проходящую через Ваш почтовик
P.S. Все вышеописанное проверялось на моей рабочей машине и на серваке небольшой конторы. Автор (или авторы) не несут ответственности за безграмотное и необдуманное применение данного руководства. Ваша безопасность в ваших руках и в голове! Данное описание не претендует на полное и развернутое и не является единственно возможным вариантом конфигурации. Также выражаю признательность разработчикам вышеописанных замечательных программ за прекрасное исполнение и хорошую документацию. Практически все вышенаписанное подчерпнуто из документации к самим пакетам, а также некоторые мысли родились из отрывочных данных, блуждающих в рунете - большое спасибо за это их авторам.
PS. Некоторая путаница возникает с переадресацией почты - самый простой вариант использование файла aliases - но до его использования в отличие от sendmail, ящик который должен быть переадресован должен быть все-таки создан в системе через cyradm -user cyrus -auth login -server localhost команда cm и не забыть что etc/postfix/main.cf
alias_maps = hash:/usr/local/etc/postfix/aliases
alias_database = hash:/usr/local/etc/postfix/aliases
Это перевод статьи en:HOWTO vsftpd. Кое-что изменено и добавлено от себя для более понятного, как мне кажется, изложения
Взято из en:HOWTO Plan, setup and run a high school Gentoo Club и модифицировано.
Это руководство описывает процесс установки VSFTP и настройки его для анонимного доступа с правами только для чтения. FTP (File Transfer Protocol) - старый, но надежный протокол, используемый для быстрой передачи файлов в сети.
Зайдите в систему под пользователем root и введите комманду: Code: Установка
emerge vsftpd
Настройка
Это очень легко. Откройте файл /etc/vsftpd/vsftpd.conf вашим любимым текстовым редактором и внесите в него вот эти изменения:
Общие настройки
Файл: /etc/vsftpd/vsftpd.conf
dirmessage_enable=YES
# banner_file=/etc/vsftpd/vsftpd.banner # edit banner first
chown_uploads=NO
xferlog_enable=YES
idle_session_timeout=600
data_connection_timeout=120
ascii_upload_enable=NO
ascii_download_enable=NO
chroot_list_enable=YES
background=YES
listen=YES
ls_recurse_enable=NO
Анонимный пользователь (Anonymous), только для чтения
Файл: /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=NO
anon_mkdir_write_enable=NO
Это плохая идея разрешать локальным пользователям доступ через ftp (проще sftp/ssh), потому мы отключаем им доступ. Файл: /etc/vsftpd/vsftpd.conf
local_enable=NO
write_enable=NO
Gentoo предоставляет централизированное место для служб, которые называються init scripts или скрипты инициализации. Эти скрипты находяться в каталоге /etc/init.d/ и имеют имя сервиса, который они стартуют. Инит скрипты используються для управления сервисами. Для запуска VSFTPD сервера наберите Code: Запуск vsftpd как службы
/etc/init.d/vsftpd start
Вы можете узнать больше о том что вы можете сделать этим скриптом инициализации набрав "/etc/init.d/vsftpd" без аргументов ("start" это аргумент, еще есть "stop" и "restart") )
Вы не хотите набирать /etc/init.d/vsftpd start каждый раз когда вы включаете свой компьютер? Gentoo предоставляет простой путь запуска скриптов инициализации при включении вашего компьютера. Чтобы настроить VSFTPD для запуска при каждой загрузке, наберите: Code: запуск vsftpd как службы загрузке
rc-update add vsftpd default
Если вы хотите узнать больше о rc-update наберите "man rc-update".
Также можно и через chkconfig: Code: запуск vsftpd как службы загрузке
chkconfig vsftpd on
Файлы анонимного пользователя находятся в домашнем каталоге специального пользоватьля ftp (пользователя в системе). По умолчанию это - /home/ftp. Если вы хотите сменить его например на /var/ftp, вам нужно сделать следущие действия: /var/ftp Code: Смена размещения
rmdir /home/ftp
mkdir /var/ftp
chown ftp:ftp /var/ftp
ln -s /var/ftp /home/
Теперь можно что-то разместить в этом каталоге. Например, если вы хотите сделать доступными для других каталоги disfiles и packages, можно сделать следущие действия: Code: '
mv /usr/portage/disfiles /var/ftp/
ln -s /var/ftp/disfiles /usr/portage/
mv /usr/portage/packages /var/ftp/
ln -s /var/ftp/packages /usr/portage/
Примечание: VSFTPD автоматически запусается в chroot окружении, поэтому символические ссылки не работают. Именно для этого пришлось перенести каталоги /usr/portage/disfiles и usr/portage/packages и создать символические ссылки в тех местах где они должны находится.
Но можно например монтировать нужные каталоги в .../ftp при помощи fstab. Для этого нужно создать каталоги: /var/ftp/distfiles и /var/ftp/packages Code: '
mkdir /var/ftp/distfiles
mkdir /var/ftp/packages
После чего пропишите в /etc/fstab следущее: Code: '
/usr/portage/distfiles /var/ftp/distfiles none ro,bind 0 0
/usr/portage/packages /var/ftp/packages none ro,bind 0 0
Есть множеcтво программ, которые позволяют получать доступ к ftp серверу. Вот некоторые из них:
ftp
lftp - лучшый консольный клиент
mozilla-firefox
nautilus
gftp
Jabber - это открытый протокол, использующий XML, для быстрого обмена сообщениями и информацией о присутствии между любыми двумя абонентами в интернете. Благодаря своей уникальной расширяемости и гибкости, jabber способен поддерживать множество протоколов - ICQ, IRQ, MSN, RSS, Yahoo и др.
В качестве платформы для развертывания протокола jabber возьмем пакет jabberd. Он поддерживает множество возможностей - основные IM-протоколы ICQ, MSN, Yahoo, поддержку SSL-соединений и даже IPv6.
Сначала посмотрим, какие USE-флаги требует jabber: Code: Зависимости
# emerge -pv jabberd
These are the packages that I would merge, in order:
Calculating dependencies ...done!
[ebuild N ] net-im/jabberd-1.4.3-r5 -icq -ipv6 -ldap -msn -oscar -ssl -yahoo 0 kB
Total size of downloads: 0 kB
Включаем соответсвующие флаги в установку (неважно, через переменную USE или через файл make.conf) и собираем: USE="icq ssl" emerge jabberd В качестве зависимости вытянется пакет jit - Jabber ICQ Transport, необходимый для поддержки протокола ICQ.
Сначала добавьте пользователей, ответсвенных за администрирование сервера jabber, в группу jabber:
gpasswd -a имя_пользователя jabber
Все конфигурационные файлы, связанные с jabber, имеют формат XML и находятся в каталоге /etc/jabber.
Обязательно надо прописать имя хоста и РАЗРЕШИТЬ регистрации.
Добавляем запуск сервера при старте системы:
rc-update add jabber default
Стартуем наш сервер: /etc/init.d/jabber start
Все должно работать :)
Рано или поздно у большинства админов локальных сетей возникает необходимость настраивать игровые сервера для пользователей. Одной из самых популярных сетевых игр на сегодняшний день является Counter-Strike.CS:Source. Которая, к сожалению пока не приобрела достаточной популярности у нас в России. Мы рассмотриму установку сервера для игры CS 1.6. Более популярной в среде российских геймеров.
Для установки CS-сервера нам понадобится только одна программа:halflife-steam Code: emerge -pv halflife-steam
Calculating dependencies ...done!
[ebuild N ] games-server/halflife-steam-2.0 3,431 kB
Total size of downloads: 3,431 kB
Steam - это утилита от Valve,позволяющая обновлять любую их игру через steam-network.
Ставим steam
Установка сводится к простому emerge halflife-steam.
Настройка установка hl
Steam установится в каталог /opt/halflife
ВАЖНО: в ноябре 2006 года в пакете была бага. Что характерно для всех продуктов получаемых через стим, они иногда забывают unix специфику. Непостредственно у меня, на steam не стоял бит исполняемости. И в cs было имя типа xxx.WAD (нужно wad, различаеться регистр) Code: команды
cd /opt/halflife
chmod +x stream
Code: команды
./steam -command update -game cstrike -dir ./
Наблюдаем лог. Если никаких слов типа error нет - значит сервер установился. Code: output
HLDS installation up to date
Предупреждение: Этот сервер работает только в LAN (класс С) и только со steam клиентами. Все остальное Варез
Задача:
Организация файлового сервера
Авторизация пользователей через домен контроллер
Дано:
Red Hat 9.0
Samba 3.0.13
DC win 2003 server
Взяться за написание данной статьи меня побудило то, что когда возникла задача о которой написано выше , то статьи описывающей решение данной проблемы полностью я не нашел вот и решил написать такую статью в которой было бы готовое решение.
Первым делом устанавливаем самбу. Решено было использовать последнюю версию 3.0.13. Установлено все это было из стандартного RPM пакета. Думаю с этим сложностей ни у кого не возникает, док по данному вопросу полно и потому начнем сразу править конфиг самбы. Ниже приведен окончательный работающий конфиг, может там и есть что лишнее, но после того как все заработало я убирать оттуда ничего не стал.
[global]
realm = bryusov.iasnet.ru
# Workgroup = имя NT-домена (или рабочей группы):
workgroup = DOMAIN
# NetBIOS-имя, под которым будет виден сервер остальным машинам сети.
netbios name = NAU
# Комментарий, появляющийся рядом с именем машины в "Сетевом окружении" Windows.
server string = Samba Server
# Следующий параметр влияет на безопасность. Hosts allow разрешает машинам с
# указанными IP-адресами присоединяться к Samba-серверу.
hosts allow = 172.18. 172.17. 127.
# если подставить %m то для каждой машины подключенной к Samba-серверу будет
# использоваться свой log-файл.
log file = /var/log/samba/log.smbd
# это кому скока не жалко
max log size = 500
# определяет, каким образом будет осуществляться проверка пароля (нам надо через DC)
security = domain
# Параметр Password server используется только совместно с опцией security = domain
password server = <IP домен контролера>
# для репликации всех доменов входящих в траст с вашим доменом
allow trusted domains = yes
# включаем поддержку шифрованных паролей.
encrypt passwords = yes
# Используя следующий параметр можно создать отдельную конфигурацию для каждой машины домена.
# Вместо пары символов %m при входе подставляется NetBIOS-имя машины.
# Я Такого не делал хотя поэксперементровать можно.
# include = /usr/local/samba/lib/smb.conf.%m
# данные строчки можно не включать в работающий конфиг они определяют место
# хранения , порядок обновления Unix паролей и какой программой все это производится
smb passwd file = /etc/samba/smbpasswd
unix password sync = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %n\n *ReType*new*UNIX*password* %n\n *passwd:*all*authentication*tokens*updated*successfully*
# В документации говорится, что с помощью этого параметра
# можно повысить производительность Samba-сервера.
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
# по дефолту слушаются все интерфейсы, здесь можно указать конкретно
interfaces = <ip или название интерфейса>
# строчки которых не было в стандартном конфиге и были добавлены руками для pепликации NT-юзеpов:
winbind uid = 10000-20000
winbind gid = 10000-20000
winbind enum groups = yes
winbind enum users = yes
# Если вам нужны русские буквы в именах файлов, то раскоментируйте
# следующие 3 строки (заменив KOI8-R на свою локаль)
# dos charset = CP866
# unix charset = KOI8-R
# display charset = KOI8-R
# описываем шары
[FILES]
comment = share
path = /share/FILES
public = no
writable = yes
valid users = DOMAIN\users
create mask = 0744
# настройка кириллицы по желанию
Все с конфигом самбы закончили, далее привожу конфиг /etc/krb5.conf
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
ticket_lifetime = 24000
default_realm = PDC.DOMAIN.NAME.RU
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
DOMAIN.NAME.RU = {
kdc = pdc.domain.name.ru:88
admin_server = kerberos.domain.name.ru:749
default_domain = domain.name.ru
}
[domain_realm]
.domain.name.ru = DOMAIN.NAME.RU
domain.name.ru = DOMAIN.NAME.RU
[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
Все остальное оставлено без изменений.
Теперь заводим самба сервер в домен, делаем со стороны домен контролера двусторонние доверительные отношения, запускаем getent group и видим что все работает.
Вот и все надеюсь полезной инфы достаточно для быстрой и эффективной настройки файл сервера.
Огромное спасибо всем кто писал статьи про самбу почти все их прочитал и почерпнул много полезного , в том числе не только для решения своих задач.
Установим нужные пакеты:
# USE="ldap acl ldapsam pam gdbm samba ssl tcpd winbind" emerge samba openldap acl nss_ldap pam_ldap
ВАЖНО: Версия nss_ldap должна быть не ниже 250-r1 (>=sys-auth/nss_ldap-250-r1)
Конфигурирование OpenLDAP
Для примера используется домен amber.global.com который является дочерним доменом домена global.com, который работает под управлением Win2003 Server.
Примечание: Не решенной задачей осталось создание доверительных отношений между доменами и включение домена amber в лес global.com
Файл: /etc/openldap/slapd.conf
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/misc.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/openldap.schema
include /etc/openldap/schema/samba.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
access to dn.base=""
by self write
by * auth
access to attr=userPassword
by self write
by * auth
access to attr=shadowLastChange
by self write
by * read
access to *
by * read
by anonymous auth
#loglevel 1
database ldbm
suffix "dc=amber,dc=global,dc=com"
rootdn "cn=Manager,dc=amber,dc=global,dc=com"
# Пароль rootpw лучше всего указывать в зашифрованном виде.
# Для генерации шифрованного пароля используйте утилиту slappasswd
# Например: slappasswd -h {MD5}
# rootpw = secret
rootpw {MD5}Xr4ilOzQ4PCOq3aQ0qbuaQ==
directory /var/lib/openldap-ldbm
index objectClass eq
index cn eq,subinitial
index sn eq,subinitial
index uid eq,subinitial
index displayName eq,subinitial
index uidNumber eq
index gidNumber eq
index memberUID eq
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
Файл: /etc/openldap/ldap.conf
HOST 127.0.0.1
BASE dc=sanaa,dc=global,dc=com
Проверяем разрешения на каталоги /var/lib/openldap-*
ls -la /var/lib/
ВАЖНО:
drwx------ 2 ldap ldap 104 Июн 8 18:31 openldap-data
drwx------ 2 ldap ldap 72 Июн 8 18:31 openldap-ldbm
drwx------ 2 ldap ldap 72 Июн 8 18:31 openldap-slurp
пока работаем без шифрования трафика, так как сервер LDAP и SAMBA работают на одном сервере, подправляем конфиг чтобы LDAP слушал 389 порт только на localhost.
Файл: /etc/conf.d/sldap
# conf.d file for the openldap-2.1 series
#
# To enable both the standard unciphered server and the ssl encrypted
# one uncomment this line or set any other server starting options
# you may desire.
#
# OPTS="-h 'ldaps:// ldap:// ldapi://%2fvar%2frun%2fopenldap%2fslapd.sock'"
OPTS="-h 'ldap://127.0.0.1'"
и запускаем OpenLDAP
/etc/init.d/slapd start
Миграция OpenLDAP
Существует 2 пути создания учетных записей пользователей: домен уже существует и создание нового домена. В первом случае самбу нужно настроить в режиме BDC, перенести все учетные записи, и потом изолировав PDC, перезапустить самбу в режиме PDC. Во втором случае все еще проще, самбу сразу запускаем в режиме PDC и создаем стандарные учетные записи при помощи замечательного пакета smbldap-tools.
emerge smbldap-tools
/etc/init.d/samba start
Code: configure.pl
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
smbldap-tools script configuration
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Before starting, check
. if your samba controller is up and running.
. if the domain SID is defined (you can get it with the 'net getlocalsid')
. you can leave the configuration using the Crtl-c key combination
. empty value can be set with the "." character
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Looking for configuration files...
Samba Configuration File Path [/etc/samba/smb.conf] >
The default directory in which the smbldap configuration files are stored is shown.
If you need to change this, enter the full directory path, then press enter to continue.
Smbldap-tools Configuration Directory Path [/etc/smbldap-tools/] >
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Let's start configuring the smbldap-tools scripts ...
. workgroup name: name of the domain Samba act as a PDC
workgroup name [amber] >
. netbios name: netbios name of the samba controler
netbios name [neptun] >
. logon drive: local path to which the home directory will be connected
(for NT Workstations). Ex: 'H:'
logon drive [U:] >
. logon home: home directory location (for Win95/98 or NT Workstation).
(use %U as username) Ex:'\\neptun\%U'
logon home (press the "." character if you don't want homeDirectory) [\\%L\users\%U] >
. logon path: directory where roaming profiles are stored. Ex:'\\neptun\profiles\%U'
logon path (press the "." character if you don't
want roaming profile) [\\%L\Profiles\%a\%U] >
. home directory prefix (use %U as username) [/home/%U] >
. default users' homeDirectory mode [700] >
. default user netlogon script (use %U as username) [] >
default password validation time (time in days) [45] > 900
. ldap suffix [dc=amber,dc=global,dc=com] >
. ldap group suffix [ou=Groups] >
. ldap user suffix [ou=Users] >
. ldap machine suffix [ou=Users] >
. Idmap suffix [ou=Idmap] >
. sambaUnixIdPooldn: object where you want to store the next uidNumber
and gidNumber available for new users and groups
sambaUnixIdPooldn object (relative to ${suffix}) [sambaDomainName=amber] >
. ldap master server: IP adress or DNS name of the master (writable) ldap server
ldap master server [127.0.0.1] >
. ldap master port [389] >
. ldap master bind dn [cn=Manager,dc=amber,dc=global,dc=com] >
. ldap master bind password [] >
. ldap slave server: IP adress or DNS name of the slave ldap server: can also
be the master one
ldap slave server [127.0.0.1] >
. ldap slave port [389] >
. ldap slave bind dn [cn=Manager,dc=amber,dc=global,dc=com] >
. ldap slave bind password [] >
. ldap tls support (1/0) [0] >
. SID for domain amber: SID of the domain (can be obtained with 'net getlocalsid neptun')
SID for domain amber [S-1-5-21-1918777035-593721947-2697221154] >
. unix password encryption: encryption used for unix passwords
unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA) [SSHA] > MD5
. default user gidNumber [513] >
. default computer gidNumber [515] >
. default login shell [/bin/bash] >
. default skeleton directory [/etc/skel] >
. default domain name to append to mail adress [] >
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
backup old configuration files:
/etc/smbldap-tools/smbldap.conf->/etc/smbldap-tools/smbldap.conf.old
/etc/smbldap-tools/smbldap_bind.conf->/etc/smbldap-tools/smbldap_bind.conf.old
writing new configuration file:
/etc/smbldap-tools/smbldap.conf done.
/etc/smbldap-tools/smbldap_bind.conf done.
Если мы не хотим, что бы у всех пользователей профили были перемещаемыми, то в файле /etc/smbldap-tools/smbldap.conf установим следующее значение: Файл: /etc/smbldap-tools/smbldap.conf
...
userProfile=""
...
Инициализируем каталоги самбы в LDAP:
smbldap-populate -a Administrator -k 0 -m 0
Конфигурация SAMBA
Файл: /etc/samba/smb.conf
[global]
workgroup = amber
netbios name = neptun
realm = amber.global.com
nt acl support = yes
acl compatibility = win2k
map acl inherit = yes
server string = Samba Server %v
interfaces = eth0
bind interfaces only = yes
hosts allow = 192.168.7. 127.
log file = /var/log/samba/log.%m
debug level = 9
max log size = 500
socket options = TCP_NODELAY SO_SNDBUF=8192 SO_RCVBUF=8192
security = user
os level = 250
passdb backend = ldapsam:"ldap://127.0.0.1/"
enable privileges = yes
passwd program = /usr/sbin/smbldap-passwd "%u"
passwd chat = *new*password* %n\n *new*password* %n\n *successfully*
passdb expand explicit = no
unix password sync = no
ldap passwd sync = no
ldap suffix = dc=amber,dc=global,dc=com
ldap admin dn = cn=Manager,dc=amber,dc=global,dc=com
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
# Т.к. для самбы компьютеры и пользователи - одно и то же,
# и искать она в дальнейшем записи компьютеров будет в пользователях,
# то для избежания дальнейших проблем при добавлении рабочих станций
# к домену мы вместо следующей строки
#
# ldap machine suffix = ou=Computers
#
# напишем другую:
ldap machine suffix = ou=Users
ldap idmap suffix = ou=Idmap
idmap backend = ldapsam:ldap://127.0.0.1/
idmap uid = 10000-20000
idmap gid = 10000-20000
ldap delete dn = Yes
ldap ssl = no
add user script = /usr/sbin/smbldap-useradd -n -a "%u"
delete user script = /usr/sbin/smbldap-userdel "%u"
add group script = /usr/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/sbin/smbldap-userdel "%g"
add user to group script = /usr/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/sbin/smbldap-usermod -g "%g" "%u"
add machine script = /usr/sbin/smbldap-useradd -w "%u"
#PDC
domain master = yes
preferred master = yes
#BDC
# domain master = no
# preferred master = no
domain logons = Yes
logon script =
# Если хотите, что бы профили всех пользователей были перемещаемыми
# и хранились на сервере (со всеми гигабайтами фильмов и личных фотографий)
# то укажите такое значение следующего параметра:
#
# logon path = \\%L\Profiles\%a\%U
#
# Если вы не хотите гонять профили по сети, оставьте значение пустым,
# (но ни в коем случае не комментируйте эту строку, она просто получит
# значение по умолчанию), вот так:
logon path =
logon drive = U:
logon home = \\%L\users\%U
#============================ Share Definitions ==============================
[netlogon]
comment = Network Logon Service
path = /var/lib/samba/netlogon
browseable = yes
guest ok = yes
writable = no
share modes = no
[Profiles]
admin users = admin
create mode = 600
directory mode = 700
path = /var/lib/samba/profiles
browseable = yes
guest ok = yes
writable = yes
[homes]
comment = Home Directories
browseable = no
read only = no
[public]
path = /pub
guest ok = yes
read only = no
[users]
path = /home/users
writable = yes
printable = no
Добавим запуск winbind с самбой (если нужно): Файл: /etc/conf.d/samba
...
daemon_list="smbd nmbd winbind"
...
Введём пароль рабочей станции:
smbpasswd -w secret
Введём контроллёр домена, собственно в домен
net rpc join -S neptun -U Administrator
--ladserg 14:05, 28 июля 2006 (UTC) У меня честно говоря не получилось сделать авторизацию пользователей samba через LDAP без настройки поддержки авторизации системных пользователей в LDAP, пришлось настраивать и это.
Сначала поправим файл /etc/ldap.conf, приведя его примерно к следующему виду:
Файл: /etc/ldap.conf
host 127.0.0.1
base dc=amber,dc=global,dc=com
ldap_version 3
rootbinddn cn=Manager,dc=amber,dc=global,dc=com
bind_timelimit 10
bind_policy soft
pam_filter objectClass=posixAccount
pam_password exop
nss_base_passwd ou=Users,dc=tty,dc=perm,dc=ru?one
nss_base_shadow ou=Users,dc=tty,dc=perm,dc=ru?one
nss_base_group ou=Groups,dc=tty,dc=perm,dc=ru?one
nss_base_hosts ou=Hosts,dc=tty,dc=perm,dc=ru?one
nss_base_services ou=Services,dc=tty,dc=perm,dc=ru?one
nss_base_networks ou=Networks,dc=tty,dc=perm,dc=ru?one
nss_base_protocols ou=Protocols,dc=tty,dc=perm,dc=ru?one
nss_base_rpc ou=Rpc,dc=tty,dc=perm,dc=ru?one
nss_base_ethers ou=Ethers,dc=tty,dc=perm,dc=ru?one
nss_base_netmasks ou=Networks,dc=tty,dc=perm,dc=ru?one
nss_base_bootparams ou=Ethers,dc=tty,dc=perm,dc=ru?one
nss_base_aliases ou=Aliases,dc=tty,dc=perm,dc=ru?one
nss_base_netgroup ou=Netgroup,dc=tty,dc=perm,dc=ru?one
ssl off
nss_reconnect_tries 4
nss_reconnect_sleeptime 1
nss_reconnect_maxsleeptime 16
nss_reconnect_maxconntries 2
Сим мы скажем nss_ldap где и как искать зписи пользователей и групп.
Теперь сзодадим файл /etc/ldap.secret и при помощи лбого текстого редактора в plain/text виде занесём туда пароль пользователя, который выше у нас указан в опции rootbinddn, нпример пароль secret:
Файл: /etc/ldap.secret
secret
Затем непременно установим на него нужные права:
Code: Установка прав на файл /etc/ldap.secret
#chmod 600 /etc/ldap.secret
#chown root:root /etc/ldap.secret
Далее приведём файл /etc/pam.d/system-auth к следующему виду:
Файл: /etc/pam.d/system-auth
auth required pam_env.so
auth sufficient pam_unix.so likeauth nullok
auth sufficient pam_ldap.so use_first_pass
auth required pam_deny.so
account sufficient pam_ldap.so
account required pam_unix.so
password required pam_cracklib.so difok=2 minlen=8 dcredit=2 ocredit=2 retry=3
password sufficient pam_unix.so nullok md5 shadow use_authtok
password sufficient pam_ldap.so use_authtok
password required pam_deny.so
session required pam_limits.so
session required pam_unix.so
session required pam_mkhomedir.so skel=/etc/skel/ umask=077
session optional pam_ldap.so
Обратите внимание на строку:
session required pam_mkhomedir.so skel=/etc/skel/ umask=077
Она заставляет систему создавать домашние каталоги для тех пользоватей у которых они ещё не созданы, при этом в новый каталог помещается содержимое директории /etc/skel/ и задаётся маска каталога 0x700
После чего правим файл /etc/nsswitch.conf, приводя его к следующему виду:
Файл: /etc/nsswitch.conf
passwd: files ldap
shadow: files ldap
group: files ldap
hosts: files dns
networks: files dns
services: db files
protocols: db files
rpc: ldap [NOTFOUND=return] db files
ethers: ldap [NOTFOUND=return] db files
netmasks: files
netgroup: ldap [NOTFOUND=return] files
bootparams: files
automount: files
aliases: files
Предупреждение: Ни в коем случае не добавляйте значение ldap к следующим базам: hosts, networks, protocols, services. Иначе вы рискуете не дождаться следующей загрузки системы.
Всё, теперь мы указали системе брать пользователей как из системных файлов, так и из LDAP.
Перезагрузим наш компьютер, дабы убедиться что система грузится нормально. Если система останавливается на загрузке udev, то смотрите ошибки в файле /etc/nsswitch.conf, может вы указали использовать ldap не в той базе.
Ранее мы установили пакет smbldap-tools, теперь рассмотрим возможность управления пользователями с его помощью.
Создание пользователя
smbldap-useradd [-o] [-a] [-b] [-w] [-i] [-u uid] [-g gid ] [-G groups,,,]
[-n] [-d home] [-s shell] [-c gecos] [-m [-k]] [-t] [-P] [-A 0|1] [-B 0|1]
[-C sambaHomePath] [-D sambaHomeDrive] [-E sambaLogonScript] [-F sambaProfilePath]
[-H sambaAcctFlags] [-N surname] [-S family name] [-M local mailAddress,,,]
[-T mailToAddress] [-?] user
Где:
user - системное имя создаваемого пользователя
-o - add the user in the organizational unit (relative to the user suffix)
-a - is a Windows User (otherwise, Posix stuff only)
-b - is a AIX User
-w - is a Windows Workstation (otherwise, Posix stuff only)
-i - is a trust account (Windows Workstation)
-u - uid
-g - gid
-G - список групп пользователя, разделённых запятой.
-n - do not create a group
-d - домашний каталог пользователя (по умолчанию /home/имя_пользователя)
-s - оболочка пользователя (по умолчанию /bin/false)
-c - отображаемое в Windows имя пользователя
-m - создать домашний каталог и скопировать в него файлы из /etc/skel
-k - указать иной каталог, из которого будут копироваться файлы при
создании домашнего каталога пользователя (используется с ключём -m)
-t - time. Wait 'time' seconds before exiting (when adding Windows Workstation)
-P - ends by invoking smbldap-passwd
-A - возможность менять пароль пользователем, значение 0 если нет, 1 если да
-B - пользователь должен поменять пароль, значение 0 если нет, 1 если да
-C - домашний каталог samba (например '\\PDC-SRV\homes')
-D - буква диска для монтирования домашнего каталога samba (например 'H:')
-E - скрипт, выполняемый при входе в систему
-F - каталог профиля пользователя (например '\\PDC-SRV\profiles\foo')
-H - sambaAcctFlags (samba account control bits like '[NDHTUMWSLKI]')
-N - настоящее имя пользователя (для русских ещё и отчество)
-S - фамилия пользователя
-M - local mailAddress (comma seperated)
-T - mailToAddress (forward address) (comma seperated)
-? - отобразить помощь
Например создание пользователя ladserg:
smbldap-useradd -a -c 'Serg Alex Lad' -N 'Serg Alex' -S 'Lad' -s /bin/bash ladserg
К сожалению подружить smbldap-tools с русским мне не удалось, даже при использовании кодировки UTF-8.
Итак, в приведённом выше примере будет создан пользователь с системным именем ladserg, фамилией Lad, именем Serg Alex, оболочкой /bin/bash, домашним каталогом /home/ladserg. Флаг -a укажет, что пользователь также будет являться пользователем домена.
Изменение пароля
smbldap-passwd [-s] [-u] [-h] username
Где:
username - имя пользователя
-h, -?, --help - показать помощь
-s - обновить только samba пароль
-u - обновить только UNIX пароль
Например:
smbldap-passwd ladserg
После чего дважды будет запрошен пароль.
Теперь можно попробовать зайти в систему под учётной записью только что созданного пользователя.
Модификация пользователя
smbldap-usermod [-a] [-c comment] [-d home_dir] [-e expiration_date]
[-g initial_group] [-r new_login_name] [-p passwd] [-s shell] [-u uid [ -o]] [-x]
[-A canchange] [-B mustchange] [-C smbhome] [-D homedrive] [-E scriptpath]
[-F profilepath] [-G group[,...]] [-H acct‐flags] [-N canonical_name]
[-S surname] [-P] login
Где:
-c - Полное имя
-d - Домашний каталог
-r - новое имя пользователя (cn, sn и dn будут обновлены)
-u - uid
-o - uid может быть не уникальным
-g - gid
-G - список групп пользователя, разделённых запятой.
-s - оболочка
-N - настоящее имя пользователя (для русских ещё и отчество)
-S - фамилия пользователя
-P - ends by invoking smbldap-passwd
For samba users:
-a - add sambaSAMAccount objectclass
-e - expire date ("YYYY-MM-DD HH:MM:SS")
-A - возможность менять пароль пользователем, значение 0 если нет, 1 если да
-B - пользователь должен поменять пароль, значение 0 если нет, 1 если да
-C - домашний каталог samba (например '\\PDC-SRV\homes')
-D - буква диска для монтирования домашнего каталога samba (например 'H:')
-E - скрипт, выполняемый при входе в систему
-F - каталог профиля пользователя (например '\\PDC-SRV\profiles\foo')
-H - sambaAcctFlags (samba account control bits like '[NDHTUMWSLKI]')
-I - disable an user. Can't be used with -H or -J
-J - enable an user. Can't be used with -H or -I
-M - mailAddresses (comma seperated)
-T - mailToAddress (forward address) (comma seperated)
-?|-h - отобразить помощь
Например команда:
smbldap-usermod -A 1 ladserg
Позволит пользователю ladserg менять пароль. А команда:
smbldap-usermod -a slad-adm
Добавит к учётной записи пользователя slad-adm класс sambaSAMAccount, что сделает его пользователем samba.
Удаление пользователя
smbldap-userdel [-r|-R|-?] username
Где:
-r удалить домашний каталог
-R удалить домашний каталог с запросом на удаление каждого файла
-? отобразить помощь
Например команда:
smbldap-userdel -r slad-adm
удалит пользователя slad-adm, и его домашний каталог.
Управление пользователями в оффтопике
Если вы вводите в домен компьютеры под управлением Windows, то вам пригодятся пара утилит, архив которых можно скачать отсюда:
ftp://ftp.microsoft.com/Softlib/MSLFILES/SRVTOOLS.EXE
В данной статье описывается, как осуществить мониторинг разных системных и физических параметров компьютеров, работающих под GNU/Linux или другими UNIX.
Постановка задачи
Нужно осуществлять постоянный мониторинг основных параметров работы компьютеров (физических и системных) через сеть, собирать и выдавать эту информацию в удобной форме.
Для примера см: http://monitoring.sourceforge.net/example.html
К основным системным параметрам относят: загрузка процессоров (пользователями, системой, привилегированными программами, свободное процессорное время), использования оперативной памяти (и многие другие, всего больше 100), дисков, сетевого трафика. Для получения необходимых нам значений параметров работы системы используем программы df, sar и iptables или ipfw.
К физическим параметрам относят: температуру процессора и материнской платы, скорость вращения вентиляторов, напряжения питания. Для получения показателей датчиков материнских плат используется модуль ядра I2C и программа lm_sensors.
Для передачи информации через сеть используем клент-серверную модель и программу Net-Telnet. Базу данных строим пакетом rrdtool, информацию предоставляем через сервер apache и/или по почте. С помощью скриптов постараемся максимально упростить и автоматизировать поставленную задачу, это избавит вас от рутинной работы.
Программа работает по клиент-серверной технологии. На компьютерах, которые нужно мониторить, размещается часть программы, которая снимает различные показатели работы компьютера и выдает их по запросу через сеть. На одном административном компьютере осуществляется периодический опрос всех компьютеров, за которыми ведется наблюдение, данные записываются в специально созданную базу, и на её основе формируется html страница, которая экспортируется через apache для просмотра обычным браузером.
Теперь подробно о том, что нам нужно сделать:
Загружаем последнюю версию программы для мониторинга с сайта http://monitoring.sourceforge.net/ Файл monitoring-*.tar.bz2 размещаем в доступном месте, например в папке локального ftp: /var/ftp/pub/linux.
Разархивируйте monitoring-*.tar.bz2.
У Gentoo есть ебилд, для установки программы monitoring со всеми зависимостями. С сайта необходимо скачать monitoring-*.ebuild.tar.bz2 и распаковать его в /usr/local. Далее выполните:
# emerge -pv monitoring
[ebuild N ] net-analyzer/monitoring-0.11 USE="-admin -apache2 -lm_sensors -server"
Для серверной стороны необходимо добавить USE="server", а для поддержки мониторинга датчиков USE="lm_sensors"
# export "USE=lm_sensors server"
# emerge monitoring
Компиляция и установка lm_sensors, sysstat, iptables, coreutils, xinetd в случае использования Gentoo можно пропустить, потому что эти пакеты уже установлены как зависимости, и перейти сразу к их настройке.
Определяем на базе какого чипсета сделаны платы: материнская, видеокарта (некоторые имеют датчики) и прочие, заходим на страницы: http://secure.netroedge.com/~lm78/supported.html и http://www.lm-sensors.nu/~lm78/newdrivers.html и ищем, есть ли драйверы для мониторинга этих плат под Линуксом. Если определили, что ваши чипсеты поддерживаются и драйвер стабильный, можете продолжить выполнение этого пункта.
Внимание, если версия ядра меньше за 2.4.9, нужно обновить ядро или воспользоваться старой версией программы! смотрите: i2c. Если ядро версии 2.4.*, вам дополнительно нужен СООТВЕТСТВУЮЩИЙ! модуль i2c-*.*.*.tar.gz, родной Линуксовый не подходит. В версии ядра 2.6.* все хорошо - отлично работает родной модуль ядра i2c.
Подробную инструкцию по сборке нового ядра можно прочесть по ссылке "Ставим ядро 2.6, или Ядерная физика для домохозяйки. Версия 2.0"
Обратите особое внимание на пункты, которые добавляют к ядру GNU/Linux поддержку сенсоров:
Для поддержания ACPI:
Power management options (ACPI, APM) ---> ACPI (Advanced Configuration and Power Interface) Support --->
Для поддержки IPMI стандарта управления сенсорами.
Device Drivers ---> Character devices ---> IPMI --->
Включаем поддержку сенсоров в ядре
Device Drivers ---> I2C support --->
Выбираем алгоритмы, использующие ваши чипы
Device Drivers ---> I2C support ---> I2C Algorithms --->
Выбираем ваш чипсет (внимание, здесь нужно указать чипсет именно вашей системной платы, или видеокарты, см. ниже):
Device Drivers ---> I2C support ---> I2C Hardware Bus support --->
Device Drivers ---> I2C support ---> Miscellaneous I2C Chip support --->
Выбираем драйверы ко всем вашим сенсорам (внимание, именно тех, соответствующих вашим чипам, предыдущим пунктам):
Device Drivers ---> Hardware Monitoring support --->
Можно собрать необходимые драйверы как модули, хотя это несколько добавит работы при настройке (нужно будет запустить программу sensors-detect). Для мониторинга сети можно использовать netfilter (iptables) и прочие