После просмотра руководства еще несколько раз (да, ответ никогда не находится с первого раза...), я нашел решение... которое не сработало. После еще большего просмотра я, наконец, нашел самое элегантное решение из всех возможных.
[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, похоже, не заботится об этом... Сетевой стек 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. Не стесняйтесь менять. Надеюсь, эти шаги помогут вам.
Для тех, кто знаком со сборкой 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);