Page 12 of 17 FirstFirst ... 21011121314 ... LastLast
Results 166 to 180 of 242

Thread: Правильное выключение роутера

  1. помогите как руками промонтировать жесткий диск,дурак выключил роутер и все диск не монтируется,обидно опять форматировать диск чтоб он его увидел

  2. #167
    Quote Originally Posted by Dostoewskiy View Post
    помогите как руками промонтировать жесткий диск,дурак выключил роутер и все диск не монтируется,обидно опять форматировать диск чтоб он его увидел
    mount /dev/disks/.... /tmp/harddisk123

  3. #168
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246
    Посмотрел я на рекомендации по перезагрузке роутера в теме "Установка программ для чайника" и решил написать свою версию pre-shutdown. Теперь выкладываю её (и кое-что ещё) на суд общественности.
    Сразу отмечу, что писалось и тестировалось на wl-500gp с прошивкой 1.9.2.7-10, но по идее должно работать и на остальном. За основу взяты скрипты из вышеупомянутой темы.

    1. Собственно, pre-shutdown. При написании использовались некоторые идеи отсюда, отсюда и из стартовых скриптов "большого" линукса. В скрипте используются только те возможности, которые доступны в роутере без установки каких-либо пакетов. Скрипт получился большой, но зато он сделает своё дело в подавляющем большинстве случаев.
    Сразу опишу нерешённые проблемы (они также перечислены в начале скрипта на ломаном английском):
    1. Перекрывающиеся монтирования.
      Если вы смонтируете одну ФС на, например, папку "/path/to/dir", а затем другую ФС на ту же "/path/to/dir" либо выше, на "/path/to" или "/path" (спрятав тем самым первую ФС из области видимости), то `fuser -m "/path/to/dir"` не сможет найти открытые файлы на первой ФС (значит, нет гарантий, что мы сможем её перемонтировать на чтение). Можно было бы использовать имя устройства вместо точки монтирования, но fuser из busybox не понимает этого. Можно, правда, установить пакет "psmisc", fuser оттуда поймёт имя устройства и покажет на нужные процессы (скрипт для этого нужно будет править).
      Но тут есть вторая часть проблемы: вызов `mount -o remount,ro ...` не сможет перемонтировать первую ФС, какие бы комбинации "имя устройства"+"точка монтирования" ему ни передавали.
      Решением может быть отмонтирование второй ФС с последующими манипуляциями над первой либо просто отказ от таких конфигураций.
    2. Необычные имена swap-файлов.
      Если вы создадите и без внесения в fstab подключите swap-файл (не раздел), имя которого содержит перевод строки (да, такое возможно), то скрипт не сможет отключить такой файл и, соответственно, не сможет перемонтировать на чтение ФС с этим файлом.
      Решение: отмонтировать такой файл вручную (внести явную команду в скрипт) либо опять же отказаться от использования таких имён.
    3. (не описана в скрипте)
      Может так сложиться, что какой-то процесс откроет файл на запись на интересующем нас разделе уже после того, как скрипт завершит убиение процессов, использующих раздел. Против этого трудно придумать что-то гарантированно работающее.

    Примерная логика работы скрипта:
    1. Остановка сервисов: если существует исполняемый файл "/opt/etc/init.d/rc.unslung", он вызывается с параметром "stop".
    2. Сброс буферов (вызов sync).
    3. Отправка сигнала TERM процессам, имеющим открытые файлы на интересующих нас разделах, и ожидание их завершения, но не дольше указанного времени (задаётся в начале скрипта, по умолчанию 20 секунд). Стоит отметить, что по уму надо бы завершать только те процессы, которые имеют открытые на запись файлы, но fuser такой информации не даёт.
    4. Если на предыдущем шаге остались живые процессы, то список составляется заново и на этот раз отправляется сигнал KILL (опять же с ожиданием завершения, по умолчанию 5 секунд).
    5. Отключение свопа (swapoff -a и прохождение по файлу "/proc/swaps").
    6. Перемонтирование интересующих нас ФС на чтение.

    В скрипте есть зависимость от файла "/usr/local/sbin/signal_and_wait.inc.sh" (описан ниже).
    Что можно настроить в скрипте:
    • Таймаут ожидания (в секундах) после отправки сигналов TERM и KILL, соответственно
      Code:
      terminate_timeout="20"
      kill_timeout="5"
    • Какие файловые системы нас интересуют (для перемонтирования на чтение), это регулярное выражение awk
      Code:
      filesystems_regexp='/^(ext3|vfat)$/'
      Если у вас в качестве корневой ФС используется какой-то раздел с внешнего носителя (смонтированный на запись), то имеет смысл исключить его, а то скрипт попытается убить почти все процессы, а с разделом уже разбираться отдельно
      Code:
      filesystems_regexp='/^(ext3|vfat)$/ && $2 != "/"'

    2. Файл signal_and_wait.inc.sh. Он не исполняемый, включается в другие скрипты. Содержит одну функцию, signal_and_wait, которая посылает указанный сигнал указанным процессам и ожидает их завершения указанное время :)

    3. Стартовый скрипт S99rtorrent (для тех, у кого используется rtorrent). Улучшенный скрипт, взятый из темы про установку для чайников. Суть в том, что он теперь гарантированно останавливает rtorrent. Он посылает процессу последовательно 3 сигнала и после каждого ждёт завершения процесса в течение указанного времени (аналогично pre-shutdown). Сигналы: INT (нормальное завершение), TERM (быстрое завершение, без отсылки статистики на трекеры), KILL (немедленное убийство процесса). Таймаут ожидания после каждого из сигналов задаётся в начале скрипта:
    Code:
    interrupt_timeout="10"
    terminate_timeout="120"
    kill_timeout="5"
    В этом скрипте тоже используется файл "/usr/local/sbin/signal_and_wait.inc.sh".


    Несколько слов по конфигурации.

    Если вы используете rtorrent (настройка S99rtorrent):
    а) если вам нужно, чтобы он успел отослать статистику на трекеры, установите побольше interrupt_timeout (скажем, 5 минут = 300 секунд), но имейте в виду, если у вас pptp/pppoe/l2tp, то это соединение отключится до запуска pre-shutdown (если вы дали команду reboot/halt), так что никакая статистика уже не отправится;
    б) если статистика вам не так важна, но важно, чтоб rtorrent завершился точно по своей воле, установите небольшой interrupt_timeout (секунд 5-10), но побольше terminate_timeout (опять же, скажем, 300 секунд);
    в) если просто хотите быстрого завершения работы, неважно, в каком состоянии окажутся закачки (вас не пугает перехеширование при старте), то установите interrupt_timeout и terminate_timeout по минимуму (секунд 5), а уж KILL в конце его прибьёт.

    Если вы помимо этого используете любые другие программы или тот же rtorrent, но не с моим S99rtorrent (настройка pre-shutdown):
    а) если вам нужно дать программам больше времени на добровольное завершение, увеличьте terminate_timeout (сколько вам не жалко ждать);
    б) если вам дорого время и вы не хотите ждать, пока все процессы завершат свои дела, поставьте terminate_timeout небольшим (да хоть 0), можете при этом увеличить kill_timeout до 10, но вряд ли это необходимо.


    Сами скрипты - в приложенном архиве. Пути, куда их класть:
    /usr/local/sbin/pre-shutdown
    /usr/local/sbin/signal_and_wait.inc.sh
    /opt/etc/init.d/S99rtorrent


    Update: обновил S99rtorrent:
    при старте не создаётся окно screen с шеллом. Бонус: при завершении торрента screen сам выходит;
    при старте stdout команд тоже пишется в лог;
    при завершении, если дело доходит до сигнала KILL, удаляется файл rtorrent.lock
    Attached Files Attached Files
    Last edited by Power; 02-03-2010 at 13:12. Reason: update
    Everybody stand back. I know iptables.
    Мой вариант правильного выключения роутера.

  4. #169
    а iptables -I INPUT -p udp --dport 6881 -j ACCEPT не надо делать?

  5. Quote Originally Posted by starix View Post
    а iptables -I INPUT -p udp --dport 6881 -j ACCEPT не надо делать?
    Я об этом нигде не видел в форуме.

  6. #171
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246
    Quote Originally Posted by starix View Post
    а iptables -I INPUT -p udp --dport 6881 -j ACCEPT не надо делать?
    Разумнее наоборот, в конфиге сделать
    Code:
    dht_port = 51778
    Ведь udp как раз для этого и используется (порт уже открыт в post-firewall).
    Everybody stand back. I know iptables.
    Мой вариант правильного выключения роутера.

  7. Quote Originally Posted by Power View Post
    Разумнее наоборот, в конфиге сделать
    Code:
    dht_port = 51778
    Ведь udp как раз для этого и используется (порт уже открыт в post-firewall).
    Понял. Спасибо. Исправил.

  8. #173
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246
    Quote Originally Posted by valerakvb View Post
    Версия 7.1 и reinstal 2.1 от 11.02.2010

    - изменил /etc/fstab http://wl500g.info/showpost.php?p=183329&postcount=1940
    Но вы не изменили pre-mount, а без этого смысла мало.
    Everybody stand back. I know iptables.
    Мой вариант правильного выключения роутера.

  9. Quote Originally Posted by Power View Post
    Но вы не изменили pre-mount, а без этого смысла мало.
    Папка /tmp/mnt/disc0_3 создается сама системой.
    Я устанавливал на чистую все.

  10. #175
    Join Date
    May 2007
    Location
    Истра
    Posts
    1,246
    Quote Originally Posted by valerakvb View Post
    Папка /tmp/mnt/disc0_3 создается сама системой.
    Я устанавливал на чистую все.
    Хорошо, объясняю подробно, для чего это нужно.
    Когда вы подключаете флешку/диск (или когда роутер загружается с уже подключенной), последовательность действий такова:
    1) выполняется pre-mount;
    2) если существует /etc/fstab, то выполняются "swapon -a" и "mount -a";
    3) остальные разделы (не смонтированные в процессе "mount -a") монтируются на папки вида /tmp/mnt/discX_Y, при этом эти папки создаются системой;
    4) ищется первая из папок /tmp/mnt/discX_Y. Если найдена, то на неё создаётся символическая ссылка /tmp/harddisk и по необходимости (пере)запускаются ftp, samba, nfs;
    5) выполняется post-mount.

    Так вот, "mount -a" пытается смонтировать все разделы, перечисленные в /etc/fstab (в том порядке, в котором они идут в файле). Но на этот момент папка /tmp/mnt/disc0_3 ещё не существует и монтирования раздела /dev/discs/disc0/part3 не происходит. Зато на следующем шаге (3) система создаёт эту папку и монтирует раздел, в чём можно убедиться, прочитав в логе "USB storage: ext3 fs at /dev/discs/disc0/part3 mounted to /tmp/mnt/disc0_3" (заметьте, при монтировании раздела /opt такой записи в логе не создаётся).

    Итак, мы выяснили, что раздел part3 монтируется на шаге 3, а не 2. Почему это важно? Допустим, кто-то захочет продолжить настройку роутера за пределами этой инструкции. И захочет смонтировать, скажем, папку www с раздела part3 на /www. Для этого логично добавить в конец /etc/fstab строчку
    Code:
    /tmp/mnt/disc0_3/www /www none bind 0 0
    Но монтирования не произойдёт, потому что папки /tmp/mnt/disc0_3 ещё нет на этом шаге (2).
    Если бы папка /tmp/mnt/disc0_3 была создана до вызова "mount -a" (т.е. в скрипте pre-mount), то "mount -a" смог бы смонтировать /dev/discs/disc0/part3 на /tmp/mnt/disc0_3, а затем /tmp/mnt/disc0_3/www на /www и всем было бы счастье.

    Говоря кратко, незачем делать "почти правильно", если можно сразу сделать правильно.
    Everybody stand back. I know iptables.
    Мой вариант правильного выключения роутера.

  11. Quote Originally Posted by Power View Post
    Хорошо, объясняю подробно, для чего это нужно.
    Когда вы подключаете флешку/диск (или когда роутер загружается с уже подключенной), последовательность действий такова:
    1) выполняется pre-mount;
    2) если существует /etc/fstab, то выполняются "swapon -a" и "mount -a";
    3) остальные разделы (не смонтированные в процессе "mount -a") монтируются на папки вида /tmp/mnt/discX_Y, при этом эти папки создаются системой;
    4) ищется первая из папок /tmp/mnt/discX_Y. Если найдена, то на неё создаётся символическая ссылка /tmp/harddisk и по необходимости (пере)запускаются ftp, samba, nfs;
    5) выполняется post-mount.

    Так вот, "mount -a" пытается смонтировать все разделы, перечисленные в /etc/fstab (в том порядке, в котором они идут в файле). Но на этот момент папка /tmp/mnt/disc0_3 ещё не существует и монтирования раздела /dev/discs/disc0/part3 не происходит. Зато на следующем шаге (3) система создаёт эту папку и монтирует раздел, в чём можно убедиться, прочитав в логе "USB storage: ext3 fs at /dev/discs/disc0/part3 mounted to /tmp/mnt/disc0_3" (заметьте, при монтировании раздела /opt такой записи в логе не создаётся).

    Итак, мы выяснили, что раздел part3 монтируется на шаге 3, а не 2. Почему это важно? Допустим, кто-то захочет продолжить настройку роутера за пределами этой инструкции. И захочет смонтировать, скажем, папку www с раздела part3 на /www. Для этого логично добавить в конец /etc/fstab строчку
    Code:
    /tmp/mnt/disc0_3/www /www none bind 0 0
    Но монтирования не произойдёт, потому что папки /tmp/mnt/disc0_3 ещё нет на этом шаге (2).
    Если бы папка /tmp/mnt/disc0_3 была создана до вызова "mount -a" (т.е. в скрипте pre-mount), то "mount -a" смог бы смонтировать /dev/discs/disc0/part3 на /tmp/mnt/disc0_3, а затем /tmp/mnt/disc0_3/www на /www и всем было бы счастье.

    Говоря кратко, незачем делать "почти правильно", если можно сразу сделать правильно.
    Большое спасибо за подробное объяснение. Добавил в pre-mount
    Code:
    mkdir -p /tmp/mnt/disc0_3

  12. #177

    Не реагирует никак на reboot и halt

    Все работало отлично. Что-то rtorrent заглючил и я решил перезагрузить роутер. Но оказалось вдруг, что роутер перестал реагировать на команды reboot и halt -p. То есть в ответ на эти команды вообще ничего не происходит.

  13. #178
    А я так это сделал.
    1.Берем программу TSE.exe отсюда http://home.onego.ru/~loft/_tse.exe
    2.Ваяю файл скрипта reboot.txt
    Code:
    open 192.168.1.1
    waitfor "login:"
    transmit "admin^M"
    waitfor "Password:"
    transmit "admin^M"
    waitfor "root]$"
    transmit "reboot^M"
    Можно вместо waitfor "root]$" поставить pause 5 что выдерживает 5 сек. паузу и совсем не важно какой символ выдает консоль.
    3.Рисую батник например tse.bat
    Code:
    tse.exe <reboot.txt
    4.Всё...
    Вместо admin admin пишете свои заклинания...

  14. #179
    TSE - штука хорошая, но я не увидел поддержки SSH... Плохо смотрел?
    Есть аналог: TeraTerm (http://ttssh2.sourceforge.jp/) - ssh имеет.

  15. #180
    В стандартном WEB интерфейсе маршрутизатора есть страничка "System command".
    Если в ней выполнить команду reboot, то маршрутизатор перезагрузится.

    http://192.168.1.1/apply.cgi?current...stemCmd=reboot

    Можно на эту ссылку просто закладку в браузере положить и перезагружать маршрутизатор одним кликом,
    или её можно в скрипте открывать, например, с помощью WinHttpRequest,
    или её можно в батнике с помощью wget

    Всё штатными средствами. В одну строку.
    Ничего не надо ставить ни на PC ни на маршрутизатор.

Page 12 of 17 FirstFirst ... 21011121314 ... LastLast

Similar Threads

  1. Перезагрузка и выключение роутера после прошивки
    By pheny in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 161
    Last Post: 01-05-2014, 21:56
  2. Отправка и получение SMS с роутера
    By reyko in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 15
    Last Post: 04-03-2013, 12:27

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •