USB Networking/ru
From Openmoko
Languages: |
English • العربية • Български • Česky • Dansk • Deutsch • Esperanto • Eesti • Español • فارسی • Suomi • Français • עברית • Magyar • Italiano • 한국어 • Nederlands • Norsk (bokmål) • Polski • Português • Română • Русский • Svenska • Slovenčina • Українська • 中文(中国大陆) • 中文(台灣) • Euskara • Català |
Настройка соединения с Openmoko
Для того, чтобы связаться с вашим FreeRunner по TCP/IP, нужно понимать, что для этого потребуется. Стороны соединения USB образуют сегмент локальной сети (LAN segment), в котором одним узлом является смартфон, а другим — ваша настольная машина или ноутбук (будем называть её ПК).
Примем как данность, что ваш ПК имеет настроенное соединение с интернетом, так что на ней тем или иным образом (статически или динамически, посредством DHCP) задан IP-адрес шлюза. Для того, чтобы выход в интернет появился на вашем Freerunner, нужно настроить на ПК маршрутизацию пакетов и маскарадинг.
Как правило, маршрутизация и маскарадинг настраиваются легко, однако если окажется, что подсеть между смартфоном и ПК пересекается с подсетью, в которой находится шлюз, могут возникнуть проблемы, поскольку ПК, скорее всего, не догадается, как правильно перенаправлять пакеты.
Другими словами, если ваши ПК и шлюз имеют IP-адреса вида 192.168.0.Х, то изменение их на что-нибудь вроде 192.168.1.Х избавит вас от множества проблем. Этот вопрос подробно обсуждается в рассылке.
О чём следует помнить
- Когда FreeRunner переходит в ждущий режим, он отключает свой сетевой интерфейс USB. Следовательно, если вы работаете с устройством через USB — выключите автоматический переход в ждущий режим. Это можно сделать вручную; кроме того, на веб-сайте клуба ССС вы найдёте два скрипта, которые делают это при подключении внешнего источника питания (для Om 2007 и для Om 2008).
- Некоторые скрипты выполняют tail-grep на файлах журналов. Если syslog и/или klog отключены, то у вас могут быть проблемы с определением, подключено ли устройство к вашему ПК. Если такая проблема есть, убедитесь, что службы журналирования работают (для Debian и Ubuntu это можно сделать командами /etc/init.d/klogd restart; /etc/init.d/sysklog restart).
«usb0» или «eth1»?
В данном руководстве мы предполагаем, что имя сетевого интерфейса на ПК — «usb0». Тем не менее, это имя определяется операционной системой вашего ПК, и многие системы назовут этот интерфейс, руководствуясь MAC-адресом смартфона. Выполните ifconfig -a или dmesg, чтобы увидеть список всех сетевых интерфейсов или просмотреть вывод ядра ОС — в обоих случаях вы увидите, как называется интерфейс, если он вообще был создан. Если имя отличается от «usb0», то оно почти наверняка будет следующим доступным «ethN».
Везде, где ниже мы упоминаем интерфейс «usb0», замените его то имя, которое ваша система присвоила интерфейсу.
Для интересующихся технической стороной, имя «usb0» выбирается системой в случае, если MAC-адрес устройства является локально сгенерированным (случайным), поскольку если адрес случаен, то возможность управления интерфейсом при помощи соответствующих инструментов оказывается под вопросом. На самом деле, смартфонам Freerunner при изготовлении назначаются MAC-адреса, в том числе и для USB-интерфейса. Если эти адреса правильно используются смартфоном (так делают Qi bootloader и некоторые дистрибутивы, но не все), то ОС вашего ПК получает официальный MAC-адрес и создаёт «постоянный» сетевой интерфейс, которому принято давать имя вида «ethN». Однажды выданное имя запоминается и в дальнейшем используется только для этого устройства, что особенно удобно, если у вас несколько устройств, для которых вы настраиваете сетевые соединения через USB.
На момент написания этой статьи (оригинальной англоязычной — прим. phantom) официальный MAC-адрес корректно передавали дистрибутивы Android и SHR.
Простая настройка вручную на Linux
Для начала попробуйте этот способ. Если он сработает, вы сможете сохранить настройку или попробовать более сложные способы, описанные ниже.
Вам потребуются привилегии суперпользователя. Включите смартфон в обычном режиме и подключите его к USB-интерфейсу вашего ПК.
Кратчайший путь
Этот простой способ был испытан на множестве Linux-систем (Fedora, SuSE, Red Hat, Debian и др.) и сетевых конфигураций. Более того, он сработал при подключении к другим КПК под управлением Linux (типа TDS Nomad), так что мы с уверенность рекомендуем его для первой попытки. Мы предполагаем, что на вашем ПК работает достаточно свежий дистрибутив, имеющий поддержку сетевых соединений через USB, и что ваша сетевая конфигурация более или менее стандартна.
Выполните от имени суперпользователя настройку интерфейса usb0:
sudo ip address add 192.168.0.200/24 dev usb0
или (устаревшее)
sudo ifconfig usb0 192.168.0.200 netmask 255.255.255.0
Если ваш интерфейс eth0 находится в том же диапазоне IP-адресов (например, 192.168.0.105), сделайте следующее:
1. Проверьте, что до смартфона доходят пакеты:
# ping -I usb0 192.168.0.202
2. Войдите в консоль смартфона (для этого суперпользователь не нужен):
# ssh root@192.168.0.202
Пароль суперпользователя на смартфоне по умолчанию пуст.
Не забудьте, что для того, чтобы соединиться с устройством по SSH, нужно, чтобы на вашем локальном межсетевом экране (firewall) был разрешён порт 22. Если вы подозреваете, что соединиться с устройством не удаётся из-за работающего экрана, попробуйте физически отключить внешний Ethernet-кабель, после чего временно выключить межсетевой экран.
Кроме того, некоторые старые или специфически настроенные системы могут не иметь поддержки сетевых соединений через USB. В таком случае необходимо обновить систему и добавить соответствующие модули.
Более продвинутый путь
Если описанный выше простой способ не сработал, попробуйте следующий, более сложный.
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 sysctl -w net.ipv4.ip_forward=1 ip addr add 192.168.0.200/24 dev usb0
Если ваше соединение с интернетом использует IP-адрес в той же подсети (192.168.0.Х), попробуйте вместо этого следующее:
ip addr add 192.168.0.200/28 dev usb0
Такая команда направит пакеты с адресов в диапазоне от 192.168.0.192 до 192.168.0.207 на интерфейс usb0. Если вы видите сообщение об ошибке 'Cannot find device "usb0"', проверьте, что смартфон включён и присоединён к USB-интерфейсу вашего ПК; если с этим всё в порядке, попробуйте отсоединить и присоединить USB-кабель.
Далее, вам следует включить ARP-прокси для внешнего интерфейса ВМЕСТО того, чтобы применять iptables:
sysctl net.ipv4.conf.eth2.proxy_arp=1
Команда дана для случая, когда внешний интерфейс — eth2.
После этого:
ip link set usb0 up
или (устаревшее)
ifconfig usb0 up
И наконец (в идеале, не как суперпользователь):
ssh root@192.168.0.202
Пароль суперпользователя по умолчанию пуст.
Поскольку в большинстве случаев смартфон будет использовать те же DNS-серверы, что и ПК, можно автоматизировать процесс конфигурирования::
#!/bin/sh /sbin/route add -host 192.168.0.202/32 dev usb0 iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 iptables -P FORWARD ACCEPT sysctl -w net.ipv4.ip_forward=1 scp /etc/resolv.conf root@192.168.0.202:/etc/resolv.conf
Повторимся, если ваша сеть имеет адреса 192.168.0.Х, замените строку с правилом POSTROUTING следующим:
iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/28
Этот простой скрипт настроит маршрутизацию на вашем смартфоне и скопирует на него ваш resolv.conf. Всё, что вам нужно будет сделать, чтобы на смартфоне появился интернет — это соединить смартфон с ПК и выполнить этот скрипт.
Изменение IP-адреса смартфона
Как упоминалось выше, если подсеть, используемая смартфоном по умолчанию (192.168.0.X), уже используется, может потребоваться изменить IP-адрес и подсеть самого устройства. Для этого нужно отредактировать /etc/network/interfaces на Freerunner, после чего перезагрузить смартфон.
В следующем примере для устройства задаётся IP-адрес 192.168.100.1 (вместо адреса по умолчанию 192.168.0.202) в подсети 192.168.100.X (вместо 192.168.0.X), другой частной сети класса C. (Маска подсети показывает, что первые три байта используются для адресации подсети, а последний байт — для адресации машины в подсети.) Шлюз (ПК, к которому подключен смартфон) должен тоже быть узлом подсети, и в данном случае для него задаётся IP-адрес 192.168.100.254 (вместо 192.168.0.200).
Изменения для /etc/network/interfaces:
auto usb0 iface usb0 inet static address 192.168.100.1 netmask 255.255.255.0 network 192.168.100.0 gateway 192.168.100.254
(Строка network, похоже, избыточна, поскольку эти данные могут быть получены сопоставлением строк address и netmask?) Обратите внимание, что адреса даны для примера, и вам наверняка потребуется изменить их так, чтобы они соответствовали вашей конфигурации.
Поддержка в ядре Linux
Необходимо, чтобы ваш Linux-ПК поддерживал необходимые функции, а именно сетевые соединения через USB и маскарадинг. Эти функции включены по умолчанию в большинстве современных дистрибутивов Linux.
Поддержка сетевых соединений через USB
Следующие опции должны быть включены:
- CONFIG_USB_USBNET (Multi-purpose USB Networking Framework. Модуль будет называться usbnet)
- CONFIG_USB_NET_CDCETHER (CDC Ethernet support. Модуль будет называться cdc_ether)
Эти опции находятся в группе Device Drivers -> USB support -> USB Network Adapters или Device Drivers -> Network Device Support -> USB Network Adapters.
Для того, чтобы соединения через USB заработали, вам нужно будет загрузить модуль cdc_ether (при загрузке cdc_ether модуль usbnet загрузится автоматически). Подробности описаны на странице, посвящённой драйверу usbnet.
Поддержка маскарадинга
Опции, относящиеся к маскарадингу, находятся в группе Networking ---> Networking options ---> (проверено на Linux 2.6.26.3).
Для того, чтобы включить требуемые опции, сначала вам нужно включить:
- CONFIG_NETFILTER (Network packet filtering framework (Netfilter))
Затем в группе Networking ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> Core Netfilter Configuration ---> — как минимум, следующие опции:
- CONFIG_NF_CONNTRACK (Netfilter connection tracking support)
- CONFIG_NF_CONNTRACK_FTP (FTP protocol support)
- CONFIG_NETFILTER_XTABLES (Netfilter Xtables support)
Остальные опции находятся в группе Networking ---> Networking options ---> [*] Network packet filtering framework (Netfilter) ---> IP: Netfilter Configuration --->. Вам потребуются опции:
- CONFIG_NF_CONNTRACK_IPV4 (IPv4 connection tracking support (required for NAT))
- CONFIG_IP_NF_IPTABLES (IP tables support (required for filtering/masq/NAT))
- CONFIG_NF_NAT (Full NAT)
- CONFIG_IP_NF_TARGET_MASQUERADE (MASQUERADE target support)
Проблемы с межсетевыми экранами
На некоторых системах настройки межсетевого экрана по умолчанию мешают настройке соединения с Freerunner (как, например, iptables на Fedora). Можно просто отключить экран, либо попытаться найти, какие правила или политики могут вызывать затруднения.
Первое, что нужно проверить — это таблица маршрутизации NAT, управляющая преобразованием IP-адресов:
iptables -L -t nat -v -n
Если в вашей настройке нет ничего специфического, то вам будут интересны только правило MASQUERADE, которое мы добавим ниже, и правило ACCEPT, являющееся политикой по умолчанию. Взгляните также на таблицу фильтрации:
iptables -L -t filter -v -n
Если эта таблица содержит что-либо в цепи FORWARD, это может помешать передаче пакетов. Сбросить правила можно командой:
iptables -t filter -F FORWARD
DNS
Вдобавок к маршрутизации, вообще говоря, надо, чтобы была доступна служба DNS. В некоторых случаях у вас может уже быть настроен локальный сервер DNS, например, dnsmasq или bind9, и это предположение — что DNS-сервер работает на шлюзе — Freerunner делает по умолчанию. В других случаях вам потребуется указать, какой DNS-сервер следует использовать.
Настройка DNS
DNS настраивается в файле /etc/resolv.conf вашего Freerunner.
Добавьте IP-адрес DNS-сервера, предоставляемого вашим интернет-провайдером.
echo nameserver xxx.xxx.xxx.xxx > /etc/resolv.conf
Вы можете также добавить публичный DNS-сервер, известный как openDNS:
echo nameserver 208.67.222.222 > /etc/resolv.conf echo nameserver 208.67.220.220 >> /etc/resolv.conf
Эти настройки будут потеряны при перезагрузке. Можно сделать так, чтобы они сохранялись, добавив следующие строки в файл /etc/network/interfaces в конец секции, относящейся к usb0:
up echo nameserver 208.67.222.222 > /etc/resolv.conf up echo nameserver 208.67.220.220 >> /etc/resolv.conf
Получение DNS с ПК
Если вы часто переезжаете с места на место, делать какие-либо заключения о настройке сети может быть не очень удобно. Вместо этого можно настроить получение настроек DNS с вашего ПК, для чего есть несколько способов.
dnrd
Разработан скрипт для настройки использования dnrd в качестве DNS-прокси. Доступны сам скрипт и копия dnrd. Помимо настройки DNS-прокси, скрипт выполняет первичную настройку соединения аналогично тому, как это описано выше в разделе, посвящённом ручной настройке.
Пересылка UDP-пакетов (UDP forwarding)
Другой простой способ заключается в использовании ПО, осуществляющего пересылку пакетов UDP — например, udpf. Выполните его командой:
udpf-elf -p=53-f=`awk '$1 == "nameserver"{print $2; exit(0);}' /etc/resolv.conf`:53
iptables
Можно перенаправлять запросы DNS при помощи таблиц iptables, используя цель DNAT:
iptables -t nat -A PREROUTING -p tcp -s 192.168.0.202 -d 192.168.0.200 --dport domain -j DNAT --to-destination 192.168.0.1 iptables -t nat -A PREROUTING -p udp -s 192.168.0.202 -d 192.168.0.200 --dport domain -j DNAT --to-destination 192.168.0.1
Здесь 192.168.0.1 — это IP-адрес вашего маршрутизатора.
Проверьте, что всё работает:
ping www.google.com
Если ping сработал, то вопрос с доступом в интернет в целом можно считать решённым. Однако изменения в resolv.conf, сделанные вручную, могут быть утеряны, например, при использовании DHCP (а в особенности — WiFi), поэтому ручная настройка может оказаться неудобной.
Проверка соединения
У вас должна быть возможность соединиться с вашим Freerunner! Для начала убедитесь, что пакеты вообще проходят:
ping 192.168.0.202
После этого войдите в консоль по SSH:
ssh root@192.168.0.202
Пароль по умолчанию пуст (просто нажмите enter).
Вы можете передавать файлы в обе стороны с помощью scp. Вы можете использовать telnet, SSH, SMB и всё остальное, что вам потребуется.
Теперь убедитесь, что пакеты передаются в обратную сторону. Следующие команды нужно выполнить в консоли смартфона:
ping 192.168.0.200
(Имейте в виду, что некоторые системы, например, Vista, по умолчанию не отвечают на ICMP ping.)
Проверьте доступ к внешнему миру (IP-адрес Google):
ping 74.125.19.147
Последняя команда покажет, работает ли маскарадинг на вашем ПК.
Наконец, проверьте, что смартфон имеет доступ к DNS:
ping www.google.com
Автоматическая и специфическая для ОС настройка
Раздел основывается на статье Hotplugging usbnet Маркина Юшкевича, известного под псевдонимом «Hrw» (Marcin 'Hrw' Juszkiewicz). Приведённые ниже рекомендации помогут вам настроить соединение один раз и пользоваться им в дальнейшем.
Кроме того, в этом разделе вы можете найти полезную информацию на случай, если по каким-либо причинам описанные выше способы не работают в вашей операционной системе или в вашем дистрибутиве.
MacOS X
Windows
См. Windows USB Ethernet emulation for Neo1973.
Также есть очень полезное руководство по настройке на Windows Vista.
FreeBSD
Вам потребуется загрузить модуль cdce, если он ещё не загружен. Выполните от имени суперпользователя:
- kldload cdce
После этого Neo должен появиться в системе как интерфейс cdce0, и вы сможете выполнить остальную настройку так же, как описано для устройства usb0 под Linux. Дополнительную информацию вы найдёте в руководстве по cdce. Простой способ назначить IP-адрес интерфейсу cdce0 задействует демон devd(8). Создайте два файла:
/usr/local/etc/devd/cdce.conf:
notify 1 { match "system" "IFNET"; match "subsystem" "cdce0"; match "type" "ATTACH"; action "/usr/local/etc/devd/cdce.sh $subsystem $type"; };
и /usr/local/etc/devd/cdce.sh as:
#!/bin/sh case $2 in 'ATTACH') ifconfig cdce0 192.168.0.200 netmask 255.255.255.0 exit 0 ; ;; esac exit 0
После этого перезапустите демон devd(8):
# /etc/rc.d/devd restart
Теперь, когда вы подключите FreeRunner к USB-интерфейсу вашего ПК, автоматически будет создан интерфейс cdce0, и ему будет назначен IP-адрес.
Debian, Ubuntu и другие
Откройте /etc/network/interfaces и добавьте в него следующие строки:
# freerunner allow-hotplug usb0 iface usb0 inet static address 192.168.0.200 netmask 255.255.255.0 up iptables -A POSTROUTING -t nat -s 192.168.0.0/24 -j MASQUERADE up echo 1 > /proc/sys/net/ipv4/ip_forward down iptables -D POSTROUTING -t nat -s 192.168.0.0/24 -j MASQUERADE
Этот способ более изящен, чем ручная настройка. Трюк с автоматическим включением завязан на систему Linux hotplug, так что соответствующие действия по конфигурированию интерфейсов выполняются автоматически при подключении и отключении устройства.
Вдобавок маска подсети на стороне ПК ограничена небольшим диапазоном, так что пересечение подсетей не является проблемой: Linux будет пользоваться специальными правилами для перенаправления пакетов.
Альтернативное решение, добавляющее DNS forward и удаляющее изменения в таблице iptables после отключения устройства:
В файле /etc/network/interfaces добавьте:
# freerunner allow-hotplug usb0 iface usb0 inet static address 192.168.0.200 netmask 255.255.255.192 post-up /etc/network/freerunner start pre-down /etc/network/freerunner stop
Создайте файл /etc/network/freerunner:
#!/bin/sh # # configures the freerunner for internet # # DEVICE=usb0 IPADDR=192.168.0.200 REMOTE_IPADDR=192.168.0.202 NETMASK=255.255.255.0 # get first ip for dns DNSIP=$(awk '$1 == "nameserver"{print $2; exit(0);}' /etc/resolv.conf) case "$1" in start) iptables -A POSTROUTING -t nat -j MASQUERADE -s $REMOTE_IPADDR iptables -A PREROUTING -t nat -p tcp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP iptables -A PREROUTING -t nat -p udp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP if [ "$(cat /proc/sys/net/ipv4/ip_forward)" = "0" ]; then echo "temoprarely allow ip_forward for openmoko" > /var/run/openmoko.ip_forward echo 1 > /proc/sys/net/ipv4/ip_forward fi ;; stop) iptables -D POSTROUTING -t nat -j MASQUERADE -s $REMOTE_IPADDR iptables -D PREROUTING -t nat -p tcp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP iptables -D PREROUTING -t nat -p udp -s $REMOTE_IPADDR -d $IPADDR --dport domain -j DNAT --to-destination $DNSIP if [ -f /var/run/openmoko.ip_forward ]; then rm /var/run/openmoko.ip_forward echo 0 > /proc/sys/net/ipv4/ip_forward fi ;; esac
Сделайте /etc/network/freerunner исполняемым:
chmod +x /etc/network/freerunner
Можно использовать network-manager, чтобы автоматически соединяться со смартфоном с помощью udev. Предлагаемый ниже способ использует udev для запуска скрипта, когда Freerunner подключается к системе. Скрипт использует команду ip, чтобы установить MAC-адрес сетевого интерфейса USB. Для начала создайте файл /etc/udev/rules.d/80-freerunner.rules :
# This file causes programs to be run on device insertion. # See udev(7) for syntax. # rule to assign a fixed mac address specified in / KERNEL=="usb[0-9]*", DRIVERS=="cdc_ether", ACTION=="add", RUN+="/usr/local/sbin/freerunner-usb-add.sh %k"
Затем создайте файл /usr/local/sbin/freerunner-usb-add.sh :
#!/bin/sh ( busNum=$( printf %.2d $( expr match "$1" "usb\([0-9]*\)") ) ip link set "$1" address 00:00:22:55:bb:$busNum &> /dev/null ) & exit 0
Наконец, сделайте второй файл исполняемым:
chmod +x /usr/local/sbin/freerunner-usb-add.sh
Теперь вы можете использовать network-manager с настройками, привязанными к MAC-адресу, и настроить автоматическое подключение.
Ubuntu 8.10, простой путь
- 1. Соедините Neo с ПК и подождите примерно минуту, пока NetworkManager не закончит сканирование DHCP на USB (значок в системном лотке должен переключиться в нормальное состояние).
- 2. Откройте "nm-connection-editor", выберите "Auto usb0", нажмите "Edit", затем "IPv4 Settings". Выберите для "Method" значение "Manual", нажмите "Add". В поле "Address" напишите "192.168.0.200", "Netmask" - "255.255.255.0", оставьте поле "Gateway" пустым (или 0.0.0.0). Задайте "Connection name" и нажмите "Apply", затем "Close".
- 3. Теперь вы можете соединиться по SSH на адрес 192.168.0.202
Внимание: после перепрошивки смартфона потребуется скопировать значение поля "MAC Address" из "Auto usb0" в настройки нового соединения.
После этого, следуя инструкциям, у вас должно получиться настроить маскарадинг следующими командами:
sudo iptables -I INPUT 1 -s 192.168.0.202 -j ACCEPT sudo iptables -I OUTPUT 1 -s 192.168.0.200 -j ACCEPT sudo iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
Проблемы Ubuntu
- Ubuntu 8.10 не работает, как должно, если вы используете /etc/network/interfaces для автоматизации.
- Network manager любит ковыряться в настройках сетевого устройства и добавлять маршрут по умолчанию через 192.168.0.202, что нарушает ваше соединение.
- Network manager также сообщает, что вы не можете изменить это соединение или удалить его. Я думаю вернуться к тому, чтобы устанавливать соединение вручную.
- Использование следующего скрипта /usr/local/sbin/freerunner-usb-add.sh может служить обходным путём:
#!/bin/sh ( ip address add 192.168.0.200/26 netmask dev usb0 > /dev/null ip link set usb0 up > /dev/null /etc/network/freerunner start ) & exit 0
- Ubuntu Feisty, Gutsy и Hardy имеют проблему: ifdown не срабатывает, если интерфейс отключён. Подробности описаны по адресу: https://bugs.launchpad.net/ubuntu/+source/ifupdown/+bug/130437
Можно исправить /etc/udev/rules.d/85-ifupdown.rules. Перемещение строки DRIVERS=="*?" из верхнего GOTO в строку ACTION=="add" исправляет проблему:
SUBSYSTEM=="net", GOTO="net_start" GOTO="net_end" LABEL="net_start" # Bring devices up and down only if they're marked auto. # Use start-stop-daemon so we don't wait on dhcp ACTION=="add", DRIVERS=="?*", RUN+="/sbin/start-stop-daemon --start --background --pidfile /var/run/network/bogus --startas /sbin/ifup -- --allow auto $env{INTERFACE}" ck ACTION=="remove", RUN+="/sbin/start-stop-daemon --start --background --pidfile /var/run/network/bogus --startas /sbin/ifdown -- --allow auto $env{INTERFACE}" LABEL="net_end"
Проблема состоит в том, что переменная DRIVERS оказывается не установлена, когда устройство отключено.
This appears to be fixed in Ubuntu 8.04 Mattt 11:38, 30 July 2008 (UTC)
- Actually it appears that it's not fixed, but patching that file and disconnecting and reconnecting the phone works perfectly. --Johndoesacc 18:37, 20 August 2008 (UTC)
- Well, yes, it must be fixed because it worked for me out-of-the-box without tweaking the udev rule on 8.04 --EtienneG November 26th, 2008
- It wasn't solved in my case, as of 3. February 2009 in 8.04 (AMD64), the patch above solved my problem thou. --VilleWitt February 3td, 2009.
Настройка iptables через GUI
Firestarter пригодится, чтобы дать смартфону выход в интернет без необходимости модифицировать iptables вручную. Firestarter есть в репозитории Ubuntu, установить его можно командой:
sudo aptitude install firestarter
В диалоге настроек Firestarter есть раздел Network, в котором вы найдёте раскрывающийся список "Local network connected device". Выберите Freerunner (как правило, его имя будет "Unknown device(usb0)") и установите флаг "Enable internet connection sharing". Снимите флаг, разрешающий локальный DHCP, после чего ваш смартфон должен получить выход в интернет
-Tested in ubuntu 8.10--Makito February 26, 2009
Внимание: Firestarter нужно запускать от имени суперпользователя.
Обходное решение для Ubuntu
Попробуйте применить wicd вместо networkmanager. Этот пакет разработан намного лучше, чем networkmanager, и не создаёт проблем с сетевыми соединениями через USB. С ним вы можете использовать «нормальные» установки в /network/interfaces.
Внимание: wicd конфликтует по зависимостям с networkmanager, так что при установке одного пакета другой будет удалён.
Ubuntu и QI
Если у вас не получается соединиться со смартфоном после установки qi, проверьте, изменилось ли имя устройства на «ethN». Как уже отмечалось выше, многие операционные системы присваивают устройству имя вида «ethN», если для него обнаружен официальный (не сгенерированный локально) MAC-адрес. Qi, в отличие от u-boot, передаёт официальный MAC-адрес смартфона.
Mandriva
Следующий файл задаёт настройку сетевого интерфейса usb0. Когда вы подключите смартфон к USB-интерфейсу, он автоматически будет настроен.
/etc/sysconfig/network-scripts/ifcfg-usb0:
DEVICE=usb0 BOOTPROTO=static IPADDR=192.168.0.200 NETMASK=255.255.255.0 NETWORK=192.168.0.0 BROADCAST=192.168.0.255 ONBOOT=yes METRIC=10 MII_NOT_SUPPORTED=no USERCTL=yes
Следующий файл настраивает статические маршруты, требуемые для связи между подсетями. Поскольку в имени файла присутствует «usb0», система автоматически настроит эти маршруты при конфигурировании интерфейса usb0 (то есть, когда вы подключите смартфон).
/etc/sysconfig/network-scripts/usb0-routes:
ADDRESS0=192.168.0.200 NETMASK0=255.255.255.0
Теперь нужно перезапустить сетевые службы:
service network restart
This didn't work for me (Mandriva 2008.1), giving errors from Shorewall. However, simply using MCC, Network->Sharing Internet Access worked fine. You need to connect Neo when starting it. --Alih 18:50, 22 September 2008 (UTC)
SuSE
/etc/sysconfig/network/ifcfg-usb0:
# USB configuration for PDAs (openmoko) IPADDR=192.168.0.200 NETMASK=255.255.255.0 STARTMODE=onboot
Дополнительную информацию о настройке сети через USB с использованием YaST вы можете получить в статье USB Networking with openSUSE.
Fedora
Вариант A. Проверен на FC9, FC8 и FC5
Отредактируйте файл /etc/sysconfig/network-scripts/ifcfg-usb0 следующим образом:
# USB configuration for PDAs (openmoko) # from http://www.handhelds.org/moin/moin.cgi/UsbNet DEVICE=usb0 BOOTPROTO=none IPADDR=192.168.0.200 NETMASK=255.255.255.0 ONBOOT=yes
Перезапустите сетевые службы:
service network restart
Если ваш смартфон был присоединён в момент перезапуска служб, вы должны увидеть сообщение:
Bringing up interface usb0 [OK]
Вариант B
Этот вариант, вероятно, чересчур сложен:
/etc/sysconfig/network-scripts/ifcfg-usb0:
DEVICE=usb0 IPADDR=192.168.0.200 NETMASK=255.255.255.0
/etc/sysconfig/network-scripts/ifup-usb:
#!/bin/bash ./etc/init.d/functions cd /etc/sysconfig/network-scripts ../network-functions [ -f ../network ] && . ../network CONFIG=${1} need_config ${CONFIG} source_config NETBITS=`ipcalc -p ${IPADDR} ${NETMASK} | awk -F'=' '{print $2;}'` /sbin/ip addr flush dev ${DEVICE} 2>/dev/null /sbin/ip link set dev ${DEVICE} up /sbin/ip addr add dev ${DEVICE} ${IPADDR}/${NETBITS} /sbin/iptables -I POSTROUTING -t nat -j MASQUERADE -s ${IPADDR}/${NETBITS} /sbin/sysctl net.ipv4.ip_forward=1 /sbin/iptables -I FORWARD -s ${IPADDR}/${NETBITS} -j ACCEPT /sbin/iptables -I FORWARD -d ${IPADDR}/${NETBITS} -j ACCEPT
Устанавливаем /etc/sysconfig/network-scripts/ifdown-usb:
#!/bin/bash ./etc/init.d/functions cd /etc/sysconfig/network-scripts ../network-functions [ -f ../network ] && . ../network CONFIG=${1} need_config ${CONFIG} source_config NETBITS=`ipcalc -p ${IPADDR} ${NETMASK} | awk -F'=' '{print $2;}'` /sbin/iptables -D FORWARD -d ${IPADDR}/${NETBITS} -j ACCEPT /sbin/iptables -D FORWARD -s ${IPADDR}/${NETBITS} -j ACCEPT /sbin/sysctl net.ipv4.ip_forward=0 /sbin/iptables -D POSTROUTING -t nat -j MASQUERADE -s ${IPADDR}/${NETBITS} /sbin/ip link set dev ${DEVICE} down /sbin/ip addr flush dev ${DEVICE} 2>/dev/null
Если вы используете NetworkManager, перезапустите его и разрешите устройство USB через меню, иначе он запретит ваше соединение вскоре после того, как вы его установили.
/sbin/service NetworkManager restart
Вариант C. Проверен на FC8, FC9 и F10
Подсоедините устройство. NetworkManager должен определить подключение автоматически, но это для нас не имеет значения.
Откройте Network Configuration (System -> Administration -> Network) и выполните следующие шаги:
- Нажмите New в верхней панели.
- Нажмите Forward.
- Выберите в списке устройств Openmoko.
- Нажмите Forward.
- Выберите 'Statically set IP address:' и введите address: 192.168.0.200, netmask 255.255.255.0 (или 255.255.255.240, если вам нужен только поддиапазон 192.168.0.192-192.168.0.207). Оставьте поле gateway пустым.
- Нажмите Forward.
- Нажмите Apply (диалог добавления устройства закроется).
- Выберите вновь добавленное устройство usb0 из списка.
- Нажмите Edit в верхней панели.
- Возможно, вы решите снять флаг 'Activate device when computer starts'.
- Нажмите Ok (диалог закроется).
Сохраните настройки и закройте окно.
Откройте Firewall Configuration (System -> Administration -> Firewall) и включите маскарадинг:
- Выберите Masquerading в левой панели.
- Выберите устройства, для которых вы бы хотели разрешить использование вашего интернет-соединения. Как правило, это устройства eth0 и wlan0.
- Нажимте Apply и закройте окно.
Откройте консоль и выполните от имени суперпользователя:
- ifdown usb0
- ifup usb0
Первая команда удалит все текущие настройки, заданные NetworkManager, а вторая включит интерфейс с нужными настройками.
Теперь у вас должна быть связь с внешним миром. Проверьте, так ли это, командой ping (например, 74.125.39.99 [www.google.com]) со смартфона. Настройте /etc/resolv.conf, и у вас будет полноценный доступ в интернет.
Решение проблем
Если Network Configuration не видит устройство usb0, попробуйте отсоединить USB-кабель и через несколько секунд присоединить его обратно, после чего подождать, пока NetworkManager не найдёт его.
NetworkManager назначит смартфону новый IP-адрес, если соединение пропадёт. Это можно исправить, повторно выполнив ifup usb0.
Red Hat и аналоги (проверено на Workstation 5)
Исправьте /etc/sysconfig/network-scripts/net.hotplug:
После строк:
case $INTERFACE in # interfaces that are registered after being "up" (?)
добавьте
usb0) ifconfig usb0 192.168.0.200 netmask 255.255.255.0 route add 192.168.0.202 usb0 iptables -I INPUT 1 -s 192.168.0.202 -j ACCEPT iptables -I OUTPUT 1 -s 192.168.0.200 -j ACCEPT iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 echo 1 > /proc/sys/net/ipv4/ip_forward exit 0 ;;
Gentoo
Откройте /etc/conf.d/net и добавьте:
# Neo config_usb0=( "192.168.0.200 netmask 255.255.255.0" ) routes_usb0=( "192.168.0.202/32 via 192.168.0.200" )
Создайте новый скрипт init:
cd /etc/init.d ln -s net.lo net.usb0
Ручная настройка
Добавьте правила iptables:
iptables -I INPUT 1 -s 192.168.0.202 -j ACCEPT iptables -I OUTPUT 1 -s 192.168.0.200 -j ACCEPT iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24
Сохраните их:
/etc/init.d/iptables save
Если вы хотите сделать маршрутизацию по умолчанию, выполните:
rc-update add iptables default
Кроме того, нужно указать ядру, что требуется начать форвардинг:
echo 1 > /proc/sys/net/ipv4/ip_forward
Автоматическая настройка
Автоматизировать всё и сразу можно, создав /etc/conf.d/net.usb0 согласно следующему листингу. Такой скрипт включает форвардинг пакетов и маршрутизацию в один приём, а также удаляет правила iptables и выключает форвардинг, когда вы отключаете устройство. Учтите, что служба net.usb0 service должна поддерживать горячее включение (/etc/rc.conf).
preup() { echo 1 > /proc/sys/net/ipv4/ip_forward iptables -I INPUT 1 -s 192.168.0.202 -j ACCEPT iptables -I OUTPUT 1 -s 192.168.0.200 -j ACCEPT iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 return 0 } postdown() { echo 0 > /proc/sys/net/ipv4/ip_forward iptables -D INPUT -s 192.168.0.202 -j ACCEPT iptables -D OUTPUT -s 192.168.0.200 -j ACCEPT iptables -D POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24 return 0 }
Slackware (проверено на 12.1)
По мотивам решения, предложенного Энрико Зини (Enrico Zini).
Создайте новый файл с правилами для udev /etc/udev/rules.d/91-openmoko.rules:
SUBSYSTEM=="net", ACTION=="add", ATTRS{idVendor}=="1457", ATTRS{idProduct}=="5122", RUN+="/sbin/om-usb $env{INTERFACE} start" SUBSYSTEM=="net", ACTION=="remove", ENV{INTERFACE}=="usb[0-9]", RUN+="/sbin/om-usb $env{INTERFACE} stop"
Затем создайте файл /sbin/om-usb:
#!/bin/sh INTERFACE=$1 ACTION=$2 # udev fails silently when the script fails, e.g. due to commands not # being found PATH=/usr/sbin:/sbin:/usr/bin:/bin case $ACTION in 'start') # Put all your setup here ;; 'stop') # Put all your tear down here ;; *) echo "Usage: $0 {start|stop}" exit 1 ;; esac
INTERFACE в большинстве случаев будет usb0.
Archlinux
По мотивам решения, предложенного пользователем furester.
Установите openmoko-usb-networking из AUR:
$ yaourt -S openmoko-usb-networking
Дополнения по SSH
Сообщалось, что демон ssh daemon (dropbear 0.49) на FreeRunner содержит ошибку, из-за которой иногда вы можете получить код возврата 255 при выходе.
Чтобы ssh не добавлял новую строку для каждого ssh host-key в ваш файл known_hosts, вы можете добавить в файл ~/.ssh/config в секцию phone следующее (или см. листинг в секции USB Networking#Changing_host_keys ниже):
UserKnownHostsFile /dev/null
Также вы можете использовать ключи, чтобы не вводить пароль.
Ключи SSH
С ПК на FreeRunner
Чтобы сгенерировать ключи для ssh, выполните:
user@host$ ssh-keygen -t rsa
При запросе пароля просто нажмите enter, если вы хотите оставить пароль пустым (не лучший вариант) или введите пароль для данного ключа. Войдите в консоль смартфона и создайте директорию ~/.ssh:
root@phone# mkdir ~/.ssh
Потом скопируйте в эту директорию файл .pub, созданный на ПК на предыдущем шаге:
user@host$ scp ~/.ssh/id_rsa.pub root@phone:~/.ssh/authorized_keys
Теперь вы можете соединяться со смартфоном по SSH от имени user@host без необходимости вводить пароль, поскольку ваш публичный ключ содержится в файле root@phone:~/.ssh/authorized_keys. Если вы делали всё по инструкции, то в данный момент в этом файле только один ключ, но вы можете добавить ключи для других пользователей, например, user@host, user@laptop и т. п.
Чтобы сделать вход по умолчанию с правами суперпользователя, добавьте в файле ~/.ssh/config следующие строки:
Host phone User root
Замените phone именем хоста или IP-адресом вашего смартфона. Теперь вы сможете соединяться с устройством по SSH без необходимости каждый раз писатьroot@.
Чтобы запретить вход с паролем (после настройки входа с ключом), исправьте /etc/init.d/dropbear, изменив следующую строку:
DROPBEAR_EXTRA_ARGS=
на
DROPBEAR_EXTRA_ARGS="-s"
После этого перезапустите dropbear, чтобы новые настройки вступили в силу.
С Freerunner на ПК
Создайте ключ:
dropbearkey -t rsa -f id_rsa
Выхлоп будет выглядеть приблизительно так:
Will output 1024 bit rsa secret key to 'id_rsa' Generating key, this may take a while... Public key portion is: ssh-rsa AAAAB3Nza[...] Fingerprint: md5 ca:e8:f0:b7:f6:7b:c2:b6:b9:71:e4:45:86:a9:ff:b8
Скопируйте строку, начинающуюся с 'ssh-rsa', и вставьте её в конец файла authorized_keys на ПК (как правило, этот файл содержится в директории ~/.ssh/).
Со смартфона запустите ssh с ключом -i:
ssh -i id_rsa user@host
Изменение ключей ПК
Если вы перепрошьёте устройство, ключи поменяются. Попробуйте следующую конфигурацию ~/.ssh/config на ПК:
Host moko HostName 192.168.0.202 StrictHostKeyChecking no UserKnownHostsFile /dev/null User root
Это рекомендуется сделать, поскольку ssh на ПК может отказать в соединении, если ключ, записанный для определённого IP-адреса, изменился. После того, как вы изменили настройки ssh, как описано выше, вы сможете соединиться с устройством по SSH:
ssh root@moko
GUI на ПК через SSH
Чтобы вывести GUI со смартфона на экран вашего ПК, выполните на ПК следующее:
xhost + ssh -l root -X -v 192.168.0.202
Теперь запустите, например, openmoko-finger-demo, и он откроется на ПК. Чтобы переключиться в альбомный режим, просто измените размер окна на ПК.
Если вы получаете ошибку вида:
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.Spawn.ExecFailed: dbus-launch failed to autolaunch D-Bus session: Autolaunch requested, but X11 support not compiled in.
то вам нужно установить переменную окружения DBUS_SESSION_BUS_ADDRESS на FreeRunner перед тем, как запускать процессы с ПК. Нужное значение можно узнать, выполнив на Freerunner команду:
ps auxwwwwe | grep -m 1 DBUS_SESSION_BUS_ADDRESS
Теперь, снова на ПК, запустите нужный вам процесс с установкой переменной окружения, примерно так:
env DBUS_SESSION_BUS_ADDRESS=dbus_address process #(вероятно, «env» здесь избыточно?)
Отображение удалённых приложений на FreeRunner
Чтобы видеть приложения, запущенные на ПК, на экране смартфона, сначала соединитесь с ним по SSH:
ssh -l root 192.168.0.202
Затем выполните:
DISPLAY=:0 xhost +192.168.0.200
После этого можно закрыть соединение SSH. На ПК выполните:
DISPLAY=openmoko:0 xclock
Имейте в виду, что команда xhost даёт доступ к X-серверу любым приложениям с хоста 192.168.0.200, так что любой желающий, имеющий доступ к ПК сможет, в том числе, подглядывать за вами. Отключить удалённый доступ можно командой:
DISPLAY=:0 xhost -192.168.0.200
sftp
После того, как вы настроили SSH, можно использовать Konqueror, Nautilus или любое другое приложение, поддерживающее sftp, чтобы работать с файлами или загружать тестовые приложения. Просто наберите sftp://root@192.168.0.202 в строке адреса.
sshfs
Вы можете использовать sshfs, чтобы примонтировать файловую систему смартфона к файловой системе ПК. Убедитесь, что установлен пакет fuse-sshfs, и что у вас есть права на использование fuse. После этого выполните:
sshfs 192.168.0.202:REMOTE_PATH LOCAL_MOUNT_POINT
REMOTE_PATH теперь доступен через LOCAL_PATH.