помогите как руками промонтировать жесткий диск,дурак выключил роутер и все диск не монтируется,обидно опять форматировать диск чтоб он его увидел
Посмотрел я на рекомендации по перезагрузке роутера в теме "Установка программ для чайника" и решил написать свою версию pre-shutdown. Теперь выкладываю её (и кое-что ещё) на суд общественности.
Сразу отмечу, что писалось и тестировалось на wl-500gp с прошивкой 1.9.2.7-10, но по идее должно работать и на остальном. За основу взяты скрипты из вышеупомянутой темы.
1. Собственно, pre-shutdown. При написании использовались некоторые идеи отсюда, отсюда и из стартовых скриптов "большого" линукса. В скрипте используются только те возможности, которые доступны в роутере без установки каких-либо пакетов. Скрипт получился большой, но зато он сделает своё дело в подавляющем большинстве случаев.
Сразу опишу нерешённые проблемы (они также перечислены в начале скрипта на ломаном английском):
- Перекрывающиеся монтирования.
Если вы смонтируете одну ФС на, например, папку "/path/to/dir", а затем другую ФС на ту же "/path/to/dir" либо выше, на "/path/to" или "/path" (спрятав тем самым первую ФС из области видимости), то `fuser -m "/path/to/dir"` не сможет найти открытые файлы на первой ФС (значит, нет гарантий, что мы сможем её перемонтировать на чтение). Можно было бы использовать имя устройства вместо точки монтирования, но fuser из busybox не понимает этого. Можно, правда, установить пакет "psmisc", fuser оттуда поймёт имя устройства и покажет на нужные процессы (скрипт для этого нужно будет править).
Но тут есть вторая часть проблемы: вызов `mount -o remount,ro ...` не сможет перемонтировать первую ФС, какие бы комбинации "имя устройства"+"точка монтирования" ему ни передавали.
Решением может быть отмонтирование второй ФС с последующими манипуляциями над первой либо просто отказ от таких конфигураций.- Необычные имена swap-файлов.
Если вы создадите и без внесения в fstab подключите swap-файл (не раздел), имя которого содержит перевод строки (да, такое возможно), то скрипт не сможет отключить такой файл и, соответственно, не сможет перемонтировать на чтение ФС с этим файлом.
Решение: отмонтировать такой файл вручную (внести явную команду в скрипт) либо опять же отказаться от использования таких имён.- (не описана в скрипте)
Может так сложиться, что какой-то процесс откроет файл на запись на интересующем нас разделе уже после того, как скрипт завершит убиение процессов, использующих раздел. Против этого трудно придумать что-то гарантированно работающее.
Примерная логика работы скрипта:
- Остановка сервисов: если существует исполняемый файл "/opt/etc/init.d/rc.unslung", он вызывается с параметром "stop".
- Сброс буферов (вызов sync).
- Отправка сигнала TERM процессам, имеющим открытые файлы на интересующих нас разделах, и ожидание их завершения, но не дольше указанного времени (задаётся в начале скрипта, по умолчанию 20 секунд). Стоит отметить, что по уму надо бы завершать только те процессы, которые имеют открытые на запись файлы, но fuser такой информации не даёт.
- Если на предыдущем шаге остались живые процессы, то список составляется заново и на этот раз отправляется сигнал KILL (опять же с ожиданием завершения, по умолчанию 5 секунд).
- Отключение свопа (swapoff -a и прохождение по файлу "/proc/swaps").
- Перемонтирование интересующих нас ФС на чтение.
В скрипте есть зависимость от файла "/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 (немедленное убийство процесса). Таймаут ожидания после каждого из сигналов задаётся в начале скрипта:
В этом скрипте тоже используется файл "/usr/local/sbin/signal_and_wait.inc.sh".Code:interrupt_timeout="10" terminate_timeout="120" kill_timeout="5"
Несколько слов по конфигурации.
Если вы используете 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
Last edited by Power; 02-03-2010 at 13:12. Reason: update
Everybody stand back. I know iptables.
Мой вариант правильного выключения роутера.
а iptables -I INPUT -p udp --dport 6881 -j ACCEPT не надо делать?
Everybody stand back. I know iptables.
Мой вариант правильного выключения роутера.
Everybody stand back. I know iptables.
Мой вариант правильного выключения роутера.
Хорошо, объясняю подробно, для чего это нужно.
Когда вы подключаете флешку/диск (или когда роутер загружается с уже подключенной), последовательность действий такова:
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 строчку
Но монтирования не произойдёт, потому что папки /tmp/mnt/disc0_3 ещё нет на этом шаге (2).Code:/tmp/mnt/disc0_3/www /www none bind 0 0
Если бы папка /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.
Мой вариант правильного выключения роутера.
Все работало отлично. Что-то rtorrent заглючил и я решил перезагрузить роутер. Но оказалось вдруг, что роутер перестал реагировать на команды reboot и halt -p. То есть в ответ на эти команды вообще ничего не происходит.
А я так это сделал.
1.Берем программу TSE.exe отсюда http://home.onego.ru/~loft/_tse.exe
2.Ваяю файл скрипта reboot.txt
Можно вместо waitfor "root]$" поставить pause 5 что выдерживает 5 сек. паузу и совсем не важно какой символ выдает консоль.Code:open 192.168.1.1 waitfor "login:" transmit "admin^M" waitfor "Password:" transmit "admin^M" waitfor "root]$" transmit "reboot^M"
3.Рисую батник например tse.bat
4.Всё...Code:tse.exe <reboot.txt
Вместо admin admin пишете свои заклинания...
TSE - штука хорошая, но я не увидел поддержки SSH... Плохо смотрел?
Есть аналог: TeraTerm (http://ttssh2.sourceforge.jp/) - ssh имеет.
В стандартном WEB интерфейсе маршрутизатора есть страничка "System command".
Если в ней выполнить команду reboot, то маршрутизатор перезагрузится.
http://192.168.1.1/apply.cgi?current...stemCmd=reboot
Можно на эту ссылку просто закладку в браузере положить и перезагружать маршрутизатор одним кликом,
или её можно в скрипте открывать, например, с помощью WinHttpRequest,
или её можно в батнике с помощью wget
Всё штатными средствами. В одну строку.
Ничего не надо ставить ни на PC ни на маршрутизатор.