суббота, 27 апреля 2013 г.

Tizen. Чиним сеть в эмуляторе на Ubuntu 12.10 и 13.04

Установка Tizen SDK проходит без каких-либо дополнительных телодвижений, и в целом вопросов не возникает. Однако если вы хотите получить приемлемую скорость работы эмулятора, необходимо настроить работу kvm в вашей системе. Для этого можно воспольpзоваться руководством с ubuntu help. Именно так я и поступил, и в итоге получил работающий эмулятор с неработающей сетью. Дальше о том, из-за чего это произашло и как все это починить.
В документации по эмулятору есть пункт посвященный работе сети. Если коротко это выглядит так:  
Теперь необходимо убедиться что в нашей системе все работает, как задумано. Для начала проверим настройки сети внутри гостевой системы. Быстрей всего это можно сделать через командную оболочку. Для этого достаточно нажать правой кнопкой на главном окне Tizen эмулятора и выбрать пункт Shell. Дальше мы получаем самый обычный linux терминал с правами root, поэтому можем посмотреть состояние сети через
    sh-4.1# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr BC:AE:C5:8F:80:A3  
          inet addr:10.0.2.16  Bcast:10.0.2.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:273877 errors:0 dropped:0 overruns:0 frame:0
          TX packets:210089 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:26920315 (25.6 MiB)  TX bytes:16432995 (15.6 MiB)
    sh-4.1# route -n
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags Metric Ref    Use     Iface
    0.0.0.0         10.0.2.2        0.0.0.0         UG    0      0        0 eth0
    10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
    10.0.2.2        0.0.0.0         255.255.255.255 UH    0      0        0 eth0
Видим  что это вполне согласуется со стандартным положением из документации Tizen OS, эмулятор имеет адресс 10.0.2.16 и в качестве маршрута по умолчанию использует 10.0.2.2. Теперь необходимо убедиться что настройки хоста соответствуют данным требованиям. Для этого в его терминале
    $> sudo ifconfig 
    virbr0    Link encap:Ethernet  HWaddr 5e:9e:72:a5:d8:d4  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
    ...
    $> sudo iptables -t nat -L -n
    Chain PREROUTING (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain POSTROUTING (policy ACCEPT)
    target     prot opt source               destination         
    MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
    MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24  
Видно, что нужный интерфайс хоста указывает не на тот адресс, и NAT работает не на ту подсеть соответственно. Решить данную проблемму можно воспользовавшись интерфейсом virsh
    $>sudo virsh    
    virsh # net-destroy default
    virsh # net-edit default    
В появившемся окне редактора, нужно заменить значения ip адресса интерфейса и пула адрессов.
      1 
      2   default
      3   b202ae10-db4a-c6ff-9988-4a2a197f92ba
      4   
      5   
      6   
      7     
      8       
      9     
     10   
     11 
Например так
      6   
      7     
      8       
      9     
И переконфигурировать интерфейс
    virsh # net-start default
    Network default started

Еще раз через iptables и ifconfig проверяем, что все параметры установленны верно. Можно убедиться в работе из гостевой ОС ping 10.0.2.2.
Однако, остается еще одна проблемма, при данных настройках, в эмуляторе не определен dns сервер. Поэтому пинг до того же google.com не проходит. Это можно решить используя свой resolv.conf. В консоли хостовой машины:
     $> echo "nameserver 8.8.8.8" > resolv.conf
     $> ~/tizen-sdk/tools/sdb -e push resolv.conf /etc/resolv.conf
    resolv.conf                     0 KB/s (19 bytes in 0.049s)
     $> rm resolv.conf 
Все. Проблемма исправлена, можно разрабатывать сетевые приложения :). PROFIT!