На данный момент есть три различных клиентских DHCP программы для Linux, dhcpcd, pump и dhclient. Этот mini-HOWTO рассматривает главным образом dhcpcd.
В зависимости от вашего дистрибутива, возможно, вам придется загрузить клиентский DHCP демон. Если вы хотите скомпилировать его из исходных кодов, необходимый вам пакет называется dhcpcd, его текущая версия 1.3.18. Он поддерживается Sergei Viznyuk <sergei@phystech.com>
и, на сегодняшний день, поставляется в большинстве дистрибутивов в виде бинарного пакета.
Исходный код dhcpcd может быть загружен со следующих мест
ftp://ftp.phystech.com/pub/ (Первичный сайт)
Затем следуйте ниже приведенным инструкциям. Они должны быть таковы.
Вы можете загрузить последнюю версию DHCPcd с любого зеркала Metalab или отсюда:
Загрузите последнюю версию dhcpcd.tar.gz.
Распакуйте его
tar -zxvf dhcpcd-1.3.18pl1.tar.gz
войдите в каталог и выполните make dhcpcd
cd dhcpcd-1.3.18pl1
make
Установите его (вам следует выполнить от root следующую команду)
make install
Будет создан каталог /etc/dhcpc, где DHCPcd будет размещать DHCP информацию, а также будет скопирован в /usr/sbin файл dhcpcd.
Для инициализации системы во время загрузки с помощью DHCP наберите:
cd /etc/rc.d
mv rc.inet1 rc.inet1.OLD
Старый скрипт инициализации сети будет перемещен в rc.inet1.OLD. Вам следует создать новый скрипт rc.inet1, в котором следует поместить следующий код:
#!/bin/sh # # rc.inet1 Этот shell скрипт загружает базовую INET систему. HOSTNAME=`cat /etc/HOSTNAME` #Возможно это не требуется, но я это оставлю # ак или иначе # Подключаем устройство loopback. /sbin/ifconfig lo 127.0.0.1 /sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo # ЕСЛИ У ВАС ЕСТЬ ETHERNET СОЕДИНЕНИЕ, для настройки интерфейса eth0 # используйте ниже приведенные строки. Если вы используете только # loopback или SLIP, не включайте оставшиеся далее строки в этот файл. /usr/sbin/dhcpcd |
Сохраните его и перезагрузите компьютер.
Когда закончите, переходите к следующему шагу.
Настройка DHCPcd под RedHat 6.0+ достаточно проста. Все что от вас требуется — запустить панель управления, набрав control-panel.
Выбрать "Network Configuration"
Щелкнуть на Interfaces
Щелкнуть на Add
Выбрать Ethernet
В Edit Ethernet/Bus Interface выбрать "Activate interface at boot time", а также выбрать "DHCP" как "Interface configuration protocol"
Заметьте, что в RedHat 6.x, вместо вышеупомянутого dhcpcd, Redhat по умолчанию включила DHCP клиент называемый pump. Установочный CD-ROM также содержит и dhcpcd RPM, так что если вы не удовлетворены pump, попробуйте вместо него dhcpcd. После установки dhcpcd (т.е. rpm -i dhcpcd-1.3.17pl2-1.i386.rpm) вам следует сделать несколько изменений.
Дополнительные заметки от Alexander Stevenson <alexander.stevenson@home.com>
:
Я не доволен DHCPcd. Что привело меня к работе с "pump", который поставляется с Linux Mandrake 6.0 (и, я полагаю, он также включен в RedHat). Я использую команду:
pump -i eth0 -h hostname
Не имеет значение, какой был указан "hostname", но без него сервер не отвечал бы.
Затем, для отражения изменений я меняю строку в моем скрипте /sbin/ifup; версия по умолчанию не содержит ключ -h , и поэтому она у меня не работала.
По существу, если вы используете linuxconf, и после настройки адаптера на использование "DHCP" он все еще не работает, попробуйте добавить "-h hostname" в строку с pump в скрипте /sbin/ifup. Теперь мой скрипт выглядит так:
... if [ -n "$PUMP" ]; then echo -n "Determining IP information for $DEVICE..." if /sbin/pump -i $DEVICE -h hostname; then echo " done." else echo " failed." exit 1 fi else ... |
Другой, более элегантный путь добавления поля hostname предоставлен Aad van der Klaauw:
Сейчас дома я настраиваю шлюзовую систему, требуется установить MAC адрес и использовать '-h hostname'. Поэтому я решил *не* изменять скрипт, а использовать конфигурационный файл. В моем /etc/sysconfig/network-scripts/ifcfg-eth0 я добавил следующее
DEVICE="eth0" MACADDR="00:11:22:33:44:55" DHCP_HOSTNAME="trigger_for_terayon" |
Эти строки пережили обновления системы, и, по моему мнению, это "более правильный" способ.
Перезагрузите вашу машину или наберите в командной строке /sbin/ifup eth0.
Настройка DHCPcd под RedHat 5.0+ достаточно проста. Все что вам нужно — запустить панель управления, набрав control-panel.
Выбрать "Network Configuration"
Щелкнуть на Interfaces
Щелкнуть на Add
Выбрать Ethernet
В Edit Ethernet/Bus Interface выбрать "Activate interface at boot time", а также выбрать "DHCP" как "Interface configuration protocol"
Когда закончите, переходите к следующему шагу.
DHCPcd включен в дистрибутив RedHat в виде RPM, и вы можете его найти на CD-ROM в каталоге RPMS или скачать его с:
ftp://ftp.redhat.com/pub/redhat/redhat-4.2/i386/RedHat/RPMS/dhcpcd-0.6-2.i386.rpm
Установите его с помощью rpm -i dhcpcd-0.6-2.i386.rpm.
Или же вы можете скомпилировать вашу собственную версию следуя шагам описанным в Slackware.
Следующая информация поступила ко мне от nothing <nothing@cc.gatech.edu>
.
Я удалил мой статический ip и имя из /etc/resolv.conf. Однако я оставил строку search и две моих nameserver строки (по некоторой причине мой dhcpcd никогда не создает /etc/dhcpc/resolv.conf, так что я использую статический файл /etc/resolv.conf).
В /etc/sysconfig/network я удалил элементы HOSTNAME и GATEWAY. Я оставил другие элементы, такие как (NETWORKING, DOMAINNAME, GATEWAYDEV).
В /etc/sysconfig/network-scripts/ifcfg-eth0 я удалил элементы IPADDR, NETMASK, NETWORK, и BROADCAST. Я оставил в исходном виде DEVICE и ONBOOT. Я изменил строку BOOTPROTO на BOOTPROTO=dhcp.
Сохраняем файл. Перезагружаем ваш компьютер.
Если вы закончили, переходите к следующему шагу.
Существует deb пакет DHCPcd (проверьте, чтобы он начинался с dhcpcd) на:
http://ftp.debian.org/debian/dists/slink/main/binary-i386/net/
Либо, следуйте инструкциям по установке Slackware.
Для распаковки deb пакета наберите dpkg -i /where/ever/your/debian/packages/are/dhcpcd*deb.
Кажется, что больше не требуется никаких настроек для DHCPcd, потому как:
Пакет dhcpcd устанавливает свой стартовый скрипт как обычно для debian пакетов в /etc/init.d/package_name, то есть /etc/init.d/dhcpcd, и создает ссылки на него из различных /etc/rc?.d/ каталогов. | ||
--From: Heiko Schlittermann
<heiko@os.inf.tu-dresden.de> |
Содержимое каталогов /etc/rc?.d/ в дальнейшем исполняется при загрузке.
Если вы не перегружались после установки, вы можете запустить демон вручную: /etc/init.d/dhcpcd start.
Когда вы закончили переходите к следующему шагу.
Следующая секция была написана R. Shapiro
С выпуска "1999" (R5) release, Linuxppc почти полностью совместим с Redhat 6, с одной оговоркой (смотрите ниже). В общем, инструкции точно такие же, как и для текущего выпуска RedHat 6.x и Mandrake 6.x.
Остается та проблема, что Redhat 6 по умолчанию использует 'pump' клиент для dhcp, а 'pump' не надежно работает на Linuxppc. Чтобы это обойти, вам следует установить последнюю версию dhcpcd от Sergei Viznyuk, и отредактировать /sbin/ifup для использования dhcpcd вместо pump.
Измените
if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then PUMP=true fi if [ -n "$PUMP" ]; then |
на
if [ "$BOOTPROTO" = bootp ]; then echo " done." else echo " failed." exit 1 fi elif [ "$BOOTPROTO" = dhcp ]; then echo -n "Determining IP information for $DEVICE..." if /sbin/dhcpcd -d $DEVICE ; then if [ -f /etc/dhcpc/dhcpcd-${DEVICE}.exe ]; then /etc/dhcpc/dhcpcd-${DEVICE}.exe fi |
и внесите соответствующие изменения для ifdown. Измените
if [ "$BOOTPROTO" = bootp -o "$BOOTPROTO" = dhcp ]; then .... fi |
на
if [ "$BOOTPROTO" = bootp ]; then fi if [ "$BOOTPROTO" = dhcp ]; then if [ -f /var/run/dhcpcd-${DEVICE}.pid ]; then kill `cat /var/run/dhcpcd-${DEVICE}.pid` rm -f /var/run/dhcpcd-${DEVICE}.pid fi fi |
Работающий ppc rpm для dhcpcd включен в Linuxppc 1999 cd; немного позже rpm стал доступен в каталоге contrib на ftp://ftp.linuxppc.org/. Исходный код, из которого скомпилирован пакет для Linuxppc 1999, доступен по ftp://ftp.phystech.com/pub/dhcpcd-1.3.17-pl9.tar.gz.
После перезагрузки вашей машины ваш сетевой интерфейс должен быть настроен. Наберите: ifconfig.
Вы должны получить нечто подобное:
lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0 UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1 RX packets:302 errors:0 dropped:0 overruns:0 frame:0 TX packets:302 errors:0 dropped:0 overruns:0 carrier:0 coll:0 eth0 Link encap:Ethernet HWaddr 00:20:AF:EE:05:45 inet addr:24.128.53.102 Bcast:24.128.53.255 Mask:255.255.254.0 ^^^^^^^^^^^^^^^^^^^^^^^ UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24783 errors:1 dropped:1 overruns:0 frame:1 TX packets:11598 errors:0 dropped:0 overruns:0 carrier:0 coll:96 Interrupt:10 Base address:0x300 |
Если у вас разумные числа в поле inet addr, вы уже настроились. Если вы видите 0.0.0.0 ‐ не отчаивайтесь, это временные настройки, перед тем как dhcpcd получит IP адрес. Если через несколько минут, вы все равно видите 0.0.0.0, то загляните в Поиск неисправностей. DHCPcd ‐ демон, и должен быть запущен все время, пока работает ваша машина. Каждые три часа он связывается с DHCP сервером и пытается продлить аренду используемого IP адреса. Он регистрирует все сообщения в syslog (в Slackware /var/adm/syslog, в RedHat/OpenLinux /var/log/syslog).
Еще одно заключение. Вам следует указать ваш сервер имен. Есть два способа это сделать, вы можете либо попросить вашего провайдера дать вам адреса ваших серверов имен и затем поместить их в /etc/resolv.conf, либо DHCPcd будет получать список с DHCP сервера и будет создавать файл resolv.conf в /etc/dhcpc.
Я решаю использовать DHCPcd resolv.conf и выполняю следующее:
Сохраните ваш старый /etc/resolv.conf: mv /etc/resolv.conf /etc/resolv.conf.OLD
Если каталог /etc/dhcpc не существует — создайте его: mkdir /etc/dhcpc
Создайте ссылку с /etc/dhcpc/resolv.conf на /etc/resolv.conf: ln -s /etc/dhcpc/resolv.conf /etc/resolv.conf
Если это не помогает, попробуйте это (решение предоставлено <nothing@cc.gatech.edu>
с небольшими поправками от Henrik Stoerner):
Этот последний шаг я выполнил только из-за того, что мой dhcpcd не создает /etc/dhcpc/resolv.conf. Я сделал следующие изменения в /etc/sysconfig/network-scripts/ifup (это очень грубый взлом, но так у меня все работает):
elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd -c /etc/sysconfig/network-scripts/ifdhcpc-done ${DEVICE} echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^ echo "failed." exit 1 |
Я изменил на:
elif [ "$BOOTPROTO" = dhcp -a "$ISALIAS" = no ]; then echo -n "Using DHCP for ${DEVICE}... " /sbin/dhcpcd echo "echo \$$ > /var/run/dhcp-wait-${DEVICE}.pid; exec sleep 30" | sh if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ]; then ^^^^^^ echo "failed." exit 1 |
Замечание: Обратите внимание на ! (восклицательный знак) в if [ ! -f /var/run/dhcp-wait-${DEVICE}.pid ];
Теперь откиньтесь на спинку и наслаждайтесь :-).
Следующие шаги не необходимы, но могут быть полезны некоторым людям:
Если сеть вам нужна только время от времени, вы можете запускать dhcpcd из командной строки (для этого вам нужно быть root) командой: /usr/sbin/dhcpcd.
Когда вам нужно отключить сеть наберите /usr/sbin/dhcpcd -k.
Если вы следовали вышеприведенным шагам и не можете получить доступ к вашей сети, этому есть еще несколько возможных объяснений:
В процессе загрузки ваш Linux будет определять вашу сетевую карту и должен сказать что-то подобное:
eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov |
Если подобное этому сообщение не появляется, ваша сетевая карта, возможно, не распознается Linux системой. Если у вас обобщенная сетевая карта (клон NE2000), вы должны получить диск с DOS утилитами, которыми вы сможете настроить вашу карту. Попробуйте поиграть с IRQ, пока Linux не распознает вашу карту (обычно подходят IRQ 9,10,12).
Попробуйте запустить dhcpcd, набрав dhcpcd -r.
Для проверки настроек вашего сетевого интерфейса используйте ifconfig (подождите несколько секунд для завершения процесса настройки, сначала она выдаст Inet.addr=0.0.0.0)
Если это решит вашу проблему, добавьте ключ "-r" в загрузочный скрипт, т.е: вместо /sbin/dhcpcd вы получите /sbin/dhcpcd -r.
Например, под RedHat отредактируйте /etc/sysconfig/network-scripts/ifup и вставьте следующее:
IFNAME=$[ {DEVICE} \ "/sbin/dhcpcd -r -c /etc/"- etc etc. |
Скорее всего вы используете RedHat и вы не аккуратно следовали инструкциям :-). Вы пропустили ! (восклицательный знак) в одном из выражений if . Сходите сюда и посмотрите как это исправить.
Некоторые люди сообщают, что gated (демон маршрутизации) искривляет маршрутизацию на Linux машинах, что приводит к описанной выше проблеме. Проверьте, запущен ли он у вас, запустив: ps -auxww | grep gate.
Если запущен, попробуйте удалить его с помощью RedHat RPM менеджера пакетов или удалить элемент в каталоге /etc/rc.d/.
Вы должны проверить, что на вашей сетевой карте активирован 10BaseT порт ("телефонный" разъем). Лучше всего это узнать, проверив какой тип соединителя вашей сетевой карты настроен в процессе загрузки, т.е.
eth0: 3c509 at 0x300 tag 1, 10baseT port, address 00 20 af ee 11 11, IRQ 10. ^^^^^^^^^^^^ 3c509.c:1.07 6/15/95 becker@cesdis.gsfc.nasa.gov |
Мне сообщали, что проблема такого рода встречается у пользователей ноутбуков из-за PCMCIA утилит (особенно ifport), которые хотят установить тип соединителя на 10Base2 (тонкий коаксиальный кабель). Вы должны проверить, что для вашего соединения вы используете 10BaseT. Если это не так, перенастройте карту и перезапустите компьютер.
На некоторых системах, вам следует включить имя вашего компьютера как часть запроса. У dhcpcd, это делается с помощью dhcpcd -h foohost. Возможно, что требуемое имя компьютера ‐ ваше имя пользователя в сети.
Кабельные модемы обычно запоминают ethernet адрес вашей сетевой карты, так что если вы подключаете новый компьютер или переключаете сетевые карты, вы должны как-то "научить" ваш кабельный модем распознавать новый компьютер/карту. Обычно вы можете выключить и снова включить ваш модем при включенном компьютере или позвонить в службу технической поддержки и сказать им, что вы заменили сетевую карту в компьютере.
У вас есть правила firewall (правила ipfwadm), которые запрещают трафик по портам 67/68, которые используются DHCP для распространения информации о настройках. Тщательно проверьте правила вашего firewall.
Кажется, что MediaOne использует некоторые дополнения к DHCP, которых не должно быть. Вероятно, это не должно быть проблемой, но если ваш опыт говорит об обратном, проверьте это. Если вы (не)счастливый обладатель Windows NT, и если, входя в Просмотр Событий(Event Viewer) вы видите такого рода предостережение:
DHCP получил неизвестную опцию 067 длиной 005. Необработанные данные опции даны ниже. (DHCP received an unknown option 067 of length 005. The raw option data is given below.) 0000: 62 61 73 69 63 basic |
В этом случае сходите на ftp://vanbuer.ddns.org/pub/ и, либо загрузите бинарный файл, либо возьмите исходный код для замены.
Если у вас не получилось успешно запустить dhcpcd на вашей Linux системе, попробуйте ISC dhclient. dhclient поставляется с DHCP дистрибутивом от ISC, который включает как DHCP клиента, так и DHCP сервер. Инструкции по получению и установке дистрибутива DHCP могут быть найдены здесь. Когда вы закончите, пожалуйста, вернитесь к этой секции для настройки клиента.
Замечание: Следующая информация была предоставлена одним из авторов dhclient — Ted Lemon
<mellon@isc.org>
.
В текущей версии DHCP клиента, фактически вам не нужен dhclient.conf. Все что вам следует сделать ‐ вызвать dhclient то есть: /sbin/dhclient.
Он настроит все широковещательные интерфейсы. Если это не сработает, или вы хотите указать только один интерфейс — создайте файл /etc/dhclient.conf примерно с такими настройками.
interface "eth0" { send dhcp-client-identifier 1:xx:xx:xx:xx:xx:xx; send dhcp-lease-time 86400; } |
Тут мы полагаем, что ethernet интерфейс — eth0. Если это не так, измените его. Также измените xx:xx:xx:xx:xx на ваш ethernet адрес. Этот dhclient.conf заставляет клиента выглядеть как Win95 клиент.