Handspring-Visor mini-HOWTO
Ryan VanderBijl
Перевод: Михаил Корепанов, ASPLinux
Использование Visor в Linux через порт USB
Ядро
Прежде всего вам необходимо получить ядро, которое поддерживает USB. Вы можете либо получить последнее разработанное ядро версии 2.4.0-test5 () (7 августа 2000) по адресу: ftp://ftp.kernel.org/pub/linux/kernel/v2.4/, либо можете взять последнюю устойчивую версию ядра версии 2.2.16 по адресу: ftp://ftp.kernel.org/pub/linux/kernel/v2.2/
и драйвера для USB. Последние драйвера для USB можно взять с: http://www.suse.cz/development/usb-backport/
Текущая версия (август 2000): usb-2.4.0-test2-pre2-for-2.2.16-v3. Могут быть доступны патчи на: http://sourceforge.net/patch/?group_id=1404. Загрузите и установите исходный код, включая драйвер для usb, если вы используете версию 2.2. Ниже показан пример установки версии 2.2 и драйвера USB.
cd /usr/src tar xzvf linux-2.2.14.tar.gz cd linux gzip -dc ../usb-2.3.50-1-for-2.2.14.diff.gz | patch -p1 make distclean
Затем ответственный шаг - определить, какой контроллер USB вы имеете. USB контроллер - аппаратное обеспечение на вашем компьютере, который управляет вводом/выводом USB. На материнской плате с чипсетом Intel, напр. с чипсетом BX - обычный UHCI контроллер. Большинство карт имеют OHCI контроллер. Вы можете определить тип аппаратного обеспечения USB, используя команду 'lspci -v' (смотрите Ссылки если у вас нет lspci). Если вы увидите приблизительно следующее:
USB Controller: ...... Flags: ..... I/O ports at ....
Тогда у вас UHCI контроллер. Если вы увидите приблизительно следующее:
USB Controller: ..... Flags: .... Memory at .....
Тогда у вас OHCI контроллер. (Документация по определению типа контроллера была взята из документаци ядра, Documentation/usb/scanner.txt). Вы можете обратится к http://www.linux-usb.org
для дополнительных подробностей. Документация (Documentation/usb/usb.txt) может также быть полезна в определении вашего типа контроллера.
Если у вас нет USB контроллера, вам необходимо либо купить USB-крэдл для последовательного порта для Visor (что вы делаете читая это?), либо купить устройство с USB (например плату расширения или материнскую плату).
Теперь вам нужно сконфигурировать и собрать ядро. Во время конфигурации убедитесь, что вы разрешаете:
USB support (CONFIG_USB),
соответствующий контроллер - UHCI, альтернатива UHCI или OHCI (CONFIG_USB_UHCI, CONFIG_USB_UHCI_ALT или CONFIG_USB_OHCI)
Поддержка последовательного USB конвертера (CONFIG_USB_SERIAL)
Драйвер USB Handspring Visor (CONFIG_USB_SERIAL_VISOR)
( Я не уверен, что существует разница между драйверами UHCI и тем который рекомендуется для использования). Я собрал их с ядром и как модули ядра. Оба работали. Разработчик предпочитает модульный метод, но вы, как хотите.
После того, как вы это сделаете, закончите установку ядра и перезагрузите компьютер.
Еще не все! Чтобы заставить работать драйвер Visor, нам нужно сделать драйвер USB для последовательного порта. Для этого просмотрите документацию к ядру Linux: Documentation/usb/usb-serial.txt. Там в основном описывается, как создать файлы устройств. Вы можете это сделать командами (под root):
mknod /dev/ttyUSB0 c 188 0 mknod /dev/ttyUSB1 c 188 1 и т.п. ... chmod 666 /dev/ttyUSB*
Вам понадобится создать шестнадцать соединений/портов/устройств, с номерами от 0 до 15. Команда chmod разрешает пользователям доступ к устройству Visor. Это личное мнение автора документа, т.к. это персональный компьютер.
Когда Visor соединен, открыты 2 порта. (Для большинства это будут устройства /dev/ttyUSB0 и /dev/ttyUSB1, или подобные). Первый порт (0) - универсальное подключение. Второй порт - для горячей синхронизации (hotsync). Эта особенность будет разработана в будущем, например, чтобы экспортировать файловую систему с Visor. Будет полезным - создать ссылку на hotsync порт и программное обеспечение для синхронизации будет использовать соответствующее устройство по умолчанию. Вы можете сделать это:
cd /dev ln -s /dev/ttyUSB1 pilot
Только ради забавы, вы можете создать ссылку /dev/visor на /dev/ttyUSB1. Фактический номер устройства можно изменить, в зависимости от того, сколько много (активных?) USB устройств вы имеете в системе. В сообщении отображается устройство, которое фактически используется, когда нажата кнопка горячей синхронизации.
Для тех, кто компилирует USB драйвер, как модули, необходимо также вставить модули в ядро. Запустите (под root):
/sbin/modprobe usb-uhci /sbin/modprobe usb-ohci /sbin/modprobe usb-serial
Почти сделано! (проверка)
Мы почти все сделали. Сейчас нам нужно все проверить. Естественно, что visor нужно вставить в крэдл, а крэдр подключить к вашему USB порту.
Чтобы протестировать, мы должны использовать coldsync. Для того, чтобы дать понять компьютеру, что visor подсоединен, вы должны нажать кнопку hotsync на крэдле. (Когда USB устройство соединяется, на экране появляется информация, в случае, если включена отладка). В конечном счете, драйвер будет находится в /proc/drivers/visor. Теперь вы можете запустить coldsync:
coldsync -p /dev/visor
(Помните, /dev/visor - символьная ссылка на /dev/ttyUSB1). С этого момента используйте другую документацию, в частности, страницы руководства.
Ссылки
Для этого документа, я использовал:
ColdSync: http://www.ooblick.com/software/coldsync/
PalmOS HOWTO: http://www.orbits.com/Palm/
Pilot-link: ftp://ryeham.ee.ryerson.ca/pub/PalmOS
Pilot-link: http://pilot-link.sourceforget.net
Ядро Linux: ftp.kernel.org/pub/linux/kernel/
Драйвер USB: http://www.linux-usb.org
Страница USB Visor: http://usbvisor.sourceforge.net
Утилита lspci: http://atrey.karlin.mff.cuni.cz/~mj/pciutils.html
Требования
Нужны такие очевидные вещи, как компьютер с портами USB, hand visor (с разъемом USB), Linux и т.д. Так же вам необходимо знать, как пересобрать ядро. Если вы не знаете, как это сделать, то возможно kernel-HOWTO будет вам полезно: http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html.
Установка ColdSync
ColdSync - пакет, который содержит программы, для взаимодействия с вашим Visor (или с вашим Palm(tm), если вы имеете один из них). Другой относительно популярный пакет - pilot-link. Однако, он, кажется, имеет некоторые ошибки при работе, особенно с драйверами USB. Т.о. рекомендуется использовать ColdSync. Система основанная на UHCI, работает прекрасно с coldsync, а с OHCI имеются некоторые проблемы (В обоих случаях использование pilot-link - хуже). За подробностями обратитесь к странице: http://www.geocrawler.com/lists/3/SourceForge/1169/.
На 7 августа 2000 г., последняя устойчивая версия - ColdSync 1.2.5. Последняя версия pilot-link (которая мне известна) - 0.9.3. Одно преимущество pilot-link - имеется графический интерфейс, у coldsync не имеет графический интерфейс.
Программы можно найти здесь:
http://www.ooblick.com/software/coldsync/
ftp://ryeham.ee.ryerson.ca/pub/PalmOS/pilot-link.0.9.3.tar.gz
или возможно тут: http://pilot-link.sourceforge.net/
Загрузите и установите программу, которую вы желаете использовать. (coldsync имеет файл INSTALL, который вы должны прочитать.)
cd /usr/src gzip -dc coldsync-1.2.5.tar.gz | tar xvf - cd coldsync-1.2.5 ./configure make make install
Если вы ленивы, можете сделать установку с помощью redhat и debian пакетов. Я не поддерживаю это.
Исправьте необходимым образом файл /new-disk/etc/fstab
Если разделы или их организация на новом диске отличается от того, что было на старом диске, исправьте необходимым образом на новом диске файл /new-disk/etc/fstab.
Убедитесь в том, что названия разделов дисков (первая колонка) соответствуют организации разделов, которую вы создали на новом диске, что разделы старого диска убраны, и что вы подключаете только один раздел в качестве корневого "/" (это написано во второй колонке).
Чтобы подробнее узнать о формате файла /etc/fstab, см Руководство системного администратора Linux , глава 4 "Подключение и отключение разделов".
Для разделов подкачки используйте примерно следующее:
/dev/hda1 swap swap defaults 0 0 |
Мини-HOWTO: Переход на новый жесткий диск
Yves Bellefeuille
yan@storm.caKonrad Hinsen
hinsen@cnrs-orleans.fr
Перевод: Станислав Рогин, ASPLinux
Как скопировать систему с Linux с одного диска на другой
Отформатируйте новый диск
Для форматирования ext2fs-разделов на новом диске используйте команду:
mkfs.ext2 /dev/hdb1 |
Чтобы программа форматирования произвела также и поиск плохих блоков (физических дефектов) в форматируемом разделе, добавьте опцию -c перед /dev/hdb1.
В случае, если на новом диске будет больше одного Linux-раздела, отформатируйте их все командами "mkfs.ext2 /dev/hdb2", "mkfs.ext2 /dev/hdb3" соответственно. Добавьте опцию -c, если это необходимо.
(Замечание: в старых дистрибутивах команда "mkfs -t ext2 -c /dev/hdb1" не проверяла наличие плохих блоков в Red Hat, Debian и Slackware, что должна была делать в соответствии с man. Сейчас это исправлено.) |
Чтобы отформатировать раздел подкачки, используйте команду:
mkswap /dev/hdb1 |
К этой команде вы также можете добавить опцию -c для проверки плохих блоков на разделе "/dev/hdb1".
Отключите не-Linux разделы и сетевые диски
Некоторые пользователи подключают разделы других операционных систем (DOS, Windows, OS/2, и т.п.), чтобы использовать их в Linux. Эти разделы должны создаваться и копироваться в их родных операционных системах, и их необходимо отключить (unmount) до начала копирования Linux-разделов. Например, если у вас к каталогу /dos
подключен DOS-раздел, его необходимо отключить командой:
umount /dos |
Обратите внимание на синтаксис команды umount, он отличается от английского слова unmount
отсутствием первой буквы n.
Вам также придется подобным образом отключить все сетевые диски.
Перезагрузите систему, исправьте файл конфигурации LILO
Перезагрузите систему. Если возникнут какие-нибудь проблемы, используйте загрузочную дискету, которую вы только что сделали. Чтобы загрузиться с нее, просто измените порядок загрузки системы в BIOS на A:, C:.
Вам также придется исправить /etc/lilo.conf на тот случай, если вы захотите еще раз запустить LILO. Ниже приведен пример:
boot=/dev/hda # Устанавливаем LILO на первый жесткий # диск. map=/boot/map # Местонахождение файла карты ("map file"). install=/boot/boot.b # Файл, которые надо записать в # загрузочный сектор жесткого диска. prompt # LILO должно вывести приглашение # "LILO boot:". timeout=50 # Загрузить систему по умолчанию после 5 # секунд ожидания. (Значение задается в # десятых долях секунды.) image=/boot/vmlinuz # Местонахождение ядра Linux. Настоящее # имя может включать в себя номер # версии, например, # "vmlinuz-2.0.35". label=linux # Название Linux-системы. root=/dev/hda1 # Местонахождение корневого раздела # нового жесткого диска. Исправьте # его в соответствии с новой системой. read-only # Сначала подключаем разделы в режиме # "только для чтения", для запуска fsck. |
Для пользователей Slackware: . Используйте image=/vmlinuz.
Подключите новый диск
Создайте каталог для нового диска, например /new-disk, и подключите его туда:
mkdir /new-disk mount -t ext2 /dev/hdb1 /new-disk |
Если на новом диске имеется больше одного раздела - подключите их все в каталоге /new-disk с той же организацией, что они будут иметь позже.
Пример: . На новом диске будет 4 Linux-раздела, соответственно:
/dev/hdb1: / /dev/hdb2: /home /dev/hdb3: /var /dev/hdb4: /var/spool |
Подключите их в каталоге /new-disk соответственно, как:
/dev/hdb1: /new-disk /dev/hdb2: /new-disk/home /dev/hdb3: /new-disk/var /dev/hdb4: /new-disk/var/spool |
До подключения разделов вам придется создать точки подключения на соответствующих "уровнях", например:
Пример: .
mkdir /new-disk [1st level] mount -t ext2 /dev/hdb1 /new-disk
mkdir /new-disk/home [2nd level] mount -t ext2 /dev/hdb2 /new-disk/home mkdir /new-disk/var [2nd level also] mount -t ext2 /dev/hdb3 /new-disk/var mkdir /new-disk/var/spool [3rd level] mount -t ext2 /dev/hdb4 /new-disk/var/spool |
Если вы создаете новую точку подключения к каталогу /new-disk/tmp, вам будет необходимо исправить разрешения на этот каталог для того, чтобы все имели к нему доступ:
chmod 1777 /new-disk/tmp |
Приготовьте LILO для загрузки с нового диска
(Спасибо Rick Masters за помощь в создании этой главы.) |
Мы предполагаем, что вы собираетесь установить LILO в Главную Загрузочную Запись (Master Boot Record (MBR) - это делается в большинстве случаев. Вы хотите установить LILO на второй диск, который станет первым.
Отредактируйте файл /new-disk/etc/lilo.conf примерно так:
disk=/dev/hdb bios=0x80 # Указываем LILO воспринимать второй # диск так, как будто он первый # диск (BIOS ID 0x80). boot=/dev/hdb # Устанавливаем LILO на второй жесткий # диск. map=/new-disk/boot/map # Местонахождение файла карты ("map file"). install=/new-disk/boot/boot.b # Файл, которые надо записать в # загрузочный сектор жесткого диска. prompt # LILO должно вывести приглашение # "LILO boot:". timeout=50 # Загрузить систему по умолчанию после 5 # секунд ожидания. (Значение задается в # десятых долях секунды.) image=/new-disk/boot/vmlinuz # Местонахождение ядра Linux. Настоящее # имя может включать в себя номер # версии, например, # "vmlinuz-2.0.35". label=linux # Название Linux-системы. root=/dev/hda1 # Местонахождение корневого раздела # нового жесткого диска. Исправьте # его в соответствии с новой системой. # Заметьте, что вы должны использовать # название будущего местоположения, на # момент физического отключения старого диска. read-only # Сначала подключаем разделы в режиме # "только для чтения", для запуска fsck. |
Для пользователей Slackware: Используйте image=/new-disk/vmlinuz.
Если вы используете SCSI-диск, то вам, возможно, придется добавить строку с "initrd". Смотрите ваш текущий файл /etc/lilo.conf.
Установите LILO на новый диск:
/sbin/lilo -C /new-disk/etc/lilo.conf |
Опция -C указывает LILO, какой конфигурационный файл использовать.
Разбейте новый диск на разделы
Для разбития нового диска на разделы используйте команду:
fdisk /dev/hdb |
EIDE -устройства именуются, как hda, hdb, hdc, и hdd в каталоге /dev. Разделы на этих дисках могут принимать номера от 1 до16 и также находятся в каталоге /dev. Например: /dev/hda4 - это 4-ый раздел на диске a (первом EIDE-диске).
SCSI -устройства именуются, как sda, sdb, sdc, sdd, sde, sdf, и sdg в каталоге /dev.Разделы на них, аналогично EIDE-дискам, могут принимать номера от 1 до 16 и находятся в каталоге /dev. Например: /dev/sda3
- это 3-ий раздел на SCSI-диске a (первом SCSI-диске).
(Примечание переводчика: на деле SCSI-диски могут не ограничиваться /dev/sdg - очевидно, что если у вас несколько SCSI-контроллеров, то SCSI-дисков может быть значительно больше - но это, однако, достаточно редкое явление.)
Для Linux-разделов с файловой системой ext2, используйте идентификатор файловой системы 83. Для разделов подкачки (swap), используйте 82.
Если на вашем новом диске более 1024 цилиндров, смотрите "Мини-HOWTO: Большие диски". Вкратце, вы должны все файлы, необходимые для загрузки Linux, поместить в пределах первых 1024 цилиндров. Один из вариантов - создать небольшой раздел (5 Мб или что-то около того) исключительно для каталога /bootв начале диска. (Внимание, пользователи Slackware: Ядро находится в файле /vmlinuzвместо /boot/vmlinuz, поэтому вам придется поместить ядро одновременно в каталог /boot/vmlinuz/ и в каталог /boot
в этот небольшой раздел.)
Разделы для других систем (не для Linux) должны быть созданы в родных системах, с использованием родного fdisk или чего-то подобного, а не при помощи fdisk из Linux.
Скопируйте файлы со старого диска на новый
Вам, наверное, будет необходимо перейти в однопользовательский режим перед началом копирования диска - это необходимо для отключения системных демонов, остановки журналов и прекращения входа других пользователей в систему:
/sbin/telinit 1 |
При копировании жесткого диска вам надо скопировать все каталоги и файлы, включая ссылки.
Однако, вам не нужно копировать каталог /new-disk, потому что это и есть новый диск!
Более того, вам надо создать на новом диске каталог /proc, но содержимое этого каталога копировать не нужно: /proc - это виртуальная файловая система, и в ней нет настоящих файлов, а есть лишь информация о системе и процессах, в ней работающих.
Существуют 3 разных способа копирования старого диска на новый. Это может занять значительное время, особенно если у вас большой диск или мало оперативной памяти. Минимум скорости копирования - примерно 10 Мб в минуту, а, скорее всего, это будет происходить значительно быстрее.
Вы можете следить за копированием командой "df", запущенной с другого терминала. Используйте "watch df" или "watch ls -l /new-disk", чтобы видеть отчет, обновляемый раз в две секунды; нажмите клавиши Ctrl-C для прекращения просмотра. Помните, однако, что сам запуск команды "watch" может замедлить процесс копирования.
cp -ax / /new-disk
Это наиболее простой способ, но он подходит, только если ваша исходная система находилась на одном разделе.
Опция -a сохраняет исходную файловую систему настолько, насколько возможно. Опция -x ограничивает работу команды cp одной файловой системой - поэтому не нужно беспокоиться о каталогах /new-disk и /proc.
Для пользователей SuSE: . Используя этот метод, вы должны также создать каталог /dev/pts на новом диске. Используйте команду "mkdir /new-disk/dev/pts".
(Замечание: Новые версии cp, при использовании опции -x, создадут пустые каталоги /new-disk/new-disk и /new-disk/proc. В этом случае необходимо удалить каталог /new-disk/new-disk, и оставить /new-disk/proc..) |
(напишите все это в одной строке)
Эта команда перейдет в корневой каталог и затем скопирует все файлы и каталоги, кроме /new-disk и /proc в /new-disk. Заметьте, что первый символ после ls - это цифра 1, а не буква L!
Эта команда должна работать в любом случае.
cp -a /bin /boot /dev /etc /home /lib /lost+found /mnt /root /sbin /tmp /usr /var /new-disk
(напишите все это в одной строке)
Последний каталог - /new-disk - это назначение команды cp. Все остальные каталоги - источники. Таким образом, мы копируем все каталоги из списка в /new-disk.
При применении этого метода вы просто перечисляете каталоги, которые хотите скопировать. Здесь мы указали все каталоги, кроме /new-disk и /proc. Если вы не можете использовать первые два метода по каким-либо причинам, то всегда можете вручную указать каталоги, которые необходимо скопировать.
Также надо учесть, что если в корневом каталоге есть файлы, то их тоже надо скопировать отдельной командой. В частности, это касается Debian и Slackware, так как эти дистрибутивы помещают файлы в корневой каталог:
cp -dp /* /.* /new-disk |
В предыдущих версиях этого Мини-HOWTO упоминалось, что вы можете использовать "tar" для копирования диска, но в этом методе была обнаружена ошибка. Конечно, существуют и другие методы скопировать диск, но эти три являются наиболее простыми, быстрыми и надежными.
После использования любого из этих методов вам также надо создать каталог /proc на новом диске, если его еще нет:
mkdir /new-disk/proc |
Затем вы можете проверить файловую систему нового диска, если хотите:
umount /new-disk fsck.ext2 -f /dev/hdb1 mount -t ext2 /dev/hdb1 /new-disk |
Если на новом диске существует больше одного раздела, то вам придется отключить их все "снизу вверх" до запуска fsck.ext2: в соответствии с примером, приведенном выше, вам надо сначала отключить разделы 3-го уровня, затем 2-го и, только в конце, первого.
Можно сравнить два диска, чтобы убедиться, что все скопировано верно:
find / -path /proc -prune -o -path /new-disk -prune -o -xtype f -exec cmp {} /new-disk{} \; |
(напишите все это в одной строке)
Для пользователей Slackware:
стандартная "базовая" установка Slackware (только файлы серии "A") не включает команду "cmp", поэтому это сравнение не запустится, если у вас установлены только базовые файлы. Команда "cmp" находится в файлах серии "AP1".
Здесь мы сравниваем только обычные файлы, символьные же и блочные устройства (из каталога /dev), гнезда (sockets), и т.п. здесь не учитываются, так как команда "cmp" работает с ними не совсем корректно. Мы будем не против, если кто-нибудь подскажет нам, как сравнить эти "специальные" файлы.
Создайте загрузочную дискету (необязательно)
Вы можете, если захотите, создать загрузочную дискету, чтобы избежать проблем с загрузкой, если они возникнут при загрузке с нового диска.
Вставьте чистую дискету, отформатируйте ее, создайте на ней файловую систему и подключите ее:
fdformat /dev/fd0H1440 mkfs.ext2 /dev/fd0 mount -t ext2 /dev/fd0 /mnt |
Для пользователей Debian: . В Debian 2.x версии используйте /dev/fd0u1440 вместо /dev/fd0H1440. В Debian версии 1.x, используйте /dev/fd0h1440, со строчной буквой h.
Для пользователей Debian: В Debian версий 2.x, используйте superformat вместо fdformat. Вы можете не обращать внимания на ошибку mformat: command not found. В Debian версий 1.x, в случае если у вас нет команды fdformatвы можете пропустить ее, если диск уже отформатирован. Вы можете просто проверить дискету на наличие плохих блоков, добавив опцию -c к команде mkfs.ext2.
Для пользователей Slackware: Используйте /dev/fd0u1440 вместо /dev/fd0H1440. В очень старых версиях попытайтесь использовать /dev/fd0h1440, со строчной буквой h.
Для пользователей SuSE: Используйте /dev/fd0u1440 вместо /dev/fd0H1440.
Скопируйте все файлы из каталога /boot на дискету:
cp -dp /boot/* /mnt |
Для пользователей Red Hat: . Если в каталоге /boot есть файлы vmlinux и vmlinuz (обратите внимание на различие в последних буквах), тогда вам надо скопировать только файл vmlinuz. Он ничем не отличается от файла vmlinux, просто он сжат для экономии места.)
Для пользователей Slackware: Скопируйте также на дискету файл /vmlinuz, используйте команду cp /vmlinuz /mnt.
Создайте новый файл /mnt/lilo.conf в соответствии с тем, что написано ниже:
boot=/dev/fd0 # Установить LILO на флоппи-диск. map=/mnt/map # Местонахождение файла карты ("map file"). install=/mnt/boot.b # Файл, который надо записать в # загрузочный сектор диска. prompt # LILO должно вывести приглашение # "LILO boot:" timeout=50 # Загрузить систему по умолчанию после 5 # секунд ожидания. (Значение задается в # десятых долях секунды.) image=/mnt/vmlinuz # Местонахождение ядра Linux на дискете. # Настоящее имя может включать в себя номер # версии, например, # "vmlinuz-2.0.35". label=linux # Название Linux-системы. root=/dev/hda1 # Местонахождение корневого раздела # нового жесткого диска. Исправьте # его в соответствии с новой системой. # Заметьте, что вы должны использовать # название будущего местоположения, на # момент физического отключения старого диска. read-only # Сначала подключаем разделы в режиме # "только для чтения", для запуска fsck. |
Установите LILO на загрузочную дискету:
/sbin/lilo -C /mnt/lilo.conf |
Опция -C указывает LILO на загрузочную дискету:
Отключите дискету:
umount /mnt |
Уберите старый диск
Выключите систему и уберите старый диск. Не забудьте изменить настройки нового диска и информацию в BIOS.
Установите оба диска в вашу систему
Современные системы поддерживают четыре "EIDE"-устройства на одном контроллере жестких дисков, поэтому, в идеале, не должно возникнуть проблем с установкой обоих дисков в систему, даже если у вас есть еще "EIDE"-устройства. Жесткие диски и CD-ROM - типичные примеры EIDE-устройств. Флоппи-дисководы и стримеры обычно подключаются к контроллеру флоппи, очень редко к контроллеру жестких дисков.
SCSI-адаптеры значительно более гибки и поддерживают до семи устройств. Если вы являетесь счастливым (и богатым) обладателем SCSI-адаптера, то уже наверно про это знаете, и вы, возможно, знаете, какие из устройств являются SCSI! За более подробной информацией обращайтесь к HOWTO: SCSI .
Даже очень старые системы поддерживают два устройства на контроллере жесткого диска, поэтому вы все равно сможете установить два диска одновременно. Однако, если у вас, в дополнение к старому диску, подключено еще одно дополнительное устройство (например, если у вас есть жесткий диск и CD-ROM), то придется его убрать, чтобы вместо него установить новый диск.
Вы также должны правильно настроить диски "главными" или "зависимыми" ("master" или "slave"), соответствующим образом выставив переключатели ("jumpers") на дисках. Обычно информация об этих настройках бывает написана на самих дисках; если ее нет - читайте документацию или обратитесь к производителю.
Вы также обязаны проинформировать BIOS о наличии дисков и их "геометрии". Обычно программа настройки BIOS запускается при запуске системы нажатием клавиши. Ниже приведены варианты этих клавиш для наиболее распространенных версий BIOS:
Notebook-и фирмы Acer:
Клавиша F2 в процессе Теста-При-Включении (Power-On Self-Test (POST))
American Megatrends (AMI):
Клавиша Del в процессе Теста-При-Включении (Power-On Self-Test (POST))
Award:
Del, или Ctrl-Alt-Esc
Compaq:
Клавиша F10после того, как в верхнем правом углу экрана появится небольшой квадрат (при включении системы)
Dell:
Ctrl-Alt-Enter
DTK:
Клавиша Esc в процессе Теста-При-Включении (Power-On Self-Test (POST))
Hewlett-Packard Pavilion:
Клавиша F1 в момент появления синей заставки HP
IBM Aptiva 535:
Клавиша F1, когда квадратик с волнистыми линиями появляется в правом верхнем углу экрана [1]
IBM PS/2:
Ctrl-Alt-Del, или Ctrl-Alt-Ins, когда курсор находится в правом верхнем углу
Mr. BIOS:
Ctrl-Alt-S в процессе Теста-При-Включении (Power-On Self-Test (POST))
Packard Bell:
В некоторых моделях клавиши F1 или F2 в процессе Теста-При-Включении (Power-On Self-Test (POST))
Phoenix:
Ctrl-Alt-Esc, Ctrl-Alt-S, или Ctrl-Alt-Enter
На многих старых системах требуется диск с надписью "Installation" или "Reference".
(Мы будем не против, если кто-нибудь дополнит этот список, послав нам информацию о других BIOS-ах)
Перезагрузите систему и войдите в нее как root. Если вы используете команду " su" , чтобы стать root-ом, используйте " su -"(с параметром "-").
Примечания
[1] | Интересно: а это относится к другим моделям Aptiva? |
А у меня Caldera 2.X, а не Red Hat 6.X
Во-первых, большое спасибо за пожертвования на хорошее дело! Во-вторых Nelson Gibbs (ngibbs@pacbell.net) пишет, что многие из этих советов будут работать и у вас. Правда, существуют достаточно серьезные отличия:
Опция GATEWAY=xxx.xxx.xxx.xxx в файле настройки интерфейсов /etc/sysconfig/network-scripts/ifcfg-eth0 и eth1 (для локального интерфейса надо проставить адрес внешнего, а для внешнего - адрес IP-шлюза провайдера).
Убедитесь в том, что в скрипте /etc/sysconfig/daemons/dhcpd опция ROUTE_DEVICE указывает на eth1, а не на eth0.
/etc/dhcpd.conf необходимо внести указание подсети для обоих интерфейсов (Я не знаю почему, но после того, как я добавил команду subnet 216.102.154.201 netmask 255.255.255.255 { } без опций, сервер DHCP начинает работать на обоих интерфейсах eth0 и eth1, и даже на lo0). Если же указать только одну подсеть, то DHCP-сервер не работает, выдавая ошибку.
Не добавляйте маршрут на машину 255.255.255.255, скрипт /etc/rc.d/init.d/dhcpd. Caldera сам исправляет эту проблему. Убедитесь в том, что изменили в скриптах все ссылки на eth0 на eth1.
Безопасность
Одним из самых больших недостатков постоянного соединения с Интернетом при помощи ADSL или кабеля является то, что ваш компьютер открыт для потенциальных атак на систему защиты 24 часа в день, 7 дней в неделю. Использование Linux в качестве шлюза снижает этот риск, потому что он скрывает все ваши компьютеры - по мнению всех внешних компьютеров все соединения устанавливает ваш Linux. Это означает что ваша сеть защищена ровно настолько, насколько защищен ваш Linux, поэтому здесь я дам немного советов о том, как защитить Linux.
Во-первых, надо отключить доступ всем нехорошим парням. Чтобы сделать это, откройте файл /etc/hosts.deny и убедитесь что он выглядит примерно так:
# # hosts.deny Этот файл описывает имена хостов, которым # *запрещено* использовать локальные сервисы INET, вызываемые # при помощи '/usr/sbin/tcpd'. # # Строка portmap в настройке устарела, но она напоминает вам, # что новая защищенная версия portmap использует hosts.deny и hosts.allow. В частности, # вы должны знать, что NFS использует portmap! ALL: ALL
Здесь указано, чтобы "TCP-wrapper", контролирующий примерно 95% входящих соединений, отказывал во входе всем соединениям со всех машин. Достаточно полезное правило! Но в результате этого правила ваша внутренняя сеть также не сможет соединиться с Linux, что неправильно - поэтому мы внесем пару исключений. Откройте файл /etc/hosts.allow и напишите в нем следующее:
# # hosts.allow Этот файл описывает имена хостов, которым # *разрешено* использовать локальные сервисы INET, вызываемые # при помощи '/usr/sbin/tcpd'. # ALL: 127.0.0.1 ALL: 192.168.1.
Здесь указано, чтобы "TCP-wrapper" разрешал все виды соединений с локальной машины (127.0.0.1) и с внутренней сети (192.168.1.).
Теперь вы отгородились от внешних чудищ достаточно прочным заграждением с хорошим замком. Если вам еще нужна сигнализация, ров и вал, то все намного усложняется. Читайте "HOWTO: Защита" - это хороший первый шаг к большей защищенности вашего Linux-а.
Использование Red Hat Linux версии 6.X в качестве Интернет-шлюза для домашней сети
Paul Ramsey
pramsey@refractions.net
Перевод: Станислав Рогин, ASPLinux
Простое руководство по настройке Red Hat 6 и похожих дистрибутивов для использования в качестве интернет-шлюза для небольшой домашней или офисной сети. Затрагиваются темы маскарадинга, DNS, DHCP и основ системы безопасности.
Используя хаб
Если вы собираетесь использовать хаб, то ваша сеть будет выглядеть примерно так.
Подсоедините карту eth0, установленную в Linux-машину, к кабельному или ADSL-модему, используя кабель, установленный фирмой-продавцом (или тот кабель, о котором вы знаете, что он работает. Это очень важно, потому что некоторые кабельные модемы должны подключаться к сети при помощи кросс-кабеля, а другие при помощи обычного: используйте тот, который установила фирма-продавец).
Подсоедините установленную в Linux карту eth1
к хабу при помощи обычного "прямого" кабеля. Подключите все ваши локальные компьютеры к хабу при помощи обычных кабелей.
Я хочу, чтобы одна из моих внутренних машин была Web-сервером
Очень просто! Однако для этого вам надо иметь статический IP-адрес, чтобы использовать эти советы. Если же у вас динамический IP-адрес, то вам понадобятся дополнительные скрипты, меняющие IP-адреса в командах переназначения портов.
Вам также надо помнить, что переназначение внешнего порта на внутреннюю машину делает вашу "внутреннюю" машину менее "внутренней", но это можно сделать достаточно просто без потери производительности. Одним из побочных эффектов IP-маскарадинга, встроенного в ядро Linux, является возможность вносить достаточно веселые изменения в пакеты, проходящие по сети - этим занимается утилита ipmasqadm.
По каким-то причинам ipmasqadm не поставляется в комплекте Red Hat и Mandrake, поэтому вам придется взять его с веб-сайта создателя -- существует и RPM-пакет, и исходный текст.
После того, как вы получите RPM, установите его и добавьте следующие строки в скрипт /etc/rc.d/rc.local:
/usr/sbin/ipmasqadm portfw -f /usr/sbin/ipmasqadm portfw -a -P tcp -L x.x.x.x 80 -R 192.168.1.x 80
Первая команда очищает таблицу правил переназначения портов, а вторая добавляет переназначение порта 80 с внешнего интерфейса на порт 80 внутренней машины. Заметьте, что вместо x.x.x.x надо подставить внешний статический IP-адрес, а вместо 192.168.1.x.- IP-адрес внутренней машины.
Теперь внешние запросы на порт 80 будут переназначаться на порт 80 внутренней машины. Вы можете проверить эту настройку следующим образом: используйте команду telnet или ей подобную на внешний IP-адрес вашего шлюза: код переназначения портов обрабатывает только запросы, идущие с внешнего интерфейса.
Now external requests for port 80 will be transparently sent to port 80 of the internal machine. Note that you cannot test this by telnetting or connecting to your gateway's port 80 from one of your inside machine: the port forwarder only honors requests coming in on the external interface.
Настройка драйвера сетевой карты
Вы можете пропустить этот раздел, если обе ваших карты удачно распознаны ядром. В противном случае, эта секция для вас.
Так, значит одна из ваших карт не распознана ядром. На самом деле в этом нет ничего страшного. Что вам надо сделать, так это дать ядру немного более подробную информацию о том, как обнаружить ваши карты. В этом вопросе существует много хитростей и тонкостей, и я не собираюсь описывать их все. Запомните, если с этим возникнут трудности, то обращайтесь к "Ethernet HOWTO". Вот несколько обобщенных советов:
У вас сетевая карта на шине PCI. Скорее всего причина в том, что несмотря на то, что у вас такая новая и хорошая карта, драйверов к ней в ядре до сих пор нет. Много интересного вы узнаете, прочитав о своей сетевой карте (и других устройствах) в каталоге /proc/pci, записывая их производителей и модели.
У вас сетевая карта на шине ISA.
Видимо, вам придется узнать адрес и IRQ, на которых работает карта. У вас ведь есть документация, не так ли? Если нет, то, наверное, вам стоит в поисках документации посетить web-сайт производителя карты (или чипа на ней: примечание переводчика). Или же у вас должна быть DOS-дискета - загрузите DOS и поищите на ней программу настройки, которая и укажет либо настроит необходимые адрес и IRQ.
У вас ISA PnP сетевая карта. Вам придется настроить эту карту -- как это сделать, подробно описано в "Plug'n'Play HOWTO". К счастью, когда вы настроите карту, вы будете точно знать адрес порта и IRQ сетевой карты.
Теперь, когда вы знаете производителя и модель сетевой карты eth0 и eth1, вы можете перейти к разделу "Совместимость" документа "Ethernet HOWTO" и найти в нем свою карту. Запишите название рекомендуемого драйвера и любую информацию о дополнительных параметрах, которые вам могут понадобиться.
Теперь наступило время редактировать конфигурационный файл! Мы будем править файл /etc/conf.modules. Откройте этот файл любым текстовым редактором. В этом файле может существовать много различных вариантов настроек и их комбинаций, поэтому я приведу здесь пример, основанный на моем шлюзе. У меня PCI 10/100Мбит-карта на чипе VIA Rhine, и обычная 10Мб ISA NE2000-совместимая карта. Я использую 100Мб для внутренней сети и 10Мб для внешнего соединения. Мой файл /etc/conf.modules выглядит примерно так:
alias parport_lowlevel parport_pc alias eth0 ne options ne io=0x300 irq=10 alias eth1 via-rhine
В нем проделывается примерно следующее:
Первая строчка указывает, что мой параллельный порт предназначен для печати. У вас, наверно, тоже есть такая строчка. Оставьте ее без изменений.
Вторая строчка (alias eth0 ne) указывает ядру использовать драйвер "ne" для устройства eth0.
В третьей строчке(options ne io=0x300 irq=10) написано, какой порт и IRQ использовать драйверу "ne" для работы с ISA-картой. Если у вас тоже ISA-карта, то вам тоже придется использовать эту директиву. Просто подставьте имя драйвера, соответствующий порт и номер IRQ.
В четвертой строке (alias eth1 via-rhine) указано использовать для устройства eth1 драйвер "via-rhine". Моя карта eth1 установлена на шине PCI, поэтому я не указываю номер порта или IRQ: шина PCI настраивает карту автоматически.
Вам обязательно надо убедиться в наличии строчек в файле conf.modules для обеих карт, а также строчек, задающих опции ISA-карт. Эти строчки уже могут присутствовать в файле conf.modules, если вы задавали их параметры в процессе инсталляции системы.
Когда вы закончите редактировать conf.modules, попробуйте снова запустить команды ifconfig eth0 и ifconfig eth1. Вы можете снова получить на экране различные предупреждения или ошибки, если перепутали адреса портов ввода-вывода или IRQ.
Две одинаковых сетевых карты
Итак, мои дорогие умники - купили две одинаковые сетевые карты для Linux-шлюза и не можете заставить их работать вместе? Не волнуйтесь - их работа зависит лишь от написания правильных опций в файле /etc/conf.modules. В этом примере я использовал придуманные адреса портов и номера IRQ, и предположил, что вы купили пару NE2000-совместимых карт (что очень распространено). Ваш файл /etc/conf.modules должен выглядеть примерно так:
alias eth0 ne alias eth1 ne options ne io=0x330,0x360 irq=7,9
Опции адреса порта и номера IRQ задаются в одной строке, и каждое первое число соответствует eth0, а второе, соответственно - eth1.
Настройка маскарадинга
Прекрасно! Все приготовления окончены, наконец мы займемся волшебством. IP-маскарадинг - это один из настоящих волшебных сервисов, возможных при помощи Linux. Существуют, правда, коммерческие продукты, делающие то же самое, но не так эффективно: античная 386 машина может при помощи Linux предоставлять сервисы IP-маскарадинга целому офису средних размеров, но на нем нельзя запустить нормальным образом Windows 95, чтобы использовать эти коммерческие продукты. (Надо добавить, что я читал несколько очерков, где утверждалось, что Windows 2000 будет поддерживать "совместное использование соединений" без дополнительных программ. Это выглядит так, как будто опять Microsoft поглотил сферу деятельности фирм, продававших программы использования совместных соединений. Однако, я бы не рекомендовал запускать Windows 2000 на 386-ой машине.)
В Linux встроены очень разносторонние возможности firewall, и мы будем использовать самые простые и понятные. Если вы хотите быть экспертом firewall-ов, то вам надо прочитать "Firewalling HOWTO" для понимания теории и "" для получения подробных инструкций по использованию утилиты ipchains, поставляемой вместе с ядром Linux версий 2.2.X (в комплекте дистрибутивов Red Hat 6.X). Теперь есть еще и достаточно полный "IP Masquerading HOWTO", описывающий в деталях возможности IP-маскарадинга.
Настроить простой маскарадинг очень просто после настройки вашей сети. Откройте файл /etc/rc.d/rc.local и добавьте в его конце следующие строки:
# 1) Очищаем все таблицы правил. /sbin/ipchains -F input /sbin/ipchains -F forward /sbin/ipchains -F output # 2) Задаем времена задержек MASQ и разрешаем вход пакетам для конфигурирования DHCP. /sbin/ipchains -M -S 7200 10 60 /sbin/ipchains -A input -j ACCEPT -i eth0 -s 0/0 68 -d 0/0 67 -p udp # 3) Отключаем любую пересылку пакетов, кроме идущих с внутренней сети. # Такие пакеты маскируем. /sbin/ipchains -P forward DENY /sbin/ipchains -A forward -s 192.168.1.0/24 -j MASQ # 4) Загружаем модули, предназначенные для специальных сервисов. /sbin/modprobe ip_masq_ftp /sbin/modprobe ip_masq_raudio
Последние две строки загружают модули ядра, позволяющие компьютерам внутренней сети работать с FTP и RealAudio. Вы также можете загрузить другие модули для использования специальных сервисов:
CUSeeMe (/sbin/modprobe ip_masq_cuseeme)
Internet Relay Chat (/sbin/modprobe ip_masq_irc)
Quake (/sbin/modprobe ip_masq_quake)
VDOLive (/sbin/modprobe ip_masq_vdolive)
Теперь вы готовы испытать маскарадинг! Запустите скрипт rc.local командой /etc/rc.d/rc.local, и у вас все готово! Сядьте за один из ваших компьютеров во внутренней сети и попробуйте походить по web. Если вам повезет, то все будет оки-доки.
Настройка сети
Хорошо, к этому моменту на ваш шлюзовой компьютер установлен Linux. Вы даже, наверное, настроили одну из сетевых карт и сконфигурировали выход в Интернет. Однако мы предположим, что у вас ничего не настроено, и начнем с "чистого листа".
Зайдите в компьютер root-ом. Все инструкции в этом документе приводятся с предположением, что вы вошли в компьютер в качестве root-а.
Ядро Linux называет ваши сетевые карты как eth0 и eth1, поэтому я буду с этого момента называть их так же. Проблема состоит в том, которая из них eth0, а которая eth1? Существует "простой" способ выяснить это, работающий как минимум в 50% случаев: положите компьютер на стол, чтобы материнская плата была горизонтальна и задняя панель "смотрела" на вас (так, как будто вы собираетесь открыть кожух и внести какие-то изменения). Левая карта будет eth0 -- вы можете ее чем-нибудь пометить, например, липкой лентой. Теперь запишите на листе бумаги производителей и модели обеих карт.
Хорошо, давайте теперь проверим, распознаются ли eth0 и eth1 ядром автоматически. Наберите команды ifconfig eth0 и ifconfig eth1. В обоих случаях, если ядро распознало вашу карту, вы должны увидеть примерно следующее (не учитывая цифры):
eth0 Link encap: Ethernet HWaddr 00:60:67:4A:02:0A inet addr:0.0.0.0 Bcast:0.0.0.0 Mask:255.255.255.255 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:466 errors:0 dropped:0 overruns:0 frame:0 TX packets:448 errors:0 dropped:0 overruns:0 carrier:0 collisions:85 txqueuelen:100 Interrupt:10 Base address:0xe400
Если ядро не смогло распознать вашу карту, вы увидите следующее:
eth0: error fetching interface information: Device not found.
Настройка внешней сети
Теперь мы готовы к настройке внешней сети. Иногда этот процесс бывает довольно сложным - это зависит от того, насколько хорошо ваш провайдер поддерживает Linux. Если у вас возникли трудности, читайте "ADSL mini-HOWTO". Если я смогу обнаружить где-нибудь Мини-HOWTO по кабельным модемам, то я добавлю здесь ссылку и на него.
Одной из основных проблем, возникающей с внешними соединениями, является получение IP-адреса. Некоторые провайдеры выделяют статические IP-адреса кабельным или ADSL-клиентам - в этом случае настройка будет достаточно простой. Однако, большинство провайдеров перешли на динамическую настройку при помощи (вы уже наверное угадали...) DHCP. Это означает, что скорее всего ваш Linux будет DHCP-сервером на интерфейсе eth1, и, одновременно, DHCP-клиентом на интерфейсе eth0.
Более того, некоторые провайдеры применяют специализированные нестандартные методы, предполагая, что их клиенты будут использовать Windows. Некоторые из таких случаев будут описаны в конце раздела 3.3.2.
Если ваш провайдер выделил вам статический IP-адрес, то у вас все достаточно просто. Во-первых, создайте новый файл конфигурации интерфейса /etc/sysconfig/network-scripts/ifcfg-eth0 и внесите в него следующее:
DEVICE=eth0 IPADDR=x.x.x.x NETMASK=y.y.y.y ONBOOT=yes
Подставьте вместо x.x.x.x и y.y.y.y значения, данные вашим провайдером. Затем отредактируйте файл /etc/resolv.conf, внеся в него следующее:
search provider_domain_here nameserver n.n.n.n nameserver m.m.m.m
Значение поля "домен_провайдера" должно быть предоставлено провайдером. Вместо m.m.m.m и n.n.n.n подставьте адреса первичного и вторичного DNS-сервера провайдера соответственно. Если вы настроили свой Linux в качестве кэширующего DNS-сервера, то добавьте перед строками nameserver строку nameserver 127.0.0.1. В результате этого ваш Linux будет сначала обращаться к своему кэширующему DNS-серверу перед обращением к внешним серверам.
Если ваш провайдер использует автоконфигурирование при помощи DHCP, то вам надо создать новый файл конфигурации интерфейса /etc/sysconfig/network-scripts/ifcfg-eth0, и написать в нем следующее:
DEVICE=eth0 BOOTPROTO=dhcp ONBOOT=yes
Теперь убедитесь в том, что клиентский демон dhcpcd установлен в вашей системе. Перейдите на CD с дистрибутивом вашего Linux и установите RPM-пакет dhcpcd.
Наступило время испытать вашу новую конфигурацию сети. Дайте команду /etc/rc.d/init.d/network restart. Попробуйте увидеть внешний компьютер в Интернете, например, www.yahoo.com и посмотрите, получаете ли вы ответ.
Хитрости и проблемы
В вашем конкретном случае ситуация может отличаться от вышеописанной. Ниже приведены несколько коротких примечаний о различных сложностях, а также ссылки на более авторитетные ресурсы по этой теме. Спасибо John Mellor за предоставленные ссылки и настойчивые требования написать эту главу.
PPP по Ethernet (PPPoE)
Некоторые ADSL-провайдеры (например Bell Atlantic) с недавних пор начали настаивать на том, чтобы их новые пользователи подключались к ним при помощи протокола "PPP по Ethernet" (PPPoE). К этому они прилагают клиентскую программу для Windows: это не совсем удобно для пользователей Linux. К счастью, PPPoE - достаточно простой протокол, и существует несколько способов его поддержки и в Linux.
PPPoE-клиент "Рев пингвина"
- его очень настойчиво рекомендует наш читатель Kerr First
PPPoE на Linux для Bell Sympatico
PPPoE на Linux для Sympatico (Общая информация) (Информация по применению в Linux)
Хитрые свойства DHCP
Одним из излюбленных глуповатых трюков сетевых провайдеров является привязывание вашего сервиса к конкретному имени машины или даже к конкретной сетевой карте. Это делается обычно ради того, чтобы вы не подключали к интернету через хаб несколько компьютеров (конечно, использование Linux и маскарадинга вам позволит это сделать и без ведома компании-провайдера, к тому же значительно более защищенным образом!).
Если провайдер дал вам имя машины и настаивает на том, чтобы вы назвали свой Windows именно этим именем в сети для использования сервиса подключения к интернету, то вы должны сделать так, чтобы ваш Linux посылал это имя при запросе адреса с DHCP-сервера.
Клиент DHCP в Red Hat вызывается в том случае, если вы установите в файле конфигурации интерфейса переменную BOOTPROTO в значение "dhcp", но это производится без предоставления DHCP-серверу имени машины. Чтобы предоставить ему такое имя, отредактируйте файл /etc/sysconfig/network и измените строку:
HOSTNAME=
на
HOSTNAME=your_isp_assigned_name
В некоторых вариантах Red Hat это может и не сработать. Если такой вариант не пройдет, откройте скрипт /sbin/ifup, найдите в нем вызов dhcpcd и pump и добавьте к ним опцию -h $HOSTNAME. Если таких строк в нем нет, то добавьте их: /sbin/dhcpcd -i $DEVICE -h $HOSTNAME и /sbin/pump -i $DEVICE -h $HOSTNAME.
"Road Runner"
В кабельном сервисе " Road Runner" для получения возможности использования сервера должна запускаться специальная процедура входа. К счастью, существует детально описывающий эту тему "Linux Road Runner HOWTO".
Изучаем настройки сети
Теперь вы можете полюбоваться своей сетью. Запустите команду ifconfig, чтобы увидеть настройку всех ваших сетевых устройств. На моем шлюзе это выглядит примерно так:
eth0 Link encap:Ethernet HWaddr 00:60:67:4A:02:0A inet addr:24.65.182.43 Bcast:24.65.182.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:487167 errors:0 dropped:0 overruns:0 frame:0 TX packets:467064 errors:0 dropped:0 overruns:0 carrier:0 collisions:89 txqueuelen:100 Interrupt:10 Base address:0xe400 eth1 Link encap:Ethernet HWaddr 00:80:C8:D3:30:2C inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:284112 errors:0 dropped:0 overruns:0 frame:1 TX packets:311533 errors:0 dropped:0 overruns:0 carrier:0 collisions:37938 txqueuelen:100 Interrupt:5 Base address:0xe800 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:3924 Metric:1 RX packets:12598 errors:0 dropped:0 overruns:0 frame:0 TX packets:12598 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0
Заметьте, что у eth0 имеется красивый внешний IP-адрес, а у eth1 - частный внутренний.
Вы также можете взглянуть на маршруты пакетов командой route. На моем шлюзе это выглядит примерно так:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 255.255.255.255 * 255.255.255.255 UH 0 0 0 eth1 192.168.1.0 * 255.255.255.0 U 0 0 0 eth1 24.65.182.0 * 255.255.255.0 U 0 0 0 eth0 127.0.0.0 * 255.0.0.0 U 0 0 0 lo default 24.65.182.1 0.0.0.0 UG 0 0 0 eth0
Теперь у нас настроена внешняя и внутренняя сети, сетевые устройства, специальный широковещательный адрес 255.255.255.255, и маршрут по умолчанию указывает на шлюз провайдера. Великолепно!
Теперь у вас есть внешняя и внутренняя стороны. Все что осталось настроить - это дверь между ними. Самое главное - мы должны убедиться в том, что чудовища извне к нам не проникнут.
Настройка внутренней сети
"Внутренняя сеть" - это сеть, в которой будут общаться ваши домашние или офисные компьютеры. "Внешняя сеть" - это большой и страшный Интернет по другую сторону вашего Linux-а. В общем и целом внутренняя сеть будет полностью защищена от внешней при помощи Linux, который будет играть роль firewall среднего класса.
Теперь драйверы ваших карт работают, и вы видите eth0 и eth1 в команде ifconfig - теперь наступило время настроить внутреннюю сеть. Я предполагаю, что ваша внутренняя сеть подключена к eth1, а внешнее устройство подключено к eth0.
Ваша внутренняя сеть будет частной, и поэтому мы используем для нее специальный номер сети, зарезервированный для внутренних частных сетей: 192.168.1.0. Это будет "частная сеть класса C" - вы можете хвалиться этим названием перед своими друзьями.
Во-первых, необходимо убедиться в том, что поддержка сети включена. Откройте файл /etc/sysconfig/network и найдите в нем следующие строки (если их нет, создайте):
NETWORKING=yes FORWARD_IPV4=yes
Первая строка указывает, что мы хотим, чтобы сетевые устройства стартовали в процессе загрузки системы. Во второй строке разрешается пересылка IP-пакетов. Эта строка будет нам необходима в процессе настройки маскарадинга в разделе 4.
Замечание для пользователей Redhat версии 6.2: Чтобы система Red Hat 6.2 нормально поддерживала IP-пересылку и маскарадинг, необходимо отредактировать файл /etc/sysctl.conf. Убедитесь в наличии следующих строчек и проставьте в них соответствующие значения:
net.ipv4.ip_forward = 1 net.ipv4.ip_always_defrag = 1
Все настройки сетевых интерфейсов в Red Hat и его производных находятся в файлах в каталоге /etc/sysconfig/network-scripts. Зайдите в этот каталог и создайте в нем файл ifcfg-eth1. В этом файле напишите следующее:
DEVICE=eth1 IPADDR=192.168.1.1 ONBOOT=yes
Таким образом, загрузочный скрипт, отвечающий за настройку сети, будет инициализировать eth1 в процессе загрузки и отведет ему конкретный IP-адрес. Активизируйте свою сеть с учетом этих новых настроек командой /etc/rc.d/init.d/network restart
Сервер DHCP будет автоматически снабжать IP-адресами сетевые устройства компьютеров вашей внутренней сети. Это достаточно удобно, особенно при использовании Notebook-ов: можно просто подключить свою машину к сети, и она сразу автоматически будет настроена. Если вам не нужен DHCP-сервер, то просто пропустите эту главу.
Во-первых, вам надо установить DHCP-сервер. Подключите CD-ROM с вашим дистрибутивом Linux CD и установите RPM-пакет dhcp. Затем откройте файл /etc/dhcpd.conf и напишите в нем следующее (удалив все остальное):
subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.2 192.168.1.60; default-lease-time 86400; max-lease-time 86400; option routers 192.168.1.1; option ip-forwarding off; option broadcast-address 192.168.1.255; option subnet-mask 255.255.255.0; }
Если ваш Linux будет и кэширующим DNS-сервером, то добавьте следующую строку:
option domain-name-servers 192.168.1.1;
Если вы знаете адреса внешних DNS-серверов и не собираетесь использовать свой Linux в качестве DNS-сервера, то добавьте следующую опцию (где x.x.x.x и y.y.y.y - это IP-адреса внешних DNS-серверов):
option domain-name-servers x.x.x.x, y.y.y.y;
Если вы собираетесь использовать Samba-сервер для доступа к файлам Linux с ваших компьютеров с Windows, то добавьте следующие строки, чтобы Linux был WINS-сервером и сервером поиска машин по умолчанию:
option netbios-name-servers 192.168.1.1; option netbios-dd-server 192.168.1.1; option netbios-node-type 8; option netbios-scope "";
Процедура настройка Samba и WINS не входит в этот документ. Если вам нужны подсказки или советы по этому поводу - читайте "SMB HOWTO".
Осталась еще пара шагов. Откройте файл /etc/rc.d/init.d/dhcpd и найдите в нем следующую строку:
/sbin/route add -host 255.255.255.255 dev eth1
DHCP-клиентам Windows необходим специальный широковещательный адрес в DHCP-запросах, и эта команда добавляет данный адрес в настройки TCP/IP вашего Linux. Если вы не нашли эту строку, то добавьте ее. Если же вы ее нашли, то убедитесь в том, что она ссылается на устройство eth1.
Следующий шаг будет состоять в том, чтобы указать в файле /etc/rc.d/init.d/dhcpd использовать по умолчанию устройство eth1. Замените строку:
daemon /usr/sbin/dhcpd
На строку:
daemon /usr/sbin/dhcpd eth1
Итак, вы готовы к запуску DHCP. Сначала запустите DHCP-сервер командой: /etc/rc.d/init.d/dhcpd start.
И последнее - вам надо убедиться в том, что DHCP-сервер загрузится после перезагрузки системы. Некоторые RPM-пакеты с DHCP-сервером не включали директив, которые бы его запускали после перезагрузки системы, поэтому мы подстрахуем себя командой chkconfig dhcpd on.
Эта команда заставляет RedHat указать запуск dhcpd в некоторых уровнях загрузки в каталоге /etc/rc.d. На уровнях 3 и 5 (многопользовательская консоль и многопользовательские X) DHCP-сервер запускается. На уровнях 0, 1 и 6 (отключение, однопользовательский режим и перезагрузка) DHCP-сервер останавливается.
Клиентские компьютеры
Если вы включили DHCP, то настройка ваших клиентских компьютеров будет очень простой - просто разрешите автоконфигурирование при помощи DHCP. В Windows это делается примерно так - откройте "Панель управления", в ней опцию "Сеть". Найдите протокол "TCP/IP" и нажмите на нем "Свойства". Установите галочку около надписи "Получить IP-адрес автоматически", нажмите OK и перезагрузите компьютер.
Перед тем, как вы его перезагрузите, вы можете использовать в Linux следующую команду: tail -f /var/log/messages. Таким образом, вы будете видеть сообщения, поступающие в системный журнал Linux. Если все пойдет хорошо, вы увидите в этом журнале запрос на IP-адрес и ответ DHCP-сервера. Выйти из команды tail -f можно клавишами Ctrl+C.
Если у вас не включен DHCP, то настройка также достаточно проста. Итак, снова откройте "Сеть" в "Панели Управления" и выберите свойства протокола TCP/IP. Вы можете давать вашим компьютерам любые адреса в сети 192.168.1.0, кроме 192.168.1.0 (собственно сама сеть), 192.168.1.255 (широковещательный адрес) и 192.168.1.1 (ваш Linux-сервер). Никогда не давайте двум компьютерам одинаковые IP-адреса. Установите "Шлюз по умолчанию" в 192.168.1.1, чтобы весь ваш исходящий трафик шел через Linux-шлюз.
В "HOWTO: IP-маскарадинг" в главе Configuration Section приведена очень подробная информация о настройке клиентских компьютеров.
Одним словом, чтобы настроить клиентский компьютер, вам необходимо либо включить использование DHCP, либо вручную указать любой адрес в сети 192.168.1.X и шлюз 192.168.1.1. DNS-сервером будет 192.168.1.1 (если вы используете кэширующий DNS-сервер(см. ниже) или укажите адрес сервера DNS, данный вашим провайдером.
Сервер DNS
Настройка вашего Linux в качестве DNS-сервера ускорит ( правда ненамного) скорость вашей работы с внешней сетью, потому что часто используемые DNS-адреса будут находиться в кэше внутри вашей сети и не будут запрашиваться наружу.
Если вам интересна настройка "полноразмерного" DNS, то вам придется изучить очень много сложной документации. На этот предмет существует DNS HOWTO и книга DNS и BIND.
Для работы с DNS клиентские машины должны использовать Linux-шлюз в качестве своего главного DNS-сервера. Директивы DHCP, описанные в разделе 3.2.2 - это один из способов этого достичь. Если вы настраивали ваши компьютеры вручную, то вы должны настроить свойства DNS почти там же, где вводили IP-адрес машины.
Для установки DNS-сервера, сначала установите RPM-пакет bind, а затем RPM-пакет caching-nameserver. К этому моменту у вас почти все готово.
После стандартной установки кэширующий DNS-сервер будет работать прекрасно, но если вы знаете IP-адрес DNS-сервера вашего провайдера, то вы можете немного ускорить работу сети немного подредактировав файл /etc/named.conf, добавив в него следующую строку после опции directory (x.x.x.x и y.y.y.y - это первичный и вторичный DNS-сервера провайдера):
forwarders { x.x.x.x; y.y.y.y; };
После этих изменений ваш DNS-сервер сначала будет запрашивать адрес у DNS-серверов провайдера, и только затем в общем Интернете. У провайдеров обычно бывает большой запас готовой DNS-информации, и он может ответить значительно быстрее, чем через обычный запрос.
У демона named были проблемы с безопасностью, продолжавшиеся последние 12 месяцев, поэтому очень важно иметь наиболее свежую версию и внести некоторые изменения в стандартные настройки для повышения безопасности.
Проверьте версию пакета bind
- она должна быть минимум 8.2.2. Проверьте сайты Обновления Red Hat или Обновления Mandrake на наличие новых версий.
Ограничьте доступ к вашему DNS-серверу только с локальной сети, добавив строку allow-query { 192.168.1/24; 127.0.0.1/32; };; в файл /etc/named.conf после строки с опцией forwarders.
Избегайте запуска вашего DNS-сервера в качестве root-а. Если вы запустите ваш DNS-сервер под root-ом, то при его использовании запрашивающему будут даны привилегии администратора. Если же вы запустите сервер под безобидным пользователем, таким как nobody, то вы можете снизить риск недопустимого использования DNS-сервера. Чтобы ваш DNS-сервер запускался с правами пользователя nobody, отредактируйте файл /etc/rc.d/init.d/named, исправив в нем строку daemon named на daemon named -u nobody -g nobody.
Убедитесь в том, что DNS-сервер запустится в процессе загрузки: chkconfig named on. Таким образом, DNS-сервер будет автоматически запускаться на стандартных уровнях (3 и 5).
Итак, теперь вы можете запустить свой DNS-сервер: /etc/rc.d/init.d/named start
start
Проверяем внутреннюю сеть
Пока мы не настроим внешнюю сеть, DNS работать не будет (ему надо связываться с внешними DNS-серверам), но мы можем проверить простое подключение командой ping.
Откройте окно MSDOS на одном из ваших клиентских компьютеров, затем наберите ping 192.168.1.1. Эта команда будет посылать пакеты на ваш Linux через определенные интервалы, а ваш Linux будет посылать их обратно. Если все работает нормально, то вы увидите список со временем хождения пакетов по сети.
Не используя хаб
Если у вас нет хаба, то вы все-таки можете подключить еще один компьютер к Linux, используя кросс-кабель. Топология вашей сети будет выглядеть примерно так.
Подключите сетевую карту eth0, установленную в Linux-машину, к кабельному или ADSL-модему, используя кабель, предоставленный фирмой-продавцом. Подключите карту eth1 к другому компьютеру, используя росс-кабель.
Не работает ICQ
Некоторые свойства ICQ прекрасно работают с маскарадингом. Другие не работают совсем. Существует экспериментальный модуль поддержки ICQ(beta quality ICQ module) для ядра, все еще находящийся в стадии разработки, однако с ним некоторые, ранее не работавшие, свойства ICQ начинают работать с маскарадингом. Файл README в исходных текстах этого модуля описывает, как его собрать и установить. После его сборки и установки, загрузите модуль командой /sbin/modprobe ip_masq_icq.
Подключаем аппаратуру
Топология вашей сети может немного различаться - это зависит от того, используете вы хаб или нет. Я опишу лишь работу с кабелями витой пары RJ45 (они выглядят, как немного потолстевшие обычные телефонные провода), и не буду описывать тонкий коаксиал. При помощи тонкого коаксиала, вы можете соединить в сеть несколько машин без использования хаба, но вам придется быть более внимательным в вопросе терминаторов и тому подобного. Эти инструкции вам практически не нужны, если вам уже знакома работа с сетью.
Проблемы
Существует очень-очень много вещей, которые могут неправильно работать после использования такого простого документа, как этот, потому что почти в каждом случае бывают какие-то исключения или хитрости. Большинство проблем возникает при настройке и конфигурировании внутренних и внешних сетевых устройств. Я буду пытаться отвечать на все вопросы, выяснять, что пошло не так, и добавлять ссылки здесь, чтобы те, у кого возникли проблемы, могли найти соответствующую документацию. Не стесняйтесь писать мне по адресу pramsey@refractions.net.
С одной сетевой картой
Я бы не рекомендовал вам использовать подобную конфигурацию (в ней внешняя и внутренняя сеть находятся в одной физической сети, что приводит к меньшей защищенности - хотя в реальной жизни шанс возникновения проблем достаточно низок), но ее можно использовать. Каждому свое.
Ядро Linux включает в себя поддержку "IP-алиасинга", который позволяет одной сетевой карте обрабатывать одновременно два IP-адреса. Стандартные ядра, поставляемые в комплекте Red Hat или Mandrake, по умолчанию включают в себя поддержку IP-алиасинга . Чтобы настроить интернет-шлюз, имея лишь одну сетевую карту, во всех последующих примерах настройки, просто поменяйте eth1 на eth0:0.
В конфигурации с одной сетевой картой не рекомендуется запуск DHCP сервера.
Подключите все ваши машины и кабельный (или ADSL) модем в хаб. Продолжайте, перекрестив пальцы.
Инсталляция:
После подключения всего необходимого ко второй машине установите zip диск в дисковод и загрузите машину с созданного загрузочного диска. Перед входом в систему неплохо воспользоваться возможностью обратного просмотра (scroll back feature), встроенной в Linux, и проверить, правильно ли были распознаны устройства компьютера. Для этого нажмите клавишу shift и, удерживая ее, используйте клавиши page up и page down соответственно. Наличие приглашения для входа, как правило, означает, что при загрузке системы не было слишком серьезных ошибок.
Этап 1.
Slackware выдаст некоторые указания. Внимательно прочитайте их. Войдите в систему root-ом и, если нужно, создайте корневой раздел и раздел подкачки на жестком диске утилитой fdisk. Перезагрузите машину, если вы запускали fdisk, и еще раз Внимательно прочитайте указания на экране, если таковые имеются. Далее входите в систему root-ом.
Даже на машинах с 4 мб памяти нет нужды создавать раздел подкачки до тех пор, пока программа установки не попросит об этом. У нас уже есть файл подкачки на zip-диске. Запустите программу установки Slackware:
Этап 2.
После перезагрузки системы войдите в нее root-ом и снова подключите zip-диск:
Linux Install From PPA-Zip drive mini-HOWTO
Kevin Snively
k.snively@seaslug.org
Перевод: Денис Дементьев, ASPLinux
Этот документ содержит информацию о том, как инсталлировать Linux с zip дисковода, подключаемого к параллельному порту, используя дистрибутив Slackware Linux.
Проблема с библиотеками
Иногда у меня возникали проблемы с ссылками на библиотеки либо на zip диске, либо на установленной системе. Возможно два решения.
1) Если загрузка системы доходит до выдачи приглашения для входа, вы можете войти в систему root-ом в однопользовательском режиме и попробовать команду
ldconfig |
Если команда выполнится, перезагрузите машину и следите, появятся ли ошибки, связанные с библиотеками. Если нет, то все нормально.
2) Если ldconfig не помог, вам нужно заново создать загрузочный диск и скопировать с него файлы, как указано в пунктах с 8) по 12), или вообще заново переустановить Linux на машине.
Создание первого zip диска.
1) Подключите zip дисковод к базовой машине, вставьте чистый zip-диск и загрузите Linux.
2) Войдите в систему. Скорее всего вам придется войти root-ом или пользователем, которым должен иметь права на создание файловых систем, подключение и отключение дисков и т.п.
3) Создайте файловую систему ext2fs на zip диске командой
Создание второго zip диска.
Если вы хотите поставить X windows или вам понадобится другое заранее собранное ядро, то самое время создать 2-й zip диск.
x1) Вставьте диск 2 в zip дисковод. Я предпочитаю создавать на нем файловую систему ext2fs, но можно так же использовать файловую систему msdos. Повторите указаннные выше пункты 3), 4) и 6).
x2) Скопируйте файлы пакеты X11R6 "X window" на zip
Создание загрузочного флоппи-диска.
b1) Создадим 1.44 мб загрузочный диск. Используйте образ диска /(cdrom)/bootdsks.144/iomega.s. Установите 1.44 мб в дисковод. Команда для создания диска:
dd if=/(cdrom)/bootdsks.144/iomega.s of=/dev/fd0 |
b2) Проверьте файловую систему на диске:
/sbin/e2fsck -f /dev/fd0 |
По окончании проверки извлеките диск, защите его от записи и сделайте на нем пометку с номером версии.
Альтернативный способ: /dev/port
Другой путь доступа к портам ввода/вывода лежит через открытие файла /dev/port (символьное устройство - major 1, minor 4) на чтение и/или запись (функции f*() из stdio.h работают через буфер, поэтому избегайте их). Затем выполняем lseek() на необходимый байт в файле (позиция файла 0 = порт 0x00, позиция файла 1 = порт 0x01, и т.д.), и считываем/записываем байт или слово при помощи read() или write().
Естественно, для работы программы вам нужен доступ на чтение/запись к файлу /dev/port. Этот способ конечно медленней, чем стандартный, но не требует ни оптимизации при компиляции, ни ioperm(). Кроме того, если вы дадите доступ соответствующим пользователю/группе к файлу /dev/port, вашей программе не нужны права root --- впрочем, это не очень хорошая вещь с точки зрения безопасности, поскольку это может нарушить работу системы путем получения прав root через доступ к диску, сетевой плате и т.д. напрямую.
Доступ к прерываниям (IRQ) и DMA
В своих программах вы не можете напрямую использовать прерывания (IRQ) или DMA. Вам нужно написать драйвер для ядра; для получения дополнительной информации и примеров см. The Linux Kernel Hacker's Guide.
Кроме того, вы не можете отключить прерывания из пользовательской программы.
Другие языки программирования
Все вышесказанное может быть использовано на C++ и Objective C без каких-либо комментариев. На ассемблере (как и на C) перед операциями с портами вы должны выполнить ioperm() или iopl().
На других языках, если вы не можете использовать текст на ассемблере или на C, или выполнить упомянутые системные вызовы, самое простое - написать необходимые процедуры на C и собрать их вместе с оставшейся программой. Или же использовать файл /dev/port.
Игровой порт (джойстик)
Игровой порт находится по адресам 0x200-0x207. Для управления обычным джойстиком существует драйвер на уровне ядра. См. ftp://sunsite.unc.edu/pub/Linux/kernel/patches/
, имя файла joystick-*.
Разводка (15-контактный разъем (мама)):
1,8,9,15: +5В (питание)
4,5,12: Земля
2,7,10,14: Цифровые входы BA1, BA2, BB1 и BB2, соответственно
3,6,11,13: ``Аналоговые'' входы AX, AY, BX и BY, соответственно
Контакты +5В обычно подключены прямо к питанию материнской платы и не обеспечивают большую загрузку (в зависимости от материнской платы, блока питания и игрового порта).
Цифровые входы используются для определения состояния кнопок на двух джойстиках (джойстик A и джойстик B, по две кнопки на каждом), подключаемых к порту. Это должны быть обычные входы TTL, и вы можете считывать их состояние непосредственно из регистра состояния (см. ниже). Обычные джойстики устанавливают ноль (0В), при нажатой кнопке, и единицу (5В от питания через резистор 1КОм), в противном случае.
Так называемые аналоговые входы, на самом деле, измеряют сопротивление. Игровой порт имеет четыре одноимпульсных мультивибратора, подключенных к четырем входам. На каждом входе стоит резистор 2.2КОм между выходом мультивибратора и землей. Обычные джойстики имеют потенциометр по каждой оси (X и Y), связанный с +5В и соответствующим входным контактом (AX или AY для джойстика A, и BX или BY для джойстика B).
Во время включения, мультивибратор устанавливает напряжение +5В и ждет, когда напряжение на конденсаторе достигнет 3.3В, а затем сбрасывает напряжение. Таким образом, длительность импульса мультивибратора прямопропорциональна сопротивлению потенциометра на джойстике (т.е. положению джойстика по соответствующей оси): "R = (t - 24.2) / 0.011," где R - сопротивление (Ом) потенциометра, а t - длительность импульса (секунд).
Таким образом, чтобы считать состояние аналогового входа, сначала нужно включить мультивибратор (путем записи в порт; см. ниже), а затем считывать состояние всех четырех осей, пока они сбросятся с 1 на 0, измеряя длительность сигнала. Такое считывание требует много процессорного времени и на многозадачных операционных системах, таких как Linux (для пользовательских программ), результат будет не очень точен, т.к. вы не можете считывать из порта постоянно (если только не используете драйвер на уровне ядра и отключаете прерывания, что, впрочем, требует еще больше процессорного времени). Если вы знаете, что сигнал будет продолжаться достаточно долгое время (десятки миллисекунд), вы можете использовать usleep() перед считыванием, передав процессорное время другим процессам.
Вам нужно использовать только один порт - 0x201 (другие порты идентичны или вообще ничего не делают). Любая запись в этот порт (не важно, что вы записываете) включает мультивибратор. Чтение из порта возвращает состояние входных сигналов:
Бит 0: AX (состояние на выходе мультивибратора)
Бит 1: AY (состояние на выходе мультивибратора)
Бит 2: BX (состояние на выходе мультивибратора)
Бит 3: BY (состояние на выходе мультивибратора)
Бит 4: BA1 (цифровой вход)
Бит 5: BA2 (цифровой вход
Бит 6: BB1 (цифровой вход)
Бит 7: BB2 (цифровой вход)
Linux I/O port programming mini-HOWTO
Riku Saikkonen
Riku.Saikkonen@hut.fi
Перевод: Павел Гашев, ASPLinux
Этот документ описывает программирование аппаратных портов ввода/вывода и организацию коротких задержек в пользовательских программах, работающих на архитектуре Intel x86.
Некоторые полезные порты
Вот некоторая информация по программированию основных портов, которые можно использовать для ввода/вывода на устройствах общего назначения (TTL или CMOS).
Если вы хотите использовать эти или другие порты по их непосредственному назначению (напр. для управления принтером или модемом), лучше всего использовать существующие драйвера (которые обычно включены в ядро) вместо того, чтобы работать с портами так, как это описано в этом HOWTO. Этот раздел предназначен для людей, желающих подключить ЖК-индикатор, шаговый двигатель или другую электронику к стандартным портам компьютера.
Если вы хотите работать с таким распространенным устройством, как сканер, сначала поищите для него драйвер под Linux. Начать лучше всего с Hardware-HOWTO.
http://www.hut.fi/Misc/Electronics/
Параллельный порт
Основной адрес параллельного порта (далее "БАЗА") - 0x3bc для /dev/lp0, 0x378 для /dev/lp1 и 0x278 для /dev/lp2. Если вы хотите управлять чем-то вроде обычного принтера, см. Printing-HOWTO.
В дополнение к стандартному режиму только вывода, описываемому ниже, в большинстве параллельных портов существует `расширенный' двунаправленный режим. Для дополнительной информации по этому и более новому режиму ECP/EPP (и стандарт IEEE 1284 в общих чертах), см. http://www.fapo.com/ и http://www.senet.com.au/~cpeacock/parallel.htm. Только помните, что вы не можете в ваших программах использовать IRQ и DMA, и для использования ECP/EPP. Вам скорее всего придется написать свой драйвер ядра; хотя, я думаю, что кто-нибудь уже написал его.
Порт БАЗА+0 (Порт данных) соответственно управляет сигналами данных на параллельном порту (от D0 до D7 для битов от 0 до 7, соответствуют значения: 0 = 0В, 1 = 5В). Запись в этот порт устанавливает соответствующие уровни напряжения на контактах разъема принтера. При чтении возвращается последнее записанное значение в стандартном или расширенном режиме записи, или данные на разъеме от другого устройства в расширенном режиме чтения.
Порт БАЗА+1 (Порт состояния) предназначен только для чтения и возвращает следующие входные сигналы:
Биты 0 и 1 зарезервированы.
Бит 2 состояние IRQ (его нет на разъеме и я не знаю как он работает)
Бит 3 ERROR (1=ОШИБКА)
Бит 4 SLCT (1=ВЫБОР)
Бит 5 PE (1=ГОТОВ)
Бит 6 ACK (1=ПОДТВЕРЖДЕНИЕ)
Бит 7 -BUSY (0=ЗАНЯТ)
(Я не уверен насчет их значений)
Порт БАЗА+2 (Порт управления) предназначен только для записи (чтение возвращает последнее записанное значение) и управляет следующими сигналами:
Bit 0 -STROBE (0=СТРОБ)
Бит 1 AUTO_FD_XT (1=АВТО_ПЕРЕВОД_СТРОКИ)
Бит 2 -INIT (0=СБРОС)
Бит 3 SLCT_IN (1=ВЫБРАН)
Бит 4 включает IRQ параллельно порта (которое возникает при изменении ACK с нуля на еденицу) (1=IRQ включено).
Бит 5 управляет направлением работы порта в расширенным режиме (0 = запись, 1 = чтение) и предназначен только для записи (чтение не возвращает ничего полезного).
Биты 6 и 7 зарезервированы.
(Опять же, я не уверен насчет этих значений)
Разводка (25-разъемный разъем (мама)) (i=ввод, o=вывод):
Подсказки
Если вы хотите хороший аналоговый ввод/вывод, можете подключить АЦП и/или ЦАП к параллельному порту (подсказка: если у вас маломощное устройство, для питания используйте игровой порт или свободный разъем питания внутренних устройств, выведенный наружу, или же используйте внешний источник питания) или купите специальную карту аналого-цифрового/цифро-аналогого преобразования (большинство из старых/медленных карт управляются через порты ввода/вывода). Или, если вы удовлетворитесь одним или двумя каналами, погрешностью и (возможно) неправильным уровнем нуля, дешевая звуковая карта, поддерживаемая драйвером Linux, должна тоже сработать (и очень быстро).
С точным аналоговым устройством; неправильное заземление может вызвать ошибки в аналоговом входе или выходе. Если у вас есть такой опыт, можете попробовать электрически развязать устройство с компьютером, при помощи оптопары (на всех сигналах между компьютером и вашим устройством). Для лучшей изоляции попробуйте взять питание для оптопары от компьютера (свободный сигнал на порту может дать достаточно напряжения).
Если вы ищете программное обеспечение под Linux для разработки вашей платы, есть бесплатная программа под названием Pcb (по крайней мере, если не делаете ничего уж очень навороченного). Она включен в большинство дистрибутивов Linux и доступна по адресу ftp://sunsite.unc.edu/pub/Linux/apps/circuits/
(имя файла pcb-*).
Последовательный порт
Если устройство, с которым вы хотите общаться, поддерживает что-то похожее на RS-232, вы можете использовать последовательный порт. Драйвер Linux для последовательного порта должен быть достаточен для всех приложений (вам не нужно иметь непосредственный доступ к порту, или же для этого нужно написать драйвер ядра); он достаточно универсален, т.к. использует нестандартные скорости обмена и т.д., так что у вас не должно быть проблем.
Для дополнительной информации см. руководство termios(3), исходные тексты драйвера (linux/drivers/char/serial.c), и http://www.easysw.com/~mike/serial/index.html.
Пример кода
Здесь приведен кусок простого примера для доступа к портам ввода/вывода:
/* * example.c: очень простой пример для порта ввода/вывода * * Этот код не делает ничего полезного, только запись в порт, пауза, * и чтение из порта. Откомпилируйте `gcc -O2 -o example example.c', * и запустите под root `./example'. */
#include #include #include #define BASEPORT 0x378 /* lp1 */ int main() { /* Получить доступ к порту */ if (ioperm(BASEPORT, 3, 1)) {perror("ioperm"); exit(1);} /* Вывод в порт (0) */ outb(0, BASEPORT); /* Задержка (100 мс) */ usleep(100000); /* Чтение из порта (BASEPORT+1) и вывод результатов на экран */ printf("статус: %d\n", inb(BASEPORT + 1)); /* Мы больше не нуждаемся больше в порту */ if (ioperm(BASEPORT, 3, 0)) {perror("ioperm"); exit(1);} exit(0); } /* конец example.c */ |
Стандартный способ
Процедуры доступа к портам ввода/выводы находятся в /usr/include/asm/io.h (или в linux/include/asm-i386/io.h в некоторых дистрибутивах ядра). Процедуры представляют собой встроенные (inline) макроопределения, так что вам не нужны никакие библиотеки, и достаточно просто добавить #include .
Из-за ограничения в gcc (присутствующего, как минимум, в версии 2.7.2.3 и ниже) и в egcs (всех версий), вы должны компилировать любые исходные тексты, использующие эти процедуры, с включенной оптимизацией (gcc -O1 или выше), или же определить пустое #define extern перед #include ..
Для отладки вы можете использовать gcc -g -O (по крайней мере, с современными версиями gcc), хотя оптимизация может привести к немного странному поведению отладчика. Если это вам мешает, поместите подпрограммы, работающие с портами ввода/вывода, в отдельный файл и компилируйте с оптимизацией только его.
Перед тем, как вы получите доступ к какому-нибудь порту, вы должны дать вашей программе права на это. Это выполняется, при помощи функции ioperm(from, num, turn_on) (определенной в unistd.h и находящейся в ядре), где from это первый порт, а num это количество подряд идущих портов, которым нужно дать доступ. Например, ioperm(0x300, 5, 1)
дает доступ к порту с 0x300 по 0x304 (всего 5 портов). Последний аргумент - это двоичное значение, определяющее, дать ли доступ к портам (истина (1)) или запретить его (ложь (0)). Для включения портов, идущих не подряд, вы можете вызывать ioperm() несколько раз. Для дополнительной информации читайте руководство ioperm(2).
Для вызова ioperm() необходимо иметь права root; таким образом, вы должны запускать программу от пользователя root или установить на файл флаг setuid. После того, как определен доступ к портам, права суперпользователя больше вам не нужны. Вам не нужно непосредственно освобождать порты при помощи ioperm(..., 0), т.к. это делается автоматически, когда программа заканчивает работу.
Выполнение setuid() для переключения на другого пользователя не отключает доступ к портам, данный ioperm(), но это происходит при fork (наследованный процесс теряет доступ, когда как у порождающего процесса он остается).
ioperm() может дать доступ только к портам с 0x000 по 0x3ff; для других портов вам нужно использовать iopl() (который дает доступ ко всем портам сразу). Используйте уровень 3 (iopl(3)), чтобы дать доступ вашей программе ко всем портам ввода/вывода (но будьте осторожны --- доступ к неправильным портам может сделать некоторые нехорошие вещи с вашим компьютером). Опять таки, вам необходимы привилегии root. Дополнительно читайте руководство iopl(2).
Теперь собственно о доступе к портам: Чтобы считать байт (8 бит) из порта, вызовите функцию inb(port), возвращающую считанный байт. Чтобы вывести байт в порт, вызовите процедуру outb(value, port) (обратите внимание на порядок аргументов). Чтобы считать компьютерное слово (16 бит) из портов x и x+1 (по одному байту из каждого образуют слово), вызовите функцию inw(x). Чтобы вывести слово в два порта, используйте outw(value, x). Если вы не уверены, работать с одинарным или двойным портом, вам, скорее всего, нужны inb() и outb(), т.к. порты большинства устройств имеют однобайтный доступ. Также замечу, что все функции, работающие с портами, требуют, как минимум, около микросекунды для выполнения.
Макросы inb_p(), outb_p(), inw_p() и outw_p() работают аналогично вышеуказанным, но добавляют короткую (около микросекунды) задержку после доступа к порту; вы можете установить задержку около четырех микросекунд при помощи #define REALLY_SLOW_IO перед #include . Обычно эти макросы (за исключением случаев с #define SLOW_IO_BY_JUMPING, при которых выполнение становится менее точным) используют вывод в порт 0x80 в качестве задержки, так что вам необходимо сначала дать доступ к порту 0x80, при помощи ioperm() (вывод в порт 0x80 никак не влияет на систему). О других способах задержки см. руководства.
См. руководства по ioperm(2), iopl(2) и вышеуказанных макросах.
Точность
Для задержек с точностью до одной секунды, лучше всего использовать time(). Для более точных задержек, gettimeofday() имеет точность около одной микросекунды (см. выше, насчет многозадачности). На пентиумах же функция rdtsc (см. выше) дает точность до одного такта.
Если после истечения какого-то количества времени вы хотите получить в программу сигнал, используйте setitimer() или alarm(). Для подробной информации об этих функциях см. соответствующее руководство.
Устранение возможных проблем
Q1.
Я получаю segmentation faults, когда пытаюсь получить доступ к порту.
A1.
Т.к. ваша программа не имеет прав root, или по каким-то причинам ioperm()
вызвана неудачно. Проверьте значение возвращаемое ioperm(). Также, проверьте обращаетесь ли вы к тем портам, которые разрешили с помощью ioperm() (см. Q3). Если вы используете макросы, добавляющие задержку (inb_p(), outb_p(), and so on), не забудьте вызвать ioperm(), чтобы получить доступ к порту 0x80 тоже.
Q2.
Я не могу найти функции in*(), out*() определенные где-нибудь, и gcc жалуется по поводу неопределенных ссылок.
A2.
Вы не компилировали свою программу со включенной оптимизацией (-O), и, таким образом, gcc не мог разобрать макросы в asm/io.h. Или вы не подключили #include .
Q3.
out*() не делает ничего, или делает что-то непонятное.
A3.
Проверьте порядок параметров; они должны быть outb(value, port), но не outb(value, port), как обычно в MS-DOS.
Q4.
Я хочу управлять стандартным устройством RS-232/параллельным портом/джойстиком...
A4.
Вы, вероятно, больше выиграете, используя существующие драйверы (в ядре Linux, в X server или где-то еще), чтобы сделать это. Драйверы обычно универсальные, такие, что даже нестандартные устройства могут работать с ними. См. информацию по стандартным портам, выше даны ссылки на документацию по ним.
Задержки
Прежде всего, я должен сказать, что в следствии многозадачной природы Linux, вы не можете гарантировать точную синхронизацию в пользовательской программе. Ваш процесс может выйти из расписания выполняемых задач на интервал от 10 миллисекунд до нескольких секунд (на системе с высокой загрузкой). Тем не менее, к большинству приложений, использующих порты ввода/вывода, это не относится. Чтобы свести это к минимуму, вы можете выполнять свой процесс при высоком приоритете (см. руководство nice(2)) или использовать расписание задач в реальном времени (см. ниже).
Если вам нужна более точная синхронизация в обычных пользовательских программах, существует несколько возможностей поддержки `реального времени' в пользовательском режиме. Ядра Linux версий 2.x имеют относительную поддержку реального времени; см. руководство по sched_setscheduler(2). Кроме того, существует специальное ядро, жестко поддерживающее реальное время; см. http://luz.cs.nmt.edu/~rtlinux/.
Итак, начнем с самых простых процедур синхронизации. Для задержки в несколько секунд, лучше всего использовать sleep(). Для задержек, с точностью до десятков миллисекунд может работать usleep(). Во время выполнения этих функций, процессор приостанавливает данный процесс на заданное время (``засыпает'') и выполняет другие процессы. Для детальной информации см. руководство sleep(3) и usleep(3).
Задержки менее 50 миллисекунд (в зависимости от скорости процессора, машины, и загрузки системы) не представляются возможными, т.к. для возвращения управления процессу в Linux тратится, как минимум, 10-30 миллисекунд. Указание таких задержек для usleep(3), на самом деле, приведет к большей задержке (уж, как минимум, в 10 мс).
В серии 2.0.x ядр Linux существует системный вызов nanosleep() (см. руководство nanosleep(2)), который позволяет выполнить самую короткую задержку (в несколько микросекунд и выше).
Задержки nanosleep() выполняет при помощи цикла; иначе он работает так же, как и usleep().
В циклах используется udelay()(внутренняя фунция ядра), а длина цикла вычисляется в зависимости от значения BogoMips. Для более детальной информации, как это работает см. /usr/include/asm/delay.h.
Задержка через порты ввода/вывода
Другой способ обеспечить задержку в несколько микросекунд - это порты ввода/вывода. Запись или чтение любого значения из порта 0x80 (о том, как это сделать, см. выше) обеспечивает задержку почти точно равную одной микросекунде, независимо от типа и скорости вашего процессора. Чтобы обеспечить задержку в несколько микросекунд, вы можете выполнить эту операцию несколько раз. Запись в этот порт не оказывает никакого влияния на компьютер (и некоторые драйверы используют это). Таким образом, обычно выполняется задержка в {in|out}[bw]_p() (см. asm/io.h).
На самом деле, операции ввода/вывода на большинство портов в диапазоне от 0 до 0x3ff тоже дают задержку около одной микросекунды. Так что, если вы, например, производите запись в параллельный порт, для обеспечения задержки, просто добавьте дополнительные inb() из порта.
Задержка при помощи команд ассемблера
Если вы знаете тип и частоту процессора машины, на которой будет работать программа, вы можете вставить меньшие задержки, путем выполнения определенных инструкций ассемблера (но помните, что ваш процесс может быть в любое время исключен из расписания, так что задержка может быть на много больше, чем вы хотите). В нижеуказанной таблице скорость процессора определяет число необходимых тактовых циклов для задержки; например, для процессора с частотой 50МГц (напр. 486DX-50 или 486DX2-50), один такт дает 1/50000000 секунд (=200 наносекунд).