Samsung S7 android не подключается и не настраивает сетевую конфигурацию

После просмотра руководства еще несколько раз (да, ответ никогда не находится с первого раза...), я нашел решение... которое не сработало. После еще большего просмотра я, наконец, нашел самое элегантное решение из всех возможных.

[Unit]
Description=Minecraft server
After=local-fs.target network.target

[Service]
WorkingDirectory=/home/minecraft/minecraft_server
User=minecraft
Group=minecraft
Type=forking
# Run it as a non-root user in a specific directory

ExecStart=/usr/bin/screen -h 1024 -dmS minecraft ./minecraft_server.sh
# I like to keep my commandline to launch it in a separate file
# because sometimes I want to change it or launch it manually
# If it's in the WorkingDirectory, then we can use a relative path

# Send "stop" to the Minecraft server console
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff \"stop\"\015'
# Wait for the PID to die - otherwise it's killed after this command finishes!
ExecStop=/bin/bash -c "while ps -p $MAINPID > /dev/null; do /bin/sleep 1; done"
# Note that absolute paths for all executables are required!

[Install]
WantedBy=multi-user.target

Это действительно выглядит лучше, чем мой первоначальный сценарий! Однако есть несколько регрессий.

  • Если я хочу передавать команды в консоль сервера, то мне придется сделать для этого отдельный скрипт.
  • После выполнения systemctl start minecraft или systemctl stop minecraft, обязательно проверьте systemctl status minecraft, потому что эти команды не дают никакого вывода, даже если они действительно не работают. Это единственная серьезная регрессия по сравнению со скриптами - "всегда проверяйте вывод" является правилом №1 в IT, но systemd, похоже, не заботится об этом...
  • Кроме того, я ожидал, что systemd сможет управлять выключением службы без обходного пути "ждать, пока PID умрет". В старом скрипте init мне приходилось делать это вручную, потому что это был скрипт, а systemd пытается устранить необходимость в сложных скриптах, которые выполняют одни и те же действия; он устраняет необходимость вручную прописывать все таймауты и убивать тех, кто не умер, но "ожидание смерти pid" - это следующая по частоте вещь, и нам все еще нужно прописывать ее.
3
05.04.2017, 02:38
2 ответа

Сетевой стек Linux не работает с интерфейсами, имеющими "нулевой" MAC-адрес. Настройка привязки с телефоном android просто обрывается на стороне Linux при попытке настроить конфигурацию сети.

На данный момент для меня работает следующее: настройка интерфейса и маршрутов вручную. Я завернул это в сценарий оболочки:

# cat tetherS7_nwsetup.sh 

IFNAME=enp0s20u4
ip a add 192.168.42.2/24 brd + dev $IFNAME
ip link set dev enp0s20u3 address e8:2a:ea:01:02:03
ip link set dev $IFNAME up
route add default gw 192.168.42.129
echo "nameserver 8.8.8.8" >>/etc/resolv.conf

измените IFNAME и введите имя вашего интерфейса. затем выполните:

# chmod +x tetherS7_nwsetup.sh 
# sudo ./tetherS7_nwsetup.sh 

Для DNS я сейчас использую DNS-сервер Google. Не стесняйтесь менять. Надеюсь, эти шаги помогут вам.

2
27.01.2020, 21:25

Для тех, кто знаком со сборкой Linux или Linux модули в частности, вот еще одно возможное исправление.

Это добавляет исправление в модуль rndis_host linux для исправления поврежденного MAC-адреса и делает его снова готовым решением для модема.

Интересно, что кто-то уже добавил обходной путь для «перепутанного» mac-адреса в rndis_host.c. К сожалению, это не касается случая с Samsung S7. Я добавил следующие строки:

   int
   generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags)
   {
      ...
      if (bp[0] & 0x02)
         eth_hw_addr_random(net);
      else
         ether_addr_copy(net->dev_addr, bp);

    // correct Samsung S7 'zero' mac address
    if ( (bp[0]==0) && (bp[1]==0) && (bp[2]==0) /*&& (bp[3]==0) && (bp[4]==0) && (bp[5]==0)*/ ) {
       // invalid mac address ==> generate one
       eth_hw_addr_random(net);
    }      
    // end of my fix

Теперь пересоберите модуль ядра и замените его оригинальным «rndis_host.ko.xz» и запустите «depmod -a». Я предлагаю перезагрузить или хотя бы удалить старый модуль: 'rmmod rndis_host'

Надеюсь, это сработает для вас. Теперь просто подключите Smamsung S7 и включите режим модема. Теперь он должен загрузить новый модуль сборки rndis_host и автоматически создать правильную настройку интерфейса и необходимые маршруты.

   # ifconfig enp0s20u3
   enp0s20u3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.42.253  netmask 255.255.255.0  broadcast 192.168.42.255
       inet6 fe80::f970:b67b:661f:254c  prefixlen 64  scopeid 0x20<link>
       ether 92:06:fe:75:9e:43  txqueuelen 1000  (Ethernet)
       RX packets 100  bytes 35951 (35.1 KiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 135  bytes 31911 (31.1 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

   # netstat -nr
   Kernel IP routing table
   Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
   0.0.0.0         192.168.42.129  0.0.0.0         UG        0 0          0 enp0s20u3
   192.168.42.0    0.0.0.0         255.255.255.0   U         0 0          0 enp0s20u3

Вот отличие от того, что я исправил:

   # diff -u rndis_host.c.ORIG rndis_host.c
   --- rndis_host.c.ORIG   2017-04-05 15:19:01.353765062 -0700
   +++ rndis_host.c        2017-04-05 15:18:37.327765272 -0700
   @@ -434,6 +434,13 @@
       else
            ether_addr_copy(net->dev_addr, bp);

   +//--------- correct Samsung S7 'zero' mac address -------------------------------------------------//
   +    if ( (bp[0]==0) && (bp[1]==0) && (bp[2]==0) /*&& (bp[3]==0) && (bp[4]==0) && (bp[5]==0)*/ ) {
   +        // invalid mac address ==> generate one
   +               eth_hw_addr_random(net);
   +    }      
   +//----- end of correction--------------------------------------------------------------------------//
   +
      /* set a nonzero filter to enable data transfers */
      memset(u.set, 0, sizeof *u.set);
      u.set->msg_type = cpu_to_le32(RNDIS_MSG_SET);
0
27.01.2020, 21:25

Теги

Похожие вопросы